【实战MySQL实现商品关联分析(购物篮分析)

2024年 4月 23日 78.5k 0

分析背景:

典型的啤酒与纸尿裤,购物篮分析,能够帮助商家在数据层面了解不同商品之间的关联性。
购买A商品时有多大可能去购买B商品?不同商品不同的摆放组合是否能够提高商品动销率?

理论基础:

典型的购物篮分析通过三个指标来判断不同商品之间是否有关联,关联是否显著,能否互相提升购买率。如下:

支持度:

同时购买A和B的订单数 / 总订单数

置信度:

同时购买A和B的订单数 / 购买A的订单数

提升度:

支持度 / (购买A的订单数/总购买订单数) * (购买B的订单数/总购买订单数)

分析案例:

数据源:Tableau自带数据"示例-超市"

分析思路:

若想求得三个指标,需要计算出:订单总数、A商品订单数、B商品订单数、同时购买AB商品的订单数

实战

Step 1:连接数据到Navicat,观察数据

我们只需要 订单ID和子类别这两列
image.png

create view market_order as
(
select 订单ID,子类别
from 订单
group by 订单ID,子类别
)
-- 通过group by对订单ID和子类别去重
-- 数据从10009条变为8645条

部分结果如下:

image.png

接着,我们根据分析目的可知,若一个订单中只包含一个子类别,不满足关联分析的条件,所以应剔除此类数据。

create view view_order as
(
select
	订单ID,
	count(子类别) 不同类别购买数量
from
	market_order
group by 订单ID
having count(子类别) > 1
)

部分结果如下:

image.png

Step 2:

本例中,只对两种类别(商品)之间的关联做探究。

对于每笔订单里购买类别数大于2的商品类别之间有多种组合的可能性。

比如某个客户在一笔订单里分别买了 A B C三种商品,那么我们分析的就是AB AC BC之间的关联性,所以需要列出总共的商品可以组合的可能。

数学角度来讲,就是两两组合共有多少种可能,排列组合就是Cn2C_n^2Cn2​

公式为:Cn2=n∗(n−1)...(n−2+1)2!C_n^2 = frac{n*(n-1)...(n-2+1)}{2!}Cn2​=2!n∗(n−1)...(n−2+1)​

简化为:n(n−1)2frac{n(n-1)}{2}2n(n−1)​

select 
    订单ID,
    不同类别购买数量,
    round((不同类别购买数量*(不同类别购买数量-1))/2,0) as 两两组合数量
from
	view_order
order by 不同类别购买数量 

部分结果如下:

image.png

Step 3:求出同时购买A和B的订单数量

由上步骤可知每个订单所有两两组合的数量,下面展示出每笔订单中这些两两组合

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.子类别

部分结果如下:

image.png

对每个两两组合进行聚合计算,求出同时购买A和B的订单数量

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

部分结果如下:

image.png

Step 4:计算含有各类别的订单数

select
	子类别 as 类别,
	count(distinct 订单ID) as 类别订单数
from
	订单
where 子类别 is not null
group by 子类别

部分结果如下:

image.png

这个表既可以当作A类别的商品订单表,也可以当作B的,因为所有的商品子类别都在这张表里

Step 5:合并表

表中需包括字段:

A类别 B类别 同时购买AB的订单数 含有A的订单数 含有B的订单数 总订单数

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.类别
)

部分结果如下:

image.png

Step 6:计算指标

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

image.png

一般将三个指标的值定为 10% 40% 1

若三个指标大于给定的阈值,我们有理由相信两件商品之间存在关联并且能够互相提升购买率。

但在本例中,没有符合此条件的商品,所以通过求三个指标的均值,然后选出同时满足在三个均值之上的商品组合。

求均值:

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

image.png

根据均值筛选

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

如下为所有符合条件的商品组合:

image.png

结论

商品关联分析是帮助商家分析产品的有利手段,若运用得当,能显著提升产品动销率,很像是线下零售的“推荐算法”。

当然除了通过将商品组合销售之外,商家还需考虑外在因素以及顾客的消费心理等问题,

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论