見出し画像

#15 Pythonで描くヒストグラム

「このデータ、なんとなくバラついてる気はするけど…実際どうなんだろう?」そんなとき、まず試すのが「ヒストグラム」です。

ヒストグラムは、データの形を把握できるシンプルだけど強力なグラフです。例えば、製造現場で寸法測定値や製品寿命時間の分布を見たいとき、ヒストグラムを使えば、「中心がどこか」「バラツキは大きいか」「偏りはあるか」といった情報が、ひと目でわかります。


それでは、スタートです。
*執筆者は以下を参照してください。


使ったツール・準備したこと

  • Visual Studio Code環境下でのPython

やってみたこと|コード・ステップ紹介

実行した内容の簡単な流れ

 ChatGPT 4oへの会話:

ヒストグラムを描画するアプリを生成してください。 入力はデータn=30まで可能とし、合わせて平均値、標準偏差も計算してください。

一旦、ブラウザ上での表示のコードとなりましたので「tkinterを使ってGUI化して」、とお願いして下の形になりました。種々の統計量表示にも使用できそうですね。

ヒストグラムに必須のn数、また、参考に平均値、標準偏差も記載しています。


今後の展開・アイデア

次回取り組みたいこと

・ヒストグラムが出来れば、以前の工程能力分析と合わせるといいかも。

■ 今日のコード

import matplotlib
matplotlib.rcParams['font.family'] = 'Meiryo'  # Windows の場合
import tkinter as tk
from tkinter import messagebox
import matplotlib.pyplot as plt
from matplotlib import rcParams
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import re

# 日本語フォントの設定(文字化け対策)
# rcParams['font.family'] = 'IPAexGothic'  # または 'MS Gothic', 'Yu Gothic', 'Noto Sans CJK JP' など

class HistogramApp:
    def __init__(self, root):
        self.root = root
        self.root.title("ヒストグラム描画アプリ")

        self.label = tk.Label(root, text="数値データを入力(最大30個、Excelからのコピペも可):")
        self.label.pack()

        self.entry = tk.Text(root, height=5, width=50)
        self.entry.pack()

        self.button = tk.Button(root, text="描画", command=self.draw_histogram)
        self.button.pack()

        self.result_label = tk.Label(root, text="")
        self.result_label.pack()

        self.canvas_frame = tk.Frame(root)
        self.canvas_frame.pack()

    def draw_histogram(self):
        input_data = self.entry.get("1.0", tk.END).strip()
        try:
            # カンマ、スペース、改行、タブで区切る(Excelコピペ対応)
            data_str_list = re.split(r'[\s,]+', input_data)
            data = [float(x.strip()) for x in data_str_list if x.strip() != ""]

            n = len(data)
            if n > 30:
                messagebox.showerror("エラー", "データは最大30個までです。")
                return

            mean = np.mean(data)
            std_dev = np.std(data, ddof=1)

            self.result_label.config(text=f"データ数: {n}個 / 平均値: {mean:.2f} / 標準偏差: {std_dev:.2f}")

            fig, ax = plt.subplots()
            ax.hist(data, bins='auto', edgecolor='black')
            ax.axvline(mean, color='red', linestyle='dashed', linewidth=1.5, label=f"平均値: {mean:.2f}")
            ax.set_title("ヒストグラム")
            ax.set_xlabel("値")
            ax.set_ylabel("度数")
            ax.legend()

            for widget in self.canvas_frame.winfo_children():
                widget.destroy()

            canvas = FigureCanvasTkAgg(fig, master=self.canvas_frame)
            canvas.draw()
            canvas.get_tk_widget().pack()

        except ValueError:
            messagebox.showerror("エラー", "数値を正しく入力してください(例: 10 20 30 または Excel からのコピペ)。")

if __name__ == "__main__":
    root = tk.Tk()
    app = HistogramApp(root)
    root.mainloop()

いいなと思ったら応援しよう!