はじめに
本記事では相関係数の計算方法を紹介します。t検定やF検定を使用した相関係数の有意性の判断方法についても解説しますので、相関係数を正しくデータ分析に利用する方法が学べる記事となっています。また相関係数にはスピアマン相関係数やケンドールのτといった計算方法もあり、幅広く相関係数について知ることができます。
Pythonで相関係数を計算する方法
NumPyを使用した相関係数の計算方法
NumPyを使用する場合、numpy.corrcoef()
関数を使用して相関係数を計算することができます。この関数は、与えられた変数の相関行列を返し、返された行列の[0, 1]の要素が相関係数です。
import numpy as np
# 2つの変数の配列を定義する
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])
# 相関係数を計算する
corr = np.corrcoef(x, y)[0, 1]
print(corr) # 出力: -1.0
この例では、xとyの配列を定義し、np.corrcoef()
関数を使用して相関係数を計算しています。
pandasを使用した相関係数の計算方法
pandasを使用する場合、pandas.DataFrame.corr()
メソッドを使用して、データフレーム内の各列の相関係数を計算することができます。このメソッドは、デフォルトではピアソン相関係数を計算しますが、他の相関係数の種類も指定することができます。
import pandas as pd
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 相関係数を計算する
corr = df['x'].corr(df['y'])
print(corr) # 出力: -1.0
この例では、pandasを使用してデータフレームを作成し、corr()
メソッドを使用してxとyの相関係数を計算しています。
Pythonで相関行列を計算する方法
相関行列とは、複数の変数の間の相関係数を行列として表したものです。Pythonでは、NumPyやpandasを使用して相関行列を計算することができます。
NumPyを使用した相関行列の計算方法
NumPyを使用する場合、numpy.corrcoef()
関数を使用して相関行列を計算することができます。この関数は、与えられた変数の相関行列を返します。
import numpy as np
# 3つの変数を含む配列を定義する
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])
z = np.array([2, 4, 6, 8, 10])
# 相関行列を計算する
corr_matrix = np.corrcoef([x, y, z])
print(corr_matrix)
この例では、x、y、zの3つの配列を定義し、np.corrcoef()
関数を使用して相関行列を計算しています。
pandasを使用した相関行列の計算方法
pandasを使用する場合、pandas.DataFrame.corr()
メソッドを使用して、データフレーム内の各列の相関係数を計算することができます。このメソッドは、デフォルトではピアソン相関係数を計算しますが、他の相関係数の種類も指定することができます。
import pandas as pd
# 3つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1], 'z': [2, 4, 6, 8, 10]})
# 相関行列を計算する
corr_matrix = df.corr()
print(corr_matrix)
この例では、pandasを使用してデータフレームを作成し、corr()
メソッドを使用してx、y、zの相関行列を計算しています。
Pythonで相関係数を計算する際の注意点
相関係数の種類
相関係数には、ピアソン相関係数の他にも、スピアマン相関係数やケンドールのτなどがあります。pandasを使用する場合、corr()
メソッドの引数で相関係数の種類を指定することができます。たとえば、スピアマン相関係数を計算する場合は、以下のように指定します。
import pandas as pd
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# スピアマン相関係数を計算する
corr = df['x'].corr(df['y'], method='spearman')
print(corr)
この例では、corr()
メソッドの引数でmethod='spearman'
と指定することで、スピアマン相関係数を計算しています。method='pearson'
と指定することで、ピアソン相関係数を計算することもできます。
欠損値の扱い
相関係数を計算する際に、データに欠損値が含まれる場合は、欠損値を含む行や列を除外するか、欠損値を補完する必要があります。
例えば、以下のようなデータフレームがあるとします。
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': [1, 2, np.nan, 4, 5], 'y': [5, 4, 3, np.nan, 1]})
このデータフレームには、x列とy列に欠損値が含まれています。この場合、欠損値を含む行や列を除外する方法は、以下のようになります。
# 欠損値を含む行を削除する
df.dropna(inplace=True)
# 相関係数を計算する
corr = df['x'].corr(df['y'])
print(corr)
この例では、dropna()
メソッドを使用して欠損値を含む行を削除し、corr()
メソッドを使用して相関係数を計算しています。
欠損値を補完する方法は、様々な方法がありますが、ここでは平均値で補完する方法を紹介します。
# 欠損値を平均値で補完する
df.fillna(df.mean(), inplace=True)
# 相関係数を計算する
corr = df['x'].corr(df['y'])
print(corr)
この例では、fillna()
メソッドを使用して欠損値を平均値で補完し、corr()
メソッドを使用して相関係数を計算しています。
計算結果のデータ形式
相関係数の計算結果は、浮動小数点数の値として返されます。計算結果を整数に変換する場合は、int()
関数を使用して変換することができます。
import pandas as pd
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 相関係数を計算する
corr = df['x'].corr(df['y'])
# 相関係数を整数に変換する
corr_int = int(corr)
print(corr_int)
この例では、相関係数を計算し、int()
関数を使用して整数に変換しています。
Pythonで相関係数の可視化方法
seabornを使用したヒートマップの描画方法
seabornを使用することで、相関行列の可視化が簡単にできます。seabornのheatmap()
関数を使用することで、ヒートマップを描画することができます。ヒートマップでは、相関係数の大きさによってセルの色が変わります。相関係数が高いほど濃い色で表され、相関係数が低いほど薄い色で表されます。
import seaborn as sns
import pandas as pd
# データフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1], 'z': [2, 4, 6, 8, 10]})
# 相関行列を計算する
corr_matrix = df.corr()
# ヒートマップを描画する
sns.heatmap(corr_matrix, cmap='coolwarm', annot=True)
この例では、seabornのheatmap()
関数を使用して、相関行列をヒートマップとして描画しています。cmap
引数で使用するカラーマップを指定することができます。annot
引数をTrueにすることで、セルに相関係数の値を表示することができます。
matplotlibを使用した散布図の描画方法
matplotlibを使用して、相関係数を可視化する方法として、散布図を描画する方法があります。散布図では、2つの変数をx軸とy軸にプロットし、相関の強さが視覚的にわかります。
import matplotlib.pyplot as plt
import pandas as pd
# データフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 散布図を描画する
plt.scatter(df['x'], df['y'])
この例では、matplotlibのscatter()
関数を使用して、2つの変数を散布図として描画しています。
Pythonで相関係数の有意性の判断方法
t検定やF検定を使用した相関係数の有意性の判断方法
相関係数の有意性を判断する方法として、t検定やF検定があります。t検定は、相関係数が0であるかどうかを検定する方法です。F検定は、2つの相関係数の差が有意に異なるかどうかを検定する方法です。
from scipy.stats import pearsonr
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 相関係数を計算する
corr, pval = pearsonr(df['x'], df['y'])
# p値を出力する
print(pval)
この例では、scipyのpearsonr()
関数を使用して、2つの変数の相関係数とp値を計算しています。pearsonr()
関数の戻り値は、相関係数とp値のタプルです。p値が0.05以下であれば、相関係数は有意と見なすことができます。t検定やF検定を使用して相関係数の有意性を判断する場合は、pearsonr()
関数の代わりに、ttest_rel()
関数やf_oneway()
関数を使用することもできます。
ttest_rel()
関数は、対応のある2つの標本に対してt検定を行う関数です。相関係数の有意性を判断する場合は、同じ対象についての2つの変数の値をペアにしてt検定を行うことができます。
from scipy.stats import ttest_rel
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# t検定を行う
t_stat, pval = ttest_rel(df['x'], df['y'])
# p値を出力する
print(pval)
この例では、scipyのttest_rel()
関数を使用して、2つの変数のt検定とp値を計算しています。p値が0.05以下であれば、相関係数は有意と見なすことができます。
f_oneway()
関数は、3つ以上の標本に対してF検定を行う関数です。相関係数の有意性を判断する場合は、2つの変数の値をグループ分けしてF検定を行うことができます。
from scipy.stats import f_oneway
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1], 'z': [2, 4, 6, 8, 10]})
# F検定を行う
f_stat, pval = f_oneway(df['x'], df['y'], df['z'])
# p値を出力する
print(pval)
この例では、scipyのf_oneway()
関数を使用して、2つの変数をグループ分けしてF検定とp値を計算しています。p値が0.05以下であれば、相関係数は有意と見なすことができます。
scipy.stats.pearsonr()関数を使用した相関係数のp値の計算方法
scipy.statsモジュールのpearsonr()
関数を使用することで、相関係数のp値を計算することができます。pearsonr()
関数は、2つの変数の相関係数とp値を計算します。
from scipy.stats import pearsonr
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 相関係数とp値を計算する
corr, pval = pearsonr(df['x'], df['y'])
# p値を出力する
print(pval)
この例では、scipy.statsモジュールのpearsonr()
関数を使用して、2つの変数の相関係数とp値を計算しています。p値は、相関係数が偶然に発生したと仮定した場合に、その相関係数以上の相関係数が得られる確率です。p値が小さいほど、相関係数が偶然に発生する可能性が低く、有意な相関があることを示します。
相関係数の信頼区間の計算方法について
相関係数の信頼区間を計算する方法はいくつかありますが、一般的にはフィッシャーのz変換を使用した信頼区間の計算方法が使用されます。
import numpy as np
from scipy.stats import norm
# 2つの変数を含むデータフレームを作成する
df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [5, 4, 3, 2, 1]})
# 相関係数を計算する
corr = df.corr().iloc[0, 1]
# 標本数を取得する
n = len(df)
# z変換した相関係数の分布の平均値を計算する
z_mean = 0.5 * np.log((1 + corr) / (1 - corr))
# z変換した相関係数の分布の標準偏差を計算する
z_std = 1 / np.sqrt(n - 3)
# 95%信頼区間を計算する
ci_low = z_mean - norm.ppf(0.975) * z_std
ci_high = z_mean + norm.ppf(0.975) * z_std
# 信頼区間を出力する
print("95% confidence interval: [{:.3f}, {:.3f}]".format(np.tanh(ci_low), np.tanh(ci_high)))
この例では、pandasのcorr()
関数を使用して、2つの変数の相関行列を計算し、その中から相関係数を取得しています。標本数を取得し、フィッシャーのz変換した相関係数の分布の平均値と標準偏差を計算しています。最後に、95%信頼区間を計算して出力しています。フィッシャーのz変換を使用することで、信頼区間が対数スケール上で対称になるため、信頼区間を逆変換する前にnp.tanh()
関数を使用して逆変換しています。
まとめ
Pythonで相関係数を扱う方法について説明しました。相関係数の計算方法や種類、可視化方法、有意性の判断方法、信頼区間の計算方法など、相関係数に関する基本的な知識を身につけることができました。Pythonを使用して相関係数を扱う際には、pandasやNumPy、scipy、seaborn、matplotlibなどのライブラリが役立ちます。
コメント