品質管理

Pythonで品質管理の作図|ヒストグラムとパレート図

記事内に広告が含まれています。

この記事でわかること

  • 規格線を引いたヒストグラムの描き方と階級数の決め方
  • 累積比率を重ねたパレート図の作り方
  • 複数ラインを箱ひげ図で並べて比べる手順
  • 日本語が文字化けするときの対処

📌 前提知識:Python統計解析入門|Excelとの使い分けと学び方でライブラリの役割分担を押さえておくと読みやすくなります

毎月の品質会議に向けて、同じ形のグラフを作り直す。先月のExcelファイルを開いてデータを差し替え、グラフの範囲を選び直し、規格線を引き直す。この作業に毎回1時間かけている、という現場は珍しくありません。

作図はPythonに移して効果が出やすい作業です。一度コードを書いてしまえば、翌月はデータを差し替えて実行するだけで同じ図が出ます。この記事では、品質管理でよく使う3つの図を描く手順を、実際の測定データつきで整理します。

Pythonで作図する場面

移す価値があるのは、次のような場面です。

  • 同じ図を繰り返し作るとき:月次報告、ロットごとの集計。回数が多いほど元が取れる
  • 図の数が多いとき:工程別・品番別に何十枚も必要な場合、ループで一気に出せる
  • 体裁を毎回そろえたいとき:軸の範囲や色を固定でき、担当者が変わっても同じ図になる

逆に、次の場合は無理に移す必要がありません。

NG例(△): 1回きりの図をPythonで描くのは遠回りです。会議で1枚だけ見せる図なら、Excelで選択して挿入したほうが早く終わります。Pythonが効くのは繰り返しがある場合だけです。

もうひとつのNG例が、見た目を細かく調整しようとすることです。凡例の位置や色をコードで詰めていくと、Excelで手作業する以上に時間がかかります。細かい体裁は割り切って、中身が正しく描けているかに集中するほうが実務では合理的です。

準備|ライブラリと日本語の設定

使うのは2つです。データの整形にpandas、作図にmatplotlibを使います。

import pandas as pd
import matplotlib.pyplot as plt

ここで先に片付けておきたいのが日本語です。初期設定のままだと、軸ラベルや凡例の日本語が四角い記号の羅列に変わります。文字が消えたように見えるため壊れたと勘違いしがちですが、日本語を表示できるフォントが選ばれていないだけです。

対処は、日本語を含むフォントを指定することです。

plt.rcParams["font.family"] = "Meiryo"   # 環境にあるフォント名を指定する

指定できるフォント名は環境によって違います。Windowsなら游ゴシックやメイリオ、macOSならヒラギノ系が入っていることが多く、手元で使えるフォントを一度調べて決めておくと以後は使い回せます。どうしても解決しない場合は、軸ラベルを英語にしてしまうのも現実的な逃げ方です。

毎月のExcelファイルを読み込む

データの取り込みはpandasの1行です。

df = pd.read_excel("2026-08_測定データ.xlsx", sheet_name="軸径")
x = df["測定値"].dropna()

CSVならpd.read_csvに変わるだけです。dropna()は空欄を除きます。翌月に差し替えるのはファイル名だけで、以降のコードは触りません。ここがExcelで毎回グラフを作り直す作業との分かれ目です。

ヒストグラム|規格線を引いて工程を見る

品質管理のヒストグラムは、規格線を一緒に引いて初めて意味を持ちます。分布の形だけを見ても、それが良いのか悪いのか判断できないためです。

データはPythonで工程能力指数|Cp・Cpkの計算手順で使っている旋盤工程の軸径25個を使います。規格は10.00±0.10mm(下限9.90/上限10.10)です。

x = [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]

USL, LSL = 10.10, 9.90

階級数をいくつにするか

階級数を決めずに描くと、既定の設定で分割されます。山が2つに見えたり、逆に平らに見えたりと、階級数しだいで印象が変わるので、根拠のある数を決めておきます。目安になるのがスタージェスの公式です。

\[ k = 1 + \log_2 n \]

ExcelではLOG関数の第2引数に2を指定します。

=1+LOG(25,2)        ← 5.6439

n=25なら 1 + log₂25 = 5.644 です。切り上げて6階級とします。範囲が9.96から10.06までの0.10なので、階級幅はおよそ0.017です。

fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(x, bins=6, edgecolor="black")

ax.axvline(USL, color="red", linestyle="--", label="USL")
ax.axvline(LSL, color="red", linestyle="--", label="LSL")

ax.set_xlabel("軸径 (mm)")
ax.set_ylabel("度数")
ax.legend()
plt.tight_layout()
plt.savefig("histogram.png", dpi=150)

axvlineが縦線を引く関数です。規格線を引くと、分布が規格の中に収まっているか、どちらかに寄っていないかが一目で分かります。

