← 返回《数据科学的统计基础》
📑 查看全课大纲(第 40 / 41 节)

分层随机抽样

约 20 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

分层随机抽样

小象实战讲义 · 数据科学的统计基础

在实际的抽样调查中,我们常常面临一个困境:总体内部存在明显的异质性。例如,要调查全国大学生的月均消费,不同地区、不同专业、不同年级的学生消费水平差异巨大。如果采用简单随机抽样,样本可能偶然地集中到某些特定群体,导致估计结果偏差较大。分层随机抽样正是为了解决这一问题而设计的。本节我们将系统学习分层随机抽样的原理、实施步骤、估计量的构造及其优良性质,理解“层内差异小、层间差异大”这一核心原则背后的数学原理,并掌握利用Python进行分层抽样模拟与估计的方法。

💡 核心导读

  • 核心思想:将异质性强的总体划分为若干个内部同质性强的“层”,然后在各层内独立进行简单随机抽样,最后加权汇总得到总体估计。
  • 关键原则:分层应遵循“层内差异尽可能小,层间差异尽可能大”,这是提高估计精度的核心。
  • 估计方法:总体均值的估计量是各层样本均值的加权平均,权重为各层单位数占总体的比例。
  • 方差分解:总体方差可分解为层内方差与层间方差之和。分层估计量的方差仅与层内方差有关,而与层间方差无关,这从数学上解释了为何“层间差异大”能提高精度。
  • 实施要点:需要已知各层的单位总数,各层抽样相互独立,且每个总体单位必须且只能属于某一层。

分层随机抽样的基本概念与步骤

分层随机抽样,顾名思义,其核心在于“分层”。它是在简单随机抽样的基础上发展起来的一种更高效、更灵活的抽样方法。

为什么要分层?

进行分层随机抽样通常基于以下理由:

  1. 获取子总体信息:调查不仅需要了解总体特征(如全国大学生平均月消费),还需要了解各子总体(如各年级、各专业)的特征。
  2. 便于行政管理:调查对象可能分属不同的管理机构(如教育部直属高校、省属高校、民办高校),分层便于组织实施。
  3. 适应不同抽样框:总体中不同部分的抽样框(名单)可能不同,且特征差异显著(如大型商场与小型便利店),分层处理更为便利。
  4. 提高估计精度:这是分层抽样最重要的优势。通过科学分层,可以在相同样本量下获得比简单随机抽样更精确的总体估计。

记号、定义与重要命题

首先,我们建立分层抽样的标准记号体系:

  • 总体单位总数:NN
  • 层数:KK
  • ii(i=1,2,,K)(i=1,2,\dots,K) 的单位总数:NiN_i,满足 i=1KNi=N\sum_{i=1}^{K} N_i = N
  • ii 层的权重:Wi=Ni/NW_i = N_i / N,满足 i=1KWi=1\sum_{i=1}^{K} W_i = 1
  • ii 层第 jj 个单位的观测值:YijY_{ij} (j=1,2,,Ni)(j=1,2,\dots,N_i)
  • ii 层的总体均值:Yˉi=1Nij=1NiYij\bar{Y}i = \frac{1}{N_i} \sum{j=1}^{N_i} Y_{ij}
  • 总体均值:Yˉ=1Ni=1Kj=1NiYij=i=1KWiYˉi\bar{Y} = \frac{1}{N} \sum_{i=1}^{K} \sum_{j=1}^{N_i} Y_{ij} = \sum_{i=1}^{K} W_i \bar{Y}_i。可见,总体均值是各层均值的加权平均。
  • ii 层的总体方差:Si2=1Ni1j=1Ni(YijYˉi)2S_i^2 = \frac{1}{N_i - 1} \sum_{j=1}^{N_i} (Y_{ij} - \bar{Y}_i)^2
  • 层内方差:各层方差的加权平均,记为 Sw2=i=1KWiSi2S_w^2 = \sum_{i=1}^{K} W_i S_i^2
  • 层间方差:各层均值与总体均值离差平方的加权平均,记为 Sb2=i=1KWi(YˉiYˉ)2S_b^2 = \sum_{i=1}^{K} W_i (\bar{Y}_i - \bar{Y})^2

