相関係数は、2つの変数の間にどの程度の関連性があるかを表す指標です。NumPy では corrcoef で計算できます。
corrcoef の基本
np.corrcoef() は、相関係数行列を返します。2つの配列を渡すと、2×2 の行列が返ってきます。
import numpy as np x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 5, 4, 5]) r = np.corrcoef(x, y) print(r) # [[1. 0.77459667] # [0.77459667 1. ]]
対角成分は自分自身との相関(常に1)、非対角成分が x と y の相関係数です。x と y の相関係数を取り出すには r[0, 1] または r[1, 0] を使います。
correlation = np.corrcoef(x, y)[0, 1] print(correlation) # 0.7745966692414834
相関係数の解釈
相関係数は -1 から 1 の範囲をとります。
1 に近い(正の相関)
一方が増えると他方も増える傾向がある
0 に近い(無相関)
2つの変数の間に線形の関係がない
-1 に近い(負の相関)
一方が増えると他方が減る傾向がある
一般的な目安として、絶対値が 0.7 以上で「強い相関」、0.4〜0.7 で「中程度の相関」、0.4 未満で「弱い相関」と解釈されることが多いです。
正の相関と負の相関
# 正の相関(xが増えるとyも増える) x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 6, 8, 10]) print(np.corrcoef(x, y)[0, 1]) # 1.0(完全な正の相関) # 負の相関(xが増えるとyは減る) x = np.array([1, 2, 3, 4, 5]) y = np.array([10, 8, 6, 4, 2]) print(np.corrcoef(x, y)[0, 1]) # -1.0(完全な負の相関) # 無相関 x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 1, 4, 1, 5]) print(np.corrcoef(x, y)[0, 1]) # 0.0
複数変数の相関行列
3つ以上の変数を渡すと、すべてのペアの相関係数を含む行列が返ります。
a = np.array([1, 2, 3, 4, 5]) b = np.array([5, 4, 3, 2, 1]) c = np.array([2, 3, 4, 5, 6]) data = np.array([a, b, c]) corr_matrix = np.corrcoef(data) print(corr_matrix) # [[ 1. -1. 1.] # [-1. 1. -1.] # [ 1. -1. 1.]]
この例では、a と c は完全な正の相関(1.0)、a と b は完全な負の相関(-1.0)です。
行と列の扱い
デフォルトでは、各行を1つの変数として扱います。列を変数として扱いたい場合は rowvar=False を指定します。
# 3サンプル、2変数のデータ data = np.array([[1, 2], [2, 4], [3, 6]]) # 列を変数として扱う r = np.corrcoef(data, rowvar=False) print(r) # [[1. 1.] # [1. 1.]]
pandas のデータフレームと組み合わせるときは rowvar=False が便利です。
注意点
相関係数は「線形」の関係しか捉えられません。非線形の関係があっても相関係数は0に近くなることがあります。
x = np.array([-2, -1, 0, 1, 2]) y = x ** 2 # 放物線の関係 print(np.corrcoef(x, y)[0, 1]) # 0.0
明らかに x と y には関係がありますが、相関係数は 0 です。散布図を描いて関係を確認することも大切です。