always one step forward

R で階層化クラスタリング

Rには多変量解析に使える関数がたくさん準備されていて、そのうち階層的(or 階層型 or 階層化)クラスタリングは hclust() で実施できる。「ウォード法で実施したデンドログラムの画像」と「どのデータが何番のクラスタか?のリスト」がほしかったので、自分用の関数を書いた。

dataset を文字列として扱うためには deparse(substitute(dataset)) が必要、という基本事項を RjpWiki で教えてもらいました。こういう集合知が充実しているので、基本事項が抜けた状態からさわっても、習得までのハードルがかなり低いと思う。感謝。


2012.2.28 追記:
距離行列の二乗を与える場合は、単に dist() を dist()^2 とすればよい

# with dist()
	hc <- hclust(dist(model.matrix(varset, dataset)), method= "ward")
# with dist()^2
	hc <- hclust(dist(model.matrix(varset, dataset)^2), method= "ward")
myhc <- function(varset, dataset, cluster_num) {
# Usage:
#  varset <- ~-1 +X+Y+Z
#  dataset <- datasetABC
#  cluster_num <- 5
#  myhc(varset, dataset, cluster_num)
# or
#  myhc(~-1 +X+Y+Z, datasetABC, 5)
# (Need to exist the dataset 'datasetABC' in advance)
	# clustering
	hc <- hclust(dist(model.matrix(varset, dataset)), method= "ward")

	# generating the plot with red rectangle
	charttitle <- paste("Cluster Dendrogram for Solution ", deparse(substitute(dataset)), "\n", 
                      "Method = Ward; Distance = Euclidian; Variables included = ", deparse(varset), sep="")
	plot(hc,
	     main = charttitle, 
	     xlab = "Observation Number", 
	     sub = "", 
	     hang = -1)
	rect.hclust(hc, k = cluster_num, border="red")
	dev.print(jpeg, 
	          filename=paste(deparse(substitute(dataset)), "_", cluster_num, ".jpg", sep=""), 
	          width = 800, height = 600)

	# adding cluster number for each data, and export ing to .csv
	hc.cl <- cutree(hc, k = cluster_num)
	write.csv(hc.cl, (paste(deparse(substitute(dataset)), "_", cluster_num, ".csv", sep="")), fileEncoding="SJIS")
}
  • dataset あらかじめ読み込んだデータセット
  • varset 使用する変数
  • cluster_num いくつに分けるか

という3つを指定して myhc(varset, dataset, cluster_num) を実行すると、

  • 800x600ピクセルの「(dataset)_(cluster_num).jpg」(下図が例)
  • データ番号とクラスタ番号がリストになった「(dataset)_(cluster_num).csv

という2つのファイルがRの作業ディレクトリに保存される。