数据挖掘关联分析—R实现

2023-06-15,,

关联分析

关联分析又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。或者说,关联分析是发现交易数据库中不同商品(项)之间的联系。关联分析是一种简单、实用的分析技术,就是发现存在于大量数据集中的关联性或相关性,从而描述了一个事物中某些属性同时出现的规律和模式。关联分析是从大量数据中发现项集之间有趣的关联和相关联系。关联分析的一个典型例子是购物篮分析。该过程通过发现顾客放入其购物篮中的不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商制定营销策略。其他的应用还包括价目表设计、商品促销、商品的排放和基于购买模式的顾客划分。

一、关联分析概述

关联分析可从数据库中关联分析出形如“由于某些事件的发生而引起另外一些事件的发生”之类的规则。如“67%的顾客在购买啤酒的同时也会购买尿布”,因此通过合理的啤酒和尿布的货架摆放或捆绑销售可提高超市的服务质量和效益。又如“‘C语言’课程优秀的同学,在学习‘数据结构’时为优秀的可能性达88%”,那么就可以通过强化“C语言”的学习来提高教学效果。大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。关联分析(association analysis)也可以应用在其他领域像bioinfomatic(分析复杂生物知识的学科)、medical diagnosis、Web mining和scientific data analysis。

1. 关联分析基本概念

示例1:如下是一个超市几名顾客的交易信息。

TID Items
001 Cola, Egg, Ham
002 Cola, Diaper, Beer
003 Cola, Diaper, Beer, Ham
004 Diaper, Beer

TID代表交易流水号,Items代表一次交易的商品。我们对这个数据集进行关联分析,可以找出关联规则{Diaper}→{Beer}。它代表的意义是:购买了Diaper的顾客会购买Beer。这个关系不是必然的,但是可能性很大,这就已经足够用来辅助商家调整Diaper和Beer的摆放位置了,例如摆放在相近的位置,进行捆绑促销来提高销售量。

(1)事务:每一条交易称为一个事务,例如示例1中的数据集就包含四个事务。

(2)项:交易的每一个物品称为一个项,例如Cola、Egg等。

(3)项集:包含零个或多个项的集合叫做项集,例如{Cola, Egg, Ham}。

(4)k−项集:包含k个项的项集叫做k-项集,例如{Cola}叫做1-项集,{Cola, Egg}叫做2-项集。

(5)支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几。例如{Diaper, Beer}出现在事务 002、003和004中,所以它的支持度计数是3。

(6)支持度:支持度计数除于总的事务数。例如上例中总的事务数为4,{Diaper, Beer}的支持度计数为3,所以它的支持度是3÷4=75%,说明有75%的人同时买了Diaper和Beer。Support(支持度):表示同时包含A和B的事务占所有事务的比例。如果用P(A)表示使用A事务的比例,那么Support=P(A&B)。

(7)频繁项集:支持度大于或等于某个阈值的项集就叫做频繁项集。例如阈值设为50%时,因为{Diaper, Beer}的支持度是75%,所以它是频繁项集。

(8)前件和后件:对于规则{Diaper}→{Beer},{Diaper}叫做前件,{Beer}叫做后件。

(9)置信度:对于规则{Diaper}→{Beer},{Diaper, Beer}的支持度计数除于{Diaper}的支持度计数,为这个规则的置信度。例如规则{Diaper}→{Beer}的置信度为3÷3=100%。说明买了Diaper的人100%也买了Beer。Confidence(可信度):表示使用包含A的事务中同时包含B事务的比例,即同时包含A和B的事务占包含A事务的比例。公式表达:Confidence=P(A&B)/P(A)。

(10)强关联规则:大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则。关联分析的最终目标就是要找出强关联规则。

(11)提升度:我们在做商品推荐的时候,重点考虑的是提升度,因为提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度。提升度 (A→B)= 置信度 (A→B)/ 支持度 (B),即Lift=( P(A&B)/P(A))/P(B)=P(A&B)/P(A)/P(B),提升度反映了关联规则中的A与B的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性。

