見出し画像

チャレンジ AI×100業務(製造業)、#10 Pythonで始めるt検定

例えば、何かしらの改善前後の測定値は、差があるのでしょうか?改善前平均で57であった特性値が、改善後59となりました。改善の効果はあったのでしょうか?自社の特性値が平均で59だった特性は、ライバル企業は60でした。ここに有意性は認められるのでしょうか?

こういう時に用いるのが統計的な検定です。特に、平均値に関しての検定はt検定を実施します。

統計ソフトはもちろんのこと、エクセルでも検定は可能ですが、ここでは、比べる数値を入力すれば判断できる利点からアプリを作成します。


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


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

  • Visual Studio Code環境下でのPython

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

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

ChatGPT 4oへ質問:

t-検定のアプリを生成してください。 入力は、n=30までのデータ2列 出力は、t値、p値。

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

import tkinter as tk
from tkinter import messagebox
import re
from scipy import stats

def run_t_test():
    try:
        raw_data1 = entry_data1.get("1.0", tk.END)
        raw_data2 = entry_data2.get("1.0", tk.END)

        cleaned_data1 = re.sub(r"[\s\n\t]+", ",", raw_data1.strip())
        cleaned_data2 = re.sub(r"[\s\n\t]+", ",", raw_data2.strip())

        data1 = [float(x) for x in cleaned_data1.split(',') if x.strip() != '']
        data2 = [float(x) for x in cleaned_data2.split(',') if x.strip() != '']

        if len(data1) < 2 or len(data2) < 2:
            messagebox.showerror("エラー", "両方の群に2点以上のデータを入力してください。")
            return
        if len(data1) > 30 or len(data2) > 30:
            messagebox.showerror("エラー", "各群のデータは最大30点までです。")
            return

        # 正規性の検定(Shapiro-Wilk)
        p_norm1 = stats.shapiro(data1).pvalue
        p_norm2 = stats.shapiro(data2).pvalue

        if p_norm1 < 0.05 or p_norm2 < 0.05:
            messagebox.showwarning("注意", "どちらかの群で正規性が疑われます(p < 0.05)")

        # 等分散を仮定するt検定(Studentのt検定)
        t_stat, p_value = stats.ttest_ind(data1, data2, equal_var=True)
        label_result.config(text=f"t値: {t_stat:.3f}\np値: {p_value:.3f}\n正規性p値(群1): {p_norm1:.3f}\n正規性p値(群2): {p_norm2:.3f}")

    except ValueError:
        messagebox.showerror("入力エラー", "数値を正しく入力してください。")

root = tk.Tk()
root.title("t検定アプリ(正規性+等分散)")
root.geometry("500x550")

# データ入力欄1
tk.Label(root, text="群1のデータ(エクセルの列を貼り付け可能、最大30点):").pack()
entry_data1 = tk.Text(root, height=5, width=50)
entry_data1.pack()

# データ入力欄2
tk.Label(root, text="群2のデータ(エクセルの列を貼り付け可能、最大30点):").pack()
entry_data2 = tk.Text(root, height=5, width=50)
entry_data2.pack()

# 計算ボタン
btn_calc = tk.Button(root, text="t検定を実行", command=run_t_test)
btn_calc.pack(pady=10)

# 結果表示
label_result = tk.Label(root, text="t値: \np値: \n正規性p値(群1): \n正規性p値(群2): ")
label_result.pack()

root.mainloop()

試しに検定してみると・・・

ここで、データが正規分布か否かの検定も入れています(Shapiro-Wilk検定のようです)。また、仮定としては比較する2群のデータは等分散であることを仮定しています。これらの前提が崩れると比較しにくいものとなるので念のため入れています。

そのような場合、ヒストグラムで確認が基本ですがn数が5程度の場合はグラフにならないので、注意が必要です。

作成したexeファイル


今後の展開・アイデア

次回取り組みたいこと

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

・箱ひげ図を描画
・F検定を実施する


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