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

挑战

中等

一家油漆制造商测量了三种漆面干燥所需的时间。起始代码将每种漆面的分钟数放在 times 中,列出三个 pairs,定义 permutation_p(a, b),并读取 level。

  1. 并排打印哑光漆与缎面漆的 t 检验 p 值和置换检验的 p 值。
  2. 按每对漆面中第一种漆面在前的顺序,检验每一对,并打印 p 值最小的一对。
  3. 统计 p 值低于 level 的漆面对数。

将 p 值四舍五入到小数点后三位。另一家制造商的 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


# 前两课的置换检验:返回 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 在线编译器