Menu
CoddyTech

P 值

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 44 课,共 64 课。

p 值把多次打乱的结果汇总成一个数字:无论在哪一侧,虚假差值中至少与真实差值一样大的比例。

字体研究中 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. 按下面的格式为每一列打印一行(差值保留 2 位小数,p 值保留 3 位小数)。当 p 值小于 level 时,打印 differs。
  3. 统计差值显著的列数。

另一个农场,level 为 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


# 返回置换检验中打乱数据后得到的均值差(第 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 在线编译器