当皮尔逊相关系数不足时的斯皮尔曼相关系数
当皮尔逊相关系数不足时的斯皮尔曼相关系数
原文:
towardsdatascience.com/spearman-correlation-coefficient-for-when-pearson-isnt-enough/
并非所有变量之间的关系都是线性的,皮尔逊相关系数在关系遵循直线模式时效果最佳。
当关系不是线性的,但仍然持续朝一个方向移动时,我们使用斯皮尔曼相关系数来捕捉这种模式。
要理解斯皮尔曼相关系数,让我们考虑鱼市场数据集。
这个数据集包括每条鱼的物理属性,例如:
-
Weight – 鱼的重量(以克为单位)(这将是我们的目标变量)
-
Length1, Length2, Length3 – 各种长度测量(以厘米为单位)
-
Height – 鱼的高度(以厘米为单位)
-
Width – 鱼体的对角线宽度(以厘米为单位)
我们需要根据各种长度测量、高度和宽度来预测鱼的重量。
这是我们之前在博客中用来理解多重线性回归背后的数学的一个例子,但最初只使用了高度和宽度作为自变量,以得到斜率和截距的单独方程。
我们正在尝试拟合一个多重线性回归模型,我们有一个目标变量和五个自变量。
现在我们来计算每个自变量与目标变量之间的皮尔逊相关系数。
代码:
import pandas as pd
# Load the Fish Market dataset
df = pd.read_csv("C:/Fish.csv")
# Drop the categorical 'Species' column
if 'Species' in df.columns:
df_numeric = df.drop(columns=['Species'])
else:
df_numeric = df.copy()
# Calculate Pearson correlation between each independent variable and the target (Weight)
target = 'Weight'
pearson_corr = df_numeric.corr(method='pearson')[target].drop(target) # drop self-correlation
pearson_corr.sort_values(ascending=False)
重量与
-
Length3 是 0.923044
-
Length2 是 0.918618
-
Length1 是 0.915712
-
Width 是 0.886507
-
Height 是 0.724345
在所有变量中,高度具有最弱的皮尔逊相关系数,我们可能会认为在应用多重线性回归模型之前应该删除这个变量。
但在那之前,基于皮尔逊相关系数删除一个自变量是否正确?
不。
首先,让我们看看高度和重量之间的散点图。

图片由作者提供
从散点图中我们可以观察到,随着高度的增加,重量也增加,但关系不是线性的。
在较小的身高下,重量增加较慢。在较大的身高下,它增加较快。
这里趋势是非线性的,但仍然是单调的,因为它只朝一个方向移动。
由于皮尔逊相关系数假设直线关系(线性),因此在这里给出了较低的值。
这就是 Spearman 相关系数发挥作用的地方。
现在,让我们计算身高和体重之间的 Spearman 相关系数。
代码:
import pandas as pd
from scipy.stats import spearmanr
# Load the dataset
df = pd.read_csv("C:/Fish.csv")
# Calculate Spearman correlation coefficient between Height and Weight
spearman_corr = spearmanr(df["Height"], df["Weight"])[0]
print(f"Spearman Correlation Coefficient: {spearman_corr:.4f}")
Spearman 相关系数为 0.8586,这表明身高和体重之间存在强烈的正相关关系。
这意味着随着鱼身高的增加,体重也倾向于增加。
之前,我们得到了身高和体重之间的Pearson 相关系数为 0.72,这低估了这些变量之间的实际关系。
如果我们只根据 Pearson 相关系数选择特征并删除身高特征,我们可能会丢失一个实际上与目标有强关系的变量,从而导致预测的相关性降低。
这就是 Spearman 相关系数发挥作用的地方,因为它捕捉到了非线性但单调的趋势。
通过使用 Spearman 相关系数,我们还可以决定下一步,例如应用像对数或滞后值这样的转换,或者考虑像决策树或随机森林这样的算法,这些算法可以处理线性和非线性关系。
我们已经理解了 Spearman 相关系数的重要性,现在是我们理解其背后的数学的时候了。
Spearman 相关系数是如何计算的,以至于它即使在数据是非线性和单调的情况下也能捕捉到关系?
为了理解这一点,让我们考虑数据集的一个 10 点样本。

