Rmarkdownでクラスター分析をして、それからデンドログラムを書きたい話

久しぶりにRのお勉強をしました。忙しくって忘れていた「統計って楽しいですね」という感情を久々に思い出すことができました。コンソールにらめっこしてるの、時間があればいいですよね。ただ、基礎的な部分がお粗末すぎて時間がみるみる溶けていくので、やることが山のようにあるときはできませんが。

Rによるデータ駆動マーケティング

Rによるデータ駆動マーケティング

クラスター分析ですが、デンドログラムを表示させるのに、単純にplotで表示させるとRMarkdownでは不便です。

hoge.d <- dist(hoge) #hogeデータセットから距離行列hoge.dデータセットを算出
hoge.dendro <- hclust(hoge.d, method = "ward.D2") #ウォード法(Ward.D2)を指定して、hoge.dendroへ渡す。
plot(hoge.dendro, hang = -1, main = "ウォード法")  #デンドログラムの描画
rect.hclust(hoge.dendro, k=○) #四角で"k="で指定した数で分けるクラスタをマーキング

3行目のplot関数できちんとデンドログラムを表示することができますが、Rmarkdownの出力では、4行目のデンドログラム内のマーキングを表示することができませんでした。

f:id:rakugou:20190514215638p:plain

f:id:rakugou:20190514215516p:plain

rect(m[which[n]] + 0.66, par("usr")[3L], m[which[n] + 1] + 0.33, でエラー: plot.new has not been called yet

ちなみに、3行目と4行目を+でつないでもエラーが発生します。

f:id:rakugou:20190514215544p:plain

plot(hoge.dendro, hang = -1, main = "ウォード法") + rect.hclust(hoge.dendro, でエラー:
二項演算子の引数が数値ではありません

こういうRmarkdownでデンドログラムを表現するときに便利なのが、ggdendro関数です。

library(ggplot2)  
library(ggdendro)  
ggdendrogram(hoge.dendro, rotate = "FALSE", size = 2) #デンドログラムの描画  

f:id:rakugou:20190512215229p:plain

これでデンドログラムを書くことができました。ちなみに、rotate = "TRUE"とすると、デンドログラムが横向きになります。

次に、デンドログラムをggplot2の俎上に載せていきます。

d.hoge.dendro <- as.dendrogram(hoge.dendro) #分析結果をデンドログラムクラスとする  
hoge.plot <- dendro_data(d.hoge.dendro, type = "rectangle") #デンドログラム作成準備  
p <- ggplot(segment(hoge.plot)) #デンドログラムを作成  
+ geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) #セグメント(棒)のデータを描画  
p #デンドログラムをggplotで表示  

先程のものにクラスタの区切りを分かりやすくするために線を引きます。

p <- ggplot(segment(hoge.plot), mapping = aes(x = x, y = y, xend = xend, yend = yend)) #後ろのgeom_hogehogeにマッピング情報を継承するために書き方を変更している
+ geom_segment() #棒データ取得
+ geom_hline(yintercept = 180, linetype = "dashed", colour = "RED") #y = 180の"dashed"点線で赤色の直線を引く
p

f:id:rakugou:20190512215047p:plain

今回はy = 240になるように直線を引きました。クラスタを3つに分けているということが視覚的に分かりやすいですね。

参考資料

Rによるデータ駆動マーケティング

Rによるデータ駆動マーケティング

RPubs - ggdendroのテスト

RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−

RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−

Farewell to Low-tech: ggplot2で作図6:直線とテキストの入れ方