因子分析の結果は、すべてRが表にまとめてくれた－ポケモンのデータを例に－

　因子分析を行い、その結果を報告する際に、因子負荷量や因子間相関を表にする場合があります。しかし、手作業でやると、ミスにつながりやすく、何より面倒です。そのような作業はRにやってもらいましょう。
　主に使用するRのパッケージは[sJPlot version 2.8.15](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.14)になります。回帰分析系の結果の出力でよく使っていましたが、因子分析の結果の出力にも大変役に立ちました。

# データの用意
　まずはデモで使うポケモンのデータを読み込みます。こちらのサイトで紹介されているデータ（[ポケモンで学ぶデータ分析｜データの中身を知ろう](https://smart-hint.com/poke-data/introduction/#%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%82%92%E5%AD%A6%E3%81%B6)）を使用しました。今回は、表にする方法のデモが目的であり、因子分析のやり方の解説ではありません。ですので、結果を表示しやすいように一部の変数のみを読み込んでいます。また、一つ目のシートを使用しています。

```R
library(openxlsx)
data <- read.xlsx("pokemon_data.xlsx", 
                  sheet = 1)[,-c(1, 4, 7, 8, 9, 14, 15, 16, 17, 18, 19)]
```

## データの中身

- 名前：ポケモンの名前。
- タイプ1：ポケモンに設定されている属性のようなもの。複数のタイプを持つポケモンがいるので、タイプ1となっています。
- 高さ：身長のようなもの。
- 重さ：体重のようなもの。
- こうげき：物理技の攻撃力。
- ぼうぎょ：物理技の防御力。
- とくこう：特殊技の攻撃力。
- とくぼう：特殊技の防御力。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/5f856332-2704-39be-06b8-34d237e4fa7b.png)

# 分析開始
　パッケージを読み込みます。
```R
library(sjPlot)
```

　```view_df```関数を使うと、変数名と、連続値のデータの範囲を示しす。
```R
sjPlot::view_df(data)
```
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/33e0c6f7-3d7c-afe2-2ccf-52fa9957edc3.png)

## 変数間の相関行列
　```tab_corr```関数で、指定した変数間の相関行列を表示できます。後述しますが、HTMLファイルにエクスポートできるので、Wordに結果を張り付けることも可能です。
```R
sjPlot::tab_corr(data[,-c(1,2)],
         corr.method = "pearson",
         title = NULL,
         show.p = TRUE,            #Falseでアスタリスクを削除できます。
         triangle = "lower",       #表を数値でどう埋めるかの引数です。upper、bothも指定可能。
         digits = 3,
         encoding = "UTF-8"
       ) 

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/5bf4650e-60e9-d592-e7bf-b9287c0bd1b6.png)

 
## 探索的因子分析
　次に、探索的因子分析を行い、因子負荷量を表にします。因子数はなんとなく2を指定しました。

```R
sjPlot::tab_fa(
  data[,-c(1,2)],               #分析したいデータ。名前とタイプ1は除外
  rotation = "promax",          #回転
  method = "ml",                #推定法
  nmbr.fctr = 2,                #推定する因子の数
  fctr.load.tlrn = 0.1,         #ダブルローディングの検出。デフォルトは0.1
  sort = T,                     #F(alse)にすると、変数の順番で結果が表示される
  title = "ポケモンゲットだぜ！",
  show.cronb = T,               #Cronbachα
  show.comm = T,                #T(rue)にすると、共通性の結果も描画する
  digits = 2,                   #表示する小数点の数
  encoding = "UTF-8"
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/d2f54b9f-7954-400a-a844-527d757f601d.png)

 「ぼうぎょ」に塗りつぶし線が引かれています。これは、引数の```fctr.load.tlrn = 0.1```の設定に対応しています。複数の因子にloadingしていないかを表示する機能です。最も高い値と、二番目に高い値の差が最低でもどの程度必要かを設定します。今回は、0.1以上必要というデフォルトの設定になっていて、Factor 1と2はそれぞれ0.33、0.38で0.1以下の差しかないので塗りつぶし線が描画されています。
 

