見出し画像

#11 Pythonで始める箱ひげ図

箱ひげ図は、データの分布を視覚的に分かりやすく表現するグラフです。主に統計やデータ分析の分野で使われます。

今日はこの図の描画です。


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


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

  • Visual Studio Code環境下でのPython

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

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

① ChatGPT 4oへ質問:

箱ひげ図作成アプリを生成してください。

以下のコードを生成してくれました。

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

class BoxplotApp:
    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_boxplot)
        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_boxplot(self):
        input_data = self.entry.get("1.0", tk.END).strip()
        try:
            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

            q1 = np.percentile(data, 25)
            q2 = np.median(data)
            q3 = np.percentile(data, 75)
            iqr = q3 - q1
            mean = np.mean(data)

            self.result_label.config(text=f"データ数: {n}個 / 中央値: {q2:.2f} / 平均値: {mean:.2f} / 四分位範囲(IQR): {iqr:.2f}")

            fig, ax = plt.subplots()
            ax.boxplot(data, vert=True, patch_artist=True, showmeans=True, meanline=False)
            ax.set_title("箱ひげ図")
            ax.set_ylabel("値")

            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 = BoxplotApp(root)
    root.mainloop()

試しに描画してみると・・・文字化けしていましたが、追加の会話で日本語対応しました。

今後の展開・アイデア

次回取り組みたいこと

*必ずしもそうならないこともございます。

・F検定アプリを生成する

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