为了从原始数据中得到更深层次、更能揭示数据之间内在联系的信息,
本章所用数据表(学生成绩表

24.1 sample()函数
在手工数据分析年代,面对成百上千的数据,我们往往就束手无策,人工处理大量的数据总感到力不从心。尽管我们都知道了,原始数据越多越详实越好,但时间和精力总归是有限的,也许你耗费了大量的心血得到了想要的分析结果,但已时过境迁,费尽心机得来的分析报表一点价值都没有,的确非常遗憾。
抽样,就成了拨冗取真的利器。大凡碰到数据量太大的情况,从中抽取一小部分数据加以处理即可,虽然因此会对数据分析结果的准确性产生很大的影响,但也是不得已而为之。
在如今的大数据时代,我们毫不畏惧海量的数据。可以说,不怕数据多,只怕数据少。采用
虽然抽样方法在大数据时代的已经不那么重要了,但还是有必要介绍一下,因为如果要快速、一目了然的掌握个大致的情况,抽样是最合适不过的了。
sample()的语法格式:
dfnSeriesn0/1
其中,随机数种子,当设置后每次抽取的记录都是相同的;0时为默认值,表示横向抽取,1时表示按列抽取。
现采用学生成绩表数据,将
In [1]: from pandas import read_excel
file='d:/xscj.xlsx'
df=read_excel(file,sheet_name=0,converters={'学号':str})
In [2]: df1=df.sample(3) #随机抽取3个记录
print(df1)
学号
14 0205 张佳媛 女 110 113 96 319 2
9 0110 柳雯 女 94 72 51 217 1
5 0106 郭峻峰 男 100 110 100 310 1
#随机抽取20%的记录
print(df1)
学号
0 0101 陈浩楠 男 109 107 100 316 1
11 0202 王博 男 109 112 94 315 2
20 0301 李佳兴 男 106 96 92 294 3
21 0302 陈美菱 女 102 95 88 285 3
25 0306 王菲 女 111 115 96 322 3
22 0303 王佳妮 女 106 108 84 298 3
#增加了replace参数,允许重复选取
print(df1)
学号
25 0306 王菲 女 111 115 96 322 3
25 0306 王菲 女 111 115 96 322 3
20 0301 李佳兴 男 106 96 92 294 3
20 0301 李佳兴 男 106 96 92 294 3
20 0301 李佳兴 男 106 96 92 294 3
19 0210 贾一伊 女 103 100 94 297 2
#添加了随机数种子,值为2
print(df1)
学号
1 0102 金新阳 男 100 103 90 293 1
0 0101 陈浩楠 男 109 107 100 316 1
14 0205 张佳媛 女 110 113 96 319 2
6#随机数种子的值不变,输出结果不变
print(df1)
学号
1 0102 金新阳 男 100 103 90 293 1
0 0101 陈浩楠 男 109 107 100 316 1
14 0205 张佳媛 女 110 113 96 319 2
24.2 分布分析
分布分析用于分析各个分组数据分布规律。
1
import numpy as np #为了使用np.size,故导入numpy
from pandas import read_excel
#学生成绩表xscj.xlsx
df=read_excel(file,sheet_name=0,converters={'学号':str})
2(略)
In [3]: df['总分'].max()
Out[3]: 331
In [4]: df['总分'].min()
Out[4]: 217
通过上述两个命令,我们已经知道了总分的最高分和最低分。下面将总分按照
In [5]: bins=[ df['总分'].min()-1,250,300,df['总分'].max()+1]
#定义了三个区间,min()-1和max()+1是为了保证将最小值和最大值都包含进来。
In [6]: bins
Out[6]: [216, 250, 300, 332]
In [7]: labels=['200分到250分之间','250分到300之间','300分到350分']
#定义了四个标签
In [8]: labels
Out[8]: ['200分到250分之间', '250分到300之间', '300分到350分']
In [9]: df['总分分段']=pd.cut(df.总分,bins,labels=labels)
#将每一个记录都归属到每一个区间,并将标签写入字段“总分分段”中。
10段
C:\Users\zym\AppData\Local\Continuum\anaconda3\Scripts\ipython:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version. Use named aggregation instead.
>>> grouper.agg(name_1=func_1, name_2=func_2)
#按照字段“总分分段”的值进行分组统计,由于numpy版本的问题,可能会出现上面的提示信息,并不影响执行,可以忽略。
Out[10]:
人数
总分分段
200分到250分之间 4
250分到300之间 14
300分到350分 12
从上述各段人数分布,可以反映出成绩分布规律。
24.3 数据透视
为了从不同维度分析数据,可以使用
pivot_table()函数的语法格式:
pivot_table(values, index, columns, aggfunc, fill_value)
其中,
index和cloumns两个参数至少要选取一个,否则就等于没有指定透视对象,函数不能被执行。
下面举例说明(数据表为:学生成绩表
1
#学生成绩表xscj.xlsx
df=read_excel(file,sheet_name=0,converters={'学号':str})
2(略)
In [3]: df.pivot_table(index='班级')
Out[3]:
总分
班级
1 292.1 102.8 86.0 103.3
2 282.5 91.3 87.8 103.4
3 290.4 103.2 82.8 104.4
在中选取行作为透视对象,,一个班级的数据在同一行表示。
In [4]: df.pivot_table(columns='班级')
Out[4]:
班级
总分
数学
英语
语文
在4中选取行作为透视对象,,每一个班级的数据在同一列表示。
如上,和中输出的数据为各班的数值列(总分、数学、英语、语文)的平均值,即默认的统计函数就是
为了验证是否为平均值,我们验证一下。
首先,为了使用
In [5]: import numpy as np
然后在
6
6
班级
总分
数学
英语
语文
发现和6的输出结果完全一致,故证明统计值就是各数值列的平均值。
7
7
mean amax amin
班级
总分
数学
英语
语文
8
8
mean amax amin
总分
班级
1 292.1 102.8 86.0 103.3 331 119 100 113 217 72 51 89
2 282.5 91.3 87.8 103.4 319 113 97 110 234 58 75 95
3 290.4 103.2 82.8 104.4 322 115 96 112 238 88 39 90
7和8输出的内容是一样的,但8更似明了。所以,不管是指定
24.4构成分析
如果把某一项数据看成一个整体,那么,构成这个整体的各个单元所占的比重是多少?这是一个非常重要的数据。如前面我们统计过总分在各个分段的学生人数,再将各段人数除以总人数也可以得到,但
例:
In [1]: import numpy as np
import pandas as pd
from pandas import read_excel
file='d:/xscj.xlsx'
df=read_excel(file,sheet_name=0,converters={'学号':str})
bins=[ df['总分'].min()-1,250,300,df['总分'].max()+1]
labels=['C','B','A']
df['等级']=pd.cut(df.总分,bins,labels=labels)
2
2
学号
0 0101 陈浩楠 男 109 107 100 316 1 A
1 0102 金新阳 男 100 103 90 293 1 B
2 0103 朱浩楠 女 89 74 88 251 1 B
3 0104 白雨薇 女 113 119 99 331 1 A
4 0105 张梓悦 女 112 116 98 326 1 A
3
4
4
size
总分
等级
班级
1 1 4 5
2 2 5 3
3 1 5 4
4输出结果中,行表示各个班级,列表示总分值分别属于
5
5
size
总分
等级
班级
1 0.1 0.4 0.5
2 0.2 0.5 0.3
3 0.1 0.5 0.4
5输出结果中,行表示各个班级,列表示总分值分别属于
6
6
size
总分
等级
班级
1 0.25 0.285714 0.416667
2 0.50 0.357143 0.250000
3 0.25 0.357143 0.333333
6输出结果中,行表示各个班级,列表示总分值分别属于
24.5相关分析
通过分析两个或多个变量之间数量变化规律,从而发现是否存在某种依存关系,是数据分析很重要的内容。
Python提供的相关性分析函数能够帮助我们快速发现相关关系,并得到描述相关程度的数值即相关度。
相关分析函数有适用于
相关度
0≤|γ|<0.3 两个变量之间存在“低度相关”
0.3≤|γ|<0.8 两个变量之间存在“中度相关”
0.8≤|γ|≤1 两个变量之间存在“高度相关”
下面举例说明:
1
#学生成绩表xscj.xlsx
df=read_excel(file,sheet_name=0,converters={'学号':str})
In [2]: df['语文'].corr(df['数学'])
Out[2]: 0.7404834173020638
由于
In [3]: df.loc[:,['语文','数学','英语']].corr()
Out[3]:
语文
语文
数学
英语
从可以看出,每一门课程和本身的相关度都为
出现这种情况的原因是否与各科成绩的满分值有关呢?因为语文、数学的满分值都是
In [4]: df.英语=df.英语*1.2
5
5
学号
0 0101 陈浩楠 男 109 107 120.0 316 1
1 0102 金新阳 男 100 103 108.0 293 1
2 0103 朱浩楠 女 89 74 105.6 251 1
3 0104 白雨薇 女 113 119 118.8 331 1
4 0105 张梓悦 女 112 116 117.6 326 1
从5可以看到英语成绩已经调整为满分值为
6
6
语文
语文
数学
英语
但是,对比[3]和6,发现各个相关度的值都没有变化。这充分说明相关度计算方法是比较可信的。

本文由大漠孤驼的编程苦旅原创,欢迎关注,带你一起长知识!