【问题标题】:pandas spearman correlation weird?熊猫斯皮尔曼相关性很奇怪?
【发布时间】:2017-06-05 23:04:27
【问题描述】:

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

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

【问题讨论】:

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

标签: pandas correlation


【解决方案1】:

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

为了进一步扩展,pandas 本质上是调用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 在两个位置的排名不同,因此我们预计产生的相关性会有所不同。

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2012-11-18
    相关资源
    最近更新 更多