「手元にある大量のデータを、何か意味のあるグループに自動で分けたい…」
データ分析の現場では、顧客リストや製品データ、センサーログなど、様々なデータを扱う中でこのような課題によく直面します。そんな時に絶大な効果を発揮するのが、機械学習の手法の一つであるKMeansクラスタリングです。
この記事では、Pythonの定番ライブラリScikit-learnを使ってKMeansを実装し、データをグループ分けする方法を、初心者の方でもつまずかないように徹底的に解説します。
この記事を読み終える頃には、あなたは以下のスキルを身につけているはずです。
- KMeansがどのようなアルゴリズムなのかを理解できる
Scikit-learnを使ったKMeansの具体的な使い方・手順がわかる- データをクラスタリングし、その結果を可視化できるようになる
- データに最適なグループ数を探すための「エルボー法」が使えるようになる
サンプルコードはコピー&ペーストで動かせるものを用意しました。さっそく、データグループ分けの世界に飛び込んでみましょう!
KMeansクラスタリングとは?データを自動でグループ分けする手法
まず、KMeansがどのような技術なのか、その概要を掴んでおきましょう。
KMeans(K平均法)は、正解ラベルのないデータの中から、似た特徴を持つデータ同士を集めて、指定した数(K個)のグループ(クラスタ)に自動で分類するアルゴリズムです。このような学習方法は「教師なし学習」と呼ばれ、データに潜む構造やパターンを発見するのに非常に役立ちます。
なぜKMeansが便利なのか?(活用シーン)
KMeansの使い方は非常にシンプルですが、その応用範囲は驚くほど広いです。
- 顧客のグループ分け: 購買金額や頻度、閲覧履歴などから顧客を「優良顧客」「新規顧客」「離反懸念顧客」といったグループに分け、それぞれに適したアプローチを考える。
- ECサイトの商品推薦: ユーザーが閲覧した商品と似た特徴を持つ商品を同じグループとして扱い、「この商品を見た人はこちらも見ています」といった推薦に応用する。
- 異常検知: 正常なデータの集団から大きく外れたデータ点を「異常」として検出する。
このように、KMeansの使い方をマスターすれば、データから新たな知見を引き出す強力な武器になります。
準備しよう!KMeansを使うための環境構築
それでは、実際に手を動かす準備を始めます。Pythonと、いくつかのライブラリがあればすぐに始められます。
必要なライブラリをインストール
Scikit-learnをまだインストールしていない場合は、以下のコマンドを実行してください。データ操作に使うNumpyと、結果の可視化に使うMatplotlibも一緒にインストールします。
pip install scikit-learn numpy matplotlib分析に使うサンプルデータを準備
今回は、Scikit-learnが提供しているダミーデータ生成機能make_blobsを使い、クラスタリングの練習に最適なデータセットを作成します。
この関数を使うと、指定した数の塊(グループ)を持つ2次元データを簡単に作ることができます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# サンプルデータを作成
# n_samples: データ点の数
# centers: グループ(クラスタ)の数
# random_state: いつ実行しても同じ結果にするための固定値
X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)
# どんなデータができたか散布図で確認
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.title("Sample Data")
plt.grid()
plt.show()実行すると、なんとなく4つのグループに分かれているように見えるデータ点のプロットが表示されます。今回は、このデータをKMeansできちんとグループ分けできるか試していきます。
Scikit-learnを使ったKMeansの基本的な使い方【3ステップ】
ここからが本題です。Scikit-learnを使ったKMeansの使い方は、たったの3ステップで完了します。非常にシンプルなので、一つずつ見ていきましょう。
ステップ1:モデルを準備する (KMeansのインスタンス化)
まず、sklearn.clusterからKMeansクラスをインポートし、モデルを準備します。このとき、「データをいくつのグループに分けたいか」をn_clustersという引数で指定します。今回は見た目で4つと分かっているので4を指定します。
from sklearn.cluster import KMeans
# KMeansモデルを準備する
# n_clustersに分けたいグループの数を指定
# n_init='auto'は、安定した結果を得るためのおまじない(推奨設定)
kmeans_model = KMeans(n_clusters=4, n_init='auto', random_state=0)ステップ2:モデルを学習させる (fitメソッド)
次に、準備したモデルにfit()メソッドを使って、先ほど作成したサンプルデータXを渡して学習させます。これだけで、モデルがデータ点の配置を計算し、最適なグループ分けを実行してくれます。
# データを使ってモデルを学習させる
kmeans_model.fit(X)ステップ3:結果を確認する (labels_とcluster_centers_)
学習が終わると、モデルの中に結果が格納されています。主に使うのは以下の2つです。
labels_: 400個の各データ点が、0〜3のどのグループに分類されたかを示すラベル。cluster_centers_: 4つの各グループの中心点がどこにあるかを示す座標。
実際に中身を見てみましょう。
# 各データがどのグループに分けられたか確認(最初の10件)
print("所属ラベル:", kmeans_model.labels_[:10])
# 各グループの中心座標を確認
print("グループの中心座標:\n", kmeans_model.cluster_centers_)これで、データに対するグループ分けは完了です。とても簡単ですね!
【実践】クラスタリング結果をグラフで可視化する
ステップ3で得られた結果(ラベル)を使って、グループ分けがうまくいったかを目で見て確認してみましょう。
Matplotlibで結果を分かりやすく表示
Matplotlibのscatter関数には、データ点ごとに色を指定するcという引数があります。ここに先ほど取得したlabels_を渡すだけで、グループごとに自動で色分けされたグラフを作成できます。
中心点もプロットしてグループの中心を把握
さらに、各グループの中心点(cluster_centers_)を別のマーカーで上からプロットすることで、KMeansが各グループの中心をどこだと判断したのかも一目瞭然になります。
# グループ分けの結果を可視化
plt.figure(figsize=(8, 6))
# c=kmeans_model.labels_ とすることで、グループごとに色分けされる
plt.scatter(X[:, 0], X[:, 1], s=50, c=kmeans_model.labels_, cmap='viridis')
# グループの中心点をプロット
centers = kmeans_model.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.8, marker='X')
plt.title("KMeans Clustering Result")
plt.grid()
plt.show()このコードを実行すると、データが綺麗に4色に分かれ、それぞれの中心に赤いバツ印が表示されたグラフが出力されます。これで、KMeansの使い方の基本はマスターです!
【応用】最適なグループ数(クラスタ数)を見つける方法:エルボー法
今回は「グループ数は4」と決め打ちで進めましたが、実際のデータでは最適なグループ数は分かりません。そんな時に役立つのがエルボー法です。
「なんとなく」で決めないためのエルボー法
エルボー法は、グループ数(K)を1, 2, 3, …と順番に増やしながらKMeansを実行し、それぞれのKでの「グループ内でのまとまり具合」をプロットする方法です。この「まとまり具合」はinertia_という値で取得できます。
グラフを描いたとき、inertia_の下がり方が急に緩やかになる点、つまりグラフが肘(エルボー)のように曲がって見える点が、最も効率の良いグループ数(最適K)の候補となります。
Pythonコードでエルボー法を実装
forループを使って、Kの数を1から10まで変えながらinertia_を記録し、グラフ化するコードは以下の通りです。
# エルボー法の実装
distortions = []
for k in range(1, 11):
km = KMeans(n_clusters=k, n_init='auto', random_state=0)
km.fit(X)
# グループ内のまとまり具合(inertia_)をリストに追加
distortions.append(km.inertia_)
# グラフ化
plt.figure(figsize=(8, 6))
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Distortion (inertia)')
plt.title('Elbow Method for Optimal K')
plt.grid()
plt.show()生成されたグラフを見ると、K=4を境に線の傾きがなだらかになっているのが分かります。これにより、このデータセットにはK=4が最適だろう、と客観的な根拠を持って判断することができます。
まとめ:KMeansの使い方をマスターしよう
この記事では、Scikit-learnを使ったKMeansの基本的な使い方から、応用的な最適なクラスタ数の決定方法までを徹底解説しました。
- KMeansは、データを自動でグループ分けする教師なし学習の代表的な手法。
- 使い方は**「モデル準備 → 学習 → 結果確認」**のシンプルな3ステップ。
n_clustersでグループ数を指定し、fit()で学習させる。- 結果の
labels_を使えば、Matplotlibで簡単に色分け・可視化できる。 - 最適なグループ数が不明な場合はエルボー法で推定できる。
KMeansは、そのシンプルさと効果の高さから、あらゆるデータ分析の現場で重宝されています。ぜひ、今回学んだ使い方を参考にして、お手元のデータでグループ分けに挑戦してみてください!


コメント