
Exploratoryではアナリティクスの機能としてK-Meansクラスタリングをサポートしていますが、バージョン15からサポートされたカスタムチャート(Rコード)の機能を使うことで、UIではサポートされていない階層クラスタリングを実行し、樹形図(デンドログラム)として結果を確認することができます。
顧客やアンケートの回答者などをグループに分けて、それぞれの特徴を理解したい方にお役立ていただける機能です。
ExploratoryのアナリティクスでサポートされているクラスタリングはK-Meansクラスタリングであり、あらかじめいくつのグループに分けるかを決めておく必要があります。分けるグループの数を後から決めながら分析を進めたい場合や、階層クラスタリングを実行したい場合にどうすればよいかがわかりません。
クラスタリングとは、データを分析したり活用したりしていく中でよく使われるアプローチの1つで、データの中の固有な構造を見つけて共通な部分を持つグループにデータを分類するというものです。
例えばお客様のデータであれば、サポートを重視しているお客様、価格を重視しているお客様、コスパを重視しているお客様といったように、顧客に固有な構造を見つけてグループに分けることができれば、それぞれのグループに合ったコミュニケーションを取ったり、施策を打ったりすることができるようになります。

クラスタリングの中にもいくつかのアプローチがあり、大別すると階層型のクラスタリングと非階層型のクラスタリングがあります。

階層クラスタリングは、最も似ている2つの観察対象をまとめ、次に似ているものをまとめ、という形で段階的にグループをまとめていくアプローチを取ります。そのため最終的にいくつのグループに分けるかを後から決められるという特徴があり、また結果にランダム性がないという特徴もあります。
一方で計算のアプローチ上、行数の多いデータには向かないという特徴もあります。対してK-Meansクラスタリングに代表される非階層クラスタリングは、あらかじめいくつのグループに分けるのかを決めておく必要があり、その上でどこにグループの境界線があるのかを計算で探します。計算が非常に速いため大規模なデータの処理が得意である一方、結果に少しランダム性があるという特徴があります。
階層クラスタリングを行うときによく使われるのが、樹形図(デンドログラム)と呼ばれるアウトプットです。

X軸に表示されている1つ1つが観察対象、今回のデータでいえば回答者を表しており、高さは対象同士の距離を表しています。
例えば一番左の2つの回答者IDが底の部分で交わっていれば、その2人の距離はほとんどなく、回答が全く同じか非常に近いものであることがわかります。

一方で高さ1のあたりで交わっている2人であれば、回答に少しだけ違いがあることが読み取れます。

上に上がっていけばいくほど統合される人の数は増えていきますが、その分だけ距離は離れていくという読み方をします。
この樹形図をもとに、3つのグループに切る、5つのグループに切るといった形でクラスターの数を後から決めることができ、クラスターの数を増やすほど下の方で、減らすほど上の方でグループ分けが行われます。

Exploratoryでは現時点でUIの中では階層クラスタリングをサポートしていませんが、バージョン15からサポートされたカスタムチャート(Rコード)を使うことで、Rのコードを入力して階層クラスタリングの結果を描画することができます。さらに計算を作成のステップから同じようにコードを入力すれば、実際のデータにクラスターの情報を列として追加することもできるため、レーダーチャートなどを使って各クラスターの特徴を可視化することも可能です。
1行が1人の回答者を表し、列には回答者IDや属性の情報、そして価格満足度から配送満足度までを5段階で評価した数値の列を持つアンケートのデータを利用します。クラスタリングにはこれらの満足度の数値列を利用します。

まずは階層クラスタリングを実行して、樹形図(デンドログラム)で結果を確認していきます。
チャートビューに移動して、タイプのところにカスタム(Rコード)のチャートを選択します。

