web-dev-qa-db-de.com

Wie korreliert man eine kategoriale Spalte in Pandas?

Ich habe einen DataFrame df mit einer nicht numerischen Spalte 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

Ich möchte CatColumn in die Korrelationsanalyse mit anderen Spalten im Dataframe aufnehmen. Ich habe DataFrame.corr ausprobiert, es werden jedoch keine Spalten mit Nennwerten in die Korrelationsanalyse einbezogen.

7
yousraHazem

Ich werde stark den anderen Kommentaren nicht zustimmen.

Sie verfehlen den Hauptkorrelationspunkt: Wie stark nimmt Variable 1 zu oder ab, wenn Variable 2 zunimmt oder abnimmt. Die Reihenfolge der ordinalen Variablen muss also während der Faktorisierung/Kodierung erhalten bleiben. Wenn Sie die Reihenfolge der Variablen ändern, ändert sich die Korrelation vollständig. Wenn Sie eine baumbasierte Methode erstellen, ist dies kein Problem. Bei einer Korrelationsanalyse muss jedoch besonders auf die Erhaltung der Reihenfolge in einer ordinalen Variablen geachtet werden.

Lassen Sie mich mein Argument reproduzierbar machen. A und B sind numerisch, C ist ordinal kategorisch in der folgenden Tabelle, die absichtlich etwas anders ist als in der Frage.

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+")

Hinweis: Wenn sich C von Mittel nach Mittel-Hoch nach Hoch bewegt, steigen sowohl A als auch B monoton. Daher sollten starke Korrelationen zwischen den Tupeln (C, A) und (C, B) auftreten. Lassen Sie uns die zwei vorgeschlagenen Antworten reproduzieren:

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

Warte was? Negative Zusammenhänge? Woher? Etwas stimmt definitiv nicht. Also, was ist los?

Was passiert, ist, dass C gemäß der alphanumerischen Sortierung seiner Werte faktorisiert wird. [High, Medium, Medium-High] wird [0, 1, 2] zugewiesen, daher wird die Reihenfolge geändert: 0 <1 <2 impliziert High <Medium <Medium-High, was nicht stimmt. Daher haben wir aus Versehen die Antwort von A und B berechnet, da C von hoch nach mittel bis mittelhoch geht. Die richtige Antwort muss die Reihenfolge beibehalten und [2, 0, 1] [High, Medium, Medium-High] zuweisen. Hier ist, wie:

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

Viel besser!

Hinweis1: Wenn Sie Ihre Variable als Nominalvariable behandeln möchten, können Sie sich beispielsweise Kontingenztabellen, Cramers V und dergleichen ansehen. oder gruppiere die stetige Variable nach den nominalen Kategorien usw. Ich denke jedoch nicht, dass es richtig wäre.

Hinweis2: Wenn Sie eine andere Kategorie mit dem Namen "Niedrig" hatten, könnte meine Antwort kritisiert werden, da ich den Kategorien mit ungleichem Abstand gleich große Zahlen zugewiesen habe. Sie könnten das Argument machen, dass man [2, 1, 1.5, 0] [Hoch, Mittel, Mittel-Hoch, Klein] zuweisen sollte, was gültig wäre. Ich glaube, das nennen die Leute den künstlerischen Teil der Datenwissenschaft.

14
FatihAkici

Grundsätzlich gibt es keinen guten wissenschaftlichen Weg. Ich würde den folgenden Ansatz verwenden: 1. Teilen Sie das numerische Feld in n Gruppen auf, wobei n die Anzahl der Gruppen des kategorialen Feldes ist . 2. Berechnen Sie die Cramer-Korrelation zwischen den 2 kategorialen Feldern.

0
cy-press