因子分析
主因子法による因子分析のプログラムを作成した。計算式は、<岡本安晴「心理学データ分析と測定」勁草書房>の第6章のものを用いた。プログラムとサンプルデータファイルは、まとめて圧縮ファイルFAPrg.zipとした。ダウンロード・展開すれば自由に利用できる。プログラムはPythonで書かれているが、Pythonの簡単な準備(インストール)の説明ウェブサイトを用意している。
上掲書のデータ表5.1.1を用いて説明する。
表5.1.1 6教科<国語、英語、歴史、数学、物理、化学>の100人の点数 (シミュレーションで作成) |
||
48 46 60 47 68 44 54 49 63 61 49 45 48 55 47 49 49 47 83 78 85 79 66 63 56 49 56 78 70 73 78 86 76 67 67 75 62 64 59 62 69 57 80 78 82 82 80 75 55 49 58 79 67 75 53 65 63 75 89 77 45 52 53 47 41 42 59 62 72 56 72 72 44 34 49 54 65 59 79 64 75 37 15 9 62 69 66 71 67 66 72 63 66 80 84 72 78 82 83 81 67 81 62 73 63 60 64 67 66 60 61 64 43 63 70 66 71 50 55 52 43 36 46 53 62 46 43 48 29 41 48 52 68 55 60 76 63 68 72 80 66 78 64 79 66 46 59 67 70 68 49 66 51 26 29 34 20 28 32 51 34 33 75 78 83 68 69 66 39 41 40 72 60 63 54 59 57 43 50 50 72 57 69 66 75 75 59 47 45 43 68 69 43 49 44 78 60 55 59 66 62 49 48 41 |
41 47 49 51 50 51 76 91 89 95 89 85 75 88 58 45 57 58 79 75 75 46 45 46 64 78 62 70 52 49 39 52 55 53 59 52 55 68 65 50 51 49 59 63 57 55 54 74 30 24 34 53 41 33 74 76 77 66 63 54 71 73 76 56 74 54 71 73 78 61 50 47 50 52 60 49 55 48 55 71 57 49 50 43 57 52 46 60 68 61 64 64 65 48 57 45 88
84 79 60 57 60 38 41 39 41 39 45 49 45 59 74 65 64 68 73 65 65 42 49 48 46 54 65 54 52 58 72 55 70 55 69 55 63 58 46 67 67 56 47 50 71 57 59 58 56 49 50 57 59 60 59 56 87 84 82 73 65 63 39 38 30 63 74 58 56 71 70 50 58 47 62 60 57 26 23 18 51 70 61 65 54 62 52 53 51 51 42 50 53 39 42 63 63 58 69 70 71 75 77 73 76 77 78 |
49 55 48 69 79 82 50 68 60 60 50 52 23 33 19 65 51 44 65 52 55 68 48 54 75 82 69 73 65 80 65 63 56 67 73 63 60 65 82 87 68 77 39 53 53 47 50 50 51 64 54 62 53 50 86 81 82 72 66 65 60 56 61 71 60 66 47 41 39 57 79 69 87 77 84 55 77 76 40 48 37 55 57 56 84 62 77 37 46 56 53 53 61 47 67 59 76 80 73 48 55 49 62 72 71 48 40 37 55 55 66 77 60 44 71 52 54 69 69 82 80 77 84 54 66 58 53 55 56 38 47 43 56 45 49 68 66 60 79 74 69 73 66 66 43 32 53 57 90 77 29 26 24 47 48 41 70 71 71 63 70 72 28 24 38 64 57 59 49 46 44 74 77 75 84 84 96 69 60 69 39 51 39 59 60 65 47 45 60 68 72 70 |
圧縮ファイルFAPrg.zipを展開して得られるフォルダ内のスクリプトファイルFA.pyを実行する。実行においては、ライブラリ(モジュール)numpy, matplotlib, pandas, xlrdが必要であるので、これらを予めpipコマンドなどでインストールしておく必要がある。例えば、
pip install
numpy matplotlib pandas xlrd
と実行する。
プログラムFA.pyを実行すると、図1のように入力ファイル名の設定が求められる。
図1
入力データファイルは、Excelファイルとして用意する(図2.a、図2.b)。
図2.a ファイル名Data511.xlsx
図2.b ファイル名Data511.xlsx
図2のExcelデータは、上の表5.1.1を打ち込んだものである。第1行目に変数名が入力されている。第2行目は、その変数を分析の対象とするかどうかを示すものである。1であれば分析の対象となるが、0であれば分析から除外される。図2では、第1列目の変数DataIDはデータの通し番号なので、0を設定して分析対象の変数から除外している。第2列目の変数[「国語」から第7列目の変数「化学」までは、すべて1が設定されているので、「国語」から「化学」までのすべての変数を対象として因子分析が行われる。用意した変数の一部の変数を選んで分析する例は、本ウェブサイトの後半で説明する。
図2のファイルを入力データファイルとして指定するときは、図3のようにファイル名Data511.xlsxを設定すればよい。Excelファイルなので、ファイル拡張子が「.xlsx」であることに注意。
図3
入力データファイル名を設定してEnterキーを押すと、次に計算結果の出力用テキストファイル名の設定が求められる(図4)。
図4
出力テキストファイルには、固有値や因子負荷量などが出力される。適当なテキストファイル名を設定するが、ファイル拡張子が「.txt」であることに注意。
出力ファイル名を設定してEnterキーを押すと、計算が始まる。
相関行列の固有分解が終了すると、スクリープロットが表示される(図5)。
図5
図5のスクリープロットのフォームを閉じると、因子の数の入力が求められる(図6)。図5で表示されている固有値も端末に出力されている。
図6
固有値のパターンを参考にして、2を設定してみる(図7)。
図7
2を設定してEnterキーを押すと、因子負荷量の初期値が算出される。その後、因子負荷量パターンの描画を行うかどうか聞いてくる(図8)。
図8
「xdim = 」に1より小さい整数を設定すると、このパターンの描画は行われない。
正整数を設定すると、各変数が、xdimとydimに設定した番号の因子の負荷量を横座標値、縦座標値とする点として描画される。因子の番号として大き過ぎる値が設定されたときは、可能な最大値が設定される。図9では、1と2が設定されている。
図9
「ydim = 」の値を設定してEnterキーを押すと、図10のように各変数に対して、指定した因子の負荷量を座標とする点がプロットされる。
図10
図10のウィンドウの右上のX印をクリックして閉じると、図11のように次の描画におけるxdimの値が求められる。
図11
別の組み合わせの描画を行うときは、それらの値を設定すればよい。初期値のパターンの描画を終えるときは、「xdim」に1より小さい整数値を設定する。
図12では、「xdim = 0」と設定している。
図12
図12の画面で、「xdim = 0」と設定した後、Enterキーを押すと、図12のようにVarimax回転後の因子パターンの描画について聞いてくる。
図12
設定方法は、先の初期値因子パターンの場合と同様である。図13のように設定してみる。
図13
図14のように、回転されたパターンが表示される。
図14
図14のウィンドウを閉じると、図15のように次のxdimの値の設定が求められる。
図15
図15のようにxdimに1より小さい整数値を設定すると、因子パターンの描画は終わる。続いて、プロマックス回転が行われ、その後、出力ファイルの保存が行われたというメッセージが表示されて、プログラムの実行終了となる(図16)。
図16
プログラムの実行終了後、出力ファイルを開くと、計算結果を見ることができる。
出力テキストファイルをPython IDLEのエディタで開こうとすると、図17のようなボックスが表示されることがある。
図17
このときは、図18のように「s-jis」と設定して「OK」ボタンをクリックすればよい。
図18
図2のデータの場合は、出力テキストファイルを開くと図19のようになっている。
図19
相関行列の出力において、上段の変数名の位置がずれているが、これは全角日本語文字が出力されているからである。全角日本語文字の出力が無い場合は、横位置の書式制御はプログラムで意図されている通りに行われる。図20のデータは、図2のデータにおいて変数名を半角の英字で表記したものである。
図20 Excelデータファイル(Data511en.xlsx)
図20のデータの場合の出力ファイルは図21のようになる。変数名の位置が正しく揃っていることが分かる。
図21
出力ファイルには、相関行列の固有値Lambdaも以下のように出力されている。
Lambda...
Lambd cum.sqr
%
Lambda-1 =
3.25276 3.25276 54.21
Lambda-2 = 1.86791 5.12067 85.34
Lambda-3 =
0.42494 5.54561 92.43
Lambda-4 =
0.20646 5.75207 95.87
Lambda-5 =
0.14753 5.89960 98.33
Lambda-6 =
0.10040 6.00000 100.00
これは、図5のスクリープロットの値である。
Varimax回転後のパターン行列の値は以下のように出力されている。ここで、「fctr.1」などは「因子1」などを表している。
Varimax rotation was applied...
Pattern for the Varimax rotated
factors =
fctr.1 fctr.2
国語 -0.15657 0.93158
英語 -0.10194 0.88480
歴史 -0.15142 0.91095
数学 -0.68624 0.16152
物理 -0.87605 0.06281
化学 -0.94958 0.14694
Sorted Pattern for Varimax rotation =
fctr.1 fctr.2
化学 -0.94958 0.14694
物理 -0.87605 0.06281
数学 -0.68624 0.16152
国語 -0.15657 0.93158
歴史 -0.15142 0.91095
英語 -0.10194 0.88480
これらの値は、図14に示されているものである。
出力テキストファイルの最後には、Promax回転後のパターン行列、因子間相関行列、構造行列が以下のように出力されている。
Promax rotation was applied...
Pattern for the Promax rotated factors
=
fctr.1 fctr.2
国語 -0.01992 0.93881
英語 0.02932 0.89851
歴史 -0.01775 0.91826
数学 -0.68336 0.06622
物理 -0.89417 -0.06349
化学 -0.95724 0.01259
Correlation matrix of the factors...
fctr.1 fctr.2
fctr.1 1.00000 -0.28331
fctr.2 -0.28331 1.00000
Sorted Pattern for Promax rotation =
fctr.1 fctr.2
化学 -0.95724 0.01259
物理 -0.89417 -0.06349
数学 -0.68336 0.06622
国語 -0.01992 0.93881
歴史 -0.01775 0.91826
英語 0.02932 0.89851
Structure Matrix
fctr.1 fctr.2
国語 -0.28589 0.94445
英語 -0.22524 0.89021
歴史 -0.27790 0.92329
数学 -0.70213 0.25982
物理 -0.87618 0.18984
化学 -0.96081 0.28378
因子分析においては、共通性の小さい変数を除いて分析するというように、用意した変数の一部を対象として因子分析を行うことも多い。また、変数全体に対する因子分析に基づいて下位尺度ごとのグループに分けて因子分析することもある。下位尺度単位の分析により、他の下位尺度の項目の影響を排除した因子分析が行える。なお、心理尺度の信頼性係数についてのウェブサイトも用意している。
以下では、文系の科目と理系の科目とに分けて因子分析を行う場合について説明する。
まず、「国語」、「英語」、「社会」の3教科に対して因子分析を行う。この3教科を選ぶために図A.1のように「国語」、「英語」、「歴史」の3教科の第2行には1を設定して、他の変数には0を設定する。
図A.1 ファイル名Data511_10.xlsx
プログラムFA.pyの実行時の入力データファイル名として、図A.1のファイル名Data511_10.xlsxを設定する(図A.2)。
図A.2
このとき、スクリープロットは図A.3のようになる。
図A.3
因子数として1が適していることが分かる。図A.3のフォームを閉じると因子数の入力が求められる。
因子数として1を設定する(図A.4)。
図A.4
因子数に1を設定すると、初期解のパターン行列のグラフが図A.5のように描かれる。
図A.5
因子数が1なので、X軸もY軸も同じ因子番号1を表し、各変数は対角線上にプロットされている。X軸あるいはY軸に1より大きい整数値を指定しても、1に修正されてグラフが描かれる。
図A.5の因子負荷量の値は、出力テキストファイルに以下のように出力されている。
Pattern matrix for the initial factors
fctr.1
communality
国語 0.94619
0.89527
英語 0.88847
0.78939
歴史 0.92294
0.85182
Varimax rotation was applied...
Pattern for the Varimax rotated
factors =
fctr.1
国語 0.94619
英語 0.88847
歴史 0.92294
回転後の因子負荷量も出力されているが、1因子解なので初期値と同じである。
次の理系の科目「数学」、「物理」、「化学」に対して因子分析を行ってみる。入力データファイルを図B.1のように用意する。
図B.1 ファイル名Data511_01.xlsx
3教科「数学」、「物理」、「化学」の変数のみ2行目に1が設定され、他の変数は0が設定されている。
プログラムFA.pyを実行して入力データファイルとして図B.1のファイル名Data511_01.xlsxを設定する(図B.2)。
図B.2
スクリープロットは図B.2のようになる。
図B.3
因子数は1であることが確認できる。図B.3のフォームを閉じると因子数の入力が求められる。
図B.4では因子数として1が設定されている。
図B.4
初期解のパターン行列のグラフが表示される(B.5)。
図B.5
因子数が1なので、X軸とY軸は同じ因子を表している。
プログラム実行終了後に出力テキストファイルを見ると、図B.5に表示されている因子負荷量が出力されている。回転後の負荷量も出力されているが、1因子なので同じ値である。
Pattern matrix for the initial factors
fctr.1 communality
数学 0.70031
0.49044
物理 0.87102
0.75867
化学 0.96586
0.93289
Varimax rotation was applied...
Pattern for the Varimax rotated
factors =
fctr.1
数学 0.70031
物理 0.87102
化学 0.96586