分散共分散行列と相関行列の導出

分散共分散行列と相関行列の導出
公開日 :

今回は分散共分散行列と相関行列を行列を用いて導出する方法をまとめます。変数がどんなに増えても同じ手順を行えば導出ができます。

分散共分散行列とは?

分散共分散行列は対角成分に分散を持ち、非対角成分に共分散を持つ行列のことです。3変数のデータの分散共分散行列は次のように表現できます。

Σ=(s11s12s13s21s22s23s31s32s33)\Sigma =\left( \begin{array}{ccc} s_{11}&s_{12}&s_{13}\\ s_{21}&s_{22}&s_{23}\\ s_{31}&s_{32}&s_{33}\\ \end{array} \right)

行列表記を用いて簡単に分散共分散を導出

上で示した例と同様に、3変数のデータの共分散を求めることとします。つまり、以下のようなデータです。前の添字がidを示し、後ろの添字が変数の種類を示しています。

idx1x_1x2x_2x3x_3
11x11x_{11}x12x_{12}x13x_{13}
22x21x_{21}x22x_{22}x23x_{23}
\vdots\vdots\vdots\vdots
nnxn1x_{n1}xn2x_{n2}xn3x_{n3}

次に、分散、共分散の定義は次のように偏差の積をデータ数で割ったもので、次のようになります。

分散・共分散の定義 変数をxkix_{ki}、サンプルサイズをnnとしたとき分散・共分散sijs_{ij}は次のように定義されます。

sij=1nk=0n(xkixˉi)(xkjxˉj)s_{ij} = \frac{1}{n}{\sum^n_{k=0}{(x_{ki}-\bar{x}_{i})(x_{kj}-\bar{x}_j)}}

i=ji=jならば分散となり、iji\neq{j} ならば共分散となることがわかると思います。これらを踏まえて上で示したデータの分散共分散行列を行列を用いて求めていきましょう。

観測データを行列 XX、各列の平均をサンプルサイズと同じだけ用意した行列を Xˉ\bar{X} とする。

X=(x11x12x13x21x22x23xn1xn2xn3)Xˉ=(xˉ1xˉ2xˉ3xˉ1xˉ2xˉ3xˉ1xˉ2xˉ3)\begin{align*} X = \left( \begin{array}{ccc} x_{11} & x_{12} & x_{13}\\ x_{21} & x_{22} & x_{23}\\ \vdots&\vdots&\vdots\\ x_{n1} & x_{n2} & x_{n3} \end{array} \right)\quad \bar{X} = \left( \begin{array}{ccc} \bar{x}_{1} & \bar{x}_{2} & \bar{x}_{3}\\ \bar{x}_{1} & \bar{x}_{2} & \bar{x}_{3}\\ \vdots&\vdots&\vdots\\ \bar{x}_{1} & \bar{x}_{2} & \bar{x}_{3}\\ \end{array} \right) \end{align*}

すると、偏差行列は次のように表せます。

XXˉ=(x11xˉ1x12xˉ2x13xˉ3x21xˉ1x22xˉ2x23xˉ3xn1xˉ1xn2xˉ2xn3xˉ3)X-\bar{X} = \left( \begin{array}{ccc} x_{11} - \bar{x}_{1} & x_{12} - \bar{x}_{2} & x_{13}- \bar{x}_{3}\\ x_{21} - \bar{x}_{1} & x_{22} - \bar{x}_{2} & x_{23} -\bar{x}_{3}\\ \vdots&\vdots&\vdots\\ x_{n1} - \bar{x}_{1}& x_{n2} - \bar{x}_{2} & x_{n3} - \bar{x}_{3} \end{array} \right)

これで分散共分散行列をつくる準備が整いました。分散共分散行列を Σ\Sigma とすると次のようになります。

