2017-01-20 9 views
1

Ist es möglich, dass diese beiden Korrelationen unterschiedlich sind?pandas spearman Korrelation seltsam?

Pandas Version 0.18.1

from pandas import Series 
a = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Crystal Palace'] 
b = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Man United'] 
c = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Man United'] 
d = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'West Ham'] 


Series(a).corr(Series(b), method="spearman") 
0.69999999999999996 
Series(c).corr(Series(d), method="spearman") 
0.8999999999999998 
+0

python 3.5.2 und anaconda 4.4.1 –

+2

pandas muss diese Strings irgendwie ordnen und sie werden alphabetisch geordnet. Teams können daher je nach dem, was andere Teams sind, unterschiedlich eingestuft werden. Pandas berechnet "richtig", aber das ist nicht die Operation, die Sie wollten. –

+0

Ich bin kein Statistiker, aber muss keine Korrelation in zwei Zahlenreihen durchgeführt werden? Was erwartest du als Ausgabe? In Pandas 0.19.2 stürzt der obige Beispielcode ab, da Zeichenfolgen keine Gleitkommazahlen sind. – nico

Antwort

1

Dies ist das erwartete Verhalten. Spearman Correlation ist eine Rang Korrelation, was bedeutet, dass es auf der Rangliste Ihrer Daten durchgeführt wird, nicht die Daten selbst. In Ihrem Beispiel können die Daten selbst nur an einem Ort variieren, aber die Unterschiede in den Daten ergeben unterschiedliche Rankings. Wie in den Kommentaren vorgeschlagen, ist die Spearman-Korrelation wahrscheinlich nicht das, was Sie tatsächlich verwenden möchten.

Um weiter zu expandieren, unter der Haube ruft Pandas im Wesentlichen scipy.stats.spearmanr, um die Korrelation zu berechnen. Mit Blick auf die source code für spearmanr, es endet im Wesentlichen nach oben mit scipy.stats.rankdata das Ranking durchzuführen, dann np.corrcoef die Korrelation zu erhalten:

corr1 = np.corrcoef(ss.rankdata(a), ss.rankdata(b))[1,0] 
corr2 = np.corrcoef(ss.rankdata(c), ss.rankdata(d))[1,0] 

, die die gleichen Werte erzeugen Sie beobachten. Nun schauen, auf die Rangliste in jeder Korrelationsberechnung verwendet:

ss.rankdata(a) 
[ 1. 3. 4. 5. 2.] 

ss.rankdata(b) 
[ 1. 2. 3. 5. 4.] 

ss.rankdata(c) 
[ 1. 2. 3. 5. 4.] 

ss.rankdata(d) 
[ 1. 2. 3. 4. 5.] 

Beachten Sie, dass die Rankings für a und b an drei Standorten unterscheiden sich im Vergleich zu den Rankings für c und d an zwei Standorten unterschiedlich, so dass wir erwarten würden, die resultierenden Korrelationen sind unterschiedlich.

Verwandte Themen