Rで主成分分析

# はじめに

[Rで基礎分析結果をCSV出力②量的変数編](https://qiita.com/honda28/items/4aa14ddcd0832946313f)などで、[
default of credit card clients Data Set](https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients)の基礎分析を行ってきた。今回はそのデータに主成分分析を行う。

(2021/2/24追記)
以下コメントをいただいたため、記事後半にて追記する。
1. 基本的にはprincompではなく__prcompを使う__
2. princomp関数__corオプション__と__prcomp関数scaleオプション__を選択

# ~~主成分分析~~

~~Rでは標準で入っているパッケージstatsにある princomp関数 で主成分分析ができる。以下コードで実行する。（d.1は[Rで基礎分析結果をCSV出力②量的変数編](https://qiita.com/honda28/items/4aa14ddcd0832946313f)で分割した量的変数のみのデータである。）~~
記事後半で主成分分析を行う。（2021/2/24追記）

```r:PCA.R
pc <- princomp(d.1)
summary(pc) # 各種成分の標準偏差、寄与率、累積寄与率
pc$loading  # 主成分（固有ベクトル）
```

~~実行結果は以下のようになる。~~

![PCA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/ae056525-b49b-ad27-4d35-f0f326959d21.png)

~~上記結果より、第1主成分と第2主成分の累積寄与率が__約90.6%__と大半を占めていること、また第1主成分と第2主成分が __LIMIT_BAL__ と __BILL_AMT1-6__ の影響が大きいことがわかる。（固有ベクトルの空白部分は近似的に0。）~~

~~BILL_AMT1-6やPAY_AMT1-6あたりは平均や代表データを用いるだけでも良さそうな気もする。そのあたりはこれらデータから、Defaultの有無を予測するモデルを作成し精度向上などをする際に検討する材料の一つとできそう。~~

# 1. princomp関数とprcomp関数（2021/2/24追記）
[R Documentation "princomp"](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/princomp)にて、以下の記述がある。

> princomp only handles so-called R-mode PCA, that is feature extraction of variables. If a data matrix is supplied (possibly via a formula) it is required that there are at least as many units as variables. For Q-mode PCA use prcomp.

この文章は、「Rモードの場合しかprincomp関数は扱えない。Qモードの場合はprcomp関数を使いなさい」ということを述べている。RモードおよびQモードが何を意味しているかがわかっていないため調査する。[統計解析でよく使われる言葉「Qモード」「Rモード」とは何を指すのか](https://hoxo-m.hatenablog.com/entry/20120423/p1)によると、行：サンプル数 n、列：変数 m となるデータ行列X（n > m）では以下のように分類分けされるようだ。

<dl>
  <dt>Rモード</dt>
  <dd>変数の複雑さを軽減する（変数から特徴量を抽出する）</dd>
  <dt>Qモード</dt>
  <dd>サンプルの複雑さを軽減する（データ行列Xの転置行列に）</dd>
</dl>

つまり、データ行列に対して主成分分析を行いたいかによってはprincomp関数は使えないということになる。一方、prcomp関数はRモードQモードに関わらず主成分分析を行うことができるらしい。この違いはprincomp関数は__分散共分散行列（または相関係数行列）の固有値分解__を用いているのに対してprcomp関数では__データ行列の特異値分解__を用いていることによるようだ。prcomp関数はRモードQモードに関わらず実行できるので、__基本的にはprcomp関数を使えばよい。__（ちなみにこれら関数は分散の取り扱いにも違いがあり、princomp関数は標本分散、prcomp関数では不偏分散を用いている。）

# 2. princomp関数corオプションとprcomp関数scaleオプション（2021/2/24追記）

上記で述べたprincomp関数およびprcomp関数には、それぞれcorオプションおよびscaleオプション（どちらもデフォルトではFALSE）がある。
corオプションは計算の際に相関係数行列と分散共分散行列のいずれかを用いることを意味しており、デフォルトでは分散共分散行列を用いる仕様になっている。分散共分散行列は次元（kg, cmなど）を持つため、扱うデータがすべて同じ単位を持つ場合は問題がないが、異なる単位を持つデータの場合は不適切となる。一般にデータはさまざまな次元を持つデータであるため、基本的には無次元である相関係数行列を使用することが望ましい。したがって、__cor=TRUE__とすべきである。
またscaleオプションは正規化を行うかどうかを意味しており、デフォルトでは正規化を行わない仕様になっている。各次元の単位が同じ（スケールが合っている）場合には正規化は必要ないが、上記corオプションと同様に基本的には正規化を行うことが望ましい。したがって、__scale=TRUE__とすべきである。[RDocumentation](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/prcomp)においても、「一般にスケーリングを推奨する」というコメントがある。
> scale.
a logical value indicating whether the variables should be scaled to have unit variance before the analysis takes place. The default is FALSE for consistency with S, but __in general scaling is advisable.__ Alternatively, a vector of length equal the number of columns of x can be supplied. The value is passed to scale.


# 主成分分析（2021/2/24追記）

上記で述べた1と2を踏まえると、主成分分析は__prcomp(X, scale=TRUE)__で行うことが望ましいと言える。したがって、この関数を用いて再度主成分分析を行った結果を以下に示す。

```r:PCARetry.R
pc <- prcomp(d.1, scale=TRUE)
summary(pc) # 各種成分の標準偏差、寄与率、累積寄与率
pc$rotation # 主成分（固有ベクトル）
```

実行結果は以下のようになる。

![pca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/3eceffbe-28d2-be05-6b92-583d9af3f80e.png)

上記結果より、第1主成分から第6主成分までの累積寄与率が__約81.1%__を占めていること、また第1主成分は __BILL_AMT1-6__ の影響が大きいことがわかる。

BILL_AMT1-6やPAY_AMT1-6あたりは主成分が近い値となっているため、平均や代表データを用いるだけでも良さそうな気もする。そのあたりはこれらデータから、Defaultの有無を予測するモデルを作成し精度向上などをする際に検討する材料の一つとできそう。