【实战】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

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

结论

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

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

相关推荐
羊小猪~~1 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
看山还是山,看水还是。1 小时前
MySQL 管理
数据库·笔记·mysql·adb
momo小菜pa1 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
小宇成长录2 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.3 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
权^4 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
凭栏落花侧6 小时前
决策树:简单易懂的预测模型
人工智能·算法·决策树·机器学习·信息可视化·数据挖掘·数据分析
万事大吉CC7 小时前
mysql单表查询·3
数据库·mysql
bin91538 小时前
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化