　「ぼうぎょ」をぬいて再度分析を行います。これ以降は、簡略化のため、共通性（``` show.comm =```）とクロンバック*α*（```show.cronb =```）の結果は非表示にしています。
```R
tab_fa(
  data[,-c(1,2,6)], 
  rotation = "promax",          
  method = "ml",        
  nmbr.fctr = 2,                
  fctr.load.tlrn = 0.1,         
  sort = T,                     
  title = "ポケモンゲットだぜ！",
  show.cronb = F,               
  show.comm = F,                
  digits = 2,                  
  encoding = "UTF-8"
)

```
今回は、ダブルローディングはないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/cf30603d-de8b-74e3-4a8f-9e5f5d66c741.png)


## 因子間相関行列
　因子間相関行列を表にする場合、```psych```パッケージの```fa```関数で探索的因子分析を行い結果を保存します。
```R
library(psych)
r.fa <- fa(data[,-c(1,2,6)],
                 nfactors = 2,
                 fm = "ml",
                 rotate = "promax") 

```

　```r.fa```に結果を保存しているので、そこから因子間相関の結果を取り出します。
```R
r.fa$Phi
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/43e90b5d-cc32-be99-83d9-b226b88cc73a.png)


　```tab_corr```関数を使用します。引数の```var.labels```を指定して、因子に名前をつけています。小数点の表示も3桁に変更しました（引数```digits```）。
```R
tab_corr(r.fa$Phi,
         corr.method = "pearson",
         title = "因子間相関",
         var.labels = c("体格・攻撃", "特殊" ),  # 因子名
         triangle = "lower",                     
         digits = 3, 
         encoding = "UTF-8"
         ) 

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/c4c7b7e4-f298-d292-2b70-b2d74ef7b5a7.png)

## おまけ（Wordに挿入する方法）
　因子負荷量や因子間相関行列の表をWordに挿入する一例を紹介します。まず、引数に```file = "factorloadings.html"```を追加します""の中は、ファイル名を指定してください。これで、出力した表を保存できます。ファイル名の前にパスを入れると、保存場所も指定できます。
 　次に、出力したhtmlファイルをWordで開けば（右クリックして「プログラムから開く」でWordを選択）、完成です。**注意点として、日本語が含まれているとWordファイルの日本語の部分が文字化けをします。```encoding```の引数で```UTF-8```や```Windows-1252```などを指定しても、筆者のPCでは文字化けしました。ですので、変数名は英語に変えてから出力し、Word上で日本語などに適宜変更する方がいいと思います。**
```R
tab_fa(
  data[,-c(1,2,6)], 
  rotation = "promax",          
  method = "ml",        
  nmbr.fctr = 2,                
  fctr.load.tlrn = 0.1,         
  sort = T,                     
  title = "Pokemon",
  show.cronb = F,               
  show.comm = F,                
  digits = 2,                  
  file = "factorloadings.html",    #これ！
  encoding = "UTF-8"
)
```
　以下はWordで開いた際のスクリーンショットです。文字化けしていた日本語の部分はWord上で手で修正しました。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/9ad9dd48-2e8e-3138-53be-725321118e52.png)



　細かい表の体裁は、Word上で行うこともできますし、CSSなどを事前に設定することもできるようです。R上での表の詳細なカスタマイズは、こちらに例があります（[Customizing HTML tables](http://127.0.0.1:30794/session/Rvig.410017b96e5b.html)）。


# おすすめの記事
　英語ですが、因子分析をRで行う際に参考になる記事がありました。探索的因子分析だけでなく、確証的因子分析もあります。
- [Exploratory and Confirmatory Factor Analysis on SF-36 Scales](https://rstudio-pubs-static.s3.amazonaws.com/1055333_d15052ea11ee47238f437e4542f6b8dd.html)

# 参考記事
- [RDocumentation：sjPlot (version 2.8.14)](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.14/topics/tab_fa)