如何求pandas中相关系数的p值
皮尔逊相关系数可用于衡量两个变量之间的线性关联。
该相关系数始终取-1和1之间的值,其中:
- -1 :两个变量之间完全负线性相关。
- 0 :两个变量之间没有线性相关。
- 1:两个变量之间完全正线性相关。
要确定相关系数是否具有统计显着性,您可以计算相应的 t 分数和 p 值。
相关系数 (r) 的 t 分数计算公式为:
t = r√ n-2 / √ 1-r 2
p 值计算为具有 n-2 自由度的 t 分布的相应双尾 p 值。
要计算 pandas 中 Pearson 相关系数的 p 值,您可以使用SciPy库中的pearsonr()函数:
from scipy. stats import pearsonr pearsonr(df[' column1 '], df[' column2 '])
此函数将返回列1和2之间的皮尔逊相关系数以及相应的 p 值,该值告诉我们相关系数是否具有统计显着性。
如果要计算 DataFrame 中每个可能的成对列组合的 Pearson 相关系数的 p 值,您可以使用以下自定义函数来执行此操作:
def r_pvalues(df):
cols = pd. DataFrame (columns= df.columns )
p = cols. transpose (). join (cols, how=' outer ')
for r in df. columns :
for c in df. columns :
tmp = df[df[r]. notnull () & df[c]. notnull ()]
p[r][c] = round(pearsonr(tmp[r], tmp[c])[1], 4)
return p
以下示例展示了如何在实践中使用以下 pandas DataFrame 计算相关系数的 p 值:
import pandas as pd
#createDataFrame
df = pd. DataFrame ({' x ': [4, 5, 5, 7, 8, 10, 12, 13, 14, 15],
' y ': [10, 12, 14, 18, np.nan, 19, 13, 20, 14, np.nan],
' z ': [20, 24, 24, 23, 19, 15, 18, 14, 10, 12]})
#view DataFrame
print (df)
X Y Z
0 4 10.0 20
1 5 12.0 24
2 5 14.0 24
3 7 18.0 23
4 8 NaN 19
5 10 19.0 15
6 12 13.0 18
7 13 20.0 14
8 14 14.0 10
9 15 NaN 12
示例 1:计算 Pandas 中两列之间的相关系数的 P 值
以下代码显示如何计算 DataFrame 的x和y列的 Pearson 相关系数和相应的 p 值:
from scipy. stats import pearsonr
#drop all rows with NaN values
df_new = df. dropna ()
#calculation correlation coefficient and p-value between x and y
pearsonr(df_new[' x '], df_new[' y '])
PearsonRResult(statistic=0.4791621985883838, pvalue=0.22961622926360523)
从结果我们可以看出:
- 皮尔逊相关系数为0.4792 。
- 相应的 p 值为0.2296 。
由于相关系数为正,这表明两个变量之间存在正线性关系。
然而,由于相关系数的 p 值不小于 0.05,因此相关性在统计上不显着。
请注意,我们还可以使用以下语法从相关系数中提取 p 值:
#extract p-value of correlation coefficient
pearsonr(df_new[' x '], df_new[' y '])[1]
0.22961622926360523
相关系数的 p 值为0.2296 。
这与先前输出的 p 值相匹配。
示例2:计算Pandas中所有列之间的相关系数的P值
以下代码显示了如何计算 pandas DataFrame 中每个成对列组合的 Pearson 相关系数和相应的 p 值:
#create function to calculate p-values for each pairwise correlation coefficient
def r_pvalues(df):
cols = pd. DataFrame (columns= df.columns )
p = cols. transpose (). join (cols, how=' outer ')
for r in df. columns :
for c in df. columns :
tmp = df[df[r]. notnull () & df[c]. notnull ()]
p[r][c] = round(pearsonr(tmp[r], tmp[c])[1], 4)
return p
#use custom function to calculate p-values
r_pvalues(df)
X Y Z
x 0.0 0.2296 0.0005
y 0.2296 0.0 0.4238
z 0.0005 0.4238 0.0
从结果我们可以看出:
- x 和 y 之间的相关系数的 p 值为0.2296 。
- x 和 z 之间的相关系数的 p 值为0.0005 。
- y 和 z 之间的相关系数的 p 值为0.4238 。
请注意,我们在自定义函数中将 p 值四舍五入到小数点后四位。
请随意将函数最后一行中的4替换为不同的数字,以四舍五入到不同的小数位数。
注意:您可以在此处找到 SciPy pearsonr()函数的完整文档。
其他资源
以下教程解释了如何执行其他常见的 panda 任务: