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) を実行すると、
という2つのファイルがRの作業ディレクトリに保存される。