首页 > 解决方案 > 在计算 Spearmans 等级相关性(scipy)之前,我应该对我的序数变量进行编码吗?

问题描述

我正在使用 scipy.stats.spearmanr 来计算 2 个序数变量的 Spearman 等级相关性。我不确定是否对它们进行编码。我两种方式都试过了,不管怎样,这个函数似乎都会吐出结果。所以我不确定该走哪条路。

from scipy import stats

# dummy data comparing one ordinal variable with another
print(stats.spearmanr(['always','never','sometimes','always'], ['high','medium','low','low']))
>> SpearmanrResult(correlation=0.5000000000000001, pvalue=0.4999999999999999)

# encoding
print(stats.spearmanr([3,1,2,3], [3,2,1,1]))
>> SpearmanrResult(correlation=0.05555555555555556, pvalue=0.9444444444444444)

标签: scipycorrelationpearson-correlationscipy.stats

解决方案


除非数据的字母顺序与预期顺序相同,否则您应该对变量进行编码。

在内部,SciPy 正在订购您的数据以进行测试。如果是整数,它们的顺序显然等于数据的值,例如1 < 2 < 3. 如果是字符串,它们的顺序很可能是它们的字母顺序,例如a < b < c.

在您的情况下,预期的订单可能是

never < sometimes < always
low < medium < high

但是,按字母顺序对这些值列表进行排序会产生(很可能是不正确的)顺序

always < never < sometimes
high < low < medium

如果您手动将此列表编码为整数或可正确排序的字符串值,则可以更正此问题:

import scipy

# Incorrect alphabetical order
scipy.stats.spearmanr(['always','never','sometimes','always'], ['high','medium','low','low'])
# SpearmanrResult(correlation=0.5000000000000001, pvalue=0.4999999999999999)

# Incorrect integer order
scipy.stats.spearmanr([1,2,3,1], [1,3,2,2])
# SpearmanrResult(correlation=0.5000000000000001, pvalue=0.4999999999999999)

# Correct integer order
scipy.stats.spearmanr([3,1,2,3], [3,2,1,1])
# SpearmanrResult(correlation=0.05555555555555556, pvalue=0.9444444444444444)

# Correct alphabetical order
scipy.stats.spearmanr(['c','a','b','c'], ['c','b','a','a'])
# SpearmanrResult(correlation=0.05555555555555556, pvalue=0.9444444444444444)

推荐阅读