NumPy:相関係数を求める(corrcoef)

相関係数は、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 です。散布図を描いて関係を確認することも大切です。