「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年12月10日改訂)。

MENU

Rによるデータサイエンス(05/21)

 Rについて

をベースに学んでいく。
 今回は因子分析(PP.74-84)を扱う。

6. 因子分析

 因子分析は変数間の相関関係を用いて共通因子にまとめ上げて分析を行う方法である。多数の変数があり分散共分散行列(または相関行列)が計算できる場合に利用する。実質的には主成分分析と同じことを行なっているものの、理論的には全く異なる。
 主成分分析は無相関の合成変数を求めることで多くの変数を少ない変数に縮約することを目的としていた。これに対して因子分析は変数間の相関関係から共通因子を求めることで多くの変数を共通因子にまとめて説明することを目的としている。

6.1 因子分析の基礎

 因子分析では観測データにおける変数間の関連成分をまとめたものを共通因子と呼び、これに対して他の変数とは関係なくその変数のみが持っている成分を独自因子と呼ぶ。因子分析では観測データはお互いに関連性を持っており、これらのデータは共通因子と独自因子とに分解できることを前提としている。
 変数(x_{i1},\cdots,x_{ik}),i=1,2,\cdots,nをもつn個のデータが観測されており、もとの各変数x_{i1},\cdots,x_{ik}


\begin{aligned}
\begin{cases}
x_{i1}&=\displaystyle{\sum_{j=1}^{l}a_{1j}f_{ij}}+u_{i1},\\
x_{i2}&=\displaystyle{\sum_{j=1}^{l}a_{2j}f_{ij}}+u_{i2},\\
&\vdots\\
x_{ik}&=\displaystyle{\sum_{j=1}^{l}a_{kj}f_{ij}}+u_{ik},\\
\end{cases}
\end{aligned}

というl\lt k個の共通因子で書けるものとする。このときf_{ik}を共通因子f_kの個体iにおける因子得点と呼び、共通因子の係数a_{ik}因子負荷量と呼ぶ。
 ベクトル表記すれば


\begin{aligned}
\boldsymbol{x}=A\boldsymbol{f}+\boldsymbol{u}
\end{aligned}

で与えられる。このとき


\begin{aligned}
\Sigma&=\mathbb{V}[\boldsymbol{x}]=A\Phi A^{\prime}+\Psi,\\
\Psi&=\mathbb{V}[\boldsymbol{u}]=\begin{bmatrix}
\sigma_1^2&0&\cdots&0\\
0&\sigma_2^2&\cdots&0\\
\vdots&\vdots&\ddots&0\\
\cdots&\cdots&\cdots&\sigma_n^2
\end{bmatrix}
\end{aligned}

である。母分散共分散行列\Sigmaは標本分散共分散行列Sを用いて推定する。したがって因子分析はデータから得た標本分散共分散行列SからA\Psiの推定値を求める問題に帰着する。データを標準化すれば、分散共分散行列は相関行列に置き換えることができる。
 独自因子が無ければ\Psiの推定が不要になるため、主成分分析と同等になる。
 因子分析ではいくつかのアルゴリズムが提案されている。そのうち頻用されるのは主因子法と最尤法である。最初のうちは前者の方が扱いやすい。

6.2 因子の回転

 因子分析では因子の解釈を容易にするため、高い相関を持つ項目を共通因子として新しい空間上の軸を決める操作を行う。これを因子軸の回転と呼ぶ。
 因子軸の回転では、①直交回転、②斜交回転に大別される。直交回転ではバリマックス回転、斜交回転ではプロマックス回転が良く用いられる。
 因子分析では、アルゴリズムが多数提案されており、パッケージやアプリケーションなどで結果が相違するため、複数の手法を用いて多面的に分析するのが望ましい。

6.3 Rによる分析結果

library("psych")
library("ggplot2")
library("ggsci")

# 再度irisを利用
data(iris)

# 因子数を検討:1つで良さそう
fa.parallel(x = iris[,-5])

# まずはfactanalで因子分析
lst_fa <- factanal(x = iris[,-5], factors = 1, rotaion = "varimax", scores = "regression")

# 主要な結果
lst_fa$correlation  # 標本相関行列
lst_fa$loadings     # 因子負荷量 
lst_fa$scores       # 因子得点
lst_fa$uniquenesses # 独自因子
lst_fa$STATISTIC    # カイ二乗統計量
lst_fa$dof          # カイ二乗決定の自由度
lst_fa$PVAL         # カイ二乗統計量のp値

# 因子負荷量を図示
df_loadings <- data.frame("factors" = names(lst_fa$loadings[,1]),"loadings" = lst_fa$loadings[,1])
g <- ggplot(df_loadings,aes(x = factors,y = loadings, fill = factors)) + geom_bar(stat = "identity")
g <- g + ggtitle("Factor Loadings")
g <- g + theme(plot.title = element_text(hjust = 0.5),legend.position = "bottom",
               legend.title=element_text(size = 7),
               legend.text=element_text(size = 7)) + scale_fill_nejm()
plot(g)

# 独自因子
lst_fa$uniquenesses # 独自因子

補足 スペック情報

エディション Windows 10 Home
バージョン 20H2
プロセッサ Intel(R) Core(TM) i5-1035G4 CPU @ 1.10GHz 1.50 GHz
実装 RAM 8.00 GB
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
R バージョン 3.6.3 (2020-02-29)
RStudio バージョン 1.2.5033
プライバシーポリシー お問い合わせ