システムトレードと機械学習の為の「階層的クラスタリング」について

Python

階層的クラスタリングは、データを「階層状」に分類する、機械学習における分析手法の一つです。
この方法では、データがどのように似ているかを視覚的に確認することができるため、データの構造を理解するために広く利用されています。この記事では、初学者の方でもわかるように、階層的クラスタリングの基本から解説します。


スポンサーリンク
スポンサーリンク

階層的クラスタリングとは?

階層的クラスタリングとは、データを階層構造に分けていく方法です。データが少しずつ小さいグループにまとまったり、逆に統合されたりする過程を通じて、全体像を階層的に表現します。

階層構造のイメージ

階層構造とは、データが木の枝のように分類されていく形を指します。

  • 最初は全体を1つの大きなグループとします。
  • そこから特徴が似ているデータ同士を細かいグループに分けます。
  • 最終的には、データが個別の小さなグループに分類されます。

具体例:お菓子を分類する

例えば、スーパーで売られているお菓子を分類するとします。

  1. 最初に「すべてのお菓子」を1つのグループにします。
  2. 次に「チョコレート系」と「スナック系」に分けます。
  3. さらに「スナック系」を「ポテトチップス」と「クラッカー」に分けます。
  4. 「ポテトチップス」を味ごとに「塩味」「のり味」「コンソメ味」に分けます。

このようにして、全体を少しずつ細かく分類することで、データの特徴を階層的に整理することができます。


デンドログラムとは?

デンドログラムとは、階層的クラスタリングの結果を「木のような形」で表した図のことです。この図を見ることで、どのデータがどの順番で統合されたか、あるいは分割されたかを確認できます。

デンドログラムの特徴

  • デンドログラムは、木の枝のような形をしています。
  • 横軸にはデータの名前や番号が表示されます。
  • 縦軸には「データ同士がどれくらい離れているか(距離)」が表示されます。

デンドログラムの例え

例えば、家族の血縁関係を考えてみてください。親と子のつながりを表す家系図のように、デンドログラムもデータ同士の関係を可視化します。近い位置にあるデータは似ていて、遠い位置にあるデータは異なるということを示しています。


距離の計算方法について

階層的クラスタリングでは、データ同士の距離を計算することが重要です。距離の計算にはいくつかの方法があります。

ユークリッド距離(直線距離)

ユークリッド距離とは、2つの点を直線で結んだときの長さのことです。地図で2つの町の位置を示し、定規で測るようなイメージです。

計算式
距離 = sqrt((x2-x1)^2 + (y2-y1)^2)


点A(1, 2)と点B(4, 6)の場合、計算は以下の通りです。

  1. まず、各座標の差を計算します。
    • x座標の差:4 – 1 = 3
    • y座標の差:6 – 2 = 4
  2. 次に、それぞれの差を二乗します。
    • (x2 – x1)^2 = 3^2 = 9
    • (y2 – y1)^2 = 4^2 = 16
  3. これらを足し合わせます。
    • 9 + 16 = 25
  4. 最後に平方根を取ります。(平方根とは、ある数を2回掛けて元の数になる値のことです)
    • sqrt(25) = 5

したがって、点Aと点Bの距離は5です。

マンハッタン距離(縦横の距離)

マンハッタン距離とは、縦横に移動する距離の合計です。将棋やチェスの駒が動く距離に似ています。

計算式
距離 = abs(x2-x1) + abs(y2-y1)

計算式 距離 = abs(x2-x1) + abs(y2-y1)

点A(1, 2)と点B(4, 6)の場合、計算は以下の通りです。

  1. まず、各座標の差を絶対値で求めます(絶対値とは、負の数を考えずに数の大きさだけを扱うことです)。
    • x座標の差:abs(4 – 1) = 3
    • y座標の差:abs(6 – 2) = 4
  2. 次に、それらを足し合わせます。
    • 3 + 4 = 7

したがって、点Aと点Bのマンハッタン距離は7です。

コサイン類似度(角度の違いで比較)

コサイン類似度は、データ間の「角度」に注目して、どれくらい似ているかを測る方法です。距離ではなく「方向性」を比較します。

計算式
類似度 = (x1x2 + y1y2) / (sqrt(x1^2 + y1^2) * sqrt(x2^2 + y2^2))

