Chapter 3: Data Analysis

  • 整书链接在第一章的内容
    • 本章文件:https://wwm.lanzouf.com/iXBqD02dtz0f
👉个人信息
  • 111:aaa
  • 222:bbb
  • 333:ccc
🞸🞸🞸🞸🞸🞸🞸🞸♥🞸🞸🞸🞸🞸🞸🞸🞸 本章应用Python、 Numpy、 Pandas、Scipy中常用分析工具计算常用的统计量。

3.1基本统计分析

【例3-1 】数据的基本统计。
import pandas as pd
df=pd.read_excel ('i_nuc.xls',sheet_name='Sheet7') 
df.head()
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几
0 0 2308024241 23080242 成龙 76 78 77 40 23 60
1 1 2308024244 23080242 周怡 66 91 75 47 47 44
2 2 2308024251 23080242 张波 85 81 75 45 45 60
3 3 2308024249 23080242 朱浩 65 50 80 72 62 71
4 4 2308024219 23080242 封印 73 88 92 61 47 46
df.数分.describe()
count    20.000000
mean     62.850000
std       9.582193
min      40.000000
25%      60.750000
50%      63.500000
75%      69.250000
max      78.000000
Name: 数分, dtype: float64
df.解几.size
20
df.解几.max()
83
df.解几.min()
44
df.解几.sum()
1393
df.解几.mean()
69.65
df.解几.var()
113.29210526315791
df.解几.std()
10.64387642088905
import numpy as np
np.mean(df['数分'])
62.85
df['数分'].mean
<bound method NDFrame._add_numeric_operations.<locals>.mean of 0     40
1     47
2     45
3     72
4     61
5     71
6     61
7     69
8     65
9     60
10    60
11    64
12    61
13    68
14    61
15    63
16    78
17    69
18    70
19    72
Name: 数分, dtype: int64>
df.median()
C:\Users\b2014\AppData\Local\Temp\ipykernel_23216\530051474.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError.  Select only valid columns before calling the reduction.
  df.median()





Unnamed: 0    9.500000e+00
学号            2.308024e+09
班级            2.308024e+07
英语            7.350000e+01
体育            7.400000e+01
军训            8.400000e+01
数分            6.350000e+01
高代            6.550000e+01
解几            7.100000e+01
dtype: float64
df.mode()
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几
0 0 2308024201 23080244.0 余皓 76.0 50.0 84.0 61.0 47.0 71.0
1 1 2308024219 NaN 周怡 NaN NaN 67.0 NaN NaN 70.0 NaN
2 2 2308024241 NaN 周路 NaN NaN 74.0 NaN NaN NaN NaN
3 3 2308024244 NaN 姜毅涛 NaN NaN NaN NaN NaN NaN NaN
4 4 2308024249 NaN 封印 NaN NaN NaN NaN NaN NaN NaN
5 5 2308024251 NaN 张波 NaN NaN NaN NaN NaN NaN NaN
6 6 2308024307 NaN 成龙 NaN NaN NaN NaN NaN NaN NaN
7 7 2308024310 NaN 朱浩 NaN NaN NaN NaN NaN NaN NaN
8 8 2308024320 NaN 李上初 NaN NaN NaN NaN NaN NaN NaN
9 9 2308024326 NaN 李侧通 NaN NaN NaN NaN NaN NaN NaN
10 10 2308024342 NaN 李华 NaN NaN NaN NaN NaN NaN NaN
11 11 2308024347 NaN 李嘉 NaN NaN NaN NaN NaN NaN NaN
12 12 2308024402 NaN 李大强 NaN NaN NaN NaN NaN NaN NaN
13 13 2308024421 NaN 李晓亮 NaN NaN NaN NaN NaN NaN NaN
14 14 2308024422 NaN 林建祥 NaN NaN NaN NaN NaN NaN NaN
15 15 2308024428 NaN 王慧 NaN NaN NaN NaN NaN NaN NaN
16 16 2308024432 NaN 赵宇 NaN NaN NaN NaN NaN NaN NaN
17 17 2308024433 NaN 迟培 NaN NaN NaN NaN NaN NaN NaN
18 18 2308024435 NaN 郭窦 NaN NaN NaN NaN NaN NaN NaN
19 19 2308024446 NaN 陈田 NaN NaN NaN NaN NaN NaN NaN

3.2分组分析

