序列模式关联规则:使用arulesSequences包中的cspade函数

数据抽象

序列(sequence):表示一个完整的信息流.

数据项(item):序列中最小组成单位的集合

事件(event):通常使用时间戳来表示,用于标识同一个序列内不同数据项之间的前后顺序关系。

在网站分析中,可以使用序列模式的关联分析来研究用户的点击行为流,并衡量页面的体验以及易用性效果。

(该实例来自 李明 《R语言与网站分析》中例子)

读取数据

# (1)使用read.fwf函数读入文件
tmpp<-read.fwf("~\\anonymous-msweb.data",width=c(60))
train_list<-tmpp$V1
# (2) 解析有用的数据信息
# 得到字符型向量train_list后,使用字符串处理函数解析出有用信息,并最终存储于数据框data中。代码如下:
tmp_page<-c(0)
tmp_sequenceid<-c(0)
tmp_eventid<-c(0)
m<-0
sequenceid<-0
train_length<-length(train_list)
for(i in 302:train_length){
  tmp<-unlist(strsplit(as.character(train_list[i]),","))
  if(tmp[1]=="C") {
    sequenceid<-sequenceid+1
    eventid<-0
  } else if(tmp[1]=="V") {
    m<-m+1
    eventid<-eventid+1
    tmp_sequenceid[m]<-sequenceid #填充sequenceID
    tmp_eventid[m]<-eventid     #填充eventID
    tmp_page[m]<-as.numeric(tmp[2])
  }
}
tmp_page<-factor(tmp_page)
data<-data.frame(page=tmp_page,seqid=tmp_sequenceid,eventid=tmp_eventid)
# (3) 帅选浏览轨迹中包含目标页面1034的数据
# 因为本实例要寻找哪些页面会引导用户进入关键页面1034,以及其贡献度和能力。所有这里先要筛选出轨迹中与目标页面1034相关的数据# data.user.代码如下:
user.page=1034
user.sequenceid<-unique(data$seqid[which(data$page==user.page)])
i<-1;data.user<-data[1,]
for(seq.i in user.sequenceid){
  data.user<-rbind(data.user,subset(data,seqid==seq.i))
  i<-i+1
}
data.user<-data.user[-1,]

使用cspade函数进行序列模式关联分析

# (1) 数据准备
# 首先加载arulesSequences算法包,并把存有目标页面1034浏览轨迹信息(包括序列id和事件id以及数据项信息)的数据框data.user转化# 为cspade函数可用的数据对象data.tran。代码如下:
library(arulesSequences)
tmp_data<-data.frame(page=data.user$page)
data.tran<-as(tmp_data,"transactions")
transactionInfo(data.tran)$sequenceID<-data.user$seqid
transactionInfo(data.tran)$eventID<-data.user$eventid
# 利用transactionInfo函数查看前六数据
head(transactionInfo(data.tran))
##   transactionID sequenceID eventID
## 1             1         20       1
## 2             2         20       2
## 3             3         20       3
## 4             4         20       4
## 5             5         21       1
## 6             6         21       2
# (2) 使用cspade函数进行分析
# 找出用户进行1034页面前浏览过的页面i,以及序列<{page=i},{page=1034}>的支持度。代码如下:
result<-cspade(data.tran,parameter=list(support=0,maxlen=2),control=list(verbose=TRUE))
##
## parameter specification:
## support :  0
## maxsize : 10
## maxlen  :  2
##
## algorithmic control:
## bfstype  : FALSE
## verbose  :  TRUE
## summary  : FALSE
## tidLists : FALSE
##
## preprocessing ... 1 partition(s), 0.78 MB [0.34s]
## mining transactions ... 0.17 MB [0.33s]
## reading sequences ... [0.81s]
##
## total elapsed time: 1.48s
result<-sort(result,by="support")
page.2<-paste(".*page=",user.page,"[^\\}]*\\}>",sep="")
result.2<-result[grep(page.2,as(result,"data.frame")$sequence)]
# (inspect(result.2)

筛选重点页面并衡量其引导能力

(1) 重点页面

1)计算各页面支持度的百分比,并把比例累计达到70%的页面作为引导用户进入1034页面的重点页面。

result.data.frame<-as(result.2[-1],"data.frame")

2)计算支持度support的百分比。代码如下:

persent<-result.data.frame$support/sum(result.data.frame$support)

3)使用累加函数cumsum()计算支持度support的累计百分比,并把百分比数据persent和sum.persent并入数据框result.data.frame中。代码如下

sum.persent<-cumsum(persent)
result.data.frame<-cbind(result.data.frame,persent,sum.persent)

4)使用subset函数筛选出累计百分比sum.persent小于70%(max.persent)的序列数据。代码如下:

max.persent=0.7
result.data.frame<-result.data.frame[result.data.frame$sum.persent<max.persent,]
# 最终数据框格式如下:
head(result.data.frame)
##                       sequence support persent sum.persent
## 6458 <{page=1008},{page=1034}> 0.55473 0.24290      0.2429
## 6467 <{page=1017},{page=1034}> 0.16082 0.07042      0.3133
## 6459 <{page=1009},{page=1034}> 0.10903 0.04774      0.3611
## 6454 <{page=1004},{page=1034}> 0.09592 0.04200      0.4031
## 6476 <{page=1026},{page=1034}> 0.09539 0.04177      0.4448
## 6451 <{page=1001},{page=1034}> 0.08249 0.03612      0.4809
tail(result.data.frame)
##                       sequence support persent sum.persent
## 6486 <{page=1038},{page=1034}> 0.03432 0.01503      0.6347
## 6481 <{page=1032},{page=1034}> 0.03378 0.01479      0.6495
## 6488 <{page=1040},{page=1034}> 0.03293 0.01442      0.6639
## 6485 <{page=1037},{page=1034}> 0.02792 0.01223      0.6761
## 6516 <{page=1070},{page=1034}> 0.02750 0.01204      0.6882
## 6479 <{page=1030},{page=1034}> 0.02568 0.01125      0.6994

