06.7.23
管理図でプロセスの異常値を見逃さない
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σ の線を引き、限界を越えた点に赤い矢印で「異常」と注釈を付けます。
| |

実行結果の読み方 #
折れ線のほとんどの点は 2 本の赤い破線の間に収まり、第 7 週と第 19 週の 2 点だけが外に出て「異常」の矢印が付いています。これが ±3σ による検出です。実データでは、限界を越えなくても平均線の片側に 8 点以上連続して出る、6 点連続で上昇し続けるといった並びも工程変化のサイン(Western Electric ルール)として扱います。異常点が見つかったら、その週のデプロイや負荷など原因候補を記録と照合するところまでが管理図の使い方です。
使いどころと落とし穴 #
管理図は、製造の歩留まりや API の処理時間、問い合わせ件数のように「安定しているはずの量」を毎期監視し、工程が変わった瞬間を見つける用途に向いています。データが正規分布から大きく外れている(処理時間のように右に長い裾を持つ)場合、±3σ の帯は左側で狭すぎ右側で広すぎになるので、対数変換してから描くか、中央値と四分位範囲に基づく限界に切り替えます。異常値を含んだ期間で平均と標準偏差を計算すると限界が広がって異常を取り逃がすため、まず安定期間の 20〜30 点で UCL / LCL を決め、以降はその固定値を使ってください。UCL / LCL 超えだけを見ると、ゆっくり悪化するトレンドは検出できないので、連続 8 点の片側偏りなどのルールを np.sign(values - mean) の連続数で併用します。外れ値検出そのものが目的で変数が多いなら、Isolation Forest などの手法も選択肢です。
- 複数ラインの推移比較 — 複数系列を同一軸で比較
- 注目期間ハイライト — 特定期間を背景色で強調
- 予測区間バンド — 予測値と信頼区間を帯で表現