最適なk-meansのkを見つける

こちらはアメリカの州ごとの、新生児の母親と父親の年齢をプロットしたものです。これらの点にk-meansを適用するとき、最適なkは何でしょうか?

これを判断する一つの方法として、Elbow Methodというものがあります。

こちらが、Elbow MethodをExploratoryで行うためのスクリプトです。

iterate_kmeans <- function(df, ..., max_center = 40){
    n_centers <- seq(max_center)
    selected <- df %>% select(...)
    ret <- NULL
    for (n_center in n_centers) {
        row <- data.frame(center = n_center)
        row$model <- list(kmeans(selected, centers = n_center))
        if (is.null(ret)) {
            ret <- row
        } else {
            ret <- bind_rows(ret, row)
        }
    }
    ret
    ret %>% rowwise() %>% glance(model)
}

こちらのスクリプトは、kを1から、デフォルトでは40までの範囲で動かしてそれぞれのkでk-meansを実際に行い、そのときのクラスター内でのばらつきの和をdata frameに出力します。

実際にやってみましょう。 まず、Exploratoryプロジェクト内にスクリプトを作成し、先ほどのスクリプトの内容をコピー、セーブします。

次にカスタムステップとして、data frameにここで定義したfunctionを適用します。

iterate_kmeans(mother_age_mean, father_age_mean, max_center=15)

こちらが出力されたdata frameです。

これをラインチャートにプロットするとこのようになります。

k=3あたりがElbow(ひじのようにカーブが曲がっている点)と言えるのではないでしょうか。

ここでElbowを探す意味は、各クラスター内のばらつき(Y軸に乗っている、tot.withinssの値)を小さくしたい(まとまりを良くしたい)という要求と、kを小さく保ちたいという要求の妥協点を探すことにあります。 たとえば、kをデータの行数まで大きくすると、各クラスターは一点だけのメンバーを持つことになるので、クラスター内のばらつきはゼロ、それを足し上げたものもゼロということになります。ですが、明らかにそんなクラスターに意味はありません。 この場合はk=3あたりが、クラスター内のばらつきも比較的小さく、kも小さい妥協点ということになります。

k=3でクラスタリングして色分けするとこのようになります。