Соотношение категорий
У меня есть некоторые категорические особенности в моих данных наряду с непрерывными. Является ли хорошей или абсолютно плохой идеей горячее кодирование элементов категории, чтобы найти их связь с метками вместе с другими непрерывными существами?
3 ответа
Существует способ рассчитать коэффициент корреляции без однозначного кодирования переменной категории. Крамерс V статистика является одним из методов расчета корреляции категориальных переменных. Это можно рассчитать следующим образом. Следующая ссылка полезна. Используя pandas, рассчитайте матрицу коэффициентов Крэмера. Для переменных с другими непрерывными значениями вы можете классифицировать с помощью cut
из 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
я нашел
phik
Библиотека весьма полезна при вычислении корреляции между категориальными и интервальными функциями. Это также полезно для объединения числовых функций. Попробуйте один раз: документация по phik
Я хотел сделать то же самое в BigQuery. Для числовых функций вы можете использовать встроенную функцию CORR(x,y). Для категориальных характеристик вы можете рассчитать это как: мощность (cat1 x cat2) / max (мощность (cat1), мощность (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.