Rのコードを入力する画面が表示されたら、階層クラスタリングを実行するためのコードを入力します。なお、カスタムチャートにおいては、データフレームを指定するときに今開いているデータしか扱えないという点と、今開いているデータはドルマークを使った
${DATA}
という記法で表現しなければならないという点が注意点になります。
今回は以下のコードを利用します。距離の計算にはユークリッド距離を、まとまりのまとめ方にはウォード法を利用しており、それぞれのオプションについてはコメントとして記載しています。
# ${DATA} は現在開いているデータフレームを指す特別な記法です。
df <- ${DATA}
# クラスタリングに使う数値列を1つずつ指定します。
# (不要な列を外したい、別の列を加えたい場合は、この一覧を編集してください)
mat <- df %>% select(
価格満足度,
品質満足度,
サポート満足度,
デザイン満足度,
配送満足度
)
# ■ オプション: 単位やスケールが違う列を混ぜる場合
# 「満足度(1〜5)」と「利用金額(円)」のようにスケールが大きく異なる列を
# 一緒に使うと、値の大きい列だけで距離が決まってしまいます。
# その場合は下の行のコメントを外して標準化(平均0・標準偏差1に揃える)してください。
# 今回はすべて1〜5の満足度スコアなので標準化は不要です。
# mat <- scale(mat)
# 回答者どうしの距離を計算します。method は距離の測り方の指定で、
# "euclidean"(ユークリッド距離)は各項目の差の大きさをそのまま距離として扱う、最も一般的な方法です。
# 他の選択肢:
# "manhattan" … 各項目の差の絶対値の合計。外れ値の影響を受けにくい
# "maximum" … 最も差が大きい項目だけを距離とする(チェビシェフ距離)
# "minkowski" … ユークリッドとマンハッタンの一般化。dist(mat, method = "minkowski", p = 3) のように p で調整
# "canberra" / "binary" … も指定可能
d <- dist(mat, method = "euclidean")
# 階層クラスタリングを実行します。method は「まとまりのまとめ方」の指定で、
# "ward.D2"(ウォード法)はグループ内のばらつきが小さくなるようにまとめる方法で、
# 大きさの揃った解釈しやすいグループができやすい定番の手法です。
# 他の選択肢:
# "complete" … 最も離れたペアの距離を基準にする(最遠隣法)。コンパクトなグループができやすい
# "average" … すべてのペアの距離の平均を基準にする(群平均法)。中庸な方法
# "single" … 最も近いペアの距離を基準にする(最近隣法)。細長くつながりやすい
# "centroid" / "median" / "mcquitty" … も指定可能
# ※ "ward.D2" はユークリッド距離を前提とする手法です
hc <- hclust(d, method = "ward.D2")
# デンドログラムのX軸に表示されるラベルを、回答者IDに差し替えます。
# ※ rownames(df) <- df$回答者ID では効きません。
# Exploratoryのデータフレームは tibble のため行名を保持できず、
# さらに select() を通した時点で行名が落ちるので、ラベルが 1,2,3... の連番になります。
# hclust の結果(hc$labels)に直接入れるのが最も確実な方法です。
hc$labels <- as.character(df[["回答者ID"]])
# ■ オプション: 別の列をラベルにしたい場合
# 「誰か」ではなく「どんな人か」で見たいときは、下のように他の列を使えます。
# hc$labels <- as.character(df[["セグメント"]])
# 複数の情報を組み合わせることもできます(例: R082_品質重視)。
# hc$labels <- paste(df[["回答者ID"]], df[["セグメント"]], sep = "_")
# 日本語ラベルの文字化けを防ぐため、フォントを指定します。
# 下記の "HiraKakuProN-W3" は Mac 標準のヒラギノ角ゴです。
# Windows の場合は "MS Gothic" や "Yu Gothic" など、お使いの環境にある日本語フォント名に変更してください。
par(family = "HiraKakuProN-W3")
# デンドログラム(樹形図)を描画します。
plot(hc,
hang = -1, # 各ラベルの高さを一番下に揃えて見やすくします
main = "階層クラスタリング", # グラフのタイトル
xlab = "回答者", # X軸のラベル
ylab = "併合距離", # Y軸のラベル(グループが結合された距離。高いほど性質が離れています)
sub = "", # 左下に出る "hclust (*, ward.D2)" の表示を消します(残したい場合はこの行を削除)
cex = 0.8) # ラベルの文字サイズ
コードを入力したら「ビュー」をクリックすると、階層クラスタリングの実行結果が樹形図(デンドログラム)として表示されます。

次に、樹形図の上でグループの区切りを表示していきます。
樹形図の上でクラスターを四角い枠で区切るには、コードの一番下に
rect.hclust という関数を追加します。
クラスターの数はこの関数の k
という引数で指定するため、3つに分けたい場合は k
に3を指定します。どこで切るかは、Y軸の併合距離が大きくジャンプしている位置を目安に決めます。

クラスターの数を5つに変更したい場合は、k
に5を指定して「ビュー」をクリックすると、5つのクラスターに分かれた樹形図が表示されます。クラスターの数を増やせば増やすほど下の方で、減らせば減らすほど上の方でグループ分けが行われます。

樹形図だけでは1つ1つのクラスターの特徴まではわからないため、実際のデータにクラスターの情報を追加していきます。
「ステップを追加」から「計算を作成」の「1つの列」を選択します。

計算を作成するダイアログが表示されたら、階層型のクラスタリングを実行するコードを入力し実行します。

ここでは距離の計算に使う列を pick 関数で指定して
dist 関数に渡し、hclust関数
でウォード法による階層クラスタリングを実行します。
その結果を cutree
に渡すことで、それぞれの行がどのクラスターに属するのかという情報を取得します。クラスターの数を指定する
k
は、カスタムチャートのときと同じように3にしておきます。
これで樹形図で見えていたクラスターの情報を、実際のデータに列として付与できました。

なお、クラスターの列はデフォルトでは数値として返ってくるため、凡例の上でクラスター1、2、3という順番に並べられるように、順序を持つカテゴリー型に変換します。
「クラスター」列のヘッダーメニューから「データタイプを変換」の「ファクター型に変換」を選択し、実行します。

これでクラスターの順序を設定できます。
最後に、クラスターごとの特徴を可視化していきます。
チャートビューで新しいチャートを作成し、タイプのところにレーダーチャートを選択します。
値に「価格満足度」、「品質満足度」、「サポート満足度」、「デザイン満足度」、「配送満足度」を選択し、集計関数がデフォルトでは合計になっているため、すべて平均値に変更します。

色で分割に、今回作成した「クラスター」の列を選択します。

これで各々のクラスターの特徴が見えてきます。例えばクラスター2はデザイン満足度がすごく高く、品質満足度に対しての平均的なスコアも高いことがわかります。
またクラスター3は品質満足度やサポート満足度、デザイン満足度が他のクラスターと比べると低いこと、クラスター1はどの項目を見ても2番手あたりに位置する平均的なクラスターであることが読み取れます。
これで階層クラスタリングを実行して、クラスターごとの特徴を可視化することができました。