#16 Pythonで始める工程能力分析ver2、チャレンジ AI×100業務(製造業)
このチャレンジシリーズは工程能力分析からはじまりました(単に、計算するだけのGUIでしたが・・・)。
今日は、前にヒストグラムの描画を実施しましたので(平均値+標準偏差入り)、工程能力分析と合わせたものとします。規格値や平均値、標準偏差が合わせて描画されている方が、一見してわかりやすいですね。
それでは、スタートです。
*執筆者は以下を参照してください。
使ったツール・準備したこと
Visual Studio Code環境下でのPython
やってみたこと|コード・ステップ紹介
実行した内容の簡単な流れ
① ChatGPT 4oへ質問:
以前作成していただいた、工程能力分析のアプリで、描画機能を追加してください。ヒストグラム、仕様の上限、下限、平均値、標準偏差。
生成されたコードを実行すると以下の画面が出力されました。

今後の展開・アイデア
次回取り組みたいこと
・次はF検定と箱ひげ図を合わせます。
■ 今日のコード
import matplotlib
matplotlib.rcParams['font.family'] = 'Meiryo' # Windows の場合
import tkinter as tk
from tkinter import messagebox
import statistics
import re
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
def calculate_cp_cpk():
try:
raw_data = entry_data.get("1.0", tk.END)
cleaned_data = re.sub(r"[\s\n\t]+", ",", raw_data.strip())
data = [float(x) for x in cleaned_data.split(',') if x.strip() != '']
if len(data) < 2:
messagebox.showerror("エラー", "2点以上のデータを入力してください。")
return
if len(data) > 30:
messagebox.showerror("エラー", "30点までのデータにしてください。")
return
usl = float(entry_usl.get())
lsl = float(entry_lsl.get())
mean = statistics.mean(data)
stdev = statistics.stdev(data)
cp = (usl - lsl) / (6 * stdev)
cpu = (usl - mean) / (3 * stdev)
cpl = (mean - lsl) / (3 * stdev)
cpk = min(cpu, cpl)
label_result.config( text=f"Cp: {cp:.3f}, Cpk: {cpk:.3f}\n平均: {mean:.3f}, 標準偏差: {stdev:.3f}")
# ヒストグラム描画
draw_histogram(data, lsl, usl, mean, stdev)
except ValueError:
messagebox.showerror("入力エラー", "数値を正しく入力してください。")
def draw_histogram(data, lsl, usl, mean, stdev):
ax.clear()
ax.hist(data, bins=10, alpha=0.6, color='skyblue', edgecolor='black')
ax.axvline(lsl, color='red', linestyle='--', label='LSL')
ax.axvline(usl, color='red', linestyle='--', label='USL')
ax.axvline(mean, color='green', linestyle='-', label='平均')
ax.axvline(mean - stdev, color='gray', linestyle=':', label='-1σ')
ax.axvline(mean + stdev, color='gray', linestyle=':', label='+1σ')
ax.set_title('測定データ ヒストグラム')
ax.set_xlabel('値')
ax.set_ylabel('頻度')
ax.legend()
canvas.draw()
def on_enter(event):
calculate_cp_cpk()
# GUI 作成
root = tk.Tk()
root.title("工程能力分析アプリ")
root.geometry("600x800")
# データ入力欄
tk.Label(root, text="測定データ(最大30点、改行・空白・カンマ区切り可):").pack()
entry_data = tk.Text(root, height=5, width=60)
entry_data.pack()
entry_data.bind("<Return>", on_enter)
# 仕様上下限
tk.Label(root, text="上限値 (USL):").pack()
entry_usl = tk.Entry(root)
entry_usl.pack()
entry_usl.bind("<Return>", on_enter)
tk.Label(root, text="下限値 (LSL):").pack()
entry_lsl = tk.Entry(root)
entry_lsl.pack()
entry_lsl.bind("<Return>", on_enter)
# 計算ボタン
btn_calc = tk.Button(root, text="計算", command=calculate_cp_cpk)
btn_calc.pack(pady=10)
btn_calc.bind("<Return>", on_enter)
# 結果表示
label_result = tk.Label(root, text="Cp: , Cpk: 平均: , 標準偏差: ")
label_result.pack(pady=10)
# ヒストグラム用のFigure
fig, ax = plt.subplots(figsize=(6, 4))
canvas = FigureCanvasTkAgg(fig, master=root)
canvas_widget = canvas.get_tk_widget()
canvas_widget.pack(pady=(30, 10))
# メインループ
root.mainloop()