【Python数据处理篇——DataFrame数据分析】基本统计,分组分析,分布分析,交叉分析,结构分析,相关分析

欢迎访问我搞事情的【知乎账号】:Coffee
以及我的【B站漫威剪辑账号】:VideosMan
若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦。

关于DataFrame的相关知识,我还进行了汇总,欢迎点赞收藏!!

【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化


4、数据分析

4.4.1 基本统计:describe

如果分组字段是离散值,则直接使用groupby分组统计

基本统计分析:又叫描述性统计分析,一般统计某个变量的最小值、第一个四分位值、中值、第三个四分位值、以及最大值。
describe() 描述性统计分析函数

 常用的统计函数:
 size        计数(此函数不需要括号)
 sum()      求和
 mean()     平均值
 var()       方差
 std()       标准差

(22条消息) Python对表的行列求和_OlivierJ的博客-CSDN博客_python 列求和

4.4.2 分组分析:groupby(离散值分组)

如果分组字段是连续值,则先进行离散化(cut),然后再使用groupby分组

分组分析:是指根据分组字段将分析对象划分成不同的部分,以进行对比分析各组之间的差异性的一种分析方法。

常用的统计指标:计数、求和、平均值
常用形式:
df.groupby(by=['分类1','分类2',...])['被统计的列'].agg({列别名1:统计函数1,列别名2:统计函数2,…})
		by    用于分组的列
		[ ]    用于统计的列
		.agg   统计别名显示统计值的名称,统计函数用于统计数据
		size   计数
		sum   求和
		mean  均值
from pandas import read_excel 
df = read_excel('e:\\rz4.xlsx')
df

Out[1]:
学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 计算机
0 2308024241 23080242 成龙 男 76 78 77 40 23 60 89
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82
2 2308024251 23080242 张波 男 85 81 75 45 45 60 80
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83
5 2308024201 23080242 迟培 男 60 50 89 71 76 71 82
6 2308024347 23080243 李华 女 67 61 84 61 65 78 83
7 2308024307 23080243 陈田 男 76 79 86 69 40 69 82
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82
11 2308024310 23080243 郭窦 女 79 67 84 64 64 79 85
12 2308024435 23080244 姜毅涛 男 77 71 87 61 73 76 82
13 2308024432 23080244 赵宇 男 74 74 88 68 70 71 85
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85
16 2308024433 23080244 李大强 男 79 76 77 78 70 70 89
17 2308024428 23080244 李侧通 男 64 96 91 69 60 77 83
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88
19 2308024422 23080244 李晓亮 男 85 60 85 72 72 83 89

df3.groupby(by=['班级','性别'])['军训'].agg({'总分':numpy.sum,'人数': numpy.size,'平均>值':numpy.mean,'方差':numpy.var,'标准差':numpy.std,'最高分':numpy.max,'最低分':numpy.min})

总分 人数 平均值 方差 标准差 最高分 最低分
班级 性别
23080242 女 167 2 83.500000 144.500000 12.020815 92 75
男 321 4 80.250000 38.250000 6.184658 89 75
23080243 女 258 3 86.000000 12.000000 3.464102 90 84
男 255 3 85.000000 1.000000 1.000000 86 84
23080244 女 170 2 85.000000 128.000000 11.313708 93 77
男 509 6 84.833333 25.766667 5.076088 91 77

4.4.3 分布分析:cut+groupby(连续值分组)

分组分析:是指根据分组字段将分析对象划分成不同的部分,以进行对比分析各组之间的差异性的一种分析方法。

常用的统计指标:计数、求和、平均值
   常用形式:
 df.groupby(by=['分类1','分类2',...])['被统计的列'].agg({列别名1:统计函数1,列别名2:统计函数2,…})		
 
 by    用于分组的列		
 [ ]    用于统计的列		
 .agg   统计别名显示统计值的名称,统计函数用于统计数据		
 size   计数		
 sum   求和		
 mean  均值
import numpy
import pandas
from pandas import read_excel
df = read_excel('e:\\rz4.xlsx')
df

