私のデータには、継続的なものと一緒に、いくつかのカテゴリカルな特徴があります。カテゴリの機能をホットエンコードして、他の連続する生き物と一緒にラベルとの相関を見つけることは、良い考えですか、それともまったく悪い考えですか?
カテゴリ変数をワンホットエンコードせずに相関係数を計算する方法があります。 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
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で同じことをするのは簡単です。