相关性分析与常用相关系数
Coldrain 在做 2012 年全国大学生数学建模竞赛 A 题时遇到了相关性分析,遂作此篇,以为学习。
1. 相关性的定义
相关性是两个变量线性相关的程度。从广义上讲,相关性实际上是双变量数据中两个随机变量之间的任何统计关系,无论是否因果关系。
相关性并不意味着因果关系!
例如:
- 夏季,冰淇淋的消费量会增加。冰淇淋销售额与夏天之间存在很强的相关性。在这个特殊的例子中,存在因果关系,因为极热的夏季确实推动了冰淇淋的销售。
- 冰淇淋的销售也与鲨鱼袭击有很强的相关性。我们非常清楚,鲨鱼袭击绝对不是因为冰淇淋造成的。所以,这里没有因果关系,但是他们仍然相关。
2. 相关系数
在统计学中,相关的意义是:用来衡量两个变量相对于其相互独立的距离。
在这个广义的定义下,有许多根据数据特点来衡量数据相关性而定义的系数,称作相关系数。
相关系数是对两个变量的相对运动之间关系强度的统计量度。
相关系数的值范围在 -1.0 和 1.0 之间。-1.0 的相关性表示完全的负相关,而 1.0 的相关性表示完全的正相关。0.0 的相关性表明两个变量的移动之间没有线性关系。
对于不同测量尺度的变量,有不同的相关系数可用:
- Pearson 相关系数
- Spearman 相关系数
- Kendall 相关系数
- …
上面提到的这三种相关系数各有优势和适用范围:
- Pearson 系数 适用于线性关系的测量,对数据要求较高。
- Spearman 秩相关系数 适用于单调关系的测量,对数据分布没有假设要求,并且对异常值较为稳定(即鲁棒性更高)。
- Kendall 秩相关系数适用于顺序关系的测量,同样对数据分布没有假设要求,并且对异常值较为稳定。
3. Pearson 相关系数
也就是概率论课本 [1] 上讲述的相关系数 $\rho$
Pearson相关系数是用于衡量两个变量之间线性关系强度的指标。
它计算的是两个变量的协方差与各自标准差的比值,取值范围在-1到1之间。
- 当 $\rho_{X,Y}>0$ 时,表示两个变量呈正相关
- 当 $\rho_{X,Y}<0$ 时,表示两个变量呈负相关
- 当 $\rho_{X,Y}$ 接近 0 时,表示两个变量没有线性关系。
Pearson 相关系数公式如下:
$$\rho_{X,Y} = \frac{cov(X, Y)}{\sigma_X \sigma_Y} = \frac{E((X-\mu_X)(Y-\mu_Y))}{\sigma_X \sigma_Y}$$
其中,$E$ 是数学期望,cov 表示协方差,$\sigma_X$ 和 $\sigma_Y$ 是标准差。
因为 $\mu_X = E(X)$,$\sigma^2_X = E(X^2)-E^2(X)$,同样之与 $Y$,那么上式也可以写成:
$$\rho_{X, Y} = \frac{E(XY)-E(X)E(Y)}{\sqrt{E(X^2)-E^2(X)} \sqrt{E(Y^2)-E^2{Y}}}$$
$|\rho_{X,Y}|(\le1)$ 越大,表示两个变量的线性相关程度越高。
需要注意的是,Pearson 相关系数只能测量线性关系,对于非线性关系无法准确捕捉。
利用 Python 计算 Pearson 相关系数:
from scipy.stats import pearsonr
import numpy as np
X = np.array([1, 2, 3, 4, 5, 6, 7])
Y = np.array([9, 8, 7, 6, 5, 4, 3])
# 计算 Pearson 系数
r, p = pearsonr(X, Y) # r 为系数
4. Spearman 秩相关系数
当 $X$ 和 $Y$ 具有某种单调关系时, $X$ 和 $Y$ 是完全相关的(-1 或 1)
对 Pearson 系数来说,只有当 $X$ 和 $Y$ 有完全的线性关系时,才是完全相关的(-1 或 1)
也就是说,当我们需要刻画变量之间是否具有单调关系时,我们就需要用到 Spearman 秩相关系数了。
- 单调关系
- 随着一个变量的值增加,另一个变量的值增加 or 减小。
- 不限制恒定的速率
- 线性关系
- 梯度为常数
- 增加/减少的速率是恒定的
Spearman秩相关系数的计算步骤如下:
- 对每个变量的观测值进行排序,得到每个观测值的秩次(从小到大排列)。如果有相同的观测值,则取它们的平均秩次。
- 计算每个观测值的秩次差,即第一个变量的秩次减去第二个变量的秩次。
- 计算秩次差的平方和,并除以样本大小减一(n-1)得到Spearman秩相关系数。
Spearman秩相关系数的取值范围在-1到1之间,其中1表示完全的正相关,-1表示完全的负相关,0表示无相关性。
Python 计算 Spearman 秩相关系数:
from scipy.stats import spearmanr
import numpy as np
X = np.array([1, 2, 3, 4, 5, 6, 7])
Y = np.array([9, 8, 7, 6, 5, 4, 3])
# 计算 Spearman 系数
r, p = spearmanr(X, Y) # r 为系数
5. 差异与选择
- Pearson 适用于两个变量之间的线性关系,而Spearman适用于单调关系。
- Pearson 处理变量的数据原始值,而 Spearman 处理数据排序值(需要先做变换,transform)
Pearson 相关系数只适用于线性关系且正态分布。
此外,如果散点图表明“可能是单调的,可能是线性的”关系,最好的选择是 Spearman 而不是 Pearson。即使数据证明是完全线性的,用 Spearman 也不会造成信息丢失。但是,如果不是完全线性但使用 Pearson 系数,会丢失 Spearman 可以捕获的信息,是否单调。
6. 参考资料
- [1] 石爱菊,丁秀梅,孔告化. 概率统计与随机过程. 3版. 北京:人民邮电出版社, 2024.2
- [2] https://zhuanlan.zhihu.com/p/465213120
- [3] https://zhuanlan.zhihu.com/p/664287775
- [4] 维基百科