大数据集的市场桶分析

Posted

技术标签:

【中文标题】大数据集的市场桶分析【英文标题】:Market bucket analysis on large data set 【发布时间】:2018-06-08 17:08:36 【问题描述】:

我正在对包含 2 列(OrderID 和 Product)的大型数据集创建市场桶分析。集合中有超过一百万行,使用 apriori 包,我能够使用较小的数据子集创建有效的规则列表,但是在尝试使用完整集合时,我无法使用拆分功能按 OrderID 聚合数据。是否有另一个具有类似拆分功能的函数可以处理这么多数据?代码如下:

MyData <- read.csv("C:/Market Basket Analysis/BOD16-Data.csv") #Abreviated for proprietary reasons
View(MyData)

library(arules)
summary(MyData)

#Using the split function, we are able to aggregate the transactions, so that each
#product on the transaction is grouped into its respective, singular, transID

start.time <- Sys.time() #Timer used to measure run time on the split function
aggregateData <- split(MyData$Product, MyData$OrderID)
end.time<- Sys.time()

time.taken = end.time- start.time
time.taken


#Using the split function, we are able to aggregate the transactions, so that each
#product on the transaction is grouped into its respective, singular, transID
aggregateData <- split(MyData$Product, MyData$OrderID)
head(aggregateData)

#Need to convert the aggregated data into a form that 'Arules' package 
#can accept
txns <- as(aggregateData, "transactions")
#txns <- read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE)
summary(txns)


#Apriori Algorithem generates the rules 
Rules <- apriori(txns,parameter=list(supp=0.0025,conf=0.4,target="Rules",minlen=2))
inspect(Rules)

编辑: 我的数据如下:

OrderId     Product
1       1234
1       1357
1       2468
1       1324
2       1234
2       2468
3       4321
4       5432
5       1357

AggregateData should be:

[1]
1234,1357,2468,1324

[2]
1234, 2468

[3]
4321

[4]
5432

[5]
1357

目前我正在使用拆分功能来实现这些结果,但是当将其应用于更大的集合时,运行时间超过了 30 分钟 在我停止脚本之前。

【问题讨论】:

您能给我们提供MyData 的样本以及aggregateData 的外观吗? 我必须将其添加到原始帖子中以实现正确的格式。 【参考方案1】:

这对你来说更快吗?

library(dplyr) 

df <- tribble(
    ~OrderId, ~Product,
    1,       1234,
    1,       1357,
    1,       2468,
    1,       1324,
    2,       1234,
    2,       2468,
    3,       4321,
    4,       5432,
    5,       1357
    )

    df %>% 
         group_by(OrderId) %>% 
         summarize(Product = list(Product)) %>% 
         mutate(Product = purrr::set_names(Product, OrderId)) %>% 
         pull(Product)

所以对于您的代码,您应该能够做到:

library(dplyr)

MyData <- read.csv("C:/Market Basket Analysis/BOD16-Data.csv")


 aggregateData <-   MyData %>% 
          group_by(OrderId) %>% 
          summarize(Product = list(Product)) %>% 
          mutate(Product = purrr::set_names(Product, OrderId)) %>% 
          pull(Product)

这应该是一样的(希望更快):

MyData <- read.csv("C:/Market Basket Analysis/BOD16-Data.csv")

aggregateData <- split(MyData$Product, MyData$OrderID)

【讨论】:

我认为这是我正在寻找的那种功能,但是我对 tribble 的语法或者如何确定如何将其应用于一组数据而不是手动输入的列表不太熟悉比如上面的例子。请告知如何针对这一变化进行调整。 这是我尝试过的,但它给了我一个错误,说错误:期望一个带有单个参数的列名;例如~name df 使用 tribble 只是一种从示例数据中创建类似对象的数据框的快速方法,这就是我使用它的原因。你不需要 tibble 来运行它下面的代码。您可以在普通数据帧上运行 tribble 下面的代码(从 df %&gt;% ... 开始)。 我添加到我的答案中,以便更清楚地了解如何将代码与您的完整数据集一起使用。 您的推荐效果很好,感谢您的帮助!

以上是关于大数据集的市场桶分析的主要内容,如果未能解决你的问题,请参考以下文章

可视化丨福尔摩斯探案集的数据分析

离散数学关于粗糙集的讨论

大数据集报表点击表头排序

具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时

大数据分析领域模型有哪些

大数据分析领域模型有哪些