【初心者向け】主成分分析（PCA）って一体何をしているの？（理論編）

## はじめに
**主成分分析（PCA：Principal Component Analysis）の理論**について解説していきます。
具体例は示しますが、詳しい数学的な意味や数式などは[こちら](https://qiita.com/g-k/items/893e4e836ae493b03c47)や[こちら](https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f0)などを参照下さい。
Pythonでの実装方法については[別途記事（実装編）](https://qiita.com/oki_kosuke/items/43cb63134f9a03ebc79a)を書きましたので是非そちらを参照下さい。

※機械学習やプログラミング関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

## 主成分分析とは
**「与えられた特徴量から新たな特徴量（主成分）を作り出し、元の特徴量よりも少ない数の変数（次元）でデータを説明する」**手法とイメージすると分かりやすいと思います。文献などでは以下のような説明がなされています。

- 次元削減（可視化）の最も基本的な手法
- 多変量データをより少数のパラメータ情報に圧縮
- 2次元に圧縮することで、多次元データを可視化することが可能
- 座標系の回転変換（アフィン変換）を行い、より少ない座標軸でデータを説明
- 投射後のデータの散らばりが最大になるように、データをより低次元の空間に投影
- 教師なし学習の一種

### 主成分分析のイメージ
![pca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/f43509f7-3d6b-98e4-d8e2-37419e4ae517.png)

もともと変数1と変数2で説明されていたデータがあるとします。（図の左側）
このデータに主成分分析を適用し、新たに主成分1と主成分2を生成します。（図の右側）
主成分分析後のデータに関しては、主成分1のみで上手くデータが説明されていることが分かります。このように主成分分析を行うことで、もともとは2つの変数で説明されていたデータを1つの変数のみで説明できるようになりました。つまり、2次元が1次元に削減されました。このように**主成分分析は新たな軸（主成分）を設定することで次元削減を行います。**

### 主成分分析の具体例
[化学のための Pythonによるデータ解析・機械学習入門](https://www.amazon.co.jp/%E5%8C%96%E5%AD%A6%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-%E9%87%91%E5%AD%90-%E5%BC%98%E6%98%8C/dp/4274224414/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1614765377&sr=8-1)に分かりやすい具体例が書かれていましたので、そちらを参考に紹介させていただきます。2つの特徴量*x*<sub>1</sub>, *x*<sub>2</sub>をもつ4つのデータからなるデータセットを考えていきます。データの内容と与えられた特徴量空間におけるデータの分布を示します。
![pca_graph1_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/d4e4113c-2541-3a9d-9631-6f8c9d9d31c5.png)
![pca_graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/0f153707-953f-5c69-7099-4c5667262a8c.png)
このデータセットに対して主成分分析を実行すると、次のように各主成分（今回であれば第1主成分*t*<sub>1</sub>と第2主成分*t*<sub>2</sub>）が計算され、
![pca_graph2_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/6e2121eb-7afc-538c-e89a-d40cbc018795.png)
第1主成分*t*<sub>1</sub> vs 第2主成分*t*<sub>2</sub> 空間では4つのデータは以下のように存在します。
![pca_graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/8af9f653-2337-fca0-de4d-f4d2d5662896.png)

もとの4つデータを以下のように4行2列の行列_**X**_として考えます。

```math
\mathbf{X}\
=
\begin{pmatrix}
x_1^{(1)} & x_2^{(1)} \\
x_1^{(2)} & x_2^{(2)} \\
x_1^{(3)} & x_2^{(3)} \\
x_1^{(4)} & x_2^{(4)}
\end{pmatrix}
=
\begin{pmatrix}
2 & 2 \\
1 & -1 \\
-1 & 1 \\
-2 & -2
\end{pmatrix}
```

また、2つの特徴量*x*<sub>1</sub>, *x*<sub>2</sub>それぞれを取り出したベクトルを以下のように_**x**_<sub>1</sub>, _**x**_<sub>2</sub>とします。

```math
\\
\mathbf{x}_1\
=
\begin{pmatrix}
x_1^{(1)}  \\
x_1^{(2)}  \\
x_1^{(3)}  \\
x_1^{(4)} 
\end{pmatrix}
=
\begin{pmatrix}
2  \\
1  \\
-1 \\
-2
\end{pmatrix}
```
```math
\\
\mathbf{x}_2\
=
\begin{pmatrix}
x_2^{(1)}  \\
x_2^{(2)}  \\
x_2^{(3)}  \\
x_2^{(4)} 
\end{pmatrix}
=
\begin{pmatrix}
2  \\
-1  \\
1 \\
-2
\end{pmatrix}
```

ここで、*t*を$t=x_1p_1+x_2p_2$のように特徴量*x*<sub>1</sub>, *x*<sub>2</sub>の線形結合で表すと、*t*は以下のように新しい軸となります。
![pca_graph3png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/c361c478-1c49-3447-2290-68eb8bbd07c3.png)
*p*<sub>1</sub>, *p*<sub>2</sub>で表される線形結合の重みは**ローディング**と呼ばれます。また、図において各サンプルから*t*軸に対して垂線を下した際の*t*軸上の座標を**スコア**と呼びます。スコアの二乗和が最大になるような*t*軸のことを第1主成分軸と呼びます。スコアの二乗和の最大化は分散の最大化を意味し、1つの軸でなるべく多くの情報（データのばらつき）を表現できる軸を求めていることになります。詳細な計算は割愛しますが、ローディングに制約条件を設けてラグランジュの未定乗数法を用いることで*p*<sub>1</sub>, *p*<sub>2</sub>を求めていきます。計算の結果、次のように*p*<sub>1</sub>, *p*<sub>2</sub>が求まります。

```math
\\
\mathbf{p}_1\
=
\begin{pmatrix}
\frac{1}{\sqrt2}  \\
\frac{1}{\sqrt2}
\end{pmatrix}
```
```math
\\
\mathbf{p}_2\
=
\begin{pmatrix}
-\frac{1}{\sqrt2}  \\
\frac{1}{\sqrt2}
\end{pmatrix}
```

よって、第1主成分*t*<sub>1</sub>と第2主成分*t*<sub>2</sub>はもとの特徴量*x*<sub>1</sub>, *x*<sub>2</sub>を用いて以下のようにあらわされます。

```math
t_1=\frac{1}{\sqrt2}x_1+\frac{1}{\sqrt2}x_2 \\
t_2=-\frac{1}{\sqrt2}x_1+\frac{1}{\sqrt2}x_2 \\
```

sample1(*x*<sub>1</sub>, *x*<sub>2</sub>)=(2, 2)の第1主成分*t*<sub>1</sub>のスコアを求めると以下のようになります。

```math
\begin{align}
t_1&=\frac{1}{\sqrt2}×2+\frac{1}{\sqrt2}×2 \\
&=2.82
\end{align}
```

### 寄与率について
表現できる情報量の割合は寄与率として表されます。寄与率は0から1までの値をとり、寄与率1であればもとの特徴量で表されていた情報がすべて表されていることを意味します。寄与率は主成分の分散を全情報量で割ることにより求められます。
ここで、例としてもとの特徴量が8つのデータに対する主成分分析を考えてみます。主成分の数は最小で1つ、最大でもとの特徴量と同じ数の8つです。主成分数8のときはもとの情報量をすべて表すことができているので累積の寄与率は1となり、情報の損失はありません。主成分分析の結果、次の2パターンの結果が得られたとします。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/892d61e9-634a-9a2b-5540-fe9c5dae4393.png>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/f5611539-90d7-0963-a9c3-1be8778964a2.png>

主成分に対して寄与率をプロットしたグラフを示します。

<img width="350" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/5b6ca61e-5634-8719-73fd-a14b73da8aeb.png>&nbsp;&nbsp;&nbsp; <img width="350" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/ae3eaa0c-504c-c460-3535-154b36519374.png>

左側のパターンでは主成分数2で累積寄与率が0.9であることに対して、右側の例では主成分数が6で累積寄与率が0.9に到達していることが分かります。つまり、左側のパターンの方が少ない特徴量数（主成分数）で多くの情報量を表現できており、主成分分析による次元削減が効果的であることが読み取れます。（主成分分析では、累積寄与率が0.9程度となるまで主成分を選択するという基準などがあります）


### 主成分分析が上手く使えないシーン

<dl>
<dt>①データが複数のクラスターからなる場合</dt>
<dd>主成分分析では座標軸の回転を行います。例えば、データがAというグループとBというグループからなる場合、どちらのグループに対しても同様の軸の回転が適用されます。よって、複数のグループ（クラスター）からなるデータでは主成分分析で上手く可視化できない可能性があります。その場合はグループごとに主成分分析を行うことが適切であると考えられます。</dd>

<dt>②特徴量間に非線形な関係がある場合</dt>
<dd>主成分分析ではもとの特徴量の線形変換によって新しい特徴量（主成分）が生成されます。よって、もとの特徴量間に非線形な関係性がある場合は主成分分析で上手く可視化できない可能性があります。非線形な次元削減の手法としてはt-SNE（t-distributed stochastic neighbor embedding）法やGTM（generative topographic mapping）などが存在します。</dd>

<dt>③データが標準化されていない場合</dt>
<dd>もとの特徴量が標準化（平均値=0、標準偏差=1にする操作）されていない場合は主成分分析で上手く可視化できない可能性があります。</dd>

</dl>
なお、③の標準化については[こちら](https://datachemeng.com/autoscaling_before_pca/)に理由が解説されていたので、以下に引用します。
>PCA では、分散が最大化になるように主成分軸を決める、とうたっていますが、実際に行っていることは、主成分スコアの二乗和を最大化することです。分散は、それぞれの値から平均値を引いたものを二乗して足し合わせて、最後に (サンプル数-1) で割ることで計算できます。二乗和とは異なりますね。主成分の分散の最大化と、主成分スコアの二乗和の最大化とが同意になるためには、主成分の平均値が 0 でなければなりません。主成分の平均が 0 であれば、分散は主成分スコアの二乗和を (サンプル数-1) で割ったものになりますので、(サンプル数-1) は最大化には関係なく、主成分の分散の最大化 = 主成分スコアの二乗和を最大化 になります。主成分は、変数の線形結合 (ローディングが結合の重み) で表現されますので、すべての変数の平均値が 0 であれば、主成分の平均値も 0 です。主成分の平均値を 0 にするため、変数のセンタリングが必要になるわけです。

また、[こちら](https://qiita.com/koshian2/items/2e69cb4981ae8fbd3bda)には主成分分析時にデータを標準化することに関して議論されており参考になりました。

## まとめ
主成分分析（PCA）の理論について解説致しました。**主成分分析は「もとの特徴量から新たな特徴量（主成分）を作り出し、もとの特徴量よりも少ない数の変数（次元）でデータを説明する」**手法です。多次元データの次元削減や可視化に有用です。

### 参考
- [PCA(主成分分析)を理解する(理論編)](https://qiita.com/g-k/items/893e4e836ae493b03c47)
- [意味がわかる主成分分析](https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f0)
- [「機械学習のエッセンス」](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E3%82%A8%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B9-%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6Python-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-Machine-Learning/dp/4797393963/ref=sr_1_1?adgrpid=54479479918&dchild=1&gclid=Cj0KCQiAhP2BBhDdARIsAJEzXlF8GBbQY0JwV_LiqLWyooU_TdpTi1TUfzbGhwMY3I0zFIEsYE6u6FsaAmdpEALw_wcB&hvadid=338539006732&hvdev=c&hvlocphy=20636&hvnetw=g&hvqmt=b&hvrand=6327725972382099296&hvtargid=kwd-480727246254&hydadcr=27263_11561109&jp-ad-ap=0&keywords=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E3%82%A8%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B9&qid=1614765145&sr=8-1)
- [「実践マテリアルズインフォマティクス」](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9-%E8%88%B9%E6%B4%A5-%E5%85%AC%E4%BA%BA/dp/4764906155/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%AE%9F%E8%B7%B5%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9&qid=1614765331&sr=8-1)
- [「化学のための Pythonによるデータ解析・機械学習入門」](https://www.amazon.co.jp/%E5%8C%96%E5%AD%A6%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-%E9%87%91%E5%AD%90-%E5%BC%98%E6%98%8C/dp/4274224414/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1614765377&sr=8-1)
- [データ化学工学研究室(金子研究室)＠明治大学 理工学部 応用化学科](https://datachemeng.com/autoscaling_before_pca/)
- [主成分分析で標準偏差で割るべき？に対する議論](https://qiita.com/koshian2/items/2e69cb4981ae8fbd3bda)