基于关联规则挖掘的商品交叉销售分析

news2024/9/19 18:08:57

基于关联规则挖掘的商品交叉销售分析

小P:我们最近考虑将一些相关的商品打包销售,以提高GMV,有没有好的方法啊

小H:参考经典的啤酒尿布案例,可以尝试通过关联规则挖掘相关信息

数据探索

# 导入库
import pandas as pd
import apriori # 本地库apriori.py
from pyecharts.charts import Graph
from pyecharts import options as opts

上述apriori.py和以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据挖掘-关联规则】自动获取~

# 读取数据
raw_data = pd.read_csv('order_table.csv')
raw_data.head()
order_idproduct_name
0201901010000001citrus fruit
1201901010000001semi-finished bread
2201901010000001margarine
3201901010000001ready soups
4201901010000002tropical fruit

特征工程

# 转换为关联所用的记录模式
order_ids = pd.unique(raw_data['order_id'])
order_records = [raw_data[raw_data['order_id']==each_id]['product_name'].tolist() for each_id in order_ids]
order_records[0:5]
[['citrus fruit', 'semi-finished bread', 'margarine', 'ready soups'],
 ['tropical fruit', 'yogurt', 'coffee'],
 ['whole milk'],
 ['pip fruit', 'yogurt', 'cream cheese ', 'meat spreads'],
 ['other vegetables',
  'whole milk',
  'condensed milk',
  'long life bakery product']]

模型拟合

# 通过调用自定义的apriori做关联分析
minS = 0.01  # 定义最小支持度阀值
minC = 0.05  # 定义最小置信度阀值
L, suppData = apriori.apriori(order_records, minSupport=minS)  # 计算得到满足最小支持度的规则
rules = apriori.generateRules(order_records, L, suppData, minConf=minC)  # 计算满足最小置信度的规则
# 关联结果报表评估
model_summary = 'data record: {0} \nassociation rules count: {1}'  # 展示数据集记录数和满足阀值定义的规则数量
print(model_summary.format(len(order_records), len(rules)),'\n','-'*60)  # 使用str.format做格式化输出
rules_all = pd.DataFrame(rules, columns=['item1', 'item2', 'instance', 'support', 'confidence',
                                  'lift'])  # 创建频繁规则数据框
rules_sort = rules_all.sort_values(['lift'],ascending=False)
rules_sort.head(10)
data record: 2240 
association rules count: 582 
 ------------------------------------------------------------
item1item2instancesupportconfidencelift
346(whipped/sour cream)(berries)270.01210.15254.1168
347(berries)(whipped/sour cream)270.01210.32534.1168
496(pip fruit)(tropical fruit, other vegetables)230.01030.14744.0772
497(tropical fruit)(pip fruit, other vegetables)230.01030.10003.9298
510(yogurt)(fruit/vegetable juice, other vegetables)260.01160.08363.6719
575(curd)(whole milk, yogurt)290.01290.20423.6307
546(root vegetables)(tropical fruit, yogurt)240.01070.09803.5972
547(yogurt)(tropical fruit, root vegetables)240.01070.07723.5278
512(fruit/vegetable juice)(other vegetables, yogurt)260.01160.15663.3735
548(tropical fruit)(yogurt, root vegetables)240.01070.10433.2464

结果展示

# 选择有效数据
rules_sort_filt = rules_sort[rules_sort['lift']>1] # 只取有效规则
display_data = rules_sort_filt.iloc[:, :3] # 取出前3列
display_data.head()
item1item2instance
346(whipped/sour cream)(berries)27
347(berries)(whipped/sour cream)27
496(pip fruit)(tropical fruit, other vegetables)23
497(tropical fruit)(pip fruit, other vegetables)23
510(yogurt)(fruit/vegetable juice, other vegetables)26
# 汇总每个item出现的次数
item1 = display_data[['item1','instance']].rename(index=str, columns={"item1": "item"})
item2 = display_data[['item2','instance']].rename(index=str, columns={"item2": "item"})
item_concat = pd.concat((item1,item2),axis=0)
item_count = item_concat.groupby(['item'])['instance'].sum()
# 取出规则最多的TOP N items
control_num = 10
top_n_rules = item_count.sort_values(ascending=False).iloc[:control_num]
top_n_items = top_n_rules.index
top_rule_list = [all((item1 in top_n_items, item2 in top_n_items)) for item1,item2 in zip(display_data['item1'],display_data['item2'])]
top_display_data = display_data[top_rule_list] #TOP N items都参与的规则
# 准备数据
node_data = top_n_rules/100 # 圆的size太多,等比例缩小100倍
nodes = [{"name": ('').join(i[0]), "symbolSize": i[1], "value": j} for i, j in
         zip(node_data.to_dict().items(),top_n_rules)]
