検査後のデータをExcelに手入力して、集計して、報告書を作って…。その作業、毎回1〜2時間かかっていませんか?
しかもロットごとにファイルが別々で、月次まとめになると「またあの作業か」とため息が出る。品質管理や検査担当をやっていると、こういう状況に毎週直面するんですよね。
私が製造業で生産管理を7年担当していたころ、一番しんどかったのが「検査データのまとめ作業」でした。測定値をExcelに転記して、上限・下限と照らし合わせてNG品を拾い出して、ロットごとにCpkを出して…。やることは決まっているのに、手を動かすだけで時間が消えていく。
この記事では、その繰り返し作業をPythonで自動化する方法を解説します。OK/NG判定・Cpk計算・Excel報告書出力まで、コピペで動くコードをステップ別に紹介します。Pythonで簡単なスクリプトを動かした経験があれば、この記事の通りに動かせます。まだ環境を作っていない方は、先に「WindowsPCでPythonを始める方法」をご覧ください。
読み終えたあとには「自分の会社のCSVデータで試してみよう」と思えているはずです。
検査データの手作業処理、こんな状況に心当たりはありませんか?
この記事は、寸法・重量・電気特性などの測定値データをCSVで記録している方を対象にしています。画像を使った外観検査やソフトウェアテスト自動化とは異なりますのでご注意ください。
自動化を検討し始めるきっかけは、だいたい同じです。
- 測定値をCSVやExcelに手入力している
- 上限・下限との照合を目視でやっている
- NG品の件数をSUMIF関数で集計している
- ロットが変わるたびに同じ作業を繰り返している
- 月次の報告書づくりに半日かかっている
どれか1つでも当てはまるなら、Pythonで自動化できます。この記事で紹介するコードは、列名と数値を書き換えるだけで動くように設計しています。
PythonでできるようになるCSV検査データの自動化3ステップ
まず全体の流れを把握しましょう。自動化は3つのステップで完結します。
- CSVの検査データを読み込む
- 上限・下限でOK/NG自動判定する
- 結果をExcelに自動出力する
ライブラリは主に2つ使います。データ処理にpandas、Excel出力にopenpyxlです。どちらも以下のコマンドでインストールできます。
pip install pandas openpyxl
ステップ1:CSVの検査データを読み込む
検査データがCSV形式で保存されていることを前提にします。たとえば以下のような構造です。
ロット番号,測定値,検査日
LOT-001,12.3,2026-05-01
LOT-001,12.1,2026-05-01
LOT-002,13.8,2026-05-02
このCSVをPythonで読み込むコードはこれだけです。
import pandas as pd
df = pd.read_csv("inspection_data.csv", encoding="shift_jis")
print(df.head())
カスタマイズポイント: ファイル名("inspection_data.csv")と文字コード(encoding="shift_jis")は自社の環境に合わせて変えてください。文字化けが起きる場合はencoding="utf-8"を試してみてください。
ステップ2:上限・下限でOK/NG自動判定する
次に、測定値が規格範囲内かを自動で判定します。たとえば上限が13.0、下限が11.5の場合はこう書きます。
# 上限・下限を設定
UPPER = 13.0
LOWER = 11.5
# OK/NG列を追加
df["判定"] = df["測定値"].apply(
lambda x: "OK" if LOWER <= x <= UPPER else "NG"
)
# NG件数を確認
ng_count = (df["判定"] == "NG").sum()
print(f"NG件数: {ng_count}件 / 全{len(df)}件")
カスタマイズポイント: UPPERとLOWERの数値を自社の規格値に変えるだけです。列名「測定値」も自社CSVの列名に合わせてください。
このコードを実行すると、元のデータフレームに「判定」列が追加され、各測定値に「OK」または「NG」が自動で入ります。目視確認ゼロです。
ステップ3:結果をExcelに自動出力する
判定済みのデータをExcelファイルとして出力します。
output_file = "inspection_result.xlsx"
df.to_excel(output_file, index=False)
print(f"{output_file} に保存しました")
これだけで、判定列付きのExcelファイルが出力されます。あとはそのまま報告書のベースとして使えます。
ここまでの3ステップを1つのスクリプトにまとめると、だいたい20行程度。毎回コピペして列名を変えれば、どんな検査データにも対応できます。
Cpk(工程能力指数)をPythonで自動計算する方法
OK/NG判定だけでなく、「この工程はどれくらい安定しているか」を数値で示したいときに使うのがCpkです。上司への報告資料に入れることも多いですよね。
Cpkの計算式(非エンジニア向け復習)
Cpkは以下の2つのうち、小さい方の値です。なお、標準偏差とは測定値のバラつきの大きさを表す数値で、値が大きいほど測定結果がばらついていることを意味します。
- Cpu = (上限 − 平均値)÷(3 × 標準偏差)
- Cpl = (平均値 − 下限)÷(3 × 標準偏差)
一般的に Cpk ≥ 1.33 が「安定した工程」の目安です。1.0未満だと「工程の見直しが必要」というサインになります。
PythonコードとCpkの読み方
mean = df["測定値"].mean()
std = df["測定値"].std()
cpu = (UPPER - mean) / (3 * std)
cpl = (mean - LOWER) / (3 * std)
cpk = min(cpu, cpl)
print(f"平均値: {mean:.3f}")
print(f"標準偏差: {std:.3f}")
print(f"Cpk: {cpk:.3f}")
このコードは先ほどのOK/NG判定コードの続きとして実行できます。UPPER・LOWER・列名「測定値」は同じ変数を使い回してください。
平均値: 12.234
標準偏差: 0.412
Cpk: 1.425
Cpk 1.425 → 安定した工程、と即座に判断できます。Excelで毎回計算していたあの手間が、3行のコードに置き換わるのです。
複数品番対応・正規分布グラフ自動生成・月次報告書フォーマットへの自動書き込みまで含めた完全版テンプレートは、Noteで公開しています。基本コードはこの記事で動きますが、「実務でそのまま使いたい」方はこちらも参考にしてみてください。
複数ロットのCSVをまとめて処理する方法
ロットごとにCSVが分かれている場合、フォルダ内の全ファイルを一括で読み込んで処理するのが一番効率的です。
フォルダ内の全CSVを一括読み込みするコード
import glob
csv_files = glob.glob("inspection_data/*.csv")
df_list = []
for file in csv_files:
temp = pd.read_csv(file, encoding="shift_jis")
df_list.append(temp)
df_all = pd.concat(df_list, ignore_index=True)
print(f"{len(csv_files)}ファイル、合計{len(df_all)}件を読み込みました")
カスタマイズポイント: "inspection_data/*.csv" の部分を自社のフォルダパスに変えてください。例:"C:/Users/yamada/Desktop/検査データ/*.csv"
これで、月に50ファイルあっても、100ファイルあっても、同じコードで一気に処理できます。あとはOK/NG判定・Cpk計算・Excel出力を同様に続けるだけです。
自社データに合わせてコードをカスタマイズするポイント
「自社のCSVと列名が違う」「規格値が違う」という場合でも、変更箇所は2か所だけです。
列名の変更方法
この記事では「測定値」という列名を使っています。自社のCSVが「実測値」「測定結果」「VALUE」などの場合は、コード内の "測定値" をその名前に置き換えるだけです。
# 変更前
df["判定"] = df["測定値"].apply(...)
# 変更後(自社の列名が「実測値」の場合)
df["判定"] = df["実測値"].apply(...)
上限・下限の変更方法
UPPER = 13.0 # ← 自社の上限規格値に変更
LOWER = 11.5 # ← 自社の下限規格値に変更
品番や検査項目ごとに規格が違う場合は、辞書型で管理する方法もあります。複数品番への対応方法は、Noteのテンプレートで詳しく解説しています。
よくある失敗と対処法
実際に動かすと、いくつかハマりどころがあります。事前に知っておくと時間を無駄にしません。
- 文字化けする:
encoding="shift_jis"をencoding="cp932"に変えると直ることが多い - 読み込んだ数値がstrになっている:
df["測定値"] = pd.to_numeric(df["測定値"], errors="coerce")を加えるとfloat変換できる - Excelを開いたままスクリプトを実行するとエラーになる:出力先のExcelファイルは必ず閉じてから実行する
- CSVの先頭行が変な行から始まっている:
skiprows=2のようにスキップ行数を指定できる
私が現場で最初に詰まったのは文字化けでした。社内の測定器が出力するCSVがShift-JISで、encoding="utf-8"のままにしていたんですよね。エラーメッセージを見ながら1時間悩みましたが、たった1単語の変更で解決した話です。
この自動化を現場に展開するための次のステップ
ここまでのコードで、基本的な「検査データ自動化」の流れはつかめたはずです。
- 複数品番・複数規格への対応:品番ごとに上限・下限を切り替えて処理する
- グラフ自動生成:測定値の分布図(ヒストグラム)をPythonで自動描画する
- 報告書フォーマットの自動化:既存のExcelテンプレートに自動書き込みする
- Webアプリ化:ブラウザから誰でも使えるツールに仕上げる
→ 製造業でPythonを使って自動化する方法|非エンジニアが現場で実践した5場面
→ 製造業でPythonを導入するとどう変わるか|生産管理7年が現場でやった全体像と始め方
まとめ
この記事で紹介した検査データの自動化は、次の3ステップで動きます。
- CSVを
pandasで読み込む - 上限・下限でOK/NG判定列を追加する
- Excelに自動出力する
加えて、Cpk計算コード(3行)と複数CSVの一括処理コードも紹介しました。この組み合わせだけで、毎日・毎週繰り返していた手作業の大半はなくせます。
コードはコピペして使ってOKです。列名と規格値を変えるだけで、自社のデータにすぐ対応できます。この自動化を導入することで、毎週1〜2時間かかっていた集計作業を5〜10分に短縮できます。
品質記録をWebアプリ化して、入力〜集計をさらに効率化したい方はこちら。