Python 如何关联熊猫中的有序分类列?
我有一个数据帧Python 如何关联熊猫中的有序分类列?,python,pandas,scikit-learn,correlation,categorical-data,Python,Pandas,Scikit Learn,Correlation,Categorical Data,我有一个数据帧df,带有一个非数字列CatColumn A B CatColumn 0 381.1396 7.343921 Medium 1 481.3268 6.786945 Medium 2 263.3766 7.628746 High 3 177.2400 5.225647 Medium-High 我想将CatColumn与数据帧中的其他列包括在相关性分析中。我尝试了DataFrame.corr,但在相关分析中它不包括具有标称
df
,带有一个非数字列CatColumn
A B CatColumn
0 381.1396 7.343921 Medium
1 481.3268 6.786945 Medium
2 263.3766 7.628746 High
3 177.2400 5.225647 Medium-High
我想将
CatColumn
与数据帧中的其他列包括在相关性分析中。我尝试了DataFrame.corr
,但在相关分析中它不包括具有标称值的列。我将强烈地不同意其他评论
他们忽略了主要的关联点:变量1随着变量2的增加或减少而增加或减少多少。因此,首先,在因子分解/编码过程中,顺序变量的顺序必须保持不变。如果改变变量的顺序,相关性将完全改变。如果您正在构建基于树的方法,这不是问题,但对于相关性分析,必须特别注意顺序变量中的顺序保持
让我重复我的论点。在下表中,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从中到中高再到高移动时,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<1<2意味着HighIn[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:如果你想把你的变量当作一个名义变量,你可以看看列联表,克莱默的V和类似的东西;或者将连续变量按名义类别等进行分组。不过,我认为这是不对的
注2:如果您有另一个名为Low的类别,我的答案可能会受到批评,因为我将等距数字分配给等距类别。您可以提出这样的论点:应该将[2,1,1.5,0]赋值给[High,Medium,Medium-High,Small],这是有效的。我相信这就是人们所说的数据科学的艺术部分。将分类列与N个值关联的正确方法是将该列拆分为N个单独的布尔列 让我们以原始问题数据框为例。使类别列:
for i in df.CatColumn.astype('category'):
df[i] = df.CatColumn == i
然后可以计算每个类别与其他列之间的相关性:
df.corr()
输出:
A B Medium High Medium-High
A 1.000000 0.490608 0.914322 -0.312309 -0.743459
B 0.490608 1.000000 0.343620 0.548589 -0.945367
Medium 0.914322 0.343620 1.000000 -0.577350 -0.577350
High -0.312309 0.548589 -0.577350 1.000000 -0.333333
Medium-High -0.743459 -0.945367 -0.577350 -0.333333 1.000000
基本上,没有一个好的科学方法来做这件事。我将采用以下方法: 1.将数字字段拆分为n个组,其中n=分类字段的组数。
2.计算两个分类字段之间的Cramer相关性。这不是关于分类列的答案,因为分类只是转换为相应的度量值。但是如果可能的话,那么这个列就不是真正的分类列。@ei grad有两种类型的分类变量:序数和标称。Ordinal表示类别可以排序,如small/medium/high,这就是问题所在,我为什么要以数字格式排序。名词性是指没有固有顺序的类别,如我的“Note1”所暗示的男性/女性/其他。我真的不明白你的反对意见。只要实现者知道自己在做什么,分类变量(有序变量)肯定可以转换为数值。排序的可能性并不意味着你可以用任意整数值替换类别,如果你这样做的话,相关性将以错误的方式计算。@ei grad感谢你伪造了你的声明“如果可能-那么该列实际上不是分类列”,提到“订单的可能性”。至于不正确的计算,首先你需要了解软件包是如何进行的。当你调用类似于
corr(NumericVar,CategoricalVar)的东西时
,默认的处理方法是将CategoricalVar
转换为整数。如果选择该路径,必须注意我的参数。否则,其他“正确”方法是列联表和Cramer's V(在我的注释1中提到)。您的评论没有添加任何额外的信息。请仔细阅读,我之前的评论没有伪造。进一步的讨论应该转移到聊天中,但我不确定是否需要。那么您将如何回答这个问题?您能调整您的回答以实际回答OP吗?@FatihAkici我认为可以,因为它直接回答了问题问题是如何关联pandas中的分类列,但我更新了它以匹配OP中使用的数据帧。请重新阅读该问题,并查看给出的所有答案。您无法找到变量a
和另一个变量中的类别之间的关联。这是没有意义的。目标是找到coA
和CatColumn
,A
和B
和B
和CatColumn
之间的相关性。很抱歉,你的答案没有任何合理的信息。随机变量之间存在相关性,而不是它们的固定值。Medium
是一个固定值,没有变化,只有零方差,因此它不能与任何变量具有协方差或相关性。它与任何变量的相关性为零。甚至尝试计算它与任何变量的相关性都没有意义。不,是的,您可以在表中看到每个类别的相关性值:)。对于类别专长,相关性不能用单个数字表示如果有几个类别,那就意味着