Out[1]:
学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 计算机 总分
0 2308024241 23080242 成龙 男 76 78 77 40 23 60 89 443
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82 452
2 2308024251 23080242 张波 男 85 81 75 45 45 60 80 471
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82 482
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83 490
5 2308024201 23080242 迟培 男 60 50 89 71 76 71 82 499
6 2308024347 23080243 李华 女 67 61 84 61 65 78 83 499
7 2308024307 23080243 陈田 男 76 79 86 69 40 69 82 501
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95 510
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95 511
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82 518
11 2308024310 23080243 郭窦 女 79 67 84 64 64 79 85 522
12 2308024435 23080244 姜毅涛 男 77 71 87 61 73 76 82 527
13 2308024432 23080244 赵宇 男 74 74 88 68 70 71 85 530
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85 533
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85 538
16 2308024433 23080244 李大强 男 79 76 77 78 70 70 89 539
17 2308024428 23080244 李侧通 男 64 96 91 69 60 77 83 540
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88 544
19 2308024422 23080244 李晓亮 男 85 60 85 72 72 83 89 546

labels=['450及其以下','450到500','500及其以上']  #给三段数据贴标签
labels

Out[5]: [‘450及其以下’, ‘450到500’, ‘500及其以上’]

bins = [min(df.总分)-1,450,500,max(df.总分)+1]   #将数据分成三段
bins

Out[3]: [442, 450, 500, 547]

总分分层 = pandas.cut(df.总分,bins,labels=labels)
总分分层

Out[7]:
0 450及其以下
1 450到500
2 450到500
3 450到500
4 450到500
5 450到500
6 450到500
7 500及其以上
8 500及其以上
9 500及其以上
10 500及其以上
11 500及其以上
12 500及其以上
13 500及其以上
14 500及其以上
15 500及其以上
16 500及其以上
17 500及其以上
18 500及其以上
19 500及其以上
Name: 总分, dtype: category
Categories (3, object): [450及其以下 < 450到500 < 500及其以上]

df['总分分层']= 总分分层
df

Out8]:
学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 计算机基础 总分 总分分层
0 2308024241 23080242 成龙 男 76 78 77 40 23 60 89 443 450及其以下
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82 452 450到500
2 2308024251 23080242 张波 男 85 81 75 45 45 60 80 471 450到500
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82 482 450到500
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83 490 450到500
5 2308024201 23080242 迟培 男 60 50 89 71 76 71 82 499 450到500
6 2308024347 23080243 李华 女 67 61 84 61 65 78 83 499 450到500
7 2308024307 23080243 陈田 男 76 79 86 69 40 69 82 501 500及其以上
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95 510 500及其以上
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95 511 500及其以上
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82 518 500及其以上
11 2308024310 23080243 郭窦 女 79 67 84 64 64 79 85 522 500及其以上
12 2308024435 23080244 姜毅涛 男 77 71 87 61 73 76 82 527 500及其以上
13 2308024432 23080244 赵宇 男 74 74 88 68 70 71 85 530 500及其以上
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85 533 500及其以上
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85 538 500及其以上
16 2308024433 23080244 李大强 男 79 76 77 78 70 70 89 539 500及其以上
17 2308024428 23080244 李侧通 男 64 96 91 69 60 77 83 540 500及其以上
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88 544 500及其以上
19 2308024422 23080244 李晓亮 男 85 60 85 72 72 83 89 546 500及其以上

df.groupby(by=['总分分层'])['总分'].agg({'人数':numpy.size})

Out[9]:
人数
总分分层
450及其以下 1
450到500 6
500及其以上 13

4.4.4 交叉分析:pivot_table(数据透视表)

交叉分析:通常用于分析两个或两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析。一般分为:定量、定量分组交叉;定量、定性分组交叉;定性、定性分组交叉。

pivot_table(values,index,columns,aggfunc,fill_value)

values    数据透视表中的值		
index     数据透视表中的行		
columns   数据透视表中的列		
aggfunc   统计函数		
fill_value  NA值的统一替换
import numpy
import pandas
from pandas import read_excel
from pandas import pivot_table     #在spyder下也可以不导入

