首页 > 解决方案 > 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")

提前致谢!

标签: r

解决方案


这可以通过一个简单的调用来解决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 做一些聪明的事情,但我对图表还不够好,无法快速解决这个问题。


推荐阅读