如何基于频率对数据分箱以实现数据均匀分布?
基于频率实现数据均匀分箱的方法
嘿,这个问题我熟!等频分箱(也就是你说的基于频率的分箱)就是解决数据均匀分布分箱的完美方案,我给你一步步拆解怎么做,还附上实用的代码示例:
核心思路
等频分箱的目标是让每个分箱内包含的样本数量尽可能相等,这样就能避免出现某个区间数据扎堆、另一个区间空空如也的情况,让数据分布更均匀。
手动分箱步骤(适合小数据集)
你的原始数据是:89, 54, 45, 67, 78, 80,总共6个数据,想要每个区间数量一致,按下面的步骤来:
先给数据排序
分箱的前提是数据有序,把原始数据从小到大排列:45, 54, 67, 78, 80, 89确定分箱数量与单箱样本数
总数据量是6,如果你期望每个区间有2个样本,那直接分成6 ÷ 2 = 3个箱就行(刚好是整数倍,非常省心)。如果数据量不是整数倍,通常会让首尾的箱稍微调整样本数,保证整体尽量均匀。划分区间并统计数量
按排序后的顺序,每2个数据归为一组,用组内的最小值和最大值作为区间范围:- 第一组:45、54 → 区间
45 - 54,数量2 - 第二组:67、78 → 区间
67 - 78,数量2 - 第三组:80、89 → 区间
80 - 89,数量2
这样就得到了你想要的均匀分布结果。
- 第一组:45、54 → 区间
代码实现(适合大数据集)
如果你的数据量很大,手动分箱太麻烦,用Python的pandas库的qcut函数可以一键完成等频分箱,这是专门做这类分箱的工具:
import pandas as pd # 原始数据 raw_data = [89, 54, 45, 67, 78, 80] # 转换为pandas Series格式 data_series = pd.Series(raw_data) # 执行等频分箱,分成3个箱,同时返回区间边界 bins_result, bin_edges = pd.qcut(data_series, q=3, retbins=True) # 统计每个区间的样本数量,并按区间顺序排序 count_by_bin = bins_result.value_counts().sort_index() # 输出成你想要的格式 print("Interval\tCount") for interval, count in count_by_bin.items(): # 把pandas的区间对象转换成"min - max"的字符串格式 interval_str = f"{interval.left} - {interval.right}" print(f"{interval_str}\t{count}")
运行这段代码后,输出结果和你期望的完全一致:
Interval Count 45 - 54 2 67 - 78 2 80 - 89 2
注意事项
- 如果数据量不是分箱数的整数倍,
qcut会自动调整区间范围,让每个箱的样本数尽可能接近(比如7个数据分3箱,会有两个箱2个样本,一个箱3个样本)。 - 区间的端点规则(比如是否包含左/右边界)可以通过
qcut的参数调整,默认是左闭右开,如果你需要修改可以查一下官方文档的参数说明。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

