#15 Pythonで描くヒストグラム
「このデータ、なんとなくバラついてる気はするけど…実際どうなんだろう?」そんなとき、まず試すのが「ヒストグラム」です。
ヒストグラムは、データの形を把握できるシンプルだけど強力なグラフです。例えば、製造現場で寸法測定値や製品寿命時間の分布を見たいとき、ヒストグラムを使えば、「中心がどこか」「バラツキは大きいか」「偏りはあるか」といった情報が、ひと目でわかります。
それでは、スタートです。
*執筆者は以下を参照してください。
使ったツール・準備したこと
Visual Studio Code環境下でのPython
やってみたこと|コード・ステップ紹介
実行した内容の簡単な流れ
ChatGPT 4oへの会話:
ヒストグラムを描画するアプリを生成してください。 入力はデータn=30まで可能とし、合わせて平均値、標準偏差も計算してください。
一旦、ブラウザ上での表示のコードとなりましたので「tkinterを使ってGUI化して」、とお願いして下の形になりました。種々の統計量表示にも使用できそうですね。

今後の展開・アイデア
次回取り組みたいこと
・ヒストグラムが出来れば、以前の工程能力分析と合わせるといいかも。
■ 今日のコード
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()
