You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:30:15