大熊猫spearman相关性很奇怪?

时间:2017-01-20 21:14:52

标签: pandas correlation

这两种相关性是否可能不同?

Pandas版本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

1 个答案:

答案 0 :(得分:2)

这是预期的行为。 Spearman Correlation rank 相关性,这意味着它是对数据的排名而不是数据本身进行的。在您的示例中,数据本身可能仅在一个位置发生变化,但数据中的差异会产生不同的排名。正如评论中所建议的,Spearman相关性可能不是你真正想要使用的。

为了进一步扩展,在引擎盖下面,pandas基本上是调用scipy.stats.spearmanr来计算相关性。查看spearmanr的{​​{3}},它最终会使用source code来执行排名,然后scipy.stats.rankdata来获取相关性:

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

产生您正在观察的相同值。现在,看看每个相关计算中使用的排名:

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

请注意,ab的排名在三个位置有所不同,而cd的排名在两个位置有所不同,所以我们期待结果相关性不同。