Анализ покупательской корзины в Tableau и R

Автор статьи — Мария Мазюк

Анализ покупательской корзины (Market Basket Analysis) помогает выявить, какие товары приобретаются вместе чаще других. Используя результаты такого анализа, можно настроить рекомендации товаров в интернет-магазине и email-рассылке, разместить часто покупаемые вместе товары друг рядом с другом в супермаркете или каталоге. Удачное внедрение рекомендаций на основе анализа покупательской корзины способствует повышению среднего чека заказа. Также полученную информацию можно использовать для внедрения системы скидок: например, если товар А часто покупается вместе с товаром Б, то имеет смысл применить скидку только на один из товаров данной пары, так как дополняющий товар скорее всего будет куплен и без скидки.

В данной статье я буду использовать термин “транзакция”, подразумевающий отдельный заказ (покупку), который может включать в себя 1 и более товаров. Не смотря на то, что в рассматриваемых примерах будут использованы данные именно о заказах, метод анализа покупательской корзины можно также использовать и для целей, не связанных с коммерцией: например, для анализа контента на сайте, который чаще всего просматривается вместе в течение одной сессии (в нашем случае, “транзакции”) на сайте, для рекомендации статей/видео, чтобы повысить среднее количество просмотренных статей/видео за сессию.

Чем шире доступный аналитику инструментарий, тем больше возможностей найти точки роста. Поэтому вначале мы рассмотрим базовый анализ частоты покупки товаров из различных категорий в транзакции с помощью визуализации в Tableau, а затем перейдем к более детальному анализу на уровне конкретных товаров на основе ассоциативных правил в R. В качестве основы для теоретической части я использовала материалы DataCamp и главу 12. Association Rules for Market Basket Analysis из книги R for Marketing Research and Analytics.

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

Таблица частоты совместных покупок для категорий товаров в Tableau

В Tableau можно построить таблицу частоты встречаемости в транзакциях товаров из разных категорий, с цветовым градиентом по количеству заказов (хайлайт-таблица). Это можно сделать в 2 шага:

1. Подготовьте источник данных: необходимо применить Inner Join исходного датасета о транзакциях с самим собой с двумя условиями: 1) знак = для ID транзакций в левой и правой таблицах; 2) знак < между категориями товаров в обеих таблицах (чтобы получилась таблица треугольником внизу).

2. На полке колонок разместите поле с категориями товаров из левой таблицы, и на полке строк — поле с категориями товаров из правой таблицы. В качестве подписей и цветового выделения используйте COUNTD() поля ID транзакций.

В результате получается хайлайт-таблица, по которой можно легко определить сочетания категорий, товары из которых чаще всего присутствуют вместе в транзакциях. Интерактивную версию таблицы можно найти в виде дашборда в Tableau Public.

Данная таблица подойдет именно для категорий, так как с ней легко работать, только если количество колонок и строк небольшое. При такой визуализации можно провести анализ только на основе количества совместных транзакций, но ничего нельзя сказать об их статистической значимости. Также анализ с помощью хайлайт-таблицы позволяет определить частоту только пар товаров, но не сочетания трех и более товаров. Для этих целей мы будем использовать метод ассоциативных правил в R.

Ассоциативные правила и алгоритм APRIORI

Анализ покупательской корзины призван выявить частые сочетания товаров (ассоциации товаров друг с другом) в списке транзакций. Рассмотрим широко используемый для этих целей метод ассоциативных правил (Association Rules) и алгоритм их поиска APRIORI.

Ассоциативные правила здесь — это ассоциации товаров друг с другом в виде набора правил “если товар А, тогда товар Б”. Разберем это на представленной выше таблице-примере со списком транзакций и перечнем товаров. Товары “Сгущенное молоко” и “Сушки” присутствуют вместе в трех транзакциях, что делает их частым сочетанием товаров в общем объеме транзакций, равном 5. В виде ассоциативных правил это сочетание выглядит так:

“Сгущенное молоко” (предшественник) => “Сушки” (результат)
“Сушки” (предшественник) => “Сгущенное молоко” (результат)

Ассоциативные правила описываются тремя метриками, отражающими условные вероятности:

Support (популярность правила) — вероятность транзакции с определенным сочетанием товаров в общем количестве транзакций. В нашем примере:
support({Сгущенное молоко, Сушки}) = ⅗ = 0,6.

Confidence (частота выполнения правила) — это support транзакций с сочетанием товаров, деленная на support транзакций с товаром-предшественником (с товаром-результатом или без). Так в нашем примере:
confidence({Сгущенное молоко} => {Сушки}) = support({Сгущенное молоко, Сушки}) / support({Сгущенное молоко}) = 0,6 / 0,8 = 0,75
Другими словами, товар “Сушки” присутствует в 75% транзакций, содержащих товар “Сгущенное молоко”.