Σ=1n(XXˉ)T(XXˉ)=(1nk=1n(xk1xˉ1)21nk=1n(xk1xˉ1)(xk2xˉ2)1nk=1n(xk1xˉ1)(xk3xˉ3)1nk=1n(xk2xˉ2)(xk1xˉ1)1nk=1n(xk2xˉ2)21nk=1n(xk2xˉ2)(xk3xˉ3)1nk=1n(xk3xˉ2)(xk1xˉ1)1nk=1n(xk3xˉ3)(xk2xˉ2)1nk=1n(xk3xˉ3)2)=(s11s12s13s21s22s23s31s32s33)\begin{align*} \Sigma & = \frac{1}{n}(X - \bar{X})^{T}(X - \bar{X})\\ & = \left( \begin{array}{ccc} \frac{1}{n}\sum^{n}_{k=1}(x_{k1} - \bar{x}_{1})^2 & \frac{1}{n}\sum^{n}_{k=1}(x_{k1} - \bar{x}_{1})(x_{k2} - \bar{x}_{2}) & \frac{1}{n}\sum^{n}_{k=1}(x_{k1} - \bar{x}_{1})(x_{k3} - \bar{x}_{3})\\ \frac{1}{n}\sum^{n}_{k=1}(x_{k2} - \bar{x}_{2})(x_{k1} - \bar{x}_{1}) & \frac{1}{n}\sum^{n}_{k=1}(x_{k2} - \bar{x}_{2})^2 & \frac{1}{n}\sum^{n}_{k=1}(x_{k2} - \bar{x}_{2})(x_{k3} - \bar{x}_{3})\\ \frac{1}{n}\sum^{n}_{k=1}(x_{k3} - \bar{x}_{2})(x_{k1} - \bar{x}_{1}) & \frac{1}{n}\sum^{n}_{k=1}(x_{k3} - \bar{x}_{3})(x_{k2} - \bar{x}_{2}) & \frac{1}{n}\sum^{n}_{k=1}(x_{k3} - \bar{x}_{3})^2\\ \end{array}\right)\\ &=\left( \begin{array}{ccc} s_{11}&s_{12}&s_{13}\\ s_{21}&s_{22}&s_{23}\\ s_{31}&s_{32}&s_{33}\\ \end{array} \right) \end{align*}

このようにして、行列表記を用いて機械的に分散共分散を計算することができます。

分散共分散行列から相関行列を導出

相関行列は各変数同士の相関を行列で表現したもののことです。また相関係数の定義は次のようになります。

相関係数の定義 ある変数 xi,xjx_i,x_j の分散を sii,sjjs_{ii}, s_{jj}、共分散を xijx_{ij} としたとき、相関行列は次のように定義されます。

r=sijsiisjjr = \frac{s_{ij}}{\sqrt{s_{ii}s_{jj}}}

このことを踏まえると、分散共分散行列から相関行列を導出できます。先ほど求めた分散共分散行列の対角成分は各変数の分散となっているので、その分散の逆数の平方根を対角成分にもつ行列AAを利用します。

A=(1s110001s220001s33)A = \left( \begin{array}{ccc} \frac{1}{\sqrt{s_{11}}}&0&0\\ 0&\frac{1}{\sqrt{s_{22}}}&0\\ 0&0&\frac{1}{\sqrt{s_{33}}} \end{array} \right)

すると、相関行列 RR は次のようになります。

R=AΣA=(1s110001s220001s33)(s11s12s13s21s22s23s31s32s33)(1s110001s220001s33)=(s11s11s11s12s11s22s13s11s33s21s22s11s22s22s22s23s22s33s31s33s11s32s33s22s33s33s33)\begin{align*} R &=A\Sigma A\\ &= \left( \begin{array}{ccc} \frac{1}{\sqrt{s_{11}}}&0&0\\ 0&\frac{1}{\sqrt{s_{22}}}&0\\ 0&0&\frac{1}{\sqrt{s_{33}}} \end{array} \right) \left( \begin{array}{ccc} s_{11}&s_{12}&s_{13}\\ s_{21}&s_{22}&s_{23}\\ s_{31}&s_{32}&s_{33}\\ \end{array} \right) \left( \begin{array}{ccc} \frac{1}{\sqrt{s_{11}}}&0&0\\ 0&\frac{1}{\sqrt{s_{22}}}&0\\ 0&0&\frac{1}{\sqrt{s_{33}}} \end{array} \right)\\ &= \left( \begin{array}{ccc} \frac{s_{11}}{\sqrt{s_{11}s_{11}}}& \frac{s_{12}}{\sqrt{s_{11}s_{22}}}& \frac{s_{13}}{\sqrt{s_{11}s_{33}}}\\ \frac{s_{21}}{\sqrt{s_{22}s_{11}}}& \frac{s_{22}}{\sqrt{s_{22}s_{22}}}& \frac{s_{23}}{\sqrt{s_{22}s_{33}}}\\ \frac{s_{31}}{\sqrt{s_{33}s_{11}}}& \frac{s_{32}}{\sqrt{s_{33}s_{22}}}& \frac{s_{33}}{\sqrt{s_{33}s_{33}}}\\ \end{array} \right) \end{align*}

このようにして、機械的に分散共分散行列と相関行列を導出できました。この方法は変数が増えても変わらないため、プログラムで関数を定義してしまえば、すぐに分散共分散行列や相関行列を計算できます。RやPython等にはすでにパッケージが用意されているため知らなくても算出できますが…笑。ただ不偏分散を用いる分散共分散行列もあるので、そうしたパラメータの指定を間違えないようにしましょう。