Python相关系数导图
🎯要点
- 量化变量和特征关联
- 绘图对比皮尔逊相关系数、斯皮尔曼氏秩和肯德尔秩
- 汽车性价比相关性矩阵热图
- 大流行病与资产波动
- 城镇化模型预测交通量
- 宝可梦类别特征非线性依赖性捕捉
- 向量加权皮尔逊相关系数
- 量化图像相似性
Python皮尔逊-斯皮尔曼-肯德尔
皮尔逊相关系数
在统计学中,皮尔逊相关系数 是一种用于测量两组数据之间线性相关性的相关系数。它是两个变量的协方差与其标准差乘积的比率;因此,它本质上是协方差的标准化测量,其结果始终介于 -1 和 1 之间。与协方差本身一样,该测量只能反映变量的线性相关性,而忽略了许多其他类型的关系或相关性。举一个简单的例子,人们会期望来自小学的一组儿童的年龄和身高的皮尔逊相关系数明显大于 0,但小于 1(因为 1 表示不切实际的完美相关性)。
皮尔逊相关系数是两个变量的协方差除以其标准差的乘积。定义的形式涉及“乘积矩”,即均值调整后的随机变量乘积的均值(关于原点的一阶矩),因此名称中带有修饰词“乘积矩”。
皮尔逊相关系数应用于样本时,通常用
r
x
y
r_{x y}
rxy 表示,可称为样本相关系数或样本皮尔逊相关系数。通过将基于样本的协方差和方差的估计值代入上述公式,我们可以得到
r
x
y
r_{x y}
rxy 的公式。给定由
n
n
n 对组成的配对数据
{
(
x
1
,
y
1
)
,
…
,
(
x
n
,
y
n
)
}
\left\{\left(x_1, y_1\right), \ldots,\left(x_n, y_n\right)\right\}
{(x1,y1),…,(xn,yn)},定义
r
x
y
r_{x y}
rxy为
r
x
y
=
∑
i
=
1
n
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
r_{x y}=\frac{\sum_{i=1}^n\left(x_i-\bar{x}\right)\left(y_i-\bar{y}\right)}{\sqrt{\sum_{i=1}^n\left(x_i-\bar{x}\right)^2} \sqrt{\sum_{i=1}^n\left(y_i-\bar{y}\right)^2}}
rxy=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
要计算 Pearson’s R 相关系数,使用 scipy.stats
库中的 pearsonr 函数。
import numpy as np
from scipy.stats import pearsonr
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 4, 5, 6])
correlation_coefficient, _ = pearsonr(x, y)
print("Pearson's Correlation Coefficient:", correlation_coefficient)
这里的输出显示了完美的正相关性,其中当一个变量增加 1 时,另一个变量也增加相同的量。
Pearson's Correlation Coefficient: 1.0
绘图
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
import seaborn as sns
np.random.seed(0)
x_neg = np.linspace(0, 10, 50)
y_neg = -2 * x_neg + 10 + np.random.normal(0, 2, 50)
x_pos = np.linspace(0, 10, 50)
y_pos = 2 * x_pos + np.random.normal(0, 2, 50)
x_no_corr = np.linspace(0, 10, 50)
y_no_corr = np.random.normal(0, 2, 50)
corr_coeff_neg, _ = pearsonr(x_neg, y_neg)
corr_coeff_pos, _ = pearsonr(x_pos, y_pos)
corr_coeff_no_corr, _ = pearsonr(x_no_corr, y_no_corr)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
sns.regplot(x=x_neg, y=y_neg, ax=axes[0], color='red', scatter_kws={'s': 15}, line_kws={'color': 'blue'}, ci=95)
axes[0].set_xlabel('X')
axes[0].set_ylabel('Y')
axes[0].set_title(f"Negative Correlation (r = {corr_coeff_neg:.2f})")
sns.regplot(x=x_pos, y=y_pos, ax=axes[1], color='green', scatter_kws={'s': 15}, line_kws={'color': 'blue'}, ci=95)
axes[1].set_xlabel('X')
axes[1].set_ylabel('Y')
axes[1].set_title(f"Positive Correlation (r = {corr_coeff_pos:.2f})")
sns.regplot(x=x_no_corr, y=y_no_corr, ax=axes[2], color='blue', scatter_kws={'s': 15}, line_kws={'color': 'blue'}, ci=95)
axes[2].set_xlabel('X')
axes[2].set_ylabel('Y')
axes[2].set_title(f"No Correlation (r = {corr_coeff_no_corr:.2f})")
plt.tight_layout()
plt.show()
斯皮尔曼秩相关系数
在统计学中,斯皮尔曼等级相关系数或斯皮尔曼 ρ \rho ρ,通常用希腊字母 ρ \rho ρ (rho) 或 r s r_s rs 表示,是一个排名相关性的非参数度量(两个变量秩之间的统计依赖性)。它评估使用单调函数描述两个变量之间的关系的程度。
斯皮尔曼相关系数定义为秩变量之间的皮尔逊相关系数。对于大小为
n
n
n 的样本,
n
n
n 对原始分数
(
X
i
,
Y
i
)
\left(X_i, Y_i\right)
(Xi,Yi) 转换为秩 $R \left[X_i\right], R \left[Y_i\right] $ ,于是
r
s
r_s
rs 计算为
r
s
=
ρ
[
R
[
X
]
,
R
[
Y
]
]
=
cov
[
R
[
X
]
,
R
[
Y
]
]
σ
R
[
X
]
σ
R
[
Y
]
r_s=\rho[ R [X], R [Y]]=\frac{\operatorname{cov}[ R [X], R [Y]]}{\sigma_{ R [X]} \sigma_{ R [Y]}}
rs=ρ[R[X],R[Y]]=σR[X]σR[Y]cov[R[X],R[Y]]
要计算斯皮尔曼的秩相关性,使用 scipy.stats
库中的 Spearmanr 函数。
from scipy.stats import spearmanr
x = [10, 20, 30, 40, 50]
y = [5, 15, 25, 35, 45]
rho, p_value = spearmanr(x, y)
print(f"Spearman's Rank Correlation Coefficient: {rho}")
print(f"P-value: {p_value}")
解释 ρ \rho ρ 结果:
- 正 ρ \rho ρ:当一个变量增加时,另一个变量也会增加,
- 负 ρ \rho ρ:当一个变量增加时,另一个变量往往会减少。
- ρ \rho ρ=0:没有单调关系。
肯德尔秩相关系数
在统计学中,肯德尔秩相关系数通常称为肯德尔 τ 系数(以希腊字母 τ 命名,即 tau),是一种用于测量两个测量量之间的序数关联的统计数据。τ 检验是一种基于 τ 系数的统计依赖性非参数假设检验。它是秩相关的度量:按每个量对数据进行排序时,数据排序的相似性。
要计算肯德尔秩相关系数,使用 scipy.stats
库中的 kendalltau 函数。
import numpy as np
from scipy.stats import kendalltau
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 1, 5, 4])
tau, p_value = kendalltau(x, y)
print(f"Kendall's Tau (τ): {tau:.2f}")
print(f"P-value: {p_value:.4f}")