命题一(方差分解定理):总体方差 S2S^2(定义为 1N1i=1Kj=1Ni(YijYˉ)2\frac{1}{N-1}\sum_{i=1}^{K}\sum_{j=1}^{N_i}(Y_{ij}-\bar{Y})^2)可以分解为层内方差与层间方差之和,即: S2Sw2+Sb2S^2 \approx S_w^2 + S_b^2 这是一个近似式,其精确基础是平方和恒等式:ij(YijYˉ)2=i(Ni1)Si2+iNi(YˉiYˉ)2\sum_{i}\sum_{j}(Y_{ij}-\bar{Y})^2 = \sum_{i}(N_i-1)S_i^2 + \sum_{i}N_i(\bar{Y}_i-\bar{Y})^2 恒成立;当各层容量 NiN_iNN 都较大时,Ni1NiN_i-1 \approx N_iN1NN-1 \approx N,上述方差分解式近似成立。这个定理是理解分层抽样优势的基石,它与方差分析(ANOVA)中总平方和分解为组内平方和与组间平方和的原理一致。

分层抽样的主要步骤

  1. 划分层:将总体 NN 个单位划分为 KK 个互不重叠且穷尽的子总体(层)。划分的依据应使得层内单位尽可能相似(Si2S_i^2 小),而层间差异尽可能明显(Sb2S_b^2 大)。
  2. 确定各层样本量:设总的样本量为 nn,需要将其分配到各层。最常用的是按比例分配,即第 ii 层的样本量 ni=nWi=n(Ni/N)n_i = n \cdot W_i = n \cdot (N_i / N)。这保证了样本结构与总体结构一致。
  3. 独立抽样:在各层内,根据确定的 nin_i,独立地进行简单随机抽样(可重复或不重复)。
  4. 估计与推断:首先计算各层的样本统计量(如层样本均值 yˉi\bar{y}i),然后通过加权平均等方式,构造总体参数的估计量(如总体均值 Yˉ\bar{Y} 的估计量 yˉst\bar{y}{st}),并进行统计推断。

总体均值的估计及其性质

估计量的构造

假设我们在第 ii 层抽取了 nin_i 个样本,观测值为 yi1,yi2,,yiniy_{i1}, y_{i2}, \dots, y_{in_i}

  • ii 层的样本均值为:yˉi=1nij=1niyij\bar{y}i = \frac{1}{n_i} \sum{j=1}^{n_i} y_{ij}
  • 根据简单随机抽样的性质,yˉi\bar{y}_iYˉi\bar{Y}_i 的无偏估计,即 E(yˉi)=YˉiE(\bar{y}_i) = \bar{Y}_i

总体均值 Yˉ\bar{Y} 的分层估计量定义为各层样本均值的加权平均,权重为层权 WiW_iyˉst=i=1KWiyˉi\bar{y}{st} = \sum{i=1}^{K} W_i \bar{y}_i 其中下标 stst 代表 stratified(分层)。

估计量的无偏性

由于各层抽样独立,且 yˉi\bar{y}iYˉi\bar{Y}i 的无偏估计,容易证明 yˉst\bar{y}{st}Yˉ\bar{Y} 的无偏估计: E(yˉst)=E(i=1KWiyˉi)=i=1KWiE(yˉi)=i=1KWiYˉi=YˉE(\bar{y}{st}) = E\left( \sum_{i=1}^{K} W_i \bar{y}i \right) = \sum{i=1}^{K} W_i E(\bar{y}i) = \sum{i=1}^{K} W_i \bar{Y}_i = \bar{Y}

估计量的方差

估计量 yˉst\bar{y}_{st} 的方差取决于各层内的抽样方式。

  1. 各层内为重复抽样Var(yˉst)=i=1KWi2Si2ni\text{Var}(\bar{y}{st}) = \sum{i=1}^{K} W_i^2 \cdot \frac{S_i^2}{n_i}
  2. 各层内为不重复抽样(更常见): Var(yˉst)=i=1KWi2Si2ni(1niNi)\text{Var}(\bar{y}{st}) = \sum{i=1}^{K} W_i^2 \cdot \frac{S_i^2}{n_i} \left(1 - \frac{n_i}{N_i}\right) 其中 (1niNi)\left(1 - \frac{n_i}{N_i}\right) 是第 ii 层的有限总体校正系数。

核心结论:分层为何能提高精度?

