このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Python入門】Pythonの機械学習ライブラリ(Scikit-learn)

Pythonの機械学習ライブラリ(Scikit-learn)
いよいよ機械学習の代表例である「クラスタリング」を実行してみましょう。これまで学習したCSVファイルの読み込み、Pandasによる加工や可視化の知識を組み合わせ、Scikit-learn(サイキットラーン)ライブラリを使って実際のデータにクラスタリング手法を適用します。今回は、サンプルとして k-means (ケーミーンズ法)を用います。k-meansはあらかじめ指定した「k個」のクラスタにデータを自動的に振り分ける手法で、Scikit-learnのKMeansクラスを使うことで簡単に実装できます。

プログラムのダウンロード
「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。
1.Scikit-learnとは
Scikit-learnはPythonで最も有名な機械学習ライブラリの一つで、次のような幅広いタスクをカバーしています。
- 分類(Classification)
- 回帰(Regression)
- クラスタリング(Clustering)
- 次元削減(Dimensionality Reduction)
- モデルの評価・チューニング(Model Selection) など
クラスタリングでは、データ同士の類似度を計算してグループ分け(クラスタ)を行うことで、未知のデータを自動的に分類します。データがどのような構造をもっているかを把握する初期探索やマーケティング分析などに頻繁に使われます。
1.1.インストール方法
Scikit-learnは標準ライブラリではないため、Anaconda NavigatorのGUI以外の環境で使用する場合は以下のようにしてインストールを行います。
| 環境 | インストールコマンド |
|---|---|
| CPython(通常のPython) | pip install scikit-learn |
| Anaconda / Miniconda | conda install -y scikit-learn |
Scikit-learnはインストール時にNumPyやSciPyなどの依存パッケージも自動的に導入されます。インストール後はimport sklearnでエラーが出なければ利用可能です。
2.サンプル用データの作成
ここでは、「science_data.csv」と呼ばれるCSVファイルを使用します。以下のスクリプトをJupyterLabのセルで実行すると、200行のダミーデータ(物理 Physics、生物 Biology、化学 Chemistry)を作成してファイルに保存します。クラスタリングで複数の中心にまとまるよう、3か所程度のグループが生成される仕組みにしています。
import random
def create_science_data(filename="science_data.csv", rows=200):
"""
物理(Physics), 生物(Biology), 化学(Chemistry)の3列を持つ
ダミーデータを200行生成し、CSVファイルに出力する関数。
"""
random.seed(0)
with open(filename, "w", encoding="utf-8") as f:
f.write("Physics,Biology,Chemistry\n")
for _ in range(rows):
# クラスタを3グループ程度にわけ、中心付近の値をランダム生成
cluster_choice = random.choice([1,2,3])
if cluster_choice == 1:
physics = random.randint(40,60)
biology = random.randint(50,70)
chemistry = random.randint(50,65)
elif cluster_choice == 2:
physics = random.randint(70,90)
biology = random.randint(55,80)
chemistry = random.randint(60,90)
else:
physics = random.randint(80,100)
biology = random.randint(70,100)
chemistry = random.randint(70,95)
f.write(f"{physics},{biology},{chemistry}\n")
print(f"ファイル '{filename}' を作成しました({rows}行のデータ)。")
# 実行例: science_data.csvを作成
create_science_data("science_data.csv", rows=200)
実行結果
ファイル 'science_data.csv' を作成しました(200行のデータ)。このスクリプトを実行後、カレントディレクトリにscience_data.csvが生成されます。データは擬似的に3つのグループに分かれており、クラスタリングに適したサンプルとして使えます。
3.Scikit-learnでクラスタリングを行う手順
- CSVファイルを読み込み、PandasのDataFrameとして保持
- KMeansモデルを作成し、fitメソッドでクラスタリングを実行
- クラスタ番号(labels_属性)をDataFrameに追加
- 結果をファイル出力したり、散布図で可視化して確認
3.1.クラスタリングを実行する
まずは、物理(Physics)と化学(Chemistry)の2列だけを抽出し、「k=3」のKMeansクラスタリングを行います。
import pandas as pd
from sklearn.cluster import KMeans
def clustering_example(csv_file="science_data.csv", n_clusters=3):
"""
CSVファイルを読み込み、指定された列(2列)に対してKMeansクラスタリングを実行するサンプル。
結果のクラスタ番号をDataFrameに追加し、表示・出力する。
"""
# データを読み込む
df = pd.read_csv(csv_file, encoding="utf_8")
# KMeansモデルを定義(n_clusters=クラスタ数を指定)
model = KMeans(n_clusters=n_clusters)
# 例えばPhysicsとChemistryの2列でクラスタリング
model.fit(df[["Physics","Chemistry"]])
# クラスタ番号をDataFrameに追加
df["Cluster"] = model.labels_
# 結果をコンソールに表示
print(df.head(10))
# CSVに出力 (cluster_result.csv)
df.to_csv("cluster_result.csv", index=False)
print("クラスタリング結果を cluster_result.csv に保存しました。")
# 実行例
clustering_example("science_data.csv", n_clusters=3)実行結果
Physics Biology Chemistry Cluster
0 83 56 68 2
1 95 82 95 0
2 85 66 78 2
3 56 54 59 1
4 43 69 58 1
5 99 98 74 0
6 73 78 62 2
7 90 85 87 0
8 51 63 60 1
9 100 99 76 0
クラスタリング結果を cluster_result.csv に保存しました。解説
df[["Physics","Chemistry"]]: DataFrameの中から2列だけをスライスし、fitメソッドに渡す。KMeans(n_clusters=n_clusters).fit(...):n_clusters個のクラスタに分割するk-meansモデルを作成し、学習(クラスタリング)を実行。model.labels_: クラスタリングの結果、各データ(行)に付与されたクラスタ番号(0, 1, 2など)を取得。df["Cluster"] = model.labels_: 結果をDataFrameに新しい列として追記。df.to_csv("cluster_result.csv", index=False): そのままCSVとして出力すれば結果の確認や二次利用が容易。
実行結果として、ターミナルやJupyterLab上には先頭数行が表示され、クラスタ番号の列が追加されていることがわかります。
k-meansアルゴリズムの初期値がランダムに決定される都合上、実行ごとにクラスタ番号や分割が若干異なる場合があります。
4.クラスタリング結果を可視化する
クラスタリング結果を眺めるだけでなく、実際に散布図で表示すると、どのように分割されているかが直感的にわかります。以下では、Pandasのplot.scatter()を使って、クラスタに応じた色分けを行います。
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
def plot_clustered_scatter(csv_file="science_data.csv", n_clusters=3):
"""
DataFrameを読み込み、Physics, Chemistryの2変数を使ってKMeansクラスタリングし、
その結果を散布図として表示・保存するサンプル関数。
"""
df = pd.read_csv(csv_file, encoding="utf_8")
# KMeansモデルの作成と学習
model = KMeans(n_clusters=n_clusters)
model.fit(df[["Physics","Chemistry"]])
# 結果のクラスタ番号を追加
df["Cluster"] = model.labels_
# 散布図: c=クラスタ番号 で色分け、edgecolorやサイズなども調整可能
ax = df.plot.scatter(
x="Physics",
y="Chemistry",
c=df["Cluster"], # クラスタ番号を色として使う
s=100,
edgecolor="black",
figsize=(6, 6)
)
# 図を保存
plt.savefig("cluster_scatter.png")
# 画面表示
plt.show()
# 実行例
plot_clustered_scatter("science_data.csv", n_clusters=3)実行結果

