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 '])
この関数は、列column1とcolumn2の間のピアソン相関係数を、相関係数が統計的に有意かどうかを示す対応する 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でグループごとの相関を計算する方法
パンダでスライド相関を計算する方法
パンダでスピアマンの順位相関を計算する方法