理解关联规则算法

共 4923字,需浏览 10分钟

 ·

2021-03-14 17:16


一、基础概念

1、算法概述

关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。所以说,关联规则挖掘是个非常有用的技术。
关联规则是反映一个事物与其他事物之间的相互依存性和关联性,常用于实体商店或在线电商的推荐系统:通过对顾客的购买记录数据库进行关联规则挖掘,最终目的是发现顾客群体的购买习惯的内在共性,例如购买产品A的同时也连带购买产品B的概率,根据挖掘结果,调整货架的布局陈列、设计促销组合方案,实现销量的提升,最经典的应用案例莫过于<啤酒和尿布>。
 
关联分析又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。能从大量数据中发现项集之间有趣的关联和相关联系。关联分析的一个典型例子是购物篮分析。该过程通过发现顾客放人其购物篮中的不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商制定营销策略。其他的应用还包括价目表设计、商品促销、商品的排放和基于购买模式的顾客划分。
 
可从数据库中关联分析出形如“由于某些事件的发生而引起另外一些事件的发生”之类的规则。如“67%的顾客在购买啤酒的同时也会购买尿布”,因此通过合理的啤酒和尿布的货架摆放或捆绑销售可提高超市的服务质量和效益。又如“C语言课程优秀的同学,在学习‘数据结构’时为优秀的可能性达88%”,那么就可以通过强化“C语言”的学习来提高教学效果。
 

2、应用场景

01)互联网推荐
个性化推荐:在界面上给用户推荐相关商品
组合优惠券:给购买过得用户发放同时购买组合内商品的优惠券
捆绑销售:将相关商品组合起来销售
02)线下店铺分析
商品配置分析:哪些商品可以一起购买,关联商品如何陈列/促销
客户需求分析:分析顾客的购买习惯/顾客购买商品的时间/地点等
3)金融保险
经由购物篮分析能够设计不同的服务组合以扩大利润;能藉由购物篮分析侦测出可能不寻常的投保组合并作预防。
4)风控领域
分析同时行动的账号、寻找有效的策略组合
 

3、几个概念

关联规则三个核心概念:支持度、置信度、提升度,用最经典的啤酒-尿不湿给大家举例说明这三个概念,以下是几名客户购买的商品列表:

01)支持度

支持度 (Support):指某个商品组合出现的次数总次数之间的比例。
在这个例子中,我们可以看到“牛奶”出现了 4 次,那么这 5 笔订单中“牛奶”的支持度就是 4/5=0.8。
同样“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.6
这样理解起来是不是非常简单了呢,大家可以动动手计算下 '尿不湿+啤酒'的支持度是多少

02)置信度

置信度 (Confidence):指的就是当你购买了商品 A,会有多大的概率购买商品 B
置信度(牛奶→啤酒)= 3/4=0.75,代表如果你购买了牛奶,有多大的概率会购买啤酒
置信度(啤酒→牛奶)= 3/4=0.75,代表如果你购买了啤酒,有多大的概率会购买牛奶?
置信度(啤酒→尿不湿)= 4/4=1.0,代表如果你购买了啤酒,有多大的概率会买尿不湿
由上面的例子可以看出,置信度是个条件概念,就是说在 A 发生的情况下,B 发生的概率是多少。

03)提升度

提升度 (Lift):我们在做商品推荐或者策略的时候,重点考虑的是提升度,因为提升度代表的是商品 A 的出现,对商品 B 的出现概率提升的程度。
提升度 (A→B) = 置信度 (A→B)/ 支持度 (B)
所以提升度有三种可能:
提升度 (A→B)>1:代表有提升;
提升度 (A→B)=1:代表有没有提升,也没有下降;
提升度 (A→B)<1:代表有下降。
 
提升度 (啤酒→尿不湿) =置信度 (啤酒→尿不湿)/支持度  (尿不湿)=1.0/0.8=1.25
 
可见啤酒对尿不湿是有提升的,提升度为1.25,其实可以简单理解为:在全集的情况下,尿不湿的概率为0.8,而在包含啤酒这个子集中,尿不湿的概率为1,因此,子集的限定,提高了尿不湿的概率。

04)频繁项集

频繁项集(frequent itemset) :就是支持度大于等于最小支持度 (Min Support) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集。项集可以是单个商品,也可以是组合
 
Apriori算法核心思想:
某个项集是频繁的,那么它的所有子集也是频繁的


{Milk, Bread, Coke} is frequent  → {Milk, Coke} is frequent

如果一个项集是 非频繁项集,那么它的所有超集也是非频繁项集
{Battery} is infrequent  → {Milk, Battery} is infrequent

如图所示,我们发现{A,B}这个项集是非频繁的,那么{A,B}这个项集的超集,{A,B,C},{A,B,D}等等也都是非频繁的,这些就都可以忽略不去计算。

运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量。

 


二、算法介绍

这里用的是Python举例,用的包是apriori,当然R语言等其他语言,也有对应的算法包,原来都是一样的。

