階層クラスター分析の具体的な計算方法についてPythonのSciPyライブラリを用いて解説します.
結果の見方や非階層クラスター分析との違いについても解説しています.非階層クラスター分析については以下のページで解説しています.
例題の設定
クラスター分析を用いた統計解析を説明するために,以下の例題を用います.
「社会人21人に対して,副業の有無・収入・性別・年齢・結婚有無についてのデータを収集しました.収集したデータに対してクラスター分析を用いて,データの分類を行います.」
Pythonで読み込むせるデータ形式(CSVファイル)の作り方はこちら.
プログラムの作成・実行
Pythonを用いてプログラムの作成をします.
階層クラスター分析に必要な記述例は以下になります.
# ライブラリのインポート
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
# データの読み込み
workers = pd.read_csv("sample.csv")
# クラスタリングの実行
clu = linkage(workers, method='ward', metric='euclidean')
# 描画領域の定義
plt.figure(num=None, figsize=(16, 9))
# 樹形図の作成・出力
dendrogram(clu)
plt.show()
それぞれの記述内容について解説します.
① ライブラリのインポート
クラスター分析で用いるライブラリをインポートします.
3つのライブラリをインポートしますが,記述例と全く同じ内容で問題ありません.
# ライブラリのインポート
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
② データの読み込み
pd.read_csv関数を用いてCSVファイルの読み込み,データフレームに格納します.
データフレーム名(=の左側)は任意の値を入力します.””内は読み込むCSVファイル名を記述します.
# データの読み込み
workers = pd.read_csv("sample.csv")
③ クラスタリングの実行
linkageモジュールを用いてクラスタリングの実行結果を新しく定義した変数に格納します.linkageモジュールは,SciPyライブラリに含まれる階層クラスター分析を行うためのモジュール(関数みたいなもの)になります.
【引数の書き方】
1カラム目:データの読み込みで定義したデータフレーム名を記述してください.
「method」:クラスタリングの手法を記述します.ここでは最も一般的なward法を選択しています.
「metric」:サンプル間の距離の定義(類似度の求め方)を記述します.ここも最も一般的なユーグリッド距離(euclidean)を選択しています.
その他の手法や距離の定義については補足④と補足⑤をお読みください.
# クラスタリングの実行
clu = linkage(workers, method='ward', metric='euclidean')
④ 描画領域の定義
matplotlibライブラリを用いて描画領域を定義します.この後の樹形図を描画する場所を作っておくという意味です.
クラスター分析には直接関係ない部分なので記述例をそのままコピーしても問題ありません.
【引数の書き方】
「num」:図の識別子.ここでは1枚の図しか作成しないため”None”と記述します.
「figsize」:描画領域のサイズ.(width,height)をインチで指定します.
# 描画領域の定義
plt.figure(num=None, figsize=(16, 9))
⑤ 樹形図の作成・出力
dendrogramモジュールを用いて樹形図を作成します.
matplotlibライブラリを用いて作成した樹形図を出力します.
# 樹形図の作成・出力
dendrogram(clu)
plt.show()
以上がSciPyを用いた階層クラスター分析になります.
PyCharmを用いている方は右上の「▶」ボタンを押すとプログラムが実行されます.
結果の見方
Pythonで階層クラスター分析を実行すると以下のような結果が出力されます.
樹形図では,低い位置で分かれているサンプル同士が似ていることを意味します.高い位置で分かれているサンプル同士はあまり似ていないこと意味します.
例題では,最も低い位置で分かれている8と18のデータが最も似ていることを意味します.高い位置で分かれている12のデータは他のデータと比較して特異なデータであることを意味します.
階層クラスター分析では樹形図からグループ分けを行います.縦軸が800のあたりで分けると,2つのグループに分けることができます.縦軸が300のあたりで分けると,4つのグループに分けることができます.
補足① クラスター分析とは
クラスター分析とは,データをいくつかのグループに分ける多変量解析になります.
グループの分け方によって様々なクラスタリング手法がありそれらをまとめてクラスター分析と言います.
クラスター分析によって分けられたグループにどのような特徴があるかは,分けられたグループのデータの構成や統計量(平均や分散)を求めることで調べる必要があります.
補足② グループ分けの目的
クラスター分析では,何をグループ分けしたいかによってデータの作成方法(入力手順)が変わります.
例題では,社会人(サンプル)をグループ分けしました.調査項目(変数)をグループ分けして似ている調査項目を調べたい場合は行と列を入れ替えてクラスター分析を行う必要があります.
補足③ 階層クラスター分析と非階層クラスター分析
クラスター分析には階層クラスター分析と非階層クラスター分析があります.
非階層クラスター分析では,樹形図を作成しません.クラスター分析を行う前にグループ数を決めて行う必要があります.
一方で,階層クラスター分析は計算量が膨大になるためビッグデータを分析したい際には不向きです.階層クラスター分析を行うサンプル数の目安は100以下になります.
補足④ 類似度の求め方
クラスター分析において,グループ分けを行う基準が類似度になります.類似度はサンプル同士の距離を用いて判定されます.
サンプル同士の距離の定義には,様々な方法がありますが特に意識しない場合はユークリッド距離を用いれば問題ありません.
linkageモジュールの引数の一覧は以下になります.
値 | 説明 |
euclidean | ユークリッド距離(既定値) |
seuclidean | 標準化ユークリッド距離 |
mahalanobis | マハラノビスの距離 |
cityblock | マンハッタン距離(市街地距離) |
chebychev | チェビシェフ距離(最大座標差) |
minkowski | ミンコフスキー距離 |
補足⑤ クラスタリング手法について
階層クラスタリングでは様々なクラスタリング手法があります.
クラスタリング手法は距離の定義によっては使えない手法もあります.距離の定義で”ユークリッド距離”を選択した場合は,ward法を用いるのが一般的になります.
linkageモジュールの引数の一覧は以下になります.
値 | 説明 |
ward | ウォード法 ※ユークリッド距離のみ有効 |
single | 最短距離法(最近隣法) |
complete | 最長距離法(最遠隣法) |
centroid | 重心法(重心までの距離)※ユークリッド距離のみ有効 |
average | 群平均法 |
median | メディアン法 ※ユークリッド距離のみ有効 |
補足⑥ 統計解析アプリ
本サイトではより手軽にクラスター分析を実行して,樹形図の作成を行うPC用アプリ(StaatApp)を販売しています.
詳細は以下のページで紹介しています.
》StaatAppで行うクラスター分析
》統計解析アプリStaatAppとは
補足⑦ PyCharmを用いた実行環境の構築
Pythonを初めて使う方や,自分のPCにPython・PyCharmが入っていない方は以下のページで解説している手順で実行環境の構築を行ってください.
初めて触る方にもわかりやすいようにPyCharmを用いた手順となっています.階層クラスター分析では,”Scipy”というライブラリを使用します.インストール方法が分からない方は,ライブラリのインストールを参考にしてください.
》実行環境の構築方法【Pycharm使用】
》ライブラリのインストール方法【Pycharm使用】
補足⑧ Pythonで読み込むデータの作成方法
Pythonで扱うCSVファイルの作成方法は以下のページで解説しています.