如何关联大熊猫中的分类栏?

you*_*zem 16 python correlation pandas scikit-learn categorical-data

我有一个df非数字列的DataFrame 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
Run Code Online (Sandbox Code Playgroud)

我想CatColumn将相关性分析包含在Dataframe中的其他列中.我试过DataFrame.corr但它不包括相关性分析中具有名义值的列.

Fat*_*ici 22

我将强烈反对其他评论.

他们错过了主要的相关点:随着变量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+")
Run Code Online (Sandbox Code Playgroud)

注意:当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
Run Code Online (Sandbox Code Playgroud)

等等......什么?负相关?怎么会?肯定是不对的.那么发生了什么?

发生的事情是C根据其值的字母数字排序进行分解.[高,中,中 - 高]被指定为[0,1,2],因此排序被改变:0 <1 <2表示高<中<高中等,这不是真的.因此,当C从高到中高到中高时,我们意外地计算了A和B的响应.正确答案必须保留排序,并将[2,0,1]分配给[高,中,中 - 高].方法如下:

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
Run Code Online (Sandbox Code Playgroud)

好多了!

注1:如果要将变量视为名义变量,可以查看列联表,Cramer's V等等; 或者按名义类别等对连续变量进行分组.但我不认为它是正确的.

注2:如果你有另一个名为Low的类别,我的答案可能会受到批评,因为我为不等间距的类别分配了相等间隔的数字.您可以建立一个参数,即应该将[2,1,1.5,0]分配给[高,中,中,高,小],这将是有效的.我相信这就是人们所说的数据科学的艺术部分.

  • @ ei-grad类别变量有两种类型:序数和名义变量。顺序表示类别可以排序,例如小/中/高,这是问题的所在,以及为什么我要以数字格式对其进行排序。“名义”是指没有固有顺序的类别,例如我的“ Note1”所暗示的男性/女性/其他人。我不太了解您的反对意见。只要实现者知道自己在做什么,就可以将绝对变量(普通变量)“绝对”转换为数值。 (2认同)