使用 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 值和相关系数”,然后展示如何进行计算。
我想使用 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 值和相关系数”,然后展示如何进行计算。