(2) 解析重点页面编号

列数据result.data.frame$sequence是<{page=i},{page=1034}>形式的序列信息,下面解析出其中的页面编号i,并存放于page向量

page<-0;i<-1
for(i.seq in result.data.frame$sequence){
  real_seq1<-regexpr("<\\{page=",i.seq)+7
  real_seq2<-regexpr("\\}",i.seq)[1]-1
  page[i]<-substr(i.seq,real_seq1,real_seq2)
  i<-i+1
}

(3) 重点页面的引导能力

conf(i=>1034)=页面i引导用户进入关键页面1034的次数/页面i的浏览次数来衡量页面i引导用户进入页面1034的能力,由于其含义类似于信任度,因此这里记为conf。

得到重点页面编号page后,可以通过原始数据data来计算页面i的浏览次数。代码如下:

i<-1;uv<-0
for(i.page in page){
  uv[i]<-length(unique(data$seqid[which(data$page==i.page)]))
  i<-i+1
}
页面i引导用户进入关键页面1034的次数就是序列<{page=i},{page=1034}>的支持度乘以其序列数[email protected]$nsequences,最后得到:
conf<-result.data.frame$support*result@info$nsequences/uv

把page和conf也并入数据框result.data.frame中。代码如下:

result.data.frame<-cbind(result.data.frame,conf=conf,page=page)

绘制结果图表

首先使用柱状图barplot函数绘制序列<{page=重要页面i},{page=1034}>支持度的百分比result.data.frame$persent,然后使用红色曲线(lines函数)绘制衡量重要页面i引导用户能力的conf,接着使用text函数在曲线上绘制conf的数值,最后使用axis函数把重要页面的编号信息填x轴处。代码如下:

barplot(as.matrix(result.data.frame$persent,nrow=1),ylim=c(0,1),beside=TRUE,xlab="页面名称",
        main="引导用户进入关键页面1034的重点页面分析")
lines(0.5+c(1:nrow(result.data.frame)),result.data.frame$conf,type="b",col="red")
text(0.5+c(1:nrow(result.data.frame)),result.data.frame$conf,
     labels=paste(round(result.data.frame$conf*100,2),"%",sep=""))
axis(1,at=0.5+c(1:nrow(result.data.frame)),labels=result.data.frame$page,tick=FALSE)

结论:页面1008是为页面1034的访问贡献最大的页面,其次是1007、1009等。而在引导能力上,页面1004和1018较低,鉴于页面1004为关键页面1034的访问贡献较大(非排名第4),但引导能力较低,因此要重点优化该页面。

时间: 2024-11-05 22:46:27

序列模式关联规则:使用arulesSequences包中的cspade函数的相关文章

R语言:利用caret包中的dummyVars函数进行虚拟变量处理

dummyVars函数:dummyVars creates a full set of dummy variables (i.e. less than full rank parameterization----建立一套完整的虚拟变量 先举一个简单的例子: survey<-data.frame(service=c("very unhappy","unhappy","neutral","happy","very

go包中的init() 函数

https://tutorialedge.net/golang/the-go-init-function/ ----------------------------------------------------------------------- There are times, when creating applications in Go, that you need to be able to set up some form of state on the initial star

[转]go中的main函数和init函数

Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数. Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数.每个package中的init函数都是可选的,但package main就必

golang中的init函数以及main函数

首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package main中. 执行顺序 golang里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值. 虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

地图包中和定位系统包中的主要类

地图包中的主要类: MapController :  主要控制地图移动,伸缩,以某个GPS坐标为中心,控制MapView中的view组件,管理Overlay,提供View的基本功能.使用多种地图模式(地图模式(某些城市可实时对交通状况进行更新),卫星模式,街景模式)来查看Google Map.常用方法:animateTo(GeoPoint point)  setCenter(GeoPoint point)  setZoom(int zoomLevel) 等. Mapview  : 是用来显示地图

黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或文件夹封装成对象 (2)方便于对“文件”与“文件夹属性信息”进行操作 (3)File对象,可以作为参数传递给流的构造函数 (二)构造方法 * 通过File的构造函数创建File对象 方式1:File f = new File("c:\\a.txt"); 方式2:File f2 = newF

变量在SSIS包中的使用

2010~2011年经常使用SSIS包采集加工数据,后来换了工作就很少使用.最近又开始用那玩意采集数据,努力回想之前是怎样操作的,网上各种找各种纠结.趁这次使用记录下日常操作步骤,以备以后不时之需. --环境SQL Server2012.VS2010(安装数据库时默认会安装)下载示例数据库AdventureWorks2012 1 CREATE DATABASE [AdventureWorks2012] ON 2 (FILENAME=N'D:\SQL2012\MSSQL11.SQL12\MSSQL