# 创建边数据以及边权重数据
edges = [{"source": ('').join(i), "target": ('').join(j), "value": k} for i, j, k in top_display_data.values]
# 商品关联结果图
graph = Graph(init_opts=opts.InitOpts(width="800px", height="800px"))
graph.add("", nodes, edges, repulsion=8000,layout="circular",is_rotate_label=True)
graph.set_global_opts(title_opts=opts.TitleOpts(title="商品关联结果图"))
graph.render_notebook()

image-20221222195605519

如果点击某个商品,则能看到其他商品和它的关联程度,例如【whole milk】

image-20221222195700113

总结

通过关联规则挖掘出历史商品的关联信息,然后就可以根据运营角度自行选择打包相关商品进行交叉销售了~

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创新工具 | 教你6步用故事板设计用户体验事半功倍

问题 构思方案时团队在细节上难以共识 故事板是什么?故事板就像连环画一样,将用户使用解决方案的关键步骤顺序串联了起来,呈现了方案和用户之间的交互。 故事板以先后顺序展现团队票选出来的最佳解决方案,在过程中对于方案中未…

vue 使用vue-json-viewer 展示 JSON 格式数据

vue 使用vue-json-viewer 展示 JSON 格式数据 1、安装 vue-json-viewer插件2、引入插件并注册2.1 全局注册组件2.2 单个页面局部引入 3、插件的基础使用4、插件可选配置说明4.1 选项 4.2 事件4.3 Slots4.4 主题5、实现效果 1、安装 vue-json-viewer插件 npm install vue-json-…

小米新财报:手机承压,转型求生

配图来自Canva可画 近期,国内各互联网大厂、科技公司、电商平台、内容社区等均陆续发布了2023年第一季度财报。在疫情消退、经济回暖的当下,还是有不少企业交出了一份不错的答卷。而国内知名的科技公司——小米集团,由于业务覆盖范围广泛、产…

【线程池】线程池的7种创建方式,详细讲解

文章目录 一、什么是线程池?二、线程池的分类三、线程池的使用四、ThreadPoolExecutor详解 一、什么是线程池? 线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,…

(哈希表 ) 454. 四数相加 II ——【Leetcode每日一题】

❓454. 四数相加 II 难度&#xff1a;中等 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&a…

如何在多个端口上运行 SSH 服务器?

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和管理服务器的协议。默认情况下&#xff0c;SSH服务器在Linux系统上使用22号端口进行通信。但是&#xff0c;有时我们可能需要在多个端口上运行SSH服务器&#xff0c;以满足特定的需求或增强服务器的安全性。 本…

Hexo+Twikoo+Vercel 个人博客开启评论功能

Twikoo 文档&#xff1a;https://twikoo.js.org/quick-start.html MongoDB 数据库 点击链接 https://www.mongodb.com/cloud/atlas/register 进入 MongoDB 官网使用邮箱进行注册&#xff1a; 注册之后&#xff0c;MongoDB 会向邮箱发送一封验证邮件&#xff1a; 进入邮箱&…

如何在 Linux 中进行网络地址转换 (NAT)?

网络地址转换&#xff08;Network Address Translation&#xff0c;简称NAT&#xff09;是一种在网络中使用的技术&#xff0c;它允许将私有网络中的IP地址映射到公共网络上&#xff0c;从而实现多个设备共享单个公共IP地址。在Linux系统中&#xff0c;我们可以使用一些工具和配…

