K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

管理図でプロセスの異常値を見逃さない

中級

06.7.23

管理図でプロセスの異常値を見逃さない

最終更新 2020-02-25 読了時間 2 分
まとめ
管理図は、時系列の折れ線に「平均線」と「管理限界線(平均 ± 3σ)」を重ね、限界を越えた点を異常として機械的に拾い出す図です。正規分布に従うばらつきなら ±3σ の外に出る確率は約 0.3% なので、そこを越えた点は偶然ではなく工程に何かが起きたサインだと判断できます。コードでは values.mean() と values.std(ddof=1) から UCL と LCL を計算し、ax.axhline で 3 本の水平線を引き、for ループで限界を越えた点だけに ax.annotate の矢印を付けます。読み終えると、28 週のデータに混ぜた 2 つの異常値(第 7 週の +12、第 19 週の −10)が赤い矢印で指される仕組みを理解し、自分の KPI の監視に同じ 3 本の線を引けるようになります。

直感 #

API の平均処理時間を毎週測って折れ線にすると、45 秒の周りを上下 3 秒ほどで揺れているだけの週と、57 秒に跳ねた週が混ざって見えます。「どこまでが普通の揺れで、どこからが異常か」を目で決めると人によって答えが変わるので、管理図は統計で線を引きます。平均 \(\bar{x}\) と標準偏差 \(s\) を計算し、\(\bar{x} + 3s\) を上側管理限界(UCL)、\(\bar{x} - 3s\) を下側管理限界(LCL)とします。正規分布なら 99.7% の点がこの帯の中に収まるので、外に出た点は「0.3% の偶然」ではなく工程が変わった証拠として扱えます。

Python で描く #

次のコードは、平均 45・標準偏差 3 の正規乱数で 28 週分の処理時間を作り、第 7 週に +12、第 19 週に −10 の異常値を混ぜます。そのうえで平均 ± 3σ の線を引き、限界を越えた点に赤い矢印で「異常」と注釈を付けます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(5)
values = 45 + rng.normal(0, 3, size=28)
values[[6, 18]] += np.array([12, -10])  # 異常値を混ぜる

mean = values.mean()
std = values.std(ddof=1)
ucl = mean + 3 * std
lcl = mean - 3 * std

fig, ax = plt.subplots(figsize=(6.4, 3.6))
ax.plot(values, marker="o", color="#0ea5e9")
ax.axhline(mean, color="#334155", linewidth=1.3, label="平均")
ax.axhline(ucl, color="#ef4444", linestyle="--", label="UCL")
ax.axhline(lcl, color="#ef4444", linestyle="--", label="LCL")

ax.set_xticks(range(0, len(values), 4), labels=[f"W{i+1}" for i in range(0, len(values), 4)])
ax.set_title("呼び出し処理時間の管理図")
ax.set_ylabel("平均処理秒数")
ax.grid(alpha=0.2)

for idx, val in enumerate(values):
    if val > ucl or val < lcl:
        ax.annotate(
            "異常",
            (idx, val),
            xytext=(idx + 0.5, val + 4),
            arrowprops=dict(arrowstyle="->", color="#ef4444"),
            color="#ef4444",
        )

ax.legend(loc="upper right")
fig.tight_layout()

plt.show()

統計的な管理限界を描くことで、異常値を即座に検知できますの図

実行結果の読み方 #

折れ線のほとんどの点は 2 本の赤い破線の間に収まり、第 7 週と第 19 週の 2 点だけが外に出て「異常」の矢印が付いています。これが ±3σ による検出です。実データでは、限界を越えなくても平均線の片側に 8 点以上連続して出る、6 点連続で上昇し続けるといった並びも工程変化のサイン(Western Electric ルール)として扱います。異常点が見つかったら、その週のデプロイや負荷など原因候補を記録と照合するところまでが管理図の使い方です。

使いどころと落とし穴 #

管理図は、製造の歩留まりや API の処理時間、問い合わせ件数のように「安定しているはずの量」を毎期監視し、工程が変わった瞬間を見つける用途に向いています。データが正規分布から大きく外れている(処理時間のように右に長い裾を持つ)場合、±3σ の帯は左側で狭すぎ右側で広すぎになるので、対数変換してから描くか、中央値と四分位範囲に基づく限界に切り替えます。異常値を含んだ期間で平均と標準偏差を計算すると限界が広がって異常を取り逃がすため、まず安定期間の 20〜30 点で UCL / LCL を決め、以降はその固定値を使ってください。UCL / LCL 超えだけを見ると、ゆっくり悪化するトレンドは検出できないので、連続 8 点の片側偏りなどのルールを np.sign(values - mean) の連続数で併用します。外れ値検出そのものが目的で変数が多いなら、Isolation Forest などの手法も選択肢です。