サイトアイコン アマチュア無線局JS2IIU

【Streamlit】異常検知の結果を可視化するアプリ

こんにちは、JS2IIUです。
蓄積されるデータから異常を検知するという活用シーンは世の中に多いと思います。センサデータの蓄積が楽にできるようになってきたので異常検知アプリのニーズが高くなってきています。機械学習の手法(Isolation Forest)を用いて異常検知するアプリを作成します。今回もよろしくお願いします。

1. はじめに

日々の業務やデータ分析の現場では、「いつもと違う状態」や「予期しない動き」に素早く気づくことが重要です。こうした異常を検出する手法を「異常検知(Anomaly Detection)」と呼びます。

本記事では、異常検知の基本的な考え方を紹介し、StreamlitというPythonライブラリを使って、異常検知の結果をわかりやすく可視化するアプリを作っていきます。さらに、機械学習を用いた異常検知と、それ以外の方法(ルールベース)についても具体的に解説します。

2. 異常検知とは?

異常検知とは、正常な状態から逸脱したデータを自動的に見つけ出す技術です。例えば、次のようなケースが該当します:

異常検知の方法は、大きく分けて次の2つがあります:

3. 異常検知のアプローチ

3.1 ルールベースの手法

ルールベースの異常検知はシンプルです。例えば「温度が100度を超えたら異常」といった閾値を設定します。以下はzスコアを使った例です。

Python
import numpy as np

# データ
values = [10, 12, 11, 13, 95, 14, 10]

# 平均と標準偏差
mean = np.mean(values)
std = np.std(values)

# zスコアで異常検知
z_scores = [(x - mean) / std for x in values]
anomalies = [x for x, z in zip(values, z_scores) if abs(z) > 2]
print("異常値:", anomalies)

次のような結果が表示されます:

Plaintext
異常値: [95]

3.2 機械学習を使った手法(Isolation Forest)

機械学習では、過去の正常データをもとに異常なデータを判定します。今回はIsolationForestを使用します。

Python
from sklearn.ensemble import IsolationForest
import numpy as np

# 正常と異常の混在するデータ(2次元)
X = np.array([
    [10, 10], [12, 11], [13, 13], [12, 12], [9, 10],
    [100, 100]  # 異常
])

clf = IsolationForest(contamination=0.1, random_state=42)
clf.fit(X)
labels = clf.predict(X)  # 1:正常, -1:異常
print("判定結果:", labels)

次の様な結果が表示されます:

Plaintext
判定結果: [ 1  1  1  1  1 -1]

✅ ステップ 1: 必要なライブラリのインポート

Python
from sklearn.ensemble import IsolationForest
import numpy as np

✅ ステップ 2: データの準備

Python
X = np.array([
    [10, 10], [12, 11], [13, 13], [12, 12], [9, 10],
    [100, 100]  # 異常
])

✅ ステップ 3: Isolation Forest モデルの作成

Python
clf = IsolationForest(contamination=0.1, random_state=42)

✅ ステップ 4: モデルにデータを学習させる

Python
clf.fit(X)

✅ ステップ 5: 異常・正常の判定を行う

Python
labels = clf.predict(X)

✅ ステップ 6: 判定結果を表示

Python
print("判定結果:", labels)
Plaintext
  判定結果: [ 1  1  1  1  1 -1 ]

→ 最後の [100, 100] だけが -1(異常)と判定されています。

🔍 Isolation Forest の特徴

4. Streamlitアプリで異常検知を可視化する

ここでは、Streamlitを使って異常検知の結果を可視化するWebアプリを作成します。

4.1 必要なライブラリのインストール

Bash
pip install streamlit scikit-learn pandas matplotlib

4.2 アプリのコード

以下がStreamlitアプリ全体のコードです。

Python
import streamlit as st
import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
import japanize_matplotlib

st.title("異常検知の可視化アプリ")

# データ作成
def generate_data():
    normal = np.random.normal(loc=50, scale=5, size=(100, 2))
    anomaly = np.random.uniform(low=80, high=100, size=(5, 2))
    data = np.vstack((normal, anomaly))
    return pd.DataFrame(data, columns=["x", "y"])

# データ読み込み
st.subheader("1. データの生成")
data = generate_data()
st.write(data.head())

# モデル学習
st.subheader("2. Isolation Forest による異常検知")
model = IsolationForest(contamination=0.05, random_state=0)
data["label"] = model.fit_predict(data)

# 可視化
st.subheader("3. 結果の可視化")
fig, ax = plt.subplots()
normal_data = data[data["label"] == 1]
anomaly_data = data[data["label"] == -1]
ax.scatter(normal_data["x"], normal_data["y"], label="正常", c="blue")
ax.scatter(anomaly_data["x"], anomaly_data["y"], label="異常", c="red")
ax.legend()
st.pyplot(fig)

5. 機械学習 vs 非機械学習:どう使い分ける?

手法特徴適している場面
ルールベースシンプル、設定が明快小規模データ、簡易監視など
機械学習柔軟・高精度データが複雑、大規模な場合

実際の現場では、両者を併用して「まずはしきい値、次に機械学習で補完」する方法もよく使われます。

6. まとめ

今回は異常検知の基本から、機械学習を使った異常検知の実装、Streamlitを使った可視化までを丁寧に解説しました。以下のポイントを押さえておくと良いでしょう:

ぜひご自身のデータでも応用してみてください!

7. 参考リンク

最後に書籍のPRです。
24年11月に第3版が発行された「scikit-learn、Keras、TensorFlowによる実践機械学習 第3版」、Aurélien Géron 著。下田、牧、長尾訳。機械学習のトピックスについて手を動かしながら網羅的に学べる書籍です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了