クラスター前の下ごしらえ

このところ頭を悩ましていたのが,大規模データの分析。
デモグラフィック変数とか,複数の心理尺度などからなる調査データで,たくさんのデータはあるのだけど,どの角度からでも切り込めるというか,切ったら切っただけの解釈の仕方がある,というようなデータ。
よく言えば探索的,悪く言えば調査の設計が雑だったんだな。人の振り見て我が振り直せ,と言われてしまいそうだ。

ともかく,どこからどうやって手をつけたものか悩んでいた。従属変数は決まっているんだけど,独立変数が質的・量的にも色々ありすぎる。
まぁこういうときはクラスター分析で,ざっと回答者をグルーピングしてからやればいいや,ということになった。

さて,クラスターの数を決めるときは,mclustやpvclust(@takachikoさん,ご教示感謝します),clusterSim(@bob3bob3,ご教示感謝します)なんかがあるということで,色々やってみたのだけど,まぁうまくいかない!(笑)
理由は何かって,投入した変数が多すぎるんです。モデルフィットや情報量からクラス数を決めようにも,あまりにも計算量が多かったりするのでRがフリーズすることしばしば。出した答えが1componentとかだったら真実かも知れないけど放り投げられた感もあって。

そういう汚いデータの場合,コホネンの自己組織化マップなら何とかしてくれるかもしれない。と,分類させてみたら,これはまあソコソコうまく分類してくれるんだけども,これだって分類サイズ(第二層のユニット数)については何も教えてくれないわけで。マッピングしてみても変数が多すぎて,何でどう分類されたのやら。

という中で,今回思いついた方法。

  1. SOMで分類する第二層の数を数個〜数十個にして,とにかく「質量ごちゃ混ぜで分類するだけする」ことをして,
  2. 決定木やランダムフォレストで分類番号を従属変数とした分類をすると,分類に効いてる変数が見いだせる(ランダムフォレストのImportanceとか,決定木で最初に使われる分岐変数など)。
  3. 要はその他の「たくさんの変数」は分類に効き目がないってことだから,効いてる有効な変数(少数)に絞ってクラスタリングする。

という流れ。
SOMの実行はそれほど重たくならないし,収束したかどうかの判断も出来る。ユニット数を何パターンかやりながら,ランダムフォレストを使って「分類にもってこいの変数探し」をした。

これで使うべき変数を見つけてから,mclust,pvclust,clusterSimにお出まし願って,分類していけば良いのじゃないかというはなし。
クラスター分析前の下ごしらえとしての,一手法。まぁ素人が素人なりにもがいた結果といいましょうか。

これぞ,ザ・捨て多変量解析!

一応,簡単なコード。データのところなどはダミーにしてあります。

library(kohonen)
library(mvpart)
library(randomForest)
# 今回は4×4にしました。
result.som <- som(scale(data),
grid=somgrid(4,4,"rectangular"),rlen=5000)
plot.kohonen(result.som,type="change")
table(result.som$unit.classif)
# plot.kohonen(result.som,type="counts")
# plot.kohonen(result.som,type="codes")
tree.data <- cbind(data,result.som$unit.classif)
result.tree <- rpart(result.som$unit.classif~.
,data=tree.data,method="class")
plot(result.tree)
text(result.tree)
rfA <- randomForest(result.som$unit.classif~.
,data=tree.data,method="class")
rfA$importance
varImpPlot(rfA)

ちなみに,大山鳴動して鼠一匹といいましょうか,今回の結果一番効き目のあった変数は,態度尺度でもメディア接触頻度などでもなく,年収と勤務形態でした!
大事なことだよねぇ。心理尺度の値なんかよりも!(笑)