关联规则
比较项集(Items)之间的相似度的方法有很多种。这些方法属于关联规则这一技术范畴。简单的说,关联规则挖掘的结果是得到一个集合,而集合里的元素类似于A->B(由A推导出B)。
应用
那么我们关心哪些项目呢?以下是关联规则挖掘的应用:
- 商品推荐——像Amazon的“买屋及乌”
- 音乐推荐——像Last.fm的歌手推荐
- 医学诊断——像糖尿病
- 内容推荐——像网站或者博客
本文关注点是关联规则挖掘在零售行业的应用,因为它简单直观。此外,R语言的相关包包含一个零售数据集,你可以通过该数据集来学习关联规则挖掘。
Groceries数据集
假如你的桌子上有10000张收据。每一张收据表示一次购买商品(一个或者多个)的交易记录。这些收据可以认为是顾客的购物篮。如果对这些收据进行分析,那么这便是超市购物篮分析。
事实上,Groceries数据集的每一行表示一次交易记录,行中的每一列代表一个商品。你可以下载Groceries数据集来查看数据格式,但是这不是必须的步骤。
数学相关知识
我们已经讨论过了交易和项集的概念了。
一个项集可以表示为:
I
=
(
i
1
,
i
2
,
.
.
.
i
n
)
I=(i_1,i_2,...i_n)
I=(i1,i2,...in)
一次交易可以表示为:
t
n
=
(
i
j
,
i
k
,
.
.
.
i
n
)
t_n=(i_j,i_k,...i_n)
tn=(ij,ik,...in)
关联规则挖掘可以表示为:
(
i
1
,
i
2
)
=
>
(
i
k
)
(i_1,i_2) => (i_k)
(i1,i2)=>(ik)
该表达式可以理解为,如果顾客购买了表达式左边的项集,那么他可能购买表达式右边的项集。下面是一个更为通俗的例子:
(
c
o
f
f
e
e
,
s
u
g
a
r
)
=
>
(
m
i
l
k
)
(coffee,sugar)=> (milk)
(coffee,sugar)=>(milk)
如果一个顾客购买了咖啡和糖,那么他可能还会买牛奶。
由此,我们可以了解下支持度、置信度和lift。下面我们将描述这些值,如果你想知道它们的数学意义,那么你可以查阅维基百科。
- 支持度:包含指定项集的记录在数据集的占比
- 置信度:由指定项集推导出的规则与该项集之比
- 提升度:由项集推导出的规则的置信度与规则右侧的项集之比
注意:如果提升度等于1,那么该规则的左右两侧的项集是不相关的。
Apriori挖掘
加载相关包和数据集
# Load the libraries
library(arules)
library(arulesViz)
library(datasets)
# Load the data set
data(Groceries)
在挖掘规则之前探索下数据集
# Create an item frequency plot for the top 20 items
itemFrequencyPlot(Groceries,topN=20,type="absolute")
现在我开始挖掘规则!你必须设置最小支持度和最小置信度。
-最小支持度设置为0.001
- 最小置信度设置为0.8
- 我们只显示规则中的top5
# Get the rules
rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8))
# Show the top 5 rules, but only 2 digits
options(digits=2)
inspect(rules[1:5])
输出如下:
lhs rhs support confidence lift
1 {liquor,red/blush wine} => {bottled beer} 0.0019 0.90 11.2
2 {curd,cereals} => {whole milk} 0.0010 0.91 3.6
3 {yogurt,cereals} => {whole milk} 0.0017 0.81 3.2
4 {butter,jam} => {whole milk} 0.0010 0.83 3.3
5 {soups,bottled beer} => {whole milk} 0.0011 0.92 3.6
由以上可知,如果客户购买了yogurt和cereals,那么他有81%的概率买whole milk
我们总结了一些关于规则的信息,这些信息可以为我们提供有趣的内容,例如:
- 生成规则总数:410条
- 规则的长度分布:大多数规则的长度为4
- 挖掘结果分析:将支持度、置信度和提升度取不同的值
- 挖掘信息:数据总数和最小参数
set of 410 rules
rule length distribution (lhs + rhs): sizes
3 4 5 6
29 229 140 12
summary of quality measures:
support conf. lift
Min. :0.00102 Min. :0.80 Min. : 3.1
1st Qu.:0.00102 1st Qu.:0.83 1st Qu.: 3.3
Median :0.00122 Median :0.85 Median : 3.6
Mean :0.00125 Mean :0.87 Mean : 4.0
3rd Qu.:0.00132 3rd Qu.:0.91 3rd Qu.: 4.3
Max. :0.00315 Max. :1.00 Max. :11.2
mining info:
data n support confidence
Groceries 9835 0.001 0.8
排序
通过观察发现,挖掘出的规则是没有排序的。我们总是想要最相关的规则。或者说,我们想要最可能发生的规则。通过以下代码就可以实现根据置信度将规则排序:
rules<-sort(rules, by="confidence", decreasing=TRUE)
现在我们输出了根据置信度排序后的最相关的前5条规则
lhs rhs support conf. lift
1 {rice,sugar} => {whole milk} 0.0012 1 3.9
2 {canned fish,hygiene articles} => {whole milk} 0.0011 1 3.9
3 {root vegetables,butter,rice} => {whole milk} 0.0010 1 3.9
4 {root vegetables,whipped/sour cream,flour} => {whole milk} 0.0017 1 3.9
5 {butter,soft cheese,domestic eggs} => {whole milk} 0.0010 1 3.9
第4条规则有些长。你可以设置更明确的规则。只要在apriori的函数中添加“maxlen”参数即可:
rules <- apriori(Groceries, parameter = list(supp = 0.001, conf = 0.8,maxlen=3))
冗余规则处理
有时候,规则会重复生成。冗余规则指的是一条规则被重复给出。作为一个分析师,你应该删除生成的冗余规则。
用下面的代码可以删除重复生成的规则:
subset.matrix <- is.subset(rules, rules)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
rules.pruned <- rules[!redundant]
rules<-rules.pruned
目标项集
我们知道了如何生成项集、限制输出,现在我们生成关于指定的目标项集的规则。我们可能感兴趣的目标有两种,以“whole milk”来说明:
- 客户在购买whole milk前会购买什么?
- 客户购买了whole milk后还会购买什么?
这基本上意味着我们要设置关联规则的左边或者右边。这对R语言并不难。
针对第一个问题,我们将apriori函数做以下调整:
rules<-apriori(data=Groceries, parameter=list(supp=0.001,conf = 0.08),
appearance = list(default="lhs",rhs="whole milk"),
control = list(verbose=F))
rules<-sort(rules, decreasing=TRUE,by="confidence")
inspect(rules[1:5])
结果如下:
lhs rhs supp. conf. lift
1 {rice,sugar} => {whole milk} 0.0012 1 3.9
2 {canned fish,hygiene articles} => {whole milk} 0.0011 1 3.9
3 {root vegetables,butter,rice} => {whole milk} 0.0010 1 3.9
4 {root vegetables,whipped/sour cream,flour} => {whole milk} 0.0017 1 3.9
5 {butter,soft cheese, domestic eggs} => {whole milk} 0.0010 1 3.9
同样的,我们设置关联规则的左边为“whole milk”。需要注意的是:
- 由于置信度设为0.8时没有规则产生,因此设为0.15
- 项集长度设置为2,以避免规则左边的项集为空
rules<-apriori(data=Groceries, parameter=list(supp=0.001,conf = 0.15,minlen=2),
appearance = list(default="rhs",lhs="whole milk"),
control = list(verbose=F))
rules<-sort(rules, decreasing=TRUE,by="confidence")
inspect(rules[1:5])
结果如下:
lhs rhs support confidence lift
1 {whole milk} => {other vegetables} 0.075 0.29 1.5
2 {whole milk} => {rolls/buns} 0.057 0.22 1.2
3 {whole milk} => {yogurt} 0.056 0.22 1.6
4 {whole milk} => {root vegetables} 0.049 0.19 1.8
5 {whole milk} => {tropical fruit} 0.042 0.17 1.6
6 {whole milk} => {soda} 0.040 0.16 0.9
可视化:
最后一步是可视化。我们可以通过arulesViz包来画出规则的图。
library(arulesViz)
plot(rules,method="graph",interactive=TRUE,shading=NA)
你会得到一幅可移动的图,像这样: