前の記事では、知能の一般因子「g」を扱いました。
これは、各テストのスコアを元にして、「全ての知能のベースをなす因子」を統計的に抽出することで得られる
……というのが前回のお話です。
しかし、この説明だけではイマイチ納得しきれない方も多いかと思います。
これを自分で計算してみたいと思う方もいるでしょう。
というわけで今回は、「g」の導出でも使われる「因子分析」を実際にやってみようと思います。
前提とするのは高校レベルの数学の知識と、基本的なパソコン操作のみです。
題材に実在のテスト点を使ってもいいですが、私の手元に丁度良いデータが無いので代用します。
今回はポケモンの種族値をデータセットとして使います。
1因子モデルとは
以前の記事で一度紹介した図示をまた出しましょう
この時には次のような図式で説明していました。
A君の国語の能力=A君の一般因子+A君の国語の特殊因子
まず、統計学の1因子モデルで使われる用語に合わせて、今回は使う言葉を少し変えます。
・一般因子→共通因子 common factor
・特殊因子→独自因子 unique factor
そして実は、前回の図式では簡略化していた部分がいくつかあります。
なので左辺も「成績(実測値)」を置かずに、「能力」というぼやかした書き方にしていました。
因子分析による1因子モデルでは、正しくは以下のように成績を説明します。
(A君の科目Xの成績)=(科目Xにおける共通因子の因子負荷量)×(A君の共通因子)
+(科目Xにおける独自係数)×(A君の科目Xの独自因子)
どこが違うか分かりますか?
まず、「共通因子(つまりg)」は全ての能力に同じくらい発揮されるわけではありません。
科目によって、「共通因子が点を左右しやすい科目」と「共通因子よりも独自因子の方が大きく影響する科目」があります。
ですから、「その科目には共通因子がどれくらい現れやすいか」を反映する係数が必要になります。
これが「因子負荷量」と呼ばれるものです。
(これは測定値の間の関係で言うと「相関係数」に相当する存在です)
「独自係数」の方は数式の都合で置かれるものだと思ってください。
統計的な扱い易さの問題で、「共通因子」と「独自因子」はともに「平均0, 分散1」で揃えることになっています。
このため、独自因子には係数を付けてスケール調整がなされます。
この「因子負荷量」と「独自係数」は科目ごとに決まるもので、人ごとには変わりません。
「共通因子」はそれぞれの人が値を持っていて、「独自因子」はそれぞれの人がそれぞれの科目ごとに値を持っているものです。
今から行う解析で出てくる値の意味が大体分かったでしょうか。
では、統計ソフトの方に参りましょう。
「R」をインストールする
さて、ここから自分で因子分析をやってみましょう。
何とか手計算でやり遂げる方法が無いか模索しましたが、結論から言うと無理でした……
パソコンの計算力に頼ります。
今回使うのは、お馴染みの統計ソフト「R」です。何と言っても無料なので助かる。
「RjpWiki」のトップ画面から「R のインストール」に進み、案内に従ってインストール。
ちなみに「R」の入門ページでは「RStudio」の導入を勧めてることも多いですが、とりあえずコマンドを写経して因子分析のお試し解析をする分にはどっちでもいいです。
今後もRを使うつもりがあって、アシスト機能が欲しい人にはオススメしときます。
ダウンロードページがちょい分かりにくいけど、このページの一番左を選んどけばオッケー。
「psych」パッケージ読み込みと関数の定義
「R」では、「パッケージ」と呼ばれる拡張機能で色々な統計解析を手軽に出来ます。
因子分析は心理学で頻用される手法であり、「psych」というパッケージの中に入っています。
Rを起動して最初に開くメモ帳みたいな画面で、以下のコマンドを打ち込んでください。
install.packages(“psych”)
※1 「パッケージって何?」というのを更に詳しく知りたい方はこちらの記事など参考に。
※2 psychの使い方についてもうちょっと色々知りたい方にはこんな記事もあります。
※3 大学からのアクセスで上手く行かない人にはこのトラブルシューティングが有効かも
これでpsychがインストールされたはず。(出来ない人は上の注とか参考に)
できたものとして話を進めます。
psychの中には因子分析(factor analysis)のセットが「fa」という名前で入っています。
パッケージpsychの中のfaを使って、今回利用する関数をmyfaとして定義します。
library(psych)
myfa<-function(X,m=1,…){fa(r=X,nfactors=m,fm=’m1′,rotate=’promax’,…)}
(色付きの部分は違う文字列でも良いです。以下同様)
これで、「分析する多変量データ(X)、因子数(m)を与えて因子分析を行う」ための関数が「myfa」という名前で定義されました。
データを用意する
次に、解析するためのファイルを用意します。
下に示した画像の様な感じで、
・一番上にラベル
・一行で一人のデータ
・一番左端に名前
・一列で一科目の点数
という感じに入力した表を作ってみて下さい。
ここですかさず私はポケモンの第一世代種族値表を取り出します。(※)
※このExcelデータは『理科系のトレーナー』様より、「ポケモンの種族値データシートの配布【第7世代】」の記事内で配布されているファイルからお借りして作成しました。
実は値の並べ方が違っても読み込みをいじれば良いっぽいのですが、今回はこれに倣ってください。
そして、今回「R」で読み込むためは「.csv」という形式でなければなりません。
Excelからcsvファイルに書き出しましょう。
Excelのメニューで
ファイル>エクスポート>ファイルの種類の変更>
と進んで、
「その他のファイルの種類」の中にある「CSV(コンマ区切り)(*.csv)」を選択して「名前を付けて保存」します。
保存場所はどこでも良いですが、後からその保存場所のパスを使うので、あまり深いところに入れると面倒です。
そして、このファイルをRで読み込みます。
「R」に以下のようにコマンドを打ち込んでください。
(今回の解析データに付けたい名前<-read.csv(‘ファイルのパス‘,header=TRUE,row.names=”name“))
例えば、私の場合はこの解析データ名を「pk1」にして、ファイルの置き場所は「マイドキュメントの中のポケモン解析フォルダの中の作業用暫定フォルダ」にして、さっきのcsvファイルの名前を「pkmn_1st_name.csv」にしていたので、以下のように打ち込みました。
(pk1<-read.csv(‘C:/Users/Kimra/Documents/PKMNStat/workspace/pkmn_1st_name.csv‘,header=TRUE,row.names=”name“))
以下のように出てきたら、ちゃんと読み込まれた証拠。
解析する
さあ、ここまで来たら最後の一息です。
読み込んだファイルを、さっき定義した関数で解析します。
(解析に付けたい名前<-myfa(データセットに付けた名前))
私と同じように名付ける場合は↓こうなります
(pk1_fa<-myfa(pk1))
エンターを押せば始まり始まり。
そーれ がっちゃんこ!
よし!よし!よしっ!
※上記の結果の簡単な読み方
MR1=因子負荷量 h2=共通性=因子負荷の2乗 u2=独自性=1-h2 SS loadings=因子寄与=因子負荷の2乗和
その他の値は今回の記事の説明に含まれていませんので、興味があれば参考図書など参照してみて下さい。
これで第1世代ポケモンの種族値から「”強さ”の共通因子」を取り出せたことになります。
「H」「A」「B」「C」「D」「S」のすぐ右側にある「負荷因子量」が「各々のパラメータが共通因子からどのくらい影響を受けているか」という指標値です。
これを見ると、「D(特防)」は他のパラメータに比べて「”強さ”の共通因子」の影響をかなり強く受けていることがわかります。
実は「特防」は初期作の「赤・緑」では存在せず、その後の後継作で後付けされたパラメータです。
ゆえに、今回解析に含めた第1世代のポケモンでは特防は「差別化するためのパラメータ」となっておらず、特防を後から設定する際に「このポケモンの強さはこのくらい」という相場に準じて無難な値を定めたのではないでしょうか?
あくまでこの話は仮説ですが、ちょっとした統計的な裏付けは取れます。
第2世代のポケモンで同様の解析を行うと、特防の負荷因子は0.63であり、第2世代ポケモンのその他のパラメータの負荷因子量とあまり変わらない値になるのです。
余談はここまでにして、今度はこの「”強さ”の共通因子」をポケモンごとに算出しましょう。
解析の名前$scores
で、各ポケモンから共通因子を取り出せます。
私と同じ名付け方なら↓こうなります
pk1_fa$scores
こんな感じで出てきます
ざっと見ると勘の良い方は分かると思うんですが、この結果では「Dの負荷因子が高い」ことに引っ張られて、「特防の高いポケモン」はやや過大評価される傾向が出ています。
もちろんこの解析は他にも色々に応用出来ます。
学校のテストの科目別成績はもちろんのこと、様々な要素を定量的にパラメータ化すれば、アニメのキャラクタや声優の声も因子分析の対象にすることは可能です。
ざっと最低限の処理を紹介したところで、今回はここまでにします。
興味のある方は以下のページや書籍も参考にして、他にも色々なもので解析をやってみてください。
この記事が一つのきっかけになれば幸いです。
おわりに
★ひとことまとめ
1. 「一般因子g factor」を求めるには「因子分析」という統計手法を使う
2. フリーの統計ソフト「R」がオススメ
3. 因子の抽出は様々なサンプルを使って出来る
オマケ:統計学の基礎から勉強したい人のために
人文系の学部生が基本的な統計概念を身に着けて因子分析までこぎつけたい場合
以下の順で押さえていくのがオススメです。
1.分散と標準偏差 https://bellcurve.jp/statistics/course/19361.html
2.共分散 https://mathtrain.jp/covariance
3.相関係数 https://mathtrain.jp/correlation
1-3(別ルート).平均値から相関係数まで一気にやりたい人はこのページ
https://sci-pursuit.com/math/statistics/correlation-coefficient.html
4.因子分析の考え方 http://www.f.waseda.jp/oshio.at/edu/data_b/08_folder/da08_01.html
5.因子分析の数学的説明 http://www.snap-tck.com/room04/c01/stat/stat17/stat1701.html#note01
ex. Rで因子分析を行っている他の記事(お好みでどうぞ)
https://qiita.com/yoshd/items/e322eecfb66ad5cd1a0a
https://mjin.doshisha.ac.jp/R/Chap_25/25.html
★参考文献等
・書籍
1. Earl Hunt: Human Intelligence (2010, Cambridge University Press)
2. 山田剛史, 杉澤武俊, 村井潤一郎: Rによるやさしい統計学 (オーム社, 2008/1/25)
3. 豊田 秀樹: 因子分析入門―Rで学ぶ最新データ解析 (東京図書, 2012/5/1)
・Webサイト(アクセスはいずれも2020/3/15)
「統計WEB」 https://bellcurve.jp/statistics/
「高校数学の美しい物語」 https://mathtrain.jp/
「Sci-pursuit.com」 https://sci-pursuit.com/index.html
「Personality Psychology Laboratory Waseda Univ」http://www.f.waseda.jp/oshio.at/index.html
山田剛史(著), 杉澤武俊(著), 村井潤一郎(著):
Rによるやさしい統計学.
オーム社, 2008/1/25
「Rの入門書」であると同時に、「統計学の入門書」としても適しています。
統計検定を受験するような人にはやや迂遠な勉強法かもしれませんが、最終的な目標が「自分でデータを統計解析する」ことであれば非常にオススメできます。
「統計概念の学習」と「統計処理の練習」が一挙に学べてしまうのは非常に効率的だと思います。
豊田秀樹(著):
因子分析入門―Rで学ぶ最新データ解析.
東京図書, 2012/5/1
めんどくさがりの人はこっちをどうぞ。
「因子分析が出来るようになるまでのステップ」としてはおそらく本書が最短ルート。
「先に因子分析のやり方を教わってから、理論的背景を後から補強していく」という珍しいスタイルで、理論面もやる気があればかなり勉強出来ます。
統計検定などの教材で統計学の基礎を一通り勉強している人が「とりあえず因子分析だけ理解するため」という感じで使う追加教材としても適しているかと思います。
★この研究会について
以下の書籍の輪読会をインターネット上にて定期開催しています。
Earl Hunt: Human Intelligence(2010, Cambridge University Press)
本記事は輪読会の内容を元に、メンバーのトークも盛り込んでサマライズしたものです。
トピックや話の流れは上記のテキストを踏襲していますが、内容は再解釈の上で大幅に加筆や再編を加えています。
なお、研究会に参加をご希望の方はこちらの記事をご覧ください。
この記事を書いた人
狐太郎
最新記事 by 狐太郎 (全て見る)
- AIサービスを活用した英文メール高速作成術 - 2023年3月28日
- 大学生・院生に便利なAIウェブサービスまとめ【2023年2月版】 - 2023年2月22日
- 「読書強者」が「速読」に価値を見出さない理由【隙間リサーチ】 - 2022年9月23日