---
title: "統計的工程管理（SPC）の実装手順：管理図の自動生成・Cpk・WECOルールの異常判定をPythonで組む"
url: "https://www.issoh.co.jp/tech/details/18917/"
published: 2026-10-26
updated: 2026-10-26
categories: ["業務システム"]
publisher: "株式会社一創"
---

# 統計的工程管理（SPC）の実装手順：管理図の自動生成・Cpk・WECOルールの異常判定をPythonで組む

統計的工程管理（SPC）は、工程から取った測定値を管理図に打ち、偶然のばらつきと異常原因によるばらつきを見分けて手を打つための仕組みです。紙やExcelで回している工場がシステム化するとき、詰まるのはグラフの描画ではありません。サブグループの切り方、管理限界をいつ固定していつ引き直すか、工程能力指数Cpkに使うσの取り方、異常判定ルールをどこまで入れるか、の4つです。この記事では、検査・設備データの収集経路とテーブル設計から、Xbar-R管理図とCpkの計算、WECOルールによる異常判定までを、NumPyだけで動くPythonコードで示します。最後に、市販のSPCツールで足りる工程と、MESや生産管理と連携した自社開発に切り替える条件を言い切ります。

## まとめ：SPCをシステム化する前に決める四つの設計と自社開発を見送る条件

統計的工程管理のシステムで先に決めるのは、次の4つです。どれも後から変えるとデータを取り直すことになります。

1. サブグループ：同じ設備・同じ材料ロットで続けて加工した4〜5個を1群とし、群の中に段取り替えやロット切替えを混ぜない。
2. 管理限界の運用：20〜25群のフェーズ1で計算して版として保存し、フェーズ2では固定する。引き直すのは4M変更と是正のときだけ。
3. Cpkのσ：管理図が安定していることを確かめてから、群内σでCpk、全データの標準偏差でPpkを出し、両方を並べて表示する。
4. 判定ルール：3σ逸脱だけでは平均の小さなずれを見逃す。WECOルールを足すと誤報が約4倍に増えるので、ルールごとに通知先を分ける。

導入方法を判断する目安は次のとおりです。測定が手入力中心で管理特性が十数個までなら、市販のSPCソフトかExcelで足ります。検査機やPLCから値が自動で入り、異常時にロット保留や出荷停止までつなげたい工程は、MES・生産管理と一体で作るほうが手戻りは少なくなります。

## 統計的工程管理（SPC）の守備範囲と、管理限界と規格限界を分けて持つ前提

### SPCとSQC・全数検査の違い：工程のばらつきを時系列で見張る仕組み

SQC（統計的品質管理）は、品質管理に統計を使う考え方の総称で、抜取検査や実験計画法まで含みます。SPCはそのうち、工程の出力を時間順に測り続け、管理図で工程の状態を判定する部分を指します。全数検査が「できた物の良否」を決めるのに対し、SPCが決めるのは「工程がいつもと違う動きを始めたか」です。不良が出る前に手を打てるのは後者です。

