[R语言]关联规则1---不考虑items之间的时序关系

本文介绍的是关联规则,分为两部分:第一部分是---不考虑用户购买的items之间严格的时序关系,每个用户有一个“购物篮”,查找其中的关联规则。第二部分--- 考虑items之间的严格的时序关系来分析用户道具购买路径以及关联规则挖掘。此文为第一部分的讲解。(本文所需的代码和数据集可以在这里下载。)

关联规则最常听说的例子是“啤酒与尿布”:购买啤酒的用户通常也会购买尿布。在日常浏览电商网站时也会出现“购买该商品的用户还会购买….”等提示,这其中应用的就是关联规则的算法。

本文重点讲解的是关联规则的R语言实现以及关联规则的可视化,这里不对关联规则的原理进行讲解,可以参考百度百科---关联规则维基百科--- Apriori algorithm维基百科--- Association rule learning

目录
0.创建购买记录的数据集
1.将购买记录转换为0-1矩阵
2.将0-1矩阵转换成“transcations”形式
3.删除冗余规则
4.关联规则可视化

0.创建购买记录的数据集

下面创建一个1W条购买记录的数据集,一行代表一个用户,列分别是:用户id、道具名称pname、付费金额amount、购买时间time

数据的样式如下:

###有放回地抽取1W个从10000000到10002000,作为用户id

uid<-sample(10000000:10002000,10000,replace=T)

###将日期限定在20160401 10:01:01~20160408 10:01:01,将其转换为unix时间戳的形式,也是取1W条

start_time<-as.numeric(as.POSIXct("2016/04/01 10:01:01", format="%Y/%m/%d %H:%M:%S"))
end_time<-as.numeric(as.POSIXct("2016/04/08 10:01:01", format="%Y/%m/%d %H:%M:%S"))
time<-sample(start_time:end_time,10000,replace=T)

#将两者合并成一个数据框orders

orders<-data.frame(uid,time)
head(orders)

###下面用P1~P20来表示购买的道具名称

pname_list<-c(1:20)

for(i in 1:20){
  pname_list[i]<-paste(‘P‘,i,sep="")
}

#随机将道具名称传递到1W行上

orders$pname<-‘P1‘

for(i in 1:20){
  orders[sample(1:nrow(orders),1000,replace=T),‘pname‘]<-pname_list[i]
}

orders$pname<-as.factor(orders$pname)

#随机将付费金额amount(1到50)传递到1W行上

orders$amount<-10

for(i in 1:50){
  orders[sample(1:nrow(orders),1000,replace=T),‘amount‘]<-i
}

#查看一下数据集,看生成的模拟数据是否正常

head(orders)
summary(orders)

#将数据集写回本地

write.table(orders,‘orders_test.txt‘,sep=‘\t‘,row.names = F,col.names = T)

1.将购买记录转换为0-1矩阵

以上只是完成了第一步:创建数据集。下面进行第二步:将购买记录转换为0-1矩阵形式,其中行表示用户,列表示商品,用1表示用户购买了该道具。

#读取数据集

payer<-read.table("orders_test.txt",sep=‘\t‘,header=T)
head(payer)
dim(payer)

#转换成cast1:行为用户id,列为道具,值为金额

payer2<-payer[,c(‘uid‘,‘pname‘,‘amount‘)]
head(payer2)

library(reshape2)
melt1<-melt(payer2,id=c("uid","pname"));
head(melt1)

cast1<-dcast(melt1,uid~pname,sum);

#下面查看cast1数据集的形式,注意到其中的道具(列名)是按照“字母顺序”排列的,一行代表一个用户,列表示商品,其中的值表示用户在该道具上的总付费金额,一行中所有非0的列名组成了这个用户的“购物篮”,“购物篮”是没有时间先后顺序的。

head(cast1)

#将矩阵cast1转换成0-1矩阵cast2,其中1表示用户购买了该道具

cast2<-matrix(0,ncol=ncol(cast1),nrow=nrow(cast1))

for(j in 1:ncol(cast1)){
  cast2[cast1[,j]>0,j]<-1
}

#注意到其中原本为用户id的第一列全变成了1;列名不是原本的道具名

head(cast2) 

#将0-1矩阵cast2的列名换成cast1的列名(道具名)

colnames(cast2)<-names(cast1);
cast2<-as.data.frame(cast2)
cast2$uid<-cast1$uid
head(cast2)

2.将0-1矩阵转换成“transcations”形式

#将0-1转换成Apriori算法能用的“transcations”形式

cast3<-cast2[,-1]#需要先把第一列uid去掉

#此时还不能转换成transactions形式

