🎓 レベル:応用 | 重要度:A(必須)
📎 前提:M/M/1 待ち行列モデル()・待ち行列の基礎とリトルの法則(稼働率と待ちの非線形) | 在庫バッファ:安全在庫と発注点 | 締め:制約理論TOCとスループット・リーン生産・JIT・かんばん
要点(BLUF)
- リーン(リーン生産・JIT・かんばん)も TOC(制約理論TOCとスループット)も、効く理由は1つに集約されます——ばらつきがフロー(待ち・在庫・リードタイム)を劣化させる。これを定量化するのがキングマンの式(ファクトリーフィジクスの VUT 分解)です。
- 一般の単一窓口 G/G/1 の平均待ち時間は、近似的に と、ばらつき × 稼働率 × 時間 の積に分解できます。 は到着間隔・サービス時間の SCV(2乗変動係数 )。
- (指数到着・指数サービス)を入れると になり、 =M/M/1(M/M/1 待ち行列モデル)に厳密一致。キングマンは M/M/1 の自然な一般化です。
- ばらつきは消せず、在庫・能力・時間の3つのいずれかで必ず吸収される(バッファリング法則)。リーンは を下げて必要バッファを減らす営みで、その効果は「- 曲線を下へずらし、同じ待ちでより高い稼働率を許す」ことだとコードで見ます。高稼働が安全なのは、低ばらつきのときだけです。
1. なぜリーンとTOCが効くのか:ばらつきがフローを壊す
待ち行列の基礎とリトルの法則 で、稼働率 を1に近づけると待ちが で爆発するのを見ました。M/M/1 ではこれが厳密に出ましたが、現実の到着もサービスも指数分布とは限りません。では何が待ちを決めるのか。答えは「ばらつきと稼働率」です。
直感はこうです。もし到着もサービスもまったくばらつかない(一定間隔で来て、一定時間で終わる)なら、能力が足りる限り待ちはゼロにできます——客が来るたびに窓口がちょうど空いている。待ちが生まれるのは、到着が固まったり、サービスが長引いたりするばらつきのせい。そして稼働率が高いほど、一度生じた行列が解消されにくい。だから待ち=ばらつき問題であり、ばらつきを下げればフローは改善する。これがリーン(平準化・一個流し・品質の作り込み)と TOC(バッファで制約を守る)が共通して効く根っこです。
ばらつきの大きさは変動係数で測ります。標準偏差を平均で割った 、その2乗が SCV(squared coefficient of variation):
SCV は無次元で、分布の「暴れ具合」を平均で正規化した量。指数分布は なので 、一定(決定的)なら 、指数より暴れる(バースト的)なら 。この がそのまま待ち時間に効きます。
2. キングマンの式とM/M/1への帰着
単一窓口の一般待ち行列 G/G/1(到着もサービスも一般分布)の平均待ち時間 について、キングマン(Kingman, 1961)の近似式が成り立ちます。
ここで は到着間隔の SCV、 はサービス時間の SCV、 は稼働率、 は平均サービス時間(effective process time)。ファクトリーフィジクス(Hopp & Spearman)はこれを VUT 分解と呼びます。
- V(Variability・ばらつき) :到着とサービスのばらつきの平均。
- U(Utilization・稼働率) :待ち行列の基礎とリトルの法則 で見た 爆発の項。
- T(Time・時間) :1個あたりの正味処理時間。
3つの積だというのが教訓です。 を半分にすれば も半分。 を下げれば が下がる。ばらつき・稼働率・処理時間のどれを攻めても待ちは減る——が、 は で発散するので、高稼働域では を下げるのが効きます。
M/M/1 への帰着を確かめましょう。ポアソン到着は到着間隔が指数分布なので 、指数サービスも 。代入すると で、
これは M/M/1 待ち行列モデル で導いた M/M/1 の と完全に一致します。実はキングマンの式は、ポアソン到着()なら M/M/1・M/G/1 で厳密(M/G/1 はポラチェック–ヒンチン公式と一致)、一般の G/G/1 では重交通()で漸近的に厳密になる近似です。「M/M/1 は という特別な1点」で、キングマンはそこからばらつきを動かせるように一般化したもの、と捉えてください。
3. バッファリング法則:在庫・能力・時間
キングマンの式は、ばらつきは消えてなくならず、必ず何かで「払う」ことを教えます。 である限り 。この支払いの形は3通りしかありません(Hopp & Spearman のバッファリング法則)。
flowchart LR
VAR["ばらつき<br/>(到着 ca・サービス cs)"] --> BUF{"必ずどれかで吸収"}
BUF --> INV["在庫バッファ<br/>(安全在庫・WIP)"]
BUF --> CAP["能力バッファ<br/>(余力=稼働率を下げる)"]
BUF --> TIME["時間バッファ<br/>(待ち時間・リードタイム)"]
- 在庫で払う:安全在庫や仕掛在庫を持って、ばらつきを在庫で吸収する(安全在庫と発注点 の 、DBR のバッファ=制約理論TOCとスループット)。
- 能力で払う:稼働率を下げて余力を残す( を下げると が下がる。待ち行列の基礎とリトルの法則 の「余力を残す価値」)。
- 時間で払う:客や仕事を待たせる( そのもの・長いリードタイム)。
3つはトレードオフで、どれかを減らせば別のどれかが増えます。在庫を削れば(リーンでかんばんを絞れば)、同じばらつきなら能力か時間で払うしかない——だからばらつきを下げずに在庫だけ削ると、欠品(時間バッファの破綻)や残業(能力バッファ)にしわ寄せが行きます。リーンの本質は「在庫を削る」ことではなく、()そのものを下げて、3つのバッファの総量を減らすことなのです。次のコードで、 を下げると「同じ待ち(時間バッファ一定)でより高い稼働率(能力バッファを薄く)」が許されることを見ます。
4. キングマンの式とG/G/1シミュレーション(コード)
キングマンの式を、(1) で M/M/1 に一致すること、(2) ばらつき(SCV)を下げると が減ること、(3) ガンマ分布で SCV を指定した G/G/1 の離散事象シミュレーションで裏取りすること、の3段で確かめます。シミュレーションは待ち時間の Lindley 再帰 (待ち行列の基礎とリトルの法則 と同じ)。ガンマ分布は平均 ・SCV を shape ・scale で指定でき、 で指数分布になります。
import numpy as np
import pandas as pd
def kingman_wq(ca2, cs2, rho, te):
"""キングマン近似 Wq = (ca^2+cs^2)/2 * rho/(1-rho) * te。"""
return (ca2 + cs2) / 2.0 * rho / (1.0 - rho) * te
te = 1.0 # 平均サービス時間 te = 1/mu(mu=1)
print("=== ca^2=cs^2=1 のとき キングマン式 = M/M/1 の Wq ===")
print(" rho Kingman_Wq MM1_Wq=rho*te/(1-rho)")
for rho in [0.50, 0.70, 0.80, 0.90, 0.95]:
kq = kingman_wq(1.0, 1.0, rho, te)
mm1 = rho / (1.0 - rho) * te
print(f"{rho:.2f} {kq:9.4f} {mm1:9.4f}")
print()
print("=== rho=0.90 固定:ばらつき(SCV)を下げると待ちが減る ===")
print(" ca^2 cs^2 Kingman_Wq")
for ca2, cs2 in [(2.0, 2.0), (1.0, 1.0), (0.5, 0.5), (0.25, 0.25), (0.0, 0.0)]:
print(f"{ca2:.2f} {cs2:.2f} {kingman_wq(ca2, cs2, 0.90, te):8.4f}")
def simulate_gg1(lam, mu, ca2, cs2, n, seed):
"""G/G/1 を Lindley 再帰 Wq_i=max(0, Wq_{i-1}+S_{i-1}-A_i) でシミュ。
到着間隔・サービスはガンマ(平均 m, SCV c^2 -> shape=1/c^2, scale=m*c^2)。"""
rng = np.random.default_rng(seed)
A = rng.gamma(1.0 / ca2, (1.0 / lam) * ca2, n) # 到着間隔(平均 1/lam)
S = rng.gamma(1.0 / cs2, (1.0 / mu) * cs2, n) # サービス時間(平均 1/mu)
Wq = 0.0
tot = 0.0
warm = n // 10
for i in range(1, n):
Wq = max(0.0, Wq + S[i - 1] - A[i])
if i >= warm:
tot += Wq
return tot / (n - warm)
print()
print("=== G/G/1 シミュでキングマン近似を裏取り(mu=1, n=1,000,000)===")
print(" rho ca^2 cs^2 Kingman simulation")
n = 1_000_000
for rho, ca2, cs2 in [(0.90, 1.0, 1.0), (0.90, 0.5, 0.5), (0.90, 2.0, 2.0),
(0.95, 0.25, 0.25), (0.80, 1.0, 1.0)]:
kq = kingman_wq(ca2, cs2, rho, te)
sim = simulate_gg1(rho, 1.0, ca2, cs2, n, seed=20260627)
print(f"{rho:.2f} {ca2:.2f} {cs2:.2f} {kq:7.4f} {sim:9.4f}")
出力:
=== ca^2=cs^2=1 のとき キングマン式 = M/M/1 の Wq ===
rho Kingman_Wq MM1_Wq=rho*te/(1-rho)
0.50 1.0000 1.0000
0.70 2.3333 2.3333
0.80 4.0000 4.0000
0.90 9.0000 9.0000
0.95 19.0000 19.0000
=== rho=0.90 固定:ばらつき(SCV)を下げると待ちが減る ===
ca^2 cs^2 Kingman_Wq
2.00 2.00 18.0000
1.00 1.00 9.0000
0.50 0.50 4.5000
0.25 0.25 2.2500
0.00 0.00 0.0000
=== G/G/1 シミュでキングマン近似を裏取り(mu=1, n=1,000,000)===
rho ca^2 cs^2 Kingman simulation
0.90 1.00 1.00 9.0000 8.9813
0.90 0.50 0.50 4.5000 4.2958
0.90 2.00 2.00 18.0000 18.5598
0.95 0.25 0.25 4.7500 4.5210
0.80 1.00 1.00 4.0000 4.0131
出力の意味:上段で、 のキングマン式は M/M/1 の と全 で完全一致( で 9.0、 で 19.0)。キングマンが M/M/1 の一般化だと確認できます。中段、 に固定してばらつきだけを下げると、 は SCV の18.0 → SCV の9.0 → SCV の4.5 → SCV の2.25 → SCV(決定的)の0.0 へ。稼働率も処理時間も一切変えず、ばらつきを下げるだけで待ちが消えていきます( に比例)。下段の G/G/1 シミュレーションでは、ガンマ分布で SCV を指定して Lindley 再帰を100万回回した実測 が、キングマン式と突き合わさります—— の行(M/M/1 相当の (1,1) と (1,1))は 8.9813 vs 9.0、4.0131 vs 4.0 とほぼ厳密一致(ポアソン到着では式が厳密)。 の行((0.5,0.5)・(2,2)・(0.25,0.25))は 4.30 vs 4.5、18.56 vs 18.0、4.52 vs 4.75 と数%以内で、キングマンが良い近似であること(誤差は非ポアソン到着ぶん。重交通 ほど近似は良くなる)を示しています。
5. ばらつき低減が高稼働を安全にする(コード)
バッファリング法則の核心——「ばらつきを下げると、同じ待ち(時間バッファ一定)で、より高い稼働率(能力バッファを薄く)が許される」を可視化します。目標待ち時間を ( の9倍)に固定し、ばらつき水準ごとに - 曲線を描いて、どこまで稼働率を上げてよいか を読み取ります。 を について解くと です。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
te = 1.0
def wq(ca2, cs2, rho, te):
return (ca2 + cs2) / 2.0 * rho / (1.0 - rho) * te
target = 9.0 # 目標待ち時間(= te の9倍)
print("目標 Wq =", target, "を同じ待ちに保つとき、各ばらつき水準が許す稼働率 rho*")
print(" SCV(=ca^2=cs^2) 許される rho* = target/(target+SCV)")
for scv in [2.0, 1.0, 0.5, 0.25]:
rho_star = target / (target + scv) # (ca2+cs2)/2 * r/(1-r) = target を解く
print(f" {scv:.2f} {rho_star:.4f}")
rho = np.linspace(0.01, 0.975, 400)
plt.figure(figsize=(9, 5.5))
curves = [(2.0, "高ばらつき SCV=2", "#d62728"),
(1.0, "中 SCV=1(M/M/1)", "#ff7f0e"),
(0.25, "低ばらつき SCV=0.25(リーン)", "#1f77b4")]
for scv, label, color in curves:
plt.plot(rho, wq(scv, scv, rho, te), color=color, lw=2, label=label)
r_star = target / (target + scv)
plt.scatter([r_star], [target], color=color, zorder=5)
plt.annotate(f"rho*={r_star:.3f}", (r_star, target),
textcoords="offset points", xytext=(4, 6), fontsize=9, color=color)
plt.axhline(target, ls=":", color="gray", label=f"目標 Wq={target:.0f}")
plt.xlabel("稼働率 rho"); plt.ylabel("平均待ち時間 Wq")
plt.title("ばらつき低減(リーン)は Wq-rho 曲線を下へずらす=同じ待ちでより高稼働を許す")
plt.ylim(0, 30); plt.xlim(0, 1.0)
plt.legend(loc="upper left"); plt.tight_layout()
plt.show()
出力:
目標 Wq = 9.0 を同じ待ちに保つとき、各ばらつき水準が許す稼働率 rho*
SCV(=ca^2=cs^2) 許される rho* = target/(target+SCV)
2.00 0.8182
1.00 0.9000
0.50 0.9474
0.25 0.9730
出力の意味:同じ目標待ち時間 を守るのに、高ばらつき(SCV)の現場では稼働率を までしか上げられません。ばらつきを SCV(M/M/1 並み)に下げれば 、さらにリーンで SCV まで下げれば まで稼働率を上げてよい。図では、ばらつきを下げるほど - 曲線が下へずれ、目標線()と交わる点()が右へ動きます。これがバッファリング法則の実践的含意です——ばらつきを下げる(時間バッファも在庫バッファも据え置き)と、能力バッファを薄くできる=同じサービス水準でより高い稼働率で回せる。高ばらつきのまま稼働率0.97で回せば待ちは天文学的( なら )ですが、ばらつきを下げてあれば0.97でも で済む。「稼働率を上げてよいかどうか」は、ばらつきを下げてからでないと決められないのです。リーンが在庫削減の前にまず平準化・段取り短縮・品質作り込みで を攻めるのは、この順序を守るためです。
⚠️ よくある誤解
- 「ばらつきは努力で消せる」ではない: をゼロにできれば ですが、現実の需要も故障も完全には消せません。残ったばらつきは在庫・能力・時間のどれかで必ず払う(バッファリング法則)。リーンは「ばらつきをゼロにする」のではなく「下げて、払い方を在庫から能力・時間へ最適に振り直す」営みです。どれも持たずにばらつきを放置すれば、欠品か残業か長待ちのいずれかが噴き出します。
- 「稼働率は上げるほど効率的」ではない: は で発散します(待ち行列の基礎とリトルの法則)。高稼働が許されるのは が小さいときだけ。ばらつきが大きい工程を高稼働で回すと、 は VUT の積で跳ね上がります。「設備を遊ばせるな」という局所効率の号令は、ばらつきの大きい非制約工程では WIP と待ちを生むだけ(制約理論TOCとスループット の従属の話)。
- 「キングマンの式は厳密」ではない:(ポアソン到着)なら M/M/1・M/G/1 で厳密ですが、一般の G/G/1 では近似です(重交通 で漸近的に厳密)。本ノートのシミュでも非ポアソン到着では数%ずれました。設計の目安としては十分強力ですが、SLA を厳密に詰めるときは分布を指定したシミュレーション(本ノートの Lindley 再帰)で裏を取るのが安全です(要最新確認)。
- 「リーン=在庫削減」ではない(再掲):本章を貫く誤解です。在庫はばらつきを吸収する3つのバッファの1つにすぎません。 を下げずに在庫だけ削れば、払いは能力(残業)か時間(欠品・長納期)に回るだけ。リーンの本丸は の低減で、在庫削減はその結果として安全に達成されます(リーン生産・JIT・かんばん)。
関連ノート
- M/M/1 待ち行列モデル(。キングマンの式が で帰着する特別な1点)
- 待ち行列の基礎とリトルの法則(稼働率 爆発=VUT の U 項・余力を残す価値)
- 安全在庫と発注点(在庫バッファ 。ばらつきを在庫で払う形)
- 制約理論TOCとスループット(DBR のバッファ=制約のばらつき防御。なぜ制約手前に在庫が要るか)
- リーン生産・JIT・かんばん(平準化・一個流し= 低減の実装。なぜ在庫削減の前にばらつき低減か)
- オペレーションズ・マネジメント 全体目次