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

中級

6.7.23

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

最終更新 2020-02-25 読了時間 1 分
まとめ
  • 管理図で時系列データに平均線と管理限界(±3σ)を描き、異常値を検出する。
  • ax.axhline で UCL/LCL を引き、範囲外の点に ax.annotate でアノテーションを付ける。
  • 製造工程や問い合わせ件数など、プロセスのばらつき監視に使う。

問い合わせ件数や製造歩留まりなど、ばらつきを監視したいときは管理図が有効です。統計的な管理限界を描くことで、異常値を即座に検知できます。

 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()

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

読み方のポイント #

  • 平均線の上下に管理限界 (±3σ) を引くことで、統計的に異常な点を即座に把握できます。
  • 異常点が続く場合は、工程の状態が変わったサインと捉え原因を深掘りしましょう。
  • 折れ線の接続方法やマーカーの形を調整すると、レポートのトーンに合わせやすくなります。

いつ使うか #

  • 適している場面: プロセスの安定性を監視し、管理限界を超える異常値を検出したいとき。品質管理の基本ツールです。
  • 不向きな場面: データが正規分布に従わない場合、管理限界の設定が不適切になり誤警報が増えます。
  • 代替手段: 外れ値検出が主目的なら Isolation Forest などの機械学習手法も検討してください。

よくある失敗パターン #

  • 管理限界の誤算: 異常値を含んだ期間で管理限界を計算すると限界が広がりすぎて異常を検出できません。安定期間のデータで限界を設定してください。
  • ルール適用の不徹底: Western Electric ルール(連続8点の偏りなど)を適用せず UCL/LCL 超えだけで判断するとトレンド異常を見逃します。複数ルールを併用しましょう。