我想计算 pandas 数据框中各列对之间的卡方检验统计量。似乎必须有一种方法可以以类似的方式做到这一点pandas.corr
如果我有以下数据框
df = pd.DataFrame([['a', 'x', 'a'],
['b', 'z', 'a'],
['a', 'x', 'a']],
columns=['ll', 'kk', 'jj'],
index=['nn', 'oo', 'pp'])
我希望能够做到这样的事情:
df.corr('chisquare')
尽管这显然会失败。如果数据框是数字的,而不是分类的,我可以简单地做df.corr()
并通过斯皮尔曼或皮尔逊。还必须有一种计算所有列之间的卡方的方法
所以输出(使用scipy.stats.chi2_contingency
) 将会
ll kk jj
ll 0.0000 0.1875 0.0
kk 0.1875 0.0000 0.0
jj 0.0000 0.0000 0.0
我只是错过了一些东西,或者如果不单独编码过程的每个步骤就不可能实现这一点。我正在寻找类似的东西pd.corr
但有分类数据。
编辑:
为了消除对我当前正在做什么以获得结果矩阵的任何困惑:
from itertools import combinations
def get_corr_mat(df, f=chi2_contingency):
columns = df.columns
dm = pd.DataFrame(index=columns, columns=columns)
for var1, var2 in combinations(columns, 2):
cont_table = pd.crosstab(df[var1], df[var2], margins=False)
chi2_stat = f(cont_table)[0]
dm.loc[var2, var1] = chi2_stat
dm.loc[var1, var2] = chi2_stat
dm.fillna(0, inplace=True)
return dm
get_corr_mat(df)
正如我之前所说,这确实有效,尽管它可能会变慢并且未经测试。 pandas 方法会更好