计算列对之间的chi-sqaure

时间:2016-11-18 00:59:42

标签: python pandas scipy

我想计算一个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('chisqaure')

虽然这显然会失败。如果数据框是数字的,不是绝对的,我可以简单地做df.corr()并传递spearman或者皮尔逊。必须有一种计算所有列之间的chi-sqaured的方法

所以输出(使用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) 

正如我先前所述,这确实有效,但它可能会变慢并且未经过测试。大熊猫方法会更受欢迎

1 个答案:

答案 0 :(得分:0)

替代方法 1

另一种在列对之间查找卡方检验统计量以及热图可视化的方法:

def totalPays(hours,rate):
    if hours <= 40:
        pay = hours * rate

    if hours > 40:
        payot = (40 * rate) + (hours - 40) * rate * 1.5

hours = float(input("Enter hours worked: "))
rate = float(input("Enter hourly rate: "))

print(pay)

其中 def ch_calculate(df): factors_paired = [(i,j) for i in df.columns.values for j in df.columns.values] chi2, p_values =[], [] for f in factors_paired: if f[0] != f[1]: chitest = chi2_contingency(pd.crosstab(df[f[0]], df[f[1]])) chi2.append(chitest[0]) p_values.append(chitest[1]) else: # for same factor pair chi2.append(0) p_values.append(0) chi2 = np.array(chi2).reshape((len(df.columns),len(df.columns))) # shape it as a matrix chi2 = pd.DataFrame(chi2, index=df.columns.values, columns=df.columns.values) # then a df for convenience fig, ax = plt.subplots(figsize=(30,30)) sns.heatmap(chi2, annot = True) plt.show() ch_calculate(df_categorical) 是一个包含数据集所有名义输入变量的数据框,对于序数分类变量,我认为最好使用 df_categorical(spearman 等级相关系数)

使用 Cramers V 的替代方法 2

我还遇到了这个 Cramers V 实现来查找分类变量之间的关联度:Categorical features correlation 通过使用它,我创建了另一个函数来创建热图可视化以查找相关的分类列(在 Cramers V 中,您将在热图中找到从 0 到 1 的值,其中 0 表示没有关联,1 表示高度关联)

.corr(method='spearman')