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]分配给[高,中,中,高,小],这将是有效的.我相信这就是人们所说的数据科学的艺术部分.
| 归档时间: |
|
| 查看次数: |
13017 次 |
| 最近记录: |