3.6 利用Pandas进行统计分析

在这里插入图片描述
本文章是3.6的内容,如果想要源代码和数据可以看以下链接:
https://download.csdn.net/download/Ahaha_biancheng/83338868

3.6 统计分析

3.6.1 通用函数与运算

DataFrame对象和DataFrame、Series、标量之间的算术运算
在这里插入图片描述

DataFrame对象中的元素级的运算,使用numpy中的通用函数

在这里插入图片描述

例3-15 分析例3-13中同学的“身体质量”,即BMI(Body Mass Index)指数。

世界卫生组织对于BMI的定义:BMI(kg/m2) = 体重 / 身高2

我国体质评判标准为:BMI≤18.5,过轻; 18.5-24,正常;24-28,偏胖;≥28肥胖。

计算每位学生的BMI指数,增加到原始数据对象中。

# 读取文件
stuinfo = pd.read_excel('data/studentsInfo.xlsx', index_col=0)
stuinfo[:2]
性别年龄身高体重省份成绩月生活费课程兴趣案例教学
序号
1male20.017070.0LiaoNingNaN800.054
2male22.018071.0GuangXi77.01300.034
stuinfo['BMI'] = stuinfo['体重']/np.square(stuinfo['身高']/100)
stuinfo
性别年龄身高体重省份成绩月生活费课程兴趣案例教学BMI
序号
1male20.017070.0LiaoNingNaN800.05424.221453
2male22.018071.0GuangXi77.01300.03421.913580
3maleNaN18062.0FuJian57.01000.02419.135802
4male20.017772.0LiaoNing79.0900.04422.981902
5male20.0172NaNShanDong91.0NaN55NaN
6male20.017975.0YunNan92.0950.05523.407509
7female21.016653.0LiaoNing80.01200.04519.233561
8female20.016247.0AnHui78.01000.04417.908855
9female20.016247.0AnHui78.01000.04417.908855
10male19.016976.0HeiLongJiang88.01100.05526.609713

3.6.2 统计函数

pandas的常用统计函数
在这里插入图片描述

例3-16:对例3-13中学生的“成绩”、“月生活费”进行统计分析

# 计算成绩的平均值

stuinfo['成绩'].mean()
80.0

在这里插入图片描述

# 计算月生活费的上、下四分位数
stuinfo['月生活费'].quantile([.25, .75])
0.25     950.0
0.75    1100.0
Name: 月生活费, dtype: float64
# 描述统计函数describe() 一次计算多项统计值 
stuinfo[['身高','体重','成绩']].describe()
身高体重成绩
count10.0000009.0000009.000000
mean171.70000063.66666780.000000
std7.07185311.81101210.464225
min162.00000047.00000057.000000
25%166.75000053.00000078.000000
50%171.00000070.00000079.000000
75%178.50000072.00000088.000000
max180.00000076.00000092.000000

分组

根据某些索引将数据对象划分为多个组,对每个分组进行排序或统计计算。
在这里插入图片描述

例3-17: 对例3-13学生数据的“身高”、“月生活费”按“性别”,“年龄”进行分组统计

# grouped.function()
stug = stuinfo.groupby(['性别','年龄'])
print(stug['体重'].mean())
stug.mean()
性别      年龄  
female  20.0    47.000000
        21.0    53.000000
male    19.0    76.000000
        20.0    72.333333
        22.0    71.000000
Name: 体重, dtype: float64
身高体重成绩月生活费课程兴趣案例教学
性别年龄
female20.0162.047.00000078.0000001000.0000004.004.0
21.0166.053.00000080.0000001200.0000004.005.0
male19.0169.076.00000088.0000001100.0000005.005.0
20.0174.572.33333387.333333883.3333334.754.5
22.0180.071.00000077.0000001300.0000003.004.0
# grouped.aggregate({'col1':founction1,'col2':founction2,...})
stug.aggregate({'身高': np.max, '月生活费':np.mean})
身高月生活费
性别年龄
female20.01621000.000000
21.01661200.000000
male19.01691100.000000
20.0179883.333333
22.01801300.000000
# grouped.aggregate([function1, function2])
stug['体重'].aggregate([np.mean, np.min])
meanamin
性别年龄
female20.047.00000047.0
21.053.00000053.0
male19.076.00000076.0
20.072.33333370.0
22.071.00000071.0

统计函数crosstab()

类似Excel交叉表

在这里插入图片描述

