[連載]フリーソフトによるデータ解析・マイニング第25回

Rと因子分析

 1.因子分析とは

  因子分析(factor analysis)は、多くの変数により記述された量的データの分析方法として、1904年にスピアーマン(Spearman)によって提案された。
  因子分析で扱うデータの形式は主成分分析と基本的には同じであることから、同じ場面に利用されることが多いが、手法の開発の出発点は全く異なる。
  主成分分析では、変数の間の相関関係を用いて、無相関の合成変数を求めることで多くの変数を少ない変数に縮約するが、因子分析は、変数の間の相関関係から共通因子を求めることで、多くの変数を少数個の共通因子にまとめて説明することを目的としている。
因子分析は、観測データにおける変数の間の関連成分をまとめたものを共通因子(common factor)と呼び、他の変数と関係がなく、その変数のみ持っている成分を独自因子(unique factor)と呼ぶ。因子分析では、観測データはお互いに関連性を持っており、共通因子と独自因子に分解できることを前提としている。
例えば、表1のような観測データが図1に示すように 個の共通因子と独自因子により構成されたとすると、式1のようなモデルで表現できる。

   
表1 データ行列Xm×n
    x1 x2 xj xn
個体1 x11 x12 x1j x1n
個体2 x21 x22 x2j x2n
個体i xi1 xi2 xij xin
個体m xm1 xm2 xmj xmn
setumei

図1 因子分析モデル

xi1=a11fi1+a12fi2+…a1kfik+ei1
xi2=a21fi1+a22fi2+…a2kfik+ei2
    ・・・
xij=aj1fi1+aj2fi2+…ajkfik+eij (式1)
    ・・・
xin=an1fi1+an2fi2+…ankfik+ein
    i=1,2,・・・,m

 式の中のfikを共通因子fkの個体iの因子得点(factor score)と呼び、共通因子の係数を因子負荷量(factor loading)と呼ぶ。表2に因子負荷量、表3にそれに対応する因子得点を示す。

   
表2 因子負荷量行列An×k
   因子負荷量
第1 第2 第k
xi1 a11 a12 a1k
xi2 a21 a22 a2k
xij aj1 aj2 ajk
xin an1 an2 ank
  i  
表3 因子得点行列Fm×k
   因子得点
第1 第2 第k
個体1 f11 f12 f1k
個体2 f21 f22 f2k
個体i fi1 fj2 fjk
個体m fn1 fn2 fnk

 因子分析では、式1からAn×kFn×kを求めるのが主な課題である。式1の左側は観測・測定によって得られたデータで、右側は共通因子と因子負荷量の線形結合に独自因子を加えている。右側の各要素を求めることは比較的に複雑であり、何らかの条件の仮定が必要である。異なる仮定のもとでいくつかのアルゴリズムが提案されている。その中で最も広く用いられているのは主因子法(反復法)と最尤法である。主因子法は安定した結果が得られるが、データが正規分布に従うときには最尤法を用いた方がよいと言われている。しかし、最尤法はセンシティブすぎて初心者にとっては主因子法より扱いにくい。
 異なるアルゴリズムで計算された因子負荷量、共通因子は、異なる仮定と条件の下での推測値であるので、返された結果を断片的に比較することはナンセンスである。
 因子分析では、分析の便利のため、因子軸を回転して用いる。回転方法は多数提案されているが直交回転と斜交回転に分けられる。直交回転にはバリマックス回転、バイコーティマックス回転、コーティマックス回転、エクィマックス回転などがあり、斜交回転にはプロマックス回転、コバリミン回転,バイコーティミン回転、コーティミン回転などがある。
 多く使用されている直交回転方法はバリマックス(varimax)回転で、斜交回転方法はプロマックス(promax)回転である。
 因子分析における因子負荷量の推定、因子得点の推定、因子軸の回転は、それぞれ多くの方法が提案され、方法によって得られた結果がそれぞれ微妙に異なることが初心者に困惑を与えている。

 2.Rの因子分析関数

 Rには最尤法による因子分析の関数factanalが実装されている。

