多个分类变量之间的相关性 (Pandas)
Correlation among multiple categorical variables (Pandas)
我有一个由 22 个 分类变量 (无序)组成的数据集。我想在一个漂亮的 heatmap 中可视化它们的相关性。由于 Pandas 内置函数
DataFrame.corr(method='pearson', min_periods=1)
仅实现数值变量(Pearson、Kendall、Spearman)的相关系数,我必须自己汇总它以执行卡方或类似的东西,我不太确定在 一个优雅的步骤(而不是遍历所有 cat1*cat2 对)。需要明确的是,这就是我想要的结果(dataframe):
cat1 cat2 cat3
cat1| coef coef coef
cat2| coef coef coef
cat3| coef coef coef
有什么想法与 pd.pivot_table 或有相同的想法吗?
提前致谢
D.
您可以使用 pd.factorize
df.apply(lambda x : pd.factorize(x)[0]).corr(method='pearson', min_periods=1)
Out[32]:
a c d
a 1.0 1.0 1.0
c 1.0 1.0 1.0
d 1.0 1.0 1.0
数据输入
df=pd.DataFrame({'a':['a','b','c'],'c':['a','b','c'],'d':['a','b','c']})
更新
from scipy.stats import chisquare
df=df.apply(lambda x : pd.factorize(x)[0])+1
pd.DataFrame([chisquare(df[x].values,f_exp=df.values.T,axis=1)[0] for x in df])
Out[123]:
0 1 2 3
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
df=pd.DataFrame({'a':['a','d','c'],'c':['a','b','c'],'d':['a','b','c'],'e':['a','b','c']})
事实证明,我找到的唯一解决方案是遍历所有 factor*factor 对。
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((23,23)) # shape it as a matrix
chi2 = pd.DataFrame(chi2, index=df.columns.values, columns=df.columns.values) # then a df for convenience
我有一个由 22 个 分类变量 (无序)组成的数据集。我想在一个漂亮的 heatmap 中可视化它们的相关性。由于 Pandas 内置函数
DataFrame.corr(method='pearson', min_periods=1)
仅实现数值变量(Pearson、Kendall、Spearman)的相关系数,我必须自己汇总它以执行卡方或类似的东西,我不太确定在 一个优雅的步骤(而不是遍历所有 cat1*cat2 对)。需要明确的是,这就是我想要的结果(dataframe):
cat1 cat2 cat3
cat1| coef coef coef
cat2| coef coef coef
cat3| coef coef coef
有什么想法与 pd.pivot_table 或有相同的想法吗?
提前致谢 D.
您可以使用 pd.factorize
df.apply(lambda x : pd.factorize(x)[0]).corr(method='pearson', min_periods=1)
Out[32]:
a c d
a 1.0 1.0 1.0
c 1.0 1.0 1.0
d 1.0 1.0 1.0
数据输入
df=pd.DataFrame({'a':['a','b','c'],'c':['a','b','c'],'d':['a','b','c']})
更新
from scipy.stats import chisquare
df=df.apply(lambda x : pd.factorize(x)[0])+1
pd.DataFrame([chisquare(df[x].values,f_exp=df.values.T,axis=1)[0] for x in df])
Out[123]:
0 1 2 3
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
df=pd.DataFrame({'a':['a','d','c'],'c':['a','b','c'],'d':['a','b','c'],'e':['a','b','c']})
事实证明,我找到的唯一解决方案是遍历所有 factor*factor 对。
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((23,23)) # shape it as a matrix
chi2 = pd.DataFrame(chi2, index=df.columns.values, columns=df.columns.values) # then a df for convenience