数据分析中的相关性分析是什么?如何解释两个变量之间的相关性?

相关性分析及如何解释变量间的相关性


一、什么是相关性分析

相关性分析是衡量两个变量之间线性或单调关系强度和方向的统计方法。它回答的核心问题是:当一个变量变化时,另一个变量是否也按某种规律变化?

核心原则:相关性 ≠ 因果性。两个变量相关不代表一个导致了另一个。


二、主要相关系数

1. Pearson 相关系数

衡量两个连续变量之间的线性关系

r = Σ((xᵢ - x̄)(yᵢ - ȳ)) / √(Σ(xᵢ - x̄)² × Σ(yᵢ - ȳ)²)
取值范围含义
r = 1完全正线性相关
0 < r < 1正线性相关,越接近 1 越强
r = 0无线性相关
-1 < r < 0负线性相关,越接近 -1 越强
r = -1完全负线性相关

前提条件:连续变量、近似正态分布、线性关系、无显著离群值

fromscipyimportstats r,p_value=stats.pearsonr(df['height'],df['weight'])print(f"Pearson r ={r:.3f}, p ={p_value:.4f}")
2. Spearman 秩相关系数

衡量两个变量之间的单调关系(不要求线性)。

ρ = 1 - 6Σdᵢ² / (n(n²-1)) (dᵢ 为每对数据的秩次差)
  • 适用于有序数据、非正态分布、存在离群值
  • 只关心排序是否一致,不关心具体数值
rho,p_value=stats.spearmanr(df['study_hours'],df['rank'])
3. Kendall τ 系数

衡量两个变量秩次的一致性比例

  • 适用于小样本、有大量并列值的数据
  • 比 Spearman 更稳健,但值通常偏小
tau,p_value=stats.kendalltau(df['var1'],df['var2'])
三种系数对比
PearsonSpearmanKendall τ
关系类型线性单调单调
数据类型连续连续/有序连续/有序
对离群值敏感较稳健最稳健
分布假设正态
适用样本量中大

三、如何解释相关性

1. 方向
方向含义示例
正相关(r > 0)一个变量增大,另一个也增大身高与体重
负相关(r < 0)一个变量增大,另一个减小温度与供暖费用
零相关(r ≈ 0)无线性/单调关系身高与电话号码
2. 强度
|r| 范围解释
≥ 0.8强相关,关系非常紧密
0.5 ~ 0.8中等相关,关系明显
0.3 ~ 0.5弱相关,关系较弱
< 0.3极弱/无相关

以上为经验参考,不同领域标准可能不同。

3. 统计显著性

即使 r 不为 0,也可能只是抽样波动导致。需通过假设检验判断:

H₀: 总体相关系数 ρ = 0(无相关) H₁: 总体相关系数 ρ ≠ 0(有相关)
  • P < 0.05:相关具有统计显著性
  • 样本量越大,较小的 r 也可能显著 → 需同时关注效应量(r 值本身)和 P 值
4. 决定系数 R²

R² = r²,表示一个变量的变异中能被另一个变量解释的比例

r = 0.8 → R² = 0.64 → 64% 的变异可被解释 r = 0.5 → R² = 0.25 → 25% 的变异可被解释 r = 0.3 → R² = 0.09 → 仅 9% 的变异可被解释

r 从 0.5 到 0.8 看似只增加了 0.3,但解释力从 25% 跃升到 64%。


四、常见误区

1. 相关 ≠ 因果
冰淇淋销量 ↑ 溺水人数 ↑ → r = 0.9 不是冰淇淋导致溺水,而是温度(混淆变量)同时影响了两者。

建立因果关系的手段:随机对照实验(RCT)、工具变量法、双重差分法、倾向得分匹配。

2. 非线性关系 → Pearson 可能接近 0
y = x² (完美二次关系) Pearson r ≈ 0 (因为不是线性关系)

对策:先画散点图观察关系形态,再选择合适的系数。

3. 离群值的影响

单个极端离群值可以大幅拉高或拉低 Pearson r。

对策:使用 Spearman / Kendall,或剔除离群值后重新计算。

4. 伪相关

两个变量可能受第三个变量驱动,或纯属巧合。

对策:控制混淆变量(偏相关分析)、验证逻辑机制、重复验证。


五、实践流程

1. 散点图观察关系形态 ├── 线性 → Pearson ├── 单调非线性 → Spearman / Kendall └── 无明显规律 → 可能无相关 2. 计算相关系数 + P 值 3. 解释 ├── 方向:正 / 负 ├── 强度:强 / 中 / 弱 ├── 显著性:P 值是否 < α └── 解释力:R² 4. 检查 ├── 离群值影响 ├── 混淆变量 └── 因果性判断
importseabornassnsimportmatplotlib.pyplotaspltfromscipyimportstats# 1. 散点图sns.scatterplot(data=df,x='x',y='y')plt.show()# 2. 计算相关系数r,p=stats.pearsonr(df['x'],df['y'])print(f"r ={r:.3f}, p ={p:.4f}, R² ={r**2:.3f}")# 3. 相关性热力图(多变量)sns.heatmap(df.corr(),annot=True,cmap='coolwarm',center=0)