ここでは統計学の基本的ツールである共分散と相関係数について解説します。
当ページで学ぶこと
- 共分散とは
- Pythonで共分散を求める
- 相関係数とは
- Pythonで相関係数を求める
共分散とは
確率論において、共分散は 2 つの確率変数の同時確率の指標です。2 つの変数がどのように変化するのかを示します。これは以下のように書き表されます。\(X\) と \(Y\) は確率変数です。
\[cov(X,Y)\]
共分散は次の式で求められます。
\[\begin{eqnarray}
cov(X,Y)=E[(X-E[X]) \times (Y-E[Y])]
\end{eqnarray}\]
\(X\) と \(Y\) の期待値がわかっている場合は、共分散は以下の式で求められます。
\[\begin{eqnarray}
cov(X,Y)=\dfrac{1}{n} \times \sum (x-E[X]) \times (y-E[Y])
\end{eqnarray}\]
統計学では、標本から共分散を求めるにはバイアス補正を行います。
\[\begin{eqnarray}
cov(X,Y)=\dfrac{1}{n-1} \times \sum (x-E[X]) \times (y-E[Y])
\end{eqnarray}\]
共分散の値は、2 つの変数が同じ方向に変化するときは正の値になり、反対方向に変化するときは負の値になります。共分散の値の大きさの解釈は簡単ではありません。ただし 0 のときは 2 つの変数は完全に独立していることを示しています。
Pythonで共分散を求める
NumPy には共分散を直接求める関数はありません。代わりに共分散行列を求める cov()
関数 があります。これで作成した共分散行列から共分散を取得することができます。デフォルトでは cov()
関数はバイアス補正後の値を求めます。
以下のコードは、値が上昇するものと下降するものの2 つのベクトルを作成して共分散行列を求めています。そして共分散行列のインデックス [0, 1]
を取得しています。
import numpy as np
# ベクトルを作成
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,6,5,4,3,2,1])
print(x)
print(y)
# 相関の計算
Sigma = np.cov(x,y)[0,1]
print(Sigma)
ご覧の通りベクトル \(x\) と \(y\) は逆の相関があることがわかります。
相関係数
共分散は、\(X\) と \(Y\) の標準偏差の積で割ることで、-1 から 1 の間に収まるように正規化することができます。この計算結果が、俗に言う「相関関係(ピアソンの相関係数)」です。
\[
r
=
\dfrac
{cov(X,Y)}
{s_X \times s_Y}
\]
\(r\) は \(X\) と \(Y\) の相関係数であり、\(cov(X,Y)\) は \(X\) と \(Y\) の標本共分散であり、\(s_X\) と \(s_Y\) は \(X\) と \(Y\) の標準偏差です。
Pythonで相関係数を求める
NumPy では corrcoef()
関数で 2 つの変数の間の相関係数を直接求めることができます。この関数は cov()
関数と同じように相関行列を返します。以下のコードでは、その中のインデックス [0,1]
を取得しています。
import numpy as np
# ベクトルを作成
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,6,5,4,3,2,1])
print(x)
print(y)
# 相関の計算
corr = np.corrcoef(x,y)[0,1]
print(corr)