web-dev-qa-db-fra.com

Corrélation entre plusieurs variables catégorielles (Pandas)

my original dataset

J'ai un ensemble de données composé de 22 variables catégorielles (non ordonnées). Je voudrais visualiser leur corrélation dans une carte thermique Nice . Étant donné que la fonction intégrée Pandas

DataFrame.corr(method='pearson', min_periods=1)

implémenter uniquement des coefficients de corrélation pour les variables numériques (Pearson, Kendall, Spearman), je dois l'agréger moi-même pour effectuer un chi carré ou quelque chose comme ça et je ne suis pas sûr de la fonction à utiliser pour le faire en une étape élégante (plutôt que de parcourir toutes les paires cat1 * cat2). Pour être clair, voici ce que j'aimerais finir avec (un cadre de données ):

         cat1  cat2  cat3  
  cat1|  coef  coef  coef  
  cat2|  coef  coef  coef
  cat3|  coef  coef  coef

Des idées avec pd.pivot_table ou quelque chose dans la même veine?

merci d'avance.

10
zar3bski

Vous pouvez utiliser 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

Entrée de données

df=pd.DataFrame({'a':['a','b','c'],'c':['a','b','c'],'d':['a','b','c']})

Mettre à jour

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']})
5
YO and BEN_W

Trouvé une solution agréable et propre dans ce post. Ce n'est pas une étape mais fournit ce qui est nécessaire . Poster sur la corrélation pour les variables catégorielles

2
Shashwat Tiwary

Il s'avère que la seule solution que j'ai trouvée consiste à parcourir toutes les paires de facteurs facteur *.

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
0
zar3bski