factanal(x,factors,rotation,scores,…)

 引数のxはデータセットで、factorsは求める因子の数である。因子の数は解析を行う際に指定しなければならない。因子の数の値が不適切でエラーメッセージが返される際には、メッセージの内容に沿って因子の数を調整し、再実行すればよい。主成分分析で考察を踏まえて因子の数を決めるとエラーメッセージを回避することができる。
 主成分分析の解を求めるアルゴリズムは最尤法による因子分析より柔軟性があるので、因子分析を行う前に主成分分析を試みるのが良い。これは主成分分析の結果と因子分析の結果を比較しながら分析を進める上でも意味がある。また、関数factanalのように因子分析を始める初期段階に因子の数を決めなければならない場合は、主成分の固有値が因子の数を決める1つの情報となる。通常因子分析の因子の数は、相関行列を用いた主成分分析と同じく固有値の値が1以上の数を用いる。
 引数rotationではバリマックス(varimax)回転とプロマックス(promax)回転を指定することができる。デフォールトには、直交回転“varimax”になっている。
 引数scoresでは、因子得点を求める方法として、回帰方法(regression)とバートレット法(Bartlett)の中から1つ選択する。デフォールトには“none”になっているので、特別な方法を指定しないと、因子得点は求めない。
 関数factanalが返す主な値を次に示す。

 $loadings 因子負荷量
 $correlation 相関係数
 $factors 求めた因子数
 $STATISTIC カイ2乗値
 $dof カイ2乗決定の自由度
 $PVAL カイ2乗統計量のP値

 ここのカイ2乗検定統計量は、元のデータの分散と指定した共通因子のモデルに基づいて求めたデータの分散との間の有意差に関する検定統計量である。この検定統計量は、探索的に因子分析を行う際の因子の数を決める際の1つの参考材料となる。
 具体的なデータの例を用いてその使用法と読み方について説明することにする。
 進路指導・職業指導に用いる職業適性検査方法として「厚生労働省編一般職業適性検査」がある。この適性検査は、 アメリカ合衆国労働省が開発したGATB(General Aptitude Test Battery)を原案とし、昭和27年から改良を加えながら職業指導・進路指導のために用いている検査法である。進路指導・職業指導の検査は、表4に示す項目により構成されている紙筆検査と、指先の器用さ・手腕の器用さを検査する器具検査に分かれている。その詳細については次のサイトで公開されている。
 http://www.jil.go.jp/institute/seika/Toppage_000.htm

表4 進路指導・職業指導の検査項目
検査1 円打点検査(円の中に点を打つ検査)
検査2 記号記入検査(記号を記入する検査)
検査3 形態照合検査(形と大きさの同じ図形を探しだす検査)
検査4 名詞比較検査(文字・数字の違いを見つける検査)
検査5 図柄照合検査(同じ図柄を見つけだす検査)
検査6 平面図判断検査(置き方をかえた図形を見つけだす検査)
検査7 計算検査(加減乗除の計算を行う検査)
検査8 語意検査(同意語かまたは反意語を見つけだす検査)
検査9 立体図判断検査(展開図で表された立体形を探しだす検査)
検査10 文章完成検査(文章を完成する検査)
検査11 算数応用検査(応用問題を解く検査)

 本稿では、柳井ら(参考文献[1])が用いた表4の11項目に対する50人の被験者の紙筆検査データを借用する。データは次のサイトからダウンロードすることができる。
 http://www1.doshisha.ac.jp/~mjin/data/
 データはxls形式になっているので、データシートのみをcsv形式に保存する手続きが必要となる。CATB50としてRに読み込み、次のようなコマンドで因子分析の関数を実行することができる。

>(CATB50.fa<-factanal(CATB50,factors=4,scores = "Bartlett"))

コードの結果

 ここでは、因子の数を4にしているが、これは試行錯誤の結果である。ちなみに、因子の数を7以上にすると因子の数が多すぎるというエラーメッセージが返される。
 返された結果の最下部には、元のデータの分散と因子分析モデルによる推測データの分散とのカイ2乗検定統計量のp値(0.846)がある。因子の数を2(factores=2)にすると、カイ2乗検定統計量のp値は0.05より小さく、5%有意水準でデータの分散と因子分析モデルによる推測データの分散が等しいという帰無仮説が棄却される。因子を3つにすると帰無仮説は棄却されないが、累積寄与率が50%にもならないので、ここでは4因子を用いている。
 説明の便利のため、第1〜4の因子負荷量の棒グラフを図2(a)〜(d) に示す。次に図2(a)の作成コマンドのみを次に示す。

>barplot(CATB50.fa$loadings)

図2 因子負荷量の棒グラフ

第一因子
(a)

第二因子
(b)

第三因子
(c)

第四因子
(d)

 図2(a)で分かるように、第1因子の中で値が大きいのは「文章完成」、「語意」、「名詞比較」「図柄照合」の順である。前3者は言語能力と関わりのある項目であるので、この因子は「言語能力」であると考えられる。しかし、「図柄照合」は「言語能力」と解釈できるかに関しては筆者の知識の範囲を超えている。
 このように、第2因子は空間判断能力、第3因子は計算能力、第4因子は運動能力と解釈することができる。ただし、第4因子の運動能力は、「眼と手または指を共応させて、迅速かつ正確に作業を遂行する能力。眼で見ながら、手の迅速な運動を正しくコントロールする能力」を指す。
 因子分析では、複数の因子負荷量を散布図に表して考察を行う。分析の便利のため因子回転を行うが、上記の因子分析のコマンドには回転の指定を行っていないので、返された結果はデフォールトで設定されているバリマックス回転の結果である。
 次に第1,2因子負荷量の散布図のコマンドを示し、その結果を図3(a)に示す。同じの方法により作成した第3、4因子負荷量の散布図を図3(b)に示す。

