LuckyOceanのブログ

新米技術士の成長ブログ

Rを使いこなすための基礎練習(その2:因子分析)

はじめに
今回はビジネスデータ分析(advance)の2回目の講義で習った因子分析について復習したい。資料を見返すと確かにそんな説明を受けたことは覚えているが、思い出す速度よりも忘れる速度の方が速いことを痛感する(笑)。

因子分析
因子分析(factor analysis)とは、ある事象と別の事象の関係性を分析する手法だ。つまり、何が原因で何が結果かを調べるのが目的だ。例えばチョコが好きな人とナッツが好きな人がいる。チョコナッツは二人とも好きかもしれない。チョコチップはチョコ好きだけが好きかもしれない。本当は原因があって結果があるが、得られたデータは原因ではなく結果かもしれないので、そのデータから原因を類推する。しかし、幸せだから笑顔なのか、笑顔だから幸せなのか。原因と結果は逆転することもあるし、わざと逆転することで新しい事実が見えたりもする。因子分析は奥が深い。
f:id:hiroshi-kizaki:20191106151059p:plain
 出典:https://www.macromill.com/service/data_analysis/factor-analysis.html

固有値
固有値とは、意味のある因子の数だ。収集したデータが仮に10種類のデータだったとしても、その中には相互に依存する因子があるかもしれない。しかし、この因子数を決めるのは必然ではなく、仮説だ。つまり、2個にするのか、4個にするのか、6個にするのかは仮説でしかない。大切なことはその仮説を検証することだ。しかし、仮置きでも、因子数を決めるにはステップと概念がある。

1)基準
・カイザー・ガットマン基準:固有値が1以上の因子を採用する
・スクリー法:固有値の大きさをプロットし、推移がなだらかになる前までを抽出する
f:id:hiroshi-kizaki:20191106153111p:plain
 出典;http://cogpsy.educ.kyoto-u.ac.jp/personal/Kusumi/datasem06/minemoto.pdf

2) 分析のステップ
・ステップ1:相関行列から類似性を判断する。
・ステップ2:類似性からまとめられる束(因子)の数を判断する=因子数の決定
・ステップ3:その束にどのブランド(変数)が束ねられるかを判断する=負荷量
・ステップ4:新しく束ねれた変数:因子を解釈する=負荷量の活用
・ステップ5:因子で対象を評価し直す=因子得点の計算
f:id:hiroshi-kizaki:20191106152129p:plain
 出典:因子分析の主要な結果を解釈する - Minitab

因子負荷量
今、自分が関心を持っている類人猿分類についても、その特徴は様々だ。どれがゴリラだ、チンパンジーだと断言しているが、実際はそれほど単純なものではない。様々な質問に対する答えを多変量分析して、因子数が4となるところで因子負荷量等を決めることになる。もしかしたら因子は5つかもしれないし、6つかもしれない。現在、questant!で調査を依頼しているが楽しみだ。因子負荷量とは、因子分析において得られた共通因子が観測因子に与える影響の強さを示し、観測変数と因子得点との相関係数に相当する。因子負荷量の絶対値が大きいほど、強い影響力を有することを示す。なお、マイナス値で相関が高いということは、例えば甘いものが好きな人は辛いものが苦手な可能性が高いがそのようなケースだと言える。
f:id:hiroshi-kizaki:20191106153249p:plain
 出典:http://wwwhum.meijo-u.ac.jp/labs/hh002/spss/inventory/factorana02.html

スクリープロット
これは例えば求人に応募してきた人に対してアンケートをした結果だ。どのような点を重視しているかという質問に対しては、3つの因子に分類できそうだ。第一の因子では、将来性や出世や給与、保険等の基本的な待遇を重視していることがわかる。そりゃそうだろう。第二の因子では、勤務時間や休日を気にしている。これはオフとオンを明確に区別したいという気持ちだ。これもわかる。第三の因子は雰囲気だ。ヒアリングにはないけど人間関係が良好かどうかと言ったことを気にするのもよくわかる。こんな風に多くの要因を少数の因子(ファクター)で統括できるのは有益だ。なお、下の写真の#Promotion Var#は寄与率だ。その下の#Cumulative Var#は累積寄与率のことだ。
f:id:hiroshi-kizaki:20191106160223p:plain
 出典:https://opens.co.jp/blog/statistics/1/

