附注:不要问我为什么写这么快,是16年写的。
一、分析目的
I用户在某电商平台买了A,那么平台接下来应该给用户推荐什么,即用户在买了商品A之后接下来买什么的倾向性最大;
II应该把哪些商品在一起做捆绑销售。
二、理论介绍
数据挖掘中的经典算法之一:关联分析。关联分析内部理论又分为apriori , eclat , FP-Growth。这里采用apriori。关于他们的优缺点,适应条件什么的,只能等我看完理论再写了。
三、R包介绍
介绍将要用到的两个软件包:arules和arulesViz。
arules:关联规则的数字化生成,提供apriori和eclat这两种挖掘频繁项集和关联规则算法的实现函数。
arulesViz:实现关联规则的可视化。
四、数据准备
1.数据介绍:选取某电商平台2014年8月-2014年10月的交易数据,下图1所示,提取用户id、商品id两个字段;共204KB;csv格式。
图1 交易数据格式展示
2.数据形式
arules支持的数据输入格式有两种,transactions类型和tidLists类型。下图2和3所示。本文直接用read.transactions()读入图1的数据,通过设置参数,把数据转换成下图3的形式。具体可参考程序部分。
图2 transactions类型
图3 tidLists类型
五、运行结果及结论
数据概览如下图4:
结果显示,统计时间段内,购买最多的商品id分别是gtqf3891、fxr281 、kp1g3917、pzsm3922、h0i21683。所代表的商品分别是:
测试商品
xx正品全智能10000mah移动电源数显充电宝
xx宝纳庄园珍藏红葡萄酒双支礼盒装
xx乐薇丝桃红葡萄汽酒+汉凯沃德斯俱乐部起泡葡萄
xx先农氏 糙米·响水大米 2.5kg
这里发现一个问题,排在第一名的是测试商品,如果不分青红皂白的去和运营说,这段时间用户经常买的是"测试商品",就太囧了,所以算法不是全部,业务才是王道啊。
图4 数据概览
关联规则如下图5:
下面是设定支持度阈值为0.002,按照置信度大小排序的结果,糟糕的是此刻在家,连不上数据库,所以我只知道商品id,不知道其代表的真实商品,没有办法做具体分析。明天晚上补上这部分。从下图5可知如果用户在该平台购买了商品k2l34304,那么接下来用户最有可能购买的商品是fxr281,系统便可以自动给用户推荐fxr281,以达到提升销量的目的。
图5 关联规则
补充:查阅数据库后得知图5前四条规则分别代表着:
xx系列石英男表
xx正品全智能10000mah移动电源数显充电宝
测试商品3
测试商品
三星Class10-48MB/S TF卡 16GB
xx乐薇丝桃红葡萄汽酒+汉凯沃德斯俱乐部起泡葡萄
红米note 移动4G增强版
xx正品全智能10000mah移动电源数显充电宝
即购买商品“xx系列石英男表”的用户接下来最有可能购买的是“xx正品全智能10000mah移动电源数显充电宝”;而购买了商品“红米note 移动4G增强版”的用户接下来更倾向于购买“xx正品全智能10000mah移动电源数显充电宝”等,平台便可根据此信息采取相应的营销活动。
和商品fxr281捆绑销售的结果:
假设平台的运营者想要促销商品fxr281(xx正品全智能10000mah移动电源数显充电宝),那么我们便可找到fxr281的强关联商品,来作为捆绑商品。下图6显示商品k2l34304(xx系列石英男表)和u2xm6551(红米note 移动4G增强版)是商品fxr281的强关联商品,因此平台运营者可考虑将k2l34304或u2xm6551和fxr281捆绑起来共同销售,并制定一个合适的共同购买价格,从而对两种商品都产生促销效果。这一步在程序中我把maxlen设为2,控制lhs中仅包含一种商品,这是因为在实际的情形中,一般只将两种商品进行捆绑,而不是一堆商品。(maxlen设置为多少要根据实际业务来,我已经迫不及待想接手这样的项目了。)
图6 fxr281捆绑销售的结果
关联规则的可视化:
图7按照lift参数来看,关联性(颜色最深)最强的为:{trz83012} => {deyc3994}。
图7 可视化
六、程序
#载入关联分析的包 library(arules) #读入数据 dx=read.transactions("C:/Users/Thinkpad/Desktop/1.csv",format="single",sep=",",cols=c(1,2)) #展示数据的前一百行 inspect(dx[1:100,]) #看交易数据的总体情况 summary(dx) #随便给参数设置一个初始值,支持度设定为0.001,置信度设置为0.5,结果有11425条规则 rules0=apriori(dx,parameter= list(supp=0.001,conf=0.5,target="rules")) inspect(rules0[1:10,]) #不断调整支持度以得到前几条规则,支持度设为0.002,结果有12条规则 rules1=apriori(dx,parameter= list(supp=0.002,conf=0.5,target="rules")) rules1 inspect(rules1) #给定支持度阈值0.002,按置信度排序 rules.sorted_con=sort(rules1,by="confidence") inspect(rules.sorted_con) ###捆绑销售### ###想促销商品fxr281,找到与之有关的相关联规则##### rules2=apriori(dx,parameter=list(maxlen=2,supp=0.002,conf=0.5),appearance=list(rhs="fxr281",default="lhs")) inspect(rules2) ##########关联规则的可视化##### library(arulesViz) plot(rules1,method="grouped")
七、附注
关联分析一定要紧跟业务,如你发现了一条强关联规则:苹果→苹果醋。你非常开心激动地想把他推荐给运营,但运营告诉你上个月他们做了促销,买苹果就送苹果醋。所以.....你就悲剧了,你的老大不灭了你才怪。
end!