1.基本原理
1.1 核心定义
皮尔森相关系数(简称PCC)用于量化两个连续变量 XXX 和 YYY 之间的线性相关程度 ,取值范围为 [−1,1][-1, 1][−1,1]:
- r=1r=1r=1:完全正线性相关(X增大,Y成比例增大);
- r=0r=0r=0:无线性相关(但可能存在非线性相关);
- r=−1r=-1r=−1:完全负线性相关(X增大,Y成比例减小)。
1.2 几何意义
皮尔森相关系数等价于两个变量向量在n维空间中的夹角余弦值 :
rXY=cosθ r_{XY} = \cos\theta rXY=cosθ
其中θ\thetaθ是向量(X1,X2,...,Xn)(X_1,X_2,...,X_n)(X1,X2,...,Xn)和(Y1,Y2,...,Yn)(Y_1,Y_2,...,Y_n)(Y1,Y2,...,Yn)的夹角:
- θ=0°\theta=0°θ=0° → cosθ=1\cos\theta=1cosθ=1(完全正相关);
- θ=90°\theta=90°θ=90° → cosθ=0\cos\theta=0cosθ=0(无线性相关);
- θ=180°\theta=180°θ=180° → cosθ=−1\cos\theta=-1cosθ=−1(完全负相关)。
1.3 关键统计特性
- 对称性 :rXY=rYXr_{XY} = r_{YX}rXY=rYX;
- 取值范围 :−1≤rXY≤1-1 \leq r_{XY} \leq 1−1≤rXY≤1;
- 量纲无关性:对X/Y做线性变换(如X→aX+b),PCC不变(仅符号可能随a的正负变化);
- 线性相关专属:仅衡量线性关系,无法捕捉非线性关系(如X和Y是二次函数关系时,PCC可能为0);
- 对异常值敏感:极端值会显著扭曲协方差和标准差,导致PCC失真。
2.数学公式
形式1:基于协方差和标准差(最易理解)
rXY=Cov(X,Y)σX⋅σY r_{XY} = \frac{\text{Cov}(X,Y)}{\sigma_X \cdot \sigma_Y} rXY=σX⋅σYCov(X,Y)
其中:
- Cov(X,Y)=1n−1∑i=1n(Xi−Xˉ)(Yi−Yˉ)\text{Cov}(X,Y) = \frac{1}{n-1}\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y})Cov(X,Y)=n−11∑i=1n(Xi−Xˉ)(Yi−Yˉ):X和Y的协方差(衡量两变量的协同变化程度);
- σX=1n−1∑i=1n(Xi−Xˉ)2\sigma_X = \sqrt{\frac{1}{n-1}\sum_{i=1}^n (X_i - \bar{X})^2}σX=n−11∑i=1n(Xi−Xˉ)2 :X的样本标准差;
- Xˉ、Yˉ\bar{X}、\bar{Y}Xˉ、Yˉ:X和Y的样本均值;
- nnn:样本数量(分母用n−1n-1n−1是为了无偏估计)。
形式2:标准化后的均值乘积(计算更高效)
皮尔森相关系数的定义是:
rXY=Cov(X,Y)σX⋅σY r_{XY} = \frac{\text{Cov}(X,Y)}{\sigma_X \cdot \sigma_Y} rXY=σX⋅σYCov(X,Y)
其中,协方差 Cov(X,Y)\text{Cov}(X,Y)Cov(X,Y) 的计算公式是:
Cov(X,Y)=1n−1∑i=1n(Xi−Xˉ)(Yi−Yˉ) \text{Cov}(X,Y) = \frac{1}{n-1}\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y}) Cov(X,Y)=n−11i=1∑n(Xi−Xˉ)(Yi−Yˉ)
引入标准化变换
为了消除量纲影响,我们对 XXX 和 YYY 进行Z-score标准化:
- ZX=Xi−XˉσXZ_X = \frac{X_i - \bar{X}}{\sigma_X}ZX=σXXi−Xˉ
- ZY=Yi−YˉσYZ_Y = \frac{Y_i - \bar{Y}}{\sigma_Y}ZY=σYYi−Yˉ
现在,我们将这个标准化过程代入到协方差公式中:
Cov(X,Y)=1n−1∑i=1n(σX⋅ZXi)⋅(σY⋅ZYi) \text{Cov}(X,Y) = \frac{1}{n-1}\sum_{i=1}^n \left(\sigma_X \cdot Z_{X_i}\right) \cdot \left(\sigma_Y \cdot Z_{Y_i}\right) Cov(X,Y)=n−11i=1∑n(σX⋅ZXi)⋅(σY⋅ZYi)
代入并化简
将化简后的协方差公式重新代入皮尔森相关系数的定义:
rXY=1n−1∑i=1nσXσYZXiZYiσXσY r_{XY} = \frac{\frac{1}{n-1}\sum_{i=1}^n \sigma_X \sigma_Y Z_{X_i} Z_{Y_i}}{\sigma_X \sigma_Y} rXY=σXσYn−11∑i=1nσXσYZXiZYi
分子和分母中的 σXσY\sigma_X \sigma_YσXσY 可以约去,得到:
rXY=1n−1∑i=1nZXiZYi r_{XY} = \frac{1}{n-1}\sum_{i=1}^n Z_{X_i} Z_{Y_i} rXY=n−11i=1∑nZXiZYi
将X和Y分别标准化(Z-score)为 ZX=Xi−XˉσXZ_X = \frac{X_i - \bar{X}}{\sigma_X}ZX=σXXi−Xˉ、ZY=Yi−YˉσYZ_Y = \frac{Y_i - \bar{Y}}{\sigma_Y}ZY=σYYi−Yˉ,则:
rXY=1n−1∑i=1nZXi⋅ZYi r_{XY} = \frac{1}{n-1}\sum_{i=1}^n Z_{X_i} \cdot Z_{Y_i} rXY=n−11i=1∑nZXi⋅ZYi
这个形式更直观:皮尔森相关系数是两个变量标准化后的乘积均值,标准化消除了量纲影响,因此PCC是无量纲的指标。
3.优缺点适用场景
| 特点 | 说明 |
|---|---|
| ✅ 核心优点 | 直观易解释 :PCC取值范围[-1,1],数值大小直接反映线性相关强度: 0.81.0:极强正相关;<br>  0.60.8:强正相关; 0.40.6:中等正相关;<br>  0.20.4:弱正相关; 0~0.2:极弱正相关/无相关; 负数区间同理(负相关)。 量纲无关性 :标准化过程消除了量纲影响, 计算高效 :核心逻辑仅涉及均值、方差、协方差计算,底层向量化实现后,百万级样本可毫秒级完成。 统计意义明确 :配套的显著性检验(p值)可判断相关是否"真实存在",而非随机误差,适合学术研究和严谨建模。 |
| ❌ 主要缺点 | 仅衡量线性关系 :皮尔森相关系数无法捕捉非线性关系 对异常值极度敏感 :极端值会严重扭曲协方差和标准差,导致PCC失真 依赖正态分布假设 :皮尔森相关系数的显著性检验基于"变量服从正态分布"的假设,若变量非正态分布,p值可能失真。 无法区分因果关系 :PCC仅衡量"相关性",无法判断"因果性": |
| 🛠️ 典型使用场景 | 皮尔森相关系数适用于两个连续变量、线性关系、无极端异常值、近似正态分布 的场景,核心应用如下: 数据分析:变量相关性筛选(最核心场景) :在建模前筛选特征,剔除高度相关的变量(多重共线性) 金融分析:资产相关性分析 :场景:计算股票A和股票B的收益率PCC,判断是否"同涨同跌" 科学研究:变量关系验证 : 质量控制:变量因果验证 : |
4.与其他距离的对比
5.框架选型
| 框架 | 核心函数/方法 | 核心特点 |
|---|---|---|
| pandas | df.corr(method='pearson')(数据框两两列PCC)、series1.corr(series2)(单对变量) |
极简易用,支持批量计算数据框所有列的相关矩阵,自动处理缺失值(默认删除) |
| NumPy | np.corrcoef(x, y)(返回相关矩阵) |
底层向量化实现,速度快,仅支持数值数组,无缺失值处理、无显著性检验 |
| SciPy | scipy.stats.pearsonr(x, y)(返回PCC+p值)、scipy.stats.correlate(序列相关) |
统计最严谨,返回p值(显著性检验),支持缺失值处理,文档完善 |
| 分场景选择最优框架: |
- 数据分析/业务落地(主流场景) :优先选
pandas- 理由:极简易用,一行代码算出所有变量的相关矩阵,自动处理缺失值,适配日常分析的"批量计算"需求。
- 统计建模/学术研究(需显著性检验) :优先选
SciPy- 理由:返回p值(判断相关是否显著),统计严谨性最高,是论文/建模中最认可的实现方式。
- 高性能计算/底层开发(无缺失值) :优先选
NumPy- 理由:底层C实现,速度最快,适合嵌入大规模数值计算流程(如深度学习预处理)。
6.使用
1. pandas(批量计算相关矩阵,数据分析首选)
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 1. 构造示例数据(房价相关变量)
data = pd.DataFrame({
"面积": [80, 90, 100, 110, 120, 130, 140],
"总价": [200, 225, 250, 275, 300, 325, 350],
"装修费用": [10, 12, 15, 18, 20, 22, 25],
"楼层": [5, 8, 10, 12, 15, 18, 20]
})
# 2. 计算皮尔森相关矩阵(一行代码)
corr_matrix = data.corr(method='pearson')
print("皮尔森相关矩阵:")
print(corr_matrix.round(3))
# 3. 可视化相关矩阵(热力图)
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title("皮尔森相关系数热力图")
plt.show()
# 4. 计算单对变量的PCC
corr_area_price = data["面积"].corr(data["总价"])
print(f"\n面积与总价的皮尔森相关系数:{corr_area_price:.3f}")
2. SciPy(统计严谨,含p值,学术研究首选)
python
import numpy as np
from scipy.stats import pearsonr
# 1. 构造数据(含少量噪声)
x = np.array([80, 90, 100, 110, 120, 130, 140])
y = np.array([200, 225, 250, 275, 300, 325, 350]) + np.random.randn(7)*2 # 加噪声
# 2. 计算皮尔森相关系数+p值(核心)
corr, p_value = pearsonr(x, y)
print(f"皮尔森相关系数:{corr:.3f}")
print(f"显著性p值:{p_value:.3f}")
# 3. 显著性判断
alpha = 0.05
if p_value < alpha:
print(f"结论:在α={alpha}水平下,相关系数显著(非随机)")
else:
print(f"结论:在α={alpha}水平下,相关系数不显著(可能是随机误差)")
# 4. 处理缺失值(示例)
x_with_nan = np.array([80, 90, np.nan, 110, 120, 130, 140])
y_with_nan = np.array([200, 225, 250, np.nan, 300, 325, 350])
# 先删除缺失值
mask = ~(np.isnan(x_with_nan) | np.isnan(y_with_nan))
corr_nan, p_nan = pearsonr(x_with_nan[mask], y_with_nan[mask])
print(f"\n处理缺失值后的PCC:{corr_nan:.3f},p值:{p_nan:.3f}")
3. NumPy(高性能,纯数值数组)
python
import numpy as np
# 1. 构造大规模数值数组(100万样本)
x = np.random.randn(1_000_000)
y = 2*x + np.random.randn(1_000_000)*0.5 # 强线性相关
# 2. 计算相关矩阵(NumPy核心函数)
corr_matrix = np.corrcoef(x, y)
# 相关矩阵的[0,1]位置是x和y的皮尔森相关系数
corr = corr_matrix[0, 1]
print(f"100万样本的皮尔森相关系数:{corr:.3f}")
# 3. 多维数组相关矩阵(示例)
data_3d = np.random.randn(3, 1000) # 3个变量,1000个样本
corr_3d = np.corrcoef(data_3d)
print(f"\n3维数组的相关矩阵:")
print(corr_3d.round(3))
4. 避坑示例:非线性关系的PCC失真
python
import numpy as np
from scipy.stats import pearsonr, spearmanr
# 构造非线性关系数据(Y=X²)
x = np.linspace(-5, 5, 100)
y = x**2
# 计算皮尔森相关系数(线性相关)
pearson_corr, pearson_p = pearsonr(x, y)
# 计算斯皮尔曼相关系数(单调关系)
spearman_corr, spearman_p = spearmanr(x, y)
print(f"皮尔森相关系数:{pearson_corr:.3f}(p值:{pearson_p:.3f})") # 接近0,失真
print(f"斯皮尔曼相关系数:{spearman_corr:.3f}(p值:{spearman_p:.3f})") # 1,正确