观察方差公式,无论是重复还是不重复抽样,Var(yˉst)\text{Var}(\bar{y}_{st}) 都只与各层的方差 Si2S_i^2 有关。结合命题一(S2=Sw2+Sb2S^2 = S_w^2 + S_b^2,我们可以得出关键结论:

在总体方差 S2S^2 固定的情况下,层间方差 Sb2S_b^2 越大,则层内方差 Sw2S_w^2 就越小。而 Var(yˉst)\text{Var}(\bar{y}_{st}) 依赖于 Sw2S_w^2(具体是各 Si2S_i^2 的加权组合),因此 Sw2S_w^2 越小,估计量的方差就越小,估计精度就越高。

这就从数学上严格证明了分层抽样的核心原则:划分层时,应使层内差异尽可能小(Si2S_i^2 小),层间差异尽可能大(Sb2S_b^2 大)。

估计量方差的估计与样本量分配

方差估计量的构造

在实际中,各层的总体方差 Si2S_i^2 通常是未知的,需要用样本方差来估计。

  • ii 层的样本方差:si2=1ni1j=1ni(yijyˉi)2s_i^2 = \frac{1}{n_i - 1} \sum_{j=1}^{n_i} (y_{ij} - \bar{y}_i)^2
  • si2s_i^2Si2S_i^2 的无偏估计,即 E(si2)=Si2E(s_i^2) = S_i^2

由此,我们可以构造 Var(yˉst)\text{Var}(\bar{y}_{st}) 的无偏估计量:

  1. 对于重复抽样v(yˉst)=i=1KWi2si2niv(\bar{y}{st}) = \sum{i=1}^{K} W_i^2 \cdot \frac{s_i^2}{n_i}
  2. 对于不重复抽样v(yˉst)=i=1KWi2si2ni(1niNi)v(\bar{y}{st}) = \sum{i=1}^{K} W_i^2 \cdot \frac{s_i^2}{n_i} \left(1 - \frac{n_i}{N_i}\right)

样本量的分配

给定总样本量 nn,如何分配各层样本量 nin_i 以最小化估计量的方差?除了最常用的按比例分配ni=nWin_i = n W_i)外,还有:

  • 内曼最优分配:在按比例分配的基础上,考虑层内变异程度。对于估计总体均值,最优分配为 ni=nWiSij=1KWjSjn_i = n \cdot \frac{W_i S_i}{\sum_{j=1}^{K} W_j S_j}。即层内标准差 SiS_i 越大,分配的样本量越多。
  • 最优分配:进一步考虑各层抽样成本 cic_i,使得在固定总费用下方差最小,或在固定方差下总费用最小。公式为 niWiSicin_i \propto \frac{W_i S_i}{\sqrt{c_i}}

误差限与样本量确定

在给定置信水平 1α1-\alpha 和允许的绝对误差限 dd 时,若 yˉst\bar{y}{st} 近似服从正态分布,则有: P(yˉstYˉd)1αP(|\bar{y}{st} - \bar{Y}| \le d) \approx 1-\alpha 其中 d=zα/2Var(yˉst)d = z_{\alpha/2} \cdot \sqrt{\text{Var}(\bar{y}{st})}。由此可以反推出所需的总样本量 nn。对于按比例分配的不重复抽样,总样本量公式为: n=i=1KWiSi2d2zα/22+1Ni=1KWiSi2n = \frac{\sum{i=1}^{K} W_i S_i^2}{\frac{d^2}{z_{\alpha/2}^2} + \frac{1}{N}\sum_{i=1}^{K} W_i S_i^2} 其中 Si2S_i^2 可用历史数据或预调查估计。

下面我们通过一个Python示例来模拟分层抽样,并验证估计量的无偏性以及按比例分配的效果。

import numpy as np
import pandas as pd
from scipy import stats

# 设置随机种子,确保结果可复现
np.random.seed(2025)

# 模拟一个总体:假设调查某校三个年级男生的月消费(单位:元)
# 总体结构:高一(N1=300),高二(N2=400),高三(N3=300),总人数N=1000
# 各年级消费服从不同的正态分布
N1, N2, N3 = 300, 400, 300
N = N1 + N2 + N3
W1, W2, W3 = N1/N, N2/N, N3/N

# 生成总体数据:年级间差异大(均值不同),年级内差异相对小
# 高一:均值1000,标准差150
# 高二:均值1200,标准差180
# 高三:均值1500,标准差200
pop_grade1 = np.random.normal(loc=1000, scale=150, size=N1)
pop_grade2 = np.random.normal(loc=1200, scale=180, size=N2)
pop_grade3 = np.random.normal(loc=1500, scale=200, size=N3)

population = np.concatenate([pop_grade1, pop_grade2, pop_grade3])
grade_labels = np.array(['高一']*N1 + ['高二']*N2 + ['高三']*N3)

