Exploratoryでカスタムコマンドを使って因子分析を行う方法

現在、2020年2月20日時点では、因子分析(Factor Analysis)はExploratoryの中では直接UIよりサポートされていません。

しかし、Exploratoryのユーザーの方であれば多くの方が知っていると思いますが、ExploratoryはRのUIです。ということはRでできることは、基本的には何でもできてしまいます。

そしてもちろん因子分析もカスタムのスクリプト、もしくはコマンドを使うことでできます!

2つの方法があるのですが、まずはそもそも因子分析をRでやるにはどうするかを確認してから、その後それぞれの方法を説明します。

このノートでは因子分析のやり方のみにフォーカスしています。因子分析とは何かという話はしません。

Rで因子分析をやるには

まずは、因子分析をRで行うには以下のようにfactanalという関数を使って因子分析のモデルを作ることができます。

fa_model <- factanal(df, factors = 3)

そしてこのできたモデルから必要な情報を取り出すことになります。

print(fa_model)

例えば、こちらに都道府県別の女性の時間の過ごし方に関するデータがあります。

このデータを使って因子分析をやるには以下のように書くことになります。

# 都道府県の列を外したデータフレームを作る。 
df <- japan_prefecture_1 %>% select(-pref_name)

# 因子の数を3、回転法(rotation)にバリマックス回転(直行回転)を選択して因子分析のモデルを作成。
fa_model <- factanal(df, factors = 3, rotation="varimax")

# モデルからサマリ情報を取り出す。
print(fa_model, cutoff=0)

factanal関数は回転法に以下のものをサポートしています。

  • 直行回転 (varimax / バリマックス回転) - 因子間の相関を仮定しない
  • 斜行回転 (promax / プロマックス回転)- 因子間の相関を仮定する

以下が、実行した結果です。"Code"というボタンをクリックすると実際に実行されたコードが見れます。

# 都道府県の列を外したデータフレームを作る。 
df <- japan_prefecture_1 %>% select(-pref_name)

# 因子の数を3、回転法(rotation)にバリマックス回転(直行回転)を選択して因子分析のモデルを作成。
fa_model <- factanal(df, factors = 3, rotation="varimax")

# モデルからサマリ情報を取り出す。
print(fa_model, cutoff=0)
## 
## Call:
## factanal(x = df, factors = 3, rotation = "varimax")
## 
## Uniquenesses:
##      介護_看護_女           仕事_女           学業_女           家事_女 
##             0.910             0.843             0.959             0.989 
##           睡眠_女           育児_女         買い物_女 身の回りの用事_女 
##             0.902             0.005             0.694             0.005 
##      通勤_通学_女           食事_女 
##             0.138             0.956 
## 
## Loadings:
##                   Factor1 Factor2 Factor3
## 介護_看護_女       0.055   0.294   0.034 
## 仕事_女           -0.203  -0.061  -0.335 
## 学業_女           -0.067   0.178  -0.072 
## 家事_女            0.080  -0.067   0.000 
## 睡眠_女           -0.309  -0.016  -0.051 
## 育児_女            0.719   0.464  -0.514 
## 買い物_女          0.065   0.070   0.545 
## 身の回りの用事_女 -0.001   0.995   0.074 
## 通勤_通学_女       0.835  -0.110   0.390 
## 食事_女           -0.015  -0.119   0.172 
## 
##                Factor1 Factor2 Factor3
## SS loadings      1.369   1.362   0.869
## Proportion Var   0.137   0.136   0.087
## Cumulative Var   0.137   0.273   0.360
## 
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 17.01 on 18 degrees of freedom.
## The p-value is 0.523

Rで因子分析を行う方法が確認できたので、それでは実際にExploratoryの中でどうやって行うかを説明します。

以下の2つの方法があるので、順を追って説明します。

  • ノートにカスタムスクリプトを直接書く
  • データフレームでカスタムRコマンドのステップとして行う

A. ノートにカスタムスクリプトを直接書く

これを、ノートの中で実行するには、実は上記のコードをそのままコピペするだけです。

