クラスタリングにおける距離・類似度指標の選び方

クラスタリング分析において、データ間の距離や類似性を測ることは、クラスタを形成し、データを意味のあるグループに分割するための重要なステップです。この記事では、クラスタリングで用いられる代表的な距離・類似度指標を解説し、それぞれの特徴や使い分けについて紹介します。

https://qiita.com/channnnsm/items/f60082f88e933bd083d8

## 1. 距離と類似度：基本的な考え方

まず、距離と類似度という概念について整理します。

- **距離**: データ間の「離れ具合」を表す指標です。値が大きいほど、データ同士が離れていることを意味します。
- **類似度**: データ間の「似ている度合い」を表す指標です。値が大きいほど、データ同士が似ていることを意味します。

一般的に、距離指標と類似度指標は相互に変換可能です。例えば、距離の逆数をとれば類似度として扱えますし、距離指標を最大値で正規化して1から引くことで類似度として扱うこともできます。

## 2. 距離・類似度指標の種類と特徴

ここからは、代表的な距離・類似度指標を、その適用場面を踏まえながら紹介していきます。

### 2.1. 数値データ向け指標

まず、数値データに対して利用できる指標を解説します。

#### 2.1.1. ユークリッド距離（Euclidean Distance）
- **概要**: 2点間の直線距離を測る最も基本的な距離指標
    $$\text{distance} = \sqrt{\sum (A_i - B_i)^2}$$
- **特徴**:
    - **直感的で分かりやすい**: 日常的な距離感覚と一致するため、理解しやすい
    - **次元間の差を考慮**: 各次元の差を二乗して合計するため、次元間の差異を均等に反映
- **注意点**:
    - **次元の呪い**: 次元数が大きくなるにつれて距離が大きくなり、クラスタ間の区別が曖昧になる場合がある
    - **スケールに敏感**: データのスケール（単位）が異なる場合、結果に大きな影響を与える可能性がある
- **ユースケース**:
    - 顧客属性などの数値データのクラスタリング
    - 次元数が少なく、スケールが揃っているデータ
- **補足**: スケールが異なる場合は、事前に標準化や正規化などのスケーリング処理を施す必要がある

#### 2.1.2. マンハッタン距離（Manhattan Distance）
- **概要**: 各次元の差の絶対値の合計で距離を測る
    $$\text{distance} = \sum |A_i - B_i|$$
- **特徴**:
    - **外れ値にロバスト**: 外れ値の影響を受けにくい
    - **高次元データに安定**: ユークリッド距離よりも高次元データに対して安定した結果が得られやすい
- **注意点**:
    - **スケールに敏感**: データのスケールが異なる場合、結果に大きな影響を与える可能性がある
- **ユースケース**:
    - 都市部の移動距離（グリッド状の経路）
    - 高次元データの解析（クラスタリングの一部）
- **補足**: ユークリッド距離と同様に、スケールが異なる場合は、スケーリング処理が必要となる

#### 2.1.3. マハラノビス距離（Mahalanobis Distance）
- **概要**: データの分散や共分散を考慮した距離
    $$\text{distance} = \sqrt{(\mathbf{x} - \boldsymbol{\mu})^\top \mathbf{S}^{-1} (\mathbf{x} - \boldsymbol{\mu})}$$
    （$\boldsymbol{\mu}$: 平均ベクトル、$\mathbf{S}$: 共分散行列）
- **特徴**:
    - **相関を考慮**: データ間の相関関係を考慮した距離計算が可能
    - **外れ値検出に有効**: 分布の中心からの離れ具合を評価するため、外れ値検出にも有効
- **注意点**:
    - **正規分布を仮定**: データの分布が正規分布に従わない場合、有効性が低くなる
    - **計算コストが高い**: 共分散行列の計算が必要なため、計算コストが高い
- **ユースケース**:
    - 異常検知、外れ値検出
    - 多変量データの解析
- **補足**: 共分散行列の計算が必要なため、データサイズが大きい場合は計算コストに注意が必要

### 2.2. ベクトルデータ向け指標

次に、ベクトルデータに用いられる指標を解説します。

#### 2.2.1. コサイン類似度（Cosine Similarity）
- **概要**: 2つのベクトル間の角度のコサイン値を計算し、類似性を評価する
    $$\text{similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|}$$
- **特徴**:
    - **大きさに不変**: ベクトルの大きさではなく、方向性のみに着目する
    - **疎なデータに強い**: ベクトルが疎（0が多い）な場合でも有効に働く
- **注意点**:
    - **量的な差を考慮しない**: ベクトル間の量的な差を考慮しないため、データ量に差がある場合は注意が必要
- **ユースケース**:
    - テキストデータの類似性比較（文書間の類似度計算）
    - レコメンドシステム（ユーザーの好みベースの推薦）
- **補足**: テキストデータでは、TF-IDFなどの重み付けと組み合わせて使われることが多い

### 2.3. 文字列データ向け指標

次に、文字列データに用いられる指標を解説します。

