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}")

注意事项

  1. 数据要求‌:

    • 数据应为连续变量,且近似正态分布。
    • 需要线性关系(非线性关系可能被低估)。
    • 数据长度需一致,无 NaN 值。
  2. 结果解释‌:

    • r = 1: 完全正相关,
    • r = -1: 完全负相关,
    • r = 0: 无线性相关。
  3. 显著性检验‌:

    • 使用 SciPy 的 pearsonr 可同时获得 p 值,通常:
      • p < 0.05 表示相关性显著,
      • p > 0.05 表示相关性不显著。

 ‌处理缺失值(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值