# 计算真实的总体参数
true_overall_mean = np.mean(population)
true_grade_means = [np.mean(pop_grade1), np.mean(pop_grade2), np.mean(pop_grade3)]
true_grade_vars = [np.var(pop_grade1, ddof=1), np.var(pop_grade2, ddof=1), np.var(pop_grade3, ddof=1)]

print("=== 总体真实参数 ===")
print(f"总体真实均值 Y_bar: {true_overall_mean:.2f} 元")
print(f"各层真实均值 Y_i_bar: 高一{true_grade_means[0]:.2f}, 高二{true_grade_means[1]:.2f}, 高三{true_grade_means[2]:.2f}")
print(f"各层真实方差 S_i^2: 高一{true_grade_vars[0]:.2f}, 高二{true_grade_vars[1]:.2f}, 高三{true_grade_vars[2]:.2f}")
print(f"层权 W_i: 高一{W1:.3f}, 高二{W2:.3f}, 高三{W3:.3f}")

# 模拟分层随机抽样(不重复)与简单随机抽样对比
n_total = 100  # 总样本量
n_sim = 5000   # 模拟次数

# 存储结果
est_means_strat = []  # 分层估计的均值
est_means_srs = []    # 简单随机抽样估计的均值

for _ in range(n_sim):
    # --- 分层随机抽样 (按比例分配) ---
    n1 = int(n_total * W1)  # 高一样本量
    n2 = int(n_total * W2)  # 高二样本量
    n3 = n_total - n1 - n2  # 高三样本量(确保总样本量准确)
    
    # 各层内简单随机抽样(不重复)
    samp1 = np.random.choice(pop_grade1, size=n1, replace=False)
    samp2 = np.random.choice(pop_grade2, size=n2, replace=False)
    samp3 = np.random.choice(pop_grade3, size=n3, replace=False)
    
    # 计算层样本均值
    y1_bar = np.mean(samp1)
    y2_bar = np.mean(samp2)
    y3_bar = np.mean(samp3)
    
    # 计算分层估计量 y_st
    y_st = W1*y1_bar + W2*y2_bar + W3*y3_bar
    est_means_strat.append(y_st)
    
    # --- 简单随机抽样 (SRS) ---
    srs_sample = np.random.choice(population, size=n_total, replace=False)
    y_srs = np.mean(srs_sample)
    est_means_srs.append(y_srs)

# 转换为numpy数组
est_means_strat = np.array(est_means_strat)
est_means_srs = np.array(est_means_srs)

# 分析模拟结果
print("\n=== 模拟结果分析 (基于5000次重复实验) ===")
print(f"总样本量 n = {n_total}")

print("\n1. 分层随机抽样估计量 y_st:")
print(f"   均值 E(y_st): {np.mean(est_means_strat):.2f}")
print(f"   偏差 (E(y_st) - Y_bar): {np.mean(est_means_strat) - true_overall_mean:.4f}")
print(f"   标准差 (估计精度): {np.std(est_means_strat, ddof=1):.2f}")
print(f"   95% 置信区间半宽 (近似): {1.96 * np.std(est_means_strat, ddof=1):.2f}")

print("\n2. 简单随机抽样估计量 y_srs:")
print(f"   均值 E(y_srs): {np.mean(est_means_srs):.2f}")
print(f"   偏差 (E(y_srs) - Y_bar): {np.mean(est_means_srs) - true_overall_mean:.4f}")
print(f"   标准差 (估计精度): {np.std(est_means_srs, ddof=1):.2f}")
print(f"   95% 置信区间半宽 (近似): {1.96 * np.std(est_means_srs, ddof=1):.2f}")

print("\n3. 比较:")
precision_gain = (np.std(est_means_srs, ddof=1)**2 - np.std(est_means_strat, ddof=1)**2) / np.std(est_means_srs, ddof=1)**2
print(f"   分层抽样估计量的方差比简单随机抽样减少了 {precision_gain*100:.1f}%")
print("   (验证了'层间差异大'时,分层抽样能显著提高估计精度)")

