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.
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.
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.