如何求pandas中相关系数的p值


皮尔逊相关系数可用于衡量两个变量之间的线性关联。

该相关系数始终取-11之间的值,其中:

  • -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 '])

此函数将返回列12之间的皮尔逊相关系数以及相应的 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 的xy列的 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 任务:

如何在 Pandas 中按组计算相关性
如何计算pandas中的滑动相关性
如何计算 pandas 中的斯皮尔曼等级相关性

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注