这两种相关性是否可能不同?
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
答案 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.]
请注意,a
和b
的排名在三个位置有所不同,而c
和d
的排名在两个位置有所不同,所以我们期待结果相关性不同。