如何一次性创建多个与原数据集分布一致的±100行分层样本?
核心思路
先锁定原数据集的Id分布比例,再按比例给每个样本包分配对应Id的行数,最后从原数据中抽取对应数据,保证每个样本包的分布和原数据一致,同时行数控制在100±10(结合你提供的示例图,默认围绕100行波动;若实际需求是±100的大范围,调整目标行数区间即可)。
具体步骤
第一步:统计原数据Id分布占比
先算出每个Id(a、b、c)在总数据中的占比,比如总共有N行,a有Na行,占比就是p_a = Na / N,同理算出p_b、p_c。这是保证样本分布匹配的核心基础,必须优先完成。第二步:确定每个样本包的目标行数
按需求设定每个样本包的行数范围(比如90-110行),可以随机在这个范围内选一个数作为当前样本包的目标总行数,也可以固定用100行、允许少量波动。第三步:按占比分配每个Id的行数
用样本包目标总行数乘以各Id的占比,得到每个Id的目标行数。这里需要取整,比如目标102行、p_a=40%,算出来是40.8,可以取42;p_b=30%是30.6,取31;剩下的102-42-31=29分配给c。取整时尽量贴合原占比,若总和和目标行数有差值,优先调整占比最高或最低的Id的行数,保证整体分布偏差最小。第四步:抽取对应数据
对每个Id的数据单独打乱顺序,然后按分配的行数依次抽取。比如把所有a的数据打乱后,分成若干份,每份对应样本包需要的a行数;b、c同理。这样能避免重复抽取,效率也更高。如果数据集不大,也可以每次抽取后把已选数据从原集中移除,直到所有数据分配完。第五步:处理剩余数据
最后如果剩下的数据不够组成一个完整的样本包(比如只剩50行),可以直接把这些剩余数据合并成一个样本包,或者把它们按比例拆分到之前的样本包里(如果允许样本包行数波动更大的话)。
示例参考(结合你提供的图)
原数据a占40%、b占30%、c占30%:
- 样本包1(100行):40条a、30条b、30条c
- 样本包2(102行):42条a、31条b、29条c
- 后续样本包依此逻辑分配,直到所有数据处理完毕。
内容的提问来源于stack exchange,提问作者luisvenezian

