Menu
CoddyTech

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 となりました。いつものように近い値です。

フォントの調査でシャッフルした差の1000個分を淡いヒストグラムで示し、その上にt検定の釣鐘型曲線が重ねられ、実際の差 -6.6 の位置に赤い破線が引かれている。凡例には、シャッフルで p = 0.039、数式で 0.031 と示されている

t値は標準誤差単位での差です。その符号が示すのは、どちらのグループが先だったかだけです。この式はデータが釣鐘型であることを前提としているため、歪みのある小規模なグループでは、シャッフルの結果を信頼してください。

また、一方のモデルが本当にもう一方のモデルを上回っているかどうかも確認します。

challenge icon

チャレンジ

中級

ある塗料メーカーが、3種類の仕上げの乾燥時間を計測しました。スターターコードでは、各仕上げの所要時間をtimesに格納し、3つのpairsをリストにし、permutation_p(a, b)を定義して、levelを読み込みます。

  1. つや消しとサテンのt検定のp値を、シャッフルによるp値と並べて表示します。
  2. 各ペアを、最初の仕上げを先にして検定し、p値が最も小さいペアを表示します。
  3. 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())

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

機械学習のための統計のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