web-dev-qa-db-ja.com

カテゴリー特徴の相関

私のデータには、継続的なものと一緒に、いくつかのカテゴリカルな特徴があります。カテゴリの機能をホットエンコードして、他の連続する生き物と一緒にラベルとの相関を見つけることは、良い考えですか、それともまったく悪い考えですか?

10
user8653080

カテゴリ変数をワンホットエンコードせずに相関係数を計算する方法があります。 Cramers V統計は、カテゴリー変数の相関を計算する1つの方法です。次のように計算できます。次のリンクが役立ちます。 パンダを使用して、クラメールの係数行列を計算します 他の連続値を持つ変数の場合、cut of pandasを使用して分類できます。

import pandas as pd
import numpy as np
import scipy.stats as ss
import seaborn as sns

tips = sns.load_dataset("tips")

tips["total_bill_cut"] = pd.cut(tips["total_bill"],
                                np.arange(0, 55, 5),
                                include_lowest=True,
                                right=False)

def cramers_v(confusion_matrix):
    """ calculate Cramers V statistic for categorial-categorial association.
        uses correction from Bergsma and Wicher,
        Journal of the Korean Statistical Society 42 (2013): 323-328
    """
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum()
    phi2 = chi2 / n
    r, k = confusion_matrix.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))

confusion_matrix = pd.crosstab(tips["day"], tips["time"]).as_matrix()
cramers_v(confusion_matrix)
# Out[10]: 0.93866193407222209

confusion_matrix = pd.crosstab(tips["total_bill_cut"], tips["time"]).as_matrix()
cramers_v(confusion_matrix)
# Out[24]: 0.16498707494988371
20
Keiku

BigQueryで同じことをしたいと思っていました。数値機能の場合は、組み込みCORR(x、y)関数を使用できます。カテゴリー特徴の場合、次のように計算できます:カーディナリティー(cat1 x cat2)/ max(cardinality(cat1)、cardinality(cat2)。これは次のSQLに変換されます:

SELECT 
COUNT(DISTINCT(CONCAT(cat1, cat2))) / GREATEST (COUNT(DISTINCT(cat1)), COUNT(DISTINCT(cat2))) as cat1_2,
COUNT(DISTINCT(CONCAT(cat1, cat3))) / GREATEST (COUNT(DISTINCT(cat1)), COUNT(DISTINCT(cat3))) as cat1_3,
....
FROM ...

数値が大きいほど、相関が低いことを意味します。

次のpythonスクリプトを使用してSQLを生成しました:

import itertools

arr = range(1,10)

query = ',\n'.join(list('COUNT(DISTINCT(CONCAT({a}, {b}))) / GREATEST (COUNT(DISTINCT({a})), COUNT(DISTINCT({b}))) as cat{a}_{b}'.format(a=a,b=b) 
  for (a,b) in itertools.combinations(arr,2)))
query = 'SELECT \n ' + query + '\n FROM  `...`;'
print (query)

Numpyで同じことをするのは簡単です。

0