このページで解説している内容は、以下の 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で最も有名な機械学習ライブラリの一つで、次のような幅広いタスクをカバーしています。

  1. 分類(Classification)
  2. 回帰(Regression)
  3. クラスタリング(Clustering)
  4. 次元削減(Dimensionality Reduction)
  5. モデルの評価・チューニング(Model Selection) など

 クラスタリングでは、データ同士の類似度を計算してグループ分け(クラスタ)を行うことで、未知のデータを自動的に分類します。データがどのような構造をもっているかを把握する初期探索やマーケティング分析などに頻繁に使われます。

1.1.インストール方法

 Scikit-learnは標準ライブラリではないため、Anaconda NavigatorのGUI以外の環境で使用する場合は以下のようにしてインストールを行います。

環境インストールコマンド
CPython(通常のPython)pip install scikit-learn
Anaconda / Minicondaconda 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でクラスタリングを行う手順

  1. CSVファイルを読み込み、PandasのDataFrameとして保持
  2. KMeansモデルを作成し、fitメソッドでクラスタリングを実行
  3. クラスタ番号(labels_属性)をDataFrameに追加
  4. 結果をファイル出力したり、散布図で可視化して確認

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をはじめとする多様な機械学習アルゴリズムを数行のコードで適用できます。今回の例では、

  1. CSVファイルをPandasで読み込み
  2. DataFrameから対象となる列を抽出
  3. KMeansを使ってクラスタリングを実行
  4. ラベル(cluster number)をDataFrameに追加
  5. 散布図で色分け表示&保存

 という流れでクラスタリングを体験しました。データが複数の列を持つ場合は、クラスタリングに使う列を選ぶだけで、いろいろな観点からグルーピングを試せます。クラスタ数n_clustersを変えてみたり、他の列を使って散布図を描いてみたりすると、さらに深い分析が可能になるでしょう。

 機械学習の世界では、このように「実際にデータを読み込み→アルゴリズムを適用→可視化・評価」というサイクルを繰り返すことが基本です。次のステップとしては、学習結果の評価指標(例えばシルエット係数など)を算出したり、別のアルゴリズムを試したりしてみてください。