SciPy中Spearman秩相关系数计算与手动计算结果不符的问题排查
SciPy中Spearman秩相关系数计算与手动计算结果不符的问题排查
我正在尝试用scipy.stats.spearmanr和手动公式计算两个排名列表之间的Spearman秩相关系数:

但是我得到的结果差异很大。
两个方法的排名数据
Method 1 排名
- 用户ID: [301, 597, 414, 477, 57, 369, 206, 535, 590, 418]
- 对应排名: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Method 2 排名
- 用户ID: [301, 477, 19, 120, 75, 57, 597, 160, 577, 369]
- 对应排名: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
使用SciPy计算的代码结果
from scipy.stats import spearmanr method1 = [301, 597, 414, 477, 57, 369, 206, 535, 590, 418] method2 = [301, 477, 19, 120, 75, 57, 597, 160, 577, 369] coef, _ = spearmanr(method1, method2) print(f"Spearman coefficient: {coef}") # 输出结果 Spearman coefficient: 0.2727
手动计算过程
为了验证结果,我只针对两个列表中的共同用户进行了计算:
| 用户ID | Method 1 排名 | Method 2 排名 | d_i = R₁ - R₂ | d_i² |
|---|---|---|---|---|
| 301 | 1 | 1 | 0 | 0 |
| 597 | 2 | 7 | -5 | 25 |
| 477 | 4 | 2 | 2 | 4 |
| 57 | 5 | 6 | -1 | 1 |
| 369 | 6 | 10 | -4 | 16 |
这里只有5个共同用户,所以n=5。代入公式后我得到的Spearman系数ρ = -1.3,这明显超出了Spearman系数的取值范围[-1, 1],但scipy.stats.spearmanr给出的结果是0.2727,在合理范围内但和手动结果差异巨大。
我的疑问
- 为什么我的手动计算是错误的?是不是在处理缺失用户或者排名的方式上出了问题?
scipy.stats.spearmanr内部是如何处理缺失值或者不匹配的列表的?它只针对共同元素排名,还是会考虑所有元素?- 我的手动方法哪里错了?
scipy.stats.spearmanr内部到底是怎么处理排名的?
备注:内容来源于stack exchange,提问作者Partha Pratim Sarma
相关产品推荐
相关产品推荐

