2017-01-20 48 views
1

这两种关系有可能有所不同吗?pandas spearman相关性很奇怪吗?

大熊猫版本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

熊猫必须以某种方式排列这些字符串,因此它们按字母顺序排列。因此,根据其他球队的存在情况,球队的排名可能会有所不同。所以熊猫正在计算“正确”,但这不是你想要的操作。 –

+0

我不是统计学家,但不需要在两个数字系列上完成相关性?你期待什么作为输出?在熊猫0.19.2上面的示例代码崩溃,因为字符串不是浮动的。 – nico

回答

1

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

为了进一步扩大,在大熊猫底下的熊猫基本上呼吁scipy.stats.spearmanr来计算相关性。纵观source codespearmanr,它本质上结束了使用scipy.stats.rankdata进行排名,然后np.corrcoef得到相关:

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在两个位置不同,所以我们期望所得到的相关性会有所不同。