ひとことで言うと#
データの中から**「いつもと違う」を統計やMLで自動的に見つけ出す**実践手法。シンプルな標準偏差ルールから高度なIsolation Forestまで、データの特性と目的に応じて手法を使い分けることで、誤検知を減らし本当に対応が必要な異常だけを捉えられる。
押さえておきたい用語#
- 外れ値(Outlier / アウトライアー)
- データの分布から大きく離れた値のこと。異常とは限らず、測定ミスや入力エラーの場合もある。異常検知ではこの外れ値の中から「ビジネス上意味のある異常」を選別する。
- Zスコア(Z-Score / ジースコア)
- データポイントが平均から標準偏差何個分離れているかを表す指標である。一般的に|Z| > 3を異常とみなすが、データの分布によって閾値は調整が必要になる。
- Isolation Forest(アイソレーション フォレスト)
- ランダムに分割を繰り返し、少ない分割回数で孤立するデータ点を異常とみなす機械学習アルゴリズムを指す。高次元データでも高速に動作し、正常データだけで学習できる。
- 適合率と再現率(Precision / Recall)
- 適合率は「異常と判定したもののうち本当に異常だった割合」、再現率は「実際の異常のうち検知できた割合」。このトレードオフのバランスがビジネス要件で変わる。不正検知なら再現率重視、アラート疲れを避けるなら適合率重視。
異常検知の実践の全体像#
こんな悩みに効く#
- KPIが急変したとき、気づくのがいつも翌日以降になってしまう
- アラートが多すぎて「オオカミ少年化」し、本当の異常を見逃している
- どの異常検知手法を使えばいいのか選べない
基本の使い方#
異常を見つけるには、まず「正常とは何か」を定義する必要がある。
- 直近3〜6ヶ月の正常期間のデータを収集
- 平均・標準偏差・四分位範囲などの基本統計量を算出
- 曜日・時間帯・季節による周期性を把握する
「セール期間」「システム障害期間」など既知の異常期間は除外しておく。ベースラインが汚れていると、すべての分析が狂う。
万能な手法はない。データの特性で選ぶ。
| 条件 | 推奨手法 |
|---|---|
| 1変数・正規分布に近い | Zスコア |
| 1変数・分布が偏っている | IQR法 |
| 時系列データ | 管理図 or LSTM |
| 多変数・ラベルなし | Isolation Forest |
| 多変数・ラベルあり | Random Forest / XGBoost |
| 超高次元・複雑 | Autoencoder |
迷ったらIsolation Forestから始める。ラベル不要・高速・多次元対応で、最初の一手として優秀。
異常検知の精度は、閾値の設定で決まると言っても過言ではない。
- 厳しすぎる閾値 → 検知漏れが多発(再現率低下)
- 緩すぎる閾値 → 誤検知だらけ(適合率低下)
ビジネス要件で優先度を決める:
- 不正検知 → 再現率90%以上を目標(見逃しのコストが大きい)
- 運用アラート → 適合率80%以上を目標(アラート疲れを防ぐ)
過去の異常事例でバックテストし、F1スコアが最大になる閾値を探す。
モデルをデプロイしたら終わりではない。
- アラートが出たら「本当に異常か?」を人間が判定し、結果を記録
- 誤検知(False Positive) → 閾値の調整 or 特徴量の追加
- 見逃し(False Negative) → モデルの再学習 or 手法の変更
- 月1回はモデルの精度をレビューし、データの分布変化(ドリフト)に対応
運用開始3ヶ月で閾値を3回は見直すつもりでいると、実用的な精度に落ち着く。
具体例#
月間注文数15万件のECサイト。チャージバック(不正利用による返金)が月120件発生し、損失額は月480万円に達していた。
Isolation Forestを使い、注文時刻・金額・配送先・購入履歴など12変数でモデルを構築。正常注文14万件で学習させ、異常スコアの上位**0.3%**をアラート対象に設定した。
導入初月は適合率62%(アラート450件中、本当に不正だったのは280件)。3ヶ月間のフィードバックで特徴量を追加し、適合率84%・再現率91%まで改善。チャージバックは月120件 → 28件に減り、年間の損失削減額は5,500万円を超えた。
ユーザー数20万人のSaaS。月に2〜3回の障害が発生し、平均復旧時間は45分。障害1回あたりの推定損失は200万円。
CPU使用率・メモリ使用率・レスポンスタイム・エラーレートの4指標を5分間隔で収集し、LSTM(Long Short-Term Memory)モデルで予測値を算出。予測値と実測値の乖離が閾値を超えたらアラートを出す仕組みを構築した。
障害の78%を平均12分前に予兆段階で検知できるようになり、事前対処によって実際のダウンタイムが45分 → 8分に短縮。年間の障害関連損失は約4,800万円減少した。「壊れてから直す」から「壊れる前に気づく」への転換が、結局は最大のコスト削減策だった。
日産5万個のパンを製造する工場。月に2〜3回、焼きムラや膨らみ不足のロットが出荷後に発覚し、回収費用が1回あたり80万円かかっていた。
温度センサー・湿度センサー・生地の重量データをリアルタイム収集し、管理図(X-bar管理図とR管理図)で監視。さらに、センサー8変数の組み合わせパターンをIsolation Forestで学習させ、単一変数では検出できない「複合的な異常」も捕捉できるようにした。
管理図が単独異常を、Isolation Forestが複合異常をカバーする二段構えにした結果、出荷前の異常検出率が40% → 94%に向上。出荷後の回収は年間28回 → 2回に激減。手法を1つに絞らず組み合わせたことが決め手だった。
やりがちな失敗パターン#
- ベースラインに異常データが混入している — 正常パターンの定義に使うデータに異常期間のデータが含まれていると、異常を「正常」として学習してしまい、同じパターンの異常を検知できなくなる。データのクレンジングに手を抜かない
- 最初から高度な手法に飛びつく — Autoencoderや深層学習は精度が高い反面、チューニングが難しく、説明性も低い。まずZスコアや管理図でベースライン精度を出し、それを超えられるかどうかで高度な手法の導入を判断する
- 閾値を固定したまま放置する — データの分布は時間とともに変わる(コンセプトドリフト)。半年前に設定した閾値がいつの間にか機能しなくなり、誤検知が激増するか、逆に何も検知しなくなる。最低でも月1回は精度を確認する
まとめ#
異常検知の実践は、「正常を定義する → 手法を選ぶ → 閾値を調整する → 運用で育てる」の4ステップで進める。統計手法は説明性が高く、ML手法は複雑なパターンに強い。どちらか一方ではなく、組み合わせることで検知精度が上がる。最も重要なのはデプロイ後のフィードバックループで、アラート結果を地道に記録し、モデルを改善し続けることが実用レベルの異常検知につながる。