Я пытаюсь создать тепловую карту/матрицу корреляции, используя cramers. Я нашел приведенный ниже код, чтобы помочь мне в этом, но при использовании itertools.combinations он не возвращает комбинацию с самим собой, например. 0,0 1,1 и т. д., поэтому моя матрица совершенно неверна, поскольку при сравнении столбца с самим собой диагонали должны быть равны 1, но они равны 0. Все, кроме 2, из моих 20 столбцов являются категориальными, поэтому я использую Крамеры
def cramers_corrected_stat(confusion_matrix):
""" calculate Cramers V statistic for categorical-categorical 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().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)))
cols = df.columns.to_list()
corrM = np.zeros((len(cols),len(cols)))
# there's probably a nice pandas way to do this
for col1, col2 in itertools.combinations(cols, 2):
idx1, idx2 = cols.index(col1), cols.index(col2)
corrM[idx1, idx2] = cramers_corrected_stat(pd.crosstab(df[col1], df[col2]))
corrM[idx2, idx1] = corrM[idx1, idx2]
Как это исправить?
Я написал что-то, что делает именно это: github.com/shakedzy/дайтон.
Ищите associations
под nominal
.