按照给定的第一列分组,对第二列计数

pd.crosstab(stu['性别'], stu['月生活费'])
月生活费800.0900.0950.01000.01100.01200.01300.0
性别
female0002010
male1111101

3.6.3 相关性分析

作用:研究不同总体之间是否存在依存关系

◆ 绘制散点图矩阵,直观地观察列之间的相关性

pd.plotting.scatter_matrix(data,diagonal='kde',color='k')  #绘图

◆ 计算样本之间的相关系数 r 推断总体的相关程度

DataFrame相关性分析函数:DataFrame.corr()

◆ 相关系数具有以下特征

相关系数的值介于–1与+1之间;

r=1:两个总体正相关;r=0:不相关;r=-1:负相关;

|r|<0.3:低度相关;0.3≤|r|<0.8:中等相关;0.8≤|r|<1:高度相关。

当样本容量较大(≥30)时,相关性分析判断准确性较高

例3-18:学生“身高”、“体重”与“成绩”之间的相关性分析

# 两列数据之间的相关性
stuinfo['身高'].corr(stuinfo['体重'])
0.7253118364233102

1)身高与体重有一定关系,但不是很高

# 多列数据之间的相关性
stuinfo[['成绩','身高','体重']].corr()
成绩身高体重
成绩1.000000-0.1806040.337735
身高-0.1806041.0000000.725312
体重0.3377350.7253121.000000

2)两者都与成绩没有相关性

import matplotlib.pyplot as plt
data =stu[['身高','体重','成绩']]
data.columns=['Height','Weight','Score']
# 绘制散点图查看相关性
pd.plotting.scatter_matrix(data,diagonal='kde',color='k')  #绘图
plt.show()

在这里插入图片描述

3.6.4 案例:调查反馈表分析

案例3-1对50名学生进行抽样调查,反馈数据保存在studentInfo.xlsx文件的5张表中。综合5组数据实现以下分析目标:

•男、女生对《数据科学》课程的兴趣程度和成绩的变化趋势;

•学生来自的省份以及性别与成绩是否存在关系;

•学生身高、体重达标状况。

步骤1:导入所需的方法库

步骤2:从Excel文件的5张表中读取数据,拼接为一个DataFrame对象

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

# 读数据
stu1 = pd.read_excel('data/studentsInfo.xlsx', 'Group1', index_col=0)
stu2 = pd.read_excel('data/studentsInfo.xlsx', 'Group2', index_col=0)
stu3 = pd.read_excel('data/studentsInfo.xlsx', 'Group3', index_col=0)
stu4 = pd.read_excel('data/studentsInfo.xlsx', 'Group4', index_col=0)
stu5 = pd.read_excel('data/studentsInfo.xlsx', 'Group5', index_col=0)
# 按行拼接
stu = pd.concat([stu1, stu2,stu3,stu4,stu5], axis=0)
stu
性别年龄身高体重省份成绩月生活费课程兴趣案例教学
序号
1male20.017070.0LiaoNingNaN800.054
2male22.018071.0GuangXi77.01300.034
3maleNaN18062.0FuJian57.01000.024
4male20.017772.0LiaoNing79.0900.044
5male20.0172NaNShanDong91.0NaN55
6male20.017975.0YunNan92.0950.055
7female21.016653.0LiaoNing80.01200.045
8female20.016247.0AnHui78.01000.044
9female20.016247.0AnHui78.01000.044
10male19.016976.0HeiLongJiang88.01100.055
1female21.016249.0YunNan89.0800.055
2female20.016453.0GuiZhou79.01000.045
3female20.016643.0HaiNan12.01000.055
4female21.016252.0TianJin86.0500.055
5male20.017573.0AnHuiNaN700.044
6male19.017220.0ShanDong75.0900.055
7male21.017879.0GuiZhou74.0650.045
8female20.016354.0XinJiang79.01400.045
9female21.016044.0ShangHai61.0600.055
10female19.016348.0GuiZhou56.0700.025
21female21.016545.0ShangHai93.01200.055
22female19.016742.0HuBei89.0800.055
23male21.016980.0GanSu93.0900.055
24female21.016049.0HeBei59.01100.035
25female21.016254.0GanSu68.01300.045
26male21.018177.0SiChuan62.0800.025
27female21.016249.0ShanDong65.0950.044
28female22.016052.0ShanXi73.0800.034
29female20.016151.0GuangXi80.01250.055
30female20.016852.0JiangSu98.0700.055
31female21.016245.0JiLin92.01400.055
32female20.016245.0ChongQing63.0650.044
33male20.017164.0JiangXi77.01300.045
34male21.017278.0BeiJing62.0950.044
35male20.017166.0ShangHai97.0650.055
36male21.017478.0GanSu87.01300.055
37male21.017768.0XinJiang95.0500.055
38male19.017079.0YunNan63.01000.035
39female19.015946.0ShanDong64.01100.044
40female21.016352.0JiangXi62.01500.034
41male19.017463.0HeiLongJiang91.0600.055
42male21.017773.0SiChuan89.0700.045
43female21.016155.0XiZang93.01250.055
44male20.017163.0ChongQing82.0600.045
45male20.016863.0JiangXi87.0800.055
46male21.017473.0GuangDong71.01300.055
47female21.016353.0ShanXi73.0600.045
48male21.017574.0GuangDong64.0700.034
49male21.017279.0ChongQing81.01000.055
50female20.016648.0GuangXi76.01100.044

