器用貧乏の独り言

器用貧乏なおっさんが気の向くままに。

【Python】データサイエンス初心者向け異常検知ガイド

◇前置き

異常検知は、さまざまな分野で利用される非常に重要な手法です。
たとえば、不正取引の検出、機械の故障予知、潜在的なセキュリティリスクの発見など、多くの応用例があります。
本記事では、異常検知の基本的な概念から、一般的な手法および具体的なサンプルコードまでを初学者向けに解説していきます。

◇異常検知とは

異常検知(Anomaly Detection)は、正常なパターンから逸脱したデータポイントやイベントを検出する技術であり、問題の早期発見や予防が可能となります。
異常検知には主に以下の種類が存在します:

ポイント異常(Point Anomaly):

単一のデータポイントが他のデータと異なる場合を指します。不正なクレジットカード取引がその一例です。

コンテキスト異常(Contextual Anomaly):

データポイントが文脈や周囲の状況において異常な場合を指します。例えば、季節外れの異常天候がこれに該当します。

集団異常(Collective Anomaly):

データの一部が集団で異常な場合を指します。サイバー攻撃によるネットワークトラフィックの急増などがこれに当たります。

◇一般的な異常検知手法

異常検知には様々な手法があります。
本記事では一般的な手法を紹介します。
以下にそれぞれ詳しく解説いたします。

1. 統計的手法

統計的手法は、データの統計的特性を用いて異常を検出します。データの分布が事前に分かっている場合に有効です。

Zスコア:

各データポイントが平均からどれだけ離れているかを標準偏差の単位で測定します。
標準正規分布を仮定すると、Zスコアが3以上(または-3以下)のデータポイントを異常とみなすことができます。

import numpy as np

def z_score(data):
    mean = np.mean(data)
    std_dev = np.std(data)
    return [(x - mean) / std_dev for x in data]
モンテカルロ法:

確率論的モデルを使用してシミュレーションを行い、異常を検出します。
この方法は、異常が基本的な統計手法では捉えられない場合に有効です。

import numpy as np

def monte_carlo_simulation(data, num_simulations):
    simulated_data = [np.random.choice(data, size=len(data), replace=True) for _ in range(num_simulations)]
    return simulated_data

2. 機械学習手法

機械学習手法は、データのパターンを学習して異常を検出します。
これらの手法は大量のデータを必要とするものの精度が高いことが特徴です。

k-近傍法(k-NN):

新しいデータポイントが近傍のデータポイントと大きく異なる場合に異常と判断します。距離を計算し、近隣のk個のデータポイントと比較します。

from sklearn.neighbors import LocalOutlierFactor

lof = LocalOutlierFactor(n_neighbors=20)
outliers = lof.fit_predict(data)
サポートベクターマシンSVM):

特に1-クラスSVMは正常データのみから学習して異常データを検出します。
高次元空間でデータポイントを分離するハイパープレーンを見つけます。

from sklearn.svm import OneClassSVM

ocsvm = OneClassSVM(kernel='rbf', gamma=0.1, nu=0.1)
ocsvm.fit(train_data)
predictions = ocsvm.predict(test_data)

3. ディープラーニング手法

ディープラーニング手法は、複雑なデータパターンを捉えるためにニューラルネットワークを使用します。
これにより、高度な異常検知が可能となります。

自己符号化器(Autoencoder):

データを圧縮して再構築するニューラルネットワークです。再構築誤差が大きいデータを異常とみなします。

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense

input_dim = data.shape[1]
input_layer = Input(shape=(input_dim,))
encoder = Dense(14, activation="relu")(input_layer)
encoder = Dense(7, activation="relu")(encoder)
decoder = Dense(14, activation='relu')(encoder)
decoder = Dense(input_dim, activation='sigmoid')(decoder)
autoencoder = Model(inputs=input_layer, outputs=decoder)
autoencoder.compile(optimizer='adam', loss='mse')
autoencoder.fit(data, data, epochs=50, batch_size=32, validation_split=0.1)
畳み込みニューラルネットワーク(CNN):

特に画像データなど時空間的な関係が強いデータの異常検知に有効です。
コンボリューション層を使って重要な特徴を抽出します。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax'),
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10, validation_split=0.1)

◇まとめ

異常検知はデータサイエンスにおける重要な分野であり、さまざまな手法と応用があります。
初学者の方が異常検知に取り組む際は、データの特性を理解し、基本的な手法から始めるのがお勧めです。
統計的手法から機械学習まで、異常検知の手段は多岐にわたります。
自分のプロジェクトに最適な方法を選ぶことが鍵となります。
この記事も誰かの役に立つと嬉しいです。