Rでk-meansクラスタリング

をした。

Pythonに比べると「ライブラリを引っ張ってくる必要がない」「クラスタリングしたあと、特に集計しなくても、クラスタ内包レコード数と各変数のクラスタ平均を出してくれる」あたりが便利だった。ただし上司の言によれば、データをPCのメモリに乗せる都合上、ビッグデータを扱いきれない場合があるとのこと。

流したコード

# ライブラリとデータマートの取り込み、内容確認
# read.csvの第一引数は使用するcsvの指定
# (header=TRUEは1行目にカラム名が入っている場合に使う)
library(dplyr)
df <- read.csv('Desktop/hoge.csv', header=TRUE)
head(df)

# 説明変数として使うカラムの番号とクラスタ数を指定してk-means実行、結果確認
# means(変数ごと平均)やsize(クラスタ内包数)をチェック
kmeans_result = kmeans(df[1:4], 3)
kmeans_result

# クラスタリングの結果(クラスタID)を
# もとのデータフレームに追加して変数に保存
# (その後のクラスタ分析のため)
df %>%
  dplyr::mutate(cluster = kmeans_result$cluster) -> cluster

# クラスタIDごとに結果の平均を算出、変数に保存
# (クラスタの特徴を可視化するため)
cluster %>%
  dplyr::group_by(cluster) %>%
  summarise_at(1:4, mean) -> cluster_mean

# 上記2種のデータフレームをcsvとして書き出し
write.csv(cluster, 'Desktop/cluster.csv', quote=FALSE, row.names=FALSE)
write.csv(cluster_mean, 'Desktop/cluster_mean.csv', quote=FALSE, row.names=FALSE)

長い(長い)

途中に添えたコメントアウトが全てなので特に説明することがない。今回は元になったデータがみんな大好きirisなので変数は少なかったけど、実際k-meansするならもっと変数が増えるだろうし、クラスタリングするからにはuserIDみたいなプライマリキーを持っておくはずなので、その辺りは適宜調整が必要。

思ったよりさっくりできたので満足した。