DBSCANによる異常検出とクラスタリング
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)は、データの密度に基づいてクラスタを作成する教師なし学習アルゴリズムです。クラスタ数を事前に指定する必要がなく、ノイズや外れ値を自動的に検出できる点が特徴です。
この記事では、DBSCANの基本的な考え方、クラスタの作られ方、異常検出への活用、Pythonでの実装例、パラメータ調整の注意点について解説します。
DBSCANの仕組みを図で理解する

DBSCANとは?
DBSCANは、データ点が密集している場所をクラスタとして扱い、密度の低い場所にある点をノイズや外れ値として扱うクラスタリング手法です。
K-meansのようにクラスタ数を事前に指定する必要がないため、クラスタ数が分からないデータにも利用しやすいという利点があります。
また、円形ではない複雑な形のクラスタも検出しやすく、ノイズを含むデータに強い点も特徴です。
DBSCANで使う主なパラメータ
DBSCANでは、主に次の2つのパラメータを使ってクラスタを判定します。
| パラメータ | 意味 |
|---|---|
eps |
近くにある点とみなす半径です。この範囲内にある点を近傍点として扱います。 |
min_samples |
クラスタの中心となるために必要な最小の点数です。 |
epsは「どのくらい近ければ同じ集まりと見るか」を決める値で、min_samplesは「どのくらい点が集まっていれば密集していると見るか」を決める値です。
DBSCANにおける点の種類
DBSCANでは、各データ点を次の3種類に分類します。
| 種類 | 説明 |
|---|---|
| コアポイント | epsの範囲内にmin_samples以上の点がある点です。クラスタの中心的な点になります。 |
| ボーダーポイント | 自分自身はコアポイントではないものの、コアポイントの近くにある点です。 |
| ノイズポイント | どのクラスタにも属さない点です。異常値や外れ値として扱われます。 |
DBSCANの処理の流れ
DBSCANは、次のような流れでクラスタを作ります。
- 未処理のデータ点を1つ選ぶ
- その点のeps範囲内にある近傍点を調べる
- 近傍点がmin_samples以上ならコアポイントと判定する
- コアポイントの近くにある点を同じクラスタへ追加する
- つながっているコアポイントをたどってクラスタを広げる
- どのクラスタにも属さない点をノイズポイントとする
このように、DBSCANは密度の高い領域をたどりながらクラスタを広げていきます。
PythonによるDBSCANの実装例
Pythonでは、scikit-learnのDBSCANを使って簡単に実装できます。
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
# サンプルデータの生成
X, y = make_moons(
n_samples=300,
noise=0.1,
random_state=0
)
# DBSCANモデルの定義
dbscan = DBSCAN(
eps=0.2,
min_samples=5
)
# クラスタリング
labels = dbscan.fit_predict(X)
# 結果の可視化
plt.scatter(
X[:, 0],
X[:, 1],
c=labels
)
plt.title('DBSCAN Clustering')
plt.show()
この例では、月形のサンプルデータにDBSCANを適用しています。DBSCANは、K-meansでは分けにくい非球状のクラスタにも対応しやすい特徴があります。
DBSCANの長所
- クラスタ数を事前に指定しなくてよい
- ノイズや外れ値を検出できる
- 複雑な形のクラスタを扱いやすい
- 密度の高い領域を自然にクラスタ化できる
DBSCANの短所
epsとmin_samplesの設定に結果が大きく左右される- 密度が大きく異なるクラスタが混在するデータには弱い
- 高次元データでは距離の意味が薄れやすい
- データ量が非常に多い場合は計算コストが大きくなることがある
DBSCANのパラメータ調整
DBSCANでは、epsとmin_samplesの設定が非常に重要です。
epsの調整
epsが小さすぎると、多くの点がノイズとして扱われます。一方、epsが大きすぎると、本来は別々のクラスタであるデータまで1つにまとめられてしまうことがあります。
| epsの値 | 起こりやすい結果 |
|---|---|
| 小さすぎる | ノイズが増えすぎる |
| 大きすぎる | クラスタがまとまりすぎる |
| 適切 | 自然なクラスタとノイズを分けやすい |
min_samplesの調整
min_samplesが小さいと小さな集まりもクラスタになりやすく、大きいと密度の高い領域だけがクラスタとして残りやすくなります。
一般的には、データの次元数や密度を見ながら調整します。
異常検出としてのDBSCAN
DBSCANでは、どのクラスタにも属さない点をノイズポイントとして扱います。
この性質を利用すると、通常のデータとは離れた位置にある点を異常値として検出できます。
例えば、次のような用途があります。
- 不正取引の検出
- センサーデータの異常検知
- ネットワークアクセスの異常検出
- 製造ラインの異常検知
DBSCANの応用例
| 分野 | 応用例 |
|---|---|
| 地理データ | 位置情報から人の集まりや店舗エリアを検出する |
| 異常検出 | 通常のパターンから外れたデータを検出する |
| 画像解析 | 画像内の密集領域や物体候補を抽出する |
| 顧客分析 | 似た行動をする顧客グループを見つける |
DBSCANを使うときの注意点
- 特徴量のスケールを揃えてから使う
epsの設定を慎重に行う- 高次元データでは事前に次元削減を検討する
- 密度が大きく異なるクラスタがある場合は結果を確認する
- ノイズとして分類された点がすべて異常とは限らない
まとめ
DBSCANは、データの密度に基づいてクラスタを作る教師なし学習アルゴリズムです。クラスタ数を事前に指定する必要がなく、ノイズや外れ値を検出できるため、異常検出にも利用できます。
一方で、epsやmin_samplesの設定に大きく影響されるため、データの分布を確認しながら調整することが重要です。