Mímisbrunnr知恵の泉

← オペレーションズマネジメント 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:第2章 予測誤差の評価と追跡信号(追跡信号=予測の管理図・同じ運用思想) | 確率の土台(3σ・係数 A2,D3,D4A_2,D_3,D_4 の導出):品質管理(統計) | 誤警報=第一種過誤:第一種の過誤・第二種の過誤・検出力(2種類の誤りとトレードオフ・サンプルサイズ設計) | 次:工程能力指数

要点(BLUF)

1. 偶然原因と異常原因——管理図が分けるもの

工程から出る製品の特性値(寸法・重量・濃度)は必ずばらつきます。シューハート(Shewhart)はこれを2種類に分けました。

flowchart LR
  M["管理図に打点して監視"] --> Q{"管理限界の外 or 非ランダムな並び?"}
  Q -->|"はい"| SP["異常原因あり<br/>原因を突き止めて除去"]
  Q -->|"いいえ"| CC["偶然原因だけ(管理状態)<br/>そのまま継続・手を出さない"]
  SP --> M
  CC --> M

肝心なのは、この2つに正反対の対応をすること。安定した工程(偶然原因のみ)にいちいち調整を加えると、かえってばらつきが増えます(後述の tampering)。逆に異常原因を放置すると不良が流れ続けます。管理図は「いま手を打つべきか、放っておくべきか」を判定する装置です。これは追跡信号(予測誤差の評価と追跡信号)が「予測を直すべきか、ノイズだから据え置くか」を判定するのと同型の問題です。

2. Xˉ\bar X-RR 管理図——位置とばらつきを別々に見張る

計量値(連続量)の監視で最もよく使うのが Xˉ\bar X-RR 管理図です。一定間隔で大きさ nn(例 n=5n=5)の群を採り、各群について次の2つを別の図に打点します。

母標準偏差 σ\sigma は普通わからないので、群範囲の平均 Rˉ\bar R から推定します。すると管理限界は σ\sigma を直接使わず、Rˉ\bar R に係数を掛けるだけの形になります。

Xˉ図:CL=Xˉˉ,UCL,LCL=Xˉˉ±A2Rˉ\bar X\text{図:}\quad CL=\bar{\bar X},\qquad UCL,\,LCL=\bar{\bar X}\pm A_2\,\bar R R図:CL=Rˉ,UCL=D4Rˉ,LCL=D3RˉR\text{図:}\quad CL=\bar R,\qquad UCL=D_4\,\bar R,\qquad LCL=D_3\,\bar R

ここで Xˉˉ\bar{\bar X} は群平均の総平均、Rˉ\bar R は群範囲の平均です。係数 A2,D3,D4A_2,D_3,D_4 は群サイズ nn ごとに表で与えられる標準値で、たとえば n=5n=5 なら A2=0.577, D3=0, D4=2.114A_2=0.577,\ D_3=0,\ D_4=2.114d2=2.326d_2=2.326)。

係数の正体は 品質管理 へ. A2=3d2nA_2=\dfrac{3}{d_2\sqrt n}D3=13d3d2D_3=1-3\dfrac{d_3}{d_2}D4=1+3d3d2D_4=1+3\dfrac{d_3}{d_2} という形と、3σ3\sigma 限界が誤警報(第一種過誤)両側約0.27%になる導出は、統計テキスト 品質管理 が扱います。OM 側はこの標準値を与えられた道具として使い、「チャートで異常を検知して工程を立て直す運用」に集中します。D3=0D_3=0n6n\le6)で RR 図に下方限界を引かないのも標準どおりです。

Xˉ\bar X 図と RR 図を両方見るのが要点です。平均は規格内でも、ばらつき(RR)が広がっていれば不良予備軍が増えています。位置(Xˉ\bar X)とばらつき(RR)は別の異常で、別々に監視します。

3. 管理状態の工程で管理図を作る(コード)

目標100・工程の標準偏差 σ=2\sigma=2管理状態の工程から、n=5n=5 のサブグループを25群採り、A2,D3,D4A_2,D_3,D_4Xˉ\bar X-RR 管理図を引きます。あわせて、Rˉ/d2\bar R/d_2σ\sigma を代用すると A2RˉA_2\bar R がちょうど 3σXˉ=3σ/n3\sigma_{\bar X}=3\sigma/\sqrt n に等しいことを数値で確かめます。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

rng = np.random.default_rng(7)

# 管理状態の工程:目標100・工程の標準偏差 sigma=2。大きさ n=5 のサブグループを25群採取
mu_true, sigma_true = 100.0, 2.0
n, k = 5, 25
samples = rng.normal(mu_true, sigma_true, size=(k, n))

xbar = samples.mean(axis=1)                      # 各群の平均(位置)
R = samples.max(axis=1) - samples.min(axis=1)    # 各群の範囲(ばらつき)
xbarbar = xbar.mean()                            # 総平均 Xbarbar
Rbar = R.mean()                                  # 範囲の平均 Rbar

