100本ノック / ベイズ統計 / データ分析のためのベイズ統計100本ノック

製造業の不良率をベイズ推定|信用区間・基準超過確率・次ロット予測をPythonで実践

少量の検査データから工程改善を判断する――ベイズ推定と予測の実務

製造現場では、不良率を単一の値で報告するだけでは、出荷可否や改善投資を判断できません。本記事では、架空の精密部品工場における現行ラインA改善候補ラインBの抜取検査を題材に、No.041〜No.050を通して「推定の不確実性を意思決定に変える」流れを実装します。

扱う問いは、現在の不良率はどの程度か、管理基準を超える可能性はあるか、ラインBは本当に改善しているか、次ロットでは何個の不良を見込むか、というものです。外部データは使わず、固定seedで生成した架空データを用います。

[!NOTE] 本資料は、数理工房 (もしくは代表である和山個人) が過去に企業研修において使用した notebook を企業様の許可を得て再構成・編集のうえ公開しています。 掲載データはすべて架空のものであり、実在する企業・工場・数値とは一切関係ありません。

はじめに:この記事で扱う製造業の実務課題

ある工場では、重要寸法の規格外を「不良」と定義し、ラインごとに抜取検査を行っています。管理上の目安は不良率2%です。しかし、検査数が数百個程度なら、観測不良率は偶然でも動きます。「1.7%だから問題なし」「2.2%だから停止」と点だけで判断すると、過剰反応と見逃しの両方が起こります。

本記事では不良確率を未知パラメータ pp とし、事前分布と検査結果から事後分布を求めます。そのうえで、工程状態の説明、ライン比較、次ロット予測、モデル確認、報告書作成までを一続きに扱います。

現場でよくある状況

  • 日報には「検査数・不良数・不良率」だけが載り、不確実性が示されない
  • 改善前後の率の差を、そのまま改善効果と解釈してしまう
  • 管理基準を超えたか否かだけで、超える確率を議論できない
  • 過去データによる推定と、将来ロットのばらつきが混同される
  • モデルの予測と実測の不整合を確認せず、結果だけを報告する

なぜこの問題は判断が難しいのか

不良数 xxnn 個中の二項分布 xBinomial(n,p)x\sim\mathrm{Binomial}(n,p) とすると、同じ真の不良率でも検査のたびに xx は変わります。また、推定対象 pp の不確実性と、次ロットで発生する偶然のばらつきは別物です。ベイズ統計では、前者を事後分布、両者を合わせたものを事後予測分布で表現します。

今回扱うノックの全体像

No.テーマ実務で答える問い
041事後平均不良率の代表値はいくつか
042事後中央値事後確率を半分に分ける値は何か
043MAP推定値最も密度が高い不良率は何か
044信用区間不良率としてもっともらしい範囲はどこか
045閾値超過確率不良率が管理基準2%を超える確率は何%か
0462確率の差ラインBがAより改善した確率と改善幅はどの程度か
047事後予測分布次ロットの不良数をどう予測するか
048予測区間次ロット不良数の現実的な範囲はどこか
049予測チェックモデルと実測に大きな不整合はないか
050レポート結果を意思決定者へどう伝えるか

Python 環境の準備

NumPy、pandas、SciPy、matplotlibのみを使います。乱数生成器を一つ作り、再実行しても同じ結果になるようseedを固定します。

import sys
import numpy as np
import pandas as pd
import scipy
from scipy.stats import beta, betabinom
import matplotlib
import matplotlib.pyplot as plt
from IPython.display import display, Markdown

SEED = 20250715
rng = np.random.default_rng(SEED)
plt.rcParams["figure.figsize"] = (8, 4.5)
plt.rcParams["axes.unicode_minus"] = False
plot_label = {"A(現行)": "Line A (current)", "B(改善候補)": "Line B (candidate)"}

print(f"Python     : {sys.version.split()[0]}")
print(f"NumPy      : {np.__version__}")
print(f"pandas     : {pd.__version__}")
print(f"SciPy      : {scipy.__version__}")
print(f"matplotlib : {matplotlib.__version__}")
Python     : 3.13.1
NumPy      : 2.5.1
pandas     : 3.0.3
SciPy      : 1.18.0
matplotlib : 3.11.0

