###### tags: `統計学` `データビジュアライズ`
# 主成分分析
***
# 主成分分析の理論
***
## 主成分分析の概要
**主成分分析**(PCA: Principal component analysis)とは代表的な次元削減のアルゴリズムのことです。国語・算数・理科・社会の点数という4つの特徴を、言語力と論理的思考力という2つの特徴で表現できるように、複数の特徴からなるデータをより少ない特徴で表現しようという試みです。
データを射影したときに、その分散が最大になるような軸を**第1主成分**と呼び、第1主成分と直交する軸の中で、射影されたデータの分散が最大となる軸を**第2主成分**と呼びます。第1主成分、第2主成分と直交する軸のうち、射影されたデータの分散が最大となる軸を**第3主成分**と呼び、その後も同様に、各主成分と直交する軸の中で、データを射影したときにその分散が最大となる軸を**第\\(k\\)主成分**と呼びます。
つまり、軸を回転させることにより、データを良く説明する成分を抽出し、その成分について考察するというのが主成分分析の目的です。

このように分散の大きい順に主成分を抽出し、寄与率(各主成分の分散の総分散に対する割合)の高い順に任意の数を選択することが主成分分析の仕組みです。第2主成分までを選択すれば、4次元のデータを2次元に圧縮したことと同値です。
## 主成分分析の数理
長さ1のベクトル
$$
\boldsymbol{w} = \left(w_1, \ldots , w_p\right)^{\mathrm{T}} , \sqrt{\boldsymbol{w}^{\mathrm{T}}\boldsymbol{w}} = 1
$$
を定義します。
次に、\\(p\\)次元の変数ベクトル \\(\boldsymbol{X} = \left(X_1, \ldots , X_p\right)^{\mathrm{T}}\\) の \\(\boldsymbol{w}\\) の方向への射影
$$
Y = \boldsymbol{w^{\mathrm{T}}X} = w_1X_1 + \cdots + w_pX_p
$$
の分散を最大にする \\(\boldsymbol{w}\\) を求めます。この \\(\boldsymbol{w}\\) を第1主成分という。
\\(n\\) 個の \\(p\\) 次元データ \\(\boldsymbol{x}_1, \ldots , \boldsymbol{x}_p\\) が与えられたとき、これらのデータからなる行列を
$$
X = \begin{pmatrix}
\boldsymbol{x}_1^{\mathrm{T}} \\
\vdots \\
\boldsymbol{x}_n^{\mathrm{T}}
\end{pmatrix}
= \begin{pmatrix}
x_{11} & x_{12} & \ldots & x_{1p} \\
x_{21} & x_{22} & \ldots & x_{2p} \\
\vdots & \vdots & \ddots & \vdots \\
x_{n1} & x_{n2} & \ldots & x_{np}
\end{pmatrix}
$$
とおく。 \\(\boldsymbol{X}\\) に対する標本分散共分散行列を \\(\boldsymbol{V}\\) とすると、\\(n\\) 個のデータ \\(\left(\boldsymbol{w}^{\mathrm{T}}\boldsymbol{x}_1, \ldots, \boldsymbol{w}^{\mathrm{T}}\boldsymbol{x}_n\right)^{\mathrm{T}}\\) から求まる標本分散は、
$$
\boldsymbol{w}^{\mathrm{T}}\boldsymbol{V}\boldsymbol{w}
$$
と表される。この標本分散を最大化する \\(\boldsymbol{w}\\) が第1主成分となる。そして、第1主成分 \\(\boldsymbol{w}_1\\) と直交する軸のうちで分散を最大化する軸を第2主成分 \\(\boldsymbol{w}_2\\) とし、以下同様に第\\(k\\)主成分が求められる。
\\(\boldsymbol{V}\\) は対称行列なので、**主成分分析は固有値問題に帰着させることができる**。
つまり、 \\(\boldsymbol{V}\\) を \\(\boldsymbol{X}\\) の標本分散共分散行列としたときに、 \\(\boldsymbol{V}\\) の固有値を大きい順に \\(\lambda_1, \lambda_2, \ldots, \lambda_p\\) とし、それに対応する固有ベクトルを \\(\boldsymbol{w}_1, \boldsymbol{w}_2, \ldots, \boldsymbol{w}_p\\) とする。このとき、第 \\(k\\) 主成分は \\(\boldsymbol{w}_k\\) で与えられる。
ただし、データによっては変数ごとに単位・スケールが異なることがあるため、分散共分散行列ではなく、相関行列に対する固有値問題を解く手法が主流である。
# 主成分分析の実践
***
## テストの点数の例
データセットは統計科学研究所の『成績のデータ』です。以下のURLからダウンロードしました。
https://statistics.co.jp/reference/statistical_data/statistical_data.htm
Pythonのscikit-learnというライブラリで主成分分析をおこないます。データの可視化にはmatplotlibとseabornというライブラリを使います。
### データの概要
:black_small_square:国語と英語の成績の散布図

