Задача анализа потребительской корзины (Market Basket Analysis) является классической для торговых систем. Ее цель — выяснить, какие товары обладают высокой степенью ассоциации, то есть часто попадают в один чек или заказ. В рамках платформы 1С это можно реализовать несколькими способами: от простых запросов до использования встроенных механизмов интеллектуального анализа данных. Рассмотрим эти подходы подробнее.
Часто возникает задача не просто найти абстрактные пары, а понять: "Что покупают вместе с товаром Х?". Это наиболее простая реализация, которую можно выполнить обычным запросом. Разберем логику по шагам.
Сначала мы находим все документы (чеки или реализации), в которых присутствует интересующая нас номенклатура. Затем мы выбираем все остальные товары из этих же документов и подсчитываем частоту их появления. Проанализируем пример кода:
// В параметре &Номенклатура передаем целевой товар
ВЫБРАТЬ
РеализацияТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_РеализацииСТоваром
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
РеализацияТовары.Номенклатура = &Номенклатура
СГРУППИРОВАТЬ ПО
РеализацияТовары.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиВместе.Номенклатура КАК СопутствующийТовар,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиВместе.Ссылка) КАК Частота
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ПродажиВместе
ГДЕ
ПродажиВместе.Ссылка В (ВЫБРАТЬ Ссылка ИЗ ВТ_РеализацииСТоваром)
И ПродажиВместе.Номенклатура <> &Номенклатура
СГРУППИРОВАТЬ ПО
ПродажиВместе.Номенклатура
УПОРЯДОЧИТЬ ПО
Частота УБЫВ
Важный момент: В условии соединения или фильтрации мы обязательно исключаем саму целевую номенклатуру (ПродажиВместе.Номенклатура <> &Номенклатура), иначе она всегда будет занимать первое место в рейтинге, так как она присутствует в каждом отобранном чеке.
Если задача стоит шире — найти вообще все стабильные пары товаров во всей базе — нам потребуется механизм внутреннего соединения таблицы самой с собой. Рассмотрим, как это работает. Мы берем таблицу товаров из документов реализации и соединяем ее с этой же таблицей по полю Ссылка. Таким образом, для каждой строки документа мы получим комбинации со всеми остальными строками того же документа.
Чтобы избежать дублей (когда система считает пару "Хлеб + Молоко" и "Молоко + Хлеб" как разные записи), мы используем оператор сравнения для номенклатуры:
ВЫБРАТЬ
Т1.Номенклатура КАК Товар1,
Т2.Номенклатура КАК Товар2,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Ссылка) КАК КоличествоСовместныхПокупок
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК Т2
ПО Т1.Ссылка = Т2.Ссылка
И Т1.Номенклатура < Т2.Номенклатура // Исключаем дубли и совпадение товара с самим собой
СГРУППИРОВАТЬ ПО
Т1.Номенклатура,
Т2.Номенклатура
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Ссылка) > 5 // Отсекаем случайные единичные срабатывания
УПОРЯДОЧИТЬ ПО
КоличествоСовместныхПокупок УБЫВ
Проанализируем это решение. Использование условия Т1.Номенклатура < Т2.Номенклатура гарантирует, что в результат попадет только одна комбинация пары, и товар не будет сопоставлен сам с собой. Условие в секции ИМЕЮЩИЕ позволяет отсеять "шум" — товары, которые случайно попали в один чек всего пару раз.
Написание запросов для поиска пар — задача выполнимая, но поиск троек, четверок или более сложных групп товаров через SQL-подобные запросы становится крайне ресурсоемким и сложным в поддержке. Для этих целей в платформе 1С предусмотрен специализированный инструмент — АнализДанных с типом АнализДанныхПоискАссоциативныхПравил.
Этот объект реализует алгоритмы поиска закономерностей (подобные Apriori) на уровне платформы, что работает значительно быстрее ручных соединений таблиц. Разберем алгоритм его использования:
Ссылка и Номенклатура).АнализДанных и устанавливаем тип анализа.Пример использования на встроенном языке:
Анализ = Новый АнализДанных;
Анализ.ТипАнализа = Тип("АнализДанныхПоискАссоциативныхПравил");
// Заполняем источник данных (результат запроса по чекам)
Анализ.ИсточникДанных = РезультатЗапроса;
// Настройка параметров
Анализ.Параметры.МинимальныйПроцентПоддержки.Значение = 0.5; // Группа должна быть в 0.5% чеков
Анализ.Параметры.МинимальныйПроцентДостоверности.Значение = 10; // Уверенность в связи от 10%
РезультатАнализа = Анализ.Выполнить();
// Вывод результата (например, в построитель отчета или дерево значений)
Построитель = Новый ПостроительОтчетаАнализаДанных();
Построитель.ИсточникДанных = РезультатАнализа;
Построитель.Вывести(ТабличныйДокумент);
При реализации подобных отчетов важно учитывать не только техническую сторону, но и бизнес-логику. Выясним основные моменты, которые могут повлиять на результат:
Значимость (Lift) показывает, насколько покупка товара А реально увеличивает вероятность покупки товара Б по сравнению с их обычной частотой продаж.Подводя итог, можно сказать следующее: для простых задач "товар-спутник" идеально подходит запрос с использованием ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Для глубокого маркетингового анализа и поиска сложных цепочек товаров лучше использовать штатный механизм АнализДанных, который берет на себя всю тяжелую математическую работу.