数据挖掘算法:啤酒与尿布的SQL实现

啤酒与尿布的算法属于电商领域中的购物篮分析,是用于挖掘不同商品之间的关联规则,进而进行商品推荐的常用算法。

以下为该算法的SQL简单实现。

1、源数据

select * from wx_tmp1;

数据格式如下

第一列为订单id,第二列为商品id,第三列为商品名称(真实数据,故擦掉),每个商品一条记录。

2、统计每两种商品同时被购买的次数

create table wx_tmp2 as
select a.skuid as skuid_a,b.skuid as skuid_b,
count(distinct a.orderid) as buy_cnt_together
from wx_tmp1 a join wx_tmp1 b on a.orderid=b.orderid
where a.skuid<>b.skuid
group by 1,2;

buy_cnt_together为两种商品同时购买的订单量

3、计算置信度、支持度及提升度

create table wx_tmp3 as
select a.product_a,a.product_b,a.buy_cnt_together,
b.buy_cnt buy_cnt_a,c.buy_cnt buy_cnt_b,d.order_cnt,
a.buy_cnt_together/d.order_cnt support, –支持度
a.buy_cnt_together/b.buy_cnt confidence, –置信度
a.buy_cnt_together/(b.buy_cnt*c.buy_cnt/d.order_cnt) lift, –提升度
(a.buy_cnt_together/b.buy_cnt+a.buy_cnt_together/c.buy_cnt)/2 kulc, –KULC 度量
a.buy_cnt_together/b.buy_cnt/(a.buy_cnt_together/c.buy_cnt) ir –不平衡比
from wx_tmp2 a join
(
select skuid,count(distinct orderid) buy_cnt
from wx_tmp1
group by 1
) b on a.product_a=b.skuid join
(
select skuid,count(distinct orderid) buy_cnt
from wx_tmp1
group by 1
) c on a.product_b=c.skuid join
(
select count(distinct orderid) order_cnt
from wx_tmp1
) d on 1=1;

结果如下

每一行即商品A和商品B的关联规则。

第一列为商品A,第二列为商品B,第三列为商品A与商品B同时购买的订单量,第四列为购买商品A的订单量,第五列为购买商品B的订单量,第六列为总的订单量,

第七列为支持度,即buy_cnt_together/order_cnt

第八列为置信度,即buy_cnt_together/buy_cnt_a

第九列为提升度,即buy_cnt_together/buy_cnt_a/(buy_cnt_b/order_cnt),可以用来评估商品A对商品B的提升程度。

如果提升度等于 1,说明两个商品没有任何关联。如果小于 1,说明两个商品是负相关的关系,意味着商品A的销量越高,可能商品B的销量越低。大于 1 才表示具有正相关的关系。一般当提升度大于 3 时,我们才认为挖掘出的关联规则是有价值的。

提升度是一种判断关联规则是否有效的简单手段,实际中受零事务(也即不包含商品A也不包含商品B的订单)的影响比较大。所以如果数据中含有的零事务数量较大,该度量则不合适使用。

第十列为KULC 度量,(buy_cnt_together/buy_cnt_a+buy_cnt_together/)/2,可以理解为两个置信度的平均值,取值0 ~ 1,值越大,联系越大,关系越大,是常用的判断关联规则是否有效的度量。同时该度量不受零事务数量影响。

第十一列为IR(不平衡比),即buy_cnt_b/buy_cnt_a,如果IR值太大,说明两个商品的关联关系非常不平衡,购买商品A的顾客很可能同时会买商品B,而购买了商品B的用户不太会再去买商品A。