トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

クラスター分析

クラスター分析は、 サンプルの仲間分けの分析 の一種です。 この分析をすると、データのグループ(クラスター)を作ることができます。 例えば、左の散布図は、3つのグループに分かれそうに見えますが、この方法を使うと、 それぞれのサンプルのグループ分けを、ソフトが自動的にやってくれます。 作られたグループの情報を使えば、色分けもできます。
k-means k-means

クラスター分析は、グループの作り方で方法が大きく分かれ、階層型と非階層型があります。 「階層型がボトムアップ、非階層型がトップダウン」と言っても良いかもしれません。

階層型

階層型の方法は、各サンプル間の距離を見て、近いもの同士でグループを作っていく方法です。 デンドログラムと呼ばれるトーナメント表のようなグラフが作られ、これが階層的なグラフになっています。

グループ分けは、この階層型のグラフの情報を使って進めます。

近さの指標には、様々なものが考案されています。

非階層型

非階層型では、個々のサンプルの近さでグループ分けするのではなく、各グループを大局的に決めていきます。

k-means法

k-means法では、例えば分析者が「k = 3」と指定すると、グループが3つになるように、サンプルを分けます。

X-means法

X-means法は、k-means法と似ていますが、kを自動的に決めてくれるところが違います。

ただし、思ったような数には、なかなかならないようです。 下記のRを使った例では、「3」になると理想的なのですが、「8」になりました。

混合分布法

k-means法では、明らかにグループの中心に近いサンプルと、遠いサンプルが、同じように扱われます。 しかし、遠いサンプルは、他のグループに所属する可能性もわかるようにしておいた方が良いことがあります。 この時は、混合分布を使うと、複数のグループへの所属の可能性が確率的にわかります。

DBSCAN

DBSCANは、密度の濃さでグループ分けをするので、グループの中心点というものがありません。 そのため、複雑な形でも対応できます。

もうひとつ特徴があり、「グループには属さないサンプル」という判定もしてくれます。

3次元以上の場合や、変数ごとに単位が違う場合、パラメータepsの設定が難しいです。 この対策として、
(x - min)/(max - min)
という式を使い、 それぞれのデータを、それぞれの変数のmaxとminを使って、0から1のデータに収まるようにします。 こうすると、どのようなデータなのかがわからないデータでも、変換したデータではepsが1より大きいものが必要になることはなくなります。 データの空間をある程度分割できるグループのサイズとして、epsは0.1から0.3くらいに設定すれば良いかと思います。 こうすることで、DBSCANの問題は改善します。

kの決め方

このページで紹介している方法の中で、X-means法と、DBSCANは、最終的なグループの数が自動で決まるのは良いのですが、 X-means法だと思ったような数になりにくい問題がありますし、DBSCANはパラメータの設定の難しさがあります。

一方、階層型、k-means法、混合分布法では、適切なグループ数を指定すれば、各サンプルはわりと適切に振り分けてくれる良さがあります。 ところが、適切なグループの設定が難しいです。 階層型なら、デンドログラムから見積もることができます。 また、データが2変数(2次元)なら、 2次元散布図 を見れば、見積もることができます。

問題はこれ以外の場合で、なかなか良い方法がないようです。

自己組織化マップ(SOM)の利用

データが3変数以上あっても、2変数の時のように 2次元散布図 を使って手軽にグループの数を見積もる方法として、 高次元を2次元に圧縮して可視化 を使って、分析のデータを2変数のデータにしてしまう方法が考えられます。

下の図は、3次元空間上に4つのグループがあることがわかっているデータが左で、 自己組織化マップ で2次元にしてみた結果が右です。 4くらいが適当なことは、見当が付きます。
som som

クラスター分析を外れ値の検出に使う

例えば、下の図のように3つのグループの他に、外れ値が2つある場合があり、この2つを、3つのグループとは別のグループとして取り出したいとします。
k-means

外れ値のモデル のページに、外れ値の判定をする時のデータの使い方として、判定したいデータと参照したいデータを混ぜる方法と、混ぜない方法を説明しています。

判定したいデータと参照したいデータを混ぜる方法として、 階層型の方法とDBSCANを使うことができます。

