scipy.stats.pearsonr(x, y)用于计算两组一维数据的皮尔逊相关系数r(∈[-1,1])和双侧p值,要求x、y等长且为有限值;返回(r, p),p越小表示线性相关越显著,样本量≥500时p值更可靠。

scipy.stats.pearsonr 函数的基本用法
scipy.stats.pearsonr 是计算 Pearson 相关系数最直接的函数,它同时返回相关系数 r 和对应的双侧 p-value。注意:它只接受一维数组,且会自动忽略 NaN(但不处理 inf),长度必须严格一致。
常见错误现象:输入二维数组、含 inf 或长度不等,会直接报 ValueError: Input must be 1D 或 all-nan slice encountered。
- 确保两组数据都是
numpy.ndarray或可转为一维数组的结构(如list) - 提前用
np.isfinite()过滤掉inf和NaN,再对齐索引(不能只各自删除) - 示例:
from scipy.stats import pearsonr import numpy as np x = np.array([1.2, 2.5, np.nan, 4.1]) y = np.array([2.0, np.inf, 3.8, 4.0]) mask = np.isfinite(x) & np.isfinite(y) r, p = pearsonr(x[mask], y[mask]) # r ≈ 0.997
与 numpy.corrcoef 的结果差异在哪
numpy.corrcoef 返回的是相关系数矩阵(二维),而 scipy.stats.pearsonr 返回标量 r 和 p。数值上两者在无缺失值时完全一致,但 corrcoef 不提供统计显著性检验。
容易踩的坑:误以为 corrcoef(x, y)[0, 1] 和 pearsonr(x, y)[0] 有精度差异——其实没有;真正差异在于缺失值处理逻辑:corrcoef 默认用 np.cov 的 nan_policy='propagate',遇到 NaN 整个结果变 NaN,而 pearsonr 默认跳过 NaN(nan_policy='omit')。
- 若需保持行为一致,显式传参:
pearsonr(x, y, nan_policy='propagate') - 若用
corrcoef处理含NaN数据,必须先手动清洗,否则得不到数值结果
当样本量很小时,p 值不可靠怎么办
pearsonr 的 p-value 基于 t 分布近似,要求样本量 ≥ 4 才有定义;当 n 时,<code>p 返回 nan,且 r 虽可算出但无统计意义。
典型场景:A/B 测试初期只有 3 个用户点击数据,强行算 r=0.99 并宣称“高度相关”是危险的。
- 检查
len(x[mask]),若小于 4,应拒绝解释r的统计含义 - 不要用
pearsonr处理 n=2 的数据——此时r恒为 ±1,完全由两点决定,无泛化价值 - 小样本下更建议用可视化(如散点图)辅助判断趋势,而非依赖 p 值
多变量批量计算时的性能和内存注意点
如果要对上百对变量逐个调用 pearsonr,循环本身不慢,但反复构造中间数组、重复做有效性检查会有开销。不是瓶颈,但可优化。
性能影响主要来自:每次调用都重新检查 isfinite、复制切片数组、内部 t 检验计算。若已知数据干净,可跳过部分校验;若只需 r 不需 p,numpy.corrcoef 略快(但差别通常在毫秒级)。
- 批量场景优先用向量化清洗:
mask = np.isfinite(X) & np.isfinite(Y)一次生成,再统一索引 - 避免在循环里重复调用
pearsonr(x[i], y[i])时每次都传原始长数组加 mask —— 提前切好再传 - 极端情况(如 10⁵ 对变量),考虑用
scipy.spatial.distance.pdist配合自定义度量,但需自行实现 Pearson 公式
实际用的时候,最常被忽略的是对齐缺失值——很多人分别删掉 x 和 y 中的 NaN,导致两组数据长度一致但对应关系错乱,算出来的 r 完全失真。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