df = read_excel('e:\\rz4.xlsx')
bins = [min(df.总分)-1,450,500,max(df.总分)+1]
labels=['450及其以下','450到500','500及其以上']
总分分层 = pandas.cut(df.总分,bins,labels=labels)
df['总分分层']= 总分分层
df.pivot_table(values=['总分'],index=['总分分层’],
      columns=['性别'],aggfunc=[numpy.size,numpy.mean])

Out[1]:
size mean
总分 总分
性别 女 男 女 男
总分分层
450及其以下 NaN 1 NaN 443.000000
450到500 3 3 480.333333 484.000000
500及其以上 4 9 527.500000 527.666667

df.pivot_table(values=['总分'],index=['总分分层’],columns=['性别'],aggfunc=[numpy.size,numpy.mean],fill_value=0) 
#也可以将统计为0的赋值为零,默认为nan。

Out[2]:
size mean
总分 总分
性别 女 男 女 男
总分分层
450及其以下 0 1 0.000000 443.000000
450到500 3 3 480.333333 484.000000
500及其以上 4 9 527.500000 527.666667s

4.4.5 结构分析:pivot_table+sum+div(查比重)

结构分析:是在分组的基础上,计算各组成部分所占的比重,进而分析总体的内部特征的一种分析方法。

axis参数说明:0表示列;1表示行。

#假设要计算班级团体总分情况
import numpy
import pandas
from pandas import read_excel
from pandas import pivot_table  #在spyder下也可以不导入
df = read_excel('e:\\rz4.xlsx')
df_pt = df.pivot_table(values=['总分’],
     index=['班级'],columns=['性别’],
     aggfunc=[numpy.sum])
df_pt

Out[1]:
sum
总分
性别 女 男
班级
23080242 942 1895
23080243 1532 1529
23080244 1077 3220

df_pt.sum()

Out[3]:
性别
sum 总分 女 3551
男 6644
dtype: int64

df_pt.div(df_pt.sum(axis=1),axis=0)#按列占比

Out[5]:
sum
总分
性别 女 男
班级
23080242 0.332041 0.667959
23080243 0.500490 0.499510
23080244 0.250640 0.749360

df_pt.sum(axis=1)

Out[2]:
性别
sum 总分 女 3551
男 6644
dtype: int64

df_pt.div(df_pt.sum(axis=0),axis=1)#按行占比

Out[6]:
sum
总分
性别 女 男
班级
23080242 0.265277 0.285220
23080243 0.431428 0.230132
23080244 0.303295 0.484648

df_pt.sum(axis=0)#效果同省略

Out[4]:
班级
23080242 2837
23080243 3061
23080244 4297
dtype: int64

4.4.6 相关分析:corr(一维、二维)

相关分析: 是研究现象之间是否存在某种依存关系,并对具体有依存关系的现象探讨其相关方向以及相关程度,是研究随机变量之间的相关关系的一种统计方法。
相关系数: 可以用来描述定量变量之间的关系

相关系数|r|取值范围相关程度
0<=|r|<0.3低度相关
0.3<=|r|<0.8中度相关
0.8<=|r|<=1高度相关

相关分析函数:

DataFrame.corr()
	Series.corr(other)

如果由数据框调用corr方法,那么将会计算每列两两之间的相似度。如果由序列调用corr方法,那么只是计算该序列与传入的序列之间的相关度。

返回值:

DataFrame调用     返回DataFrame
	Series调用         返回一个数值型,大小为相关度

举例

#一维
df3.英语.corr(df3.高代)
Out[9]: -0.12524513810989527
df3.解几.corr(df3.高代)
Out[11]: 0.6132805268443008

#二维
df3.corr()
Out[13]: 
             学号        班级        英语    ...           解几     计算机基础        总分
学号     1.000000  0.982617  0.287492    ...     0.636150  0.211420  0.843040
班级     0.982617  1.000000  0.257248    ...     0.671301  0.251736  0.901960
英语     0.287492  0.257248  1.000000    ...     0.027452 -0.119039  0.167927
体育     0.130255  0.088482  0.244323    ...    -0.526276 -0.266896 -0.067810
军训     0.124176  0.248652 -0.335015    ...     0.249299  0.148933  0.446614
数分     0.435493  0.517529 -0.129588    ...     0.544394  0.123399  0.732137
高代     0.602636  0.635006 -0.125245    ...     0.613281  0.096979  0.779466
解几     0.636150  0.671301  0.027452    ...     1.000000  0.305934  0.705506
计算机基础  0.211420  0.251736 -0.119039    ...     0.305934  1.000000  0.223004
总分     0.843040  0.901960  0.167927    ...     0.705506  0.223004  1.000000
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值