たくさんのデータの中から、似た者同士を自動でグループ分けしたいと思ったことはありませんか?そんなときに役立つのが、機械学習の手法の一つである「k-means法(k平均法)」です。
この記事では、データ分析の初学者でも理解できるように、k-means法がどのようなもので、どのように機能するのか、そしてどんなことに使えるのかを、専門用語を避けつつ分かりやすく解説していきます。
k-means法とは?
もう少し詳しく言うと、k-means法は「クラスタリング」という手法の一種です。クラスタリングとは、正解ラベルがないデータ(教師なしデータ)の中から、データの持つ特徴に基づいて類似性の高いものを集め、グループ分けすることです。
k-means法は、その中でも「非階層クラスタリング」に分類されます。これは、あらかじめ決めた数のグループに、それぞれのデータがどのグループに属するかを割り振っていく方法です。名前の「k」は分けるグループの数を、「means」は各グループの「平均(重心)」を使って計算することに由来しています。
アルゴリズムがシンプルで理解しやすく、計算も高速なため、大規模なデータの分析にも利用しやすいという特徴があります。
k-means法のアルゴリズム
k-means法は、以下の簡単なステップを繰り返すことで、データをグループ分けしていきます。
- Step 1: グループの中心(重心)をランダムに決める
最初に、データをいくつのグループに分けたいか(kの数)を決めます。そして、その数だけランダムにデータ空間上に「グループの中心(重心)」を配置します。 - Step 2: 各データを一番近い重心のグループに割り当てる
すべてのデータについて、Step 1で決めた各重心との距離を計算します。そして、それぞれのデータを最も距離が近い重心のグループに割り振ります。 - Step 3: グループの重心を再計算する
Step 2でグループ分けされたデータを使って、各グループの新しい重心を計算します。新しい重心は、そのグループに所属するデータの平均的な位置になります。 - Step 4: 重心が変化しなくなるまで繰り返す
Step 3で計算した新しい重心の位置が、前回の重心の位置とほとんど変わらなくなるまで、Step 2とStep 3の処理を何度も繰り返します。重心が動かなくなったら、グループ分けが完了です。
k-means法の長所と短所
k-means法は非常に強力な手法ですが、万能ではありません。長所と短所を理解して、適切に使うことが重要です。
項目 | 説明 |
---|---|
長所 |
|
短所 |
|
k-means法の活用事例
k-means法は、そのシンプルさと効率性から、様々なビジネスシーンや研究で活用されています。
- 顧客セグメンテーション
マーケティング分野で最もよく使われる例の一つです。顧客の年齢、性別、購買履歴、ウェブサイトの閲覧行動などのデータから、似たような特性を持つ顧客グループを自動で発見します。これにより、「お得情報に敏感なグループ」「新商品を好むグループ」といったセグメントごとに、最適なマーケティング戦略を立てることが可能になります。 - 画像圧縮・減色
画像の色情報をk-means法でクラスタリングし、似た色をグループ化して代表的な色(重心の色)に置き換えることで、使用する色数を減らし、データサイズを圧縮することができます。 - 異常検知
工場のセンサーデータや金融取引データなどから、正常なデータの集まりをクラスタとして定義します。どのクラスタにも属さない、または中心から大きく外れたデータを「異常」として検出することができます。 - 文書分類
ニュース記事や論文などを、単語の出現頻度といった特徴量に基づいてクラスタリングし、「スポーツ」「政治」「経済」といったトピックごとに自動で分類します。
Python (scikit-learn) による実装例
Pythonの機械学習ライブラリであるscikit-learnを使うと、k-means法は非常に簡単に実装できます。
ここでは、仮想的なデータを作成し、それを3つのクラスタに分ける簡単なコードを紹介します。
# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# --- 1. データセットの作成 ---
# scikit-learnのmake_blobsを使って、クラスタリング用の仮想データを作成します。
# n_samples: データ点の総数
# centers: 生成するクラスタの数
# n_features: データの特徴量(次元)の数
# cluster_std: クラスタ内のデータのばらつき
# random_state: 乱数のシード(結果を再現可能にするため)
X, y_true = make_blobs(n_samples=300, centers=3, n_features=2, cluster_std=0.8, random_state=0)
# --- 2. k-meansモデルの構築と学習 ---
# KMeansクラスのインスタンスを作成します。
# n_clusters: 分割するクラスタの数(kの値)
# init: 重心の初期値を決める方法 ('k-means++'が推奨されます)
# n_init: 異なる重心の初期値で何回アルゴリズムを実行するか
# random_state: 乱数のシード
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=0)
# fit_predictメソッドで、データの学習とクラスタの予測を同時に行います。
y_kmeans = kmeans.fit_predict(X)
# --- 3. 結果の可視化 ---
# 元のデータを散布図としてプロットします。
# y_kmeansの値(0, 1, 2)に応じて色分けします。
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s=50, c='lightgreen', marker='s', edgecolor='black', label='cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s=50, c='orange', marker='o', edgecolor='black', label='cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s=50, c='lightblue', marker='v', edgecolor='black', label='cluster 3')
# 各クラスタの重心をプロットします。
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=250, marker='*', c='red', edgecolor='black', label='centroids')
plt.legend()
plt.grid()
plt.show()
まとめ
k-means法は、データの中に隠れた構造を見つけ出し、似たもの同士をグループ分けするためのシンプルかつ強力な手法です。
アルゴリズムが分かりやすく、計算も高速なため、データ分析の第一歩として非常に有用です。マーケティングから異常検知まで、その応用範囲は多岐にわたります。
一方で、グループ数kを事前に決める必要があるなどの注意点も存在します。この記事をきっかけに、ぜひk-means法をあなたのデータ分析に活用してみてください。