数据分箱

样例数据:我们创建一张hive表 t_box,包含两列(id,val), 其中id为1~1000,val 为随机数浮点数。

分箱(Binning)是一种数据预处理技术,它将连续的数值数据划分为离散的区间或“箱子”。这种方法在数据分析、统计学和机器学习中非常常见,尤其是在处理大规模数据集时。在数仓或数据分析是常用以下三种分箱方式

1.基于规则的分箱

基于规则的分箱是一种数据预处理方法,它根据预先定义的规则或标准将数据点分配到不同的箱子(或区间)中。这种方法通常涉及到对数据的业务理解和特定领域的知识。以下是基于规则分箱的一些关键特点和步骤:

特点:

  • 自定义规则:分箱的规则是根据业务需求、数据分析目标或领域专家的建议来定义的。这些规则可以是简单的阈值,也可以是复杂的逻辑表达式。
  • 灵活性:基于规则的分箱允许用户根据实际情况灵活地设计分箱逻辑,这在处理具有特定业务含义的数据时非常有用。
  • 可解释性:由于分箱规则是明确的,因此结果具有较高的可解释性,便于向非技术利益相关者解释。

我们假设规则:(00.4] 为1组,(0.40.6]为2组,(0.6~1)为3组

实现SQL:

select 
id,
val.
case when val >0 and val <= 0.4 then 1
     when val >0.4 and val <= 0.6 then 2
     when val >0.6 and val <1 then 3 end as box_indx
from t_box

看下样例

01

根据分箱box_indx统计

with t as (
select 
id,
val,
case when val >0 and val <= 0.4 then 1
     when val >0.4 and val <= 0.6 then 2
     when val >0.6 and val <1 then 3 end as box_indx
from t_box)
select
box_indx,
count(1)
from t
group by box_indx

查询结果

02

2.等距分箱

等距分箱是一种将连续数值数据分布到固定数量的等间隔区间的方法。在等距分箱中,数据的整个范围被均匀地分割成若干个箱子,每个箱子的宽度(即间隔)是相同的。

等距分箱的关键特点:

  1. 均匀分割:数据的范围(最大值和最小值之间的差)被均匀地分割成n个箱子,每个箱子的宽度是相同的。
  2. 边界确定:箱子的边界是基于数据的实际值计算出来的,通常是通过取最大值和最小值的平均值来确定中间点,然后根据这个中间点向两边扩展。
  3. 数据分配:每个数据点根据其值被分配到相应的箱子中。如果数据点的值正好等于某个箱子的边界值,它通常会被分配到该边界值所在的箱子。

我们假设规则:分为3组

实现SQL

select 
id,val,
ceil(if((val-min_val)=0,1,(val-min_val)/((max_val-min_val)/3))) as box_indx
from t_box
join 
(select
min(val) as min_val,
max(val) as max_val
from t_box
) t1

样例结果

03

数据统计

with t as (
select 
id,val,
ceil(if((val-min_val)=0,1,(val-min_val)/((max_val-min_val)/3))) as box_indx
from t_box
join 
(select
min(val) as min_val,
max(val) as max_val
from t_box
) t1
)
select
box_indx,
count(1)
from t
group by box_indx

统计结果

04

3.等频分箱

等频分箱是将数据集划分为具有相同数量的区间或“箱子”。这种方法的目标是确保每个箱子中包含的数据点数量大致相同,而不是像等距分箱那样将数据范围均匀分割。等频分箱在处理具有不同密度区域的数据集时特别有用,因为它可以更好地反映数据的实际分布。

等频分箱的关键特点:

  1. 数据点均匀分布:每个箱子中的数据点数量相同或非常接近,这有助于在数据可视化和分析中保持一致性。
  2. 边界动态确定:箱子的边界不是预先定义的,而是根据数据点的实际分布动态计算的。
  3. 适用于偏斜分布:等频分箱可以很好地处理偏斜分布的数据,因为它不受数据范围的影响,而是关注数据点的分布。

我们假设规则:分为3组

实现SQL

select
id,val,ntile(3)over(order by val asc) as box_indx
from t_box

样例结果

05

数据统计

with t as (
select
id,val,ntile(3)over(order by val asc) as box_indx
from t_box)
select
box_indx,
count(1)
from t
group by box_indx

查询结果

06

建表语句及数据插入语句

--建表语句
create table if not exists t_box (
  id bigint,
  val double
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS orc;
--数据插入
insert into t_box(id,val)
select ind+1 as id,rand() as val from(select split(space(999),'') as a) t lateral view posexplode(a) tt as ind,space_val;