Rで因子分析→クラスター分析→クロス分析の流れをやってみる

せっかくこの前インターンでこういうことやってるんだよ(ってのの一部)を書いたので、今日はそれをどうやるかについて書いてみようかと思う。といっても自分ではよく分からなかったところもあったので、人力で質問してたりするわけですが。

ツールはいろいろあるわけですが、今回は「インターンが終わって会社のツールが使えなくなったとしても解析ができるように」ということを考えてRを使ってやることにしました。人力にもあるように例もR付属のやつでやってみます。ということでほとんど手間と費用をかけずに行けるはずです。というわけで人力にも載っているサンプルをそのままのせてみる。

# 使用するデータのロード
data(state)
# 使用データはstate.x77。50データ8変数。
state.x77
# 因子分析。因子数は指定しなければならないので、適当な数を入れてみて最適な数を決める。
factanal(state.x77, factors=2)
# 因子分析の因子得点(ここでは四因子)をres1に格納
res1 <- factanal(state.x77, factors=4, scores="Bartlett")$scores
# クラスター分析
res1.hc <- hclust(dist(res1))
# デンドログラム表示
plot(res1.hc)
# とりあえず四つに分類してみる
res1.cl <- cutree(res1.hc,k=4)
# この後の集計用に、new.x77 という名前で、state.x77データの最終列に分類結果をくっつけたものを作成
new.x77 <- cbind(state.x77, res1.cl)


樹形図はこんな感じ。

この分析の流れを使えば、クラスター分析のところまで行けます。で、どのクラスターに属するかでどう属性が違ってくるかとかをクロス分析を取って調べるわけですが、Rでクロス分析をする方法はあんまりよい感じのが載っていませんでした*1

というわけでクロス分析に関してはR以外のやつでやろうかと思います。無理にRばっかりでやって苦しむ必要もなかろうw。SPSSとかClementineとかツールはあるわけですがSPSSは大学のパソコンに入っているとしてもClementineとか某香田研でしか使えないと聞いたので、この辺はやめときたい。というわけで、わりとどこでも使えると思われるExcelでやりたいと思います。

で、Rで解析したデータをExcelに取り込まないといけないわけですが、どーもExcelで取り込むための「,」を区切り文字としたデータの出力が載ってない。というわけで自分で関数を作りました。出力したいデータのフォーマットはこんな感じ。

エクスポート用プログラム

で、Rのオブジェクトをこれに変換するためのスクリプト。

convert <- function(obj,file="output.txt"){
	out<-file(file,"w");
	
	#最初の行を出力
	writeLines(paste(""),out,sep=",");
	for(i in 1:dim(obj)[2]-1){
		writeLines(paste(dimnames(obj)[[2]][i]),out,sep=",")
	}
	writeLines(paste(dimnames(obj)[[2]][dim(obj)[2]]),out,sep="\n");

	#2行目以降の出力
	for(i in 1:dim(obj)[1]){
		writeLines(paste(dimnames(state)[[1]][i]),out,sep=",")
		for(j in 1:dim(obj)[2]-1){
			writeLines(paste(obj[i,][j]),out,sep=",")
		}
		writeLines(paste(obj[i,][dim(obj)[2]]),out,sep="")
		writeLines(paste(""),out,sep="\n")
	}

	close(out)
}

これなら、Excelで煮るなり焼くなり好きなようにクロス分析ができるようになりますね。

まとめ

インターンではあんまりR使ってないんですが、大学戻ってきてからはRを主に使うことになると思うので、これからもなるべくRに関するアウトプットは出していきたいなと思います。出せば誰か指摘してくれるかもしれないし。

Twitter見てる感じだとsatouさんもデータ解析が始まったようなのできっと解析系のアウトプットを出してくれることと思います。ええ、きっと出してくれることでしょうw。というわけで、とりあえず今日はこれで終わり。

Rによるやさしい統計学

Rによるやさしい統計学

*1:あったら教えてください。自分で探したやつは何かテクニカルな方法を使っていたのであんまりやりたくない。。