架空データの作成

各ラインについて25日間、1日20個を抜き取ったとします。研修用データとして、固定した日別検査数と不良数をPythonで生成します。ラインAは現行条件、ラインBは設備条件を見直した候補です。ここでのデータは説明用の架空値です。

days = pd.date_range("2025-06-02", periods=25, freq="B")
records = []
for line, true_rate in {"A(現行)": 0.024, "B(改善候補)": 0.014}.items():
    defects = rng.binomial(20, true_rate, size=len(days))
    for day, x in zip(days, defects):
        records.append({"date": day, "line": line, "inspected": 20, "defects": int(x)})

inspection = pd.DataFrame(records)
summary = (inspection.groupby("line", as_index=False)
           .agg(inspected=("inspected", "sum"), defects=("defects", "sum")))
summary["observed_rate"] = summary["defects"] / summary["inspected"]
display(inspection.head(8))
display(summary.style.format({"observed_rate": "{:.2%}"}))
date line inspected defects
0 2025-06-02 A(現行) 20 0
1 2025-06-03 A(現行) 20 0
2 2025-06-04 A(現行) 20 0
3 2025-06-05 A(現行) 20 0
4 2025-06-06 A(現行) 20 2
5 2025-06-09 A(現行) 20 1
6 2025-06-10 A(現行) 20 0
7 2025-06-11 A(現行) 20 0
  line inspected defects observed_rate
0 A(現行) 500 10 2.00%
1 B(改善候補) 500 8 1.60%
daily = inspection.pivot(index="date", columns="line", values="defects")
ax = daily.rename(columns=plot_label).plot(marker="o", linewidth=1.2)
ax.set_title("Daily defects in 20 inspected units")
ax.set_xlabel("Inspection date")
ax.set_ylabel("Number of defects")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

png

モデルの共通設定

過去の類似工程について「不良率は中心2%程度だが、強く決めつけない」という知識を pBeta(2,98)p\sim\mathrm{Beta}(2,98) で表します。これは仮想的に100個を見て2個が不良だった程度の情報量です。xx 個の不良を nn 個の検査で観測すると、共役性により

px,nBeta(α+x,  β+nx)p\mid x,n\sim\mathrm{Beta}(\alpha+x,\;\beta+n-x)

となります。実務では事前分布を品質保証・生産技術と合意し、複数の事前分布による感度分析も行います。

prior_a, prior_b = 2, 98
post = summary.copy()
post["alpha"] = prior_a + post["defects"]
post["beta"] = prior_b + post["inspected"] - post["defects"]
post = post.set_index("line")
display(post)
inspected defects observed_rate alpha beta
line
A(現行) 500 10 0.020 12 588
B(改善候補) 500 8 0.016 10 590

No.041:事後平均を計算する

実務での意味

事後平均は二乗誤差を損失とするときのベイズ推定値です。日報・KPIに一つの代表値が必要な場合に使いやすい一方、分布の幅も併記する必要があります。Beta分布では E[px]=α/(α+β)E[p\mid x]=\alpha'/(\alpha'+\beta') です。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

post["posterior_mean"] = post["alpha"] / (post["alpha"] + post["beta"])
display(post[["observed_rate", "posterior_mean"]].style.format("{:.3%}"))
  observed_rate posterior_mean
line    
A(現行) 2.000% 2.000%
B(改善候補) 1.600% 1.667%

結果の読み取り

事後平均は観測率と事前平均の間に位置します。標本が少ないほど事前情報の影響が大きく、偶然の振れに対する過剰反応を抑えます。ただし、平均だけで出荷可否を決めず、No.044・045の区間と確率を確認します。

No.042:事後中央値を計算する

実務での意味

事後中央値 mmP(pmx)=0.5P(p\le m\mid x)=0.5 を満たします。歪んだ分布では平均と異なり、絶対誤差を損失とした代表値になります。低不良率のように0付近で歪みやすい指標で比較する価値があります。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

post["posterior_median"] = [beta.median(r.alpha, r.beta) for r in post.itertuples()]
display(post[["posterior_mean", "posterior_median"]].style.format("{:.3%}"))
  posterior_mean posterior_median
line    
A(現行) 2.000% 1.947%
B(改善候補) 1.667% 1.613%