手法の土台はシューハート管理図で、国際規格では[ISO 7870-2:2023（Control charts Part 2: Shewhart control charts）](https://www.iso.org/standard/78859.html)が扱い、国内ではJIS Z 9020-2が同じ範囲を規定しています。QC七つ道具の中での管理図の位置づけは、[QC・QAの役割分担とQC7つ道具](https://www.issoh.co.jp/column/details/15295/)で整理しました。

### 管理限界は工程の実力、規格限界は顧客要求：二本の線を混同する失敗例

管理限界はフェーズ1のデータから計算する線で、工程が普段どれだけばらつくかを表します。規格限界（USL・LSL）は、図面や顧客との取り決めで決まる線です。両者は独立しています。管理限界の中に収まっていても規格外は出ますし、規格内でも管理限界を外れれば工程は変わっています。

システム化で多い失敗は、管理図に規格限界を引き、「規格内だから異常なし」と判定してしまう実装です。これでは不良が出るまで何も鳴りません。管理図には管理限界だけを引き、規格限界は工程能力指数の計算と出荷判定に使う。テーブルも別に持たせます。

## 検査・設備データの収集経路づくり：サブグループ設計とテーブル定義の手順

### 合理的サブグループの切り方：同じ条件で連続4〜5個を一群にする理由

Xbar-R管理図の管理限界は、群の中のばらつき（範囲R）から計算します。群の中に段取り替え前後の製品や別の金型の製品が混ざると、Rが膨らみ、管理限界が広がって異常が見えなくなります。群は「同じ設備・同じ材料ロット・同じ作業者で、続けて加工した物」で作るのが原則です。

群の大きさは4〜5個がよく使われます。[NIST/SEMATECHの統計ハンドブック（6.3.2.1）](https://www.itl.nist.gov/div898/handbook/pmc/section3/pmc321.htm)の係数表もn=2〜10の範囲で、n=5ならA2=0.577、D4=2.115です。群を取る間隔は、工程が変わりうる単位（1時間ごと、ロットごと、シフトごと）に合わせます。管理限界の計算には、一般に20〜25群を集めます。

### データの入口は手入力・測定器・PLCの三系統：時刻とロットの持たせ方

SPCに値が入ってくる経路は、工場ではおおむね次の3つに分かれます。入口ごとに、群へ束ねる方法が違います。

| 入口  | 典型的な対象         | 実装で決めること           |
| --- | -------------- | ------------------ |
| 手入力 | ノギス測定・外観検査     | 群番号の自動採番と入力時刻の記録   |
| 測定器 | デジタルノギス・三次元測定機 | 測定器IDと校正期限の紐づけ     |
| PLC | 荷重・温度・寸法センサ    | 周期値から1個ごとの値を切り出す規則 |

PLCから値を取る方式の選び分けとタグ設計は、[PLCのデータ収集の四方式とタグ設計](https://www.issoh.co.jp/tech/details/16804/)にまとめています。SPC側で要るのは、どの方式でも「製品1個（または1群）に対応する値」「測定時刻」「ロット番号・設備ID」が揃って届くことです。周期収集の生データをそのまま管理図に打つと、群の意味がなくなります。

### 測定値テーブルと管理限界テーブルを分ける設計：版管理で引き直しを追う

テーブルは管理特性・測定値・管理限界の3つに分け、管理限界には版番号・適用開始日時・引き直した理由・承認者を持たせます。PostgreSQLを想定した最小構成は次のとおりです。

```
-- 管理特性：品番×工程×測定項目の組で1行。規格限界はここに持つ
CREATE TABLE characteristic (
  id             serial PRIMARY KEY,
  part_no        text    NOT NULL,
  process_code   text    NOT NULL,
  item_name      text    NOT NULL,
  unit           text    NOT NULL,
  lsl            numeric,
  usl            numeric,
  chart_type     text    NOT NULL CHECK (chart_type IN ('xbar_r', 'imr', 'p')),
  subgroup_size  int     NOT NULL
);

-- 測定値：1行＝1個の値。群番号・測定時刻・ロット・設備・入口を必ず持たせる
CREATE TABLE measurement (
  id                 bigserial   PRIMARY KEY,
  characteristic_id  int         NOT NULL REFERENCES characteristic (id),
  subgroup_no        bigint      NOT NULL,
  measured_at        timestamptz NOT NULL,
  lot_no             text,
  machine_id         text,
  value              numeric(12, 5) NOT NULL,
  source             text        NOT NULL CHECK (source IN ('manual', 'gauge', 'plc'))
);
CREATE INDEX ON measurement (characteristic_id, subgroup_no);

-- 管理限界：版ごとに1行。引き直しても過去の版は消さない
CREATE TABLE control_limit (
  characteristic_id  int         NOT NULL REFERENCES characteristic (id),
  version            int         NOT NULL,
  cl                 numeric     NOT NULL,
  ucl                numeric     NOT NULL,
  lcl                numeric     NOT NULL,
  r_cl               numeric,
  r_ucl              numeric,
  r_lcl              numeric,
  sigma_within       numeric,
  valid_from         timestamptz NOT NULL,
  reason             text        NOT NULL,  -- 初期設定・4M変更・是正後の再計算
  approved_by        text        NOT NULL,
  PRIMARY KEY (characteristic_id, version)
);
```

規格限界は管理特性のマスタ側に置き、管理限界テーブルには入れません。顧客監査では、過去の管理図を当時の限界で描けるかを問われることがあります。valid\_fromで版を引けば、限界を引き直した後でも当時の判定を再現できます。

## 管理図を自動で描く計算処理：Xbar-R・I-MR・p管理図をPythonで組む手順

### Xbar-R管理図の管理限界をA2・D3・D4係数で算出するPythonコード

計算式はNISTのハンドブックどおりで、Xbar管理図は総平均±A2×Rの平均、R管理図は上限D4×Rの平均・下限D3×Rの平均です。次のコードはNumPyだけで動き、フェーズ1の25群×5個から管理限界と工程能力指数を出します。Python 3.14・NumPy 2.5系で実行して出力を確かめました（2026年10月時点）。

```
import numpy as np

# サブグループの大きさ n ごとの係数（A2・D3・D4 は NIST/SEMATECH e-Handbook 6.3.2.1、d2 は R から σ を推定する係数）
A2 = {2: 1.880, 3: 1.023, 4: 0.729, 5: 0.577, 6: 0.483, 7: 0.419, 8: 0.373, 9: 0.337, 10: 0.308}
D3 = {2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0.076, 8: 0.136, 9: 0.184, 10: 0.223}
D4 = {2: 3.267, 3: 2.575, 4: 2.282, 5: 2.115, 6: 2.004, 7: 1.924, 8: 1.864, 9: 1.816, 10: 1.777}
D2 = {2: 1.128, 3: 1.693, 4: 2.059, 5: 2.326, 6: 2.534, 7: 2.704, 8: 2.847, 9: 2.970, 10: 3.078}


def xbar_r_limits(x):
    """x: 行=サブグループ、列=群内の測定値 の2次元配列（フェーズ1のデータ）"""
    n = x.shape[1]
    xbarbar = x.mean(axis=1).mean()
    rbar = (x.max(axis=1) - x.min(axis=1)).mean()
    return {
        "n": n,
        "cl_x": xbarbar, "ucl_x": xbarbar + A2[n] * rbar, "lcl_x": xbarbar - A2[n] * rbar,
        "cl_r": rbar, "ucl_r": D4[n] * rbar, "lcl_r": D3[n] * rbar,
        "sigma_within": rbar / D2[n],
    }


def capability(x, lim, lsl, usl):
    """Cp・Cpk は群内σ、Ppk は全データの標準偏差で計算する"""
    mu, s_w, s_o = x.mean(), lim["sigma_within"], x.std(ddof=1)
    return {
        "Cp": (usl - lsl) / (6 * s_w),
        "Cpk": min(usl - mu, mu - lsl) / (3 * s_w),
        "Ppk": min(usl - mu, mu - lsl) / (3 * s_o),
    }


rng = np.random.default_rng(0)
phase1 = rng.normal(10.00, 0.01, (25, 5))  # フェーズ1：25群×5個
lim = xbar_r_limits(phase1)
print({k: round(float(v), 4) for k, v in lim.items()})
print({k: round(float(v), 2) for k, v in capability(phase1, lim, 9.95, 10.05).items()})
```

出力は、中心線10.0008・上方管理限界10.0136・下方管理限界9.9880、Rの平均0.0222（R管理図の上限0.0469）、群内σ0.0095でした。規格9.95〜10.05に対してCp=1.75、Cpk=1.72、Ppk=1.72です。乱数のシードを固定しているので、同じ値を再現できます。

### 1個ずつしか測れない工程のI-MR管理図と、不良率を見るp管理図の式

バッチ品の成分値や1日1回の測定のように群を作れない特性は、個々の値と移動範囲で見るI-MR管理図を使います。[NISTの個別値管理図の解説（6.3.2.2）](https://www.itl.nist.gov/div898/handbook/pmc/section3/pmc322.htm)では、管理限界を平均±3×（移動範囲の平均÷1.128）としており、1.128はn=2のときのd2です。

外観検査の良否のように数える特性はp管理図です。[NISTのp管理図の解説（6.3.3.2）](https://www.itl.nist.gov/div898/handbook/pmc/section3/pmc332.htm)は、平均不良率をpとして限界をp±3×√(p×(1−p)÷n)で示しています。この式は群の大きさnが一定の前提です。日によって検査数が変わるラインでは、群ごとのnで限界を計算する実装にし、下限がマイナスになったら0で打ち切ります。

### フェーズ1で限界を確定し、フェーズ2では固定する引き直しの運用ルール

管理限界を毎回最新データで計算し直す実装は誤りです。工程がゆっくりずれると限界も一緒に動き、ずれがいつまでも検出されません。フェーズ1で20〜25群を集め、限界外の群があれば原因を調べて除いてから再計算し、その値を版として固定します。以後のフェーズ2は、固定値で新しい点を判定するだけです。

引き直してよいのは、4M（人・機械・材料・方法）の変更が記録されたときと、是正処置で工程を意図的に改善したときに限ります。どちらの場合も、管理限界テーブルのreasonに記録を残す運用です。品質保証の承認を通してから新しい版を有効にする画面にしておけば、現場の判断で限界を広げる運用を防げます。

## 工程能力指数Cp・Cpkの算出手順：σの推定方法と正規性の確認で値が変わる箇所

### 群内σで出すCpkと全体の標準偏差で出すPpk：二つを並べて表示する理由

[NISTの工程能力の解説（6.1.6）](https://www.itl.nist.gov/div898/handbook/pmc/section1/pmc16.htm)の定義は、Cp=(USL−LSL)÷6σ、Cpk=min(USL−μ, μ−LSL)÷3σです。同じページの表では、分布が中心に寄った工程でCp=1.00なら規格外0.27%、1.33なら64ppm、1.66なら0.6ppmになります。

実装で値が割れるのはσの取り方です。前のコードでは、Cpkに群内σ（Rの平均÷d2）を、Ppkに全データの標準偏差を使いました。工程が安定していれば両者はほぼ一致し、例でもどちらも1.72でした。群と群の間で平均が動く工程では、Ppkだけが下がります。Cpk 1.5に対してPpk 1.0のように差が開いたら、群の中は良いが群の間で何かが変わっている、という読み方になります。片方しか出さないシステムでは、この診断ができません。

1.33を目安にした判定と、検査工程の中での使い方は[製造業の品質管理での工程能力指数の判定手順](https://www.issoh.co.jp/column/details/15705/)で解説しています。

### 100点未満のデータや歪んだ分布ではCpkを出さない：計算前に通す二つの関門

同じNISTのページは、Cp・Cpk・Cpmが母集団の正規分布を前提にすること、工程能力の評価には一般に100点以上が要ることを明記しています。システムでは計算の前に関門を2つ置きます。

1. 管理図に限界外の点や8点連続の片寄りがないこと。安定していない工程のCpkは、翌週には別の値になります。
2. データが100点以上あり、ヒストグラムや正規性の検定で大きな歪みがないこと。真円度や平面度のように0が下限の特性は片側に偏りやすく、NISTはBox-Cox変換か、ノンパラメトリックな指数（Cnpkなど）を示しています。

関門を通らないときは、Cpkの欄を空けて理由を表示します。数字が出ていると、顧客への提出資料にそのまま貼られるからです。

## 異常判定ルールとアラート連携の実装：WECOルールの判定コードと誤報の抑え方

### 3σ逸脱と8点連続の片寄りをコード化する：ルールを足すと誤報は約4倍

[NISTの計量値管理図の解説（6.3.2）](https://www.itl.nist.gov/div898/handbook/pmc/section3/pmc32.htm)は、Western Electric（WECO）ルールとして、3σ外の1点、直近3点中2点が2σ外、直近5点中4点が1σ外、中心線の片側に8点連続などを挙げています。次のコードは前のコードに続けて実行し、Xbar管理図の点列に4つのルールを当てます。

```
def weco(xbar, lim):
    """Xbar 管理図の点列に WECO ルールを当て、(群番号, ルール) の一覧を返す"""
    s = (lim["ucl_x"] - lim["cl_x"]) / 3  # 群平均の標準偏差
    z = (np.asarray(xbar) - lim["cl_x"]) / s
    hits = []
    for i in range(len(z)):
        if abs(z[i]) > 3:
            hits.append((i, "R1 3σ外"))
        for side in (1, -1):
            w3 = side * z[max(0, i - 2):i + 1]
            w5 = side * z[max(0, i - 4):i + 1]
            w8 = side * z[max(0, i - 7):i + 1]
            if len(w3) == 3 and (w3 > 2).sum() >= 2:
                hits.append((i, "R2 3点中2点が2σ外"))
            if len(w5) == 5 and (w5 > 1).sum() >= 4:
                hits.append((i, "R3 5点中4点が1σ外"))
            if len(w8) == 8 and (w8 > 0).all():
                hits.append((i, "R4 8点連続で片側"))
    return hits


# フェーズ2：管理限界は固定したまま。11群目（番号10）以降で平均が 0.007 ずれる
phase2 = np.vstack([rng.normal(10.00, 0.01, (10, 5)), rng.normal(10.007, 0.01, (10, 5))])
first = {}
for i, rule in weco(phase2.mean(axis=1), lim):
    first.setdefault(rule, i)  # ルールごとに最初に検出した群番号
print(first)
```

例では11群目から平均を0.007ずらしました。群平均の標準偏差の約1.6倍です。3σ外のルール1は20群目まで一度も鳴りませんでした。8点連続のルール4が15群目で、ルール2とルール3が19群目で検出しています。小さな平均のずれは、3σの判定だけでは拾えません。

代償は誤報です。同じページの試算では、3σの判定だけなら平均371点に1回だった誤報が、WECOルールを足すと約92点に1回に増えます。

### アラートの届け先をルールで分ける：設備停止・ロット保留・記録の振り分け

全ルールで同じ通知を飛ばすと、1日数回の誤報で現場は通知を見なくなります。ルール1とR管理図の上限超えは、ばらつきの急変です。班長への即時通知とロット保留にします。ルール2〜4は平均のゆっくりしたずれなので、即時停止ではなく、品質保証の日次レビューに載せて原因を調べる扱いで足ります。

設備を自動で止める連携まで入れるのは、ルール1が鳴った時点で次の加工を止めないと不良が積み上がる工程（高速プレスや射出成形など）に限ります。停止信号をPLCへ返すかどうかを決める基準は、誤報1回のライン停止コストと、見逃し1回の不良コストの比較です。管理図の外側で多変量や季節性のある信号を見張る方法は、[時系列データの異常検知のしきい値とアラート運用](https://www.issoh.co.jp/tech/details/16860/)で扱っています。

## SPCを自社開発すべき工程と市販ツール・Excelで足りる工程を分ける判断条件

### 市販SPCソフトやExcelで足りる工程：測定は手入力、特性は十数個まで

測定が手入力中心で、管理特性が十数個まで、異常時の処置が「記録して班長に知らせる」で済む工程は、自社開発する理由がありません。Excelでも管理限界の固定とルール1・ルール4くらいは組めます。市販のSPCソフトなら、管理図の種類と工程能力の帳票は揃っています。ここに開発費を入れるのは過剰です。

見送る前に確かめるのは、管理限界の版管理ができるかどうかです。限界を毎回再計算するExcelシートは、フェーズ2の章で述べたずれの見逃しを起こします。限界をセルに固定値で入れ、変更履歴を別シートに残す運用ができるなら、Excelのまま続けて構いません。

### 自社開発に切り替える条件：検査機・PLCの自動収集とロット保留の連動

切り替えるのは、次のどれかに当てはまる工程です。1つでも当てはまれば、単体のSPCソフトでは運用が回らなくなります。

- 検査機やPLCから1日数千点以上の値が自動で入り、手で転記できない
- 異常時のロット保留・出荷停止を、MESや生産管理の在庫に反映させたい
- 品番・工程ごとに管理特性が数百あり、限界の引き直しに承認フローが要る
- 顧客監査で、過去の管理図を当時の管理限界で再現して見せる必要がある

この場合、SPCは単体ソフトではなく製造実行の一機能として作るほうが整合が取れます。MESの中での品質データの持ち方は[MESシステムの11機能の実装要件](https://www.issoh.co.jp/tech/details/16796/)、工程管理システム全体の機能と既製か自作かの判断は[工程管理システムの機能と選び方](https://www.issoh.co.jp/column/details/15402/)にまとめました。一創では、検査データの収集からロット保留の連動までを、既存の生産管理・MESとつなぐ[生産管理システム開発](https://www.issoh.co.jp/service/business%5Fsystem/production-management/)として相談を受け付けています。

## 統計的工程管理（SPC）の実装でよくある質問：管理限界・工程能力の判断基準

統計的工程管理をシステムに組み込むときに、設計の場でよく出る質問に答えます。

### 統計的工程管理（SPC）とSQCは何が違いますか？

SQCは品質管理に統計を使う手法の総称で、抜取検査・実験計画法・回帰分析なども含みます。SPCはその中で、工程の出力を時間順に測って管理図で監視し、異常原因を見つけて取り除く部分です。システムで言えば、SQCは分析の道具箱、SPCは毎日の監視と通知の仕組みにあたります。開発の対象になるのは主にSPCの側で、収集・管理限界の版管理・判定・通知を作ることになります。

### 管理図は何群のデータがあれば作り始められますか？

管理限界の計算には、一般に20〜25群を集めます。n=5の群なら100〜125個の測定値です。それより少ない段階で限界を出す場合は、暫定の版として登録し、25群に達した時点で引き直す運用にします。工程能力指数は、NISTのハンドブックが一般に100点以上を求めているので、管理図の運用開始とCpkの表示開始は時期をずらして構いません。

### Cpkはどのくらいあれば合格と判断できますか？

国内の製造業では1.33以上を目安にすることが多く、NISTの表では中心に寄った工程でCp=1.33のとき規格外は64ppmです。ただし合格の線は、顧客との品質取り決めで決まります。自動車部品のように取引先が別の値を指定する場合は、その値を管理特性のマスタに持たせ、品番ごとに判定を変えられる設計にしておくと後で困りません。

### 管理限界を外れた点が出たら、限界を広げてもよいですか？

広げてはいけません。限界外の点は、工程に異常原因が入ったという信号です。まず原因を調べ、材料や設備の変化が見つかれば是正します。限界を引き直してよいのは、4M変更の記録があるときと、是正で工程を意図的に変えたときだけです。システムでは、限界の変更に理由と承認者の入力を必須にし、現場の判断だけで広げられないようにします。

### 統計的工程管理のシステムはPythonだけで作れますか？

計算部分はNumPyで足ります。管理限界・Cpk・WECOルールは、この記事のコードの規模で書けます。開発の手間がかかるのは計算の外側で、検査機やPLCからの収集、群への束ね方、管理限界の版管理と承認、通知の振り分け、管理図の画面です。画面はBIツールやWebアプリで作り、計算はバッチかAPIとして切り出す構成が保守しやすくなります。

## 関連記事

- [生産管理と工程管理の違い｜包含関係とERP・MES・スケジューラの守備範囲](https://www.issoh.co.jp/column/details/17030/)：SPCを載せる先のシステムの守備範囲
- [製造業のデータ連携｜設備・MES・基幹の階層別インタフェース設計と段階導入](https://www.issoh.co.jp/column/details/16922/)：測定値を設備からMES・基幹へ流すインタフェース設計
- [品質管理システムとは？機能・種類と選び方、パッケージ導入か自社開発かの判断まで解説](https://www.issoh.co.jp/column/details/15702/)：SPCを含む品質管理システム全体の選び方
- [異常検知とは？機械学習の手法と仕組み・製造業での使いどころと導入判断](https://www.issoh.co.jp/column/details/15436/)：管理図で拾えない異常を機械学習で見るときの判断
- [システム開発の品質管理とは？工程別レビュー・テスト管理とメトリクス判定の手順](https://www.issoh.co.jp/tech/details/15319/)：ソフトウェア開発のメトリクスに管理図の考え方を当てる場合

---

出典: [統計的工程管理（SPC）の実装手順：管理図の自動生成・Cpk・WECOルールの異常判定をPythonで組む](<https://www.issoh.co.jp/tech/details/18917/>)（株式会社一創）
