分析背景:
典型的啤酒与纸尿裤,购物篮分析,能够帮助商家在数据层面了解不同商品之间的关联性。 购买A商品时有多大可能去购买B商品?不同商品不同的摆放组合是否能够提高商品动销率?
理论基础:
典型的购物篮分析通过三个指标来判断不同商品之间是否有关联,关联是否显著,能否互相提升购买率。如下:
支持度:
同时购买A和B的订单数 / 总订单数
置信度:
同时购买A和B的订单数 / 购买A的订单数
提升度:
支持度 / (购买A的订单数/总购买订单数) * (购买B的订单数/总购买订单数)
分析案例:
数据源:Tableau自带数据"示例-超市"
分析思路:
若想求得三个指标,需要计算出:订单总数、A商品订单数、B商品订单数、同时购买AB商品的订单数
实战
Step 1:连接数据到Navicat,观察数据
我们只需要 订单ID和子类别这两列
SQL
create view market_order as
(
select 订单ID,子类别
from 订单
group by 订单ID,子类别
)
-- 通过group by对订单ID和子类别去重
-- 数据从10009条变为8645条
部分结果如下:
接着,我们根据分析目的可知,若一个订单中只包含一个子类别,不满足关联分析的条件,所以应剔除此类数据。
SQL
create view view_order as
(
select
订单ID,
count(子类别) 不同类别购买数量
from
market_order
group by 订单ID
having count(子类别) > 1
)
部分结果如下:
Step 2:
本例中,只对两种类别(商品)之间的关联做探究。
对于每笔订单里购买类别数大于2的商品类别之间有多种组合的可能性。
比如某个客户在一笔订单里分别买了 A B C三种商品,那么我们分析的就是AB AC BC之间的关联性,所以需要列出总共的商品可以组合的可能。
数学角度来讲,就是两两组合共有多少种可能,排列组合就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> C n 2 C_n^2 </math>Cn2
公式为: <math xmlns="http://www.w3.org/1998/Math/MathML"> C n 2 = n ∗ ( n − 1 ) . . . ( n − 2 + 1 ) 2 ! C_n^2 = \frac{n*(n-1)...(n-2+1)}{2!} </math>Cn2=2!n∗(n−1)...(n−2+1)
简化为: <math xmlns="http://www.w3.org/1998/Math/MathML"> n ( n − 1 ) 2 \frac{n(n-1)}{2} </math>2n(n−1)
SQL
select
订单ID,
不同类别购买数量,
round((不同类别购买数量*(不同类别购买数量-1))/2,0) as 两两组合数量
from
view_order
order by 不同类别购买数量
部分结果如下:
Step 3:求出同时购买A和B的订单数量
由上步骤可知每个订单所有两两组合的数量,下面展示出每笔订单中这些两两组合
SQL
select
t1.订单ID,
t1.子类别 as A,
t2.子类别 as B
from
market_order as t1
inner join
market_order as t2
where
t1.订单ID = t2.订单ID
and
t1.子类别 > t2.子类别
部分结果如下:
对每个两两组合进行聚合计算,求出同时购买A和B的订单数量
SQL
select
t1.子类别 as A,
t2.子类别 as B,
count(*) as 订单总数
from
market_order as t1
inner join
market_order as t2
where
t1.订单ID = t2.订单ID
and
t1.子类别 > t2.子类别
group by A,B
order by 3 desc
部分结果如下:
Step 4:计算含有各类别的订单数
SQL
select
子类别 as 类别,
count(distinct 订单ID) as 类别订单数
from
订单
where 子类别 is not null
group by 子类别
部分结果如下:
这个表既可以当作A类别的商品订单表,也可以当作B的,因为所有的商品子类别都在这张表里
Step 5:合并表
表中需包括字段:
A类别 B类别 同时购买AB的订单数 含有A的订单数 含有B的订单数 总订单数
SQL
create view view_cal as
(
select
A,
B,
同时购买AB的订单数,
a.类别订单数 as A订单数,
b.类别订单数 as B订单数,
(select count(distinct 订单ID) as 订单总数 from 订单) as 订单总数
from
(
select
t1.子类别 as A,
t2.子类别 as B,
count(distinct t1.订单ID) as 同时购买AB的订单数
from
market_order as t1
left join
market_order as t2
on t1.订单ID = t2.订单ID
where t1.子类别 > t2.子类别
group by 1,2
) ab
left join
(
select
子类别 as 类别,
count(distinct 订单ID) as 类别订单数
from
订单
where 子类别 is not null
group by 子类别
) a
on ab.A = a.类别
left join
(
select
子类别 as 类别,
count(distinct 订单ID) as 类别订单数
from
订单
where 子类别 is not null
group by 子类别
) b
on ab.B = b.类别
)
部分结果如下:
Step 6:计算指标
SQL
select
A,
B,
concat(round(同时购买AB的订单数 / 订单总数,2)*100,'%') as 支持度,
concat(round(同时购买AB的订单数 / A订单数,2)*100,'%') as 置信度,
round((同时购买AB的订单数 / 订单总数) / ((A订单数 / 订单总数)*(B订单数 / 订单总数)),1) as 提升度
from
view_cal
一般将三个指标的值定为 10% 40% 1
若三个指标大于给定的阈值,我们有理由相信两件商品之间存在关联并且能够互相提升购买率。
但在本例中,没有符合此条件的商品,所以通过求三个指标的均值,然后选出同时满足在三个均值之上的商品组合。
求均值:
SQL
select
round(avg(支持度),2),
round(avg(置信度),2),
round(avg(提升度),2)
from
(
select
A,
B,
concat(round(同时购买AB的订单数 / 订单总数,2)*100,'%') as 支持度,
concat(round(同时购买AB的订单数 / A订单数,2)*100,'%') as 置信度,
round((同时购买AB的订单数 / 订单总数) / ((A订单数 / 订单总数)*(B订单数 / 订单总数)),1) as 提升度
from
view_cal
) a
根据均值筛选
SQL
select
*
from
(
select
A,
B,
concat(round(同时购买AB的订单数 / 订单总数,2)*100,'%') as 支持度,
concat(round(同时购买AB的订单数 / A订单数,2)*100,'%') as 置信度,
round((同时购买AB的订单数 / 订单总数) / ((A订单数 / 订单总数)*(B订单数 / 订单总数)),1) as 提升度
from
view_cal
) a
where
支持度 >= 4.09
and
置信度 >= 22.68
and
提升度 >= 1.22
如下为所有符合条件的商品组合:
结论
商品关联分析是帮助商家分析产品的有利手段,若运用得当,能显著提升产品动销率,很像是线下零售的"推荐算法"。
当然除了通过将商品组合销售之外,商家还需考虑外在因素以及顾客的消费心理等问题,