#41 Pythonで始めるバイオリンプロット、チャレンジ AI×100業務(製造業)
箱ひげ図は、「#11 Pythonで始める箱ひげ図」「#40 Pythonで始める箱ひげ図 ver2」にてコードを生成し描画しました。今日は、バイオリン図です。
バイオリン図は 箱ひげ図 に似ているが、異なる値のデータに確率密度を表示する点で異なっている。確率密度は、最も単純な場合にヒストグラムとなる。
*それでは、スタートです。
*執筆者は以下を参照してください。
使ったツール・準備したこと
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()
