python:如何计算皮尔森相关系数
在 Python 中,可以使用 NumPy、SciPy 或 Pandas 库快速计算皮尔森相关系数(Pearson correlation coefficient)。
以下是具体方法:
方法 1:使用 NumPy
# -*- coding: utf-8 -*-
""" numpy 计算皮尔森相关系数 """
import numpy as np# 示例数据
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([2, 4, 6, 8, 10, 12, 14, 15, 16])# 计算皮尔森相关系数
r = np.corrcoef(x, y)[0, 1]
print(f"Pearson r (NumPy): {r:.3f}")
说明:
np.corrcoef(x, y)
返回一个 2x2 矩阵,其中:[0, 0]
是 x 与 x 的相关系数(恒为 1),[1, 1]
是 y 与 y 的相关系数(恒为 1),[0, 1]
和[1, 0]
是 x 与 y 的相关系数。
运行 python test_pearson_1.py
Pearson r (NumPy): 0.9950
方法 2:使用 SciPy
# -*- coding: utf-8 -*-
""" scipy 计算皮尔森相关系数 """
import numpy as np
from scipy.stats import pearsonr# 示例数据
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([2, 4, 6, 8, 10, 12, 14, 15, 16])# 计算皮尔森相关系数及 p 值
r, p_value = pearsonr(x, y)
print(f"Pearson r (SciPy): {r:.4f}, p-value: {p_value:.4f}")
说明:
pearsonr(x, y)
返回两个值:r
: 相关系数,p_value
: 显著性检验的 p 值(用于判断相关性是否显著)。
运行 python test_pearson_2.py
Pearson r (SciPy): 0.9950, p-value: 0.0000
方法 3:使用 Pandas(适用于 DataFrame 数据)
# -*- coding: utf-8 -*-
""" pandas 计算皮尔森相关系数 """
import numpy as np
import pandas as pd# 示例数据
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([2, 4, 6, 8, 10, 12, 14, 15, 16])# 创建 DataFrame
data = pd.DataFrame({"X": x, "Y": y})# 计算相关系数矩阵
corr_matrix = data.corr()
print("相关系数矩阵:\n", corr_matrix)
D:\python> python test_pearson_3.py
相关系数矩阵:X Y
X 1.000000 0.995029
Y 0.995029 1.000000
说明:
data.corr()
默认计算所有数值列之间的皮尔森相关系数矩阵。- 若只需两列的相关系数,可直接提取:
r = data["X"].corr(data["Y"])
方法 4:手动计算(理解原理)
# -*- coding: utf-8 -*-
""" numpy 计算皮尔森相关系数 """
import numpy as np# 示例数据
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([2, 4, 6, 8, 10, 12, 14, 15, 16])# 手动计算(验证公式)
mean_x = np.mean(x)
mean_y = np.mean(y)covariance = np.sum((x - mean_x) * (y - mean_y))
std_x = np.sqrt(np.sum((x - mean_x)**2))
std_y = np.sqrt(np.sum((y - mean_y)**2))r_manual = covariance / (std_x * std_y)
print(f"Manual Pearson r: {r_manual:.4f}")
注意事项
-
数据要求:
- 数据应为连续变量,且近似正态分布。
- 需要线性关系(非线性关系可能被低估)。
- 数据长度需一致,无
NaN
值。
-
结果解释:
r = 1
: 完全正相关,r = -1
: 完全负相关,r = 0
: 无线性相关。
-
显著性检验:
- 使用 SciPy 的
pearsonr
可同时获得 p 值,通常:p < 0.05
表示相关性显著,p > 0.05
表示相关性不显著。
- 使用 SciPy 的
处理缺失值(Pandas 示例)
# -*- coding: utf-8 -*-
""" 处理缺失值,计算皮尔森相关系数 """
import numpy as np
import pandas as pd# 含缺失值的数据
data = pd.DataFrame({"X": [1, 2, None, 4,5,6], "Y": [2, None, 6, 8,10,11]})# 删除缺失值后计算相关系数
r = data["X"].corr(data["Y"], method="pearson", min_periods=1)
print(r)
运行 python test_pearson_5.py
0.9952267030562387