第3章 探索规律
3.1 相关分析
相关关系是一种与函数关系相区别的非确定性关系,而相关分析就是研究事物或现象之间是否存在这种非确定性关系的统计方法。相关分析按处理问题的不同,通常可分为自相关分析、偏相关分析、简单相关分析、互相关分析以及典型相关分析。其中自相关分析、偏相关分析适用于分析变量自身的规律;简单相关分析通常可分析任意两个等长数列间的相的相关性;而互相关分析则允许在一定的间隔下讲行简单相关分析:典型相关分析适用于分析两组变量的相关性。
3.1.1自相关分析
在Python中,可使用statsmodels.graphics.tasplots模块下的plot_acf函数来分析时间序列的自相关性。
表 plot_acf函数定义及参数说明
函数定义 | |
plot_acf(x,ax=None,lags=None,alpha=0.5,use_vlines=Ture,unbiased=True,fft=False,title='Autocorrelation',zero=True,vlines_kwargs=None,**kwargs) | |
参数说明 | |
lags | 可选项,表示延迟期数(横坐标),一般需要提供一个整数值或一个数值,当提供一个整数值时,它会按np.arange(lags)进行转换,默认情况下,它是np.arange(len(corr)) |
alpha | 可选项,标量值,当设定该值时,对应函数会返回对应的置信区间,比如当设置 alpha=0.05时,将返回95%的置信区间。若将该值设定为None,则函数不该回置信区间 |
use_vlines | 可选项,逻辑值。若为True,则绘制垂直线和标记。若为False,则只会绘制标记。默认为marker是'o',可以通过设置"marker"参数来修改 |
unbiased | 逻辑值,如果是True,则自协方差的分母是n-k,否则为n |
fft | 逻辑值,如果是 True,则使用FFT来计算ACF |
title | 自相关图的标题,默认为Autocorrelation |
zero | 逻辑值,是否包含0-lag的自相关,默认为 True |
vlines_kwargs | 可选项,字典对象,包含传递给vlines的关键参数 |
**kwargs | 可选项,直接传递给 Matplotlib中的 plot和 axhline函数的可选参数 |
ax | 可选项,Matplotlib AxesSubplot 实例,当提供时,则直接基于ax来绘图,而不需要重新创建一个新画布来绘图 |
x | 时间序列值组成的数组对象 |
3.1.2偏相关分析
在Python中,可使用statsmodels.graphics.tasplots模块下的plot_pacf函数来分析时间序列的偏相关性。
表 plot_pacf函数定义及参数说明
函数定义 | |
plot_pacf(x,ax=None,lags=None,alpha=0.05,method='ywunbiased',use_vlines=True,title='Partial Autocorrelation',zero=True,vlines_kwargs=None,**kwargs) | |
参数说明 | |
x | 时间序列值组成的数组对象 |
ax | 可选项,Matplotlib AxesSubplot 实例,当提供时,则直接基于ax来绘图,而不需要重新创建一个新画布来绘图 |
lags | 可选项,表示延迟期数(横坐标),一般需要提供一个整数值或一个数值,当提供一个整数值时,它会按np.arange(lags)进行转换;默认情况下,它是np.arange(len(corr)) |
alpha | 可选项,标量值,当设定该值时,对应函数会返回对应的置信区间,比如当设置alpha=0.05时,将返回95%的置信区间。若将该值设定为None,则函数不返回置信区间 |
method | 可取的值包括'ywunbiased','ywmle'和'ols',可按如下方法来选择使用。-yw or ywunbiased:默认项,在acovf的分母中进行偏差纠正的yule walker-ywm or ywmle:没有偏差纠正的yule walker-ols:基于时间序列延迟和常数项构建的回归-ld or ldunbiased:进行偏差纠正的Levinson-Durbin递归-ldb or Idbiased:没有偏差纠正的Levinson-Durbin递归 |
use_lines | 可选项,逻辑值。若为True,则绘制垂直线和标记。若为False,则只会绘制标记。默认为marker是'o',可以通过设置"marker"参数来修改 |
title | 自相关图的标题,默认为 Partial Autocorrelation |
zero | 逻辑值,是否包含0-lag 的自相关,默认为 True |
vlines_kwargs | 可选项,字典对象,包含传递给vlines的关键参数 |
**kwargs | 可选项,直接传递给Matplotlib中的plot和 axhline函数的可选参数 |
3.1.3简单相关分析
常见的相关分析的方法主要有散点图和相关图
1.散点图
散点图就是在数据点在直角坐标系上的分布图,通常分为散点图矩阵和三维散点图。其中散点图矩阵是变量两两组合,由数据点分布图构成的矩阵,而三维散点图就是从所有变量中选择3个变量进行绘制,进一步在三维空间里观察数据的形态。
- 散点图矩阵
Pandas.plotting模块下的scatter_matrix函数,使用该函数可快速绘制散点图。
import warnings warnings.filterwarnings("ignore") import pandas as pd import matplotlib.pyplot as plt iris = pd.read_csv('http://image.cador.cn/data/iris.csv') # 参数说明 # figsize=(10,10) 设置画布大小为10x10 # alpha=1,设置透明度,此处设置为不透明 # hist_kwds={"bins":20} 设置对角线上直方图参数 # 可通过设置diagonal参数为kde将对角图像设置为密度图 pd.plotting.scatter_matrix(iris,figsize=(10,10),alpha=1,hist_kwds={"bins":20}) plt.show()
#对角线上为单变量的直方图
此外,我们还可以使用Seaborn库中的pairplot函数来绘制散点图矩阵。
import seaborn as sns sns.pairplot(iris,hue="Species") plt.show()
#通过hue参数指定了分组的变量,这里使用鸢尾花的种类进行分组。对角线上的图形表示各个变量在不同鸢尾花类型下的分布情况;其他图形分别用不同颜色为数据点着色。根据该图可以更进一步地知道不同类型鸢尾花各变量的相关分析,以及线性、非线性的变化规律。
- 三维散点图
常用于绘制散点图的方法是使用mpl_toolkits库,该库中的mplot3d模块可以帮助我们绘制三维图形,主要使用的是Axes3D类。
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D dims = {'x':'Sepal.Length','y':'Petal.Length','z':'Petal.Width'} types = iris.Species.value_counts().index.tolist() # 绘制散点图 fig = plt.figure() ax = Axes3D(fig) for iris_type in types: tmp_data = iris[iris.Species==iris_type] x,y,z = tmp_data[dims['x']], tmp_data[dims['x']], tmp_data[dims['z']] ax.scatter(x, y, z, label=iris_type) # 绘制图例 ax.legend(loc='upper left') # 添加坐标轴(顺序是Z, Y, X) ax.set_zlabel(dims['z']) ax.set_ylabel(dims['y']) ax.set_xlabel(dims['x']) plt.show()
2.相关图
所谓相关图是基于变量间的相关系数大小,通过可视化方式反应不同变量组合间相关关系的差异的图形,可以把相关图分为相关矩阵图。相关层次图。
- 相关矩阵图
在python中绘制相关矩阵图可以使用Seaborn库的heatmap方法,用pandas.corr函数来获取相关系数矩阵。
- 相关层次图
相关层次图是通过计算变量间的距离来判断各变量是否属于同一类的方法,体现的是变量之间的相关性。此外,通过将相关系数转化为距离度量进行系统聚类,旨在分析各变量的相关关系及组合影响情况。
import pandas as pd import numpy as np mtcars = pd.read_csv("http://image.cador.cn/data/mtcars.csv") mtcars.drop(columns="_",inplace=True) # 计算第四种相异性度量 d=np.sqrt(1-mtcars.corr()*mtcars.corr()) from scipy.spatial.distance import pdist,squareform from scipy.cluster.hierarchy import linkage from scipy.cluster.hierarchy import dendrogram row_clusters = linkage(pdist(d,metric='euclidean'),method='ward') row_dendr = dendrogram(row_clusters,labels = d.index) plt.tight_layout() plt.ylabel('Euclidean distance') plt.plot([0,2000],[1.5,1.5],c='gray',linestyle='--') plt.show()
变量drat、am、gear相关性较强,cyl、disp、mpg、wt相关性较强,hp、vs、qsec、carb相关性较强。