1. Home
  2. プログラマーのための線形代数
  3. 統計学の基本
  4. 共分散と相関係数

共分散と相関係数

ここでは統計学の基本的ツールである共分散と相関係数について解説します。

当ページで学ぶこと

  • 共分散とは
  • 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] を取得しています。

In [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)
[1 2 3 4 5 6 7 8 9]
[9 8 7 6 5 4 3 2 1]
In [2]:
# 相関の計算
Sigma = np.cov(x,y)[0,1]
print(Sigma)
-7.5

ご覧の通りベクトル \(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] を取得しています。

In [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)
[1 2 3 4 5 6 7 8 9]
[9 8 7 6 5 4 3 2 1]
In [2]:
# 相関の計算
corr = np.corrcoef(x,y)[0,1]
print(corr)
-1.0