import numpy as np
from pandas import read_excel
df=read_excel ('i_nuc.xls',sheet_name='Sheet7') 
df
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几
0 0 2308024241 23080242 成龙 76 78 77 40 23 60
1 1 2308024244 23080242 周怡 66 91 75 47 47 44
2 2 2308024251 23080242 张波 85 81 75 45 45 60
3 3 2308024249 23080242 朱浩 65 50 80 72 62 71
4 4 2308024219 23080242 封印 73 88 92 61 47 46
5 5 2308024201 23080242 迟培 60 50 89 71 76 71
6 6 2308024347 23080243 李华 67 61 84 61 65 78
7 7 2308024307 23080243 陈田 76 79 86 69 40 69
8 8 2308024326 23080243 余皓 66 67 85 65 61 71
9 9 2308024320 23080243 李嘉 62 0 90 60 67 77
10 10 2308024342 23080243 李上初 76 90 84 60 66 60
11 11 2308024310 23080243 郭窦 79 67 84 64 64 79
12 12 2308024435 23080244 姜毅涛 77 71 0 61 73 76
13 13 2308024432 23080244 赵宇 74 74 88 68 70 71
14 14 2308024446 23080244 周路 76 80 0 61 74 80
15 15 2308024421 23080244 林建祥 72 72 81 63 90 75
16 16 2308024433 23080244 李大强 79 76 77 78 70 70
17 17 2308024428 23080244 李侧通 64 96 91 69 60 77
18 18 2308024402 23080244 王慧 73 74 93 70 71 75
19 19 2308024422 23080244 李晓亮 85 60 85 72 72 83
df.groupby(by=['班级'])[['军训','英语','体育','性别']].mean()
军训 英语 体育
班级
23080242 81.333333 70.833333 73.000000
23080243 85.500000 71.000000 60.666667
23080244 64.375000 75.000000 75.375000
df.groupby(by=['班级','性别'])[['军训','英语','体育']].mean()  #by=可省略不写
军训 英语 体育
班级 性别
23080242 83.500000 69.500000 89.500000
80.250000 71.500000 64.750000
23080243 86.000000 69.333333 42.666667
85.000000 72.666667 78.666667
23080244 46.500000 74.500000 77.000000
70.333333 75.166667 74.833333
import numpy as np
df2=df.groupby(by=['班级','性别'])[['军训']].agg([
    '总分':np.sum,
    '人数':np.size,
    '平均值':np.mean,
    '方差':np.var,
    '标准差':np.std,
    '最高分':np.max,
    '最低分':np.min])
df2
  Input In [17]
    '总分':np.sum,
        ^
SyntaxError: invalid syntax

3.3分布分析

import pandas as pd
import numpy
from pandas import read_excel
df = pd.read_excel('i_nuc.xls',sheet_name='Sheet7')
df.head()
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几
0 0 2308024241 23080242 成龙 76 78 77 40 23 60
1 1 2308024244 23080242 周怡 66 91 75 47 47 44
2 2 2308024251 23080242 张波 85 81 75 45 45 60
3 3 2308024249 23080242 朱浩 65 50 80 72 62 71
4 4 2308024219 23080242 封印 73 88 92 61 47 46
df['总分']=df.英语+df.体育+df.军训+df.数分+df.高代+df.解几
df['总分'].head()
0    354
1    370
2    391
3    400
4    407
Name: 总分, dtype: int64
df['总分'].describe()
count     20.000000
mean     413.250000
std       36.230076
min      354.000000
25%      386.000000
50%      416.500000
75%      446.250000
max      457.000000
Name: 总分, dtype: float64
bins=[min(df.总分)-1,400,450,max(df.总分)+1] #将数据分成三段
bins
[353, 400, 450, 458]
labels=['400及其以下','400到450','450及其以上']  #给三段数据贴标签
labels
['400及其以下', '400到450', '450及其以上']
总分分层=pd.cut(df.总分,bins,labels=labels)
总分分层.head()
0    400及其以下
1    400及其以下
2    400及其以下
3    400及其以下
4    400到450
Name: 总分, dtype: category
Categories (3, object): ['400及其以下' < '400到450' < '450及其以上']
df['总分分层']=总分分层
df.tail()
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 总分 总分分层
15 15 2308024421 23080244 林建祥 72 72 81 63 90 75 453 450及其以上
16 16 2308024433 23080244 李大强 79 76 77 78 70 70 450 400到450
17 17 2308024428 23080244 李侧通 64 96 91 69 60 77 457 450及其以上
18 18 2308024402 23080244 王慧 73 74 93 70 71 75 456 450及其以上
19 19 2308024422 23080244 李晓亮 85 60 85 72 72 83 457 450及其以上

