P値
CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 44/64。
p値はシャッフル結果を1つの数値にまとめます。つまり、どちらの方向でも、実際の差以上に大きい偽の差の割合です。
フォントの調査で使うコードは次のとおりです。
real = sans.mean() - serif.mean()
rng = np.random.default_rng(4)
diffs = shuffled_diffs(serif, sans, 1000, rng) # 前回のレッスンのループ
p_value = (np.abs(diffs) >= np.abs(real)).mean()
print(p_value)これは 0.039 を出力します。np.abs は -7 の差を 7 として数えます。問題は、フォントに違いがあるかどうかです。
有意水準(多くの場合0.05)を下回ると、フォントやモデルの性能向上を偶然で説明するのは難しくなります。ただし、証明ではありません。100回シャッフルしたうち、4回はそれが起きました。
チャレンジ
中級ある農場では、イチゴに朝または夕方に水をやります。スターターコードでは、strawberries.csvをmorningとeveningに分割し、columnsを列挙し、levelを読み込み、shuffled_diffsを定義します。
- 各列について、実際の差(夕方の平均-朝の平均)、シャッフルした差(朝を先に)とp値を計算します。
- 各列について、以下のように1行出力します(差は小数点以下2桁、p値は小数点以下3桁)。p値が
level未満の場合はdiffersと出力します。 - 差がある列の数を数えます。
別の農場で、0.05の場合:
berries: difference -5.4, p = 0.009, differs
weight_g: difference 0.2, p = 1.0, could be chance
sweetness_brix: difference 0.46, p = 0.022, differs
leaf_spots: difference 0.6, p = 0.397, could be chance
Columns that differ: 2 of 4自分で試してみよう
import numpy as np
import pandas as pd
# 置換検定でシャッフルして得た差を返す(lesson 43のループ):仮のbの平均から仮のaの平均を引いた値
def shuffled_diffs(a, b, shuffles, rng):
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())
return np.array(diffs)
beds = pd.read_csv("strawberries.csv")
morning = beds[beds["watering"] == "morning"]
evening = beds[beds["watering"] == "evening"]
columns = ["berries", "weight_g", "sweetness_brix", "leaf_spots"]
level = float(input())
# 以下の行は変更しないでください
rng = np.random.default_rng(21)
shuffles = 1000
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
機械学習のための統計のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