DataFrame、Series、标量之间的算术运算
DataFrame元素级的函数运算
◆ 通过numpy的一元通用函数ufunc实现
◆ 格式为:np.ufunc(df)
分析同学的“身体质量”,即BMI(Body Mass Index)指数
>>> stu['BMI'] = stu['体重'] / ( np.square(stu['身高']/100) ) #增加BMI列
>>> stu['月生活费'].quantile( [.25, .75] )#计算月生活费的上、下四分位数
描述统计函数describe() 一次计算多项统计值
>>> stu[['身高','体重','成绩']].describe() #对身高体重和成绩3列数据描述统计
分组
根据某些索引将数据对象划分为多个组
◆ 对每个分组进行排序或统计计算
grouped = obj.groupby(col)
grouped.aggregate({'col1':f1, 'col2':f2,...})
同学数据中的“身高、月生活费”按“性别”和“年龄”进行分组 分析
>>> grouped = stu.groupby(['性别', '年龄'])
>>> grouped.aggregate( {'身高':np.mean, '月生活费':np.max } )#内部为字典格式
统计函数crosstab() 类似Excel交叉表
◆ 按照给定的第一列分组,对第二列计数
>>> pd.crosstab( stu['性别'], stu['月生活费']) #pandas函数
相关性分析
相关系数分类
Pearson简单相关系数(皮尔逊)
⚫ 用来度量正态分布的定距变量间的线性相关关系
⚫ Pearson简单相关系数要求变量来自的总体 分布正态
Spearman秩相关系数(斯皮尔曼)
⚫ 采用非参数检验方法来度量定序变量间的线性相关关系
⚫ 不要求总体正态分布
◆ 卡方
⚫ 采用非参数检验方法来度量分类变量间的相关关系
研究不同总体之间是否存在依存关系
◆ 绘制散点图矩阵,能直观地观察列之间的相关性
⚫ pd.plotting.scatter_matrix(data,diagonal='kde',color=‘r') #绘图pandas方法
◆ 计算样本之间的相关系数 r 推断总体的相关程度
当样本容量较大(≥30)时,相关性分析判断准确性较高
DataFrame相关性分析函数 DataFrame.corr()
#两列数据之间的相关性
>>> stu['身高'].corr( stu['体重'] )
0.67573990985276822
#多列数据之间的相关性
>>> stu[ ['身高','体重','成绩 '] ].corr()
身高 体重 成绩
身高 1.000000 0.675740 0.080587
体重 0.675740 1.000000 -0.072305
成绩 0.080587 -0.072305 1.000000
相关系数具有以下特征
◼ 相关系数的值介于–1与+1之间;
◼ r=1:两个总体正相关;r=0:不相关;r=-1:负相关;
◼ |r|<0.3:低度相关;0.3≤|r|<0.8:中等相关;0.8≤|r|<1:高度相关。
偏相关性分析
在多元相关分析中,由于受到其他变量的影响,在计算某两个变量之间的 相关系数时,得到的结果往往不能真实反映变量之间的相关关系,所以在多元相关分析中,通常将其他变量固定(控制),而计算某两个变量之 间的相关系数,称为偏相关系数。
偏相关分析用于计算变量之间的偏相关系数,可以判断自变量对因变量的 影响程度,舍弃影响较小的自变量,保留影响较大的自变量,从而更准确 地判断变量之间的相关关系和相关程度。
DataFrame偏相关性分析函数
DataFrame.pcorr()
偏相关性分析案例
案例-调查反馈
对50名学生进行抽样调查,10人一组相同问卷,反馈数据保存在studentInfo.xlsx文件 的5张表中。综合5组数据实现以下分析目标:
• 男、女生对《数据科学》课程的兴趣程度和成绩的变化趋势;
• 学生来自的省份以及性别与成绩是否存在关系;
• 学生身高、体重达标状况。
步骤1:导入所需的方法库
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
步骤2:从Excel文件的5张表中读取数据,拼接为一个DataFrame对象
#从Excel文件的5张表中读取数据 df1=pd.read_excel('data\studentsInfo.xlsx','Group1',index_col=0) df2=pd.read_excel('data\studentsInfo.xlsx','Group2',index_col=0) df3=pd.read_excel('data\studentsInfo.xlsx','Group3',index_col=0) df4=pd.read_excel('data\studentsInfo.xlsx','Group4',index_col=0) df5=pd.read_excel('data\studentsInfo.xlsx','Group5',index_col=0)
#按行追加形式,拼接数据集
stu = pd.concat([df1,df2,df3,df4,df5], axis = 0) print( 'Data Size:', stu.shape )
步骤3:去除完全重复以及缺失项较多(≥2)的数据行,检测是否还有缺 失数据 stu.drop_duplicates(inplace = True) #去除重复行,更新方式
stu.dropna(thresh=8,inplace = True )#去除有缺失数据行,更新方式
print( 'Data Size after drop:', stu.shape ) print( "Nan Columns:\n",stu.isnull().any() ) #缺失数据列检测
➢ stu.isnull()检测对象每个值是否是NaN,得到布尔型 DataFrame。
➢ any()函数缺省按列检测是否全为False,不是返回 True,得到布尔型的Series对象。
步骤4:填充缺失值:成绩按照平均分填充;接受调查同学为二年级,用默认 值“20”来填充 stu.fillna({'年龄':20, '成绩':stu['成绩'].mean()}, inplace=True ) print( "Nan Columns:\n",stu.isnull().any() )
步骤5:将同学数据按照“成绩”排序,统计优秀(≥90)和不合格(<60) 学生个数。并分别计算优秀与不合格同学的平均课程兴趣度,以及全体同学 课程的平均分与课程兴趣度
#按照成绩排序 stu_grade = stu.sort_values(by='成绩', ascending=False) ex = (stu_grade['成绩']>=90 ).sum() #计算优秀人数 fail = (stu_grade['成绩']<60 ).sum() #计算不及格人数 print("Excellent: {}, Fail: {}".format(ex,fail))
条件表达式stu_grade[‘成绩’]>=90 得到布尔型Series对象,sum() 函数统计其中True的个数
◆ 优秀9个,不及格4个
ex_mean = stu_grade[0:9][['成绩','课程兴趣']].mean() #前9行优秀
total_mean = stu_grade[['成绩','课程兴趣']].mean() fail_mean = stu_grade[-4:][['成绩','课程兴趣']].mean() #后4行不及格
print("ex_mean:\n", ex_mean, "\ntotal_mean\n",total_mean, "\nfail_mean\n", fail_mean)
#计算两列相关度
print( stu_grade['成绩'].corr(stu_grade['课程兴趣']) )
结果表明:
1)3类统计“成绩”均值为93.8、76.3和46.0,而“课程兴趣”的均值为5.0、4.2和3.0
2)从趋势上看,大学课程学习的成绩与兴趣的变化具有一致性
3)两列数据的相似度为0.44,说明从个体上两者相关度并不是特别高,也有可能存在错误数据
步骤6:分析性别、省份与成绩是否存在相关性,由于性别和省份数据均为字符型 (分类型),无法用corr()函数来计算。简单的方法是分组计算均值:
sex_grouped = stu.groupby(['性别'])
sex_counts = sex_grouped.count() #统计每个分组的行数
#分组统计成绩平均值
sex_mean = stu.groupby(['性别']).aggregate( {'成绩':np.mean } )
print(sex_counts, '\n', sex_mean)
pro_counts = stu.groupby(['省份']).count()
pro_mean = stu.groupby(['省份']).aggregate( {'成绩':np.mean } )
print(pro_counts, '\n', pro_mean)
结果表明: 1)男、女同学的各24人,平均成绩分别是79.0和73.7 2)说明男同学在该门课程中成绩更好一些。 3)按省份分组,各省平均分相去甚远,但观察每个省份只有1~3名同学,分组样本太少,导致分析结 果不具参考价值
步骤7:计算同学的BMI值,找出各个四分位数,并与国家标准进行比较:
stu['BMI'] = stu['体重'] / ( np.square(stu['身高']/100) )
#计算四分位数
print( stu['BMI'].quantile( [.25,0.5,.75] ) )
#计算BMI值>28的个数
print('BMI>28 肥胖人数:', (stu['BMI']>=28 ).sum() )