图片由作者提供
现在,我们在每个列中按升序排序值,然后分配排名。

图片由作者提供
现在我们已经给身高和体重都分配了排名,我们不再保持它们的排序顺序。
每个值都需要回到数据集中的原始位置,以便每条鱼的身高排名与其自己的体重排名相匹配。
我们对列进行排序只是为了分配排名。之后,我们将排名放回它们原来的顺序,然后使用这两组排名计算 Spearman 相关系数。

图片由作者提供
在这里,当我们对体重列中的值按升序排序并分配排名时,我们在排名5 和 6处遇到了平局,所以我们给这两个值分配了平均排名 5.5。
同样,我们在排名7, 8, 9, 和 10之间发现了一个平局,所以我们给所有这些分配了平均排名 8.5。
现在,我们计算Spearman 相关系数,这实际上是将 Pearson 相关系数应用于排名。
我们已经知道了计算 Pearson 相关系数的公式。
[
r = \frac{\text{Cov}(X, Y)}{s_X \cdot s_Y}
= \frac{\frac{1}{n – 1} \sum_{i=1}^{n} (X_i – \bar{X})(Y_i – \bar{Y})}
{\sqrt{\frac{1}{n – 1} \sum_{i=1}^{n} (X_i – \bar{X})²} \cdot \sqrt{\frac{1}{n – 1} \sum_{i=1}^{n} (Y_i – \bar{Y})²}}
]
[
= \frac{\sum_{i=1}^{n} (X_i – \bar{X})(Y_i – \bar{Y})}
{\sqrt{\sum_{i=1}^{n} (X_i – \bar{X})²} \cdot \sqrt{\sum_{i=1}^{n} (Y_i – \bar{Y})²}}
]
现在,Spearman 相关系数的公式是:
[
r_s =
\frac{
\sum_{i=1}^{n}
\underbrace{(R_{X_i} – \bar{R}X)}{\text{X_i 的等级偏差}}
\cdot
\underbrace{(R_{Y_i} – \bar{R}Y)}{\text{Y_i 的等级偏差}}
}{
\sqrt{
\sum_{i=1}^{n}
\underbrace{(R_{X_i} – \bar{R}X)²}{\text{X 的平方等级偏差}}
}
\cdot
\sqrt{
\sum_{i=1}^{n}
\underbrace{(R_{Y_i} – \bar{R}Y)²}{\text{Y 的平方等级偏差}}
}
}
]
[
\begin{aligned}
\text{其中:} \
R_{X_i} & = \text{变量 } X \text{ 中第 } i^\text{th} \text{ 值的等级} \
R_{Y_i} & = \text{变量 } Y \text{ 中第 } i^\text{th} \text{ 值的等级} \
\bar{R}_X & = \text{变量 } X \text{ 中所有等级的平均值} \
\bar{R}_Y & = \text{变量 } Y \text{ 中所有等级的平均值}
\end{aligned}
]
现在,让我们计算样本数据的 Spearman 相关系数。
[
步骤 1:原始数据的等级
]
[
\begin{array}{c|cccccccccc}
R_{x_i} & 3 & 1 & 2 & 5 & 8 & 4 & 7 & 9 & 10 & 6 \[2pt]
R_{y_i} & 1 & 2 & 4 & 5.5 & 8.5 & 3 & 5.5 & 8.5 & 8.5 & 8.5
\end{array}
]
[
步骤 2:Spearman 相关系数的公式(等级的 Pearson 相关系数)
]
[
\rho_s =
\frac{\sum_{i=1}^{n}\bigl(R_{x_i}-\bar{R_x}\bigr)\bigl(R_{y_i}-\bar{R_y}\bigr)}
{\sqrt{\sum_{i=1}^{n}\bigl(R_{x_i}-\bar{R_x}\bigr)²} ;
\sqrt{\sum_{i=1}^{n}\bigl(R_{y_i}-\bar{R_y}\bigr)²}},
\qquad n = 10
]
[
步骤 3:等级变量的平均值
]
[
\bar{R_x} = \frac{3+1+2+5+8+4+7+9+10+6}{10} = \frac{55}{10} = 5.5
]
[
\bar{R_y} = \frac{1+2+4+5.5+8.5+3+5.5+8.5+8.5+8.5}{10}
= \frac{55.5}{10} = 5.55
]
[
步骤 4:偏差和交叉乘积
]
[
\begin{array}{c|c|c|c}
i & R_{x_i}-\bar{R_x} & R_{y_i}-\bar{R_y} & (R_{x_i}-\bar{R_x})(R_{y_i}-\bar{R_y}) \ \hline
1 & -2.5 & -4.55 & 11.38 \
2 & -4.5 & -3.55 & 15.98 \
3 & -3.5 & -1.55 & 5.43 \
4 & -0.5 & -0.05 & 0.03 \
5 & 2.5 & 2.95 & 7.38 \
6 & -1.5 & -2.55 & 3.83 \
7 & 1.5 & -0.05 & -0.08 \
8 & 3.5 & 2.95 & 10.33 \
9 & 4.5 & 2.95 & 13.28 \
10 & 0.5 & 2.95 & 1.48
\end{array}
]
[
\sum (R_{x_i}-\bar{R_x})(R_{y_i}-\bar{R_y}) = 68.0
]
[
步骤 5:每个等级变量的平方和
]
[
\sum (R_{x_i}-\bar{R_x})² = 82.5,
\qquad
\sum (R_{y_i}-\bar{R_y})² = 82.5
]
[
步骤 6:代入公式
]
[
\rho_s
= \frac{68.0}{\sqrt{(82.5)(82.5)}}
= \frac{68.0}{82.5}
= 0.824
]
[
步骤 7:解释
]
[
\rho_s = 0.824
]
( \rho_s = 0.824 ) 的值表明身高和体重之间存在强烈的正相关关系,即身高增加时,体重也倾向于增加。
这就是我们计算 Spearman 相关系数的方法。
我们还有一个计算 Spearman 相关系数的公式,但仅在没有任何等级相同时使用。
[
\rho_s = 1 – \frac{6\sum d_i²}{n(n² – 1)}
]
其中:
[
\begin{aligned}
\rho_s & : \text{Spearman 相关系数} \[4pt]
d_i & : \text{每个观测值的排名差异, } (R_{x_i} – R_{y_i}) \[4pt]
n & : \text{配对观测值的总数}
\end{aligned}
]
如果存在平局,排名差异不再代表位置之间的确切距离,我们则使用“基于排名的皮尔逊相关系数”公式来计算‘ρ’。
数据集
在本博客中使用的数据集是鱼市场数据集,其中包含在市场上销售的鱼种测量值,包括重量、高度和宽度等属性。
它在 Kaggle 上公开发布,并受Creative Commons Zero (CC0 公共领域)许可协议的约束。这意味着它可以无限制地自由使用、修改和共享,无论是用于非商业目的还是商业目的。
斯皮尔曼相关系数帮助我们理解当关系不是完全线性时,两个变量是如何一起移动的。
通过将数据转换为排名,它显示了当一个变量增加时另一个变量如何增加,捕捉任何上升或下降的模式。
当数据有异常值、不是正态分布或关系是单调但曲线时,这非常有帮助。
我希望这篇帖子能帮助你不仅看到如何计算斯皮尔曼相关系数,还能了解何时使用它以及为什么它是数据分析中的重要工具。
感谢阅读!

浙公网安备 33010602011771号