Python中用于数据探索的库主要是pandas(数据分析)和Matplotlib(数据可视化)。其中pandas提供了大量的与数据探索相关的函数,这些数据探索函数可大致分为统计特征函数与统计绘图函数,而绘图函数依赖于Matplotlib,所以往往又会跟Matplotlib结合在一起使用。本小节对pandas中主要的统计特征函数与统计绘图函数进行介绍,并举出实例以便于理解。
统计特征函数用于计算数据的均值、方差、标准差、分位数、相关系数、协方差等,这些统计特征能反映出数据的整体分布。本小节所介绍的统计特征函数如表3-8所示,它们主要作为pandas的对象DataFrame或Series的方法出现。
表3-8 pandas主要统计特征函数
(1)sum
1)功能
计算数据样本的总和(按列计算)。
2)使用格式
D.sum()
表示按列计算样本D的总和,样本D可为DataFrame或者Series。
(2)mean
1)功能
计算数据样本的算术平均数。
2)使用格式
D.mean()
表示按列计算样本D的均值,样本D可为DataFrame或者Series。
(3)var
1)功能
计算数据样本的方差。
2)使用格式
D.var()
表示按列计算样本D的均值,样本D可为DataFrame或者Series。
(4)std
1)功能
计算数据样本的标准差。
2)使用格式
D.std()
表示按列计算样本D的标准差,样本D可为DataFrame或者Series。
(5)corr
1)功能
计算数据样本的Spearman(Pearson)相关系数矩阵。
2)使用格式
D.corr(method='pearson')
样本D可为DataFrame,返回相关系数矩阵。method参数为计算方法,支持Pearson(皮尔森相关系数,默认选项)、Kendall(肯德尔系数)、Spearman(斯皮尔曼系数)。
S1.corr(S2, method='pearson')
S1、S2均为Series,这种格式用于指定计算两个Series之间的相关系数。
3)实例
计算两个列向量的相关系数,采用Spearman方法,如代码清单3-10所示。
代码清单3-10 计算两个列向量的相关系数
import pandas as pd D = pd.DataFrame([range(1, 8), range(2, 9)]) # 生成样本D,一行为1~7,一行为2~8 print(D.corr(method='spearman')) # 计算相关系数矩阵 S1 = D.loc[0] # 提取第一行 S2 = D.loc[1] # 提取第二行 print(S1.corr(S2, method='pearson')) # 计算S1、S2的相关系数
*代码详见:demo/code/实例.py。
(6)cov
1)功能
计算数据样本的协方差矩阵。
2)使用格式
D.cov()
样本D可为DataFrame,返回协方差矩阵。
S1.cov(S2)
S1、S2均为Series,这种格式用于指定计算两个Series之间的协方差。
3)实例
计算6×5随机矩阵的协方差矩阵,如代码清单3-11所示。
代码清单3-11 计算6×5随机矩阵的协方差矩阵
import numpy as np D = pd.DataFrame(np.random.randn(6, 5)) # 产生6×5随机矩阵 print(D.cov()) # 计算协方差矩阵 print(D[0].cov(D[1])) # 计算第一列和第二列的协方差
*代码详见:demo/code/实例.py。
(7)skew/kurt
1)功能
计算数据样本的偏度(三阶矩)/峰度(四阶矩)。
2)使用格式
D.skew() D.kurt()
计算样本D的偏度(三阶矩)/峰度(四阶矩)。样本D可为DataFrame或Series。
3)实例
计算6×5随机矩阵的偏度(三阶矩)/峰度(四阶矩),如代码清单3-12所示。
代码清单3-12 计算6×5随机矩阵的偏度(三阶矩)/峰度(四阶矩)
import numpy as np D = pd.DataFrame(np.random.randn(6, 5)) # 产生6×5随机矩阵 print(D.skew()) # 计算偏度 print(D.kurt()) # 计算峰度
*代码详见:demo/code/实例.py。
(8)describe
1)功能
直接给出样本数据的一些基本的统计量,包括均值、标准差、最大值、最小值、分位数等。
2)使用格式
D.describe()括号里可以带一些参数,如percentiles=[0.2,0.4,0.6,0.8]就是指定只计算0.2、0.4、0.6、0.8分位数,而不是默认的1/4、1/2、3/4分位数。
3)实例
给出6×5随机矩阵的基本统计量,如代码清单3-13所示。
代码清单3-13 6×5随机矩阵的基本统计量
import numpy as np D = pd.DataFrame(np.random.randn(6, 5)) # 产生6×5随机矩阵 print(D.describe())
*代码详见:demo/code/实例.py。
除了上述基本统计特征外,pandas还提供了另外一些非常方便实用的计算统计特征的函数,主要有累积计算(cum)和滚动计算(pd.rolling_),如表3-9和表3-10所示。
表3-9 pandas累积计算统计特征函数
表3-10 pandas滚动计算统计特征函数
其中,cum系列函数是作为DataFrame或Series对象的方法而出现的,因此命令格式为D.cumsum(),而rolling_系列函数是pandas的函数,不是DataFrame或Series对象的方法,因此,它们的使用格式为pd.rolling_mean(D,k),意思是每k列计算一次均值,滚动计算。
·实例
pandas累积计算统计特征函数、滚动计算统计特征函数示例如代码清单3-14所示。
代码清单3-14 pandas累积计算统计特征函数、滚动计算统计特征函数示例
D = pd.Series(range(0, 20)) # 构造Series,内容为0~19共20个整数 print(D.cumsum()) # 给出前n项和 print(D.rolling(2).sum()) # 依次对相邻两项求和
*代码详见:demo/code/实例.py。
通过统计绘图函数绘制的图表可以直观地反映出数据及统计量的性质及其内在规律,如盒图可以表示多个样本的均值,误差条形图能同时显示下限误差和上限误差,最小二乘拟合曲线图能分析两个变量间的关系。
Python的主要绘图库是Matplotlib,在第2章中已经做了初步介绍,而pandas基于Matplotlib并对某些命令做了简化,因此绘图通常是Matplotlib和pandas相互结合使用。本小节仅简单地对一些基本的绘图进行介绍,而真正灵活地使用应当参考我们在书中所给出的各个绘图代码清单。本小节介绍的统计绘图函数如表3-11所示。
表3-11 Python主要统计绘图函数
在绘图之前,通常要加载代码清单3-15所示的代码。
代码清单3-15 绘图之前需要加载的代码
import matplotlib.pyplot as plt # 导入绘图库 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 plt.figure(figsize=(7, 5)) # 创建图像区域,指定比例
*代码详见:demo/code/实例.py。
绘图完成后,一般通过plt.show()命令来显示绘图结果。
1)功能
绘制线性二维图,折线图。
2)使用格式
plt.plot(x, y, S)
这是Matplotlib通用的绘图方式,绘制y对于x(即以x为横轴的二维图形),字符串参量S指定绘制时图形的类型、样式和颜色,常用的选项有:“b”为蓝色、“r”为红色、“g”为绿色、“o”为圆圈、“+”为加号标记、“-”为实线、“--”为虚线。当x、y均为实数同维向量时,则描出点(x(i),y(i)),然后用直线依次相连。
D.plot(kind = 'box')
这里使用的是DataFrame或Series对象内置的方法绘图,默认以Index为横坐标,每列数据为纵坐标自动绘图,通过kind参数指定绘图类型,支持line(线)、bar(条形)、barh、hist(直方图)、box(箱型图)、kde(密度图)、area、pie(饼图)等,同时也能够接受plt.plot()中接受的参数。因此,如果数据已经被加载为pandas中的对象,那么以这种方式绘图是比较简洁的。
3)实例
在区间(0≤x≤2π)绘制一条蓝色的正弦虚线,并在每个坐标点标上五角星,如代码清单3-16所示,得到的图形如图3-13所示。
代码清单3-16 绘制一条蓝色的正弦虚线
import numpy as np x = np.linspace(0,2*np.pi,50) # x坐标输入 y = np.sin(x) # 计算对应x的正弦值 plt.plot(x, y, 'bp--') # 控制图形格式为蓝色带星虚线,显示正弦曲线 plt.show()
*代码详见:demo/code/实例.py。
图3-13 正弦曲线图
1)功能
绘制饼图。
2)使用格式
plt.pie(size)
使用Matplotlib绘制饼图,其中size是一个列表,记录各个扇形的面积比例。pie有丰富的参数,详情请参考下面的实例。
3)实例
通过向量[15,30,45,10]绘制饼图,注上标签,并将第二部分分离出来,如代码清单3-17所示,得到的图形如图3-14所示。
代码清单3-17 绘制饼图
import matplotlib.pyplot as plt # The slices will be ordered and plotted counter-clockwise. labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' # 定义标签 sizes = [15, 30, 45, 10] # 每一块的比例 colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] # 每一块的颜色 explode = (0, 0.1, 0, 0) # 突出显示,这里仅仅突出显示第二块(即'Hogs') plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90) plt.axis('equal') # 显示为圆(避免比例压缩为椭圆) plt.show()
*代码详见:demo/code/实例.py。
图3-14 饼图
1)功能
绘制二维条形直方图,可显示数据的分布情形。
2)使用格式
plt.hist(x, y)
其中,x是待绘制直方图的一维数组。y可以是整数,表示均匀分为y组;也可以是列表,列表各个数字为分组的边界点(即手动指定分界点)。
3)实例
绘制二维条形直方图,随机生成有1000个元素的服从正态分布的数组,分成10组绘制直方图,如代码清单3-18所示,得到的图形如图3-15所示。
代码清单3-18 绘制二维条形直方图
import matplotlib.pyplot as plt import numpy as np x = np.random.randn(1000) # 1000个服从正态分布的随机数 plt.hist(x, 10) # 分成10组绘制直方图 plt.show()
*代码详见:demo/code/实例.py。
图3-15 二维条形直方图
1)功能
绘制样本数据的箱型图。
2)使用格式
D.boxplot() D.plot(kind='box')
绘制D的箱型图时有两种比较简单的方式,一种是直接调用DataFrame的box-plot()方法,另一种是调用Series或者Data-Frame的plot()方法,并用kind参数指定箱型图(box)。其中,盒子的上、下四分位数和中值处有一条线段。箱形末端延伸出去的直线称为须,表示盒外数据的长度。如果在须外没有数据,则在须的底部有一点,点的颜色与须的颜色相同。
3)实例
绘制样本数据的箱型图时,样本由两组正态分布的随机数据组成,其中一组数据均值为0,标准差为1,另一组数据均值为1,标准差为1,如代码清单3-19所示,得到的图形如图3-16所示。
代码清单3-19 绘制箱型图
import matplotlib.pyplot as plt import numpy as np import pandas as pd x = np.random.randn(1000) # 1000个服从正态分布的随机数 D = pd.DataFrame([x, x+1]).T # 构造两列的DataFrame D.plot(kind='box') # 调用Series内置的绘图方法画图,用kind参数指定箱型图(box) plt.show()
*代码详见:demo/code/实例.py。
图3-16 箱型图
1)功能
绘制x或y轴的对数图形。
2)使用格式
D.plot(logx=True) D.plot(logy=True)
对x轴(y轴)使用对数刻度(以10为底),y轴(x轴)使用线性刻度,进行plot函数绘图,D为pandas的DataFrame或者Series。
3)实例
构造指数函数数据,使用plot(logy=True)函数进行绘图,如代码清单3-20所示,得到的图形如图3-17所示。
代码清单3-20 使用plot(logy=True)函数进行绘图
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 import numpy as np import pandas as pd x = pd.Series(np.exp(np.arange(20))) # 原始数据 plt.figure(figsize=(8, 9)) # 设置画布大小 ax1 = plt.subplot(2, 1, 1) x.plot(label='原始数据图', legend=True) ax1 = plt.subplot(2, 1, 2) x.plot(logy=True, label='对数数据图', legend=True) plt.show()
*代码详见:demo/code/实例.py。
图3-17 绘图y轴的对数图形对比图
1)功能
绘制误差条形图。
2)使用格式
D.plot(yerr=error)
绘制误差条形图时,D为pandas的DataFrame或Series,代表着均值数据列,而error则是误差列,此命令可在y轴方向画出误差棒图;类似地,如果设置参数xerr=error,则在x轴方向画出误差棒图。
3)实例
绘制误差棒图,如代码清单3-21所示,得到的图形如图3-18所示。
代码清单3-21 绘制误差棒图
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 import numpy as np import pandas as pd error = np.random.randn(10) # 定义误差列 y = pd.Series(np.sin(np.arange(10))) # 均值数据列 y.plot(yerr=error) # 绘制误差图 plt.show()
*代码详见:demo/code/实例.py。
图3-18 误差条形图