# n=5 の管理図係数(標準値・導出は統計テキスト 09-31 へ)
A2, D3, D4 = 0.577, 0.0, 2.114
ucl_x = xbarbar + A2 * Rbar
lcl_x = xbarbar - A2 * Rbar
ucl_r = D4 * Rbar
lcl_r = D3 * Rbar

print(f"総平均 Xbarbar  = {xbarbar:.3f}")
print(f"範囲の平均 Rbar = {Rbar:.3f}")
print(f"Xbar管理図: CL={xbarbar:.3f}  UCL={ucl_x:.3f}  LCL={lcl_x:.3f}")
print(f"R管理図   : CL={Rbar:.3f}   UCL={ucl_r:.3f}  LCL={lcl_r:.3f}")

# Rbar/d2 で工程の sigma を逆算(A2*Rbar が 3*sigma/sqrt(n) に対応するか確認)
d2 = 2.326
sigma_est = Rbar / d2
print(f"Rbar/d2 による sigma 推定 = {sigma_est:.3f}(真値 {sigma_true:.1f})")
print(f"A2*Rbar = {A2 * Rbar:.3f}  vs  3*sigma_est/sqrt(n) = {3 * sigma_est / np.sqrt(n):.3f}")

out_x = np.where((xbar > ucl_x) | (xbar < lcl_x))[0]
out_r = np.where((R > ucl_r) | (R < lcl_r))[0]
print(f"Xbar管理図の管理限界外の群 = {out_x.tolist()}(管理状態なら空)")
print(f"R管理図の管理限界外の群    = {out_r.tolist()}")

# 図:Xbar管理図とR管理図
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(11, 7), sharex=True)
g = np.arange(1, k + 1)
ax1.plot(g, xbar, "o-", color="#1f77b4")
ax1.axhline(xbarbar, color="green", label="CL")
ax1.axhline(ucl_x, ls="--", color="#d62728", label="UCL/LCL")
ax1.axhline(lcl_x, ls="--", color="#d62728")
ax1.set_ylabel("群平均 Xbar"); ax1.set_title("Xbar管理図(位置の監視)"); ax1.legend()
ax2.plot(g, R, "s-", color="#ff7f0e")
ax2.axhline(Rbar, color="green", label="CL")
ax2.axhline(ucl_r, ls="--", color="#d62728", label="UCL")
ax2.set_xlabel("サブグループ番号"); ax2.set_ylabel("群範囲 R")
ax2.set_title("R管理図(ばらつきの監視)"); ax2.legend()
plt.tight_layout(); plt.show()

出力:

総平均 Xbarbar  = 99.659
範囲の平均 Rbar = 4.236
Xbar管理図: CL=99.659  UCL=102.103  LCL=97.214
R管理図   : CL=4.236   UCL=8.956  LCL=0.000
Rbar/d2 による sigma 推定 = 1.821(真値 2.0)
A2*Rbar = 2.444  vs  3*sigma_est/sqrt(n) = 2.444
Xbar管理図の管理限界外の群 = [](管理状態なら空)
R管理図の管理限界外の群    = []

出力の意味:総平均 Xˉˉ=99.659\bar{\bar X}=99.659Rˉ=4.236\bar R=4.236 から、Xˉ\bar X 図の限界は 99.659±0.577×4.23699.659\pm0.577\times4.236=[97.214, 102.103]RR 図の上限は 2.114×4.236=8.9562.114\times4.236=8.956(下限は D3=0D_3=0 なので0)。25群はすべて限界内=管理状態で、誤検知は出ていません。注目は**A2Rˉ=2.444A_2\bar R=2.4443σXˉ=3σ/n3\sigma_{\bar X}=3\sigma/\sqrt n にぴたり一致している点:Rˉ/d2\bar R/d_2 で推定した σ=1.821\sigma=1.821 から 3×1.821/5=2.4443\times1.821/\sqrt5=2.444。つまりRˉ\bar RA2A_2 を掛ける」は「3σXˉ3\sigma_{\bar X} を引く」の言い換え**で、係数表は 3σ3\sigma 限界を実務で計算しやすくしただけ——根拠は 3σ3\sigma品質管理)です。

4. ウェスタンエレクトリック・ルール——「限界超え」だけではない

異常のサインは「1点が 3σ3\sigma を超える」だけではありません。点が限界内でも、並び方が偶然らしくないパターンは異常を疑います。古典的なウェスタンエレクトリック・ルール(ゾーン A/B/C を 1σ1\sigma 刻みで分ける)では、たとえば次を異常とします。

要するに「限界を超えなくても、同じ側に偏る・一方向に動き続けるなど偶然では起きにくい並びが出たら手を打つ」。これらは単独点の 3σ3\sigma 超えでは拾えない緩やかな工程変化を早めに捉える補助ルールです(具体的なルール集合は規格改訂で変わるため要最新確認。判定ルールの一覧は 品質管理)。第2章の追跡信号で「±4は経験則・運用で±3〜±6」と幅があったのと同じく、ここも見逃しと誤検知のバランスをどう取るかの設計判断です。

