Pythonによるk-meansクラスタリングの実装方法を現役エンジニアが解説【初心者向け】
初心者向けにPythonによるk-meansクラスタリングの実装方法について現役エンジニアが解説しています。k-meansとはクラスタリングの手法の一つで、非階層型クラスタリングのアルゴリズムです。scikit-learnのデータセットを使いクラスタリングを実装して、matplotlibを使いグラフにして表示します。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
監修してくれたメンター
平野 勝靖
Pythonによるk-meansクラスタリングの実装方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
目次
- 1. k-meansとは?
- 2. Numpyのインストール
- 3. Pandasのインストール
- 4. scikit-learnのインストール
- 5. matplotlibのインストール
- 6. 各ライブラリの使い方
- 7. k-meansクラスタリングを出力してみよう
- 8.まとめ
- Pythonを学習中の方へ
そもそもPythonについてよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。
今回は、Pythonに関する内容だね!
どういう内容でしょうか?
Pythonによるk-meansクラスタリングの実装方法について詳しく説明していくね!
お願いします!
1. k-meansとは?
k-meansとはクラスタリングの手法の一つで、非階層型クラスタリングのアルゴリズムです。
クラスタの平均を用いて、与えられたクラスタ数 k個に分類することからこの名前が付けられました。k平均法と呼ばれることもあります。
非階層型クラスタリングとは、異なる性質の集団の中から似た特徴を持ったものでクラスタを行う手法のことです。
階層型と異なり、階層的な構造を持たず、予め決められたクラスタ数でサンプルを分類します。サンプルが大量にある正規分布のデータに対して、データをグループ分けを行う際に効果的です。また、クラスタリングは機械学習の手法一つでアルゴリズムから特徴を見つけて分類を行うことから、「教師なし学習」となります。
2. Numpyのインストール
ここからはPythonでクラスタリングを行うための環境をセッティングしていきます。まずは、配列の演算を扱うためのライブラリとしてNumpyをインストールしていきます。
以下のコマンドを実行してインストールします。
pip install numpy
3. Pandasのインストール
続いて、サンプルデータのファイルを読み込み、データフレームの形式に変換するためにPandasをインストールします。
pip install pandas
4. scikit-learnのインストール
機械学習ライブラリのscikit-learnをインストールします。scikit-laernは機械学習のアルゴリズムやサンプルのデータが同梱されています。
pip install scikit-learn
5. matplotlibのインストール
クラスタリングの結果をグラフにプロットするためにmatplotlibをインストールします。
pip install matplotlib
6. 各ライブラリの使い方
必要なライブラリをインストールできたら、ライブラリのインポートを行います。各ライブラリのインポートは以下の通りです。
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()
7. 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()
実際に実行してみると最終的には以下のグラフのウィンドウが出力されます。図の中の赤い星が各クラスタの中心になります。
7-1. データに異常値が存在する場合
赤い星のクラスタの中心からの距離が遠いデータが存在した場合、そのデータは同じクラスタでも性質が異なることを意味します。
このようなデータを異常値と呼び、この異常値が存在は クラスタリングの精度を低下させます。
そのため、異常値と判断した場合は「該当データの削除」や「データや特徴量の追加」の検討が必要です。
仮に 前述のワインのデータセットにおいて、左上の赤矢印のデータが存在した場合を考えてみましょう。
赤矢印のデータは 黄色にクラスタリングされていますが、他の黄色のデータと比較して、赤い星のクラスタの中心から距離があります。
そのため、黄色の他のデータとは 別の性質を持つ異常値である可能性が高いと判断できます。
また、この異常値によって 赤い星のクラスタの中心が、異常値が存在しなかった場合と比較して、左上に移動しており、緑や紫のクラスタとの境界が変わってしまっています。
異常値が存在しなかった場合のクラスタリングを正とした場合、異常値によって 誤ったクラスタリングとなっています。
以上のように、クラスタリングを行う場合は、異常値に注意する必要があります。
なお、異常値と判断する距離については、解析の目的やデータセットに依存します。
そのため、データについて深く理解した上で、閾値となる距離の設定するようにしましょう。
7-2. クラスタ数が適切ではない場合
前述のコードでは クラスタ数を3つに設定しましたが、クラスタ数が適切でなかった場合(仮に5つに設定)のクラスタリング結果が以下となります。
クラスタ数 3のクラスタリングを正とした場合、5とした場合は正しくクラスタリングできていない事が分かりますね。
このように、正しくクラスタリングを行うためには、クラスタ数を適切に選択する必要があります。
一般的に クラスタ数は分類したいクラスタの数から設定しますが、経験に基づく所が多くあります。
そのため、こちらもデータについて深く理解した上で、仮のクラスタ数を設定し、クラスタリングを実施。
そして、その結果をクラスタ数にフィードバックし、再度クラスタリングを行うトライ&エラーにより設定しましょう。
7-3. k-meansによるクラスタリングが適していない場合
k-meansは、扱うデータが以下のいずれかに当てはまる場合、クラスタリングの精度が低下します。
1.クラスタが球形でない場合
2.クラスタ間のデータのばらつきが等しくない場合
それぞれについて 例を用いて説明します。
7-3.1.クラスタが球形でない場合
k-meansは、クラスタが 球形であると仮定します。
そのため、以下のような細長いクラスタなどでは、正しくクラスタリングできないことがあります。
7-3.2.クラスタ間のデータのばらつきが等しくない場合
k-meansは、データを データのばらつきの等しいグループに分け、クラスタリングを行います。
そのため、以下のようなクラスタ間のばらつきが異なるデータの場合は、正しくクラスタリングできないことがあります。
以上が、k-meansによるクラスタリングが適していないデータの解説となります。
逆に「クラスタが球形であり、データのばらつきが等しい」データの場合は、クラスタリングの手法としてk-meansを試してみるといいでしょう。
8.まとめ
今回はPythonでk-meansクラスタリングを実装しました。
Pythonなら自分で一から実装しなくても簡単にクラスタリングを行うことができます。クラスタリングは異なる特徴の集団から分類を行う際に便利な手法です。大量のデータ分析を行う際におすすめです。
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
Pythonを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPythonコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、人工知能(AI)や機械学習の基礎を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!