散布図をプロットしてみると、国語と英語の成績には正の相関がありそうなことがわかります。ほかの教科の組み合わせでもう少し散布図を描いてみます。
:black_small_square:数学と理科の成績の散布図

数学と理科の成績をプロットしてみると、国語と英語の成績の相関より強い相関がありそうなことがわかります。今度は数学と体育の成績の相関をプロットしてみます。
:black_small_square:数学と体育の成績の散布図

数学と体育の成績の相関は、「国語ー英語」「数学ー理科」に比べて、明らかに弱いことが見てわかります。体育は実技系の科目なので、座学との相関は弱いのではないだろうかと思い散布図を描いてみたのですが、思った通り相関は弱いみたいです。
相関係数で見てみると、「国語ー英語」の相関係数は0.76、「数学ー理科」の相関係数は0.81、「数学ー体育」の相関係数は0.15でした。
相関行列は以下の通りです。

散布図行列はこのようになっています。

ラベルが小さくて少し見づらいですが、体育だけほかの教科との相関が弱いという特徴が見て取れます。
三次元の散布図もプロットしてみました。
:black_small_square:「数学ー英語ー国語」の三次元散布図

主要3科目なので、まんべんなく勉強するはずだろうということで、相関が強く出るだろうと思っていましたが、散布図を見る限り正の相関がありそうです。
:black_small_square:「数学ー音楽ー体育」の三次元散布図

さきほどの「数学ー英語ー国語」の三次元散布図よりも、相関が弱そうなことがわかります。
もっと次元を増やしてデータを可視化したいのですが、当然ながら3次元までしかプロットできません。なので、**主成分分析**を用いてデータをよく説明する成分を抽出し、次元削減を試みたいと思います。
### 主成分分析
Pythonのscikit-learnというライブラリを用いて主成分分析をおこないました。データを標準化し、相関行列の固有値問題を解く手法で分析しています。
#### 因子負荷量をプロット
主成分分析をおこなって、**因子負荷量**(主成分と各変数の相関係数)を2次元プロットしました。

横軸で見て、”体育”・”技家(技術家庭)”・”美術”などに比べ、”国語”・”理科”・”英語”などの教科の因子負荷量の絶対値が大きいことを踏まえると、第1主成分は**主要科目**の因子だと考察できます。また、縦軸で見たときに、”体育”にのみ因子負荷量の絶対値が極端に大きいことを踏まえると、第2主成分は**体育**の因子であると考えられます。
#### 主成分得点をプロット
次に、**主成分得点**を2次元プロットしました。

データはばらついていて、特に大きなグループには分けられなさそうなことがわかります。
#### バイプロット(biplot)
最後に、主成分分析においてよく用いられるデータビジュアライズ手法であるbiplotをおこないました。

biplotとは、主成分得点と因子負荷量をスケーリングして重ねたグラフです。今回の例では、右にあるデータほど主要科目の得点が高く、上にあるデータほど体育の得点が高いという風に解釈できます。したがって、以下の4つのグループ分けができると考えていいでしょう。
| グループ | 特性 |
| -------- | -------- |
|左下のグループ|主要科目も体育も苦手|
|左上のグループ|主要科目は苦手だが体育は得意|
|右下のグループ|体育は苦手だが主要科目は得意|
|右上のグループ|体育も主要科目も得意|
このように、主成分分析によって、9科目のデータを2つの因子によって表現することができました。
主成分分析とはざっくり言えば、**データができるだけ散らばるようにしながら、より少ない成分でデータを表現する**ということなのだと理解しました。高次元のデータを可視化できることは、データを要約して説明するという際に役に立つと思うので、その他の次元削減の手法も調査しようと思います。また、matplotlib, seaborn以外のデータ可視化ツール(Tableau等)の調査もしようと思います。
今回のソースコードは[こちら](https://github.com/ShintaroaSuzuki/pca)にアップしました。