5. 異常原因を検知する(コード)

管理状態の基準群(Phase I、最初の20群)から限界を引き、その後を監視します。第21群から工程平均が +1.5σ+1.5\sigma ずれる異常原因(段取りミスなど)を注入し、Xˉ\bar X 管理図がいつ点を弾くかを見ます。追跡信号が水準シフトを検知したのと同じ運用です。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

rng = np.random.default_rng(20)

mu0, sigma, n = 100.0, 2.0, 5
k_base = 20        # 管理状態の基準群(Phase I:ここから限界を引く)
k_total = 32
shift_at = 20      # 第21群(index 20)から工程平均が +1.5*sigma ずれる(異常原因)
shift = 1.5 * sigma

mu_series = np.full(k_total, mu0)
mu_series[shift_at:] = mu0 + shift
samples = rng.normal(mu_series[:, None], sigma, size=(k_total, n))

xbar = samples.mean(axis=1)
R = samples.max(axis=1) - samples.min(axis=1)

# Phase I(基準群=管理状態)から管理限界を推定し、その後を監視
A2, D3, D4 = 0.577, 0.0, 2.114
xbarbar = xbar[:k_base].mean()
Rbar = R[:k_base].mean()
ucl_x = xbarbar + A2 * Rbar
lcl_x = xbarbar - A2 * Rbar

out = np.where((xbar > ucl_x) | (xbar < lcl_x))[0]
first = int(out[0]) if out.size else None
print(f"工程平均シフト = 第{shift_at + 1}群から +1.5*sigma(= +{shift:.1f})")
print(f"Phase I 推定: Xbarbar={xbarbar:.3f}  UCL={ucl_x:.3f}  LCL={lcl_x:.3f}")
print(f"管理限界を最初に破った群 = 第{first + 1}群  Xbar={xbar[first]:.3f}")
print(f"検知の遅れ = {first - shift_at + 1} 群(シフト発生からの群数)")
print(f"シフト後に管理限界外となった群 = {[int(i + 1) for i in out if i >= shift_at]}")

fig, ax = plt.subplots(figsize=(11, 5))
g = np.arange(1, k_total + 1)
ax.plot(g, xbar, "o-", color="#1f77b4", label="群平均 Xbar")
ax.axhline(xbarbar, color="green", label="CL")
ax.axhline(ucl_x, ls="--", color="#d62728", label="UCL/LCL")
ax.axhline(lcl_x, ls="--", color="#d62728")
ax.axvline(shift_at + 0.5, ls=":", color="purple", label=f"第{shift_at + 1}群:工程平均シフト")
ax.plot(first + 1, xbar[first], "*", color="black", ms=18, label=f"検知(第{first + 1}群)")
ax.set_xlabel("サブグループ番号"); ax.set_ylabel("群平均 Xbar")
ax.set_title("異常原因(平均シフト)を Xbar管理図が検知:点が管理限界を突破")
ax.legend(loc="upper left"); plt.tight_layout(); plt.show()

出力:

工程平均シフト = 第21群から +1.5*sigma(= +3.0)
Phase I 推定: Xbarbar=99.614  UCL=102.745  LCL=96.484
管理限界を最初に破った群 = 第21群  Xbar=102.923
検知の遅れ = 1 群(シフト発生からの群数)
シフト後に管理限界外となった群 = [21, 22, 23, 26, 28, 29]

出力の意味:基準群から Xˉ\bar X 図の限界は [96.484, 102.745]。工程平均が +1.5σ+1.5\sigma ずれた第21群(シフト直後)の Xˉ=102.923\bar X=102.923 が即座に UCL を突破——検知の遅れは1群でした。図では、紫の点線(第21群のシフト)の直後に青い点が赤い限界線を超え(★印)、その後も高い側に張り付きます。これは「ばらつきが大きくなったのか、平均がずれたのか」を現場に知らせ、原因(段取り・工具)を探す引き金です。第2章の追跡信号が需要シフトを第19期に検知したのと運用は同じ——基準を作り、外れを検知し、原因に手を打つ。違いは、追跡信号が予測のバイアスを、Xˉ\bar X 管理図が工程の平均を見張ることだけです。

検知は確率的(ARL). 1.5σ1.5\sigma 程度のシフトは1群で弾けましたが、0.5σ0.5\sigma のような小さなずれは数群〜十数群かかることもあります。「管理状態でも約370群に1回は誤って鳴る(3σ3\sigma の誤警報0.27%)」「シフトを平均何群で検知するか(ARL)」のトレードオフは、3σ3\sigma の設計思想そのもの(品質管理第一種の過誤・第二種の過誤・検出力(2種類の誤りとトレードオフ・サンプルサイズ設計))。小さなシフトを早く拾いたいなら CUSUM や EWMA を使います(要最新確認)。

⚠️ よくある誤解

関連ノート