Pandasで相関係数のp値を求める方法


ピアソンの相関係数を使用して、2 つの変数間の線形関連を測定できます。

この相関係数は常に-1から1までの値を取ります。

  • -1 : 2 つの変数間の完全な負の線形相関。
  • 0 : 2 つの変数間に線形相関はありません。
  • 1: 2 つの変数間の完全な正の線形相関。

相関係数が統計的に有意かどうかを判断するには、対応する t スコアと p 値を計算します。

相関係数 (r) の t スコアを計算する式は次のとおりです。

t = r√ n-2 / √ 1-r 2

p 値は、自由度 n-2 の t 分布の対応する両側 p 値として計算されます。

pandas でピアソン相関係数の p 値を計算するには、 SciPyライブラリのpearsonr()関数を使用できます。

 from scipy. stats import pearsonr

pearsonr(df[' column1 '], df[' column2 '])

この関数は、列column1column2の間のピアソン相関係数を、相関係数が統計的に有意かどうかを示す対応する p 値とともに返します。

DataFrame 内の列の考えられるペアごとの組み合わせのピアソン相関係数の 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 の 2 つの列間の相関係数の P 値を計算する

次のコードは、DataFrame のx列とy列のピアソン相関係数と対応する 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です。

相関係数が正であるため、2 つの変数間に正の線形関係があることを示します。

ただし、相関係数の 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 の列のペアごとの組み合わせごとに、ピアソン相関係数と対応する 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 位に四捨五入していることに注意してください。

関数の最後の行の4 を別の数値に置き換えて、別の小数点以下の桁数に丸めることもできます。

: SciPy pearsonr()関数の完全なドキュメントはここで見つけることができます。

追加リソース

次のチュートリアルでは、他の一般的なパンダのタスクを実行する方法について説明します。

Pandasでグループごとの相関を計算する方法
パンダでスライド相関を計算する方法
パンダでスピアマンの順位相関を計算する方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です