HOWTO · Python
NumPy 相関関数
このチュートリアルでは、Python の NumPy ライブラリで `np.corrcoef()` を使い、対応する数値データのピアソン相関係数を計算する方法を説明します。
このページの内容
NumPy の np.corrcoef() 関数を使うと、対応する数値データのピアソン相関係数を計算できます。結果の非対角成分に配列間の係数が示されます。散布図を作成すれば、データの傾向を視覚的に確認できます。
NumPy での相関
相関係数は、2つの変数の関連の方向と強さを要約する値です。正の係数は、一方の値が大きくなるともう一方も大きくなる傾向を示します。負の係数は、一方が大きくなるにつれてもう一方が小さくなる傾向を示します。係数が 0 に近い場合は線形の関連が弱いことを示しますが、非線形の関係がないとは限りません。相関が示すのは関連であり、一方の変数がもう一方の変化を引き起こす証拠ではありません。
ピアソン、ケンドール、スピアマンは、それぞれ異なる関連の尺度です。np.corrcoef() が計算するのはピアソン相関です。これは共分散を各変数の標準偏差で調整し、線形の関連を表します。ケンドール相関やスピアマン相関の計算には使えません。これらの尺度には SciPy の適切な関数を使用してください。NumPy でピアソン相関を計算する関数名は np.corrcoef() です。
np.corrcoef() 関数を使って Python で相関を計算する
対応する観測値を含む2つの配列を np.corrcoef() に渡します。各位置が1組の観測値を表すよう、配列の長さをそろえてください。この関数は 2×2 の行列を返します。非対角成分は配列間のピアソン相関係数で、2つの値は等しくなります。両方の相関が定義される場合、各変数は自身と完全に相関するため、対角成分は 1 です。
次の例では、対応する値が10組の配列を使って相関係数を計算します。
import numpy as np
a = np.arange(20, 30)
b = np.array([8, 12, 29, 33, 60, 48, 21, 44, 78, 96])
x = np.corrcoef(a, b)
print(x)
出力:
[[1. 0.82449488]
[0.82449488 1. ]]
2つの非対角成分は約 0.82 で、この観測値には正の線形の関連があることを示しています。配列間の係数を読むには、どちらか一方の成分を確認します。同じ値が繰り返されるのは、相関行列が対称だからです。変数に定義可能な相関があり、変動がゼロでない場合、対角成分は 1 になります。入力が定数だと標準偏差は 0 になり、ピアソン相関は定義されません。そのため、結果に有効な係数の代わりに NaN が含まれることがあります。後続の計算に使う前にデータを確認し、そのような結果を適切に処理してください。
Matplotlib ライブラリで相関を使ってグラフを作成する
散布図では、対応する各観測値を、その (x, y) 座標に点として配置します。係数のもとになったデータを視覚的に確認でき、1つの線形な指標だけでは十分に表せない集まりや曲線状のパターンが見つかることもあります。計算した係数と合わせて確認してください。点が全体として右肩上がりでも正の相関と整合するにとどまり、グラフだけで数値を計算したり確定したりすることはできません。
次の任意の例では、相関行列を出力し、対応する観測値をプロットします。Matplotlib の pyplot インターフェースを使います。実行する前に、Python 環境へ NumPy と Matplotlib をインストールしてください。プロットを表示するウィンドウは、図を表示する環境によって異なります。
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
x = np.arange(20, 30)
y = np.array([8, 12, 29, 33, 60, 48, 21, 44, 78, 96])
print(np.corrcoef(x, y))
# %matplotlib inline
matplotlib.style.use("ggplot")
plt.scatter(x, y)
plt.show()
この例では、x が大きくなるにつれて点が全体として上昇しており、np.corrcoef() が示す正の係数と一致しています。実際のデータにはさまざまなパターンがあり得るため、関連を解釈するときは係数だけでなく、対応する値も確認してください。