非数値列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
ただし、相関分析には名目値の列は含まれません。
強く他のコメントに同意しません。
相関の主要なポイントを見逃しています。変数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]を[高、中、中高、小]に割り当てる必要があるという引数を作成できますが、これは有効です。これは人々がデータサイエンスの芸術の一部と呼ぶものだと思います。
基本的に、それを行うための科学的な方法はありません。次のアプローチを使用します。1.数値フィールドをn個のグループに分割します。ここで、nはカテゴリフィールドのグループ数です。 2. 2つのカテゴリフィールド間のCramer相関を計算します。