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

分析背景:

典型的啤酒与纸尿裤,购物篮分析,能够帮助商家在数据层面了解不同商品之间的关联性。 购买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

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

结论

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

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

相关推荐
weixin_4493108428 分钟前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
CodingBrother29 分钟前
MySQL 和 PostgreSQL 的使用案例
mysql·adb·postgresql
RestCloud1 小时前
ETLCloud异常问题分析ai功能
人工智能·ai·数据分析·etl·数据集成工具·数据异常
standxy1 小时前
如何将钉钉新收款单数据高效集成到MySQL
数据库·mysql·钉钉
Narutolxy3 小时前
MySQL 权限困境:从权限丢失到权限重生的完整解决方案20241108
数据库·mysql
Venchill3 小时前
安装和卸载Mysql(压缩版)
数据库·mysql
Humbunklung3 小时前
一种EF(EntityFramework) MySQL修改表名去掉dbo前缀的方法
数据库·mysql·c#
Aloudata4 小时前
NoETL自动化指标平台为数据分析提质增效,驱动业务决策
大数据·数据分析·指标平台·指标体系
C吴新科8 小时前
MySQL入门操作详解
mysql
Ai 编码助手10 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql