異常値・外れ値検出の基本!scikit-learnを活用したデータ分析術(novelty and outlier detection)

はじめに

データ分析において、異常値・外れ値は問題を引き起こす可能性があります。たとえば、不正アクセスや不正な取引などを検出するためには、異常値検出が必要です。また、データの品質を向上させるためにも、外れ値検出は欠かせません。

本記事では、scikit-learnを用いた異常値・外れ値検出の基本的な方法について解説します。scikit-learnはPythonで利用できる機械学習ライブラリであり、異常値・外れ値検出のための多数のアルゴリズムを提供しています。

scikit-learnを活用した異常値・外れ値検出の重要性と基本的な方法

異常値・外れ値検出は、データ分析において非常に重要な技術です。異常値・外れ値が存在する場合、分析結果が正しくならないため、正確な予測や判断ができません。

異常値・外れ値検出は、大きく分けて2つの方法があります。

  • 外れ値検出:データの中から異常に大きな値や小さな値を検出する方法
  • 新奇値検出:データの中から異常なパターンを持つ値を検出する方法

scikit-learnでは、これらの検出を行うための多数のアルゴリズムが提供されています。

外れ値検出アルゴリズムの概要:scikit-learnで提供される主要な外れ値検出アルゴリズムの紹介

scikit-learnで提供される主要な外れ値検出アルゴリズムを紹介します。

Isolation Forest

Isolation Forestは、ランダムフォレストをベースにした外れ値検出アルゴリズムです。ランダムフォレストは、データセットをランダムにサンプリングし、複数の決定木を作成することで、データの特徴を捉える手法です。Isolation Forestは、このランダムフォレストを使って、外れ値が分割される回数を減らして、外れ値を検出するアルゴリズムです。

Local Outlier Factor

Local Outlier Factorは、周辺のデータと比較して、データの密度を評価し、密度が低いデータを外れ値として検出するアルゴリズムです。このアルゴリズムでは、周辺のデータとの距離が遠いデータが外れ値である可能性が高いと判断されます。

Minimum Covariance Determinant

Minimum Covariance Determinantは、データの共分散行列のdeterminantが最小になるようなサブセットを見つけ、そのサブセットに含まれないデータを外れ値として検出するアルゴリズムです。このアルゴリズムは、データが多次元の場合に効果的です。

新奇値検出アルゴリズムの概要:scikit-learnで提供される主要な新奇値検出アルゴリズムの紹介

scikit-learnで提供される主要な新奇値検出アルゴリズムを紹介します。

One-class SVM

One-class SVMは、1つのクラスに属するデータのみでモデルを構築し、それ以外のデータを新奇値として検出するアルゴリズムです。このアルゴリズムは、モデルの構築には1つのクラスしか必要とせず、多くの場合、データの分布に依存せずに新奇値を検出できるため、実用的です。

Local Outlier Factor Novelty Detection

Local Outlier Factor Novelty Detectionは、Local Outlier Factorを使って、新しいデータが既知のデータと異なる程度を評価し、新奇値を検出するアルゴリズムです。このアルゴリズムは、学習データが少ない場合に効果的です。

実践例:scikit-learnを使った外れ値・新奇値検出の実践

ここでは、scikit-learnを使った外れ値・新奇値検出の実践例を紹介します。

外れ値検出の実践例

以下は、Isolation Forestを使った外れ値検出の実践例です。

from sklearn.ensemble import IsolationForest
import numpy as np
# データの生成
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2)
X_train = np.r_[X + 2, X - 2]  # 正常データ
X_test = np.r_[rng.uniform(low=-6, high=6, size=(5, 2)),  # 外れ値
               rng.uniform(low=-6, high=6, size=(5, 2))]

# 外れ値検出器の構築
clf = IsolationForest(random_state=rng)
clf.fit(X_train)

# 外れ値の検出
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)

print("正常データの外れ値検出結果:", y_pred_train)
print("外れデータの外れ値検出結果:", y_pred_test)
正常データの外れ値検出結果: [ 1  1  1  1  1  1   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1 -1 -1 -1 -1 -1 -1]
# 外れデータの外れ値検出結果: [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]

実行結果:

ここでは、2次元のデータを生成し、正常データと外れ値データを混ぜたデータセットを作成しました。Isolation Forestを使って、外れ値を検出することができました。外れ値は、-1で表されます。

新奇値検出の実践例

以下は、One-class SVMを使った新奇値検出の実践例です。

from sklearn.svm import OneClassSVM
import numpy as np
# データの生成
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2)
X_train = X[:95]  # 学習データ
X_test = X[95:]  # 新しいデータ

# 新奇値検出器の構築
clf = OneClassSVM(gamma='auto').fit(X_train)

# 新しいデータの新奇値検出
y_pred_test = clf.predict(X_test)
print("新しいデータの新奇値検出結果:", y_pred_test)
新しいデータの新奇値検出結果: [ 1 -1 1 1 -1]

実行結果:

ここでは、2次元のデータを生成し、学習データと新しいデータを分けて、One-class SVMを使って新奇値を検出しました。新しいデータは2つ新奇値として検出されました。

scikit-learnを活用して、異常値・外れ値検出を効果的に行うデータ分析術の重要性と基本

異常値・外れ値検出は、データ分析において非常に重要な技術であり、正確な予測や判断をするためには欠かせません。scikit-learnを使って、外れ値・新奇値検出を行うことができ、多数のアルゴリズムを提供しているため、効果的なデータ分析に役立ちます。

まとめ

本記事では、scikit-learnを使った異常値・外れ値検出の基本的な方法について解説しました。外れ値検出アルゴリズムとして、Isolation ForestやLocal Outlier Factor、Minimum Covariance Determinantを紹介し、新奇値検出アルゴリズムとして、One-class SVMやLocal Outlier Factor Novelty Detectionを紹介しました。また、実践例として、Isolation Forestを使った外れ値検出やOne-class SVMを使った新奇値検出の方法を紹介しました。異常値・外れ値検出は、正確なデータ分析のために欠かせない技術であり、scikit-learnを活用することで、効果的なデータ分析を行うことができます。