整群随机抽样是将总体划分为若干个互不重叠的“群”然后随机抽取其中的若干个群对抽中的群里的所有单位进行调查。它的典型应用场景是城市居民健康调查将城市划分为若干个社区群随机抽取几个社区然后对这几个社区的所有居民进行健康调查。全国多所学校的学生视力普查将全国的学校作为“群”随机抽取几十所学校然后对这些学校的所有学生进行视力检查。下面是Python实现的一个整群随机抽样示例。# 创建模拟的群组数据假设客户按地区分组 regions [北京, 上海, 广州, 深圳, 杭州, 成都, 武汉, 西安] customer_data[region] np.random.choice(regions, len(customer_data)) print(各地区客户数量) print(customer_data[region].value_counts()) # 整群随机抽样随机选择3个地区调查这些地区的所有客户 selected_regions np.random.choice(regions, size3, replaceFalse) cluster_sample customer_data[customer_data[region].isin(selected_regions)] print(f\n抽中的地区{selected_regions}) print(整群随机抽样结果) print(f样本量{len(cluster_sample)}) print(f样本平均收入{cluster_sample[income].mean():.2f}) print(f总体平均收入{customer_data[income].mean():.2f}) # 运行结果 各地区客户数量 region 武汉 141 广州 133 成都 132 杭州 124 北京 120 上海 118 深圳 116 西安 116 Name: count, dtype: int64 抽中的地区[杭州 深圳 武汉] 整群随机抽样结果 样本量381 样本平均收入50319.75 总体平均收入50863.12 整群随机抽样得到的平均收入与总体数据的比较如下图它们的值非常接近。4. 随机抽样综合比较为了更直观地感受不同抽样方法带来的差异我们从同一个数据集中使用不同的方法抽取大约相同规模的样本来比较各种抽样方法。# 创建更复杂的数据集来演示各种抽样方法 np.random.seed(42) company_data pd.DataFrame( { employee_id: range(1, 1001), department: np.random.choice( [技术, 销售, 市场, 人事, 财务], 1000, p[0.3, 0.25, 0.2, 0.15, 0.1], ), salary: np.random.normal(80000, 20000, 1000).astype(int), experience: np.random.exponential(5, 1000).astype(int) 1, } ) # 修正可能的负工资 company_data[salary] company_data[salary].clip(lower30000) print(公司员工数据概况) print(f总员工数{len(company_data)}) print(f平均工资{company_data[salary].mean():.2f}) print(\n各部门人数) print(company_data[department].value_counts()) # 应用不同抽样方法 samples { 简单随机抽样: company_data.sample(n100, random_state42), 分层随机抽样: company_data.groupby(department) .apply(lambda x: x.sample(frac0.1, random_state42), include_groupsFalse) .reset_index(), 系统随机抽样: systematic_sampling(company_data, 10), 整群随机抽样: company_data[ company_data[department].isin( np.random.choice(company_data[department].unique(), 2, replaceFalse) ) ], } # 比较结果 comparison pd.DataFrame( { 方法: [总体] list(samples.keys()), 样本量: [len(company_data)] [len(sample) for sample in samples.values()], 平均工资: [company_data[salary].mean()] [sample[salary].mean() for sample in samples.values()], 工资误差: [0] [ abs(sample[salary].mean() - company_data[salary].mean()) for sample in samples.values() ], } ) print(\n各种抽样方法比较) print(comparison) # 运行结果 公司员工数据概况 总员工数1000 平均工资82015.16 各部门人数 department 技术 319 销售 240 市场 198 人事 143 财务 100 Name: count, dtype: int64