因子分析を行い、その結果を報告する際に、因子負荷量や因子間相関を表にする場合があります。しかし、手作業でやると、ミスにつながりやすく、何より面倒です。そのような作業はRにやってもらいましょう。
主に使用するRのパッケージはsJPlot version 2.8.15になります。回帰分析系の結果の出力でよく使っていましたが、因子分析の結果の出力にも大変役に立ちました。
データの用意
まずはデモで使うポケモンのデータを読み込みます。こちらのサイトで紹介されているデータ(ポケモンで学ぶデータ分析|データの中身を知ろう)を使用しました。今回は、表にする方法のデモが目的であり、因子分析のやり方の解説ではありません。ですので、結果を表示しやすいように一部の変数のみを読み込んでいます。また、一つ目のシートを使用しています。
library(openxlsx)
data <- read.xlsx("pokemon_data.xlsx",
sheet = 1)[,-c(1, 4, 7, 8, 9, 14, 15, 16, 17, 18, 19)]
データの中身
- 名前:ポケモンの名前。
- タイプ1:ポケモンに設定されている属性のようなもの。複数のタイプを持つポケモンがいるので、タイプ1となっています。
- 高さ:身長のようなもの。
- 重さ:体重のようなもの。
- こうげき:物理技の攻撃力。
- ぼうぎょ:物理技の防御力。
- とくこう:特殊技の攻撃力。
- とくぼう:特殊技の防御力。
分析開始
パッケージを読み込みます。
library(sjPlot)
view_df
関数を使うと、変数名と、連続値のデータの範囲を示しす。
sjPlot::view_df(data)
変数間の相関行列
tab_corr
関数で、指定した変数間の相関行列を表示できます。後述しますが、HTMLファイルにエクスポートできるので、Wordに結果を張り付けることも可能です。
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"
)
探索的因子分析
次に、探索的因子分析を行い、因子負荷量を表にします。因子数はなんとなく2を指定しました。
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"
)
「ぼうぎょ」に塗りつぶし線が引かれています。これは、引数のfctr.load.tlrn = 0.1
の設定に対応しています。複数の因子にloadingしていないかを表示する機能です。最も高い値と、二番目に高い値の差が最低でもどの程度必要かを設定します。今回は、0.1以上必要というデフォルトの設定になっていて、Factor 1と2はそれぞれ0.33、0.38で0.1以下の差しかないので塗りつぶし線が描画されています。
「ぼうぎょ」をぬいて再度分析を行います。これ以降は、簡略化のため、共通性( show.comm =
)とクロンバックα(show.cronb =
)の結果は非表示にしています。
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"
)
今回は、ダブルローディングはないですね。
因子間相関行列
因子間相関行列を表にする場合、psych
パッケージのfa
関数で探索的因子分析を行い結果を保存します。
library(psych)
r.fa <- fa(data[,-c(1,2,6)],
nfactors = 2,
fm = "ml",
rotate = "promax")
r.fa
に結果を保存しているので、そこから因子間相関の結果を取り出します。
r.fa$Phi
tab_corr
関数を使用します。引数のvar.labels
を指定して、因子に名前をつけています。小数点の表示も3桁に変更しました(引数digits
)。
tab_corr(r.fa$Phi,
corr.method = "pearson",
title = "因子間相関",
var.labels = c("体格・攻撃", "特殊" ), # 因子名
triangle = "lower",
digits = 3,
encoding = "UTF-8"
)
おまけ(Wordに挿入する方法)
因子負荷量や因子間相関行列の表をWordに挿入する一例を紹介します。まず、引数にfile = "factorloadings.html"
を追加します""の中は、ファイル名を指定してください。これで、出力した表を保存できます。ファイル名の前にパスを入れると、保存場所も指定できます。
次に、出力したhtmlファイルをWordで開けば(右クリックして「プログラムから開く」でWordを選択)、完成です。注意点として、日本語が含まれているとWordファイルの日本語の部分が文字化けをします。encoding
の引数でUTF-8
やWindows-1252
などを指定しても、筆者のPCでは文字化けしました。ですので、変数名は英語に変えてから出力し、Word上で日本語などに適宜変更する方がいいと思います。
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上で手で修正しました。
細かい表の体裁は、Word上で行うこともできますし、CSSなどを事前に設定することもできるようです。R上での表の詳細なカスタマイズは、こちらに例があります(Customizing HTML tables)。
おすすめの記事
英語ですが、因子分析をRで行う際に参考になる記事がありました。探索的因子分析だけでなく、確証的因子分析もあります。