k-means法、X-means法、混合分布については、「どのグループにも属さないようだ」ということがわかるものがないため、 外れ値の出方によっては、使える場面があるかもしれませんが、使いにくいです。

階層型を外れ値の検出に使う

例えば、上の例のデータのデンドログラムは下のようになります。 61番と62番のデータが、浮いた感じになっていますので、これを外れ値と考えることができます。 3つの大きなグループの他に、外れ値が2つあることから、合計で5つのグループになると考えて、k=5として、グループを求めると、 狙い通りに外れ値のグループができました。
k-means k-means

DBSCANを外れ値の検出に使う

DBSCANの場合、外れ値は、グループ0というグループに分類されます。
k-means

Rの実施例

Rを使ったクラスター分析の実施例になります。 下記は、コピーペーストで、そのまま使えます。 下記のコードを使った場合、X-means以外は、このページの一番上にある色分けのグラフと同じ結果になります。 この例では、入力データは量的データになっていることを想定しています。 質的データがあるとエラーになります。

共通部分(入力データ)

以下に、複数の方法がありますが、入力データの作り方は同じなので、ここにまとめています。

この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。

この3行で、入力データの読み込みをします。 3行目はDBSCANをする時はあった方が良いですし、どの手法だとしても、身長と体重など、単位が違う変数が混ざっている場合は必須です。 そのため、特に理由がない限りは、3行目はこのまま使った方が良いと思います。
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data10 <- Data1[,1:2]#
# クラスター分析に使うデータを指定。ここでは1〜2列目の場合
Data11 <- (Data10 - apply(Data10,2,min))/(apply(Data10,2,max)-apply(Data10,2,min))
# すべての変数のデータを、0から1の間のデータにする。

階層型

Data11_dist <- dist(Data11)# サンプル間の距離を計算
hc <- hclust(Data11_dist, "ward.D2")
# 階層型クラスター分析
plot(hc)
# デンドログラムを表示する
k-means
デンドログラムから、狙い通りに3つのグループに大きく分かれている様子がわかります。

この例は、データが60個なのでできなくもないのですが、サンプルが多い時は、 デンドログラムから各サンプルがどのように分かれるのかを読み取れなくなります。 結果をデータとして出力する方法ですが、 各サンプルを3つのグループに分けると、どのグループに所属するのかは、下記のようにすると出力できます。
output <- cutree(hc,k=3)# 3個にグループ分け

非階層型(k-means法)

km <- kmeans(Data11,3) # k-means法で分類。これは3個のグループ分けの場合
output <- km$cluster
# 分類結果の抽出

非階層型(X-means法)

X-means法の使い方は、k-means法と似ていますが、ライブラリのインストールが事前に必要です。 また、細かいところが少し違います。

library(clusternor) # ライブラリを読み込み
Data11 <- as.matrix(Data11)
# データを行列に変換
xm <- Xmeans(Data11,10)
# X-means法で分類。最大のグループ数を10個に指定。
output <- xm$cluster
# 分類結果の抽出

非階層型(混合分布法)

混合分布でも、ライブラリのインストールが事前に必要です。

library(mclust) # ライブラリを読み込み
mc <- Mclust(Data11,3)
# 混合分布で分類。これは3個のグループ分けの場合
output <- mc$classification
# 分類結果の抽出

混合分布の場合は、データの分類だけではなく、他のデータがあった時に、分類に使ったデータからわかった分類のどれに該当するのかの予測ができます。 これは、 予測のためのソフトの使い方 と同じです。
Data2 <- read.csv("Data2.csv", header=T) # テストデータを読み込み
Data21 <- (Data2 - apply(Data2,2,min))/(apply(Data2,2,max)-apply(Data2,2,min))
# すべての変数のデータを、0から1の間のデータにする。
output2 <- predict(mc, Data21)
# テストデータの分類を作成

ファイルに出力した内容の例が下の表になります。 最終的に、3つのグループのどれになるのかを予測しただけではなく、それぞれのグループに属する確率がわかるようになっています。
k-means

非階層型(DBSCAN)

