主成分分析と因子分析の違い

# はじめに
主成分分析と因子分析がごっちゃになりがちなので、簡単にまとめました。

# 参考
- [主成分分析](http://www.snap-tck.com/room04/c01/stat/stat16/stat1601.html)
- [因子分析](http://www.snap-tck.com/room04/c01/stat/stat17/stat1701.html)

# 手順

$m$成分のデータのベクトル$\boldsymbol{x}^{(1)},...,\boldsymbol{x}^{(n)}$を転置して行方向に並べた行列を計画行列$X$とする。計画行列$X$は$n$行$m$列の行列である。

```math
X = \begin{pmatrix}
\boldsymbol{x}^{(1)\top}  \\
\vdots  \\
\boldsymbol{x}^{(n)\top} \\
\end{pmatrix}
```

以下では、計画行列$X$は予め標準化されているものとし、標準化された計画行列を改めて$X$と書くことにする。

## 主成分分析
主成分分析の目的は、多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を作り出すことである。具体的にはデータ次元の座標軸を取り直して、各成分の分散が最大化するような変換を求める。

データのベクトル$\boldsymbol{x}$があったとき、変換行列を$W$とするとデータは$\boldsymbol{t}$に変換される。

```math
\boldsymbol{t}^\top = \boldsymbol{x}^\top W
```

ここで、$W$は$m\times m$の直行行列である。

まず第一主成分を求める。Wの1列目のベクトルを取り出して次のように書ける。

```math
t_1 = \boldsymbol{x}^\top \boldsymbol{w}_1
```

与えられてデータから、$\mathrm{Var}(t_1)$を最大化する問題を解く。

```math
\mathrm{argmax}_{\boldsymbol{w}_1}( t_1^2 ) = \mathrm{argmax}_{\boldsymbol{w}_1; |\boldsymbol{w}_1|=1}\left(\boldsymbol{w}_1^\top X^\top X \boldsymbol{w}_1 \right)
```
この解は$X^\top X$の固有ベクトルで、固有値が最大のものである。

第二主成分は$\boldsymbol{w}_1$に直交し、$\boldsymbol{w}_2^\top X^\top X \boldsymbol{w}_2$を最大にする$\boldsymbol{w}_2$であるが、これはまさに$X^\top X$の固有ベクトルで、固有値が二番目に大きいものである。同様にして、結局$W$は$X^\top X$の固有ベクトルを並べたものであることがわかる。

$W$によって変換されたデータは行列$T$で表される。

```math
T = XW
```

例えば第一列と第二列を取り出して、各データをプロットするとよく見るグラフが得られる。
主成分分析の結果の解釈は、例えば第一主成分については$t_1 = \boldsymbol{x}^\top \boldsymbol{w}_1$の式を見て、$\boldsymbol{w}_1$の正負や大小から各変数の組み合わせについて解釈することができる。他の主成分についても同様である。主成分的な意味で近しいものは近くにプロットされる。

Pythonでは`sklearn.decomposition.PCA`を用いて計算できる。

## 因子分析
因子分析の目的はデータ$\boldsymbol{x}$に影響する潜在的な因子、すなわち共通因子$\boldsymbol{f}$と共通因子の重みづけに相当する因子負荷量$A$を求めることである。

もう少し具体的に書くと、例えば3変数のデータが得られていたとき、


| $x_1$ | $x_2$ | $x_3$ |
|:-----------:|:------------:|:------------:|
| 2.4       | -1.0      | 1.2        |
| 0.2       | 4.5       | -0.6         |
|...      | ...        | ...         |

この3変数が依存する2変数$f_1,f_2$を表に加え、

| $x_1$ | $x_2$ | $x_3$ | $f_1$ | $f_2$ |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 2.4       | -1.0      | 1.2        |1.3       | 0.1         |
| 0.2       | 4.5       | -0.6         |-2.5       | 3.2         |
|...      | ...        | ...         |...        | ...         |


$\boldsymbol{x}$が$\boldsymbol{f}$によってどのように決定されるかを表す$A$を求める。

さて、共通因子$\boldsymbol{f}$がデータ$\boldsymbol{x}$に影響を与えるとは次のように書ける。

```math
x_i = f_j a_{ji} + e_i
```
ここで添え字$i$はデータベクトル$\boldsymbol{x}$の成分を表し、添え字$j$共通因子$\boldsymbol{f}$の成分を表す。$\boldsymbol{e}$はその他の因子による影響を表す項で、特殊因子と呼ばれる。

ベクトル表示すると次のように書ける。

```math
\boldsymbol{x}^\top = \boldsymbol{f}^\top A + \boldsymbol{e}
```

全データに対する共通因子が求められると、計画行列を用いて次のように表される。

```math
X = \hat{F}\hat{A}
```
ここで、真の値ではなく推定値であるという思いを込めてハットを付記した。$\hat{F}$は$n\times \ell$の行列で、$\hat{A}$は$\ell\times m$の行列である。$\ell$は共通因子の数で、予め設定しておくハイパーパラメータである。

主成分分析の式とは異なることがわかる。主成分分析とは異なり、計画行列を行列分解するような形になっている。

このままでは$\hat{F},\hat{A}$の制約がないので、一意に決定できない。そこで因子の標準化や因子の独立性、因子負荷量の平方和の最大化などの条件を付与して計算を行う。すると$\hat{A}^\top \hat{A}$がおおよそ変数間の相関行列に一致するようになり、因子負荷量を決定できる。詳しくは[こちらのサイト](http://www.snap-tck.com/room04/c01/stat/stat17/stat1701.html)を参照すること。

因子分析の解釈は、因子を軸にとって因子負荷量をプロットすることで解釈できる。主成分分析と異なり、因子が何を表すのか不明であるため、解釈はより難しい。

Pythonでは`factor_analyzer`というライブラリを用いて因子分析を行うことができる。

## 使い分け

[参考サイト](http://www.snap-tck.com/room04/c01/stat/stat17/stat1703.html)から引用します。

> 最後に、主成分分析と因子分析の使い分けについて少し説明しておきましょう。 主成分分析は実際に観測されたデータを要約して概括評価項目つまり目的変数を作成するための手法であり、作成された概括評価項目のことを主成分と呼びます。 それに対して因子分析は実際に観測されたデータが何故そのような値になっているかという要因つまり説明変数を探るための手法であり、推測された潜在的な説明変数のことを因子と呼びます。

## おわりに

因子分析には選好回帰というものもあるようで、共通因子を説明変数、なんらかの目的変数を設定して重回帰分析をすることで、得られた係数から理想ベクトルを算出し、目的変数の値が大きくなる方向を求められる。すると、目的変数を大きくする、ポジショニングを考えることもできる。例えば[一般社団法人 Jミルクの調査結果](https://www.j-milk.jp/report/marketing/f13cn00000000wbz-att/9fgd1p0000001yqh.pdf)が参考になる。