📝 动手练一练

  1. 分层设计分析:假设你要调查某市居民的年均通勤费用。已知该市有A、B、C三个行政区,人口分别为50万、30万、20万。根据历史数据,各行政区居民通勤费用的标准差估计分别为1200元、800元、1500元。若采用分层随机抽样,总样本量定为1000人。

    • a) 若采用按比例分配,计算A、B、C三个行政区分别应抽取多少样本?
    • b) 若采用内曼最优分配(以最小化总体均值估计量的方差为目标),计算各行政区应抽取的样本量。
  2. 方差计算:接上题,假设采用按比例分配的不重复抽样,且已知各行政区的总体方差即为上述标准差的平方(即 SA2=12002,SB2=8002,SC2=15002S_A^2=1200^2, S_B^2=800^2, S_C^2=1500^2)。请计算在此抽样设计下,总体年均通勤费用估计量 yˉst\bar{y}{st} 的理论方差 Var(yˉst)\text{Var}(\bar{y}{st})

参考答案:

  1. a) 按比例分配:WA=0.5,WB=0.3,WC=0.2W_A=0.5, W_B=0.3, W_C=0.2。样本量 nA=1000×0.5=500n_A = 1000 \times 0.5 = 500nB=300n_B = 300nC=200n_C = 200。 b) 内曼最优分配:首先计算 WiSi=0.5×1200+0.3×800+0.2×1500=600+240+300=1140\sum W_i S_i = 0.5\times1200 + 0.3\times800 + 0.2\times1500 = 600+240+300=1140。则 nA=1000×(0.5×1200)/1140526n_A = 1000 \times (0.5\times1200)/1140 \approx 526nB=1000×(0.3×800)/1140211n_B = 1000 \times (0.3\times800)/1140 \approx 211nC=1000×(0.2×1500)/1140263n_C = 1000 \times (0.2\times1500)/1140 \approx 263
  2. 方差计算:Var(yˉst)=WA2SA2nA(1nANA)+WB2SB2nB(1nBNB)+WC2SC2nC(1nCNC)\text{Var}(\bar{y}_{st}) = W_A^2 \frac{S_A^2}{n_A}(1-\frac{n_A}{N_A}) + W_B^2 \frac{S_B^2}{n_B}(1-\frac{n_B}{N_B}) + W_C^2 \frac{S_C^2}{n_C}(1-\frac{n_C}{N_C})。由于 NiN_i 很大,有限总体校正系数 (1ni/Ni)1(1-n_i/N_i) \approx 1。代入数值: =0.52×12002500+0.32×8002300+0.22×15002200= 0.5^2 \times \frac{1200^2}{500} + 0.3^2 \times \frac{800^2}{300} + 0.2^2 \times \frac{1500^2}{200} =0.25×2880+0.09×2133.33+0.04×11250= 0.25 \times 2880 + 0.09 \times 2133.33 + 0.04 \times 11250 =720+192+450=1362= 720 + 192 + 450 = 1362 因此,估计量的标准差约为 136236.9\sqrt{1362} \approx 36.9 元。

本章小结

本节系统介绍了分层随机抽样这一重要的概率抽样方法。我们首先理解了其适用场景和核心优势——在获取子总体信息的同时,能显著提高对总体参数的估计精度。通过建立完整的记号体系,我们学习了分层抽样的实施步骤,重点掌握了总体均值估计量 yˉst\bar{y}_{st} 的构造方法(各层样本均值的加权平均)及其无偏性。

核心洞见来自于方差分解定理(S2=Sw2+Sb2S^2 = S_w^2 + S_b^2)与估计量方差公式的结合分析:分层估计量的方差仅依赖于层内方差 Sw2S_w^2。因此,通过科学分层,最大化层间差异 Sb2S_b^2,从而最小化层内差异 Sw2S_w^2,就能在相同样本量下获得更小方差的估计量,这是分层抽样提升精度的数学本质。

我们还探讨了样本量的分配策略(按比例分配、内曼分配)以及如何根据精度要求确定总样本量。最后的Python模拟直观验证了,当总体存在明显异质性(层间差异大)时,分层随机抽样相比简单随机抽样具有显著的精度优势。

学完本节,你可以立刻:

  1. 设计分层方案:面对一个异质性总体(如不同区域、不同等级的用户),能够根据调查目标,选择合适的分层变量,并遵循“层内同质、层间异质”的原则进行分层。
  2. 计算样本分配与估计量:给定总体各层大小和总样本量,能进行按比例分配或最优分配的计算,并能根据抽样数据计算分层估计量 yˉst\bar{y}_{st} 及其方差的估计。
  3. 评估与比较:能解释为何在特定场景下分层抽样优于简单随机抽样,并能通过模拟或公式计算量化其精度提升的幅度。

— 小象教研组

配套学习资源与课件
  • 第8章课件:抽样调查(PDF · 7.7MB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问