Всем привет! На связи Никита Губин, менеджер продуктов машинного обучения в СберМаркете. Моя команда занимается внедрением ML-решений в маркетинге. И сегодня хочу рассказать, как нам удалось в 8 раз увеличить ROI одного регулярного промо, которое вы можете увидеть в нашем приложении ежедневно.

Статья будет полезна: 

  • Продактам и менеджерам по маркетингу. Разберём конкретный кейс, эффект от которого мы получаем уже более 6 месяцев. Можно забирать гипотезы и инсайты ????

  • Лидам и инженерам машинного обучения. Расскажу про конкретные алгоритмы при помощи которых получили высокий импакт.

Сначала я введу в общий курс дела, а потом поделюсь нашим подходом и тем, какую ML-магию мы использовали под капотом. Если интересует только конкретный аспект, перескакивай сразу к сути. Поехали!

Какие задачи мы решаем в СберМаркете с помощью ML-маркетинга?

Краткая теория акций: какие они вообще бывают и зачем нужны

Как акция работала без ML?

План: Discovery, ???, Profit

Под капотом ML

Побочный квест: как мы считали эффект из-за ограничений стандартного A/B

Результаты и рефлексия

Команда ML-маркетинга: кто мы такие и чем мы занимаемся

Начём с базы: СберМаркет — это онлайн-сервис доставки из магазинов и ресторанов. Сейчас мы работаем в 160 городах и сотрудничаем со 160+ федеральными и региональными сетями. Клиент выбирает желаемый товар в приложении, а наши сборщики собирают его с полок реальных магазинов и доставляют на дом. А ещё сейчас мы масштабируем направление Ready To Eat — заказа готовой еды.

Основа бизнес-модели СберМаркета — создание выгоды для всех участников и именно для этого мы используем акции и скидки. Если акция реализована верно, то все в плюсе: 

  1. Клиенты радуются выгодным ценам и покупают то, что искали. 

  2. Ретейлеры-партнеры (и мы вместе с ними) получаем больше продаж. 

Вообще, акция — это настоящий инвестиционный проект. У каждый есть свой бюджет: мы тратим его на стимулирования спроса, то есть даём клиенту скидку, а по факту сами покрываем часть стоимости товара. Если акция работает хорошо, то спрос вырастает так сильно, что мы выходим в плюс за счёт значимого увеличения продаж.

Звучит как математическая задача, поэтому неудивительно, что в конце концов к её решению подключили команду ML. Наш главный фокус — генерировать добавочный GMV с помощью ML-моделей. Вот неполный список проектов, которыми мы занимаемся: 

  • персонализация скидок для пользователей 

  • автоматизация медиапланирования и поиском способов тратить маркетинговый бюджет более эффективно

  • оптимизация количества и размеров промокодов 

  • создание новых промомеханик, акций и скидок 

50 оттенков акций

Коротко расскажу, какие бывают акции: 

  1. Акцептная скидка. По-простому, это промокод. Чтобы получить скидку, нужно «акцепнуть», то есть принять условия акции.

  2. Безакцептная скидка. Она доступна для любых пользователей, и в интерфейсе выглядит как красная цена. Мы в приложении используем разные форматы и механики таких скидок: «Здесь дешевле», «Вау-кэшбэк» и разные спецпредложения.

Ещё акции бывают краткосрочные и долгосрочные. С помощью краткосрочных часто тестируются новые гипотезы, а иногда они призваны удовлетворить точеный сезонный спрос. С помощью долгосрочных мы стимулируем спрос на постоянной основе.Примером долгосрочной акции, например, является механика Buy More, Pay Less, когда при покупке нескольких товаров, объем скидки увеличивается.

В кейсе, о котором я хочу рассказать ниже, акция является долгосрочной и безакцептной.  Она действует в СберМаркете практически всегда и является нашей стратегической инициативой.

Как это было без ML

До того, как наша команда взялись за этот проект, акция запускалась в ручном режиме. Раз в две недели менеджер, исходя из собственного опыта и контекста, подбирал товары, которые будут участвовать в акции.

Какие тут минусы?

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

  2. Прямой результат пункта (1) —  отсутствие прогнозируемого эффекта.

Хотя мы доверяем нашим промо-менеджерам и очень их любим, но нам хотелось другого результата. Возврат инвестиций при таком подборе был немногим более 1. Это значит, что дав скидку в 1 рубль, мы получили назад 1 рубль добавочного GMV. Было ощущение, что можно научиться делать акции с большим ROI.

- Да, это команда ML-маркетинга. Уже выезжаем.

Итак, план был такой: научиться прогнозировать объём продаж SKU у определенного ретейлера при скидке в 5%, 10% и 15%.

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

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

Это звучало как хороший план, и мы приступили к моделированию!

  1. Мы подготовили данные. Выгрузили историю продаж и скидок по всем товарам в СберМаркете. 

  2. Для каждого оффера (товар + ретейлер) обучили модель, которая предсказывает объем продаж при разных размерах скидки.

  3. Теперь можно выбирать из множества офферов те, которые были выше заданного порога ROI и со скидкой, которая обеспечивала максимальный предсказываемый ROI.

Все звезды сошлись. У нас хватило данных и закономерностей в них, чтобы обучить качественный алгоритм, поэтому мы научились «предсказывать» будущее.

Секрет машинного обучения

Всем привет! Меня зовут Виталий Белов и я ML-инженер в команде ML-маркетинга. Врываюсь в статью Никиты, чтобы приоткрыть завесу тайны, что же такого мы сделали именно в ML-составляющей проекта. 

