【R言語】因子分析で負荷量をよしなに並び替えてくれる自作関数
背景
マーケティング系の分析でよく行う「因子分析」ですが、実行後の負荷量をよしなに並び替えてくれる関数がなかったので、簡易ですが自作したのでご紹介までにnoteを書こうと思います。
サンプルコードのご紹介
ではここから、因子分析を実行して、因子負荷量をよしなに並び替えてくれる関数をご紹介してきます。
手順1:パッケージの読み込みと因子分析の実行
さてと。ではまずは因子分析を行っていきます。
R言語では様々なパッケージが因子分析に対応していますが、今回はpsychパッケージのfa関数を使って実行していきます。
(MAP基準を見て因子数決めたりといったものはすっ飛ばしているので、ご容赦ください。。)
# ライブラリの読み込み
library(pacman)
p_load(psych, GPArotation, tidyverse)
# データの用意
data(bfi)
data = bfi[1:25] |> as_tibble()
# 因子分析
result = fa(data, use = "complete.obs",
nfactors = 5,
fm = "ml",
rotate = "oblimin")
手順2:結果の表示
では、resultの中身をみていきます。
# 結果(resultの中身をみる)
result
すると以下のような内容が表示されます。(loadingsというのが負荷量ですね)
データの列順できれいに並んでいるのはいいものの、できれば負荷量ごとにきれいに並んだ方が因子を解釈しやすくていいですよね。
ということで、これをよしなに並び替えてみましょう。
手順3:自作関数で負荷量をよしなに並び替えてみる
sort.loadingsという関数に、よしなに並び替えるコードを書いていきます。
細かな内容はコードをご確認いただければと思いますが、負荷量の絶対値からどの因子に含めるかを決め、割り振った因子内で並び替えを行うコードとなっています。
sort.loadings = function(x){
a = x$loadings
y = abs(a) # 因子負荷量の絶対値
z = apply(y, 1, which.max) # 各変数をどの因子に含めるべきか
loadings = NULL # 結果
for (i in 1:ncol(y)) {
b = a[z == i,, drop=FALSE]
if (nrow(b)) {
t = order(abs(b[, i, drop=FALSE]), decreasing=TRUE) # 因子単位で並べ替え情報を得る
loadings = rbind(loadings, b[t,, drop=FALSE])
}
}
class(loadings) = "loadings" # クラスの設定
return(loadings) # 結果を返す
}
# 自作関数を用いて因子負荷量を並び替えデータフレームとしてoutに読み込ませる
out = sort.loadings(x = result) |>
unclass() |> # loadings形式になってるのでunclassする
as.data.frame() |> # data.frameに変換
rownames_to_column("var") |> # row.nameを列にもってくる
mutate(across(where(is.numeric), ~ round(., 3))) # 数値列を小数点第3桁までの表示にする
out
ということで、outを見ていくと以下のように並びが変わります。
用いたデータがアルファベット+数字なので、ありがたみが分かりづらいですが、これをコピーし、ChatGPTに読み取らせるといい感じの因子名を考えてくれるので、とっても楽です。
感想
このようなあったら便利な汎用自作関数は、取り出しやすいところにまとめて管理しておくと日々のちょっとした効率化につながると思いますので、「お!」と思った方は、ぜひお使いくださいませ。。!
副業やってます
2024年から副業を本格的にやり始め、微力ながらも日本企業のインテリジェンス向上を狙いに、日々頑張っております。。!
何かお力になりそうなことがあれば、ご連絡いただけると幸いです。