解説
df[["Physics","Chemistry"]]: 2次元の散布図を描きやすいように列を抽出。model.labels_: 各行に付与されたクラスタ番号をDataFrameの新しい列"Cluster"に格納。df.plot.scatter(..., c=df["Cluster"]): ポイントの色をクラスタ番号で分ける。plt.savefig("cluster_scatter.png"): 作成したグラフをPNG形式で保存。plt.show(): グラフをGUI画面やJupyterLab上に表示。終了は[Q]キーなど。
実行すると、物理(Physics)を横軸、化学(Chemistry)を縦軸にした散布図が作成され、3色に分かれたクラスタが視覚的に確認できるでしょう。クラスタ0,1,2は色やマーカーで区別されます。
まとめ
Scikit-learnを使えば、k-meansをはじめとする多様な機械学習アルゴリズムを数行のコードで適用できます。今回の例では、
- CSVファイルをPandasで読み込み
- DataFrameから対象となる列を抽出
- KMeansを使ってクラスタリングを実行
- ラベル(cluster number)をDataFrameに追加
- 散布図で色分け表示&保存
という流れでクラスタリングを体験しました。データが複数の列を持つ場合は、クラスタリングに使う列を選ぶだけで、いろいろな観点からグルーピングを試せます。クラスタ数n_clustersを変えてみたり、他の列を使って散布図を描いてみたりすると、さらに深い分析が可能になるでしょう。
機械学習の世界では、このように「実際にデータを読み込み→アルゴリズムを適用→可視化・評価」というサイクルを繰り返すことが基本です。次のステップとしては、学習結果の評価指標(例えばシルエット係数など)を算出したり、別のアルゴリズムを試したりしてみてください。