点A(3, 4)と点B(6, 8)の場合、計算は以下の通りです。

  1. まず、各座標の積を求めます。
    • x1 * x2 = 3 * 6 = 18
    • y1 * y2 = 4 * 8 = 32
  2. 次に、それらを足し合わせます。
    • 18 + 32 = 50
  3. 次に、それぞれのベクトルの長さ(大きさ)を求めます(ベクトルとは、向きと大きさを持つ量のことです。例えば、地図上での移動距離とその方向を示すようなものです)。
    • sqrt(x1^2 + y1^2) = sqrt(3^2 + 4^2) = sqrt(9 + 16) = sqrt(25) = 5 (これは、点Aから原点までの距離を求めています)
    • sqrt(x2^2 + y2^2) = sqrt(6^2 + 8^2) = sqrt(36 + 64) = sqrt(100) = 10 (これは、点Bから原点までの距離を求めています)
  4. 最後に、内積をベクトルの長さで割ります(内積とは、2つのベクトルの対応する要素を掛け合わせた結果を足し合わせたものです。ベクトルの類似度や関係性を調べるときに使われます)。
    • 類似度 = 50 / (5 * 10) = 50 / 50 = 1

したがって、点Aと点Bのコサイン類似度は1です(これは、二つのベクトルが完全に同じ方向を向いていることを意味します)。


階層的クラスタリングを実際に使ってみる

サンプルコード

以下は、Pythonを使った階層的クラスタリングのサンプルコードです。

# 必要なライブラリをインポート
from sklearn.cluster import AgglomerativeClustering  # 階層的クラスタリングを行うライブラリ
from scipy.cluster.hierarchy import dendrogram, linkage  # デンドログラム作成用
import matplotlib.pyplot as plt  # グラフを描画するライブラリ
import numpy as np  # 数値計算を簡単にするライブラリ

# サンプルデータを作成
# データは2次元平面上の5つのポイントを表します
data = np.array([[1, 2], [3, 4], [5, 6], [8, 8], [10, 10]])

# 階層的クラスタリングの計算
# linkage関数を使い、Ward法でデータ間の距離を計算します
linkage_matrix = linkage(data, method='ward')

# デンドログラムの描画
plt.figure(figsize=(8, 5))  # 図のサイズを指定
dendrogram(
    linkage_matrix,  # 階層的クラスタリングの結果を渡します
    labels=[f"Point {i+1}" for i in range(len(data))]  # 各データにラベルをつけます(Point 1, Point 2など)
)
plt.title("デンドログラム")  # グラフのタイトル
plt.xlabel("データポイント")  # 横軸のラベル
plt.ylabel("距離")  # 縦軸のラベル
plt.show()  # グラフを表示

サンプルコードの解説

このコードでは、次のような流れで階層的クラスタリングを実施しています。

ライブラリのインポート

  • from sklearn.cluster import AgglomerativeClustering: 階層的クラスタリングを行うために必要なライブラリをインポートします。
    • from ... import ...の形式は、特定のモジュールから必要なクラス関数だけを取り込むときに使います。ここでは、AgglomerativeClusteringだけを使いたいのでこの形式を使用しています。
  • from scipy.cluster.hierarchy import dendrogram, linkage: デンドログラムを描画するために必要な関数をインポートします。
    • このように複数の関数をカンマで区切ってインポートすることもできます。
  • import matplotlib.pyplot as plt: グラフを描画するためのライブラリです。
    • as pltは、matplotlib.pyplotを短縮してpltと呼ぶようにするものです。こうすることで、コードが簡潔になります。
  • import numpy as np: 数値計算を簡単に行うためのライブラリです。
    • 同様に、as npnumpyを短縮してnpとすることでコードを読みやすくしています。

np.array関数でデータを準備

np.array関数は、リスト形式のデータを効率的な数値計算用の形式に変換します。この配列形式は、大量の数値データを扱う際に処理速度が向上するため、科学計算やデータ分析で頻繁に利用されます。

例:
data = np.array([[1, 2], [3, 4]])
このコードは、2次元の配列を作成し、変数dataに格納しています。

linkage関数で階層構造を計算

linkage関数は、データ間の階層的な構造を計算するための関数です。ここではmethod='ward'を指定しています。

Ward法は、統合されるグループの分散(ばらつきの大きさ)を最小化する方法です。分散が小さいほど、データがまとまりやすく、分析しやすい構造が得られます。

例:
linkage_matrix = linkage(data, method=’ward’)
このコードは、データの階層構造を計算し、結果をlinkage_matrixに保存しています。

引数の説明

  • data: クラスタリングするデータを指定します。ここでは、2次元平面上の複数の点を含む配列です。
  • method='ward': グループを統合する際の方法を指定します。Ward法は、データを統合する際に、分散が最小になるようにクラスタを作成する方法です。(分散とは、データがどれくらいばらついているかを示す指標で、値が大きいほどデータが広く散らばっていることを意味します)。

