web-dev-qa-db-fra.com

Comment corréler la colonne catégorique dans les pandas?

J'ai un DataFrame df avec une colonne non numérique CatColumn.

   A         B         CatColumn
0  381.1396  7.343921  Medium
1  481.3268  6.786945  Medium
2  263.3766  7.628746  High
3  177.2400  5.225647  Medium-High

Je souhaite inclure CatColumn dans l'analyse de corrélation avec d'autres colonnes du cadre de données. J'ai essayé DataFrame.corr mais cela n'inclut pas les colonnes avec des valeurs nominales dans l'analyse de corrélation.

7
yousraHazem

Je vais fortement être en désaccord avec les autres commentaires.

Ils manquent le principal point de corrélation: dans quelle mesure la variable 1 augmente ou diminue lorsque la variable 2 augmente ou diminue. Donc, en tout premier lieu, l'ordre de la variable ordinale doit être préservé pendant la factorisation/encodage. Si vous modifiez l'ordre des variables, la corrélation changera complètement. Si vous construisez une méthode arborescente, il ne s'agit pas d'un problème, mais pour une analyse de corrélation, une attention particulière doit être accordée à la préservation de l'ordre dans une variable ordinale.

Permettez-moi de reproduire mon argument. A et B sont numériques, C est catégorique ordinale dans le tableau suivant, ce qui est intentionnellement légèrement modifié par rapport à celui de la question.

rawText = StringIO("""
 A         B         C
0  100.1396  1.343921  Medium
1  105.3268  1.786945  Medium
2  200.3766  9.628746  High
3  150.2400  4.225647  Medium-High
""")
myData = pd.read_csv(rawText, sep = "\s+")

Remarque: lorsque C passe de moyen à moyen-élevé à élevé, A et B augmentent tous les deux de façon monotone. Nous devrions donc voir de fortes corrélations entre les tuples (C, A) et (C, B). Reproduisons les deux réponses proposées:

In[226]: myData.assign(C=myData.C.astype('category').cat.codes).corr()
Out[226]: 
          A         B         C
A  1.000000  0.986493 -0.438466
B  0.986493  1.000000 -0.579650
C -0.438466 -0.579650  1.000000

Attends quoi? Corrélations négatives? Comment venir? Quelque chose ne va vraiment pas. Alors, quoi de neuf?

Ce qui se passe, c'est que C est factorisé en fonction du tri alphanumérique de ses valeurs. [Élevé, moyen, moyen-élevé] sont attribués à [0, 1, 2], donc l'ordre est modifié: 0 <1 <2 signifie élevé <moyen <moyen-élevé, ce qui n'est pas vrai. Par conséquent, nous avons accidentellement calculé la réponse de A et B lorsque C passe de Élevé à Moyen à Moyen-Élevé. La réponse correcte doit préserver l'ordre et attribuer [2, 0, 1] à [Elevé, Moyen, Moyen-élevé]. Voici comment:

In[227]: myData['C'] = myData['C'].astype('category')
myData['C'].cat.categories = [2,0,1]
myData['C'] = myData['C'].astype('float')
myData.corr()
Out[227]: 
          A         B         C
A  1.000000  0.986493  0.998874
B  0.986493  1.000000  0.982982
C  0.998874  0.982982  1.000000

Beaucoup mieux!

Remarque 1: Si vous souhaitez traiter votre variable comme une variable nominale, vous pouvez consulter des éléments tels que les tableaux de contingence, le V de Cramer, etc. ou grouper la variable continue en fonction des catégories nominales, etc. Je ne pense cependant pas que ce serait correct.

Note 2: Si vous aviez une autre catégorie appelée Faible, ma réponse pourrait être critiquée car j'ai attribué des nombres équidistants à des catégories inégalement espacées. Vous pouvez faire valoir qu'il faut assigner [2, 1, 1.5, 0] à [Elevé, Moyen, Moyen-élevé, Petit], ce qui serait valide. Je crois que c'est ce que les gens appellent la partie artistique de la science des données.

14
FatihAkici

En gros, il n’existe pas de bonne méthode scientifique pour le faire. J'utiliserais l'approche suivante: 1. Divisez le champ numérique en n groupes, où n = nombre de groupes du champ qualitatif . 2. Calculer la corrélation de Cramer entre les 2 champs catégoriels.

0
cy-press