2. 关联分析方法

2.1 Apriori算法

Apriori算法是挖掘产生布尔关联规则所需频繁项集的基本算法,也是最著名的关联规则挖掘算法之一。Apriori算法就是根据有关频繁项集特性的先验知识而命名的。它使用一种称作逐层搜索的迭代方法,k—项集用于探索(k+1)—项集。首先,找出频繁1—项集的集合.记做L1,L1用于找出频繁2—项集的集合L2,再用于找出L3,如此下去,直到不能找到频繁k—项集。找每个Lk需要扫描一次数据库。

为提高按层次搜索并产生相应频繁项集的处理效率,Apriori算法利用了一个重要性质,并应用Apriori性质来帮助有效缩小频繁项集的搜索空间。频繁项集具有性质其任一子集也应该是频繁项集,若一个项集I不满足最小支持度阈值min_sup,则I不是频繁的,即P(I)<min_sup。若增加一个项A到项集I中,则结果新项集(I∪A)也不是频繁的,在整个事务数据库中所出现的次数也不可能多于原项集I出现的次数,因此P(I∪A)<min_sup,即(I∪A)也不是频繁的。这样就可以根据逆反公理很容易地确定Apriori性质成立。

2.2 FP-growth算法

由于Apriori方法的固有缺陷.即使进行了优化,其效率也仍然不能令人满意。2000年,Han Jiawei等人提出了基于频繁模式树(Frequent Pattern Tree,简称为FP-tree)的发现频繁模式的算法FP-growth。在FP-growth算法中,通过两次扫描事务数据库,把每个事务所包含的频繁项目按其支持度降序压缩存储到FP—tree中。在以后发现频繁模式的过程中,不需要再扫描事务数据库,而仅在FP-Tree中进行查找即可,并通过递归调用FP-growth的方法来直接产生频繁模式,因此在整个发现过程中也不需产生候选模式。该算法克服了Apriori算法中存在的问颢.在执行效率上也明显好于Apriori算法。

3. 关联分析的计算步骤

3.1 产生频繁项集

Apriori原理

我们可以使用枚举法列举出所有可能的k-itemset,然后计算每个项集的support。一个具有项的数据集可以产生个项集,而其中满足support阈值的项集可能很少。显然,当数据集很大时,枚举法并不是个高效的方法。从下图可以看出,有4个项的数据集,共有15个项集。

为了提高寻找频繁项集的效率,我们应该把那些不可能满足support阈值的项集裁剪掉。 Apriori原理:如果一个项集是频繁的,那么它的子项集也一定是频繁的

反过来说,如果一个项集不是频繁的,那么它的父项集也一定不是频繁的。下图加了阴影的项集被裁剪掉。

3.2 从频繁项集中提取强规则

从频繁项集中提取规则保证了这些规则的support一定满足minsupport,接下来就是置信度的计算。同样,我们可以使用蛮力列举所有可能的规则,并计算其置信度,但这样我们会做许多无用功。为了提高效率,我们采用同前面Apriori算法类似的裁剪方法:如果不满足最小置信度,那么也一定不满足最小置信度。

3.3 提升度评估关联规则

提升度(lift):物品集A的出现对物品集B的出现的概率发生了多大的变化。现在有1000个消费者,有500人购买了茶叶,其中有450人同时 购买了咖啡,另50人没有。由于confidence(茶叶=>咖啡)=450/500=90%,由此可能会认为喜欢喝茶的人往往喜欢喝咖啡。但如果另外没有购买茶叶的500人,其中同样有450人购买了咖啡,同样是很高的置信度90%,由此得到不爱喝茶的也爱喝咖啡。这样看来,其实是否购买咖啡,与有没有购买茶叶并没有关联,两者是相互独立的,其提升度90%/[(450+450)/1000]=1 。

