相关性分析
相关性分析解决解决以下两个问题:
- 判断两个或多个变量之间的统计学关联;
- 如果存在关联,进一步分析关联强度和方向
双变量相关系数
Pearson相关系数
用于度量两个变量X和Y之间的相关程度(线性相关),其值介于-1与1之间,定义为两个变量的协方差除以他们的标准差之积:
计算公式
适用范围:
- 两个变量的标准差都不为零
- 两个变量之间是线性关系,都是连续数据。
- 两个变量的总体是正态分布,或接近正态的单峰分布。
- 两个变量的观测值是成对的,每对观测值之间相互独立。
注意事项:
- 积差相关系数适用于线性相关的情形,对于曲线相关等更为复杂的情形,积差相关系数的大小并不能代表相关性的强弱。
- 样本中存在的极端值对Pearson积差相关系数的影响极大,因此要慎重考虑和处理,必要时可以对其进行剔出,或者加以变量变换,以避免因为一两个数值导致出现错误的结论。
- Pearson积差相关系数要求相应的变量呈双变量正态分布,注意双变量正态分布并非简单的要求x变量和y变量各自服从正态分布,而是要求服从一个联合的双变量正态分布。 (第三条相对比较宽松,违反时系数的结果也是比较稳健的)
结果解释:
·|r|>0.95 存在显著性相关;
·|r|≥0.8 高度相关;
·0.5≤|r|<0.8 中度相关;
·0.3≤|r|<0.5 低度相关;
·|r|<0.3 关系极弱,认为不相关
Spearman秩相关系数
使利用两变量的秩次大小作线性相关分析,对原始变量的分布不做要求,属于非参数统计方法。因此它的适用范围比Pearson相关系数要广的多。即使原始数据是等级资料也可以计算Spearman相关系数。对于服从Pearson相关系数的数据也可以计算Spearman相关系数,但统计效能比Pearson相关系数要低一些(不容易检测出两者事实上存在的相关关系)。如果数据中没有重复值, 并且当两个变量完全单调相关时,斯皮尔曼相关系数则为+1或−1。Spearman相关系数即使出现异常值,由于异常值的秩次通常不会有明显的变化(比如过大或者过小,那要么排第一,要么排最后),所以对Spearman相关性系数的影响也非常小。
其定义为等级变量之间的peason相关系数:
其中,其中\(x_{\mathrm{i}},y_{\mathrm{i}}\)为原始变量\(X_{\mathrm{i}},Y_{\mathrm{i}}\)经过等级映射得到,具体映射方式可以取:每个原始数据的降序位置的平均。
记\(d_{i}=x_{i}-y_{i}\),其简化的计算公式为:
Kendall's tau-b相关系数
同样是一种秩相关系数,用于反映分类变量相关性的指标,适用于两个变量均为有序分类(有序分类表示类间有强度的逐级递增关系)的情况,用希腊字母τ(tau)表示其值。
基本思想:Kendall系数是基于协同的思想。对于X,Y的两对观察值Xi,Yi和Xj,Yj,如果Xi<Yi并且Xj<Yj,或者Xi>Yi并且Xj>Yj,则称这两对观察值是和谐的,否则就是不和谐。
计算公式
例子:
三种系数的关系和区别
- Pearson系数:叫皮尔逊相关系数,也叫线性相关系数,用于进行线性相关分析,是最常用的相关系数,当数据满足正态分布时会使用该系数。两个连续变量间呈线性相关时,使用Pearson积差相关系数。由于其是在原始数据的方差和协方差基础上计算得到,所以对离群值比较敏感。即使pearson相关系数为0,也只能说明变量之间不存在线性相关,但仍有可能存在曲线相关。
- 另外两种统计量:不满足积差相关分析的适用条件时,使用Spearman秩或者kendall相关系数来描述,他们都是更为一般性的非参数方法,对离群值的敏感度较低,因而也更具有耐受性,度量的主要是等级变量之间的联系。
- 最常使用的是Pearson相关系数;当数据不满足正态性时,则使用Spearman相关系数,Kendall相关系数用于判断数据一致性,比如裁判打分。
显著性检测
为了对计算的系数结果做一定的解释,我们可以采用假设检验的方法。
以正相关的检测为例,可以设原假设H0:X和Y相互独立,H1:X和Y正相关;并设\(\alpha\)为显著水平,因此,假设检验的拒绝域分别为:
一种统计量的构造方式
根据计算出的T落在的t分布的位置确定Pvalue后,将其与显著水平对比,如果小于则表示我们以该显著水平拒绝原假设,接受备选假设。
几个常见的显著水平的参数设置:
Python实现
取波士顿房价数据的两个特征:犯罪率和房价数据,我们来验证他们是不是负相关关系
# 复制代码
from pandas import DataFrame
import scipy
import pandas as pd
from sklearn.datasets import load_boston
boston = load_boston()
# print(boston.DESCR)
X = boston.data
Y = boston.target
y = Y[:] # 房价
x = X[:,0] # 城镇人均犯罪率
# data.head()
# data.corr()
data=DataFrame({'x':x,'y':y})
# data.corr(method='pearson')
# data.corr(method='spearman')
# data.corr(method='kendall')
scipy.stats.pearsonr(x, y)
scipy.stats.spearmanr(x, y)
scipy.stats.kendalltau(x, y)
结果表明,三种方法都显著(以显著水平为1%)地认为两者呈现负相关的关系。
同时,我们希望验证下地区的犯罪率与黑人比例是否有关系:
x = X[:,-3] # 黑人比例
y = X[:,0] # 犯罪比例
data=DataFrame({'x':x,'y':y})
scipy.stats.kendalltau(x, y)
data=DataFrame({'x':x,'y':y})
scipy.stats.pearsonr(x, y)
scipy.stats.spearmanr(x, y)
scipy.stats.kendalltau(x, y)
三个结果表明,两者可以显著地认为呈正相关关系
单变量自相关
参考文章
- 用Python如何实现“假设检验” - 知乎 (zhihu.com)
- 《2003 年北京市 SARS 疫情空间相关性分析》