3.4交叉分析

from pandas import pivot_table 
df.pivot_table(index=['班级', '姓名'])
Unnamed: 0 体育 军训 学号 总分 数分 英语 解几 高代
班级 姓名
23080242 周怡 1 91 75 2308024244 370 47 66 44 47
封印 4 88 92 2308024219 407 61 73 46 47
张波 2 81 75 2308024251 391 45 85 60 45
成龙 0 78 77 2308024241 354 40 76 60 23
朱浩 3 50 80 2308024249 400 72 65 71 62
迟培 5 50 89 2308024201 417 71 60 71 76
23080243 余皓 8 67 85 2308024326 415 65 66 71 61
李上初 10 90 84 2308024342 436 60 76 60 66
李华 6 61 84 2308024347 416 61 67 78 65
李嘉 9 0 90 2308024320 356 60 62 77 67
郭窦 11 67 84 2308024310 437 64 79 79 64
陈田 7 79 86 2308024307 419 69 76 69 40
23080244 周路 14 80 0 2308024446 371 61 76 80 74
姜毅涛 12 71 0 2308024435 358 61 77 76 73
李侧通 17 96 91 2308024428 457 69 64 77 60
李大强 16 76 77 2308024433 450 78 79 70 70
李晓亮 19 60 85 2308024422 457 72 85 83 72
林建祥 15 72 81 2308024421 453 63 72 75 90
王慧 18 74 93 2308024402 456 70 73 75 71
赵宇 13 74 88 2308024432 445 68 74 71 70
df.pivot_table(values=['总分'],
                index=['总分分层'],
                columns=['性别'],
                aggfunc=[numpy.size,numpy.mean])
size mean
总分 总分
性别
总分分层
400及其以下 3 4 365.666667 375.750000
400到450 3 6 420.000000 430.333333
450及其以上 1 3 456.000000 455.666667

3.5结构分析

import pandas as pd
import numpy as np
from pandas import read_excel
from pandas import pivot_table 
df = pd.read_excel('i_nuc.xls',sheet_name='Sheet7')  #在spyder 下也可以不导入

df['总分']=df.英语+df.体育+df.军训+df.数分+df.高代+df.解几
df_pt=df.pivot_table(values=['总分'],index=['班级'],columns=['性别'],
                     aggfunc=[np.sum])
df_pt
sum
总分
性别
班级
23080242 777 1562
23080243 1209 1270
23080244 827 2620
df_pt.sum()
         性别
sum  总分  女     2813
         男     5452
dtype: int64
df_pt.sum(axis=1)  #按列合计
班级
23080242    2339
23080243    2479
23080244    3447
dtype: int64
df_pt.div(df_pt.sum(axis=1),axis=0)  #按列占比
sum
总分
性别
班级
23080242 0.332193 0.667807
23080243 0.487697 0.512303
23080244 0.239919 0.760081
df_pt.div(df_pt.sum(axis=0),axis=1)  #按行占比
sum
总分
性别
班级
23080242 0.276218 0.286500
23080243 0.429790 0.232942
23080244 0.293992 0.480558

3.6相关分析