結果の読み取り

平均と中央値の差は小さいものの同一ではありません。低率かつ不良数が少ない場合、分布の右裾が長くなり、平均が中央値よりやや大きくなることがあります。代表値の定義を報告書に明記します。

No.043:MAP推定値を計算する

実務での意味

MAP(maximum a posteriori)は事後密度が最大となる値です。Beta分布で α,β>1\alpha',\beta'>1 のとき (α1)/(α+β2)(\alpha'-1)/(\alpha'+\beta'-2) です。最も「ありそうな一点」を示しますが、連続値の一点の確率自体は0であり、区間の代替ではありません。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

post["map"] = (post["alpha"] - 1) / (post["alpha"] + post["beta"] - 2)
display(post[["posterior_mean", "posterior_median", "map"]].style.format("{:.3%}"))
  posterior_mean posterior_median map
line      
A(現行) 2.000% 1.947% 1.839%
B(改善候補) 1.667% 1.613% 1.505%

結果の読み取り

平均・中央値・MAPの近さは推定が極端に歪んでいないことを示します。ただし、意思決定では採用した損失関数に応じて推定値を選ぶべきで、「MAPが常に正解」ではありません。

No.044:信用区間を計算する

実務での意味

95%等尾信用区間は、事後分布の下側2.5%点と上側97.5%点で作ります。ベイズ信用区間は、モデルとデータを条件として「pp がこの区間に入る事後確率が95%」と読めます。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

post["ci_low"] = [beta.ppf(0.025, r.alpha, r.beta) for r in post.itertuples()]
post["ci_high"] = [beta.ppf(0.975, r.alpha, r.beta) for r in post.itertuples()]
display(post[["posterior_mean", "ci_low", "ci_high"]].style.format("{:.3%}"))

plot_df = post.reset_index()
err = np.vstack([plot_df.posterior_mean - plot_df.ci_low,
                 plot_df.ci_high - plot_df.posterior_mean])
fig, ax = plt.subplots()
ax.errorbar(plot_df["line"].map(plot_label), plot_df.posterior_mean, yerr=err,
            fmt="o", capsize=6, color="tab:blue")
ax.axhline(0.02, color="tab:red", linestyle="--", label="Control threshold: 2%")
ax.set_title("Posterior mean and 95% credible interval")
ax.set_xlabel("Production line")
ax.set_ylabel("Defect probability")
ax.grid(True, alpha=0.3)
ax.legend()
plt.tight_layout()
plt.show()
  posterior_mean ci_low ci_high
line      
A(現行) 2.000% 1.039% 3.262%
B(改善候補) 1.667% 0.803% 2.833%

png

結果の読み取り

区間が重なることだけで「差がない」とは結論できません。また、ラインAの区間が基準をまたぐなら、点推定が2%未満でも安全と言い切れません。追加検査の価値が高い状況です。

No.045:パラメータが一定値を超える確率を計算する

実務での意味

管理基準を plimit=2%p_{limit}=2\% とすると、超過確率は P(p>plimitx)=1FBeta(plimit)P(p>p_{limit}\mid x)=1-F_{Beta}(p_{limit}) です。「基準超過か否か」を確率として品質会議に提示できます。実際の停止基準は損失・規制・顧客要求と合わせて設計します。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

limit = 0.02
post["prob_over_2pct"] = [beta.sf(limit, r.alpha, r.beta) for r in post.itertuples()]
display(post[["posterior_mean", "prob_over_2pct"]].style.format("{:.2%}"))

xgrid = np.linspace(0, 0.07, 600)
fig, ax = plt.subplots()
for line, row in post.iterrows():
    density = beta.pdf(xgrid, row.alpha, row.beta)
    ax.plot(xgrid, density, label=plot_label[line])
    ax.fill_between(xgrid, density, where=xgrid > limit, alpha=0.18)
ax.axvline(limit, color="black", linestyle="--", label="Threshold: 2%")
ax.set_title("Posterior distributions and threshold exceedance")
ax.set_xlabel("Defect probability")
ax.set_ylabel("Posterior density")
ax.grid(True, alpha=0.3)
ax.legend()
plt.tight_layout()
plt.show()
  posterior_mean prob_over_2pct
line    
A(現行) 2.00% 46.28%
B(改善候補) 1.67% 24.15%

png

結果の読み取り

超過確率は、基準線より右側の事後面積です。これを、たとえば「80%以上なら工程確認」「95%以上なら一時停止」のようなルールに接続できますが、閾値は誤停止と流出のコストを定量化して決めます。

No.046:2つの確率の差の事後分布を計算する

実務での意味

独立な事後分布から pA,pBp_A,p_B をサンプリングし、改善量 Δ=pApB\Delta=p_A-p_B を計算します。P(Δ>0)P(\Delta>0) はBがAより低不良率である確率、P(Δ>0.005)P(\Delta>0.005) は0.5ポイント以上改善する確率です。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

draws = 200_000
pa = rng.beta(post.loc["A(現行)", "alpha"], post.loc["A(現行)", "beta"], draws)
pb = rng.beta(post.loc["B(改善候補)", "alpha"], post.loc["B(改善候補)", "beta"], draws)
delta = pa - pb
comparison = pd.Series({
    "mean_improvement": delta.mean(),
    "prob_B_better": np.mean(delta > 0),
    "prob_improvement_over_0.5pt": np.mean(delta > 0.005),
    "ci_low": np.quantile(delta, 0.025),
    "ci_high": np.quantile(delta, 0.975),
})
display(comparison.to_frame("value").style.format("{:.2%}"))

fig, ax = plt.subplots()
ax.hist(delta, bins=80, density=True, alpha=0.75, color="tab:green")
ax.axvline(0, color="black", linestyle="--", label="No difference")
ax.axvline(0.005, color="tab:red", linestyle=":", label="0.5 pt improvement")
ax.set_title("Posterior distribution of improvement (pA - pB)")
ax.set_xlabel("Reduction in defect probability")
ax.set_ylabel("Density")
ax.grid(True, alpha=0.3)
ax.legend()
plt.tight_layout()
plt.show()
  value
mean_improvement 0.34%
prob_B_better 67.09%
prob_improvement_over_0.5pt 41.07%
ci_low -1.18%
ci_high 1.88%

png

結果の読み取り

「Bの観測率が低い」だけでなく、Bが優れる確率と実務的に意味のある改善幅を超える確率を分けて示せます。統計的な優位性が高くても改善幅が小さければ、改造費を回収できない可能性があります。

No.047:事後予測分布を作成する

実務での意味

次ロット mm 個の不良数 YY は、pp の不確実性を積分したベータ二項分布に従います。YxBetaBinomial(m,α,β)Y\mid x\sim\mathrm{BetaBinomial}(m,\alpha',\beta') です。ここでは各ラインの次ロット200個を予測します。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

future_n = 200
k = np.arange(future_n + 1)
predictive = {}
for line, row in post.iterrows():
    predictive[line] = betabinom.pmf(k, future_n, row.alpha, row.beta)

fig, ax = plt.subplots()
for line, pmf in predictive.items():
    ax.plot(k[:18], pmf[:18], marker="o", label=plot_label[line])
ax.set_title("Posterior predictive distribution for next 200 units")
ax.set_xlabel("Number of defects in next lot")
ax.set_ylabel("Predictive probability")
ax.grid(True, alpha=0.3)
ax.legend()
plt.tight_layout()
plt.show()

png

結果の読み取り

予測分布は、次ロットで不良が何個発生し得るかを直接表します。保留スペース、再検査工数、代替在庫など「個数」で計画する業務には、パラメータの信用区間より事後予測分布が適しています。

No.048:予測区間を計算する

実務での意味

95%予測区間は、次ロットの不良数が入ると予測される範囲です。これは不良率パラメータの信用区間ではなく、将来観測の二項変動も含むため、相対的に広くなります。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

pred_rows = []
for line, row in post.iterrows():
    dist = betabinom(future_n, row.alpha, row.beta)
    pred_rows.append({
        "line": line,
        "expected_defects": dist.mean(),
        "prediction_low": int(dist.ppf(0.025)),
        "prediction_high": int(dist.ppf(0.975)),
        "prob_5_or_more": dist.sf(4),
    })
pred_summary = pd.DataFrame(pred_rows).set_index("line")
display(pred_summary.style.format({"expected_defects": "{:.2f}", "prob_5_or_more": "{:.1%}"}))
  expected_defects prediction_low prediction_high prob_5_or_more
line        
A(現行) 4.00 0 9 37.0%
B(改善候補) 3.33 0 8 25.8%

結果の読み取り

期待不良数だけでなく上側予測点を見ることで、要員や再検査能力を余裕を含めて設計できます。「平均3個だから3個分だけ準備」では、通常起こり得る上振れに対応できません。

No.049:観測値と事後予測分布を比較する

実務での意味

モデルが現場データの特徴を再現できるかを事後予測チェックで確認します。今回は日別20個中の不良数を再現し、「不良ゼロの日数」と「1日の最大不良数」を比較します。極端な位置に実測があれば、日間変動・ロット差・設備状態などをモデルに追加する候補です。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

n_rep = 50_000
ppc_rows = []
fig, axes = plt.subplots(1, 2, figsize=(11, 4.2))
for ax, (line, row) in zip(axes, post.iterrows()):
    p_rep = rng.beta(row.alpha, row.beta, size=(n_rep, 1))
    replicated = rng.binomial(20, p_rep, size=(n_rep, 25))
    rep_zero_days = (replicated == 0).sum(axis=1)
    observed = daily[line].to_numpy()
    obs_zero_days = int((observed == 0).sum())
    ppc_rows.append({
        "line": line,
        "observed_zero_days": obs_zero_days,
        "predictive_mean_zero_days": rep_zero_days.mean(),
        "two_sided_tail_area": 2 * min(np.mean(rep_zero_days <= obs_zero_days),
                                         np.mean(rep_zero_days >= obs_zero_days)),
    })
    ax.hist(rep_zero_days, bins=np.arange(-0.5, 26.5), alpha=0.75)
    ax.axvline(obs_zero_days, color="tab:red", linestyle="--", label="Observed")
    ax.set_title(f"PPC: {plot_label[line]}")
    ax.set_xlabel("Zero-defect days out of 25")
    ax.set_ylabel("Simulation frequency")
    ax.grid(True, alpha=0.3)
    ax.legend()
plt.tight_layout()
plt.show()
ppc = pd.DataFrame(ppc_rows).set_index("line")
display(ppc.style.format({"predictive_mean_zero_days": "{:.1f}", "two_sided_tail_area": "{:.3f}"}))

png

  observed_zero_days predictive_mean_zero_days two_sided_tail_area
line      
A(現行) 16 16.8 0.897
B(改善候補) 17 18.0 0.829

結果の読み取り

赤線が予測分布の極端な端にないかを確認します。このチェックはモデルが正しいことの証明ではありません。不整合があれば、単純な二項モデルに固執せず、日別・設備別の階層構造や過分散を検討します。

No.050:ベイズ推定結果をレポートとしてまとめる

実務での意味

意思決定者向けレポートでは、手法名より「結論・不確実性・推奨行動・前提」を先に示します。以下では計算済みの値から、定型サマリーを自動生成します。数値の丸め前データも監査用に保存できる設計が望まれます。

分析・モデル化の考え方

事後分布または事後予測分布を、現場の管理基準・改善幅・将来個数に結びつけます。推定値を計算すること自体ではなく、どの損失を避けたいか、どの追加情報で判断が変わるかを明確にすることが目的です。

Pythonで確認する

report = pd.DataFrame({
    "指標": ["事後平均不良率", "95%信用区間", "2%超過確率", "次200個の期待不良数", "次200個の95%予測区間"],
    "A(現行)": [
        f"{post.loc['A(現行)','posterior_mean']:.2%}",
        f"{post.loc['A(現行)','ci_low']:.2%}{post.loc['A(現行)','ci_high']:.2%}",
        f"{post.loc['A(現行)','prob_over_2pct']:.1%}",
        f"{pred_summary.loc['A(現行)','expected_defects']:.1f}個",
        f"{pred_summary.loc['A(現行)','prediction_low']}{pred_summary.loc['A(現行)','prediction_high']}個",
    ],
    "B(改善候補)": [
        f"{post.loc['B(改善候補)','posterior_mean']:.2%}",
        f"{post.loc['B(改善候補)','ci_low']:.2%}{post.loc['B(改善候補)','ci_high']:.2%}",
        f"{post.loc['B(改善候補)','prob_over_2pct']:.1%}",
        f"{pred_summary.loc['B(改善候補)','expected_defects']:.1f}個",
        f"{pred_summary.loc['B(改善候補)','prediction_low']}{pred_summary.loc['B(改善候補)','prediction_high']}個",
    ],
}).set_index("指標")
display(report)

recommendation = f"""### 品質会議向け要約(架空データ)

- ラインBがAより低不良率である事後確率は **{np.mean(delta > 0):.1%}**。
- 改善幅が0.5ポイントを超える確率は **{np.mean(delta > 0.005):.1%}**。
- ただし推定幅は残るため、切替前に同一品種・同一検査条件で追加検証する。
- 追加検証では、顧客流出コストと停止コストから採用基準を事前に固定する。
"""
display(Markdown(recommendation))
A(現行) B(改善候補)
指標
事後平均不良率 2.00% 1.67%
95%信用区間 1.04%–3.26% 0.80%–2.83%
2%超過確率 46.3% 24.2%
次200個の期待不良数 4.0個 3.3個
次200個の95%予測区間 0–9個 0–8個

品質会議向け要約(架空データ)

  • ラインBがAより低不良率である事後確率は 67.1%
  • 改善幅が0.5ポイントを超える確率は 41.1%
  • ただし推定幅は残るため、切替前に同一品種・同一検査条件で追加検証する。
  • 追加検証では、顧客流出コストと停止コストから採用基準を事前に固定する。

結果の読み取り

良いレポートは、点推定だけでなく確率・区間・業務上の閾値・次の行動を同じ表に置きます。また、今回の結論は二項モデル、事前分布、検査の独立性、検査精度を前提としており、実工程への適用前に検証が必要です。

対象ノックを通して見える実務上の示唆

  1. 代表値・区間・超過確率は役割が異なる:KPIには事後平均、説明には信用区間、行動基準には閾値超過確率が向きます。
  2. 差がある確率と差の大きさを分ける:ラインBが優れる確率だけでは、設備投資の経済合理性を判断できません。最小実用差を定義します。
  3. 将来計画には予測分布を使う:パラメータ推定ではなく、次ロットの不良個数を用いて再検査要員・在庫・納期リスクを設計します。
  4. 予測チェックは運用の入口:日別変動を再現できなければ、品種、設備、材料ロット、作業班などの説明変数や階層構造を検討します。
  5. 確率から行動への変換にはコストが必要:流出、停止、再検査、切替、納期遅延の損失を定義して初めて意思決定ルールになります。

実務導入する場合に必要なこと

  • 不良定義、検査単位、母集団、測定システムを標準化する
  • 過去データの対象期間と類似工程を定義し、事前分布の根拠を記録する
  • 検査の独立性、品種構成、設備・作業班・材料ロットによる異質性を確認する
  • 事前分布を変えた感度分析と、時系列の外部検証を実施する
  • 「基準超過確率が何%以上なら何をするか」を損失と責任者を含めて決める
  • データ更新、再計算、承認、版管理、監査ログを業務フローに組み込む
  • 検査員・測定器の誤判定が無視できない場合は観測モデルに含める

まとめ

No.041〜050では、Beta-Binomialモデルを用いて、不良率の代表値から信用区間、基準超過確率、ライン差、次ロット予測、予測チェック、報告までを実装しました。ベイズ推定の価値は「不良率は1.8%」と断言することではなく、「どの程度不確かで、どの行動がどれだけ妥当か」を共通言語にできる点にあります。

本例は単純化した出発点です。実務では日・設備・品種・材料ロットなどの階層性、時間変化、検査誤差、意思決定コストを組み込むことで、現場の判断に耐える仕組みに発展させます。

法人向けのご相談

数理工房では、製造業の品質データを対象としたベイズモデル設計、PoC、既存KPIとの接続、現場向け研修、定期レポート・ダッシュボード実装までご支援します。データ量が少ない、工程ごとの差が大きい、閾値判断を説明可能にしたい、といった段階からご相談いただけます。

📩 お問い合わせ: surikobo.co.jp/contact まずはお気軽にご相談ください。