Анализ корзины покупок

В этом посте мы рассмотрим очень интересный вид визуализации – Многослойную диаграмму пирога – Multi-layer Pie Chart – и используем ее для одной из задач маркетинговой аналитики – анализа корзин покупок.

Мы перейдем от начальной обработки данных к визуализации анализа корзины покупок. Я поделюсь R-кодом, в котором не надо писать код для каждого слоя диаграммы. Вы также можете найти пример создания многослойной круговой диаграммы тут.

Предположим, что у нас есть список заказов, которые были куплены нашими клиентами. Каждый заказ состоит из одного или нескольких продуктов. Наша задача – визуализировать взаимосвязь между продуктами и видеть долю заказов, которая включает в себя каждый продукт или комбинацию продуктов. Многослойная диаграмма может помочь нам увидеть каждый продукт и его пересечения с другими.

После того, как мы загрузили необходимые библиотеки с помощью следующего кода:

Код на R

# loading libraries
library(dplyr)
library(reshape2)
library(plotrix)

[свернуть]

Мы будем моделировать пример набора данных. Предположим, мы продаем 4 продукта: a, b, c и d, и каждый продукт может быть продан с разной вероятностью. Кроме того, клиент может приобрести любые комбинации продуктов, например: «a» или «a, b, a, d» и так далее. Давайте смоделируем это со следующим кодом:

Код на R

# creating an example of orders
set.seed(15)
df <- data.frame(orderId=sample(c(1:1000), 5000, replace=TRUE),
product=sample(c('NULL','a','b','c','d'), 5000, replace=TRUE,
prob=c(0.15, 0.65, 0.3, 0.15, 0.1)))
df <- df[df$product!='NULL', ]

[свернуть]

После мы обработаем данные и создадим датафрейм для анализа. Мы сделаем:

  • Удалим дубликаты, если порядок состоит из более чем одного аналогичного продукта («a, b, a, d»), чтобы исключить влияние количества
  • Объединим продукты с новой функцией «cart», которая будет включать в себя все уникальные продукты в корзине
  • Вычислим количество заказов (столбец «num»)
Код на R

# processing initial data
# we need to be sure that product's names are unique
df$product <- paste0("#", df$product, "#")
 
prod.matrix <- df %>%
 # removing duplicated products from each order
 group_by(orderId, product) %>%
 arrange(product) %>%
 unique() %>%
 # combining products to cart and calculating number of products
 group_by(orderId) %>%
 summarise(cart=paste(product,collapse=";"),
 prod.num=n()) %>%
 # calculating number of carts
 group_by(cart, prod.num) %>%
 summarise(num=n()) %>%
 ungroup()

[свернуть]

Посмотрим на результирующий фрейм данных:
Смоделированный датафрейм

Начинаем работу над многослойной круговой диаграммой. Идея состоит в размещении заказов, которые включают один продукт в ядро ​​диаграммы. Поэтому мы рассчитали общее количество продуктов в каждой комбинации (значение «prod.num») и разделили датафрейм на два фрейма данных: первый (one.prod) – заказы с одним продуктом, второй (sev.prod)  – с более чем одним продуктом.

Код на R

# calculating total number of orders/carts
tot <- sum(prod.matrix$num)
 
# spliting orders for sets with 1 product and more than 1 product
one.prod <- prod.matrix %>% filter(prod.num == 1)
 
sev.prod <- prod.matrix %>%
 filter(prod.num > 1) %>%
 arrange(desc(prod.num))

[свернуть]

Данные готовы к построению. Определим параметры для диаграммы со следующим кодом:
Код на R

# defining parameters for pie chart
iniR <- 0.2 # initial radius
cols <- c("#ffffff", "#fec44f", "#fc9272", "#a1d99b", "#fee0d2",
 "#2ca25f", "#8856a7", "#43a2ca", "#fdbb84", "#e34a33",
 "#a6bddb", "#dd1c77", "#ffeda0", "#756bb1")
prod <- df %>%
 select(product) %>%
 arrange(product) %>%
 unique()
prod <- c('NO', c(prod$product))
colors <- as.list(setNames(cols[ c(1:(length(prod)))], prod))

[свернуть]

Мы определили цветовую палитру с четырнадцатью цветами, включая белый цвет для пробелов. Это означает, что если в наборе данных имеется более 13 уникальных продуктов, вам необходимо добавить дополнительные цвета. Наконец, мы построим многослойную круговую диаграмму со следующим кодом:

Код на R

# 0 circle: blank
pie(1, radius=iniR, init.angle=90, col=c('white'), border = NA, labels='')
 
# drawing circles from last to 2nd
for (i in length(prod):2) {
 p <- grep(prod[i], sev.prod$cart)
 col <- rep('NO', times=nrow(sev.prod))
 col[p] <- prod[i]
 floating.pie(0,0,c(sev.prod$num, tot-sum(sev.prod$num)), radius=(1+i)*iniR, startpos=pi/2, col=as.character(colors [ c(col, 'NO')]), border="#44aaff")
}
 
# 1 circle: orders with 1 product
floating.pie(0,0,c(tot-sum(one.prod$num),one.prod$num), radius=2*iniR, startpos=pi/2, col=as.character(colors [ c('NO',one.prod$cart)]), border="#44aaff")
 
# legend
legend(1.5, 2*iniR, gsub("_"," ",names(colors)[-1]), col=as.character(colors [-1]), pch=19, bty='n', ncol=1)

[свернуть]

Многослойная круговая диаграмма

Если вы хотите добавить некоторую статистику в легенду, например: общее количество каждой комбинации или доли комбинаций в общей сумме, нам просто нужно создать таблицу и добавить ее на участок со следующим кодом:

Код на R

# creating a table with the stats
stat.tab <- prod.matrix %>%
 select(-prod.num) %>%
 mutate(share=num/tot) %>%
 arrange(desc(num))
 
library(scales)
stat.tab$share <- percent(stat.tab$share) # converting values to percents
 
# adding a table with the stats
addtable2plot(-2.5, -1.5, stat.tab, bty="n", display.rownames=FALSE,
hlines=FALSE, vlines=FALSE, title="The stats")

[свернуть]

Многослойная круговая диаграмма с легендой

Вот так многослойная круговая диаграмма помогает нам визуализировать каждый продукт и его пересечения с другими.

Автор: Сергей Брыль, английский оригинал тут.

Добавить комментарий

Ваш e-mail не будет опубликован.