由此可见,lift正是弥补了confidence的这一缺陷,if lift=1,X与Y独立,X对Y出现的可能性没有提升作用,其值越大(lift>1),则表明X对Y的提升程度越大,也表明关联性越强。Leverage 与 Conviction的作用和lift类似,都是值越大代表越关联。做关联规则评估时,需要综合考虑支持度、置信度和提升度三个指标,支持度和置信度的值越大越好。

二、 关联分析R实现

1. 安装R语言包

ibrary(arules)                      #关联规则处理包
library("arulesViz") #关联规则可视化包

2. 数据titanic导入

dd1=read.table("titanic.txt",header=T,row.names = 1)    #从文本文件读入数据
str(dd1) #数据结构展示
str(dd1)
'data.frame': 2201 obs. of 4 variables:
$ class : Factor w/ 4 levels "1st","2nd","3rd",..: 1 1 1 1 1 1 1 1 1 1 ...
$ age : Factor w/ 2 levels "adult","child": 1 1 1 1 1 1 1 1 1 1 ...
$ gender : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
$ survival: Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
head(dd1,5)
class age gender survival
1 1st adult male yes
2 1st adult male yes
3 1st adult male yes
4 1st adult male yes
5 1st adult male yes

3. R处理程序

dd1[,1]<-as.factor(dd1[,1])
dd1[,2]<-as.factor(dd1[,2])
dd1[,3]<-as.factor(dd1[,3])
dd1[,4]<-as.factor(dd1[,4])
rules<-apriori(dd1,control=list(verbose=F),parameter=list(minlen=3,supp=0.002,conf=0.8),appearance=list(rhs=c("survival=yes","survival=no"),default="lhs"))

4. 计算结果

plot(rules,interactive=TRUE)

plot(rules, method = "grouped")

rules.sorted<-sort(rules,by="confidence")
plot(rules.sorted[1:10], method = "graph")

rules.sorted<-sort(rules,by="lift")
plot(rules.sorted[1:10], method = "graph")

rules.sorted<-sort(rules,by="lift")
inspect(rules.sorted[1:10])

提升度是一种很简单的判断关联关系的指标,提升度越大表示关联规则越有实用价值。

rules.sorted<-sort(rules,by="lift")
inspect(rules.sorted[1:10])
lhs rhs support confidence coverage lift count
[1] {class=2nd,
age=child} => {survival=yes} 0.010904134 1.0000000 0.010904134 3.095640 24
[2] {class=1st,
age=child} => {survival=yes} 0.002726034 1.0000000 0.002726034 3.095640 6
[3] {class=2nd,
age=child,
gender=female} => {survival=yes} 0.005906406 1.0000000 0.005906406 3.095640 13

三、总结

关联规则挖掘在生活中有很多应用场景,世间万物的事情发生多多少少会有一些关联。人们通过发现这个关联的规则,可以由一件事情的发生来,来推测另外一件事情的发生,从而更好地了解和掌握事物的发展,动向等等。这就是数据挖掘中,寻找关联规则的基本意义。数据挖掘技术中的关联规则挖掘是通过计算机自动从一大对真实数据中发现这样的关联规则出来。对于计算机而言,它需要知道所有的事情发生情况,并且把相应的事情合并成一个事务,通过对各个事务的扫描,来确定事情的关联规则。关联规则挖掘是个非常有用的技术,可以从繁杂的数据中找出真正有价值的信息知识,提高企业对客户了解程度,时时快捷的发现并满足客户的需求,从而提高企业的竞争力。

参考文献

1.(关联分析(Association analysis))[https://blog.csdn.net/hanghangaidoudou/article/details/79306220]

2.(关联分析)[https://zhuanlan.zhihu.com/p/66944900]

数据挖掘关联分析—R实现的相关教程结束。

《数据挖掘关联分析—R实现.doc》

下载本文的Word格式文档,以方便收藏与打印。