前言

世界上的万事万物都有着千丝万缕的联系,我们要善于发现这种关联。关联分析要解决的主要问题是:一群用户购买了很多产品之后,哪些产品同时购买的几率比较高?买了A产品的同时买哪个产品的几率比较高?可能是由于最初关联分析主要是在超市应用比较广泛,所以又叫“购物篮分析”,英文简称为MBA,当然此MBA非彼MBA,意为Market Basket Analysis。

关联分析是数据挖掘中一项基础又重要的技术,是一种在大型数据库中发现变量之间有趣关系的方法。说到数据挖掘的案例,相信很多人都会首先想到沃尔玛超市发现购买尿布的顾客通常也会购买啤酒,于是把啤酒和尿布放在一起销售同时提高了两者的销量的案例。这是关联分析在商业领域应用的一个典型,通过对大量商品记录作分析,提取出能够反映顾客偏好的有用的规则。有了这些关联规则,商家制定相应的营销策来来提高销售量。关联技术不但在商业领域被广泛应用,在医疗,保险,电信和证券等领域也得到了有效的应用。

Apriori原理简介

关联分析有三个非常重要的概念,那就是“三度”:支持度、可信度、提升度

假设有10000个人购买了产品,其中购买A产品的人是1000个,购买B产品的人是2000个,AB同时购买的人是800个。

支持度指的是关联的产品(假定A产品和B产品关联)同时购买的人数占总人数的比例,即800/10000=8%,有8%的用户同时购买了A和B两个产品;

可信度指的是在购买了一个产品之后购买另外一个产品的可能性,例如购买了A产品之后购买B产品的可信度=800/1000=80%,即80%的用户在购买了A产品之后会购买B产品;

提升度就是在购买A产品这个条件下购买B产品的可能性与没有这个条件下购买B产品的可能性之比,没有任何条件下购买B产品可能性=2000/10000=20%,那么提升度=80%/20%=4。

一句话关联规则:关联规则是展现项集(itemsets)间关联(association)与相关性(correlation)的规则!

在关联规则挖掘中,满足一定最小置信度以及支持度的集合成为频繁集(frequent itemset),或者强关联。关联规则挖掘则是一个寻找频繁集的过程

总之,可信度是对关联规则的准确度的衡量,支持度是对关联规则重要性的衡量。支持度说明了这条规则在所有事务中有多大的代表性,显然支持度越大,关联规则越重要。有些关联规则可信度虽然很高,但支持度却很低,说明该关联规则实用的机会很小,因此也不重要。

Apriori算法理论  

在了解了关联规则的三个度的基本定义之后,下一步则需要阐述清楚Apriori算法的基本定义。  

在讲Apripri算法之前,我们首先要清楚两个概念:  

有了上面两个概念打底,Apriori算法就可以被定义了。Apripri算法主要分为三步:  

相比于最原始的一一计算,使用Apripor算法计算频繁项集可以大大地减少运算量,提升计算效率。  到底,理论的梳理就完全结束,下一步我将会对关联规则进行实战演练。

关联规则应用

关联规则算法的主要应用是购物篮分析,是为了从大量的订单中发现商品潜在的关联。其中常用的一个算法叫Apriori先验算法。

Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。

Apriori相关函数使用

# 数据转成data.frame格式
mdata <- as(mdata, "data.frame")
# 将数据转换成事务集形式(分组之后)
mdata <- as(mdata, "transactions")

library(arules)
library(grid)
library(arulesViz)  # 加载可视化包

# ?apriori

Usage

apriori(data, parameter = NULL, appearance = NULL, control = NULL)

参数说明

  • Data:交易数据(transactions)类对象或任何能够被转化成transaction的数据结构

  • Parameter:APparameter类对象或命名列表。挖掘规则默认的行为是:支持度=0.1;置信度=0.8;输出的最大规则长度;

  • Appearance:APappearance类对象或命名列表。

  • Control:APcontrol类对象或命名列表。控制挖掘算法的性能!

细节说明

APparameter中minlen(最小规则数)默认的值是1,这意味着将会产生只有一项(item:比如,先前项/LHS)的规则:{}=>{beer}—这项规则说明,no matter what other items are involved the item in the RHS will appear with the probability given by the rule’s confidence (which equals the support)。如果想要避免这些规则,可以使用参数:parameter=list(minlen=2)!

返回值说明

返回一个rules类对象或itemsets类对象。

探索和准备数据

  • 事务型数据每一行指定一个单一的实例,每条记录包括用逗号隔开的任意数量的产品清单
  • 通过inspect()函数可以看到超市的交易记录,每次交易的商品名称;
  • 通过summary()函数可以查看该数据集的一些基本信息。

提高模型的性能

根据购物篮分析的目标,最有用的规则或许是那些具有高支持度、信度和提升度的规则。arules包中包含一个sort()函数,通过指定参数by为“support”,“confidence”或者“lift”对规则列表进行重新排序。 在默认的情况下,排序是降序排列,可以指定参数decreasing=FALSE反转排序方式。

lift(提升度),表示用来度量一类商品相对于它的一般购买率,此时被购买的可能性有多大 (Lift)是避免了一些不平衡数据标签的偏差性,Lift越大,则数据质量较好;Lift越小,则数据越不平衡。在此处设置lift值为3。

inspect(head(sort(rules, by="lift"), 3))

find redundant rules 函数介绍:

is.subset和is.superset函数用于在关联和项集矩阵对象中发现子集或父集!

Is.subset(x,y=NULL, proper=FALSE, sparse=FALSE,...)

返回一个与给定矩阵(在上三角或下三角中TRUE)相同大小的逻辑矩阵

Lower.tri(x,diag=FALSE)

设置支持度0.2,置信度0.5对数据进行关联规则处理

rules=apriori(mdata,parameter=list(support=0.2,confidence=0.5))

minlen=2表示规则中至少包含两种商品,这可以防止仅仅是由于某种商品被频繁购买而创建的无用规则

rules=apriori(mdata,parameter=list(support=0.2,confidence=0.5,minlen = 2))