Как определить, что товары покупались вместе и являются сопутствующими
Что проверяют
Отличаете ли вы «часто покупают вместе» от «действительно связаны», то есть понимаете ли, что популярный товар лежит в корзине с чем угодно. Следом обычно спрашивают, как проверить, что найденные пары приносят пользу бизнесу.
Как отвечать
Сначала определите единицу анализа: чек, сессия или все покупки клиента за период. От этого зависит результат: в чеке найдутся дополнения к товару, а на горизонте месяца скорее последовательные покупки.
Базовый инструмент это ассоциативные правила. Для пары A → B считают:
- support: доля чеков, где есть и A, и B. Отсекает редкие случайные совпадения;
- confidence: P(B | A), доля чеков с A, в которых есть и B. Метрика несимметрична и завышается для популярных B;
- lift: confidence, делённая на support(B). Около 1 значит независимость, больше 1 значит реальную связь, меньше 1 говорит, что товары скорее вытесняют друг друга;
- дополнительно: leverage и conviction, а на малых данных тест значимости, например точный тест Фишера.
Частые наборы ищут алгоритмами Apriori или FP-Growth. В Python это mlxtend (fpgrowth, association_rules), на больших объёмах FPGrowth из Spark MLlib. FP-Growth не перебирает кандидатов и на плотных данных обычно быстрее Apriori.
Развитие идеи: матрица совстречаемости с нормировкой (PMI, косинусная близость), item2vec на последовательностях покупок, item-based collaborative filtering. Отдельно учитывайте промо: акция «два по цене одного» рождает связи, которых без неё нет.
Финальная проверка всегда онлайн: блок «с этим покупают» выкатывают в A/B-тест и смотрят на средний чек и конверсию, а не на lift.
Где спотыкаются
Ранжируют пары по confidence. Тогда в сопутствующие к любому товару попадает пакет или хлеб, который есть в половине чеков.
Путают сопутствующие товары с заменителями. Два похожих чайника почти никогда не лежат в одной корзине, и это правильный сигнал, а не пробел в данных.
Переносят сюда приёмы обучения с учителем: регуляризацию, аугментацию, кросс-валидацию. У ассоциативных правил нет целевой переменной, риски тут другие: низкий support и ложные связи от промо.