实体店引流获客系统模式开发详解

随着互联网的日益发展&#xff0c;实体店的处境变得越来越艰难&#xff0c;获客难和销量差成为了实体店最头疼的两大问题。面对这种情况&#xff0c;一味固步自封是不行的&#xff0c;最好还是顺应潮流&#xff0c;结合一款合适的商业模式&#xff0c;来帮助自己快速引流获客和…

䲟鱼优化算法(ROA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

接口测试--apipost接口断言详解

在做接口测试的时候&#xff0c;会对接口进行断言&#xff0c;一个完整的接口测试&#xff0c;包括&#xff1a;请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言&#xff1a; apt.asser…

经济学基本思维方式

经济学定义 人的欲望是无止境的&#xff0c;而资源有限&#xff0c;这是一个矛盾。 经济学是研究个人和社会如何最优利用由自然和前人提供的有限资源的学问。 经济学的范围 Microeconomics 微观经济学 研究各个行业的运作的以及企业和个人的决策行为的经济学分支。Macroeco…

数据门户基础课程

PC端门户使用示例 首先,以管理员身份登录FineBI系统,安装数据门户,安装步骤见官网 新建一个数据门户

7. Linux系统下在桌面设置添加安装软件启动图标快捷方式

1. 说明 在Linux系统下安装了对应的软件之后&#xff0c;一般启动时需要在命令行终端中进行启动&#xff0c;可以在终端里设置快速启动的命令&#xff0c;相关设置可参考博客&#xff1a;Linux系统下在终端设置快速启动已安装软件。 另一种快捷启动方式就是像在Windows桌面系统…

git报错Filename too long

描述 碰见一个小小问题&#xff0c;Git在拉代码的时候提示Filename too long&#xff0c;具体如图 刚开始&#xff0c;一开始我是使用git自带的那个工具有问题了&#xff0c;然后我就下载了一个tortoisegit&#xff0c;结果还是有问题&#xff0c;这可是22G文件&#xff0c;我…

printf打印彩色字符,还能闪烁!

在使用linux终端命令的时候&#xff0c;我们可以看到像more命令&#xff0c;它的显示方式与一般的字符串不同&#xff0c;是用了反显。同样&#xff0c;linux C下printf还有很多其他不常见的格式化输出形式。本文主要为你盘点这些形式。 效果展示: 特殊的输出 演示代码: #inc…

每日一练 | 华为认证真题练习Day47

1、某台路由器输出信息如下&#xff0c;下列说法错误的是&#xff1f;&#xff08;多选&#xff09; A. 本路由器开启了区域认证 B. 本设备出现故障&#xff0c;配置的Router Id和实际生效的Router ID不一致 C. 本设备生效的Router Id为10.0.12.1 D. 本设备生效的Router Id为…

渗透测试工具Burpsuite

学习文档 https://portswigger.net/burp/documentation/desktop/getting-started/download-and-install Burp Suite是一款流行的集成式Web应用程序安全测试工具套件&#xff0c;广泛应用于渗透测试、安全审计、黑盒测试和漏洞研究等Web安全领域。它由PortSwigger公司开发&…

工具-Ditto与X mouse Button,自定义热键复制粘贴Ctrl C /V,解放双手

文章目录 1、使用演示2、使用方法3、更新&#xff0c;鼠标一键实现复制粘贴3.1 使用方法 1、使用演示 不需要同时摁下ctrl c /v 就可以在键盘上实现一键复制粘贴&#xff0c;其实去网上有外接的键盘&#xff0c;大概20元左右&#xff0c;外接键盘只有两个摁键&#xff0c;就是…

一文解决OpenCloudOS 如何基于 eBPF 实现容器级别的TCP 连接监控?

导语&#xff1a;eBPF 技术的出现&#xff0c;使得内核的资源监控更加的便捷、高效&#xff0c;容器化监控也更加适用于云原生的场景。基于 eBPF 实现的可观测性&#xff0c;可以无需修改内核源码或者加载内核模块&#xff0c;安全高效的扩展内核功能&#xff0c;很好的解决了上…