我想计算一个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)
正如我先前所述,这确实有效,但它可能会变慢并且未经过测试。大熊猫方法会更受欢迎
答案 0 :(得分:0)
另一种在列对之间查找卡方检验统计量以及热图可视化的方法:
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 实现来查找分类变量之间的关联度:Categorical features correlation 通过使用它,我创建了另一个函数来创建热图可视化以查找相关的分类列(在 Cramers V 中,您将在热图中找到从 0 到 1 的值,其中 0 表示没有关联,1 表示高度关联)
.corr(method='spearman')