r - R:哪些产品一起购买的频率更高?
问题描述
我有一个客户数据,列出了他们购买的东西。它只考虑他们是否购买。它不计算他们购买了多少。(所以 0 或 1 用于条目)
apple banana corn
1 1 0 1
2 0 1 0
3 1 1 1
4 0 0 0
5 1 0 1
我想知道哪些产品可能会一起销售。
我能想到的是考虑所有排列,相应地创建变量并总结个人。
a a_b a_c b b_c a_b_c
1 0 0 1 0 0 0
2 0 0 0 1 0 0
3 0 0 0 0 0 1
4 0 0 0 0 0 0
5 0 0 1 0 0 0
sum 0 0 2 1 0 1
所以在这个小例子中,人们喜欢一起买苹果和玉米。
我尝试按以下方式进行操作,但重复代码变得非常麻烦......
allCombs <- function(x) c(x, lapply(seq_along(x)[-1L], function(y) combn(x, y, paste0, collapse = "_")),recursive = TRUE)
name = c("a","b","c")
for (i in allCombs(name)) {
df[,i] = 0
}
condition_1 = df[,"apple"] == 1
condition_2 = df[,"banana"] == 1
condition_3 = df[,"corn"] == 1
df[condition_1 & !condition_2 & !condition_3, "a"] = 1
df[condition_1 & condition_2 & !condition_3, "a_b"] = 1
...
我想知道如何以更有效/更好的方式来处理所有排列。
此外,如果有更好的方法来解决这个问题,任何见解都会非常有帮助。由于随着产品类别的增加,排列的数量增长非常快,结果矩阵非常稀疏,我认为这不是一个好主意。
这是一个示例数据
df <- structure(list(a = c(1,0,1,0,1), b = c(0,1,1,0,0), c = c(1,0,1,0,1), class = "data.frame")
提前致谢!
解决方案
这可以通过一个简单的调用来解决table
:
DF <- read.table(text = " apple banana corn
1 1 0 1
2 0 1 0
3 1 1 1
4 0 0 0
5 1 0 1", header = TRUE)
as.data.frame(do.call(table, DF))
# apple banana corn Freq
#1 0 0 0 1
#2 1 0 0 0
#3 0 1 0 1
#4 1 1 0 0
#5 0 0 1 0
#6 1 0 1 2
#7 0 1 1 0
#8 1 1 1 1
事实上,苹果+玉米-香蕉是最常见的。但是,这并不能告诉您“这些产品中的哪些可能会一起销售”,因为为此您需要折叠到成对频率。可以这样做:
pairs1 <- combn(DF, 2, function(x) x[1] == 1 & x[1] == x[2], simplify = FALSE)
pairs2 <- combn(names(DF), 2)
paircounts <- data.frame(t(pairs2), freq = sapply(pairs1, sum))
# X1 X2 freq
#1 apple banana 1
#2 apple corn 3
#3 banana corn 1
对于许多产品来说,这不会是有效的,因为组合的数量很快就会变得庞大。我认为你应该能够用包 igraph 做一些聪明的事情,但我对图表还不够好,无法快速解决这个问题。
推荐阅读
- python - ValueError:allow_pickle=False 时无法加载对象数组
- arrays - 扫描和显示数组元素的函数出错
- qt - 从 QString 获取一个数字,然后将其转换为整数
- php - Laravel Sanctum - 通过tenantId 向租户进行身份验证
- rstudio - R Studio AWS Athena 不接受凭证
- powershell - Exchange 2016。引发创建主类别列表?
- c - 为什么我的代码在扫描第一个字符后返回?
- python - 如何覆盖python HTMLcalendar的formatmonth函数?
- zsh - zsh 显示 user@ip 而不是 user@hostname
- database - 哪个数据库/平台最适合存储“相关”事件并生成报告