背景:

我们在点外卖的场景中,经常会看到菜品A+菜品B+菜品C的组合,这种组合的产生主要是为了节省用户的点餐时间,方便客户从海量菜品中找到理想菜品,通过引入Apriori推荐算法,得到菜品之间的关联度指标,找到最有可能的"啤酒和尿不湿"的组合,以供运营可以为商家的菜品组合套餐作为参考。

1.Apriori算法简介

选择物品间的关联规则也就是要寻找物品之间的潜在关系。要寻找这种关系,有两步,以超市为例

找出频繁一起出现的物品集的集合,我们称之为频繁项集。比如一个超市的频繁项集可能有{{啤酒,尿布},{鸡蛋,牛奶},{香蕉,苹果}}
在频繁项集的基础上,使用关联规则算法找出其中物品的关联结果。
简单点说,就是先找频繁项集,再根据关联规则找关联物品。
关联分析的几个概念
1.1 支持度
支持度(Support):支持度可以理解为物品当前流行程度。计算方式是:
支持度 = (包含物品A的记录数量) / (总的记录数量)
用上面的超市记录举例,一共有五个交易,牛奶出现在三个交易中,故而{牛奶}的支持度为3/5。{鸡蛋}的支持度是4/5。牛奶和鸡蛋同时出现的次数是2,故而{牛奶,鸡蛋}的支持度为2/5。
1.2 置信度
置信度(Confidence):置信度是指如果购买物品A,有较大可能购买物品B。计算方式是这样:
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
举例:我们已经知道,(牛奶,鸡蛋)一起购买的次数是两次,鸡蛋的购买次数是4次。那么Confidence(牛奶->鸡蛋)的计算方式是Confidence(牛奶->鸡蛋)=2 / 4。
1.3提升度
提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少。计算方式是:
提升度( A -> B) = 置信度( A -> B) / (支持度 A)
举例:上面我们计算了牛奶和鸡蛋的置信度Confidence(牛奶->鸡蛋)=2 / 4。牛奶的支持度Support(牛奶)=3 / 5,那么我们就能计算牛奶和鸡蛋的支持度Lift(牛奶->鸡蛋)=0.83
当提升度(A->B)的值大于1的时候,说明物品A卖得越多,B也会卖得越多。而提升度等于1则意味着产品A和B之间没有关联。最后,提升度小于1那么意味着购买A反而会减少B的销量。
更多关于Apriori的信息,可以查阅相关文献,这种文献现在挺多的。

2.基于Python的实现

