You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scipy.stats.spearmanr参数选择:偏好顺序列表的正确输入探究

如何用scipy.stats.spearmanr对比偏好顺序列表?

当你想用Spearman秩相关系数评估两个偏好顺序列表的相似性时,关键是要输入每个物品对应的「排名值」,而不是物品的原始序号。这是因为Spearman系数的核心是基于变量的秩次(即排序位置)计算相关性,而偏好顺序本质是序数数据,物品的编号只是标识,不代表它们的排序权重。

为什么直接输入物品序号会出错?

比如你举的例子:Person_1的排序是[Item_1, Item_3, Item_0, Item_2],Person_2的排序是[Item_1, Item_3, Item_2, Item_0]。如果直接把物品的序号按排序顺序输入:

from scipy import stats
stats.spearmanr([1,3,0,2],[1,3,2,0])
# 输出:SpearmanrResult(correlation=0.19,pvalue=0.80)

这个结果是错误的,因为[1,3,0,2]只是物品的编号序列,不是每个物品的排名。这些编号是随机分配的,和它们的偏好顺序没有数值上的秩次关系,所以计算出来的相关性完全不能反映偏好的相似程度。

正确的输入方式:传入物品的排名列表

正确的做法是,为每个物品赋予对应的排名值(排名可以从0或1开始,不影响最终结果),然后把所有物品的排名整理成数组传入。

比如对于Person_1的排序,每个物品的排名(假设最偏好的物品排名为0):

  • Item_1 → 0(第1位)
  • Item_3 → 1(第2位)
  • Item_0 → 2(第3位)
  • Item_2 → 3(第4位)

我们把物品按编号顺序(Item_0到Item_3)整理排名,得到数组[2, 0, 3, 1];同理Person_2的排名数组是[3, 0, 2, 1]。此时计算的结果才是正确的:

from scipy import stats
stats.spearmanr([2,0,3,1],[3,0,2,1])
# 输出:SpearmanrResult(correlation=0.79, pvalue=0.20)

这个0.79的相关性符合我们的预期——两人的偏好高度相似,只有最后两个物品的顺序不同。

为什么基数变量两种输入方式结果一致?

像维基百科提到的「智商与每周看电视时长」这类基数变量,不管输入原始值还是它们的秩次,Spearman结果都相同:

# 输入原始值
stats.spearmanr([86,97,99,100,101,103,106,110,112,113],[0,20,28,27,50,29,7,17,6,12])
# 输出:SpearmanrResult(correlation=-0.17575757575757575, pvalue=0.6271883447764844)

# 输入秩次
stats.spearmanr([1,2,3,4,5,6,7,8,9,10],[1,6,8,7,10,9,3,5,2,4])
# 输出:SpearmanrResult(correlation=-0.17575757575757575, pvalue=0.6271883447764844)

这是因为scipy.stats.spearmanr内部会自动把输入的基数变量转换成秩次再计算Pearson相关。所以对于基数变量,原始值的秩次和原始值的相对顺序一致,因此两种输入方式结果相同。但对于偏好排序这类序数数据,物品的编号没有相对顺序的数值意义,必须手动转换成排名值再传入。

内容的提问来源于stack exchange,提问作者ExoFri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:09:24