ノートを作る

新しいノートが作成されたら、Rのコードブロックをインサートします。

このコードブロックの中に先ほどのコードをコピペします。

以下のようになっているかと思います。

あとは、右の「リフレッシュ」ボタンをクリックするだけです。

すると以下のように結果が表示されるはずです。

B. データラングリングのステップとして行う

実はこの因子分析は「カスタムコマンド」を使うだけでも簡単にできてしまいます。

こちらのやり方のほうが個人的にはお薦めです。というのも、この場合Rのコマンドをステップとして実行することでデータフレームのデータとして作ることができ、ということはそのデータをチャートビューより簡単に可視化することができるからです。

ただ一つだけ、慣れないうちはちょっと混乱するかもしれないことがあります。

それは、このfactanal関数が返すモデルをどのようにデータフレームにするかというところです。

しかし、心配無用です。実はこれはRの世界ではすでに解決されていることなのです。それは、データフレームの列に入れちゃえ!というやり方でです。

そのためには、doという関数を使います。

それでは、すでに上記で見た因子分析のモデルを作るコマンドをこのdoという関数と一緒に使ってみましょう。以下がその例です。

do(fa_model = factanal(df, factors = 3, rotation="varimax")

上記で見たものと唯一違うのは、fa_modelの後が "=" であって、"<-" ではないという点です。このdo関数の中身は、factanal関数が返すモデルをfa_modelという列の中に入れるよということです。

これをデータラングリングのステップとして実行するのですがそのさいに2つほど注意が必要です。

1つ目は、それぞれのステップはその直前のステップを「データフレーム」として受け取ります。そこで、factanal関数の中であえてデータフレーム名を指定する必要はなく、その直前のステップのデータフレームという意味の、"." を以下のように指定してあげます。

do(fa_model = factanal(., factors = 3, rotation="varimax")

そして、2つ目ですが、この直前のステップから渡されるデータフレームがfactanal関数に渡したい列のみが入っている状態になっている必要があります。

直前のステップでそれらの列のみが選択されていることを確認する必要があります。

それでは、順を追って見ていってみましょう。

1. 列を選択する

この例では、"pref_name"という列のみをデータフレームから除きます。

2. カスタムRコマンドを使って因子分析モデルを作る

データが用意できたので、次にいよいよ因子分析モデルを作ります。

右側のステップの上にある"+ (プラス)" ボタンより、「カスタムRコマンド」を選びます。

そして、下記のコマンドをコピペします。先ほどと違うのは、因子得点を求めるために引数としてscoresregressionを指定しています。因子得点を求める方法として、回帰方法 (regression) とバートレット法 (Bartlett) から選ぶことができますが、何も指定しない場合は、因子得点は求められません。

do(fa_model = factanal(., factors = 3, rotation="varimax", scores="regression"))

実行すると、1つのlist型の列のみのデータフレームができあがります。これが因子分析のモデルが入った列です。

3. モデルから結果を取得する

もちろん、このままでは何なのか分けがわからないので、このモデルの列よりサマリ情報を取り出します。

ここでもまた「カスタムRコマンド」を使います。

今回は、model_info というモデルのサマリ情報をデータフレームの形にして返してくれる関数を使います。この "model_info" 関数の中でモデルの入っている列名を指定し、さらにoutputという引数にvariablesを指定することで因子負荷量が求められます。

実行すると、各変数ごとの因子負荷量がデータフレームとして返されます。

このように結果がデータフレームになっているので、後はこの結果を簡単に可視化することができます。

例えば以下は、散布図を使って、最初の2つの因子をそれぞれX軸とY軸に割当て、さらに変数名 (variable) をラベルにして表示したものです。

このモデルから因子得点の結果を取得したい場合は、model_info 関数のoutput という引数に data と指定することができます。

これにより、各変数ごとの因子得点をデータフレームとして返すことができます。

最後に、モデルの統計量に関する情報が知りたい場合は model_info 関数のoutput という引数に summary と指定することができます。

すると、以下のようなサマリ情報が得られます。