#包安装pip install efficient-apriori#加载包from efficient_apriori import apriori# 构造数据集data = [('牛奶','面包','尿不湿','啤酒','榴莲'),        ('可乐','面包','尿不湿','啤酒','牛仔裤'),        ('牛奶','尿不湿','啤酒','鸡蛋','咖啡'),        ('面包','牛奶','尿不湿','啤酒','睡衣'),        ('面包','牛奶','尿不湿','可乐','鸡翅')]#挖掘频繁项集和频繁规则itemsets, rules = apriori(data, min_support=0.6,  min_confidence=1)#频繁项集print(itemsets){1: {('啤酒',): 4, ('尿不湿',): 5, ('牛奶',): 4, ('面包',): 4}, 2: {('啤酒', '尿不湿'): 4, ('啤酒', '牛奶'): 3, ('啤酒', '面包'): 3, ('尿不湿', '牛奶'): 4, ('尿不湿', '面包'): 4, ('牛奶', '面包'): 3}, 3: {('啤酒', '尿不湿', '牛奶'): 3, ('啤酒', '尿不湿', '面包'): 3, ('尿不湿', '牛奶', '面包'): 3}}itemsets[1] #满足条件的一元组合{('啤酒',): 4, ('尿不湿',): 5, ('牛奶',): 4, ('面包',): 4}itemsets[2]#满足条件的二元组合{('啤酒', '尿不湿'): 4,('啤酒', '牛奶'): 3,('啤酒', '面包'): 3,('尿不湿', '牛奶'): 4,('尿不湿', '面包'): 4,('牛奶', '面包'): 3}itemsets[3]#满足条件的三元组合{('啤酒', '尿不湿', '牛奶'): 3, ('啤酒', '尿不湿', '面包'): 3, ('尿不湿', '牛奶', '面包'): 3}#频繁规则print(rules)[{啤酒} -> {尿不湿}, {牛奶} -> {尿不湿}, {面包} -> {尿不湿}, {啤酒, 牛奶} -> {尿不湿}, {啤酒, 面包} -> {尿不湿}, {牛奶, 面包} -> {尿不湿}]

 


三、挖掘实例

每个导演都有自己的偏好、比如周星驰有星女郎,张艺谋有谋女郎,且巩俐经常在张艺谋的电影里面出现,因此,每个导演对演员的选择都有一定的偏爱,我们以宁浩导演为例,分析下选择演员的一些偏好,没有找到公开的数据集,自己手动扒了一部分,大概如下,有些实在有点多,于是简化下进行分析

可以看到,我们一共扒了9部电影,计算的时候,支持度的时候,总数就是9.

#把电影数据转换成列表data = [['葛优','黄渤','范伟','邓超','沈腾','张占义','王宝强','徐峥','闫妮','马丽'],['黄渤','张译','韩昊霖','杜江','葛优','刘昊然','宋佳','王千源','任素汐','吴京'],['郭涛','刘桦','连晋','黄渤','徐峥','优恵','罗兰','王迅'],['黄渤','舒淇','王宝强','张艺兴','于和伟','王迅','李勤勤','李又麟','宁浩','管虎','梁静','徐峥','陈德森','张磊'],['黄渤','沈腾','汤姆·派福瑞','马修·莫里森','徐峥','于和伟','雷佳音','刘桦','邓飞','蔡明凯','王戈','凯特·纳尔逊','王砚伟','呲路'],['徐峥','黄渤','余男','多布杰','王双宝','巴多','杨新鸣','郭虹','陶虹','黄精一','赵虎','王辉'],['黄渤','戎祥','九孔','徐峥','王双宝','巴多','董立范','高捷','马少骅','王迅','刘刚','WorapojThuantanon','赵奔','李麒麟','姜志刚','王鹭','宁浩'],['黄渤','徐峥','袁泉','周冬雨','陶慧','岳小军','沈腾','张俪','马苏','刘美含','王砚辉','焦俊艳','郭涛'],['雷佳音','陶虹','程媛媛','山崎敬一','郭涛','范伟','孙淳','刘桦','黄渤','岳小军','傅亨','王文','杨新鸣']]
#算法应用itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)print(itemsets){1: {('徐峥',): 7, ('黄渤',): 9}, 2: {('徐峥', '黄渤'): 7}}print(rules)[{徐峥} -> {黄渤}]

通过上述分析可以看出:

在宁浩的电影中,用的最多的是黄渤和徐峥,黄渤9次,支持度100%,徐峥7次,支持度78%,('徐峥', '黄渤') 同时出现7次,置信度为100%,看来有徐峥,必有黄渤,真是宁浩必请的黄金搭档。

当然,这个数据量比较小,基本上肉眼也能看出来,这里只是提供一个分析案例,巩固下基础知识,大规模的数据,人眼无法直接感知的时候,算法的挖掘与发现,就显得特别有意义了。

 


推荐阅读:

Python中的高效迭代库itertools,排列组合随便求

万字长文详解|Python库collections,让你击败99%的Pythoner

Python初学者必须吃透这69个内置函数!

Python字典详解-超级完整版

全面理解Python集合,17个方法全解,看完就够了

Python正则表达式入门到入魔


扫描关注本号↓



浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报