DataFrame的.corr()方法仅返回-1或1,无法得到理想相关值
DataFrame转置后计算相关系数的异常问题解决
问题原因分析
你遇到的极端值(1/-1)和NaN问题,核心原因如下:
- 极端值(1/-1):当两个用户的非NaN重叠评分仅2个时,Pearson相关系数必然是完美相关(1或-1)——两点可拟合一条完全线性的直线,导致结果偏离预期。
- NaN值:两个用户没有任何重叠的非NaN评分(比如Angee和Karthik),无法计算相关系数,因此返回NaN。
替换NaN为0能得到“合理”值,但会严重扭曲用户的评分分布(比如将未评分的电影视为0分),不符合业务需求。
可行解决方案
1. 设置最小观测阈值
通过min_periods参数指定计算相关系数所需的最小重叠非NaN样本数,过滤掉样本量不足的组合,避免极端值:
# 要求至少3个重叠非NaN评分才计算相关系数 df.T.corr(min_periods=3)
结果中,重叠样本不足3个的用户对会返回NaN,仅保留样本量足够的可靠相关系数。
2. 用用户均值填充缺失值
相比填0,用用户自身的评分均值填充NaN,能保留用户的整体评分水平,计算出的相关系数更贴合实际:
# 按用户(行)填充NaN为该行的评分均值 df_filled = df.apply(lambda row: row.fillna(row.mean()), axis=1) # 转置后计算相关系数 corr_matrix = df_filled.T.corr()
这种方式既解决了缺失值问题,又不会引入不合理的评分偏差。
3. 改用Spearman秩相关系数
Spearman相关基于数据排序,对线性关系的依赖更低,在小样本场景下结果更稳健:
df.T.corr(method='spearman')
适合关注评分排序相关性而非绝对数值相关性的场景。
内容的提问来源于stack exchange,提问作者Anirvesh Arcot
相关产品推荐
相关产品推荐