library(arules)
arules<-as(cast3,"transactions")

会提示错误:Error in asMethod(object) : column(s) … not logical or a factor. Use as.factor, as.logical or categorize first.

按照上述错误的提示,在将0-1矩阵转换成transactions前,需要先将列转换成factor 或者 logical 型,但是一定要将0-1矩阵转换为logical型而不是factor型,否则会把factor=0的数据也当做项集,后面执行Apriori算法时会消耗大量内存

#之前转换成Factor型后,执行Apriori函数,迟迟出不来结果,内存却蹭蹭蹭往上涨,直到最后宕机,后面通过测试一个小的数据集时才发现其会把factor=0的列也当做项集,尤其当行和列较多的时候,会存在海量的无效项集,从而导致内存爆满。正确方式如下:

for (j in 1:ncol(cast3)){
  cast3[,j]<-as.logical(cast3[,j])#再次提醒!!!一定要将0-1矩阵转换为logical型而不是factor型
}

#转换为apriori算法可用的transactions形式

library(arules)
arules<-as(cast3,"transactions")

#查看其中的项集,就是每个用户的购物篮,如下图所示

inspect(arules[1:10]) 

######下面执行apriori算法,将支持度support的阈值设置为0.01,置信度confidence的阈值设置为0.5,你可以根据自己的需求设置阈值。

rules<-apriori(arules,parameter = list(support=0.01,confidence=0.5))
inspect(rules)

#可以按照提升度排序

sorted_lift<-sort(rules,by=‘lift‘)
inspect(sorted_lift)

3.删除冗余规则

#下面进行第三步,上面满足支持度阈值和置信度阈值的规则共有152条,其中有很多的冗余规则,冗余规则的定义是:如果rules2的lhs和rhs是包含于rules1的,而且rules2的lift小于或者等于rules1,则称rules2是rules1的冗余规则。下面对冗余规则进行删除。

subset.matrix<-is.subset(rules,rules)#生成一个所有规则的子集矩阵,行和列分别是每条rules,其中的值是TRUE和FALSE,当rules2是rules1的子集时,rules2在rules1的值为TRUE
subset.matrix[lower.tri(subset.matrix,diag=T)]<-NA#将矩阵对角线以下的元素置为空,只保留上三角
redundant<-colSums(subset.matrix,na.rm=T)>=1#R会将矩阵中的TRUE当做1,统计每列的和(忽略缺失值),如果该列的和大于等于1,也就是表示该列(规则)是别的规则的子集,应该删除。

rules.pruned<-rules[!redundant]#去掉冗余的规则

#原本152条规则精简到4条规则

inspect(rules.pruned)

#写回本地

write(rules.pruned,"rules_pruned.txt",col.names=NA)

4.关联规则可视化

直接plot画出散点图:

plot(rules)

图中的点颜色越深,表示lift值越大,可以看到lift值高的点集中在低support上。另外也有一些人认为最有意思的规则在support/conf的边沿上。

可以使用interactive=TRUE来实现散点图的互动功能,可以选中一些点查看其具体的规则

plot(rules,interactive=TRUE)

还有类似“气泡图”的展现形式:提升度lift是圈的颜色深浅,圈的大小表示支持度support的大小。LHS的个数和分组中最重要(频繁)项集显示在列的标签里。lift从左上角到右下角逐渐减少。

plot(rules, method = "grouped")

通过箭头和圆圈来表示关联规则,利用顶点代表项集,边表示规则中关系。圆圈越大表示支持度support越大,颜色越深表示提升度lift越大。但是如果规则较多的话会显得很混乱,难以发现其中的规律,因此,通常只对较少的规则使用这样的图,如下是对lift的top10条规则进行可视化。

plot(sorted_lift[1:10], method = "graph")

以上,就是关联规则的R语言实现以及关联规则的可视化,这里不考虑用户购买items之间的时序关系,而是从用户“购物篮”中去挖掘关联规则,下一篇将考虑items之间的严格的时序关系来分析用户道具购买路径以及关联规则挖掘。本文所需的代码和数据集可以在这里下载。

时间: 2024-07-31 08:33:04

[R语言]关联规则1---不考虑items之间的时序关系的相关文章

[R语言]关联规则2---考虑items之间严格的时序关系

前面介绍了关联规则1---不考虑用户购买的items之间的时序关系,但在一些情况下用户购买item是有严格的次序关系了,比如在某些休闲游戏中,用户购买了道具A才能购买道具B,且道具A和B只能购买一次,也就是说购买了道具A是购买道具B的充分条件,如果购买道具A的用户通常会购买道具A,在不考虑时序关系的时候,会得出“BàA”这样的关联规则,这会给运营的同事这样的结论:“购买了道具B的用户也非常有可能会购买道具A,当用户购买了道具B时应向其推荐道具A”,这从数据角度来说是没有问题的,但是从业务的角度来

