整群随机抽样
整群随机抽样是将总体划分为若干个互不重叠的“群”,然后随机抽取其中的若干个群,对抽中的群里的所有单位进行调查。
它的典型应用场景是:
- 城市居民健康调查:将城市划分为若干个社区(群),随机抽取几个社区,然后对这几个社区的所有居民进行健康调查。
- 全国多所学校的学生视力普查:将全国的学校作为“群”,随机抽取几十所学校,然后对这些学校的所有学生进行视力检查。
下面是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, size=3, replace=False) 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(lower=30000) 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(n=100, random_state=42), "分层随机抽样": company_data.groupby("department") .apply(lambda x: x.sample(frac=0.1, random_state=42), include_groups=False) .reset_index(), "系统随机抽样": systematic_sampling(company_data, 10), "整群随机抽样": company_data[ company_data["department"].isin( np.random.choice(company_data["department"].unique(), 2, replace=False) ) ], } # 比较结果 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 '''