Вот три кита, на которых выстроился успех машинного обучения в нашем кейсе:

  1. Качественные исторические данные без пропусков. Данных нет, значит алгоритм учить не на чем. 

  2. Вариативность скидок — история продаж при скидке = 0 за всю историю не даст обучить модель.

  3. Отдельная модель для каждого SKU.

В итоге в обучающую выборку попали только те товары, которые год и более продавались в СберМаркете и у которых была история промо. В качестве признаков наша модель использовала историю двух последних недель продаж конкретного товара.

Мы стали трансформировать данные каждого дня из предыдущего 14-дневного периода в отдельный признак с помощью shift в pandas dataframe. В качестве базовой модели использовали CatBoostRegressor, который дал оптимальный результат по точности предсказания и скорости обучения/инференса. 

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

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

Нагляднее показать работу можно на графике:

Красным — величина относительной скидки, а синим — уровень продаж
Красным — величина относительной скидки, а синим — уровень продаж

В правой его части видим развилку на 4 линии — это предсказание продаж при разном размере скидки. Таким образом, сравнивая продажи при отсутствии скидки и предсказанные продажи при одной из заданных величин скидки, мы можем посчитать ROI. 

Одной из задач, с которой мы столкнулись в процессе работы было расширение покрытия —  на какую долю от всех пар ретейлер-продукт мы получаем прогноз от нашей модели. Я уже упомянул, что мы сами создали 2 барьера, на основе которых обучили модель:

  • товар должен быть на площадке не менее года

  • он должен был промиться хотя бы раз

Однако, мы хотели научиться предсказывать эффект для тех пар, по которым у нас таких исторических данных не имелось. Требовалось запустить модели «холодного старта». Базовое решение не давало возможности получить предсказание при прямом переносе модели, обученной на одном из ретейлеров для другого ретейлера. Различный уровень продаж приводил к значительным ошибкам. 

Мы сформировали несколько подходов к решению этой задачи: кластеризация, применение эмбеддингов (векторного описания каждого продукта), прямой перенос продуктов с макисмальным ROI на другие ретейлеры.  А самым удачным решением стало применение StandartScaler из библиотеки sklearn к данным объема продаж, которое сработало достаточно точно.

В настойщее время мы продолжаем искать пути, как повысить качество модели и тратить промобюджет наиболее эффективным способом.

Подсчёт результатов — отдельный квест

Для оценки результата нашими коллегами из отдела аналитики была разработана новая методология на основе помагазинного теста — сравнивали показатели до акции, в период и после:

  • среднюю выручку с клиента 

  • проникновение категории в корзину 

  • частотность заказов 

  • долю акционных заказов в корзине

  • количество категорий в корзине

  • кросс-опыление категорий (стало ли категорий в корзине больше) 

  • сквозную конверсия в покупке 

Мы смотрели на суммарные продажи в эти же периоды относительного прошлого года и на их прирост. Сезонность в нашей индустрии — это большое дело и каждый (даже двухнедельный) период в году — особенный. Поэтому было решено сравнивать результаты именно с данными прошлого года и никак иначе.

Что в итоге

Результаты нас очень порадовали. После подведения итогов даже открыли пару бутылок шампанского :) 

  • Мы увеличили ROI акции (ML против ручного подбора) более чем 8 раз.

  • Сократили время на выбор товаров. Менеджер выбирал товары часами, а модель считается за минуты. Если что, менеджеры не остались без работы, но теперь используют нашу модель, так что подход стал более data-driven

  • Увеличили инкрементальный GMV от акции на 1022% в рамках теста.

Самое крутое — мы дали большой объем скидок для наших клиентов и получили настоящий вин-вин. Сейчас в этой акции на постоянной основе участвует около 15% аудитории СберМаркета. 

Теперь в наших планах докручивать и масштабировать эффект от модели, увеличивать покрытие и ROI. Но главное — мы стали использовать модель как основу для других проектов со скидками и акциями. Этот кейс стал нашей первой большой победой и теперь мы стараемся распределять бОльшую часть промо-бюджета с помощью ML.

Попробую декомпозировать успех нашего кейса. 

  1. Очень важно выбрать проект с наибольшим эффектом и наименьшими затратами ресурсов команды. Кстати, недавно мы писали статью о том, как подходим к приоритизации. Здесь само решение подступиться к этой задаче и приоритизировать её на фоне остальных сделало половину дела.

  2. Конкретно в нашем случае CatBoostRegressor дала результат в решении задачи прогнозирования объема скидки.

  3. И конечно, результат выше это усилия нашей большой команды:

    • Виталий Белов (ML-инженер) 

    • Глеб Ерофеев (ML-инженер)

    • Дима Деменков (лид команды ML-инженеров) 

    • Полина Масленникова (Руководитель группы промо)

    • Вячеслав Назаров (Аналитик) 

    • и я Никита Губин (менеджер ML-продуктов)

Всем спасибо за внимание и буду рад ответить на комментарии!


Кстати, ещё об одном классном ML-кейсе СберМаркет можно прочитать вот тут: ML-модель out-of-stock. Как контролировать доступность 200 млн товаров на рынке e-grocery?

А ещё приходите на конференцию E-COMMUNITY 24 августа. Там будет несколько докладов об ML от наших коллег по e-com. Например о том, как Как CV помогает пользователю найти товар мечты по визуальному образу.

https://clck.ru/35HHiQ

Product&data команда СберМаркета ведет соцсети с новостями и анонсами. Если хочешь узнать, что под капотом высоконагруженного e-commerce, следи за нами в Telegram и на  YouTube. А также слушай подкаст «Для tech и этих» от наших it-менеджеров.

Комментарии (1)


  1. xaoc80
    12.08.2023 21:05

    А LSTM или его аналоги не будут лучше на временных данных работать?