步骤3:去除完全重复以及缺失项较多(≥2)的数据行,检测是否还有缺失数据

# 去除重复行,且更新数据集

stu.drop_duplicates(inplace=True)
stu.dropna(thresh=8, inplace=True)
print('形状:', stu.shape)
print("是否有缺失列",stu.isnull().any())
形状: (48, 9)
是否有缺失列 性别      False
年龄       True
身高      False
体重      False
省份      False
成绩       True
月生活费    False
课程兴趣    False
案例教学    False
dtype: bool

步骤4:填充缺失值:成绩按照平均分填充;接受调查同学为二年级,用默认值“20”来填充

# 填充
# stu['年龄'].mode()
stu.fillna({'年龄':20, '成绩':stu['成绩'].mean()}, inplace=True)

步骤5:将同学数据按照“成绩”排序,统计优秀(≥90)和不合格(<60) 学生个数。并分别计算优秀与不合格同学的平均课程兴趣度,以及全体同学 课程的平均分与课程兴趣度

#按照成绩排序
stu_grade = stu.sort_values(by='成绩', ascending=False)
stu_grade

性别年龄身高体重省份成绩月生活费课程兴趣案例教学
序号
30female20.016852.0JiangSu98.000000700.055
35male20.017166.0ShangHai97.000000650.055
37male21.017768.0XinJiang95.000000500.055
21female21.016545.0ShangHai93.0000001200.055
23male21.016980.0GanSu93.000000900.055
43female21.016155.0XiZang93.0000001250.055
31female21.016245.0JiLin92.0000001400.055
6male20.017975.0YunNan92.000000950.055
41male19.017463.0HeiLongJiang91.000000600.055
42male21.017773.0SiChuan89.000000700.045
22female19.016742.0HuBei89.000000800.055
1female21.016249.0YunNan89.000000800.055
10male19.016976.0HeiLongJiang88.0000001100.055
45male20.016863.0JiangXi87.000000800.055
36male21.017478.0GanSu87.0000001300.055
4female21.016252.0TianJin86.000000500.055
44male20.017163.0ChongQing82.000000600.045
49male21.017279.0ChongQing81.0000001000.055
29female20.016151.0GuangXi80.0000001250.055
7female21.016653.0LiaoNing80.0000001200.045
2female20.016453.0GuiZhou79.0000001000.045
8female20.016354.0XinJiang79.0000001400.045
4male20.017772.0LiaoNing79.000000900.044
8female20.016247.0AnHui78.0000001000.044
2male22.018071.0GuangXi77.0000001300.034
33male20.017164.0JiangXi77.0000001300.045
5male20.017573.0AnHui76.326087700.044
1male20.017070.0LiaoNing76.326087800.054
50female20.016648.0GuangXi76.0000001100.044
6male19.017220.0ShanDong75.000000900.055
7male21.017879.0GuiZhou74.000000650.045
28female22.016052.0ShanXi73.000000800.034
47female21.016353.0ShanXi73.000000600.045
46male21.017473.0GuangDong71.0000001300.055
25female21.016254.0GanSu68.0000001300.045
27female21.016249.0ShanDong65.000000950.044
48male21.017574.0GuangDong64.000000700.034
39female19.015946.0ShanDong64.0000001100.044
32female20.016245.0ChongQing63.000000650.044
38male19.017079.0YunNan63.0000001000.035
40female21.016352.0JiangXi62.0000001500.034
26male21.018177.0SiChuan62.000000800.025
34male21.017278.0BeiJing62.000000950.044
9female21.016044.0ShangHai61.000000600.055
24female21.016049.0HeBei59.0000001100.035
3male20.018062.0FuJian57.0000001000.024
10female19.016348.0GuiZhou56.000000700.025
3female20.016643.0HaiNan12.0000001000.055
# 统计优秀和不及格人数
ex = (stu_grade['成绩']>=90).sum()
fail = (stu_grade['成绩']<60).sum()
print('优秀:'+str(ex)+' 不合格:'+ str(fail))
print('优秀:{} 不合格:{}'.format(ex,fail))
优秀:9 不合格:4
优秀:9 不合格:4
#条件表达式stu_grade[‘成绩’]>=90 得到布尔型Series对象,sum()函数统计其中True的个数
# ex = (stu_grade['成绩']>=90 )
# ex
#ex.sum()
#计算优秀成绩与课程兴趣平均值
ex_mean = stu_grade[0:9][['成绩','课程兴趣']].mean()
total_mean = stu_grade[['成绩','课程兴趣']].mean()
fail_mean = stu_grade[-4:][['成绩','课程兴趣']].mean()
print('优秀成绩平均分\n',ex_mean,'\n总成绩平均分\n',total_mean,'\n不合格成绩平均分\n',fail_mean)
优秀成绩平均分
 成绩      93.777778
