はじめに
前回の記事では、大学時代に作成したR言語による「クラスター分析」の資料を掘り起こし、2010年当時の分析を2026年のR環境で再現してみました。
その結果、ウォード法については、2010年当時の method = "ward" が現在のRでは正式な指定方法ではなくなっており、現在は ward.D や ward.D2 を使用することが分かりました。
一方、K平均法については、2010年当時のコードを現在のR 4.5.2でも実行することができました。
前回の記事の最後に、
次は同じ分析をPythonではどう分析するのか検証したいです。
と書いたので、今回はその続編です。
今回は、前回とまったく同じデータを使って、Pythonでクラスター分析を再現してみます。
前回のRによる分析結果と比較しながら、Pythonではどのようなコードになるのかも確認していきます。
1.今回使用するデータ
今回使用するデータは、前回の記事と同じものです。
| Ⅰ | Ⅱ | |
|---|---|---|
| A | 34 | 89 |
| B | 45 | 67 |
| C | 56 | 71 |
| D | 25 | 92 |
| E | 98 | 20 |
今回はRとPythonの違いを比較することが目的なので、データは変更せず、前回とまったく同じものを使用します。
2.Pythonの環境
今回の分析で使用したPythonのバージョンは以下です。
Python version: 3.13.5
また、以下のライブラリを使用します。
- pandas
- matplotlib
- scipy
- scikit-learn
それぞれ、データ操作、グラフ描画、階層型クラスター分析、K平均法に使用します。
import pandas as pd
import matplotlib.pyplot as plt
ウォード法による階層型クラスター分析では、scipy の hierarchy を使用します。
from scipy.cluster import hierarchy
K平均法では、scikit-learn の KMeans を使用します。
from sklearn.cluster import KMeans
3.データをPythonに入力する
まず、pandasのDataFrameとしてデータを作成します。
data = pd.DataFrame(
[
[34, 89],
[45, 67],
[56, 71],
[25, 92],
[98, 20]
],
columns=["Ⅰ", "Ⅱ"],
index=["A", "B", "C", "D", "E"]
)
print(data)
これで、前回Rで使用したものと同じデータをPythonに用意することができました。
4.ウォード法(階層型手法)
まずは、前回の記事でも扱ったウォード法による階層型クラスター分析をPythonで実行します。
4-1.距離計算
前回のRでは、dist() を使ってユークリッド距離を計算しました。
data.d <- dist(data)
Pythonでは、scipy.cluster.hierarchy の pdist() を使用します。
dist = hierarchy.distance.pdist(
data,
metric="euclidean"
)
今回はRで行った分析と合わせるため、距離にはユークリッド距離を使用します。
4-2.ウォード法によるクラスタリング
続いて、ウォード法によるクラスタリングを行います。
linkage = hierarchy.linkage(
dist,
method="ward"
)
Pythonでは scipy.cluster.hierarchy.linkage() を使用して階層型クラスター分析を行います。
Rでは hclust() を使用していましたが、Pythonでは linkage() が対応する処理になります。
4-3.デンドログラムを描画する
階層型クラスター分析の結果をデンドログラムで確認します。
fig, ax = plt.subplots(figsize=(5, 5))
hierarchy.dendrogram(
linkage,
labels=data.index,
ax=ax
)
plt.show()
A~Eのデータが、どのような順番でクラスターにまとめられていくのかを確認することができます。
5.K平均法(非階層型手法)
続いて、非階層型手法であるK平均法をPythonで実行します。
前回のRでは、以下のコードを使用しました。
kmeans(data, 3, iter.max = 10, nstart = 1,
algorithm = c("Hartigan-Wong"))
Pythonでは、scikit-learn の KMeans を使用します。
5-1.K平均法によるクラスタリング
kmeans = KMeans(
n_clusters=3,
max_iter=10,
n_init=1,
random_state=0
)
kmeans.fit(data)
今回は、前回のRで3クラスターに分類していたため、n_clusters=3 としています。
また、2010年当時の分析との比較を意識して、max_iter=10、n_init=1 としています。
random_state=0 は、結果を再現できるように乱数の状態を固定するために指定しています。
5-2.各データのクラスタ番号を確認する
K平均法によって分類されたクラスタ番号を確認します。
data["cluster"] = kmeans.labels_
print("クラスタ番号")
print(kmeans.labels_)
各データがどのクラスタに分類されたのかを確認することができます。
ここで注意したいのは、クラスタ番号そのものには意味がないということです。
例えば、Rで「クラスター1」だったグループが、Pythonでは「クラスター2」と表示されることがあります。
重要なのは番号ではなく、どのデータ同士が同じクラスターに分類されたかです。
5-3.散布図でクラスタリング結果を確認する
最後に、クラスターごとにデータを色分けして散布図に表示します。
for cluster in sorted(data["cluster"].unique()):
cluster_data = data[data["cluster"] == cluster]
plt.scatter(
cluster_data["Ⅰ"],
cluster_data["Ⅱ"],
label=f"Cluster {cluster + 1}"
)
# A~Eのラベルを表示
for name, row in cluster_data.iterrows():
plt.text(
row["Ⅰ"],
row["Ⅱ"],
name
)
plt.xlabel("Ⅰ")
plt.ylabel("Ⅱ")
plt.legend()
plt.show()
データA~Eが、2つの変数によってどのように分かれているのかを視覚的に確認することができます。
6.RとPythonの結果を比較してみる
ここまでで、前回Rで行った2種類のクラスター分析をPythonでも実行することができました。
前回のRによるK平均法では、以下の3クラスターに分類されました。
- クラスター1:A、D
- クラスター2:E
- クラスター3:B、C
今回のPythonでも、同じデータがどのように分類されたのかを確認してみます。
ここで重要なのは、クラスタ番号ではなく、クラスタの構成を比較することです。
例えば、
R
クラスター1:A、D
クラスター2:E
クラスター3:B、C
Python
クラスター○:A、D
クラスター○:E
クラスター○:B、C
のようになっていれば、番号が違っていても、分類そのものは同じと考えることができます。
7.RとPythonのコードを比較してみる
今回の分析を通して、RとPythonでは同じクラスター分析でもコードの書き方が異なることが分かりました。
| 処理 | R | Python |
|---|---|---|
| データ |
matrix() / data.frame()
|
pd.DataFrame() |
| 距離計算 | dist() |
pdist() |
| 階層型クラスタリング | hclust() |
linkage() |
| デンドログラム | plot() |
dendrogram() |
| K平均法 | kmeans() |
KMeans() |
| クラスタ番号 | cluster |
labels_ |
統計的に行っていることは同じでも、使用するライブラリや関数、引数の名前などには違いがあります。
一方で、
「距離を計算する → クラスタリングする → 結果を確認する」
という分析の流れそのものは、RでもPythonでも変わりません。
8.まとめ
今回は、前回Rで行ったクラスター分析を、Pythonでも再現してみました。
ウォード法による階層型クラスター分析では、Pythonの scipy.cluster.hierarchy を使用しました。
また、K平均法では scikit-learn の KMeans を使用しました。
RとPythonではコードの書き方は異なりますが、同じ統計手法をそれぞれの環境で実行することができます。
前回は、2010年に大学時代に作成したRのコードを2026年のR環境で再実行しました。
今回はさらに一歩進めて、同じデータと分析をPythonでも再現してみました。
16年前に学んだクラスター分析が、RだけでなくPythonでも現在の環境で実行できることを確認できました。
RとPythonのどちらを使う場合でも、重要なのはコードそのものだけではなく、
- どのような距離を使うのか
- どのクラスター分析手法を使うのか
- クラスター数をどう決めるのか
- 得られたクラスターをどのように解釈するのか
といった、分析そのものについて理解することなのだと思います。
今回は非常に小さなデータセットを使った検証でしたが、RとPythonの両方で同じ分析を実行してみることで、それぞれのコードの違いだけでなく、クラスター分析そのものについても改めて理解するきっかけになりました。

