AI Python Python 応用 プログラミング

【python 活用】異常検知 マハラノビス距離を実装してみる

正規分布しているデータだと、分布から外れたデータを異常とできます。

要因となるデータ(特徴量)が複数ある場合はどうでしょう?

そんな時には、マハラノビス距離を算出して、異常かどうかを判断していきます。

 

本記事はこんな方におすすめです。

hituji
マハラノビス距離というものを聞いたので、使ってみたいが、どうすれば良いのかわからない

 

本記事の内容

  • マハラノビス距離とは
  • 実装方法

 

サンプルコード&データ

 

スポンサーリンク

マハラノビス距離とは

特徴量が多変量で相関性がある場合に、その相関性も考慮した距離になります。

データの集まりから離れている方が、距離値が大きくなります。

この距離がいいところは、1つ1つのデータでは異常とはわからないデータも異常として検知できる点です。

例えば、異常としたいデータは、データ1、2それぞれで見ると、他の正常なデータと同じ範囲に入っていることがわかります。

この場合、それぞれのデータで見ると異常とは判断できません。

マハラノビス距離は以下の式で表されます。

\( d = \sqrt{(x-\mu)^T\sum_{}^{-1}(x-\mu)} \)

\( x\): データ

\( \mu\): 平均

\( \sum_{}^{-1}\): 分散共分散行列

 

実装方法

さてでは、実装していきましょう。

データにはRに入っているDavisデータを使います。

データはコードと同じく、下記リンクにおいてあります。

サンプルコード&データ

 

計算には、関数化されたものと、numpyで計算したもを紹介します。

 

ライブラリ

以下のライブラリが必要になります。

必要なモノ

  • pandas
  • numpy
  • scipy
  • matplotlib
  • seaborn

 

下の二つはデータをグラフで確認するためのものです。

ライブラリを読み込みましょう。

 

データの読み込み

CSVにしてある、Davisデータを読み込みます。

 

 

いくつかありますが、weightとheightのデータを使っていきます。

 

データの確認

weightとheightのデータをプロットしてみます。

異常なデータ2つほどありそうです。

 

共分散行列などの計算

先に、平均や共分散行列を計算します。

関数を使った計算で使います。

 

関数を使った方法

scipyのdistance.mahalanobisを使って計算していきます。

 

結果をプロットしてみます。

 

この値を使って異常かどうかを判断するのですが、どの数値を閾値にするかは決める必要があります。

今回の場合は、3 以上を異常とするのが良さそうです。

 

numpyで計算する方法

次は、numpyで計算します。

 

といっても1行で済みます。

こちらの方がデータ量が多い時は計算が早いので、こちらを使った方が良いでしょう。

 

データも確認しましょう。

同じデータになりましたね。

今回はわかりやすいように、2変量のデータでしましたが、10変量とか多くなっても異常度として計算することができます。

 

今回のマハラノビスの計算は下記本にのっています。

-AI, Python, Python 応用, プログラミング

© 2021 ひつじ工房