Анализ товаров покупаемых вместе - выявление товаров которые часто покупаются одновременно
Задача анализа совместных покупок в рамках ассортментной матрицы выходит за рамки простого подсчета продаж. Она требует целостного подхода к сбору данных, моделированию фактов и измерителей, выбору алгоритмов для добычи частых наборов и правил ассоциаций, а также к интеграции результатов в архитектуру DWH для оперативной и управленческой аналитики. Правильная организация процесса позволяет не только выявлять пары и группы товаров, но и переводить эти инсайты в конкретные действия: формирование акций, оптимизацию размещения, монетизацию кросс-офферингов и корректировку ассортимента.
Глава ориентирована на техническую аудиторию: архитектурные решения, схемы данных, алгоритмы, интеграции и практические примеры реализации в современном DWH-контексте. Рассматриваются как классические подходы к последовательному вычислению частых наборов и правил ассоциаций, так и современные методики, применимые в параллельной обработке больших объемов транзакционных данных.
Краткое содержание главы
- Архитектура и целевые показатели анализа совместных покупок в BI DWH, принципы интеграции источников и хранения результатов.
- Моделирование данных для анализа ко-покупок: факты, измерения и подготовка корзин.
- Алгоритмы и метрики: частые наборы, правила ассоциаций, критерии качества и валидация.
- Инженерия данных и качество данных: ETL/ELT, обогащение, конвейеры обновления и управляемость.
- Реализация в DWH: схемы, ускорение запросов, хранение результатов и обновления агрегатов.
- Применение результатов: трансформация инсайтов в ассортиментную политику, акции, планирование запасов и мерчандайзинг.
Архитектурная концепция анализа совместных покупок
В основе анализа совместных покупок лежит сбор транзакционных данных, их нормализация и конвертация в представление, пригодное для вычисления частых наборов. Архитектура должна обеспечить:
- стабильный поток данных из источников продаж (POS, онлайн-маркетплейс, ERP) в DWH либо в озерную схему данных (data lakehouse).
- хранение корзин как базовой единицы анализа: список SKU внутри каждой транзакции и временная метка.
- возможность масштабирования вычислений: обработка больших корзин через распределенные движки, параллелизм и инкрементальное обновление частых наборов.
- как минимум две опорные выходные модели: (1) частые наборы (itemsets) с поддержкой и (2) правила ассоциаций с метриками доверия и подъема (lift).
Основные принципы:
- моделируйте корзины отдельно от мер продаж, чтобы позднее можно было повторно использовать корзины для разных целей (напр., кросс-продажи, ассортиментая оптимизация, промо‑пакеты).
- избегайте грубой денормализации: сосредоточьтесь на эффективной агрегации и подготовке данных для алгоритмов частых наборов (FP‑Growth или Apriori) вместо прямой попытки посчитать все пары через двойной self‑join, что приводит к экспоненциальному росту.
- применяйте принципы событийной целостности: каждый набор должен иметь единицы измерения, сигналы сезонности и каналы продаж.
Технические опоры и примеры инструментов:
- обработка больших корзин и алгоритмы: Apache Spark MLlib FP-Growth, который естественным образом работает с корзинами в виде массивов элементов. Это позволяет избежать явной генерации всех пар и эффективно справляться с высокой кардинальностью.
- в облачных DWH можно рассмотреть Snowflake или Google BigQuery для хранения результатов и выполнения больших SQL‑операций, в сочетании с внешними пакетами для вычисления частых наборов.
- для повторного вычисления и мониторинга применимых моделей рекомендуется Airflow или аналогичный оркестратор, обеспечивающий версионирование пайплайнов и контроль качества на каждом этапе.
| Компонент | Назначение | Основные требования |
|---|---|---|
| fact_basket | Факт корзины/покупки | Хранит транзакции и позиции: transaction_id, product_id, quantity, price, timestamp |
| dim_product | Справочник товаров | Поддерживает иерархии, SKU, бренд, категорию и другие атрибуты |
| dim_time | Временной размер | Дата и время продажи, календарные признаки, сезонность |
| etl_pipeline | Интеграция источников | Надежная обработка ошибок, повторяемость, контроль версий схем |
Фрагменты архитектурной картины будут подробно разбираться в следующих разделах. Здесь же важно зафиксировать, что решение зачастую строится на концепции data lakehouse: хранение «сырых» и «очищенных» данных в единых хранилищах с поддержкой версионирования схем, временных версий и управления качеством.
Применение FP‑Growth и сравнение с Apriori
FP‑Growth строит частые наборы на основе компактной частотной префиксной древесной структуры, без генерации большого числа кандидатных наборов. Это особенно важно для ассортимента с большим количеством SKU: число потенциальных пар может быть колоссальным, что делает Apriori непрактичным на реальном объеме данных. FP‑Growth позволяет работать с корзинами в виде списков SKU и строит частые наборы на основе минимального порога поддержки. В качестве компромисса можно рассмотреть гибридный подход: быстрое предварительное фильтрование по медиане продаж и последующий FP‑Growth для детализированных наборов.
Важной частью архитектуры является хранение результатов. Частые наборы и правила должны помещаться в специально оптимизированные таблицы, чтобы их можно было быстро использовать для отчетности и планирования маркетинговых активностей. Таблицы кросс‑покупок следует индексировать по парам SKU и по применяемым каналам продаж, чтобы ускорить фильтрацию при генерации акций и рекомендаций.
Моделирование данных: факты и размеры для анализа co-purchase
Эффективный анализ сопряженных покупок требует четкого разделения фактов и размерностей и согласованной стратегии подготовки корзин. Основной единицей анализа выступает транзакция, которая объединяет одну или несколько позиций товара. В качестве исходной структуры данных рекомендуется приготовить:
- факт корзины (basket fact), содержащий transaction_id, timestamp, store/channel, total_amount - и связанные записи по каждому товару в корзине;
- размерности продукта (dim_product) и времени (dim_time) для атрибутивной обогащенности;
- «корзину» в виде массива SKU или идентификаторов продуктов, связанного с transaction_id, чтобы алгоритм мог работать в естественном формате.
Стратегия подготовки данных:
- очистка и нормализация идентификаторов товаров: приведение к единой системе SKUs, устранение дубликатов, учёт альтернативных кодов;
- агрегация позиций в корзины: группировка по transaction_id, формирование массива items = [sku1, sku2, ...];
- фильтрация по каналам продаж и по времени: можно исключать возвраты, тестовые покупки и аномальные заказы;
- добавление контекстных атрибутов: сезонность, акция, бренд, цена, категория, что впоследствии позволяет сегментировать результаты.
Потребуемые таблицы в DWH (пример):
- fact_basket (transaction_id, transaction_time, store_id, channel, total_amount)
- dim_time (date, year, month, quarter, season)
- dim_store (store_id, region, type)
- dim_product (product_id, sku, category, subcategory, brand, price_tier)
После подготовки корзин можно применить алгоритмы частых наборов на поле items, чтобы получить базовый набор частотности. Важно помнить: для крупного ассортимента размер корзины и число уникальных SKU может быть большим. Поэтому следует внедрять пороги минимальной поддержки и минимальной уверенности, а также рассмотреть разбиение по каналам, сегментам или временным окнам.
Алгоритмы и метрики: частые наборы, правила ассоциаций, качество
Классическая последовательность действий в анализе ко-покупок состоит из двух стадий:
- обнаружение частых наборов (frequent itemsets) с использованием порога поддержки (support);
- генерация ассоциативных правил на основе частых наборов и вычисление метрик доверия (confidence) и подъёма (lift).
Ключевые метрики:
- поддержка (support): доля корзин, в которых встречается набор товаров;
- доверие (confidence): вероятность того, что товар B присутствует в корзине, если в корзине есть товар A;
- подъём (lift): отношение наблюдаемой частоты совместной покупки к ожидаемой частоте при независимом распределении; lift > 1 сигнализирует о положительной корреляции;
- полезные дополнительные метрики: conviction, leverage, leverage ratio; их использование зависит от целей и задач.
Поскольку ассортимент может включать сотни или тысячи SKU, прямой перебор всех пар и правил неэффективен. Здесь оправдано применение FP‑Growth, который:
- строит частые наборы через компактную FP‑дерево;
- позволяет заниматься discovery на разнообразных уровнях поддержки;
- легко масштабируется на кластерах и поддерживает инкрементную обработку.
Важная практика: задавать пороги адаптивно, исходя из бизнес‑целей. Например, в промо‑период риск фрагментации слишком больших наборов возрастает, поэтому пороги можно снижать, но вводить дополнительные требования к качеству правил (например, ограничение длины набора, фильтрацию по семантике категорий). После извлечения правил следует выполнить верификацию на устойчивость в отдельных сегментах (канал онлайн/оффлайн, регион, сезонность). Это позволяет уменьшить риск «шумной» модели, где слишком редкие парыrule получаются на основе случайных сходств.
Пример кода для иллюстрации (PySpark, FP‑Growth). Приведённый фрагмент показывающий базовую схему построения частых наборов и правил. Приведён только как иллюстративный пример - реальный код масштабируется и адаптируется под конкретную среду и требования к данным.
from pyspark.ml.fpm import FPGrowth from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() ## baskets: каждая строка - transaction_id и items: array(SKU) baskets = spark.read.parquet(".../baskets.parquet") model = FPGrowth(itemsCol="items", minSupport=0.01, minConfidence=0.5) fpm = model.fit(baskets) frequent_itemsets = fpm.freqItemsets association_rules = fpm.associationRules
Каким образом результаты конвертируются в бизнес‑решения:
- частые наборы позволяют выявлять пары и группы SKU, которые стабильно встречаются в корзинах, что помогает в планировании промо‑пакетов и перекрестного мерчандайзинга;
- правила ассоциаций, сопровождаемые метриками, позволяют формировать кросс‑сейл предложения, персональные рекомендации и таргетированные маркетинговые акции;
- выводимые пороги и фильтры следует адаптировать под конкретную категорию и контекст, чтобы избежать перегрева или «шума» в рекомендациях.
Инженерия данных и качество данных
Качество анализа во многом зависит от точности и полноты исходных данных. В этом разделе приводятся практики, ориентированные на устойчивую работу пайплайна:
- источники данных и консистентность: согласование единой системы идентификаторов товаров, единиц измерения, времени продаж; согласование временных зон и аномалий в данных.
- обработка ошибок и мониторинг: автоматическое распознавание дубликатов корзин, устранение повторной регистрации одной и той же транзакции, фиксация ошибок загрузки.
- конвейеры обновления: выбор между пакетной обработкой (batch) и микро‑пакетной (micro-batch) моделью; инкрементальные обновления частых наборов и правил без повторной переработки всего арендуемого набора.
- управляемость и версионирование: хранение версий схем корзин и моделей; документирование изменений параметров порогов, версий алгоритмов и источников данных.
- прозрачность и воспроизводимость: ведение журнала вычислений, сохранение настроек пайплайнов и выходных наборов для аудита и регуляторной подготовки.
Ожидаемые практические сценарии:
- организация пайплайна с использованием ETL/ELT или ELT‑подхода: загрузка данных в промежуточную схему, очистка, агрегация корзин, сохранение корзин в staging‑площадке, затем запуск FP‑Growth на подготовленных данных;
- контроль качества на каждом этапе: проверка заполненности корзин, уникальности transaction_id, полноты атрибутов dim_product, consistency checks между dimension и фактами;
- безопасность и доступ: ограничения доступа к чувствительным данным по ролям, защита персональных данных и агрегированных показателей.
Реализация в DWH: схемы, методы ускорения, хранение результатов, обновления
Эпицентр технической реализации - сочетание структуры данных, вычислительной производительности и управляемости. Рекомендованный путь:
- использовать star‑схему для фактов и измерений: факт_basket с размерностями dim_time, dim_store, dim_product, dim_promo, что упрощает агрегации и ускоряет запросы;
- хранение частых наборов и правил как отдельные агрегаты: frequent_itemsets и association_rules, с ключами по participating_items и по channel/region;
- материализованные представления и агрегаты: создание MV (materialized views) или таблиц‑агрегатов по партнерам и каналам продаж, по категориям и брендам;
- индексация и разбиение: разбиение по времени (monthly, weekly), партицирование по store_id, создание индексов по набору элементов и по паре SKU в частых наборах;
- инкрементальная обработка: для больших объектов корзин** - применять периодические обновления моделей, а не повторный полный проход по всем данным;
- интеграции в BI и планирование: результирующие наборы публикуются в слое semantic layer, который обслуживает аналитиков, маркетинг и операционные функции.
Схема реализации может выглядеть следующим образом:
- источник данных → staging слой → очистка и нормализация корзин → вычисление частых наборов (FP‑Growth) → сохранение частых наборов и правил в аналитические таблицы → BI/операционные приложения для расчета акций и планирования ассортимента.
В части практических ограничений отметим:
- размерность и кардинальность SKU: при большом количестве уникальных товаров FP‑Growth помогает избежать явного двойного союза, но требует достаточного кластера для памяти;
- сезонность и акции: пороги поддержки и доверия должны адаптироваться к периодам с высокой сезонной вариативностью, иначе качество правил снизится;
- язык запросов и платформа: SQL‑операции по большим данным должны дополняться скриптами на Spark или аналогичных платформах, чтобы обеспечить эффективную обработку.
Применение результатов: как использовать в ассортиментной матрице и в действиях
Выводы по ко‑покупкам становятся основой для действий в ассортименте и промо‑акциях:
- ассортиментная оптимизация: включение в план тех SKU, которые часто встречаются в одних корзинах, для формирования взаимодополняющих комплектов; исключение элементов, которые редко встречаются в сочетании с целевыми товарными группами;
- кросс‑сейл и акции: создание bundled‑пакетов и промо‑цен на пары/наборы, которые демонстрируют устойчивую ко‑покупку;
- мерчендайзинг и дисплей: совместное размещение часто приобретаемых вместе позиций в торговых зонах и на витринах;
- управление запасами: корреляция спроса между товарами, оптимизация уровней запасов с учетом вероятности совместной покупки;
- персонализация и ретаргетинг: рекомендации на сайте и в мобильном приложении на основе истории ко‑покупок, с учётом контекста текущей корзины.
Практическая методика внедрения:
- начать с малого наборов категорий и наиболее продаваемых SKU, чтобы быстро получить релевантные правила и проверить бизнес‑эффект;
- затем расширять охват, используя секционирование по каналам, регионам, сезонности и крупным брендам;
- регулярно пересматривать пороги и править правила в зависимости от изменений в ассортименте, ценовых стратегий и маркетинговых кампаний.
Пример реализации в виде пайплайна: от источников данных до ко‑покупок и правил
- сбор и подготовка корзин: извлечение transaction_id, товарных позиций, времени продажи, каналов;
- построение корзин в виде массива SKU: items = [sku1, sku2, ...];
- применение FP‑Growth для выявления частых наборов на основе минимальной поддержки;
- генерация правил с метриками доверия и подъема;
- сохранение результатов в DWH: frequent_itemsets, association_rules;
- публикация агрегатов для BI и интеграция в ассортиментную матрицу и промо‑планирование.
В процессе реализации важно сохранить прозрачность процесса: фиксировать версии алгоритмов, параметры порогов, источники данных и даты вычислений. Это обеспечивает воспроизводимость и возможность аудита изменений в рекомендациях и ассортименте.
Key takeaways
- Анализ ко‑покупок требует архитектурной целостности данных: корзины как единица анализа, стабильная модель факт/измерения и возможность расширения под сегменты.
- Эффективность достигается за счет использования FP‑Growth вместо прямого перебора пар; пороги поддержки и доверия должны настраиваться под бизнес‑контекст и сезонность.
- Архитектура DWH должна позволять инкрементальные обновления, хранение агрегатов и быстрое использование результатов в BI‑слоях.
- Результаты анализа ко‑покупок служат основой для ассортиментной оптимизации, кросс‑сейла, промо‑акций и мерчендайзинга, обеспечивая прямые бизнес‑эффекты.
- Важна управляемость и воспроизводимость пайплайна: версии данных и алгоритмов, качество данных и мониторинг на каждом этапе.
- Интеграция с существующими инструментами BI и планирования должна быть максимально бесшовной, с упором на доступность выходных наборов для аналитиков и маркетинга.
- Регулярный пересмотр параметров и адаптация методики к изменениям в ассортименте, каналах продаж и сезонности критически важны для устойчивого эффекта.
FAQ
- Что такое частые наборы и правила ассоциаций, и зачем они нужны в BI DWH?
- Частые наборы - это группы товаров, которые встречаются в корзине с вероятностью выше заданного порога. Правила ассоциаций формируют пары или наборы товаров с оценкой доверия и подъема. В BI DWH они позволяют выявлять кросс‑сейловые возможности, оптимизировать размещение и планировать акции. Эти инструменты дают систематическое представление о том, какие товары «помогают» друг другу продаваться.
- Как выбрать пороги поддержки и доверия?
- Пороги должны соответствовать размеру и характеру ассортимента, сезонности и целям бизнес‑проекта. Для крупных каталогов разумно начинать с более высокого порога поддержки, чтобы избежать шумных правил, и постепенно снижать его по мере роста вычислительных возможностей и проверки устойчивости полученных правил на подвыборках каналов или сегментов. Доверие следует устанавливать в зависимости от готовности к промо‑инвестициям и желаемой конверсии кросс‑сейла.
- Apriori или FP‑Growth: как выбрать алгоритм?**
- Apriori прост в реализации, но не масштабируется на большие корзины из‑за экспоненциальному росту числа кандидатов. FP‑Growth предлагает более эффективный подход на больших данных за счет компактного FP‑дерева и обходится без явной генерации большого числа кандидатов. Для крупных наборов SKU FP‑Growth чаще всего предпочтительнее; для небольших витрин можно рассмотреть Apriori как более простой вариант.
- Как учитывать сезонность и каналы продаж в анализе?
- Включайте сезонные признаки в dim_time и сегментируйте данные по channel/store. Это позволяет строить частые наборы для конкретного канала или периода; затем можно сравнить наборы между каналами и выявлять специфические паттерны кросс‑сейла.
- Как хранить результаты в DWH и какие индексы использовать?
- Хранение частых наборов и правил как отдельные агрегаты в структурированных таблицах упрощает доступ через BI. Рекомендуются индексы по ключам набора (например, пара SKU), по каналам продаж и по временным окнам. Материализованные представления ускоряют повторные запросы и поддерживают актуальность в средах с высокой активностью.
- Как поддерживать актуальность частых наборов при поступлении новых транзакций?
- Применяйте инкрементальные обновления: перерасчет только для новых корзин и обновление зависимых частых наборов и правил. Это снижает нагрузку на кластер и обеспечивает близость к реальному времени. Важно версионировать результаты и регистрировать дату последнего обновления.
- Какие риски и ограничения следует учитывать?
- Риски включают шум в данных (нечестные транзакции, возвраты), сезонные колебания и перегиб порогов. Неправильно интерпретируемые правила могут привести к неэффективным промо‑акциям или избыточному запасу. Важно проводить валидацию на подвыборках, а также периодическую переоценку параметров и контекстов применения правил.
- Как оценивать бизнес‑эффект после внедрения ко‑покупок?
- Следует фиксировать показатели до и после внедрения: конверсию кросс‑сейла, средний размер корзины, рост продаж по парам SKU и прибыльность акций. Результаты можно визуализировать через агрегированные карты по сегментам и каналам, чтобы увидеть, какой эффект приносит та или иная пара товаров и какие акции работают лучше.
- Какие открытые инструменты уместны в технике ко‑покупок?
- В технической части можно использовать Apache Spark MLlib для FP‑Growth и построения частых наборов. Для DWH архитектур - Snowflake или Google BigQuery как платформы хранения и ускорения запросов. Это сочетание поддерживает как локальные, так и облачные инфраструктуры и обеспечивает масштабируемость и воспроизводимость.
- Как связать анализ ко‑покупок с ассортиментной матрицей?
- Результаты анализа превращаются в топ‑пары и группы SKU, которые становятся кандидатом для формирования ассортимента, планирования акций и рекомендаций. Это включает создание пакетированных предложений, перераспределение мест размещения товара, коррекцию ассортимента по категориям, обновление цен и промо‑параметров. Важно поддерживать тесную обратную связь между аналитиками и бизнес‑пользователями, чтобы корректировать параметры и сценарии внедрения.