バイプロット
因子分析した結果を見える化するにはどうすれば良いのでしょうか?Rのbiplot()関数を使うと簡単に作成できます。例えば、スナック菓子の食感をアンケートで調査します。そして、その結果をMR1とMR2の二次元でマッピングします。MR1は、まろやかとか、クリーミーと言った食感に対応しています。MR2は油っぽい、ベタつく(逆はサクサク感)の傾向に対応しています。スナック菓子は主に、スイーツ系のものが中心から右側にあり、揚げ物系が中心から上、サクサクけいが中心より下にあります。注目すべきは、投入する商品をこのマップのどこに位置付けるかです。あえて、既存の商品と競争するポジションにおく戦略もあるし、ブルーオーシャンを狙う戦略もある。しかし、ブルーオーシャンには、2つの種類があるので注意が必要だ。つまり、本当はそこにニーズがあるのだけど誰もそれに気付いていないケースと、そこにはニーズがそもそもないケースだ。仮にまろやかの反対が激辛としたら、新しい市場を開拓する余地があるのかもしれない。そんなことを考えるヒントを与えてくれるのがバイプロットだ。
f:id:hiroshi-kizaki:20191106161056p:plain
 出典:http://imaimamu.com/archives/1728

Rの解説
(1) アイスの好みのデータを読み込む
 
ice.data1<- read.csv("ice4.csv",fileEncoding="cp932",row.names = 1)

# CSVファイルを読みこむ
# row.names=1として、1列目の値を行(row)の名前にする

(2) データの抽出(アイスの部分のみ抽出する)

head(ice.data1)
fa.ice.data1<-ice.data1[,2:5]

# データの抽出

(3) 相関関係の分析

cor.ice<-cor(fa.ice.data1)
round(cor.ice,2)
write.csv(cor.ice,"アイス4種の相関分析結果.csv",fileEncoding = "cp932")

# 相関行列を確認してみる
# mac用 write.csv(cor.ice,"アイス4種の相関分析結果.csv",fileEncoding="cp932")
#小数点以下二桁とする。
#csvファイルに出力する。
f:id:hiroshi-kizaki:20191106162528p:plain

(4) 固有値の計算

eigen.ice<-eigen(cor.ice)$values
eigen.ice
plot(eigen.ice, type="b", main="スクリーンプロット",xlab="因子番号",ylab="固有値")

#固有値の確認
#固有値1以上の基準の意味を理解する
#有意な因子は2と判断する。
f:id:hiroshi-kizaki:20191106162811p:plain

(5) 回転手法(最尤法)

# 因子分析を行う:最尤法(ml)+回転なし

fa.ice.out<- fa(r=fa.ice.data1, nfactors=2,rotate="none",fm="ml",scores=T)
fa.ice.out
write.csv(fa.ice.out$loadings,"アイスの因子負荷量回転なし.csv")

f:id:hiroshi-kizaki:20191106164627p:plain

(6) 因子特典
# 因子得点
fa.ice.out$scores
write.csv(fa.ice.score,"アイスの因子得点.csv")

(7) psychの利用
# 専門パッケージ:psychの利用

library("psych")
library("GPArotation")

# 平行分析を行う:因子数決定のため
# 数回実行時、結果の安定性を確認する

fa.parallel(fa.data2,fm="ml")

#因子分析(回転なし)
fa1<-fa(fa.data2,nfactors=2,rotate="none",fm="ml")
print(fa1)
write.csv(fa1$loadings,"人事データの因子負荷量回転なし.csv")

#因子分析(バリマックス回転)
fa2<-fa(fa.data2,nfactors=2,rotate="varimax",fm="ml")
print(fa2)
write.csv(fa2$loadings,"人事データの因子負荷量varimax回転.csv")

#因子分析(プロマックス回転)
fa3<-fa(fa.data2,nfactors=2,rotate="promax",fm="ml")
print(fa3)
write.csv(fa3$loadings,"人事データの因子負荷量promax回転.csv")

#因子分析:因子得点
fa1$scores
fa2$scores
fa3$scores
write.csv(fa3$scores,"因子得点プロマックス.csv")

#バイプロットの描画
par(mfrow=c(1,2))
# biplot(点, ベクトル)
biplot(fa2$scores,fa2$loadings, cex=0.5, main="Varimax")
abline(h=0, v=0)

# biplot(点, ベクトル)
biplot(fa3$scores,fa3$loadings, cex=0.5, main="promax")
abline(h=0, v=0)

 ふ〜!

 なかなか奥が深い。

 以上