Pandas 熊猫和斯皮尔曼的关系很奇怪吗?

Pandas 熊猫和斯皮尔曼的关系很奇怪吗?,pandas,correlation,Pandas,Correlation,这两种相关性是否可能不同 熊猫版本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 U

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

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

这是预期的行为。是一种等级关联,意味着它是根据数据的等级而不是数据本身执行的。在您的示例中,数据本身可能仅在一个位置不同,但数据中的差异会产生不同的排名。正如评论中所建议的,斯皮尔曼相关性可能不是您真正想要使用的

为了进一步扩展,在引擎盖下面,熊猫实际上是在调用来计算相关性。查看for
spearmanr
,它基本上是使用来执行排名,然后获得相关性:

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

python 3.5.2和anaconda 4.4.1必须以某种方式对这些字符串进行排序,因此它们按字母顺序排列。因此,根据其他团队的情况,团队的排名可能会有所不同。所以熊猫的计算是“正确的”,但这不是你想要的操作。我不是统计学家,但不需要对两个系列的数字进行关联吗?您希望输出到哪里?在Pandas 0.19.2中,上面的示例代码崩溃,因为字符串不是浮点数。对于Spearman的相关性,您需要有按顺序度量的数据。你所拥有的只是名义上的。我建议您查看标称属性的相似性度量,而不是计算相关性。