使用 python 执行变量相关

Perform correlation of variables using python

我想使用 python(相当于 R 中的 corr.test(x,y))进行相关性测试

我的输入是一个 Pandas 数据框。看起来像下面这样:

df1:

  Column1  Column2   Column3   Column4 Column5 Column6
0    ab1       bc1   6.843147     NaN     5.12   NaN
1    ab2       ab5   NaN          5.6789  6.666  54.72
2    ab3       bc4   11.45        NaN     12.765 5.12 
3    ab4       ab5   328.880123   NaN     0.50  88.44
4    ab5       ab1   72.142790    55.89   NaN   18.12

如何对数据(第 3 列 - 第 6 列)执行关联?

注:原始数据中有50多列进行关联

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html


或者一次做任何一对列(记住每一列都是一个系列)......用

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.corr.html

例如,根据您上面的数据,第 5 列和第 6 列之间的相关性为:

In [10]: df
Out[10]:
  Column1 Column2     Column3  Column4  Column5  Column6
0     ab1     bc1    6.843147      NaN    5.120      NaN
1     ab2     ab5         NaN   5.6789    6.666    54.72
2     ab3     bc4   11.450000      NaN   12.765     5.12
3     ab4     ab5  328.880123      NaN    0.500    88.44
4     ab5     ab1   72.142790  55.8900      NaN    18.12

In [11]: df.loc[:,'Column5'].corr(df.loc[:,'Column6'])
Out[11]: -0.9936504010065057

或循环遍历所有列(不是最优雅的,但这是可行的)...

In [12]: for c1 in df.columns[0:-1]:
    ...:   for c2 in df.loc[:,c1:].columns:
    ...:     if c2 != c1:
    ...:       print('Correlation',c1,c2,'=',df.loc[:,c1].corr(df.loc[:,c2]))
    ...:
...function_base.py:2551: RuntimeWarning: Degrees of freedom <= 0 for slice 
    c = cov(x, y, rowvar)
...function_base.py:2480: RuntimeWarning: divide by zero encountered in true_divide 
    c *= np.true_divide(1, fact)

Correlation Column3 Column4 = nan
Correlation Column3 Column5 = -0.779129
Correlation Column3 Column6 = 0.999368
Correlation Column4 Column5 = nan
Correlation Column4 Column6 = -1.000000
Correlation Column5 Column6 = -0.993650

对于整个相关矩阵:

In [36]: df
Out[36]:
  Column1 Column2     Column3  Column4  Column5  Column6
0     ab1     bc1    6.843147      NaN    5.120      NaN
1     ab2     ab5         NaN   5.6789    6.666    54.72
2     ab3     bc4   11.450000      NaN   12.765     5.12
3     ab4     ab5  328.880123      NaN    0.500    88.44
4     ab5     ab1   72.142790  55.8900      NaN    18.12

In [37]: df.corr()
Out[37]:
          Column3  Column4   Column5   Column6
Column3  1.000000      NaN -0.779129  0.999368
Column4       NaN      1.0       NaN -1.000000
Column5 -0.779129      NaN  1.000000 -0.993650
Column6  0.999368     -1.0 -0.993650  1.000000

注意 DataFrame.corr() 给出了 相关矩阵 ,任何两列的交集显示与循环遍历列时使用 Series.corr() 得到的相同相关性。因此,DataFrame.corr() 方法在代码方面更简单,因为您不必编写自己的循环。

P.S. 我刚刚意识到你还需要 p 值(而不仅仅是相关系数)因为 R 函数 cor.test() returns 系数和显着性。我不确定如何用 Pandas 做到这一点。我四处寻找,发现 this:在该页面的一半左右,它指出,“Pandas 没有计算 p 值的函数,因此最好使用 SciPy 来计算相关性,因为它会为您提供 p 值和相关系数”,然后展示如何进行计算。