dendrogram関数でデンドログラムを作成

dendrogram関数は、階層構造を視覚的に表示するための関数です。

例:
dendrogram(linkage_matrix, labels=[“Point 1”, “Point 2”])
このコードは、linkage_matrixの内容をもとにデンドログラムを作成し、各データポイントにラベルを付けます。
引数の説明

labels: 各データポイントに付ける名前のリストです。ここでは、Point 1, Point 2などの名前を各データに割り当てています。このラベルを使って、デンドログラム上でどのデータがどこにあるかを分かりやすくしています。

linkage_matrix: 階層的クラスタリングの結果を表すデータです。この情報を使って、どのデータがどの順番で統合されたかを示すデンドログラムを作成します。

plt.showでグラフを表示

plt.show関数は、これまでに作成したグラフを画面に表示するための関数です。これがないと、グラフは表示されません。


階層的クラスタリングの応用例

階層的クラスタリングは、以下のような場面で使われています。

生物学での応用:進化の系統樹を作る

階層的クラスタリングは、生物の進化関係を表す「系統樹」を作るのに使われます。

系統樹とは:生物が進化の過程でどのように分岐して現在の形になったかを、木の枝のような図で表したものです。例えば、哺乳類が爬虫類から分岐し、その中でさらに犬と猫が異なる進化を遂げた、という関係がわかります。

具体例
遺伝子の情報をもとに、DNAの配列がどれだけ似ているかを比較します。似ている配列同士をグループ化することで、「どの動物がどのような進化をしてきたか」が視覚的に理解できます。例えば、ゾウとマンモスは近い位置に分類され、ヘビやカメは少し離れた場所に分類されます。


マーケティングでの応用:顧客の購買データの分析

顧客が購入する商品の傾向を分析して、似た行動を取るグループを見つけることができます。

具体例
スーパーで販売された商品の購入データをもとに、顧客を分類します。例えば:

  • 「子供向けのお菓子をよく買う家庭」
  • 「お酒や高級な食品を購入する人」
  • 「低価格の商品をまとめ買いする人」
    といったグループを作り、どのようなキャンペーンを展開するべきかを決めるのに役立ちます。

テキスト分析での応用:ニュース記事やSNS投稿の分類

大量の文章データを分類することで、話題やテーマごとに整理することができます。

具体例
ニュース記事を分類する場合、以下のようなグループに分けられます:

  • 「経済に関する記事」
  • 「スポーツの結果についての記事」
  • 「芸能人の活動に関する記事」
    これにより、ユーザーが興味を持ちそうな話題を簡単に見つけやすくなります。また、SNS投稿の場合、商品についてのポジティブな意見とネガティブな意見を分ける分析にも利用できます。

医学での応用:患者の分類

階層的クラスタリングは、患者の症状や検査結果をもとに、似た特徴を持つ患者を分類するのにも役立ちます。

具体例
病院で集められた検査データを分析して、患者を以下のように分類します:

  • 「糖尿病のリスクが高い患者」
  • 「心疾患の可能性がある患者」
  • 「現在健康だが予防が必要な患者」
    このように分類することで、各グループに適切な治療や予防方法を提案できます。

音楽や映画のレコメンデーションシステム

階層的クラスタリングは、ユーザーが好きそうな音楽や映画を勧めるシステムにも応用されています。

具体例
音楽ストリーミングサービスで、ユーザーの再生履歴をもとに、曲を以下のようなグループに分けます:

  • 「ロックやポップスを好む人向け」
  • 「クラシック音楽をよく聴く人向け」
  • 「最新のヒット曲をチェックする人向け」
    これにより、似た傾向のあるユーザー同士でおすすめの曲を共有するアルゴリズムを作ることができます。

天文学での応用:銀河や星の分類

天文学では、観測された星や銀河を分類する際にも階層的クラスタリングが使われます。

具体例
星の明るさや色、温度などのデータを基に、以下のような分類が可能です:

  • 「若くて明るい星」
  • 「古い赤色の星」
  • 「ブラックホールの周辺にある星」
    これにより、宇宙の構造や星の形成の歴史を深く理解することができます。

まとめ

階層的クラスタリングは、データを階層的に分類し、その結果をデンドログラムで可視化する手法です。データ同士の関係性を直感的に理解するのに役立ちます。

システムトレードに限らず、生物学からマーケティング、医学、さらには天文学まで、多様な分野で役立つ手法です。

タイトルとURLをコピーしました