Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何关联熊猫中的有序分类列?_Python_Pandas_Scikit Learn_Correlation_Categorical Data - Fatal编程技术网

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意味着High
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:如果你想把你的变量当作一个名义变量,你可以看看列联表,克莱默的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
和另一个变量
中的类别之间的关联。这是没有意义的。目标是找到co
A
CatColumn
A
B
B
CatColumn
之间的相关性。很抱歉,你的答案没有任何合理的信息。随机变量之间存在相关性,而不是它们的固定值。
Medium
是一个固定值,没有变化,只有零方差,因此它不能与任何变量具有协方差或相关性。它与任何变量的相关性为零。甚至尝试计算它与任何变量的相关性都没有意义。不,是的,您可以在表中看到每个类别的相关性值:)。对于类别专长,相关性不能用单个数字表示如果有几个类别,那就意味着