《RapidMiner 数据分析与挖掘实战》第 8 章
第 8 章 关联分析与关联规则
8.1理解关联规则分析
下面通过餐饮企业中的一个实际情景引出关联规则的概念。客户在餐厅点餐时,面对菜
单中大量的菜品信息,往往无法迅速找到满意的菜品,既增加了点菜的时间,也降低了客户
的就餐体验。实际上,菜品的合理搭配是有规律可循的:顾客的饮食习惯、菜品的荤素和口
味,有些菜品之间是相互关联的,而有些菜品之间是对立或竞争关系(负关联),这些规律
都隐藏在大量的历史菜单数据中,如果能够通过数据挖掘发现客户点餐的规则,就可以快速
识别客户的口味,当他下了某个菜品的订单时推荐相关联的菜品,引导客户消费,提高顾客
的就餐体验和餐饮企业的业绩水平。
关联规则分析也成为购物篮分析,最早是为了发现超市销售数据库中不同的商品之间的
关联关系。例如一个超市的经理想要更多地了解顾客的购物习惯,比如“哪组商品可能会在
一次购物中同时购买?”或者“某顾客购买了个人电脑,那该顾客三个月后购买数码相机的
概率有多大?”他可能会发现如果购买了面包的顾客同时非常有可能会购买牛奶,这就导出
了一条关联规则“面包=>牛奶”,其中面包称为规则的前项,而牛奶称为后项。通过对面包
降低售价进行促销,而适当提高牛奶的售价,关联销售出的牛奶就有可能增加超市整体的利
润。
关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找出各项之
间的关联关系,而这种关系并没有在数据中直接表示出来。
8.1.1 常用关联规则算法
常用关联算法如所表 8- 1 所示。
表 8- 1 常用关联规则算法
算法名称
算法描述
Apriori
关联规则最常用也是最经典的挖掘频繁项集的算法,其核心思想是
通过连接产生候选项及其支持度然后通过剪枝生成频繁项集。
182
《RapidMiner 数据分析与挖掘实战》第 8 章
FP-Tree
针对 Apriori 算法的固有的多次扫面事务数据集的缺陷,提出的不产
生候选频繁项集的方法。Apriori 和 FP-Tree 都是寻找频繁项集的算法。
Eclat 算法是一种深度优先算法,采用垂直数据表示形式,在概念格
Eclat 算法
理论的基础上利用基于前缀的等价关系将搜索空间划分为较小的子空
间。
灰色关联法
分析和确定各因素之间的影响程度或是若干个子因素(子序列)对
主因素(母序列)的贡献度而进行的一种分析方法。
本节重点详细介绍 Apriori 算法。
8.1.2 Apriori 算法
以超市销售数据为例,提取关联规则的最大困难在于当存在很多商品时,可能的商品的
组合(规则的前项与后项)的数目会达到一种令人望而却步的程度。因而各种关联规则分析
的算法从不同方面入手减小可能的搜索空间的大小以及减小扫描数据的次数。Apriori 算法
是最经典的挖掘频繁项集的算法,第一次实现了在大数据集上可行的关联规则提取,其核心
思想是通过连接产生候选项与其支持度然后通过剪枝生成频繁项集。
1. 关联规则和频繁项集
(1) 关联规则的一般形式
项集 A、B 同时发生的概率称为关联规则的支持度(也称相对支持度):
Support A
(
B
)
(
P A B
)
项集 A 发生,则项集 B 发生的概率为关联规则的置信度:
Confidence A
(
(2) 最小支持度和最小置信度
B
)
( | )
P B A
(8-1)
(8-2)
最小支持度是用户或专家定义的衡量支持度的一个阈值,表示项目集在统计意义上的最
低重要性;最小置信度是用户或专家定义的衡量置信度的一个阈值,表示关联规则的最低可
靠性。同时满足最小支持度阈值和最小置信度阈值的规则称作强规则。
(3) 项集
183
《RapidMiner 数据分析与挖掘实战》第 8 章
项集是项的集合。包含 k 个项的项集称为 k 项集,如集合{牛奶,麦片,糖}是一个 3
项集。
项集的出现频率是所有包含项集的事务计数,又称作绝对支持度或支持度计数。如果项
集 I 的相对支持度满足预定义的最小支持度阈值,则 I 是频繁项集。频繁 k 项集通常记作 kL 。
(4) 支持度计数
项集 A 的支持度计数是事务数据集中包含项集 A 的事务个数,简称为项集的频率或计
数。
已知项集的支持度计数,则规则 A
集 A 和项集 A B 的支持度计数推出:
B 的支持度和置信度很容易从所有事务计数、项
Support A
(
B
)
同时发生的事务个数
,
A B
所有事务个数
=
_
count A B
Support
)
_
Total
count A
(
(
)
Confidence A
(
B
)
( | )
P B A
(
Support A B
(
)
Support A
)
_
Support count A B
(
)
Support count A
_
(
(8-3)
)
(8-4)
也就是说,一旦得到所有事务个数,A,B 和 A B 的支持度计数,就可以导出对应的
关联规则 A
B 和 B
A ,并可以检查该规则是否是强规则。
2. Ariori 算法:使用候选产生频繁项集
Apriori 算法的主要思想是找出存在于事务数据集中的最大的频繁项集,在利用得到的
最大频繁项集与预先设定的最小置信度阈值生成强关联规则。
(1) Apriori 的性质
频繁项集的所有非空子集也必须是频繁项集。根据该性质可以得出:向不是频繁项集 I
的项集中添加事务 A,新的项集 I
A 一定也不是频繁项集。
(2) Apriori 算法实现的两个过程:
1) 找出所有的频繁项集(支持度必须大于等于给定的最小支持度阈值),在这个过程
中连接步和剪枝步互相融合,最终得到最大频繁项集 kL 。
184
《RapidMiner 数据分析与挖掘实战》第 8 章
连接步:
连接步的目的是找到 K 项集。对给定的最小支持度阈值,分别对 1 项候选集 1C ,
剔除小于该阈值的的项集得到 1 项频繁集 1L ;下一步由 1L 自身连接产生 2 项候选
集 2C ,保留 2C 中满足约束条件的项集得到 2 项频繁集,记为 2L ;再下一步由 2L 与
1L 连接产生 3 项候选集 3C ,保留 2C 中满足约束条件的项集得到 3 项频繁集,记
为 3L 这样循环下去,得到最大频繁项集 kL 。
剪枝步:
剪枝步紧接着连接步,在产生候选项 kC 的过程中起到减小搜索空间的目的。由于
kC 是 1kL 与 1L 连接产生的,根据 Apriori 的性质频繁项集的所有非空子集也必须
是频繁项集,所以不满足该性质的项集将不会存在于 kC 中,该过程就是剪枝。
2) 由频繁项集产生强关联规则:由过程(1)可知未超过预定的最小支持度阈值的项集已
被剔除,如果剩下这些规则又满足了预定的最小置信度阈值,那么就挖掘出了强关
联规则。
下面将结合餐饮行业的实例来讲解 Apriori 关联规则算法挖掘的实现过程。数据库中部
分点餐数据如表 8- 2:
表 8- 2 数据库中部分点餐数据
序
列
1
2
3
4
5
6
时间
订单号
2014/8/21
2014/8/21
2014/8/21
2014/8/21
2014/8/21
2014/8/21
101
101
101
102
102
103
菜品 id
18491
8693
8705
8842
7794
8842
185
菜品名称
健康麦香包
香煎葱油饼
翡翠蒸香茜饺
菜心粒咸骨粥
养颜红枣糕
金丝燕麦包
《RapidMiner 数据分析与挖掘实战》第 8 章
7
…
2014/8/21
…
103
…
8693
…
三丝炒河粉
…
首先将表 8- 2 中的事务数据(一种特殊类型的记录数据)整理成关联规则模型所需的数
据结构,从中抽取 10 个点餐订单作为事务数据集,设支持度为 0.2(支持度计数为 2),为
方便起见将菜品{18491,8842,8693,7794,8705}分别简记为{a,b,c,d,e})如表 8- 3:
表 8- 3 某餐厅事务数据集
订单号
菜品 id
18491, 8693,8705
8842,7794
8842,8693
1
2
3
4
5
6
7
8
9
菜品 id
a,c,e
b,d
b,c
a,b,c
a,c,e
18491,8842,8693,7794
a,b,c,d
18491,8842
8842,8693
18491,8842
a,b
b,c
a,b
18491,8842,8693,8705
a,b,c,e
18491,8842,8693
10
18491,8693,8705
算法过程如图 8- 1 所示。
186
《RapidMiner 数据分析与挖掘实战》第 8 章
图 8- 1 Apriori 算法实现过程
过程一:找最大 k 项频繁集
1) 算法简单扫描所有的事务,事务中的每一项都是候选 1 项集的集合 1C 的成员,计
算每一项的支持度。比如 ({ })
P a
{ }a项集 的支持度计数
所有事务个数
7=
10
;
0.7
2) 对 1C 中各项集的支持度与预先设定的最小支持度阈值作比较,保留大于或等于该
阈值的项,得 1 项频繁集 1L ;
3) 扫面所有事务, 1L 与 1L 连接得候选 2 项集 2C ,并计算每一项的支持度。如
({ , })
P a b
项集
的支持度计数
{ , }
a b
所有事务个数
5=
10
。接下来是剪枝步,由于 2C 的每个
0.5
子集(即 1L )都是频繁集,所以没有项集从 2C 中剔除;
4) 对 2C 中各项集的支持度与预先设定的最小支持度阈值作比较,保留大于或等于该
187
《RapidMiner 数据分析与挖掘实战》第 8 章
阈值的项,得 2 项频繁集 2L ;
5) 扫描所有事务, 2L 与 1L 连接得候选 3 项集 3C ,并计算每一项的支持度,如
({ ,
P a b c
, })
项集
的支持度计数
{ ,
, }
a b c
总的事务计数
3=
10
。接下来是剪枝步, 2L 与 1L 连
0.3
接的所有项集为:{ a,b,c},{ a,b,d},{ a,b,e},{ a,c,d},{ a,c,e},
{ b,c,d},{ b,c,e},根据 Apriori 算法,频繁集的所有非空子集也必须是频繁
集,因为{b,d},{b,e},{c,d}不包含在 b 项频繁集 2L 中,即不是频繁集,应
剔除,最后的 3C 中的项集只有{ a,b,c}和{ a,c,e};
6) 对 3C 中各项集的支持度与预先设定的最小支持度阈值作比较,保留大于或等于该
阈值的项,得 3 项频繁集 3L ;
7) 3L 与 1L 连接得候选 4 项集 4C ,易得剪枝后为空集。最后得到最大 3 项频繁集{ a,
b,c}和{ a,c,e}。
由以上过程可知 1
L L L 都是频繁项集, 3L 是最大频繁项集。
2
3
,
,
过程二:由频繁集产生关联规则
置信度的计算公式为:
Confidence A
(
B
)
( | )
P B A
(
Support A B
(
)
Support A
)
_
Support count A B
(
)
Support count A
_
(
)
count A 是包
(
)
其中
Support
_
count A B 是包含项集 A B 的事务数,
(
)
Support
_
含项集 A 的事务数,根据该公式,尝试基于该例产生关联规则。
输出的关联规则如下:
188
《RapidMiner 数据分析与挖掘实战》第 8 章
就第一条输出结果进行解释:客户同时点菜品 a 和 b 的概率是 50%,点了菜品 a ,再点
菜品 b 的概率是 71.4286%。知道了这些,就可以对顾客进行智能推荐,增加销量同时满足
客户需求。
8.2实例 1—利用关联分析热燃油市场需求
8.2.1 背景和概要说明
Sarah 是一家家庭取暖用化石燃料全国供应商的区域销售经理。 热燃油市场价格的近
期波动(尤其是再加上每个家庭用热燃油订单的额度相差非常大)引起了 Sarah 的关注。 她
认为有必要了解可能影响国内市场对热燃油需求的行为及其他因素的类型。 哪些因素与热
燃油用量有关,以及她可以如何利用对此类因素的了解来更好地管理库存并预测需求?
Sarah 相信数据挖掘可以帮助她开始了解这些因素和关联。
8.2.2 业务理解
Sarah 的目标是更好地了解她所在的公司如何在家庭用热燃油市场中取得成功。 她认
189