コンテンツにスキップ

K-means

数値の列を使って、似たもの同士をグループ(クラスタ)に分けます。 顧客をいくつかの層に分ける、商品を特徴で分類する、といった使い方をします。

クラスタの数を自分で決める必要があるのが特徴です。数を決めたくないなら DBSCAN や Mean Shift を検討してください。

入出力

ポート内容
入力データ分けたいデータ
出力データ入力データに クラスタ番号 の列を足したもの

分かれ具合を数字で確かめたいときは、クラスタリング結果比較の平均シルエット値を使ってください。このノード自体は数字を出しません。

Spark エンジンでは動きません。

設定項目

「オプション」はチェックを入れるまで中身が出ません。 見出しの横のチェックボックスを on にすると、最大繰り返し回数を入力 / 重心の探索回数を入力 / サンプリングデータに対して実行する / 乱数シードを固定する が出ます。

対象列を選択
分類に使う列。数値の列だけ選べます。複数選べます。
クラスタ数を入力必須
いくつに分けるか。自分で決める必要があります。
最大繰り返し回数を入力
既定は 300。計算が収束しないときに増やします。
重心の探索回数を入力
既定は 10。初期値を変えて何回試すか。多いほど安定しますが遅くなります。
サンプリングデータに対して実行する
0 より大きく 1 以下の小数を入れると、その割合の行だけを使って重心を求めます。クラスタ番号はすべての行に付きます。行数が多いときに使います。
乱数シードを固定する
整数を入れると毎回同じ結果になります。空のままだと実行のたびに変わります。考え方は乱数シードを参照。

前処理が要る

空欄があると計算できません。 欠損値処理で埋めるか除いてください。

行数が 10,000 を超えたとき

計算の仕方が切り替わります。 10,000 行以下はすべての行を使って重心を求めますが、それを超えると一部を取り出しながら重心を更新する速い方法に切り替わります。速くなる代わりに、同じ設定でも分かれ方がわずかに変わることがあります。

サンプリングを使ったときは、サンプリング後の行数で判定されます。

クラスタ数の決め方

正解はありません。 試して結果を見るのが基本です。

結果が毎回変わる

乱数シードを固定しないと、実行のたびに結果が変わることがあります。 人に見せる前に固定してください。

エラーと対処

どのエラーも、入力データか設定を直して実行し直せば消えます。

処理対象列に欠損値がある

処理対象列に欠損値が含まれています。欠損値を除外するか補完してください。

直し方 — 欠損値処理で埋めるか、欠損のある行を外します

処理対象列に数値以外がある

処理対象列に数値型以外のデータが含まれてます。型変換をするか、数値型以外の列を除去してください。

直し方 — 列の型変更で数値にするか、その列を外します

サンプリングの割合が範囲外

サンプリング比率は0以上1以下の値を指定してください。

直し方 — 「サンプリングデータに対して実行する」に 0.1 のように、0 より大きく 1 以下の小数を入れます。0 は使えません

よく使う例

1. 顧客を 3 つの層に分ける

お題 — 顧客を購買のしかたで 3 つの層に分けたい

入力 — 顧客 1 人が 1 行のデータ(購入額・購入頻度・来店日数)

設定 — 手前に数値の正規化を置いて単位をそろえ、このノードで対象列に 3 列、クラスタ数 3、乱数シードに 42

出力 — 入力データに クラスタ番号 の列が付き、0 1 2 の 3 つに分かれます

2. 分かれ方の意味を調べる

お題 — 分かれた 3 つがそれぞれどういう層なのか知りたい

入力 — 1 の出力(クラスタ番号 が付いたデータ)

設定 — 後ろにクラスタ解釈用データを作るをつなぐ

出力 — クラスタごとに各列の平均が並んだ表。値の大小を見て「高単価・低頻度」などの名前を付けます

3. クラスタ数を決めたい

お題 — クラスタ数をいくつにすればよいか分からない

入力 — 正規化までを終えたデータ

設定 — このノードの代わりにクラスタリング結果比較を置き、クラスタ数 2〜6 の k-means を 5 組並べる

出力 — 組ごとの評価指標が並んだ表。いちばん良かった組のクラスタ数を、このノードのクラスタ数に入れ直します

4. 行数が多くて終わらない

お題 — 行数が多く、実行が返ってこない

入力 — 行数の多い顧客データ

設定 — 「サンプリングデータに対して実行する」に 0.1 のような割合を入れる

出力 — 1 割の行で中心を決め、その結果を全行に当てはめた クラスタ番号 が付きます

関連