import pandas as pd
import numpy as np
from pandas import read_excel
df = pd.read_excel('i_nuc.xls',sheet_name='Sheet7')
df.head()
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几
0 0 2308024241 23080242 成龙 76 78 77 40 23 60
1 1 2308024244 23080242 周怡 66 91 75 47 47 44
2 2 2308024251 23080242 张波 85 81 75 45 45 60
3 3 2308024249 23080242 朱浩 65 50 80 72 62 71
4 4 2308024219 23080242 封印 73 88 92 61 47 46
df['高代'].corr(df['数分'])
0.6077408233260108
df.loc[:,['英语','体育','军训','解几','数分','高代']].corr()
英语 体育 军训 解几 数分 高代
英语 1.000000 0.375784 -0.252970 0.027452 -0.129588 -0.125245
体育 0.375784 1.000000 -0.127581 -0.432656 -0.184864 -0.286782
军训 -0.252970 -0.127581 1.000000 -0.198153 0.164117 -0.189283
解几 0.027452 -0.432656 -0.198153 1.000000 0.544394 0.613281
数分 -0.129588 -0.184864 0.164117 0.544394 1.000000 0.607741
高代 -0.125245 -0.286782 -0.189283 0.613281 0.607741 1.000000
import pandas as pd
data= pd.read_excel('i_nuc.xls') 
data
日期 优盘 电子表 电脑支架 插座 电池 音箱 鼠标 usb数据线 手机充电线 键盘
0 2017-01-01 17 6 8 24 13.0 13 18 10 10 27
1 2017-01-02 11 15 14 13 9.0 10 19 13 14 13
2 2017-01-03 10 8 12 13 8.0 3 7 11 10 9
3 2017-01-04 9 6 6 3 10.0 9 9 13 14 13
4 2017-01-05 4 10 13 8 12.0 10 17 11 13 14
5 2017-01-06 13 10 13 16 8.0 9 12 11 5 9
6 2017-01-07 9 7 13 8 5.0 7 10 8 10 7
7 2017-01-08 9 12 13 6 7.0 8 6 12 11 5
8 2017-01-12 6 8 8 3 NaN 4 5 5 7 10
9 2017-01-13 9 11 13 6 8.0 7 6 9 8 9
10 2017-01-14 6 7 8 9 4.0 7 8 5 3 10
11 2017-01-15 5 9 4 7 8.0 9 15 9 13 9
12 2017-01-16 9 7 11 9 11.0 8 14 9 9 15
13 2017-01-17 10 8 10 6 14.0 13 16 9 4 14
14 2017-01-18 13 12 12 10 9.0 11 8 12 9 15
15 2017-01-19 4 8 12 11 9.0 7 10 6 11 11
16 2017-01-20 6 12 10 9 11.0 4 8 14 6 13
17 2017-01-21 9 15 4 12 7.0 9 1 5 12 8
18 2017-01-22 3 10 13 13 13.0 8 13 5 11 11
19 2017-01-23 8 7 9 20 5.0 12 8 7 8 11
20 2017-01-24 11 6 11 8 7.0 8 9 7 10 9
21 2017-01-25 11 6 5 15 7.0 14 14 7 6 8
22 2017-01-26 4 7 10 7 6.0 10 9 12 7 5
23 2017-01-27 7 5 6 7 12.0 15 6 12 9 4
24 2017-01-28 8 8 12 14 8.0 11 7 12 10 6
25 2017-01-29 4 10 12 9 7.0 8 8 10 10 11
26 2017-01-30 6 7 7 11 7.0 7 9 16 10 11
27 2017-01-31 8 5 11 10 8.0 11 8 10 10 9
28 2017-02-01 8 6 7 9 6.0 4 6 11 6 9
data.corr()
优盘 电子表 电脑支架 插座 电池 音箱 鼠标 usb数据线 手机充电线 键盘
优盘 1.000000 0.009206 0.016799 0.455638 0.098085 0.308496 0.204898 0.127448 -0.090276 0.428316
电子表 0.009206 1.000000 0.304434 -0.012279 0.058745 -0.180446 -0.026908 0.062344 0.270276 0.020462
电脑支架 0.016799 0.304434 1.000000 0.035135 0.096218 -0.184290 0.187272 0.121543 0.077808 0.029074
插座 0.455638 -0.012279 0.035135 1.000000 0.016006 0.325462 0.297692 -0.068866 -0.030222 0.421878
电池 0.098085 0.058745 0.096218 0.016006 1.000000 0.308454 0.502025 0.155428 0.171005 0.527844
音箱 0.308496 -0.180446 -0.184290 0.325462 0.308454 1.000000 0.369787 0.038233 0.049898 0.122988
鼠标 0.204898 -0.026908 0.187272 0.297692 0.502025 0.369787 1.000000 0.095543 0.157958 0.567332
usb数据线 0.127448 0.062344 0.121543 -0.068866 0.155428 0.038233 0.095543 1.000000 0.178336 0.049689
手机充电线 -0.090276 0.270276 0.077808 -0.030222 0.171005 0.049898 0.157958 0.178336 1.000000 0.088980
键盘 0.428316 0.020462 0.029074 0.421878 0.527844 0.122988 0.567332 0.049689 0.088980 1.000000
data['键盘'].corr(data['鼠标'])
0.5673319021716616
data.corr()['鼠标']
优盘        0.204898
电子表      -0.026908
电脑支架      0.187272
插座        0.297692
电池        0.502025
音箱        0.369787
鼠标        1.000000
usb数据线    0.095543
手机充电线     0.157958
键盘        0.567332
Name: 鼠标, dtype: float64
Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