R语言数据挖掘实战系列(5)

R语言数据挖掘实战系列(5)--挖掘建模 一.分类与预测 分类和预测是预测问题的两种主要类型,分类主要是预测分类标号(离散属性),而预测主要是建立连续值函数模型,预测给定自变量对应的因变量的值. 1.实现过程 (1)分类 分类是构造一个分类模型,输入样本的属性值,输出对应的类别,将每个样本映射到预先定义好的类别.分类模型建立在已有类标记的数据集上,模型在已有样本上的准确率可以方便地计算,所以分类属于有监督的学习. (2)预测 预测是建立两种或两种以上变量间相互依赖的函数模型,然后进行预测或控制.

大数据时代的精准数据挖掘——使用R语言

老师简介: Gino老师,即将步入不惑之年,早年获得名校数学与应用数学专业学士和统计学专业硕士,有海外学习和工作的经历,近二十年来一直进行着数据分析的理论和实践,数学.统计和计算机功底强悍. 曾在某一世界500强公司核心部门担任高级主管负责数据建模和分析工作,在实践中攻克统计建模和数据分析难题无数,数据处理与分析科学精准,在实际应用中取得良好的效果. Gino老师担任数据分析培训师多年,探索出一套以实例讲解带动统计原理理解和软件操作熟悉的方法,授课的学生能迅速理解统计原理并使用统计软件独立开展数

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

R语言快速入门--从最基本的功能讲起

最近因为一些特殊的原因,开始接触R语言.越学越发现R语言的强大,原来完成一件事情是如此的简单.R语言中提供的工具和方法极大的方便了对一些数据的分析和处理的工作.对于一个要立志从事数据分析或者数据挖掘的学生或者工程师来说,学习R语言,确实可以达到如虎添翼的效果. R语言有如下特点: 1. 有效的数据处理和保存机制: 2. 拥有一整套的数组和矩阵操作运算符: 3. 一系列连续而又完整的数据分析工具: 4. 图形统计可以直接对数据进行分析和显示,可用于多种图形设备: 5. R语言是一种相当完善.简洁和

R语言中批量安装软件包

R是一种开源软件,在编程的时候,需要安装很多软件包,如果一个一个的安装,那将费时费力.由于R支持脚本语言,所以考虑用.R文件存放所有要用的软件包,比如MASS.lpSolve.arules等,然后运行这个.R文件,就可以进行批量安装了. 1. 首先,将R语言中的软件包,按照它们的依存关系,保存在一个.R文件中,比如lib2D.R //lib2D.R install.packages("MASS") install.packages("lpSolve") instal

R语言之Apriori算法应用

一. 概念 关联分析用于发现隐藏在大型数据集中的有意义的联系.所发现的联系可以用关联规则(association rule)或频繁项集的形式表示. 项集:在关联分析中,包含0个或多个项的集合被称为项集(itemset).如果一个项集包含k个项,则称它为k-项集.例如:{啤酒,尿布,牛奶,花生} 是一个4-项集.空集是指不包含任何项的项集. 关联规则(association rule):是形如 X → Y 的蕴含表达式,其中X和Y是不相交的项集,即:X∩Y=∅.关联规则的强度可以用它的支持度(su

R 语言的优劣势是什么?

R 语言的优劣势是什么? 2015-05-27 程序员 大数据小分析 R,不仅仅是一种语言 本文原载于<程序员>杂志2010年第8期,因篇幅所限,有所删减,这里刊登的是全文. 工欲善其事,必先利其器,作为一个战斗在IT界第一线的工程师,C/C++.java.perl.python.ruby.php.javascript.erlang等等等等,你手中总有一把使用自如的刀,帮助你披荆斩棘. 应用场景决定知识的储备与工具的选择,反过来,无论你选择了什么样的工具,你一定会努力地把它改造成符合自己应用场

数据分析,R语言

数据结构 创建向量和矩阵 1 函数c(), length(), mode(), rbind(), cbind() 求平均值,和,连乘,最值,方差,标准差 1 函数mean(), sum(), min(), max(), var(), sd(), prod() 帮助文档 1 函数help() 生成向量 1 seq() 生成字母序列letters 新建向量 1 Which()函数,rev()函数,sort()函数 生成矩阵 1 函数matrix() 矩阵运算 1 函数t(),矩阵加减 矩阵运算 1