第一步,首先要清洗菜品数据,有很多菜品因为规格不一样,而成为了一个单独的sku,例如衬衫XL,衬衫L是两只sku,但是其实是同一个spu,对此我们进行一部分数据清洗,
这里需要用 到正则表达式,
另外,由于商家的标准sku里面会有米饭,可乐,单点不送,锅底这种非正常菜品的sku,为了将其排除在外,对单价小于5快钱的菜品(参考了可乐,米饭等菜品的集中价格)做了过滤。但是后来发现,对于一些品类例如冒菜,麻辣香锅这种,他的菜品由于都是低价格的单品(例如青菜一份2.5元这种,因此,单纯的按照价格就会导致过滤错了较多的菜品,因此最后在价格的基础上还要加上品类的限制做为排除条件,另外考虑到部分订单是多人餐使用场景,点的菜比较多,也会造成菜品的虚高关联度,因此在组合套餐的时候我们筛选了只有2个菜品的订单和只有3个菜品的订单,最终得到待计算关联度的菜品订单数据集。

import pandas as pd
import numpy as np
import os
import redef  loadDataSet(data):ordpro_dict={}for index ,i in data.iterrows():if i.order_id  not in ordpro_dict:ordpro_dict[i.order_id]=[i.item_name]else:ordpro_dict[i.order_id].append(i.item_name)proset=[]for k,v in ordpro_dict.items():proset.append(v)return prosetdef createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item])C1.sort()return map(frozenset, C1)#use frozen set so we#can use it as a key in a dictdef createCK(Lk, k): #creates CkretList = []lenLk = len(Lk)for i in range(lenLk):for j in range(i+1, lenLk): L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]L1.sort(); L2.sort()if L1==L2: #if first k-2 elements are equalretList.append(Lk[i] | Lk[j]) #set unionreturn retListdef scanD(D, Ck, minSupport):ssCnt = {}for tid in D:for can in Ck:if can.issubset(tid):if can not in ssCnt.keys(): ssCnt[can]=1else: ssCnt[can] += 1numItems = float(len(D))retList = []supportData = {}for key in ssCnt:support = ssCnt[key]/numItemsif support >= minSupport:retList.insert(0,key)supportData[key] = supportreturn retList,supportData,ssCnt
if __name__=='__main__':df1=pd.read_excel(r'C:\Users\77202\Desktop\sql\新建文件夹\apriori_items.xlsx')proset=loadDataSet(df1)c1_map=createC1(proset)#map#单项频繁项集c1=list(c1_map)result1,sp1,ss1=scanD(proset,c1,minSupport=0.05)spd1=pd.DataFrame.from_dict(sp1,orient='index',columns=['supportrate'])ssd1=pd.DataFrame.from_dict(ss1,orient='index',columns=['order_cnt'])ssd1=ssd1.reset_index().rename(columns={'index':'pro'})ssd1['ProS']=ssd1['pro'].apply(lambda x:list(x)[0])#二项频繁集c2=createCK(c1,2)#二项集关联度result2,sp2,ss2=scanD(proset,c2,minSupport=0)spd2=pd.DataFrame.from_dict(sp2,orient='index',columns=['supportrate'])ssd2=pd.DataFrame.from_dict(ss2,orient='index',columns=['order_cnt'])ssd2=ssd2.reset_index().rename(columns={'index':'proAB'})ssd2['proA']=ssd2['proAB'].apply(lambda x:re.sub('\\[','',list(x)[0])) ssd2['proB']=ssd2['proAB'].apply(lambda x:re.sub('\\]','',list(x)[1]))#三项频繁集c3=createCK(c2,3)result3,sp3,ss3=scanD(proset,c3,minSupport=0)spd3=pd.DataFrame.from_dict(sp3,orient='index',columns=['supportrate'])ssd3=pd.DataFrame.from_dict(ss3,orient='index',columns=['order_cnt'])ssd3=ssd3.reset_index().rename(columns={'index':'proABC'})ssd3['proA']=ssd3['proABC'].apply(lambda x:re.sub('\\[','',list(x)[0])) ssd3['proB']=ssd3['proABC'].apply(lambda x:re.sub('\\]','',list(x)[1]))ssd3['proC']=ssd3['proABC'].apply(lambda x:re.sub('\\]','',list(x)[2]))#sp_result=pd.concat([spd1,spd2,spd3],axis=0)###二二组合商品相关度result22_1=pd.merge(ssd2,ssd1,how='left',left_on='proA',right_on='ProS')result22_2=pd.merge(result22_1,ssd1,how='left',left_on='proB',right_on='ProS')result22=result22_2[['proA','proB','order_cnt_x','order_cnt_y','order_cnt']]result22=result22.rename(columns={'order_cnt_x':'order_cnt_AB','order_cnt_y':'order_cnt_A','order_cnt':'order_cnt_B'})#result22.head()###三三组合商品相关度####result33_1=pd.merge(ssd3,ssd1,how='left',left_on='proA',right_on='ProS')result33_2=pd.merge(result33_1,ssd1,how='left',left_on='proB',right_on='ProS')result33_3=pd.merge(result33_2,ssd1,how='left',left_on='proC',right_on='ProS')resultt33=result33_3[['proA','proB','proC','order_cnt_x','order_cnt_y','order_cnt']]#需修改#result33=result33.rename(columns={})#数据存储,生成excel
#     writer=pd.ExcelWriter(r'C:\Users\77202\Desktop\sp2.xlsx')
#     sp_result.to_excel(writer)
#     writer.save()

第三步,结果分析

如下图所示,麻婆豆腐+葱香烤鸡的关联度以及卷心菜+葱香烤鸡的关联度明显比较高,用户同时买这两个菜品的概率比较大,建议组套餐卖。

另外,其中,minsuppor参数是自己需要传入的参数,本例中使用的是0.05,可以根据情况提高该值,排除一些低关联度的商品组合。
最后,在有了菜品的二二组合和三三组合的置信度和支持度之后,再组套餐的时候我们还需要考虑菜品的价格,如果菜品A+菜品B的总价远远高于改商户的客单价水平,那么用户买的几率会特别低,同时,在组合套餐的时候我们还需要考虑具体的用户的用餐场景,因此我们要选出的是关联度高,符合用户定位的菜品,也可以加入菜品利润最大化的考虑进去。

