Rによるデータ分析

Rによる因子分析

因子分析 のRによる実施例です。

基本的な手順

library(psych) # ライブラリの読み込み
library(GPArotation)
# ライブラリの読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")$loadings 
# 因子数を2と仮定して、因子負荷量を出力
Factor Analysis

この実施例のデータは、AとBという変数を乱数で作っています。 いずれも、平均が10、標準偏差が1で正規分布になる乱数です。 AとBは相関がありません。 A1B10という変数があり、これは、
A1B10 = A + 10B + 平均が0、標準偏差が0.1の乱数
という式で作っています。

そのため、ML1という因子がB、ML2という因子がAとして、因子をほぼ正確に見つけることができています。 A1B10の因子負荷量が、0.993と0.102というのも、前者が後者のほぼ10倍なので、元の変数の作り方を見つけることができています。

因子負荷量をグラフにする例は、以下の2つです。 ヒートマップの方は、部分的に拡大ができるので、項目が多い時に便利です。

library(psych) # ライブラリの読み込み
library(GPArotation)
# ライブラリの読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
fa.diagram(fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")) 
# 因子数を2と仮定して、因子負荷量を出力
Factor Analysis

library(psych) # ライブラリの読み込み
library(GPArotation)
# ライブラリの読み込み
library(heatmaply)
# ライブラリの読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
heatmaply(fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")$loadings) 
# 因子数を2と仮定して、因子負荷量を出力
Factor Analysis

グラフは、因子負荷量の小さな値を自動でカットしたりするので、小さな値を見落とさないためには、数字データを直接チェックする方が確実と思います。

回転の種類の違い

上記では回転の種類にvarimaxを使っています。 結論から書くと、 隠れ変数の探索 をするのに適しているのは、varimaxです。 psychには、その他の回転方法もありますが、感度が悪いです。
Factor Analysis
Factor Analysis
Factor Analysis
Factor Analysis
Factor Analysis
Factor Analysis

varimaxでは、 A1B10という変数には、2つの因子が影響していることが導き出すことができましたが、 その他の回転では、Aの影響がA1B10にあることを導き出せませんでした。

なお、 隠れ変数の探索 で行う分析の特徴は下記になります。

こういう時にはvarimaxが一番良いらしいということは、上記の例でわかりましたが、 どんな分析でもvarimaxを使えば良い、という訳ではないです。

ライブラリの違い

Rの比較的古い文献では、因子分析のライブラリとしてfactanalが紹介されています。

factanalは、デフォルトのRで使えるため、ライブラリのインストールの手間や、ライブラリの読み込みの行が不要です。 また、varimaxとpromaxが使えるようになっています。

そのため、 隠れ変数の探索 が目的なら、psychよりもfactanalの方が手軽です。

ただ、factanalで、上記の例を実行しようとすると下記のエラーになり、計算ができません。 変数が4個でもエラーになります。 変数が5個あれば、2因子の探索ができるようになります。
Factor Analysis

この点を考えると、多少手間でも、psychを使う方が良いようです。

サンプルと因子の関係も見る場合

上記は、変数と因子の関係を見る分析でした。

因子分析の使い道として、サンプルと因子の関係を見たい時もありますので、その場合の例が下記になります。

library(psych) # ライブラリの読み込み
library(GPArotation)
# ライブラリの読み込み
library(heatmaply)
# ライブラリの読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T, row.names=1)
# データを読み込み。1列目をサンプル名とする
fa_result <- fa(Data, nfactors = 2, fm = "ml", rotate = "varimax") 
# 因子数を2と仮定して、因子分析

heatmaply(fa_result$loadings) # 変数と因子の関係の分析
Factor Analysis

heatmaply(fa_result$scores) # サンプルと因子の関係の分析
Factor Analysis



参考文献

Rによる統計入門 津田裕之氏のページ
psychの使い方
https://htsuda.net/stats/factor-analysis.html


同志社大学 金明哲先生のページ
因子分析の解説と、factanalの使い方
https://www1.doshisha.ac.jp/~mjin/R/Chap_25/25.html



Tweet データサイエンス教室