课程兴趣     5.000000
dtype: float64 
总成绩平均分
 成绩      76.326087
课程兴趣     4.208333
dtype: float64 
不合格成绩平均分
 成绩      46.0
课程兴趣     3.0
dtype: float64
# 计算两列相关性
stu['成绩'].corr(stu['课程兴趣'])
0.49184633480796774

步骤6:分析性别、省份与成绩是否存在相关性,由于性别和省份数据均为字符型, 无法用corr()函数来计算。简单的方法是分组计算均值:

# 按照性别分组
gen = stu.groupby(['性别'])

# 分组统计个数
gen_cnt = gen.count()
gen_cnt
年龄身高体重省份成绩月生活费课程兴趣案例教学
性别
female2424242424242424
male2424242424242424
# 分组统计成绩平均值
# stu.groupby(['性别']).mean()
stu.groupby(['性别']).aggregate({'成绩':np.mean })
成绩
性别
female73.666667
male78.985507
sf = stu.groupby(['省份'])
sf.count()
性别年龄身高体重成绩月生活费课程兴趣案例教学
省份
AnHui22222222
BeiJing11111111
ChongQing33333333
FuJian11111111
GanSu33333333
GuangDong22222222
GuangXi33333333
GuiZhou33333333
HaiNan11111111
HeBei11111111
HeiLongJiang22222222
HuBei11111111
JiLin11111111
JiangSu11111111
JiangXi33333333
LiaoNing33333333
ShanDong33333333
ShanXi22222222
ShangHai33333333
SiChuan22222222
TianJin11111111
XiZang11111111
XinJiang22222222
YunNan33333333
sf['成绩'].mean()
省份
AnHui           77.163043
BeiJing         62.000000
ChongQing       75.333333
FuJian          57.000000
GanSu           82.666667
GuangDong       67.500000
GuangXi         77.666667
GuiZhou         69.666667
HaiNan          12.000000
HeBei           59.000000
HeiLongJiang    89.500000
HuBei           89.000000
JiLin           92.000000
JiangSu         98.000000
JiangXi         75.333333
LiaoNing        78.442029
ShanDong        68.000000
ShanXi          73.000000
ShangHai        83.666667
SiChuan         75.500000
TianJin         86.000000
XiZang          93.000000
XinJiang        87.000000
YunNan          81.333333
Name: 成绩, dtype: float64

步骤7:计算同学的BMI值,找出各个四分位数,并与国家标准进行比较:

#新增BMI列
stu['BMI'] = stu['体重'] / ( np.square(stu['身高']/100) )
print( stu['BMI'].quantile( [.25,0.5,.75] ) )     #计算四分位数
print('BMI>28 肥胖人数:',  (stu['BMI']>=28 ).sum() ) 
0.25    18.609210
0.50    20.450285
0.75    23.431521
Name: BMI, dtype: float64
BMI>28 肥胖人数: 1
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值