其中支持度和Apriori相关,而置信度和提升度是下一篇寻找物品关联规则的时候会用到。

基于Apriori算法的菜品组合挖掘相关推荐

  1. 利用weka进行数据挖掘——基于Apriori算法的关联规则挖掘实例

    文章目录 1. weka安装 2. 先分析一个Apriori算法的关联规则挖掘实例 3. 利用weka进行数据挖掘 3.1 将数据转为ARFF格式 3.2 利用weka进行分析 4. 参考文章 首先, ...

  2. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  3. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)...

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  4. 基于Apriori算法的购物网站商品推荐系统

    基于Apriori算法的购物网站商品推荐系统 目 录 一. 算法内容 3 Step 1 收集用户偏好 3 Step 2 对数据进行预处理 3 Step 3 计算相似度 4 Step 4 找邻居 5 S ...

  5. 基于Apriori算法的网上图书销售ssm java毕业设计

    基于Apriori算法的网络书城,首先系统的主要研究是算法方面,通过算法,进行书籍的关联计算,并且进行图书的精准销售,营销,为客户推荐一些兴趣书籍,扩大用户的选择范围,提高网站的营销量.本系统开发平台 ...

  6. apriori算法c++_关联分析——基于Apriori算法实现

    电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验.而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推 ...

  7. apriori数据集_关联分析——基于Apriori算法实现

    电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验.而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推 ...

  8. 基于Apriori算法,SpringBoot框架作为前端,java语言编写的购物推荐系统 0.0

    1,简介 自己研究的一个小软件,已经申请专利,这里分享出我的思路以及代码作为纪念,也希望能帮到大家,可以根据已经购买的东西利用算法推荐出可能还会购买哪些,类似于淘宝的推荐系统啊之类的巴拉巴拉,不过是简 ...

  9. 【数据分析与挖掘】基于Apriori算法的中医证型的关联规则挖掘(有数据集和代码)

    背景 中医药治疗乳腺癌有着广泛的适应证和独特的优势.从整体出发,调整机体气血.阴阳.脏腑功能的平衡,根据不同的临床证候进行辨证论治.确定"先证而治"的方向:即后续证侯尚未出现之前, ...

最新文章

  1. 数据中心机房空调系统的这些“套路”你知多少?
  2. [C#.NET 拾遗补漏]09:数据标注与数据校验
  3. 3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...
  4. 使用多线程拷贝文件夹
  5. 今天的中巴等各式车子的企业即时通讯
  6. 关于Js下拉导航的解释
  7. 做柜员还是程序员_应届生放弃互联网大厂回家乡银行:程序员五万比不上柜员五千...
  8. 微信头像失效_如何判断微信授权的头像是否失效
  9. Atitit. 如何判断软件工程师 能力模型 程序员能力模型  项目经理能力模型
  10. atitit.软件开发概念--过滤和投影 数据操作
  11. 【Java后台】从零开始的Java后台开发(二)
  12. rapidxml学习记录
  13. 汇编环境搭建 -- MASM32
  14. excel--text(双坐标图表)
  15. “今天星期五“-SAP SE09/STMS 请求号传输中遇到的错误及解决方案
  16. Java 生成随机中文、英文姓名(上)
  17. 超级计算机 弦理论,暗能量导致宇宙加速膨胀?弦理论能否帮忙解决?
  18. C语言程序设计入门——水仙花数
  19. 如何在地图上显示多个红包商店 vue
  20. 2022年可可香精市场前景分析及研究报告

热门文章

  1. 九月份参加OPPO和腾讯Android面试:技术一面+二面+三面+HR四面,我的面经总结!
  2. 笔记本电脑什么软件测试温度,笔记本cpu温度多少正常
  3. cad脚本合适_CAD脚本语言SCR
  4. Ubuntu下安装Canon打印机驱动程序
  5. java available用法_Java.io.BufferedInputStream.available()方法实例
  6. Extmail实现邮件服务器
  7. 计算机模拟超光速,世界75亿人口,全部堆积在一起有多高?电脑的模拟画面曝光...
  8. alma linux 上配置 ntp 服务器和客户端
  9. 文本处理强调的是使用计算机,计算机一级信息技术第五六章复习题课件.ppt
  10. 立讯检测 | 广州可靠性——标准IEC 61373:2010介绍