关联分析

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

一、关联分析概述

关联分析可从数据库中关联分析出形如“由于某些事件的发生而引起另外一些事件的发生”之类的规则。如“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实现的更多相关文章

  1. 数据挖掘-关联分析 Apriori算法和FP-growth 算法

    •1.关联分析概念 关联分析是从大量数据中发现项集之间有趣的关联和相关联系. ​ •定义:1.事务:每一条交易称为一个事务,如上图包含5个事务.2.项:交易的每一个物品称为一个项,例如豆奶,啤酒等. ...

  2. R系列:关联分析;某电商平台的数据;做捆绑销售和商品关联推荐

    附注:不要问我为什么写这么快,是16年写的. 一.分析目的 I用户在某电商平台买了A,那么平台接下来应该给用户推荐什么,即用户在买了商品A之后接下来买什么的倾向性最大: II应该把哪些商品在一起做捆绑 ...

  3. 【数据挖掘】关联分析之Apriori(转载)

    [数据挖掘]关联分析之Apriori 1.Apriori算法 如果一个事务中有X,则该事务中则很有可能有Y,写成关联规则 {X}→{Y} 将这种找出项目之间联系的方法叫做关联分析.关联分析中最有名的问 ...

  4. 关联分析中寻找频繁项集的FP-growth方法

    关联分析是数据挖掘中常用的分析方法.一个常见的需求比如说寻找出经常一起出现的项目集合. 引入一个定义,项集的支持度(support),是指所有包含这个项集的集合在所有数据集中出现的比例. 规定一个最小 ...

  5. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  6. 全基因组关联分析(Genome-Wide Association Study,GWAS)流程

    全基因组关联分析流程: 一.准备plink文件 1.准备PED文件 PED文件有六列,六列内容如下: Family ID Individual ID Paternal ID Maternal ID S ...

  7. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

  8. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  9. 数据挖掘-关联规则分析[ZZ]

    1.什么是关联规则 "尿布与啤酒"的故事大家都有听过,这里就不罗嗦了. 按常规思维,尿布与啤酒风马牛不相及,若不是借助数据挖掘技术对大量交易数据进行挖掘分析,沃尔玛是不可能发现数据 ...

  10. SEAndroid安全机制中的进程安全上下文关联分析

    前面一篇文章分析了文件安全上下文关联过程.可是在SEAndroid中,除了要给文件关联安全上下文外,还须要给进程关联安全上下文.由于仅仅有当进程和文件都关联安全上下文之后,SEAndroid安全策略才 ...

随机推荐

  1. SourceMap解析

    前端发展至今已不再是刀耕火种的年代了,出现了typescript.babel.uglify.js等功能强大的工具.我们手动撰写的代码一般具有可读性,并且可以享受高级语法.类型检查带来的便利,但经过工具 ...

  2. Alibaba Cloud Linux 3.2104 64位安装mysql5.6.45

    1 .安装cmake wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz tar -zxvf cmake-2.8.10.2.tar.g ...

  3. linux 命令下载文件

    系统  ubuntu  :若提示没有找到命令 请自行下截安装 sz 命令发送文件到本地:# sz filename rz命令本地上传文件到服务器:# rz执行该命令后,在弹出框中选择要上传的文件即可.

  4. Java常用几种加密算法(四种)

    Java常用几种加密算法(四种) HChan 万丈红尘三杯酒,千秋大业一壶茶. 3 人赞同了该文章 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RF ...

  5. ubuntu(一)

    1.首先在上手之前准备几样开发辅助工具: ①vmware ②ubuntu ③xshell ④xftp 2.创建ubuntu系统 打开vmware创建一个新的虚拟机 在创建虚拟机时有几处需要留意 首先是 ...

  6. Java中接口相关知识

    1.接口 1.1接口概述 接口就是一种公共的规范标准,只要符合标准,大家都可以通用 Java中的接口更多的体现在对行为的抽象 1.2接口的特点 接口用关键字interface修饰,格式:public ...

  7. 正确理解RestFul 接口

    一.REST# REST,即Representational State Transfer的缩写,翻译过来就是"表现层状态转化".不得不承认,我在刚开始看到这个名词的时候是一脸懵逼 ...

  8. jsp第8个作业

    public boolean addMail(Msg msg){ Statement st =null; Connection con=null; try{ //获取连接 con = getConne ...

  9. 【线性DP】乌龟棋

    #include<bits/stdc++.h> using namespace std; int a[400],b[5]; int dp[50][50][50][50]; int main ...

  10. Linux应用开发之【多线程开发-回调函数】

    原来我一直都不懂回调函数是什么 ... Callback Function 定义:通过函数指针调用的函数 在理解这个回调函数之前我们需要先了解回调机制 回调机制在编程中体现在:特定的情况发生后,返回并 ...