使用R中的arules包与重复事务进行关联分析

时间:2013-06-17 14:09:03

标签: r arules market-basket-analysis

我想以篮子格式创建一个交易对象,我可以随时调用它进行分析。数据包含逗号分隔的项目,包含1001个事务。前10个交易看起来像这样:

hering,corned_b,olives,ham,turkey,bourbon,ice_crea
baguette,soda,hering,cracker,heineken,olives,corned_b
avocado,cracker,artichok,heineken,ham,turkey,sardines
olives,bourbon,coke,turkey,ice_crea,ham,peppers
hering,corned_b,apples,olives,steak,avocado,turkey
sardines,heineken,chicken,coke,ice_crea,peppers,ham
olives,bourbon,coke,turkey,ice_crea,heineken,apples
corned_b,peppers,bourbon,cracker,chicken,ice_crea,baguette
soda,olives,bourbon,cracker,heineken,peppers,baguette
corned_b,peppers,bourbon,cracker,chicken,bordeaux,hering
...

我发现数据中存在重复的事务并将其删除,但每次我尝试读取事务时,都会得到:

asMethod(object)出错:   不能用包含重复项目的交易强制列表

这是我的代码:

data <- read.csv("AssociationsItemList.txt",header=F)
data <-  data[!duplicated(data),]
pop <- NULL
for(i in 1:length(data)){
pop <- paste(pop, data[i],sep="\n")
}
write(pop, file = "Trans", sep = ",")
transdata <- read.transactions("Trans", format = "basket", sep=",")

我确信我错过了一些重要的东西。请提供帮助。

3 个答案:

答案 0 :(得分:16)

问题不在于重复的交易(同一行出现两次) 但重复的项目(同一项目出现两次,在同一笔交易中 - 例如,第4行的“橄榄”。

read.transactions有一个rm.duplicates参数来删除这些重复项。

read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE)

答案 1 :(得分:1)

Vincent Zoonekynd是对的,问题是由交易中的重复项引起的。在这里,我可以解释为什么arules需要没有重复项目的交易。

  • transactions的数据在内部存储为ngCMatrix对象。相关源代码:

    setClass("itemMatrix",
      representation(
        data        = "ngCMatrix", 
    ...
    setClass("transactions",
      contains = "itemMatrix",
    ...
    
  • ngCMatrix是在Matrix包中定义的稀疏矩阵。这是官方文件中的描述:

      

    nsparseMatrix类是稀疏“模式”矩阵的虚拟类,即概念上具有TRUE / FALSE条目的二进制矩阵。仅存储TRUE元素的位置

二进制指标似乎ngCMatirx存储了元素的状态。这意味着transactions中的arules对象只能为交易对象存储存在/不存在,并且无法记录数量。所以......

答案 2 :(得分:0)

我只是使用'unique'功能来删除重复项。我的数据有点不同,因为我有一个数据框(数据对于CSV而言太大)而且我有两列:product_id和transaction_id。我知道这不是您的具体问题,但我必须这样做才能创建交易数据集并应用关联规则。

data # > 1 Million Transactions 
data <- unique(data[ , 1:2 ] )
trans <- as(split(data[,"product_id"], data[,"trans_id"]),"transactions")
rules <- apriori(trans, parameter = list(supp = 0.001, conf = 0.2))