web-dev-qa-db-ja.com

パンダの順序カテゴリ列を相関させる方法は?

非数値列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

Dataframeの他の列との相関分析にCatColumnを含めたい。私は試した DataFrame.corrただし、相関分析には名目値の列は含まれません。

13
yousraHazem

強く他のコメントに同意しません。

相関の主要なポイントを見逃しています。変数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が中から中高、高に移動すると、AとBの両方が単調に増加します。したがって、タプル(C、A)と(C、B)の間に強い相関関係があるはずです。 2つの提案された答えを再現しましょう。

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 <Medium <Medium-Highを意味しますが、これは正しくありません。したがって、CがHighからMediumに、そしてMedium-Highに移行するときに、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

ずっといい!

注1:変数を名義変数として扱いたい場合は、分割表、CramerのVなどを見ることができます。または、名目上のカテゴリなどで連続変数をグループ化します。しかし、それは正しいとは思いません。

注2:低という別のカテゴリがある場合、不等間隔のカテゴリに等間隔の番号を割り当てたという事実により、私の答えは批判される可能性があります。 [2、1、1.5、0]を[高、中、中高、小]に割り当てる必要があるという引数を作成できますが、これは有効です。これは人々がデータサイエンスの芸術の一部と呼ぶものだと思います。

19
FatihAkici

基本的に、それを行うための科学的な方法はありません。次のアプローチを使用します。1.数値フィールドをn個のグループに分割します。ここで、nはカテゴリフィールドのグループ数です。 2. 2つのカテゴリフィールド間のCramer相関を計算します。

0
cy-press