Lift (насколько сильна ассоциация между товарами) — это support транзакции с сочетанием товаров, деленная на произведение support транзакций с товаром-предшественником (с товаром-результатом или без) и support транзакций с товаром-результатом (с товаром-предшественником или без). Lift > 1 означает, что товар-предшественник повышает вероятность покупки товара-результата в какой-то мере. Lift < 1 означает, что товар-предшественник снижает вероятность покупки товара-результата в какой-то мере. В нашем примере:
lift({Сгущенное молоко} => {Сушки}) = support({Сгущенное молоко, Сушки}) / (support({Сгущенное молоко}) * support({Сушки})) = 0,6 / (0,8 * 0,6) = 1,25
Другими словами, комбинация товаров “Сушки” и “Сгущенное молоко” встречается в 1,25 раз чаще, чем мы могли бы ожидать, если бы эти два товара были независимы.

Используя метод ассоциативных правил, мы будем стараться найти правила с метриками, значения которых превышают заданные нами пороговые значения: мы хотим найти сочетания товаров, которые встречаются довольно часто в транзакциях (т.е. с большим значением support), показывают сильную зависимость друг от друга (т.е. с большим значением confidence) и являются большим, чем просто совпадение (т.е. с большим значением lift). Пороговые значения (например, 0.01, 0.80) необходимо выбирать таким образом, чтобы это имело смысл для конкретного бизнеса. Следует попробовать несколько значений для нахождения имеющих для бизнеса смысл сочетаний товаров. Оптимальные значения выявляются путем проб и ошибок. И для каждого бизнеса пороговые значения будут различными.

Метод ассоциативных правил включает 2 этапа:

Нахождение всех частых сочетаний товаров, у которых значение support превышает заданное пороговое значение. Этот шаг наиболее времязатратный. И здесь алгоритм APRIORI вначале исключает товары, которые редко встречаются в транзакциях (их значение support меньше порогового), а затем исключает и маловероятные сочетания товаров из процесса дальнейшего тестирования, сокращая таким образом время на обработку.

Создание списка правил для частых сочетаний товаров и расчет метрик support и confidence для всех правил в списке. При этом отфильтровываются правила, не проходящие пороги для support и confidence.

Пакет arules в R

Важно отметить, что перед началом анализа следует подготовить датасет для целей анализа путем группировки вариаций товаров. Это поможет обобщить данные о транзакциях с вариациями товаров, повысив значение support для группы вариаций. Так, в рассматриваемом датасете интернет-магазина присутствовало множество вариаций одного продукта по граммажу (например, для продукта «Mango Butter» такими вариациями были «Mango Butter — 100 gr», «Mango Butter — 250 gr», «Mango Butter — 500 gr», «Mango Butter — 1 kg», «Mango Butter — 5 kg»). Моей целью был анализ на уровне продукта в целом (Какие сочетания продуктов приобретаются вместе чаще всего?), поэтому я объединила вариации в один продукт. Это можно сделать с помощью группировки вручную в Tableau Prep, а также с помощью RegEx в R.

Для анализа покупательской корзины в R нам понадобятся следующие пакеты:
arules — пакет для анализа данных по транзакциям и выявления закономерностей (часто приобретаемых товаров и ассоциативных правил).
arulesViz — пакет для визуализации ассоциативных правил и сочетаний товаров на основе arules.

При анализе покупательской корзины могут быть использованы данные о миллионах транзакций. Для возможности их эффективной обработки и нахождения ассоциативных правил в R используется особый класс объектов — transactions.

Поэтому, если источник данных является объектом класса listmatrix или dataframe, его нужно привести к классу transactions. Для этого необходимо наличие поля с товарами и поля с ID транзакций. Самый простой способ преобразования дата фрейма в класс transactions — это группировка товаров по ID транзакций. Разберем подробнее на примере данных интернет-магазина.

# Загрузка датасета из csv
library(readr)
orders <- read_csv('orders.csv')

# Перевод числового поля OrderID в факторный класс для дальнейшей группировки с помощью split()
library(dplyr)
orders <- mutate(orders, OrderID = as.factor(OrderID))
orders_list <- split(orders$Product, orders$OrderID)

# Перевод списка заказов в класс transactions с помощью пакета arules
library(arules)
transactions <- as(orders_list, "transactions")
# Просмотр первых строк нового датасета с помощью функции inspect()
inspect(head(transactions))
rm(orders_list, orders)
summary(transactions)
> summary(transactions)
transactions as itemMatrix in sparse format with
 1816 rows (elements/itemsets/transactions) and
 73 columns (items) and a density of 0.05567709 

most frequent items:
  Mango Butter  Coffee Butter      Fragrance Avocado Butter   Cocoa Butter        (Other) 
           728            551            497            489            446           4670 

