K-means法(K平均法)を用いてクラスタリングする場合は、あらかじめクラスタ数を指定しなければならない。
このときのクラスタ数をどのように決めてよいか迷ったことはないだろうか。
ここでは、K-means法のクラスタ数を機械的に決定する方法をお伝えする。

K-means法のクラスタ数を機械的に決定するために用いるのが、Gap統計量である。
Gap統計量を用いたクラスタ数の決定のアイディアを簡単にご紹介すると、クラスタ数1、2、・・・と順に、一様分布から作成されたクラスタ内の距離の平均と元データのクラスタ内の距離の平均とを比べて、より密集しているクラスタ数を採用するという方法である。

詳しくは、Estimating the number of clusters in a data set via the gap statisticを参考にしてほしい。

ここからは、Rを用いて具体的に見ていこう。
まずは、clusterパッケージの読み込みと、ご説明するためのサンプルデータを作成する。
意図的に3つのクラスタができるようにデータを作成した。


> library(cluster)

> sample1 <- data.frame(x = rnorm(10, mean = 1, sd = 1), y = rnorm(10, mean = 1, sd = 1))
> sample2 <- data.frame(x = rnorm(10, mean = 5, sd = 1), y = rnorm(10, mean = 5, sd = 1))
> sample3 <- data.frame(x = rnorm(10, mean = 10, sd = 1), y = rnorm(10, mean = 10, sd = 1))
> sample <- rbind(sample1, sample2, sample3)
> plot(sample)

how-to-decide-number-of-clusters-in-r-1

このデータに対して、Gap統計量を求めてみる。
Gap統計量を求めるためには、clusGap関数を用いる。
下のコードのclusGap関数の引数は、次のような意味である。

  • sample:データ
  • kmenas:K-means法
  • K.max:クラスタ数の最大値
  • B:モンテカルロ法のブートストラップ回数
  • verborse:処理状況を表示するかどうか

> result <- clusGap(sample, kmeans, K.max = 10, B = 100, verbose = interactive())

Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100)  [one "." per sample]:
.................................................. 50 
.................................................. 100 

処理が終わったら、結果の中身を見てみよう。


> result

Clustering Gap statistic ["clusGap"].
B=100 simulated reference sets, k = 1..10
 --> Number of clusters (method 'firstSEmax', SE.factor=1): 3
          logW   E.logW         gap     SE.sim
 [1,] 3.806407 3.629772 -0.17663555 0.06747599
 [2,] 3.062174 3.097019  0.03484477 0.06139314
 [3,] 2.453365 2.839130  0.38576490 0.07033063
 [4,] 2.327831 2.655896  0.32806576 0.07766857
 [5,] 2.209761 2.491554  0.28179274 0.09399472
 [6,] 2.107407 2.336471  0.22906381 0.09037798
 [7,] 1.998367 2.196959  0.19859206 0.09656801
 [8,] 1.778149 2.071716  0.29356688 0.11532498
 [9,] 1.681060 1.943485  0.26242534 0.10098396
[10,] 1.658722 1.821823  0.16310132 0.10548041

このとき、求めるクラスタ数kは

gap(k) ≧ gap(k+1) - SE.sim(k+1)

となる最小のkである。

clusGap関数の結果をみると、k=3であることが分かる。
このclusGap関数は、グラフ化することも容易で、グラフから読み解くこともできる。


> plot(result)

how-to-decide-number-of-clusters-in-r-2

このグラフから、求めるクラスタ数はk=3であることが分かる。

関連する記事

  • R言語 CRAN Task View:RデータベースR言語 CRAN Task View:Rデータベース CRAN Task View: Databases with Rの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Yuan Tang Contact: terrytangyuan at […]
  • 経営戦略に使えるRFM分析の基礎知識と活用法経営戦略に使えるRFM分析の基礎知識と活用法 RFM分析とは、ある一定期間の購買履歴データを用いて、顧客を分類することにより様々な示唆を得るための分析手法である。分類の仕方は、顧客を直近購買時期・購入頻度・購買額の3つの軸で分類し、各軸ごとにランク分けをする。このことにより、顧客が現在どの位置にいて、それがどのくらいの人数なのかを把握することができる。 あなたは、このような分類をすることにどのようなメリットがあるの […]
  • Ubuntu14.04とPython3でMeCabを使う方法Ubuntu14.04とPython3でMeCabを使う方法 MeCabは各種スクリプト言語(perl、ruby、python、Java)から、各言語バイディングで利用できるようになっている。 しかし、Pythonで用意されているのはPython2系のもので、残念ながらPython3系では使えない。 そこで、ここでは用意されているPython2系バイディングをPython3系に変換して使用する方法をお伝えする。 MeCab […]
  • R言語 CRAN Task View:心理モデルや手法R言語 CRAN Task View:心理モデルや手法 CRAN Task View: Psychometric Models and Methodsの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Patrick Mair Contact: mair at […]
  • R オブジェクトを保存・読み込みする方法R オブジェクトを保存・読み込みする方法 Rでオブジェクトをファイルに保存または読み込みする方法を記載します。 長時間の計算による解析結果をファイルに保存しておくことは、解析手続きの分割が行えるため、とても役に立ちます。 解析手続きの分割について、解析Aの結果を解析Bで用いる場合という例でご説明します。 同じスクリプトで解析Aと解析Bを記載すると、解析Bを変更した際に再度解析Aを実行しないといけません。解析 […]
R K-means法のクラスタ数を機械的に決定する方法

R K-means法のクラスタ数を機械的に決定する方法」への1件のフィードバック

コメントは受け付けていません。