この工程の場合、分布は規格の内側に収まっていますが中心がやや上側に寄っています。数値で確かめるならCpとCpkを比べます。Cpは大きいのにCpkが小さい場合、中心がずれているという読み方です。判断の基準は工程能力指数の目安一覧|Cp1.33が合格基準とされる根拠にまとめました。Excelで同じ図を作る手順はヒストグラムを作るやり方です。

パレート図|累積比率で重点を決める

パレート図は、不良項目を件数の多い順に並べ、累積比率の折れ線を重ねた図です。どこから手を付けるかを決めるための図で、QC7つ道具のひとつです。

ある月の外観不良の内訳を例にします。

不良項目 件数 累積比率
キズ 45 45.0%
寸法不良 28 73.0%
バリ 15 88.0%
変色 8 96.0%
その他 4 100.0%

累積比率は、上から順に足した件数を全体で割ったものです。

\[ \text{累積比率} = \frac{\text{その項目までの累計件数}}{\text{総件数}} \]

Excelなら、開始セルだけを絶対参照にして下へコピーします。

=SUM($B$2:B2)/SUM($B$2:$B$6)

Pythonではcumsumで累計を出します。

df = pd.DataFrame({
    "item": ["キズ", "寸法不良", "バリ", "変色", "その他"],
    "count": [45, 28, 15, 8, 4],
})

df = df.sort_values("count", ascending=False)
df["cum_pct"] = df["count"].cumsum() / df["count"].sum() * 100

fig, ax1 = plt.subplots(figsize=(7, 4))
ax1.bar(df["item"], df["count"])
ax1.set_ylabel("件数")

ax2 = ax1.twinx()
ax2.plot(df["item"], df["cum_pct"], marker="o", color="red")
ax2.set_ylabel("累積比率 (%)")
ax2.set_ylim(0, 105)

plt.tight_layout()
plt.savefig("pareto.png", dpi=150)

要点は2つです。sort_valuesで降順に並べ替えてから累積を計算すること、そしてtwinxで右側にもう1本の軸を作ることです。並べ替えを忘れると、件数の少ない項目が先に来て、折れ線の立ち上がりが緩やかになります。累積比率そのものは並び順によらず単調に増えるため、一見それらしい図が出てしまうのが厄介なところです。パレート図の値打ちは「最初の数項目で一気に上がる」形にあるので、並べ替えを飛ばすとその形が失われます。

この例では、上位2項目で73%を占めています。キズと寸法不良に絞って原因を追えば、大半の不良に手が届く計算です。原因の掘り下げはなぜなぜ分析のやり方|5回のなぜで真因にたどり着く手順へ進みます。Excelでの作り方はパレート図の作り方、QC7つ道具全体の位置づけはQC7つ道具の使い方と選び方|製造業向け解説で扱っています。

箱ひげ図|3つのラインを並べて比べる

箱ひげ図は、複数の群を横に並べて、中心とばらつきを同時に比べるときに使います。ヒストグラムを3枚並べるより、違いがはっきり出ます。

同じ製品を作っている3ラインから7個ずつ測ったとします。

data = {
    "A": [10.02, 10.05, 9.98, 10.01, 10.04, 10.00, 10.03],
    "B": [9.94, 9.97, 9.99, 9.95, 9.98, 9.96, 9.93],
    "C": [10.01, 10.08, 9.95, 10.06, 9.99, 10.10, 9.97],
}

fig, ax = plt.subplots(figsize=(7, 4))
ax.boxplot(data.values())
ax.set_xticklabels(data.keys())
ax.axhline(10.10, color="red", linestyle="--")
ax.axhline(9.90, color="red", linestyle="--")
ax.set_ylabel("軸径 (mm)")
plt.tight_layout()
plt.savefig("boxplot.png", dpi=150)

箱の上下は第3四分位数と第1四分位数で、その差が四分位範囲です。ExcelではQUARTILE.INC関数が対応します。

=QUARTILE.INC(範囲, 1)    ← 第1四分位数
=QUARTILE.INC(範囲, 3)    ← 第3四分位数

3ラインの値は次のとおりです。

ライン 中央値 四分位範囲
A 10.020 0.030
B 9.960 0.030
C 10.010 0.090

読み取れることが2つあります。Bは中心が下にずれています。ばらつきの大きさはAと同じ0.030ですが、狙い値の10.00より低いところで安定しています。この場合は設定を調整すれば改善します。

一方Cは中心は合っているのに、ばらつきがAの3倍です。中心の調整では直らず、ばらつきの原因を探す必要があります。同じ「規格内に入っている」でも、打つ手がまったく違うということです。この違いはCpとCpkの関係そのもので、工程能力指数(Cp・Cpk)の計算とExcelでの求め方で数値として扱えます。

時間の経過とともに変化を追う場合は箱ひげ図ではなく管理図です。Pythonで管理図を作る|X-R管理図の手順で扱っています。Excelでの箱ひげ図は箱ひげ図の作り方です。

