2017-01-20 7 views
1

この2つの相関を異ならせることは可能ですか?パンダスピアマン相関奇妙?

パンダバージョン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とanaconda 4.4.1 –

+2

pandasはこれらの文字列をどうにかしてアルファベット順にランク付けする必要があります。したがって、他のチームの存在に応じて、チームの順位を変えることができます。だからパンダは「正しく」計算していますが、これはあなたが望む操作ではありません。 –

+0

私は統計学者ではありませんが、2つの数列で相関を計算する必要はありませんか?何を出力として期待していますか? Pandas 0.19.2では、文字列が浮動小数点型ではないため、上のサンプルコードがクラッシュします。 – nico

答えて

1

これは正常な動作です。 Spearman Correlationランクの相関です。つまり、データ自体のランキングではなく、データのランキングで実行されます。あなたの例では、データそのものは1つの場所でしか変わらないかもしれませんが、データの違いによって異なるランキングが生成されます。コメントに示唆されているように、Spearmanの相関関係はおそらくあなたが実際に使用したいものではありません。

さらに拡大するために、パンダの下には本質的に相関を計算するためにscipy.stats.spearmanrが呼び出されています。あなたが観察している同じ値を生成する

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

spearmanrためsource codeを見ると、それは本質的な相関を得るために、その後、順位付けを実行するためにnp.corrcoefscipy.stats.rankdataを使用して終わります。さて、各相関計算に使用されるのランキングを見て:abのためのランキングは2つの場所で異なるcdのためのランキングに比べて、3箇所が異なるので、私たちが期待すること

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

お知らせ結果として得られる相関は異なる。