Rコードを最適化するのは興味深い作業だと思います。私と一緒にいらしてください。ルックアップアルゴリズムの効率を向上させるR
私はデータショップdf_red
を持っており、ウェブショップの注文書に詳しく記載されています。それぞれの製品(ean)について、私は12個の最も可能性が高い他の製品をそのバスケットに入れたいと思っています。
これが設定され、そのようなデータを生成するためのサンプルコードです:
library(tidyverse)
# create a vector with 1400 products (characterized by their EANs)
eans <- sample(1e5:1e6, 1400, replace = FALSE)
# create a vector with 200k orders
basket_nr <- 1:2e5
# a basket can have up to 4 items, it's most likely to have 3 items
n_prod_per_basket <- sample(x = 1:4, length(basket_nr), prob = c(0.2, 0.2, 0.5, 0.1), replace = TRUE)
# create df_red, each line of which correspond to a product with it's respective basket number
df <- data_frame(basket_nr, n_prod_per_basket)
df_red <- data_frame(basket_nr = rep(basket_nr, n_prod_per_basket))
df_red$ean <- sample(x = eans, nrow(df_red), replace = TRUE)
私は、このタスクを達成するために使用していたコードは以下の通りです。しかし、私はそれが効率的ではないと確信しています。どうすればプログラムのスピードを上げることができますか?
ean <- unique(df_red$ean)
out <- list()
for (i in 1:length(ean)){
ean1 <- ean[i]
# get all basket_nr that contain the ean in question
basket_nr <- df_red[df_red$ean == ean1, ]$basket_nr
# get products that were together in the same basket with the ean in question
boo <- (df_red$ean != ean1) & (df_red$basket_nr %in% basket_nr)
prod <- df_red[boo, ]
# get top most frequent
top12 <- prod %>%
group_by(ean) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
filter(row_number() %in% 1:12)
# skip products that weren't together in a basket with at least 12 different other products
if(nrow(top12) == 12) out[[i]] <- data_frame(ean = ean1, recom = top12$ean, freq = top12$n)
if(i %% 100 == 0) print(paste0(round(i/length(ean)*100, 2), '% is complete'))
}
これは、古典的な市場バスケットの分析の例のようです。あなたは 'arules'パッケージをチェックしたいかもしれません。私はそれを使用していないが、私はそれがこのようなアプリケーションのための設計だと信じています。 – Dave2e