工程別に何十枚もまとめて出す

ここまでは1枚ずつ描いてきました。Pythonに移す価値がいちばん出るのは、これをまとめて回すときです。作図を関数にしてループで呼びます。

def save_histogram(x, title, filename):
    fig, ax = plt.subplots(figsize=(7, 4))
    ax.hist(x, bins=6, edgecolor="black")
    ax.axvline(USL, color="red", linestyle="--")
    ax.axvline(LSL, color="red", linestyle="--")
    ax.set_title(title)
    ax.set_xlabel("軸径 (mm)")
    ax.set_ylabel("度数")
    plt.tight_layout()
    plt.savefig(filename, dpi=150)
    plt.close(fig)          # 閉じないとメモリに残り続ける

# 品番ごとにまとめて出力
for name, values in datasets.items():
    save_histogram(values, f"{name} 軸径分布", f"hist_{name}.png")

体裁の指定を関数の中に集めておくのがポイントです。色や軸ラベルを直したくなったら1か所を直すだけで、出力した全部の図に反映されます。担当者が変わっても図の見た目が揃うのは、この構造があるからです。

品番が30あれば30枚が数秒で出ます。ここまで来ると、Excelで1枚ずつ作り直す作業とは別物になります。

つまずきやすい点

  • 図が表示されない:スクリプトとして実行する場合、plt.show()を呼ばないと画面に出ません。ファイルに保存するだけならsavefigだけで足ります
  • 大量に描くと警告が出るplt.subplots()で作った図は閉じるまでメモリに残ります。20枚を超えると警告が出るので、保存したらplt.close(fig)で閉じます
  • 保存した画像の余白が切れるtight_layout()を呼ぶと軸ラベルの見切れが減ります

2つ目は、工程別に何十枚も出すときに必ず当たります。最初の1枚は正しく、2枚目以降がおかしいという症状が出たら、これを疑ってください。

生成AIにこうしたコードを書かせる場合も、出てきた図が意図どおりかは自分で確認します。手順はAIにPythonコードを書かせる|統計解析での検証手順にまとめました。

よくある質問(FAQ)

Q. 散布図はこの記事で扱っていないのですか?

散布図は相関の記事で扱っています。2変数の関係を見る図なので、相関係数の計算と一緒に理解したほうが実務で使いやすいためです。Pythonで相関分析|相関係数と散布図の求め方をご覧ください。

Q. 階級数はスタージェスの公式で決めれば間違いないですか?

目安であって決まりではありません。データ数が非常に多い場合、この公式では階級数が少なくなりすぎることが知られています。まず公式で出した数で描き、山が潰れて見えるなら増やす、粗く見えるなら減らす、という調整で構いません。大事なのは、なぜその階級数にしたかを説明できることです。

Q. 図の体裁を会社の様式に合わせたいのですが

色や線の太さは指定できますが、細かく詰めると時間がかかります。現実的なのは、体裁の設定を1か所にまとめて関数にしておくことです。一度作れば以後の図はそれを呼ぶだけになり、担当者が変わっても同じ体裁を保てます。

Q. ExcelとPythonで同じ図になりますか?

ヒストグラムは階級の区切り方が違うと形が変わるため、完全に同じにはなりません。箱ひげ図については、ExcelのQUARTILE.INCとmatplotlibの既定はどちらも同じ線形補間で四分位数を出すため、通常は一致します。ただし四分位数の求め方には他の流儀もあり、QUARTILE.EXCを使うと値が変わります。報告で両方を並べる場合は、どちらの計算方法かをそろえてください

まとめ

  • 作図をPythonに移す価値があるのは、繰り返しがある場合だけ。1回きりならExcelが早い
  • ヒストグラムは規格線を一緒に引く。階級数はスタージェスの公式(n=25なら6階級)を目安にする
  • パレート図は降順に並べ替えてから累積を計算する。この例では上位2項目で73%
  • 箱ひげ図は中心のずれとばらつきの大きさを同時に見られる。同じ規格内でも打つ手が変わる
  • 日本語が四角い記号になるのはフォント未設定が原因。壊れているわけではない

繰り返す図はコードにして、1回きりの図はExcelで、という使い分けです。工程能力を数値でも押さえたい場合はPythonで工程能力指数|Cp・Cpkの計算手順、時間変化を追いたい場合はPythonで管理図を作る|X-R管理図の手順へ進むと流れがつながります。QC7つ道具を体系的に学び直すなら、レベル別のおすすめ書籍を統計学・実験計画法のおすすめ本まとめで紹介しています。

※ 掲載したコードと関数名は2026年8月時点の一般的な使い方にもとづく整理です。ライブラリの仕様は更新されるため、実際の挙動は使用しているバージョンの公式ドキュメントでご確認ください。数値例は解説のための計算例です。

タイトルとURLをコピーしました