公号:码农充电站pro
主页:https://codeshellme.github.iohtml
在数据分析领域有一个经典的故事,叫作“尿布与啤酒”。python
听说,在美国西部的一家连锁超市发现,不少男人会在周四购买尿布和啤酒。这样超市就能够将尿布与啤酒放在一块儿卖,即可以增长销售量。git
“尿布与啤酒”这个案例就属于数据分析中的关联分析,也就是分析数据集中的内在隐含关系。github
关联分析能够被用于发掘商品与商品之间的内在关联关系,进而经过商品捆绑销售或者相互推荐,来增长商品销量。算法
关联分析除了能够用于零售行业外,还能够用于网站流量分析和医药行业等。shell
Apriori 算法是一种发掘事物内在关联关系的算法,它能够加快关联分析的速度,从而让咱们更有效的进行关联分析。ide
关联分析用于发掘大规模数据集中的内在关系。函数
关联分析通常要分析数据集中的频繁项集(frequent item sets)和关联规则(association rules):网站
假设,咱们收集了一家商店的交易清单:3d
交易编号 | 购物清单 |
---|---|
1 | 牛奶,面包 |
2 | 牛奶,面包,火腿 |
3 | 面包,火腿,可乐 |
4 | 火腿,可乐,方便面 |
5 | 面包,火腿,可乐,方便面 |
频繁项集是一些常常出如今一块儿的物品集合。好比:{牛奶,面包}
,{火腿,方便面,可乐}
都是频繁项集的例子。
项集中的物品,通常不考虑顺序关系。
关联规则意味着有人买了一种物品,还会买另外一种物品。好比方便面->火腿
,就是一种关联规则,表示若是买了方便面,还会买火腿。
关联分析中有三个重要的概念,分别是:
支持度
要进行关联分析,首先要寻找频繁项,也就是频繁出现的物品集。那么怎样才叫频繁呢?咱们能够用支持度来衡量频繁。
支持度是针对项集来讲的,一个项集的支持度就是该项集的记录占总记录的比例。一般能够定义一个最小支持度,从而只保留知足最小支持度的项集。
一个项集{A}
的支持度的定义以下:
好比,在上面表格中的5 项记录中,{牛奶}
出如今了两条记录中,因此{牛奶}
的支持度为 2/5
;而{面包,火腿}
出如今了三条记录中,因此{面包,火腿}
的支持度为3/5
。
可信度
可信度又叫置信度,它是针对关联规则来讲的,好比{火腿}->{可乐}
。
一个关联规则{A}->{B}
表示,若是购买了物品A,会有多大的几率购买物品B?它的可信度的定义以下:
因此,在上面的表格中,{火腿,可乐}
的支持度是 3/5
,{火腿}
的支持度是 4/5
,因此{可乐}->{火腿}
的可信度为 3/5
除以 4/5
,等于 0.75
。这意味着,若是购买了火腿,有 75%
的可能性会购买可乐。
提高度
提高度也是针对关联规则来讲的,它表示的是“若是购买物品A,会对购买物品B 的几率提高多少”。
一个关联规则{A}->{B}
的提高度的定义以下:
提高度会有三种状况:
寻找频繁项的一个简单粗暴的方法是,对全部的物品进行排列组合,而后计算全部组合的支持度,这种算法也能够叫作穷举法。
穷举法
穷举法就是列出全部物品的组合,而后计算每种组合的支持度。
好比,咱们有一个物品集{0,1,2,3},其中有四个物品,那么全部的物品组合以下:
从图中能够看到一共有15 种组合,计算每一种组合的支持度都须要遍历一遍全部的记录,检查每一个记录中是否包含该组合。所以有多少种组合,就须要遍历多少遍记录,时间复杂度则会很大。
能够总结出:包含N 种物品的数据集,共有 2N - 1 种组合。为了计算每种组合的支持度,则须要遍历 2N - 1 次记录。
若是一个商店中有100 款商品,将会有1.26*1030 种组合,这是一个很是庞大的数字。而普通商店通常都会有成千上万的商品,那么组合数将大到没法计算。
为了下降计算所需的时间,1994 年 Agrawal 提出了著名的 Apriori 算法,该算法能够有效减小须要计算的组合的数量,避免组合数量的指数增加,从而在合理的时间内计算出频繁项集。
Apriori 原理是说:若是一个项集是非频繁集,那么它的全部超集也是非频繁的。
好比下图中的项集{1,3}
是非频繁集,那么{0,1,3}
,{1,2,3}
,{0,1,2,3}
就都是非频繁项集。这就大大减小了须要计算的项集的数量。
这里,咱们使用Apriori 算法来寻找上文表格中的购物清单的频繁项集(为了方便查看,我把表格放在这里)。
交易编号 | 购物清单 |
---|---|
1 | 牛奶,面包 |
2 | 牛奶,面包,火腿 |
3 | 面包,火腿,可乐 |
4 | 火腿,可乐,方便面 |
5 | 面包,火腿,可乐,方便面 |
efficient_apriori 模块
Efficient-Apriori 包是Apriori 算法的稳定高效的实现,该模块适用于 Python 3.6+
。
使用Apriori 算法要先安装:
pip install efficient-apriori
efficient_apriori 包中有一个 apriori
函数,原型以下(这里只列出了经常使用参数):
apriori(data, min_support = 0.5, min_confidence = 0.5)
参数的含义:
使用 apriori 函数
首先,将表格中的购物清单转化成 Python 列表,以下:
data = [ ('牛奶', '面包'), ('牛奶', '面包', '火腿'), ('面包', '火腿', '可乐'), ('火腿', '可乐', '方便面'), ('面包', '火腿', '可乐', '方便面') ]
挖掘频繁项集和频繁规则:
# 该函数的使用很简单,就一行代码 # 最小支持度为 0.5 # 最小可信度为 1 itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
查看频繁项集和频繁规则:
>>> itemsets # 频繁项集 {1: { # 只有一个元素的项集 ('面包',): 4, # 4 表示记录数 ('火腿',): 4, ('可乐',): 3 }, 2: { # 有两个元素的项集 ('火腿', '面包'): 3, ('可乐', '火腿'): 3 } } >>> rules # 频繁规则 [{可乐} -> {火腿}]
本篇文章主要介绍了什么是关联分析,关联分析中三个重要的概念,以及 Apriori 算法。
Apriori 算法用于加快关联分析的速度,但它也须要屡次扫描数据集。其实除了Apriori 算法,还有其它算法也能够加快寻找频繁项集的速度。
2000 年提出的FP-Growth 算法,对 Apriori 算法进行了改进。FP-Growth 经过建立一棵 FP树来存储频繁项集。对不知足最小支持度的项不会建立节点,减小了存储空间。并且整个生成过程只遍历数据集 2 次,大大减小了计算量。
另外,还有CBA 算法,GSP 算法等,都对Apriori算法进行了改进,这里再也不详细介绍。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。