Р: Какие продукты вместе покупаются чаще? - PullRequest
1 голос
/ 06 августа 2020

У меня есть данные о клиентах, в которых указано, что они покупают. Стоит только подумать, купят они это или нет. Не считается, сколько они покупают. (поэтому 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")

Спасибо заранее!

1 Ответ

4 голосов
/ 06 августа 2020

Эту проблему можно решить простым вызовом 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, но я недостаточно хорошо разбираюсь в графиках, чтобы быстро решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...