跳转至

5.2   抽样方法

小率把班级社团问卷带来:全校 3000 名学生,想估计每周运动时间。直接在操场门口问人很方便,但均哥看了一眼就摇头:你在操场问到的人,当然更爱运动。

图 5.2.0 班级问卷抽样

班级调查该怎么抽人

如果目标是全校学生,样本就不能只从操场、图书馆或某一个社团里来。抽样方法就是规定:谁有机会被抽中、机会是多少、怎样执行。

5.2.1   简单随机抽样:每个人机会相同

如果我把全校学号放进表格,然后随机抽 300 个,这算最公平吗?
这就是简单随机抽样。它直观、公平,但前提是你真的有完整名单。

简单随机抽样(Simple Random Sampling, SRS):总体中每个个体都有相同概率被抽中,且抽样规则不依赖个人特征。

适合:名单完整、调查成本差不多、总体内部差异不需要提前分组的场景。

5.2.2   分层抽样:先分组,再组内随机

全校运动时间可能被年级、性别、住宿情况影响。若只靠 SRS,某些小群体可能抽得太少。分层抽样(Stratified Sampling) 会先把总体分成互不重叠的层,再在每层随机抽样。

分层是不是像每个年级都派代表?
对。层内随机,层间都覆盖,尤其适合不同层差异很明显的时候。

图 5.2.1 四种抽样方法对比

图 5.2.1   四种抽样方法的关键差别在于“先怎么组织总体,再怎么抽”。

5.2.3   整群抽样:抽地点,不抽个体

整群抽样(Cluster Sampling) 先把总体分成很多天然群组,比如班级、小区、医院、门店;再随机抽几个群组,并调查群组内全部或部分个体。

它常常更便宜,但同一个群里的人往往更相似,所以精度可能下降。

整群抽样的代价

抽 10 个班、每班 30 人,名义样本量是 300。但同班同学作息相近,信息量可能小于从全校随机抽 300 人。这种损失叫设计效应(Design Effect)。

5.2.4   系统抽样:随机起点,每隔 k 个抽一个

系统抽样(Systematic Sampling) 先随机选一个起点,再按固定间隔抽样。例如名单排好后,从第 7 个开始,每隔 10 个抽 1 个。

听起来很省事,但如果名单排序有规律呢?
这正是风险。如果名单按宿舍、成绩或班级周期排列,固定间隔可能反复踩中同一类人。

5.2.5   四种方法怎么选

方法 适合情况 最大风险
简单随机抽样 有完整名单,个体访问成本相近 名单不完整
分层抽样 重要子群体必须覆盖 分层变量选错
整群抽样 地理或组织成本很高 群内太相似
系统抽样 名单已排序且无周期 排序周期造成偏差

选择口诀

有完整名单先想 SRS;子群差异大用分层;跑地点太贵用整群;名单很长且无周期可用系统抽样。

5.2.6   pandas 里实现一次分层抽样

import numpy as np
import pandas as pd

rng = np.random.default_rng(2026)

students = pd.DataFrame({
    "student_id": np.arange(3000),
    "grade": rng.choice(["高一", "高二", "高三"], size=3000, p=[0.34, 0.33, 0.33]),
    "weekly_sport_hours": rng.gamma(shape=2.2, scale=1.6, size=3000)
})

# 每个年级按比例抽 10%
sample = (
    students
    .groupby("grade", group_keys=False)
    .sample(frac=0.10, random_state=2026)
)

print(sample.groupby("grade").size())
print(f"样本平均运动时间:{sample['weekly_sport_hours'].mean():.2f} 小时/周")
这样每个年级都有人,不会只抽到高一吧?
对。分层抽样是在“代表性”上先做一道保险。

小率的笔记本

  • SRS 最朴素,但需要完整名单。
  • 分层抽样解决“重要子群体别漏掉”。
  • 整群抽样省成本,但常牺牲精度。
  • 系统抽样省事,但要检查名单周期。