未记录事实核验 · 状态:现行内容
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用边界与维护说明
本文适用于四种概率抽样方法的基础理解和按文中参数进行的模拟练习,不是完整的真实调查设计方案;后续代码依赖首个代码块中的库导入。分层示例采用恰好可整数分配的比例样本量,系统抽样示例的总体大小可被样本量整除,整群示例采用等规模群,直接改用其他规模或分配方式时需重新考虑入样概率与估计权重。单次样本均值比较不能证明某种方法普遍更准确,优缺点、选择指南及应用表也不能保证代表性或精度;真实应用仍需结合抽样框、无回应、样本量及设计相应的误差估计,医学实验中的抽样尤其不应与治疗分组的随机分配混同。本次仅作全文结构审阅,未运行代码或进行外部事实及链接核验。
🧺 抽样方法(Sampling Methods)
abstract 📋 本节概览
- 🎯 学习目标:理解什么是抽样,常见抽样方法有哪些,如何用Python实现
- 📚 前置知识:概率的基本概念|概率的基本概念 | 描述性统计|描述性统计
- ⏱️ 预计用时:10分钟
🎯 核心概念
note 📖 **什么是抽样?**
抽样是从总体中选取部分个体组成样本的过程,通过研究样本来推断总体特征。
为什么需要抽样?
- 成本考虑:调查全部个体费时费力
- 破坏性检测:如灯泡寿命测试
- 实际不可能:如所有鱼的数量
- 时效性要求:快速了解市场反应
📊 四大抽样方法详解
1. 🎯 简单随机抽样 (Simple Random Sampling)
特点:固定样本量的不放回简单随机抽样中,每个同样大小的可能样本被选中的概率相等,各个体入样概率相等,但入样事件并不独立
适用场景:
- 总体比较均匀
- 没有明显的分层结构
- 样本量不是很大
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 简单随机抽样示例
def simple_random_sampling():
"""简单随机抽样演示"""
# 模拟总体:1000名学生的成绩
np.random.seed(42)
population = np.random.normal(75, 10, 1000) # 总体均值75,标准差10
# 简单随机抽样
sample_size = 50
sample = np.random.choice(population, size=sample_size, replace=False)
print("=== 简单随机抽样结果 ===")
print(f"总体均值: {np.mean(population):.2f}")
print(f"样本均值: {np.mean(sample):.2f}")
print(f"抽样误差: {abs(np.mean(sample) - np.mean(population)):.2f}")
# 可视化
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.hist(population, bins=50, alpha=0.7, label='总体分布', color='lightblue')
plt.axvline(np.mean(population), color='blue', linestyle='--', label=f'总体均值: {np.mean(population):.1f}')
plt.xlabel('成绩')
plt.ylabel('频数')
plt.title('总体分布')
plt.legend()
plt.subplot(1, 2, 2)
plt.hist(sample, bins=15, alpha=0.7, label='样本分布', color='lightcoral')
plt.axvline(np.mean(sample), color='red', linestyle='--', label=f'样本均值: {np.mean(sample):.1f}')
plt.xlabel('成绩')
plt.ylabel('频数')
plt.title('样本分布')
plt.legend()
plt.tight_layout()
plt.show()
return population, sample
# 执行简单随机抽样
pop, samp = simple_random_sampling()
优缺点:
- ✅ 简单易行,结果无偏
- ✅ 便于计算抽样误差
- ❌ 对异质性总体效果不佳
- ❌ 可能错过重要子群体
2. 🏗️ 分层抽样 (Stratified Sampling)
特点:将总体分成若干层,各层内部进行简单随机抽样
适用场景:
- 总体有明显的层次结构
- 各层之间差异较大,层内差异较小
- 需要保证各层都有代表
def stratified_sampling():
"""分层抽样演示"""
# 模拟分层总体:三个年级学生成绩
np.random.seed(42)
grade1 = np.random.normal(70, 8, 400) # 一年级:均值70
grade2 = np.random.normal(75, 9, 350) # 二年级:均值75
grade3 = np.random.normal(80, 7, 250) # 三年级:均值80
# 总体
population = np.concatenate([grade1, grade2, grade3])
labels = ['一年级'] * 400 + ['二年级'] * 350 + ['三年级'] * 250
df_population = pd.DataFrame({
'score': population,
'grade': labels
})
print("=== 分层抽样 ===")
print("各年级总体情况:")
print(df_population.groupby('grade')['score'].agg(['count', 'mean', 'std']))
# 比例分层抽样
sample_size = 100
sample_data = []
for grade in ['一年级', '二年级', '三年级']:
grade_data = df_population[df_population['grade'] == grade]['score'].values
grade_prop = len(grade_data) / len(population)
grade_sample_size = int(sample_size * grade_prop)
grade_sample = np.random.choice(grade_data, size=grade_sample_size, replace=False)
for score in grade_sample:
sample_data.append({'score': score, 'grade': grade})
df_sample = pd.DataFrame(sample_data)
print(f"\n样本情况(总样本量: {len(df_sample)}):")
print(df_sample.groupby('grade')['score'].agg(['count', 'mean', 'std']))
# 对比简单随机抽样
simple_sample = np.random.choice(population, size=sample_size, replace=False)
print(f"\n效果对比:")
print(f"总体均值: {np.mean(population):.2f}")
print(f"分层抽样均值: {df_sample['score'].mean():.2f}")
print(f"简单随机抽样均值: {np.mean(simple_sample):.2f}")
# 可视化
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
# 总体分布
for i, grade in enumerate(['一年级', '二年级', '三年级']):
grade_scores = df_population[df_population['grade'] == grade]['score']
axes[0, 0].hist(grade_scores, alpha=0.6, label=grade, bins=20)
axes[0, 0].set_title('总体各年级分布')
axes[0, 0].legend()
# 分层样本分布
for i, grade in enumerate(['一年级', '二年级', '三年级']):
grade_scores = df_sample[df_sample['grade'] == grade]['score']
axes[0, 1].hist(grade_scores, alpha=0.6, label=grade, bins=10)
axes[0, 1].set_title('分层样本分布')
axes[0, 1].legend()
# 简单随机样本分布
axes[1, 0].hist(simple_sample, bins=15, alpha=0.7, color='gray')
axes[1, 0].set_title('简单随机样本分布')
# 均值比较
methods = ['总体', '分层抽样', '简单随机']
means = [np.mean(population), df_sample['score'].mean(), np.mean(simple_sample)]
axes[1, 1].bar(methods, means, color=['blue', 'green', 'red'], alpha=0.7)
axes[1, 1].set_title('均值比较')
axes[1, 1].set_ylabel('均值')
plt.tight_layout()
plt.show()
return df_population, df_sample
# 执行分层抽样
pop_df, samp_df = stratified_sampling()
优缺点:
- ✅ 确保各层都有代表性
- ✅ 提高估计精度
- ✅ 可分层分析结果
- ❌ 需要事先了解总体结构
- ❌ 实施较复杂
3. 📏 系统抽样 (Systematic Sampling)
特点:按固定间隔从总体中抽取样本
适用场景:
- 总体有序排列
- 实施简便性要求高
- 总体没有周期性规律
def systematic_sampling():
"""系统抽样演示"""
# 创建有序总体
np.random.seed(42)
population_size = 1000
sample_size = 50
# 模拟工厂产品质量数据(有轻微趋势)
trend = np.linspace(0, 5, population_size) # 质量逐渐改善的趋势
noise = np.random.normal(0, 2, population_size)
population = 75 + trend + noise
# 系统抽样
k = population_size // sample_size # 抽样间隔
start = np.random.randint(0, k) # 随机起点
systematic_indices = [start + i * k for i in range(sample_size)]
systematic_sample = population[systematic_indices]
# 简单随机抽样对比
random_sample = np.random.choice(population, size=sample_size, replace=False)
print("=== 系统抽样 ===")
print(f"总体大小: {population_size}")
print(f"样本大小: {sample_size}")
print(f"抽样间隔: {k}")
print(f"随机起点: {start}")
print(f"\n结果比较:")
print(f"总体均值: {np.mean(population):.2f}")
print(f"系统抽样均值: {np.mean(systematic_sample):.2f}")
print(f"简单随机抽样均值: {np.mean(random_sample):.2f}")
# 可视化
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.plot(population, alpha=0.7, label='总体数据')
plt.scatter(systematic_indices, systematic_sample, color='red', s=30, label='系统抽样点')
plt.xlabel('序号')
plt.ylabel('数值')
plt.title('系统抽样示意')
plt.legend()
plt.subplot(1, 3, 2)
plt.hist(systematic_sample, bins=15, alpha=0.7, label='系统抽样', color='red')
plt.axvline(np.mean(systematic_sample), color='red', linestyle='--')
plt.xlabel('数值')
plt.ylabel('频数')
plt.title('系统抽样分布')
plt.legend()
plt.subplot(1, 3, 3)
plt.hist(random_sample, bins=15, alpha=0.7, label='随机抽样', color='blue')
plt.axvline(np.mean(random_sample), color='blue', linestyle='--')
plt.xlabel('数值')
plt.ylabel('频数')
plt.title('随机抽样分布')
plt.legend()
plt.tight_layout()
plt.show()
return population, systematic_sample, random_sample
# 执行系统抽样
pop_sys, samp_sys, samp_rand = systematic_sampling()
优缺点:
- ✅ 实施简单,操作方便
- ✅ 样本分布均匀
- ✅ 可利用现成的有序名单或连续序列抽样,但仍需能够按顺序定位总体单位
- ❌ 如有周期性可能产生偏差
- ❌ 仅使用一个随机起点时,通常难以仅凭样本获得设计无偏的方差估计;误差估计需结合抽样设计或额外假设
4. 🏘️ 整群抽样 (Cluster Sampling)
特点:将总体分成若干群,随机选择若干群进行全面调查
适用场景:
- 缺乏完整的抽样框
- 调查成本考虑
- 地理位置分散的总体
def cluster_sampling():
"""整群抽样演示"""
# 模拟10个班级的学生成绩
np.random.seed(42)
n_clusters = 10
students_per_cluster = 30
# 每个班级有不同的平均水平
cluster_means = np.random.normal(75, 5, n_clusters)
population_data = []
for cluster_id in range(n_clusters):
cluster_scores = np.random.normal(cluster_means[cluster_id], 8, students_per_cluster)
for score in cluster_scores:
population_data.append({
'cluster_id': cluster_id,
'score': score
})
df_population = pd.DataFrame(population_data)
print("=== 整群抽样 ===")
print("各群体情况:")
cluster_stats = df_population.groupby('cluster_id')['score'].agg(['count', 'mean', 'std'])
print(cluster_stats)
# 整群抽样:随机选择3个班级
selected_clusters = np.random.choice(n_clusters, size=3, replace=False)
cluster_sample = df_population[df_population['cluster_id'].isin(selected_clusters)]
print(f"\n选中的群体: {selected_clusters}")
print(f"样本量: {len(cluster_sample)}")
# 简单随机抽样对比
total_population = len(df_population)
random_sample_size = len(cluster_sample)
random_indices = np.random.choice(total_population, size=random_sample_size, replace=False)
random_sample = df_population.iloc[random_indices]
print(f"\n结果比较:")
print(f"总体均值: {df_population['score'].mean():.2f}")
print(f"整群抽样均值: {cluster_sample['score'].mean():.2f}")
print(f"简单随机抽样均值: {random_sample['score'].mean():.2f}")
# 可视化
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
# 各群体分布
for cluster_id in range(n_clusters):
cluster_data = df_population[df_population['cluster_id'] == cluster_id]['score']
color = 'red' if cluster_id in selected_clusters else 'lightgray'
alpha = 0.8 if cluster_id in selected_clusters else 0.3
axes[0, 0].hist(cluster_data, alpha=alpha, color=color, bins=10)
axes[0, 0].set_title('各群体分布(红色为选中群体)')
axes[0, 0].set_xlabel('成绩')
axes[0, 0].set_ylabel('频数')
# 整群样本分布
axes[0, 1].hist(cluster_sample['score'], bins=15, alpha=0.7, color='red')
axes[0, 1].axvline(cluster_sample['score'].mean(), color='darkred', linestyle='--')
axes[0, 1].set_title('整群样本分布')
axes[0, 1].set_xlabel('成绩')
# 随机样本分布
axes[1, 0].hist(random_sample['score'], bins=15, alpha=0.7, color='blue')
axes[1, 0].axvline(random_sample['score'].mean(), color='darkblue', linestyle='--')
axes[1, 0].set_title('随机样本分布')
axes[1, 0].set_xlabel('成绩')
# 均值比较
methods = ['总体', '整群抽样', '随机抽样']
means = [df_population['score'].mean(), cluster_sample['score'].mean(), random_sample['score'].mean()]
axes[1, 1].bar(methods, means, color=['gray', 'red', 'blue'], alpha=0.7)
axes[1, 1].set_title('均值比较')
axes[1, 1].set_ylabel('均值')
plt.tight_layout()
plt.show()
return df_population, cluster_sample
# 执行整群抽样
pop_cluster, samp_cluster = cluster_sampling()
优缺点:
- ✅ 实施成本低
- ✅ 便于组织实施
- ✅ 通常不需要完整的个体抽样框,但需要群层面的抽样框,并能调查选中群内的个体
- ❌ 抽样误差较大
- ❌ 群内相似性影响代表性
🎯 抽样方法选择指南
📋 决策树
def choose_sampling_method():
"""帮助选择合适的抽样方法"""
questions_and_methods = [
{
"question": "总体是否有清晰的层次结构?",
"yes": "考虑分层抽样",
"no": "继续下一问题"
},
{
"question": "是否需要严格控制成本?",
"yes": "考虑整群抽样",
"no": "继续下一问题"
},
{
"question": "总体是否有明确的顺序?",
"yes": "考虑系统抽样",
"no": "使用简单随机抽样"
}
]
print("抽样方法选择指南:")
for i, qa in enumerate(questions_and_methods, 1):
print(f"{i}. {qa['question']}")
print(f" 是 → {qa['yes']}")
print(f" 否 → {qa['no']}")
print()
choose_sampling_method()
🏢 实际应用对照
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 市场调研 | 分层抽样 | 按年龄、收入分层,确保代表性 |
| 质量检查 | 系统抽样 | 生产线按时间顺序,系统抽样简便 |
| 民意调查 | 整群抽样 | 按地区分群,降低调查成本 |
| 医学实验 | 简单随机 | 减少选择偏差,提高可信度 |
| 用户满意度 | 分层抽样 | 按用户类型分层,全面了解 |
⚠️ 抽样注意事项
🚫 常见错误
- 样本量过小:导致结果不稳定
- 非随机抽样:产生系统性偏差
- 忽视无回应:回应率低影响代表性
- 抽样框不完整:遗漏重要群体
💡 最佳实践
- 确定明确的总体定义
- 选择合适的抽样方法
- 计算必要的样本量
- 考虑实际实施的可行性
- 评估和报告抽样误差
🔗 相关知识
#统计学 #抽样 #基础