Pythonによるk-meansクラスタリングの実装方法を現役エンジニアが解説【初心者向け】
初心者向けにPythonによるk-meansクラスタリングの実装方法について現役エンジニアが解説しています。k-meansとはクラスタリングの手法の一つで、非階層型クラスタリングのアルゴリズムです。scikit-learnのデータセットを使いクラスタリングを実装して、matplotlibを使いグラフにして表示します。
TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。
Pythonによるk-meansクラスタリングの実装方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。
Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

今回は、Pythonに関する内容だね!

どういう内容でしょうか?

Pythonによるk-meansクラスタリングの実装方法について詳しく説明していくね!

お願いします!
k-meansとは?
k-meansとはクラスタリングの手法の一つで、非階層型クラスタリングのアルゴリズムです。
クラスタの平均を用いて、与えられたクラスタ数k個に分類することからこの名前が付けられました。k平均法と呼ばれることもあります。
非階層型クラスタリングとは、異なる性質の集団の中から似た特徴を持ったものでクラスターを行う手法のことです。
階層型と異なり、階層的な構造を持たず、予め決められたクラスター数でサンプルを分類します。サンプルが大量にある正規分布のデータ対してデータをグループ分けを行う際に効果的です。また、クラスタリングは機械学習の手法一つでアルゴリズムから特徴を見つけて分類を行うことから、「教師なし学習」となります。
Numpyのインストール
ここからはPythonでクラスタリングを行うための環境をセッティングしていきます。まずは、配列の演算を扱うためのライブラリとしてNumpyをインストールしていきます。
以下のコマンドを実行してインストールします。
pip install numpy
Pandasのインストール
続いて、サンプルデータのファイルを読み込み、データフレームの形式に変換するためにPandasをインストールします。
pip install pandas
scikit-learnのインストール
機械学習ライブラリのscikit-learnをインストールします。scikit-laernは機械学習のアルゴリズムやサンプルのデータが同梱されています。
pip install scikit-learn
matplotlibのインストール
クラスタリングの結果をグラフにプロットするためにmatplotlibをインストールします。
pip install matplotlib
各ライブラリの使い方
必要なライブラリをインストールできたら、ライブラリのインポートを行います。各ライブラリのインポートは以下の通りです。
from matplotlib import pyplot as plt from sklearn import datasets, preprocessing from sklearn.cluster import KMeans import numpy as np import pandas as pd
これで必要なライブラリのインポートは完了です。それでは、具体的にライブラリの使い方を手順を交えて説明します。
データの読み込み
まずはクラスタリングに使用するデータを用意します。ここではscikit-learnを使用してデータセットの読み込みを行います。scikit-learnには分類や回帰といった機械学習の問題に使うことができるデータセットが同梱されています。
使用可能なデータセットは以下の公式ドキュメントにまとめられています。
ここでは、この中からワインの種類のデータセットを使っていきます。以下の記述でデータを読み込みます。
wine_data = datasets.load_wine() 前処理
データを読み込んだらデータを解析するために必要な前処理を行います。
pandasを使用し、先程読み込んだデータをデータフレームに変換していきます。
df = pd.DataFrame(wine_data.data, columns=wine_data.feature_names)
ここで、このデータセットの構造を確認してみます。以下の1行で変換したデータフレーム最初の5行を出力します。
print(df.head())
結果は以下のように出力され、13列のカラムがあることが分かります。
alcohol malic_acid ash alcalinity_of_ash magnesium ... proanthocyanins color_intensity hue od280/od315_of_diluted_wines proline 0 14.23 1.71 2.43 15.6 127.0 ... 2.29 5.64 1.04 3.92 1065.0 1 13.20 1.78 2.14 11.2 100.0 ... 1.28 4.38 1.05 3.40 1050.0 2 13.16 2.36 2.67 18.6 101.0 ... 2.81 5.68 1.03 3.17 1185.0 3 14.37 1.95 2.50 16.8 113.0 ... 2.18 7.80 0.86 3.45 1480.0 4 13.24 2.59 2.87 21.0 118.0 ... 1.82 4.32 1.04 2.93 735.0 [5 rows x 13 columns]
クラスタリングは2次元の配列をつかって行うものなので、今回は、この中から”alcohol”と”color_intensity”のカラムを使っていきます。
そこで、前処理としてクラスタリング用のデータの整形を行います。ここではscikit-learnのモジュールであるpreprocessingを使っていきます。
X=df[["alcohol","color_intensity"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) print(type(X_norm))
クラスタリング
いよいよクラスタリングを行なっていきます。今回はクラスタを3つでやっていきます。
cls = KMeans(n_clusters=3) result = cls.fit(X_norm)
結果を出力
クラスタリングの結果をmatplotlibを使って出力します。scatterを使ってプロットをしています。
plt.scatter(X_norm[:,0],X_norm[:,1], c=result.labels_) plt.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show()
k-meansクラスタリングを出力してみよう
前項の内容をもとに作成した全体のコードが以下の通りです。
from matplotlib import pyplot as plt from sklearn import datasets, preprocessing from sklearn.cluster import KMeans import numpy as np import pandas as pd # datasetの読み込み wine_data = datasets.load_wine() # DataFrameに変換 df = pd.DataFrame(wine_data.data, columns=wine_data.feature_names) print(df.head()) # データの整形 X=df[["alcohol","color_intensity"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) # クラスタリング cls = KMeans(n_clusters=3) result = cls.fit(X_norm) # 結果を出力 plt.scatter(X_norm[:,0],X_norm[:,1], c=result.labels_) plt.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show()
実際に実行してみると最終的には以下のグラフのウィンドウが出力されます。図の中の赤い星が各クラスタの中心になります。
まとめ
今回はPythonでk-meansクラスタリングを実装しました。
Pythonなら自分で一から実装しなくても簡単にクラスタリングを行うことができます。クラスタリングは異なる特徴の集団から分類を行う際に便利な手法です。大量のデータ分析を行う際におすすめです。
監修してくれたメンター
メンター三浦
モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。 TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。 |

内容分かりやすくて良かったです!

ゆかりちゃんも分からないことがあったら質問してね!

分かりました。ありがとうございます!
TechAcademyでは、初心者でも、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。