element (itemset/transaction) length distribution:
sizes
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  19  20  21  22  24  33 
331 298 306 272 180 142  96  63  30  29  20  16  10   3   4   4   2   4   1   1   2   1   1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   4.064   5.000  33.000 

includes extended item information - examples:
              labels
1 Activated Charcoal
2         Almond Oil
3      Aloe Vera Gel

includes extended transaction information - examples:
  transactionID
1    1261143412
2    1261143512
3    1261143612

Результат функции summary() можно интерпретировать следующим образом:
— Товар “Mango Butter” приобретается чаще других товаров и присутствует в 728 транзакциях.
— 331 транзакция (более 18%) включают только один товар.

Собственно сам анализ мы начнем с использования функции apriori(data, parameter = list(supp, conf, target)). Пороговые значения метрик support и confidence задаются с помощью аргументов supp и conf соответственно в parameter = list(). В качестве значения аргумента target я использовала “rules”, т.е. я хотела получить список правил. Также для target возможно значение “frequent items” для получения списка часто приобретаемых товаров. Можно задать еще 3 аргумента: 1) minlen / maxlen — минимальное / максмимальное количество товаров в правиле, 2) appearance = list() — для задания в виде строкового вектора товаров, которые должны присутствовать в списке правил.

Я использовала пороговые значения supp = 0.0015 и conf = 0.4, а также задала ограничение в 2 товара. Порог для support я выбирала путем нескольких проб так, чтобы количество получившихся правил не превышало в разы количество товаров в датасете. Я использовала ограничение в 2 товара, поскольку анализ проводился для рекомендации других товаров на странице товара, то есть правила для 3 товаров уже имели бы меньшее практическое значение. При ограничении в 2 товара список правил получался слишком коротким, поэтому я постепенно понижала пороговое значения до 0.4 для confidence. Рассмотрим результат функции apriori().

> # Создание списка правил
> rules <- apriori(transactions, parameter = list(supp = 0.0015, conf = 0.4, minlen = 2, maxlen = 2))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target
        0.4    0.1    1 none FALSE            TRUE       5  0.0015      2      2  rules
   ext
 FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 2 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[73 item(s), 1816 transaction(s)] done [0.00s].
sorting and recoding items ... [71 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 done [0.00s].
writing ... [140 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
Warning message:
In apriori(transactions, parameter = list(supp = 0.0015, conf = 0.4,  :
  Mining stopped (maxlen reached). Only patterns up to a length of 2 returned!

В результате функции нас интересует больше всего следующее:

— items в строке sorting and recoding items … Это означает, что в получившемся списке правил использован 71 товар. Если это значение слишком маленькое (представляет лишь крохотную часть товаров в датасете) либо слишком большое (почти все товары в датасете), тогда имеет смысл задать другие пороговые значения.
 rules в строке writing … Алгоритм нашел 140 правил для данных товаров. Если данное значение слишком низкое, необходимо снизить пороговые значения для support или confidence. Если слишком высокое (значительно превышает количество товаров в датасете), следует повысить пороговые значения для support или confidence.

Какая-то часть правил в списке может быть излишней, т.е. одни правила могут содержать в себе другие правила, дублируя. Чтобы выявить излишние правила для их дальнейшего исключения, можно использовать функцию is.redundant().

redundant <- is.redundant(rules)
rules <- rules[!redundant]

Итак, у нас есть список ассоциативных правил rules, и сейчас мы рассмотрим подробнее выборку из них с помощью функции inspect() и порогового значения lift (во сколько раз чаще встречается правило, чем просто случайность). Для создания выборки я использовала функцию subset(). В результате в консоли lhs означает left hand side, т.е. товар товар-предшественник, а rhs — right hand side, т.е. товар-результат. Значения supportconfidencelift и count представлены именно для сочетания товаров.

Таблицу со списком правил удобней рассматривать в виде виджета на основе функции inspectDT() из пакета arulesViz. На основании таблицы легко определить, какие товары-результаты лучше рекомендовать на страницах товаров-предшественников.

library(arulesViz)
table <- inspectDT(rules)

Для аналогичного анализа можно построить диаграмму рассеивания (scatterplot) для правил.

scatterplot <- plot(subset(rules, lift > 2), engine = ‘plotly’)

Также можно представить правила в виде графа. Если направление связи (стрелка) идет к товару, то этот товар в данном правиле является товаром-результатом. Направление от товара означает, что товар в данном правиле является товаром-предшественником. Если экспортировать граф в формате graphml, то можно будет провести дополнительный анализ с помощью таких инструментов, как Gephi.

graph <- plot(subset(rules, lift > 2), 
              method = 'graph', size = "support", 
              engine = 'htmlwidget', nodeCol = "#d1a23e")

# Сохранение графа в формате graphml
saveAsGraph(rules, file = "rules.graphml")

https://maryiamaziuk.com/data-viz-blog/

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

63 queries in 0,445 seconds