DBSCANでも、ライブラリのインストールが事前に必要です。 DBSCANは、epsの設定が悩みどころになりますが、データを前処理して、0から1の範囲にしているので、 グループの範囲の目安は、0.1から0.3くらいで良いはずです。

library(dbscan) # ライブラリを読み込み
dbs <- dbscan(Data11, eps = 0.2)
# DBSCANで分類。epsは、コア点からの距離の範囲です。ここでは、0.2にしました。
output <- dbs$cluster
# 分類結果の抽出

共通部分(出力)

Rには、クラスター分析用のグラフのパッケージもありますが、ここでは汎用的な ggplot2 を使う例になります。

library(ggplot2) # パッケージの読み込み
Data <- cbind(Data1, output)  # 最初のデータセットにグループ分けの結果を付ける
Data$output <-factor(Data$output) # グループの変数を文字列型にする
Data$Index <-row.names(Data) # Indexという名前の列を作り、中身は行番号にする
ggplot(Data, aes(x=X1, y=X2)) + geom_point(aes(colour=output))
# 二次元散布図 色分け・形分け

ここで、下のデータのようにデータが少ない場合は、行番号をプロットする方法も便利です。
k-means
ggplot(Data, aes(x=X1, y=X2,label=Index)) + geom_text(aes(colour=output))# 言葉の散布図
k-means

各サンプルの名前の列がある場合は、それを使うこともできます。
ggplot(Data, aes(x=X1, y=X2,label=Name)) + geom_text(aes(colour=output))# 言葉の散布図
k-means

write.csv(Data, file = "Output.csv") # データをcsvファイルに出力



1次元クラスタリング

参考文献

Pythonで動かして学ぶ!あたらしい機械学習の教科書 伊藤真 著 翔泳社 2018
Pythonを使った計算自体も、自分で作る人向けの教科書になっています。
教師なし学習 として、k-means法と、混合ガウスモデルを紹介。
混合ガウスモデルは、k個の中心と、その中心から広がる正規分布で、確率的にクラスターを判定できる。 k-means法と違って、各点は、どれかひとつのクラスターに所属するのではなく、複数のクラスターのそれぞれに対しての、確率的な所属の仕方がわかる。


フリーソフトではじめる機械学習入門」 荒木雅弘 著 森北出版 2014
機械学習 全般の本ですが、ニューラルネットワークから、ディープラーニングまでの流れがコンパクトにまとまっています。
k-means法だけでなく、kが自動的に決まるx-means法も紹介。
k-means法の弱点として、分散が一定な点を挙げ、分散が中心毎に異なるモデルとして、混合分布による確率密度推定を紹介。


Pythonではじめる機械学習 scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎」 Andreas C.Muller, Sarah Guido 著 オライリー・ジャパン 2017
Pythonを使った機械学習について、具体的な話がコンパクトにまとまっています。
k-means法は、丸くないクラスタを識別できない。
k-means法には、 主成分分析NMF と同じように、成分分解としての使い方がある。 抽出する成分の数を、次元の数よりも多くできるのが、k-means法を使った場合の特徴。ベクトル量子化と呼ぶ。
この本では、階層型クラスタリングを、「凝集型クラスタリング」という名前でも呼んでいる。 k-means法のようにクラスターの数を分析者が与える必要がなく、かつ、どのクラスターにも属さない点を判別できる方法としてDBSCANを紹介。 DBSCANも、階層型クラスタリングと同様に、予測に使えない。


データマイニング入門 :Rで学ぶ最新データ解析」 豊田秀樹 編著 東京図書 2008
データマイニング の入門書です。 また、これらの手法をRでやってみるための手引書にもなっています。
クラスター分析の手法は、階層型とk-means法が紹介されています。
Rで実行する時のポイントとして、この本では、データを「scale」関数に入れて、 標準化 する方法を紹介しています。
このページでは、標準化ではなく、0から1の区間に収まるように変換しています。 単位系の異なる変数を合わせるだけでなく、DBSCANのepsの考えやすさから、標準化にはしませんでした。


順路 次は 自己組織化マップを使ったクラスター分析

Tweet データサイエンス教室