关联规则之购物篮分析

购物篮分析常用于许多实体商店和在线零售的推荐系统,通过关联规则,可以将经常一起购买的商品进行组合,实现销量的提升。


关联规则中有三个非常重要的指标:支持度、可信度和提升度。

支持度,指所有项集中,同时购买X和Y的可能性,数学表达式可表示为:

640?wx_fmt=png

该指标可以为频繁项集指定一个阈值,从而剔除出现频率比较低的项集。


置信度,表示关联规则X-->Y中,发生X的前提下也出现了Y,其实就是一种条件概率,其数学表达式为:

640?wx_fmt=png
该指标可控制哪些项集为强关联项集,即购买X的情况下有多大把握购买Y。


提升度,表示出现X的条件下同时出现Y的可能性与没有任何条件下出现Y的可能性之比,可用数学表达式表示为:

640?wx_fmt=png
该指标是置信度的补充用来判断X与Y之间是否独立,不独立的话关联性有多强。一般提升度等于1时,表示X与Y之间是独立的,即X的出现对Y的出现没有派上仍然作用;提升度大于1,且值越大说明X对Y的影响越大,关联性也就越强

有关更多相关的详细信息可参考本公众号《基于R语言的关联规则实现》一文。(http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=400031123&idx=1&sn=b15fe3380d959494e7a160d3ccefc1dd#rd


关联规则算法的背后有一条非常重要的原则,即一个频繁项集的子集也一定是频繁的,换句话说,一个项集如果不是频繁项集,其超项集也一定不是频繁项集。利用该性质可以大大减少算法对数据的遍历次数


R语言中有关关联规则算法的实现,函数语法和参数含义如下:

apriori(data, parameter = NULL, appearance = NULL,

control = NULL)


data为apriori函数所能接受的“交易”格式数据,可以通过as()函数将常见的二元矩阵、数据框进行转换;

parameter以列表的形式存储模型所需的支持度、置信度、每个项集所含项数的最大值/最小值和输出结果类型等参数,默认情况下支持度为0.1,置信度为0.8,项集中最大项数为10,最小项数为1,输出关联规则/频繁项集类型的结果

appearance可为先决条件X和关联结果Y指定明确的项集(一般是分析人员感兴趣的项集),默认情况下不为X和Y指定某些项集

control用来控制函数性能,如对项集进行升序或降序,生成算法运行的报告进程等。


应用:

本案例数据来自真实的超市购物数据,包含了一个月内产生的9835条交易,具体数据可至后文的链接中下载

由于超市的购物篮数据属于典型的事务型数据,其存储格式不同于常见的数据框格式,具体如下图所示:

0?wx_fmt=png

数据集中每一行表示每一笔交易,而每一行中的元素则表示交易中所包含的商品,这里就没有字段或变量的概念。对于这样的数据集,需要进行0-1处理,即将事务型数据转换为稀疏矩阵,使得数据的每一行表示每一笔交易,而每一列则表示商品名称,矩阵中的元素用0-1表示,0表示交易记录中不存在某种商品,相反1则表示交易中出现某种商品。


使用arules包中的read.transactions()函数读取事务型数据集

library(arules)

读取数据

transactions <- read.transactions(file = file.choose(), format = 'basket', sep = ',')

使用inspect函数查看前6条交易数据

inspect(transactions[1:6])

0?wx_fmt=png

使用summary()函数查看交易数据的概览信息

summary(transactions)

0?wx_fmt=png

结果中包含4部分结果:

1)说明交易数据包含9835条交易记录,涉及到169种商品

2)列出了出现在购物篮中最为频繁的几种商品,如whole milk(全职牛奶)出现在2513个交易记录中

3)列出购物篮中包含商品数量的交易条数,如有2159条交易仅购买1种商品,仅有1条交易购买32种商品

4)对购物篮中交易的商品数量进行汇总,包括五数和均值,Mean表示所有购物篮中平均含有4~5件商品


通过itemFrequencyPlot()函数查看前N种商品的支持度

绝对数量显示

itemFrequencyPlot(transactions, type = 'absolute', topN = 10 )

0?wx_fmt=png相对数量显示(支持度)

itemFrequencyPlot(transactions, type = 'relative', topN = 10 )

0?wx_fmt=png

构建Apriori模型

rules <- apriori(data = transactions)

rules

0?wx_fmt=png
如果使用Apriori算法的默认参数设置时将产生0条规则,由于默认的支持度为10%,可信度为80%,对于当前的9835条交易记录来说过高,使得没有这样的交易满足这两个条件。故需要人为调整支持度和可信度,这里不妨将支持度设置为1%,即认为某种商品在购物篮中至少出现98次,可信度设置为30%,即认为同时出现某几种商品组合的概率为30%。

rules2 <- apriori(data = transactions, parameter = list(support = 0.01, confidence = 0.3, minlen = 2))

rules2

0?wx_fmt=png
经过调整后,结果产生125条规则,使用inspect()函数查看其中的前6条规则

inspect(rules2[1:6])

0?wx_fmt=png
lhs表示规则左手边的商品,即可以认为是条件概率中的已知商品;rhs表示规则右手边的商品,可以认为是在已知条件商品下,购买右手边商品;support、confidence、lift表示lhs=>rhs对应的支持度、可信度和提升度。

使用summary()函数查看125条规则的概览情况

summary(rules2)

0?wx_fmt=png

1)从规则长度分布可知,125条规则中,有69条规则包含2种商品的组合和56条规则包含3种商品的组合

2)125条规则中,平均每条规则包含2.45种商品的组合(包含更多种商品组合的五数和平均值解读起来更有意义)

3)125条规则中支持度、可信度和提升度的五数及均值


一般需要根据实际场景和业务,搜寻出比较可行的规则,排除干扰或明显无意义的规则,可以按支持度、可信度和提升度的排序,快速地查找出排名靠前的规则。

按支持度排序的前6个规则

inspect(sort(rules2, by = list('support'))[1:6])

按可信度排序的前6个规则

inspect(sort(rules2, by = list('confidence'))[1:6])

按提升度排序的前6个规则

inspect(sort(rules2, by = list('lift'))[1:6])

0?wx_fmt=png

问题:

曾经有网友向我提问,Apriori算法仅产生右手边(rhs)商品为1,能否生成右手边(rhs)商品为多个的关联规则算法?我试图在百度和Google中搜索,却没有想要的结果,希望读者朋友知道这方面解决方案的能分享出来,或是告知我,我来整理一下分享给大家。


文中数据集和脚本下载地址:

http://yunpan.cn/curduCTpqxXUV 访问密码 84eb


参考资料:

机器学习与R语言

数据挖掘:R语言实战

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值