Python中分层抽样样本量不符预期问题求助
问题原因及解决办法
原因分析
你用groupby+sample(frac=0.05)做分层抽样时,大量小样本量的分层抽不到任何数据。因为pandas的sample(frac)会把抽样数量向下取整,比如某层只有10行,0.05的比例对应0.5行,实际抽不到样本;某层有19行,0.05比例对应0.95行,同样抽不到。你的数据集里应该存在很多这类小规模分层,最终导致总样本量远低于预期。
而简单随机抽样是对整个数据集按比例抽取,总规模足够大,能得到符合预期的整数样本量,所以不会出现这个问题。
解决办法
1. 按固定总样本量分配到各层
先计算目标总样本量,再按各层规模占比分配样本数,最后按数量抽样(避免小分层抽不到数据):
# 计算总目标样本量 total_sample = int(len(DatosPoblacionales) * TamañoMuestral) # 统计各层规模,分配对应样本数 stratum_sizes = DatosPoblacionales.groupby(NombreDeEstrato).size() sample_sizes = (stratum_sizes / stratum_sizes.sum() * total_sample).round().astype(int) # 处理样本分配数超过层大小的情况(直接取整个层) sample_sizes = sample_sizes.where(sample_sizes <= stratum_sizes, stratum_sizes) # 分层抽样逻辑 def sample_stratum(group): stratum_name = group.name n = sample_sizes[stratum_name] return group.sample(n=n, replace=False) DataFrameMAE = DatosPoblacionales.groupby(NombreDeEstrato, group_keys=False).apply(sample_stratum)
2. 合并小规模分层
把样本量低于阈值(比如20)的分层合并成“其他”层,再对合并后的分层按比例抽样:
# 标记小分层并合并 stratum_counts = DatosPoblacionales[NombreDeEstrato].value_counts() small_strata = stratum_counts[stratum_counts < 20].index DatosPoblacionales['stratum_merged'] = DatosPoblacionales[NombreDeEstrato].replace(small_strata, '其他') # 基于合并后的分层抽样 DataFrameMAE = DatosPoblacionales.groupby('stratum_merged', group_keys=False).apply(lambda x:x.sample(frac=TamañoMuestral))
3. 允许分层内有放回抽样(按需选择)
如果研究允许有放回抽样,给每个层的sample加上replace=True,这样即使层规模很小也能抽到样本:
DataFrameMAE = DatosPoblacionales.groupby(NombreDeEstrato, group_keys=False).apply(lambda x:x.sample(frac=TamañoMuestral, replace=True))
内容的提问来源于stack exchange,提问作者Sebastian Vazquez-Ferrero
相关产品推荐
相关产品推荐

