【问题标题】:Calculate correlation for discrete-like values from two columns of DataFrame in Pandas计算 Pandas 中两列 DataFrame 的离散值的相关性
【发布时间】:2017-02-12 13:31:48
【问题描述】:

这里是sn-p的代码:

df = pd.DataFrame(data=[1,1,2,2,3,3,3], columns =list('A'))

def m(x):
    if x == 1:
        return 2
    if x == 2:
        return 3
    if x == 3:
        return 1
    return -1
df['B'] = df['A'].map(m)
print df.head(n=10)

   A  B
0  1  2
1  1  2
2  2  3
3  2  3
4  3  1
5  3  1
6  3  1

正如我们所见,B 列是通过从 A 列映射值创建的,因此它们应该具有值 1 的相关性,但我从下面得到的结果并不令人满意。谁能给我一些关于如何计算两列离散数据相关性的想法?非常感谢!

df['A'].cov(df['B'])
-0.47619047619047611
df['A'].corr(df['B'], method='spearman')
-0.68000000000000016
df['A'].corr(df['B'], method='kendall')
-0.50000000000000011
df['A'].corr(df['B'])
-0.58823529411764708

【问题讨论】:

  • “因此它们应该具有值 1 的相关性”:您的假设是错误的。
  • 你能说得更具体些吗?如果两列有A->B、B->C和C->A的对应关系,你不觉得这两列之间有关联吗? @lanS
  • 有,但不是 1。虽然我不是最好的解释者。我想你在这里问你的问题会更好:stats.stackexchange.com
  • Correlation 是线性关系。你定义的不是线性的。
  • 附言。如果您的映射是 x -> x+1,则相关性将为 1。

标签: python pandas dataframe statistics correlation


【解决方案1】:

第 5 行中的值向相反方向移动,这就是您得到 -0.58823529411764708 相关性的原因。您可以看到在 A 列中,第 4 个值是 2,然后第 5 个值是 3,因此您的系列在此列中增加。相反,在 B 列中,第 4 个值为 3,然后第 5 个值为 1,因此您的系列正在减少。你的计算没有问题。如果您计算到第 4 行的相关性,您将得到相关系数 = 1,因为两列中的值移动到相同的方向。

你可以在这篇文章中找到一个很好的相关性解释:https://stats.stackexchange.com/questions/29713/what-is-covariance-in-plain-language

【讨论】:

  • 关键是可能存在 A->B、B->C 和 C->A 的情况,我打算挖掘相关性而不必手动更改它,因为我可以'事先看不到相关性。
  • 通过在 df[A] 中应用 map 函数,这个 if 语句:if x == 3: return 1 返回 B 列的值,该值的移动方向与我上面解释的 A 列中的值相反。对于一个脚踏实地的实际例子检查这个link
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多