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

