この記事でわかること
- pandasで群ごとの平均と範囲をまとめて求める手順
- 係数A2・D3・D4を使った管理限界の計算をPythonで書く方法
- matplotlibでX-R管理図を描き、異常を判定するまでの流れ
📌 前提知識:管理図(X-R管理図)の作り方と見方を読んでいると理解しやすくなります
毎日5個ずつ軸径を測っている工程で、月末に管理図をまとめて描き直す。この作業をExcelでやると、群ごとの平均と範囲を計算して、係数表を引いて、グラフの体裁を整えて……と、毎月同じ手順の繰り返しです。
管理図は手順が完全に決まっているため、Pythonに置き換えたときの効果が出やすい作業です。この記事では、軸径の測定データを例にX-R管理図をPythonで作る手順を整理します。
Pythonで管理図を作る場面
Pythonが向くのは、次のような場面です。
- 毎月・毎週など決まった周期で管理図を更新するとき
- 複数の工程や特性について同じ管理図を並行して作るとき
- 測定データが自動で蓄積され、そこから直接作図したいとき
NG例(△): 管理図を一度きり手作業で描くだけなら、Excelのほうが早く終わります。手順は管理図(X-R管理図)の作り方と見方で解説しています。またPythonに置き換える場合も、最初の1回はExcelと結果を突き合わせて一致を確認してから移行するほうが安全です。
使うライブラリと役割
- pandas:測定データの読み込みと、群ごとの平均・範囲の集計
- matplotlib:管理図の描画
管理図の計算は四則演算と係数表の参照だけで済むため、scipyのような統計ライブラリは必要ありません。係数A2・D3・D4はコードに直接書くのが実務的です。
例題|軸径の測定データ
ある旋盤工程で、軸径(mm)を1日5個ずつ、5日間測定したデータです。規格は10.00±0.10mmとします。
| 群 | 測定値(5個) |
|---|---|
| 1 | 10.02, 10.05, 9.98, 10.01, 10.04 |
| 2 | 9.99, 10.03, 10.01, 9.97, 10.00 |
| 3 | 10.04, 10.06, 10.02, 10.05, 10.03 |
| 4 | 9.96, 10.00, 9.98, 10.02, 9.99 |
| 5 | 10.01, 10.02, 10.00, 10.03, 9.99 |
import pandas as pd
import matplotlib.pyplot as plt
data = [
[10.02, 10.05, 9.98, 10.01, 10.04],
[9.99, 10.03, 10.01, 9.97, 10.00],
[10.04, 10.06, 10.02, 10.05, 10.03],
[9.96, 10.00, 9.98, 10.02, 9.99],
[10.01, 10.02, 10.00, 10.03, 9.99],
]
df = pd.DataFrame(data)
群ごとの平均と範囲を求める
各群の平均 x̄ と範囲 R(最大値−最小値)を計算します。pandasなら軸を指定するだけで全群まとめて求まります。
df["xbar"] = df.mean(axis=1)
df["R"] = df.max(axis=1) - df.min(axis=1)
print(df[["xbar", "R"]])
結果は次のとおりです。
| 群 | 平均 x̄ | 範囲 R |
|---|---|---|
| 1 | 10.020 | 0.07 |
| 2 | 10.000 | 0.06 |
| 3 | 10.040 | 0.04 |
| 4 | 9.990 | 0.06 |
| 5 | 10.010 | 0.04 |
この平均の平均(総平均)と、範囲の平均を求めます。
xbb = df["xbar"].mean() # 10.012
rbar = df["R"].mean() # 0.054
総平均 x̄̄ = 10.012mm、範囲の平均 R̄ = 0.054mm です。
管理限界を計算する
X管理図の管理限界は、総平均から R̄ に係数A2を掛けた分だけ上下に取ります。
\[UCL_{\bar{x}} = \bar{\bar{x}} + A_2 \bar{R}, \quad LCL_{\bar{x}} = \bar{\bar{x}} – A_2 \bar{R}\]
R管理図はR̄に係数D4・D3を掛けます。
\[UCL_R = D_4 \bar{R}, \quad LCL_R = D_3 \bar{R}\]
係数は群の大きさnで決まります。今回はn=5なので A2=0.577、D4=2.114、D3=0(n=6以下ではLCLを考えない)です。Pythonでは辞書に持たせておくと、nが変わっても対応できます。
A2 = {2:1.880, 3:1.023, 4:0.729, 5:0.577, 6:0.483}
D4 = {2:3.267, 3:2.575, 4:2.282, 5:2.114, 6:2.004}
D3 = {2:0, 3:0, 4:0, 5:0, 6:0}
n = df.shape[1] - 2 # 集計列2つを除く
x_ucl = xbb + A2[n] * rbar
x_lcl = xbb - A2[n] * rbar
r_ucl = D4[n] * rbar
r_lcl = D3[n] * rbar
実際の数値を入れると次のとおりです。
\[UCL_{\bar{x}} = 10.012 + 0.577 \times 0.054 \approx 10.043\]
\[LCL_{\bar{x}} = 10.012 – 0.577 \times 0.054 \approx 9.981\]
\[UCL_R = 2.114 \times 0.054 \approx 0.114\]
まとめると、X管理図は中心線10.012・上限10.043・下限9.981、R管理図は中心線0.054・上限0.114・下限なしです。
管理図を描く
上下2段に並べて描きます。管理限界は破線、中心線は実線にすると見分けやすくなります。
fig, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
ax[0].plot(df.index + 1, df["xbar"], marker="o")
ax[0].axhline(xbb, color="green")
ax[0].axhline(x_ucl, color="red", linestyle="--")
ax[0].axhline(x_lcl, color="red", linestyle="--")
ax[0].set_ylabel("xbar")
ax[1].plot(df.index + 1, df["R"], marker="o")
ax[1].axhline(rbar, color="green")
ax[1].axhline(r_ucl, color="red", linestyle="--")
ax[1].set_ylabel("R")
ax[1].set_xlabel("subgroup")
plt.show()
今回のデータでは、5つの群の平均(10.020/10.000/10.040/9.990/10.010)がいずれも9.981〜10.043の範囲に収まっています。範囲も0.114を超えた群はありません。この工程は安定した状態にあると判断できます。
異常判定を自動化する
限界を外れた点を目視で探すのは、群の数が増えると見落としのもとです。判定もコードに任せます。
out = df[(df["xbar"] > x_ucl) | (df["xbar"] < x_lcl)]
print(out)
ただし管理限界を外れた点だけが異常ではありません。連続して中心線の片側に並ぶ、上昇や下降が続くといったパターンも工程の変化を示します。判定ルールの全体像は管理図の異常判定ルール|Western Electric Rulesの読み方で解説しています。
また、管理限界と規格限界は別物です。管理限界は工程自身のばらつきから計算した線で、規格限界は顧客や図面が決めた線です。混同すると判断を誤ります。実際に限界を外れたときの処置は管理限界を超えたときの対応手順にまとめています。
よくある質問
Q. 係数A2・D3・D4はライブラリに入っていませんか?
標準的なライブラリには含まれていません。JIS等の係数表から必要なnの分だけ辞書に書き写すのが実務的です。扱う群の大きさは固定していることが多いため、数行で足ります。
Q. 群の大きさが揃っていない場合はどうしますか?
X-R管理図は群の大きさが一定であることを前提としています。揃わない場合は、そもそも群の取り方を見直すのが先です。どうしても揃わない工程では、群の大きさが大きいときに使うX-s管理図の利用を検討します。どの管理図を選ぶかは管理図の選び方で整理しています。
Q. 計算した管理限界はいつまで使えますか?
工程に変更がない限り、その限界を使い続けます。設備の更新や材料の変更があったときは、新しい条件でデータを取り直して再計算します。毎回引き直すと、工程の変化そのものが見えなくなります。
管理図のコードを生成AIに書かせる場合は、この記事の値と突き合わせて確認してください。依頼のしかたと検証手順はAIにPythonコードを書かせる|統計解析での検証手順で扱っています。
まとめ
- 群ごとの平均と範囲は
df.mean(axis=1)とdf.max(axis=1) - df.min(axis=1)で一括計算できる - 管理限界は x̄̄ ± A2·R̄ と D4·R̄。係数は群の大きさnで決まるので辞書に持たせる
- 今回の例(n=5・5群)は X管理図 9.981〜10.043、R管理図 上限0.114で、すべて範囲内=安定状態
- 管理限界を外れた点だけでなく、連や傾向のパターンも判定に含める
- 管理限界と規格限界は別物。混同しない
一度きりならExcel、周期的に更新するならPython、という使い分けです。工程が安定していることを確認できたら、次は規格に対してどれだけ余裕があるかを見る段階で、Pythonで工程能力指数|Cp・Cpkの計算手順に進みます。なお、管理図と工程能力指数はQC検定2級の手法編で頻出の分野でもあります。試験対策も兼ねて体系的に学びたい方はQC検定2級 手法編の攻略ロードマップを参照してください。さらに体系的に学びたい方向けに、レベル別のおすすめ書籍を統計学・実験計画法のおすすめ本まとめで紹介しています。