>plot(CATB50.fa$loadings[,1:2],type="n")
>text(CATB50.fa$loadings[,1:2],colnames(CATB50))

図3 因子負荷量の散布図

第1,2因子負荷量の散布図
(a)
第3,4因子負荷量の散布図
(b)

 このような散布図では、各因子のみではなく、因子間の相互作用についても考察することができるので便利である。例えば、図2(c)では、「算数応用」は、「計算能力」という因子にまとめているが、図3(b)の散布図では「計算」と「文章完成」との中間に配置されていることから、この両変数に関連があると解釈される。
 被験者がどのような能力を持っているかに関しては、因子得点で読み取れる。第1因子得点の値が大きい方は、言語能力が優れていると判断される。念のためにそうであるかどうかを、元のデータと照合して確かめることを勧める。因子得点も因子負荷量のように散布図を作成し、因子負荷量と対応させ、個体の特徴を分析することができる。次に第1、2因子得点の散布図を作成するコマンドを示し、その結果を図4(a)に示す。第3、4因子得点の散布図は紙面上の都合により省略する。

>plot(CATB50.fa$scores[,1:2],type="n")
>text(CATB50.fa$scores[,1:2],rownames(CATB50))

因子得点の散布図

図4 因子得点の散布図

 図4では、個体1、49が第1因子の右、かつ第2因子の中間に位置している。第1因子が「言語能力」であるので、この被験者は言語能力に優れていると判断することができる。
 4つの因子でデータCATB50をモデル化した場合、元のデータが持つ情報のどのぐらいを説明できるかに関しては、累積寄与率と独自因子の推測値から読み取られる。この例における、累積寄与率は0.561(56.1%)である。これは、データが持つ情報の56.1%しか、モデルが説明できていないことを意味する。
 返された独自因子(Uniquenesses)の値の平均値に累積寄与率を加えると近似的に1になる。よって、独自因子の推測値の分析で、どの変数に独自因子が強いかに関する分析が可能である。ちなみに、この問題では、変数A、B、Cの独自因子が0.5を超えているので、これらの変数は共通因子で説明できない情報が半分を超えていると言える。
 因子分析は、人間の知能・能力・行動・心理・個性のような客観的に精密計測が困難な問題において、何らかの手段で収集した内因と外因に影響されやすいデータの分析に多く用いられている。因子分析は、若干粗いデータの中から妥当と思われる情報をどう見つけ出すかという側面で発展し続けている。しかし、主成分分析などで、得られない知識が、因子分析によって驚くべき新しい発見ができることはほとんど期待できないであろう。
 既に述べたとおり、因子分析は、多くのバリエーションがあり、かつどの方法でも解が決定的、不変的のものではない。例えば、本稿で用いたデータCATB50について、因子の数を換えるだけでも、返された結果が異なる。因子の推定方法、因子の回転方法が異なると返された結果が似ても似つかないケースもある。
 よって、得られた結果について分析を行うときには、主観的な考えに解析の結果を恣意的に合わせるのではなく、探索的に様々のアルゴリズムによる因子分析を繰り返し、客観的に意味付けし、その解釈が多くの方々の納得と支持を得るものでなければならない。
 因子分析の初心者にとっては、多義性が比較的に少ない主成分分析や対応分析などの方法を兼用して、因子分析を行うことが賢明であろう。
 Rに実装されている因子分析の関数factanalは使い勝手が良くない。例えば、引数factorsを指定しないと、プログラムが実行されない。これは初心者にとっては非常に不便である。群馬大学青木繁伸教授は、引数factorsの指定を省略すると理論的に最も多い因子数が仮定され、結果を返すプログラムfactanal2を次のサイトで公開している。
 http://aoki2.si.gunma-u.ac.jp/R/factanal2.html  また、慶応義塾大学渡辺利夫教授が作成したS言語用の主因子法のプログラム(参考文献[2])が次のサイトで公開されている。このプログラムはRで問題なく作動する。プログラムは、因子負荷量を求めるfactor1と因子得点を求めるfscoreに分かれている。factor1では、データの相関行列を用いるようになっている。
 http://web.sfc.keio.ac.jp/~watanabe/adstat10.htm#1
  返された結果の因子の回転はRに実装されている関数varimax、promaxを用いればよい。

参考文献
[1] 柳井晴夫・高木廣文編著(1993):多変量データ解析ハンドブック、現代数学社
[2] 渡辺利夫(1994):使いながら学ぶS言語、オーム社