見出し画像

#41 Pythonで始めるバイオリンプロット、チャレンジ AI×100業務(製造業)

箱ひげ図は、「#11 Pythonで始める箱ひげ図」「#40 Pythonで始める箱ひげ図 ver2」にてコードを生成し描画しました。今日は、バイオリン図です。

バイオリン図は 箱ひげ図 に似ているが、異なる値のデータに確率密度を表示する点で異なっている。確率密度は、最も単純な場合にヒストグラムとなる。

以下のWikipediaより。

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


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

  • Visual Studio Code環境下でのPython

  • ChatGPT

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

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

ChatGPTに次の会話をしました。

内容は、csvファイルをよみとり、選択した列のviolinプロットを描画します。このとき、描画する因子はGUIで選択させてください。csvファイルの先頭行が因子の名前となっています。csvの読み込みは日本語が含まれています。グラフ中の文字も日本語対応してください。

入力したプロンプト

■ 下のグラフが描画されました。

箱ひげ図と整列している点で、他の結果と比較しやすいですね。

今後の展開・アイデア

次回取り組みたいこと;

・次は、正規性検定、F検定、t検定を纏めます。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import filedialog, ttk

import matplotlib
import tkinter.font as tkfont

# 日本語フォント対応(環境に応じて変更可能)
matplotlib.rcParams['font.family'] = ['MS Gothic', 'IPAPGothic', 'Noto Sans CJK JP', 'Meiryo']

# CSVファイルを読み込む関数
def load_csv():
    file_path = filedialog.askopenfilename(filetypes=[("CSV files", "*.csv")])
    if file_path:
        try:
            df = pd.read_csv(file_path, encoding='utf-8')
        except UnicodeDecodeError:
            df = pd.read_csv(file_path, encoding='shift_jis')

        listbox.delete(0, tk.END)
        for col in df.columns:
            listbox.insert(tk.END, col)
        app.df = df

# Violinプロットを描画する関数
def draw_violin():
    selected_indices = listbox.curselection()
    selected_cols = [listbox.get(i) for i in selected_indices]

    if selected_cols:
        df = app.df[selected_cols].copy()
        melted = df.melt(var_name='因子', value_name='値')

        plt.figure(figsize=(10, 6))
        sns.violinplot(x='因子', y='値', data=melted, color='lightgray')  # 色を薄い灰色に設定
        plt.title("選択された列のバイオリンプロット")
        plt.xlabel("因子")
        plt.ylabel("値")
        plt.tight_layout()
        plt.show()

# GUIの構築
app = tk.Tk()
app.title("CSV列選択&Violinプロット描画ツール")
app.geometry("500x300")

load_button = tk.Button(app, text="CSVファイルを読み込む", command=load_csv)
load_button.pack(pady=10)

listbox = tk.Listbox(app, selectmode=tk.MULTIPLE, height=10, width=40)
listbox.pack(pady=10)

plot_button = tk.Button(app, text="Violinプロットを描画", command=draw_violin)
plot_button.pack(pady=10)

app.mainloop()

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