我将强烈不同意其他 cmets。
他们忽略了相关的要点:随着变量 2 的增加或减少,变量 1 增加或减少了多少。因此,首先,必须在分解/编码期间保留序数变量的顺序。如果改变变量的顺序,相关性将完全改变。如果您正在构建基于树的方法,这不是问题,但对于相关性分析,必须特别注意保持序数变量中的顺序。
让我让我的论点可重现。 A 和 B 是数字,C 是下表中的序数分类,故意与问题中的略有不同。
rawText = StringIO("""
A B C
0 100.1396 1.343921 Medium
1 105.3268 1.786945 Medium
2 200.3766 9.628746 High
3 150.2400 4.225647 Medium-High
""")
myData = pd.read_csv(rawText, sep = "\s+")
注意:随着 C 从 Medium 到 Medium-High 再到 High,A 和 B 都单调增加。因此,我们应该看到元组 (C,A) 和 (C,B) 之间的强相关性。让我们重现两个建议的答案:
In[226]: myData.assign(C=myData.C.astype('category').cat.codes).corr()
Out[226]:
A B C
A 1.000000 0.986493 -0.438466
B 0.986493 1.000000 -0.579650
C -0.438466 -0.579650 1.000000
等等……什么?负相关?怎么会?有些事情肯定是不对的。那到底是怎么回事?
C 是根据其值的字母数字排序进行因式分解的。 [High, Medium, Medium-High] 被赋值为 [0, 1, 2],因此顺序改变了:0
In[227]: myData['C'] = myData['C'].astype('category')
myData['C'].cat.categories = [2,0,1]
myData['C'] = myData['C'].astype('float')
myData.corr()
Out[227]:
A B C
A 1.000000 0.986493 0.998874
B 0.986493 1.000000 0.982982
C 0.998874 0.982982 1.000000
好多了!
注意1:如果要将变量视为名义变量,可以查看列联表、Cramer's V 等;或按名义类别等对连续变量进行分组。不过,我认为这是不对的。
注意2:如果您有另一个名为“低”的类别,我的回答可能会受到批评,因为我将等距数字分配给不等距的类别。您可以提出应该将 [2, 1, 1.5, 0] 分配给 [High, Medium, Medium-High, Small] 的论点,这将是有效的。我相信这就是人们所说的数据科学的艺术部分。