#### 2.3.1. 編集距離（Edit Distance, Levenshtein Distance: レーベンシュタイン距離）
- **概要**: 2つの文字列を一致させるために必要な編集操作（挿入、削除、置換）の最小回数を測る距離指標
- **特徴**:
    - **文字列の差異を捉える**: タイポやスペルミスを考慮できる
    - **文字列比較に特化**: 部分的な一致や並び順の違いを捉えることができる
- **注意点**:
    - **長い文字列では計算コストが高い**: 文字列長が長くなると、計算コストが増大する
- **ユースケース**:
    - 自然言語処理（文字列の類似度計算、検索クエリ補正）
    - データクレンジング（重複データの検出）
- **補足**: 編集距離の計算には動的計画法が用いられる

### 2.4. カテゴリカルデータ・集合データ向け指標

最後に、カテゴリカルデータや集合データに用いられる指標を解説します。

#### 2.4.1. ジャッカード距離（Jaccard Distance）
- **概要**: 2つの集合間の類似性を測る
    $$\text{distance} = 1 - \frac{|A \cap B|}{|A \cup B|}$$
- **特徴**:
    - **重複度に着目**: 集合間の重複度（共通要素の割合）を評価する
    - **カテゴリカルデータに有効**: カテゴリカルデータの類似度を測るのに適している
- **注意点**:
    - **部分的な一致を考慮しない**: 集合の要素の並び順や部分的な一致は考慮しない
- **ユースケース**:
    - 文書やアイテムの重複度測定（重複データ検出、類似アイテム分析）
    - SNSにおけるユーザーの興味の類似性やコンテンツ推薦
- **補足**: ジャッカード距離は、ジャッカード係数（類似度）を1から引いて計算する

## 3. 指標の選び方と使い分け

ここまで紹介した指標をまとめると、以下のようになります。

| 距離/類似度        | データタイプ     | 概要                                       | 強み                                         | 弱点                             | 主なユースケース                               |
|---------------------|------------------|--------------------------------------------|----------------------------------------------|----------------------------------|----------------------------------------------|
| ユークリッド距離    | 数値             | 直線距離                                  | シンプル、次元間の差異を正確に反映           | 次元数やスケールに敏感           | 数値データのクラスタリング                   |
| マンハッタン距離    | 数値             | 次元ごとの差の絶対値の合計                  | 外れ値にロバスト                             | スケール依存                     | 都市距離、疎なデータの解析                   |
| マハラノビス距離    | 数値             | 分布と共分散を考慮した距離                 | 分布を考慮、外れ値検出に適する               | 正規分布でないと効果が薄い        | 外れ値検出、異常検知                        |
| コサイン類似度      | ベクトル           | ベクトル間の角度                             | スケールの影響を受けない                     | 量的な差を無視                   | テキスト解析、レコメンドシステム             |
| 編集距離            | 文字列           | 文字列間の最小編集操作数                     | タイポ対応、文字列比較に特化                 | 長い文字列で計算コストが高い      | 自然言語処理、データクレンジング             |
| ジャッカード距離    | カテゴリ/集合     | 集合間の類似性                               | カテゴリデータや重複度の評価に最適           | 部分一致を無視                   | 文書重複検出、SNSのユーザー興味の類似性                 |

**指標選択の指針**

- **数値データ**:
    - 次元数が少なくスケールが揃っている場合：ユークリッド距離
    - 外れ値の影響を避けたい場合：マンハッタン距離
    - データ間の相関を考慮したい場合：マハラノビス距離
- **ベクトルデータ**:
    - ベクトルの大きさよりも方向性が重要な場合：コサイン類似度
- **文字列データ**:
    - タイポや部分一致を考慮したい場合：編集距離
- **カテゴリ/集合データ**:
    - 集合間の類似性を評価したい場合：ジャッカード距離

```mermaid
flowchart TD
    A[データタイプは?] --> B[数値データ]
    A --> C[ベクトルデータ]
    A --> D[文字列データ]
    A --> E[カテゴリ/集合データ]
    
    B --> B1{特徴は?}
    B1 --> |次元数が少なく<br>スケールが揃っている| B2[ユークリッド距離]
    B1 --> |外れ値の影響を<br>避けたい| B3[マンハッタン距離]
    B1 --> |データ間の相関を<br>考慮したい| B4[マハラノビス距離]
    
    C --> C1{重視する特性は?}
    C1 --> |方向性が重要| C2[コサイン類似度]
    
    D --> D1{必要な特性は?}
    D1 --> |タイポや<br>部分一致を考慮| D2[編集距離]
    
    E --> E1{評価したい特性は?}
    E1 --> |集合間の類似性| E2[ジャッカード距離]
```
このように、データの種類や特徴、分析目的に応じて適切な距離・類似度指標を選ぶことが重要です。

## 4. まとめ

クラスタリングにおける距離・類似度指標は、データの性質や分析の目的に応じて使い分けることが重要です。それぞれの指標の特徴を理解し、目的に合わせた適切な指標を選択できるのがポイントですね。