t検定
CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 45/64。
コンピューターが登場する前、統計学には近道がありました。それがt検定です。平均値、ばらつき、グループのサイズを一度にp値へと変換する数式です。
from scipy import stats
result = stats.ttest_ind(sans, serif)
print(np.round(result.pvalue, 3))
print(np.round(result.statistic, 2))フォントの調査では、これは 0.031 と -2.61 を出力します。1000 回のシャッフルでは 0.039 となりました。いつものように近い値です。
t値は標準誤差単位での差です。その符号が示すのは、どちらのグループが先だったかだけです。この式はデータが釣鐘型であることを前提としているため、歪みのある小規模なグループでは、シャッフルの結果を信頼してください。
また、一方のモデルが本当にもう一方のモデルを上回っているかどうかも確認します。
チャレンジ
中級ある塗料メーカーが、3種類の仕上げの乾燥時間を計測しました。スターターコードでは、各仕上げの所要時間をtimesに格納し、3つのpairsをリストにし、permutation_p(a, b)を定義して、levelを読み込みます。
- つや消しとサテンのt検定のp値を、シャッフルによるp値と並べて表示します。
- 各ペアを、最初の仕上げを先にして検定し、p値が最も小さいペアを表示します。
level未満のp値となるペアの数を数えます。
p値は小数点以下3桁に丸めます。もう一つのメーカーのデータでは、levelは0.05です。
matte vs satin: t-test 0.012, simulation 0.023
Clearest difference: satin vs gloss (p = 0.0)
Pairs that differ: 3 of 3自分で試してみよう
import numpy as np
import pandas as pd
from scipy import stats
# 前の2つのレッスンで扱った置換検定:aとbを比較したときのp値を返す
def permutation_p(a, b, shuffles=1000, seed=0):
rng = np.random.default_rng(seed)
pooled = np.concatenate([a, b])
diffs = []
for i in range(shuffles):
shuffled = rng.permutation(pooled)
diffs.append(shuffled[len(a):].mean() - shuffled[:len(a)].mean())
real = b.mean() - a.mean()
return (np.abs(np.array(diffs)) >= np.abs(real)).mean()
paint = pd.read_csv("paint.csv")
times = {
"matte": paint[paint["finish"] == "matte"]["minutes"],
"satin": paint[paint["finish"] == "satin"]["minutes"],
"gloss": paint[paint["finish"] == "gloss"]["minutes"],
}
pairs = [("matte", "satin"), ("matte", "gloss"), ("satin", "gloss")]
level = float(input())
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
機械学習のための統計のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