Menu
CoddyTech

P値

CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 44/64。

p値はシャッフル結果を1つの数値にまとめます。つまり、どちらの方向でも、実際の差以上に大きい偽の差の割合です。

フォント調査でシャッフルした1000個の差をヒストグラムで表示。両側の6.6秒以上の棒は赤色で、シャッフルは39回。ラベルには p = 39 / 1000 = 0.039 とある

フォントの調査で使うコードは次のとおりです。

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回はそれが起きました。

challenge icon

チャレンジ

中級

ある農場では、イチゴに朝または夕方に水をやります。スターターコードでは、strawberries.csvをmorningとeveningに分割し、columnsを列挙し、levelを読み込み、shuffled_diffsを定義します。

  1. 各列について、実際の差(夕方の平均-朝の平均)、シャッフルした差(朝を先に)とp値を計算します。
  2. 各列について、以下のように1行出力します(差は小数点以下2桁、p値は小数点以下3桁)。p値がlevel未満の場合はdiffersと出力します。
  3. 差がある列の数を数えます。

別の農場で、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

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

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

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

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