コピペでできる!クラスター分析(非階層型)

この記事は約4分で読めます。

非階層型クラスタ分析って何ができるの?

クラスター分析とは

クラスター(cluster)=「房」「集団」「群れ」
さまざまな特徴をもつものが混ざりあっているものの中から、似たものを集めて集団(クラスター)へと分類するという方法のことです。

小学校1クラスを、男女で分けてみたり、算数の点数区分で分けてみたり、世帯収入区分で分けてみたり、性格で分けてみたり・・。

商品を購入した人を、閲覧したページや他に見ているサイトの情報、性年代、他メディア接触状況、価値観・・・いろんな要素を掛け合わせて分類できます。
分類した後は活用を考えていきます。(ただ見てるだけでもずいぶん楽しいですが、)ターゲティングやリテンション施策への活用やマーケティング戦略への昇華、さらに、事業計画への反映など、使い道は多様です。

分類する母集団が10人程度ならよいのですが、100人を超えるともはや人間がわけていくのは面倒なレベル。
Rを使ったクラスタ分析、トライしていきます。

階層型と非階層型の違い

階層型:データの数が割と少ないときに使う。トーナメント表のような結果がわかりやすい。また、クラスタ数を後から決めることができる。
非階層型:データ数が多いときに使う。決めた数のクラスタ(排他的な部分集合)にサンプルを分割する方法。あらかじめいくつのクラスターに分けるかを決める必要がある(とはいえ何回かコマンドを叩けばいいだけでもある)。

非階層型のクラスター分析の代表的な手法がK-means法なので、非階層型クラスター分析=K-means法、なんて認識されてたりします。

出力結果イメージ

データは階層型クラスタ分析の記事同様です。
4つのクラスターに分けてみました。


取り込むデータのフォーマット

【コピペ用】コード

install.packages("NbClust")   #パッケージインストール
install.packages("cluster")   #パッケージインストール
data.orig <- read.csv("clst_raw2.csv") #ファイル名を入力
sapply(data.orig,class) #データ型の確認
head(data.orig)
data.scale <- scale(data.orig)
data.dist <- dist(data.scale, method="euclidean")
data.dist
#非階層クラスタ分析
#各指標の推奨クラスタ数の表示
km.best.nc<-NbClust(data.scale, distance = "euclidean", min.nc=2, max.nc=10, method = "kmeans", index = "alllong")
-NbClust(data.scale, distance = "euclidean", min.nc=2, max.nc=10, method = "kmeans", index = "hubert")
-NbClust(data.scale, distance = "euclidean", min.nc=2, max.nc=10, method = "kmeans", index = "dindex")
km.best.nc$Best.nc #各指標の推奨クラスタ数の表示
km <- kmeans(data.scale, centers=3, nstart=50) #K-Means法による非階層的クラスタ分析を実施
options(max.print=100000)
km #K-Means法による分析結果を表示
library(cluster) #clusterパッケージをロード
#K-Meansクラスタ分析の結果を可視化
clusplot(data.scale, km$cluster, color=TRUE, lines=3) #ラベルを表示したい場合labels=2

補遺

クラスタ数の決め方

非階層型ではクラスタ数を自分で決めなけらばならない、と書きましたが、実は機械的に決めることができる場合もあります。
具体的には、コマンドのこの部分です。

詳細は後日。。。
厳密性を求めている場合を除き、出てきた散布図を見ながら、意味の解釈が容易なクラスタ数にすればいいんじゃないかと思います。(そもそもクラスタ数の決め方が恣意的な場合が多いです)

K-means法のイメージ

こんな感じで距離を縮めてます。