Ну купиии! Или применение AI для рекомендаций
Все же тут страдают от спама? Обвешаны адблокерами, white-листами, спам-фильтрами? Я точно сильно страдал от бесконечных предложений, но в какой-то момент стала появляться и полезная информация, причем еще в нужные моменты.
Став руководителем проектов по предиктивной аналитике в компании НОРБИТ, я оказался по другую сторону баррикад и хочу поделиться опытом по разработке рекомендательных сервисов для программ лояльности.
Источник
Рекомендательными системами уже давно никого не удивишь. Скорее наоборот, не так просто найти онлайн-магазин, который не предлагал бы вам купить что-то после добавления товара в корзину. Грамотно составленная лента рекомендаций или маркетинговая рассылка способна принести хорошую прибыль и повысить средний чек. Давайте посмотрим, как это работает.
Вкратце это выглядит так. Сначала мы выполняем работы по аналитике и кластеризации клиентской базы. На этом этапе становится понятно, чем объединены и чем отличаются группы клиентов, на какие признаки будет опираться будущая модель персональных рекомендаций. Исходя из бизнес-задач, выбираем метод разработки моделей, тестируем на исторических данных, делаем тестовую рассылку, проверяем уровень отклика (конверсию) и, если видим значимый прирост, несём в продакшн.
Мы придерживаемся следующей классификации маркетинговых предложений:
- «Ковровая бомбардировка» — одинаковое предложение для всех клиентов. Просто и неэффективно.
- «Сегментация». Производится разделение клиентов на группы по какому-либо набору признаков, например, по возрасту, полу и среднему чеку.
- «Микро-сегментация». На этом этапе количество атрибутов и степень их влияния на итоговую оценку клиента уже не позволяют проводить ручное сегментирование клиентов, и в дело вступают алгоритмы машинного обучения. Клиентские данные обогащаются дополнительными сведениями, выполняется адаптация каналов связи под каждый сегмент.
- Персональный подход. Построение индивидуальных рекомендаций для каждого клиента на основе сведений о нем.
- Real-time персональный подход. Улучшенная версия пункта №4, характеризуется непрерывным обновлением данных. Вариантов построения таких рекомендаций может быть много. О них подробнее расскажу далее.
Понятно, что эффективность должна возрастать от первого типа к пятому, но увеличивается и сложность проведения такого анализа, а следовательно, и возможные затраты на внедрение и поддержку системы. Эффективность можно оценивать разными способами, например, по конверсии, но даже уровень конверсии можно считать по-разному, в зависимости от типа компании и характера маркетингового предложения.
Если производится рассылка с предложением конкретных товаров, то в качестве конверсии можно взять долю клиентов, которые после получения сообщения совершили целевую покупку. Хотя здесь есть множество нюансов. Например, важно исключить из расчета тех клиентов, которые и без SMS всё равно бы купили товар.
В борьбе за цифру конверсии важно помнить о балансе между Precision и Recall, чтобы избежать ситуации, когда удалось добиться 100% попаданий в нужных клиентов, при этом модель рекомендовала всего трех клиентов из трех миллионов.
Кластеризация
Когда у компании клиентская база измеряется миллионами, проведение кластеризации позволяет узнать своих клиентов лучше. Для ее построения могут быть использованы следующие данные: история продаж, перечень торговых точек, каталог товаров, клиентские данные, проводимые акции и т.д. Полезно добавить и внешние данные, например, население городов, где была зарегистрирована карта лояльности или совершались покупки, информация о конкурентах. На основе анализа становится понятно, какие признаки могут сыграть роль в разделении клиентской базы на кластеры. Для каждого кластера выделяются разные характерные особенности. Часто ими оказываются такие признаки, как товарные предпочтения, социально-демографические факторы, частота и время покупок, активность клиента в последнее время, доля покупок по акциям или в праздники, реакция на рассылки.
Важным этапом является построение корреляционной матрицы для исключения признаков, которые сильно зависят друг от друга и могут перетягивать на себя важность в процессе разделения кластеров. Для визуализации можно применить метод PCA с предварительной нормализацией для упрощения работы алгоритма кластеризации (k-means), приведу пример кода на Python для этого:
# Нормализация и уменьшение размерности данных
scaled = MinMaxScaler().fit_transform(features.fillna(0))
pca = PCA(n_components=2)
components = pca.fit_transform(scaled)
plt.scatter(components[:, 0][::500], components[:, 1][::500])
Количество кластеров выбирается экспериментальным путем, опираясь на собственный опыт и учитывая сумму квадратов расстояний от образцов до ближайшего центра кластера. Обычно выделяют 7–10 кластеров. Брать меньшее число кластеров не очень полезно для бизнеса, большее — сложно обозначить четкие признаки разделения. Часто по графику трудно понять, когда следует остановиться.
График суммы квадратов расстояний от образцов до ближайшего центра кластера
costs=[]
r = range(2, 17)
for k in tqdm(r):
kmeans = KMeans(n_clusters=k, n_jobs=11)
kmeans.fit(scaled)
cost = kmeans.inertia_
print(f'for {k} CLUSTERS COST = {cost}')
costs.append(cost)
fig, ax = plt.subplots(figsize=(12,5))
ax.plot(r, costs)
ax.set_xticks(r);
# Пример разделения кластеров
kmeans = KMeans(n_clusters=7, n_jobs=12, random_state=42)
kmeans.fit(scaled)
fig, ax = plt.subplots()
plt.scatter(components[:, 0][::500], components[:, 1][::500], c=kmeans.labels_[::500], s=10, cmap='rainbow')
scatter =plt.scatter(components[:, 0][::500], components[:, 1][::500], c=kmeans.labels_[::500], s=10, cmap='rainbow')
legend1 = ax.legend(*scatter.legend_elements(),
loc='upper right',bbox_to_anchor=(1.15, 1), title=«Classes»)
ax.add_artist(legend1)
В результате мы получаем клиентскую базу с метками о разделении клиентов на кластеры. Каждый кластер можно проанализировать, определить основные признаки. Кластеризация помогает формировать портреты типичных клиентов, объединяет клиентов по их поведению. С учетом этих знаний можно проводить отдельные маркетинговые кампании для каждого отдельного кластера, а также выстраивать эффективные персональные рекомендации и формировать рассылки, позволяющие добиться большей конверсии, избегая метода «ковровой бомбардировки».
Рекомендательные модели
Кроме общих рекомендаций типа товар-товар: «В 2020 году вместе с новым айфоном клиенты часто покупают блоки питания, наушники, провод зарядки…», пользуются популярностью такие модели:
- Ранжирование клиентов для конкретного товара или группы товаров. Такие рекомендации применяются для формирования сегмента клиентов, которым может быть наиболее интересен конкретный товар. Типовым сценарием использования является создание сегмента клиентов в CRM-системе с дальнейшей e-mail/SMS-рассылкой.
- Ранжирование товаров для конкретного клиента. Этот метод используется для формирования ленты рекомендаций на сайте и в мобильном приложении, а также рассылках.
- Рекомендации определенных акционных механик клиенту.
- Рекомендательные системы могут выполнять и вспомогательную функцию, например, ML-модель для выбора оптимального канала и времени отправки персональных маркетинговых предложений позволит сэкономить на SMS-сообщениях, которые в большинстве своем были бы проигнорированы получателями.
UPLIFT для рекомендательных моделей
Итак, модель проанализировала клиентскую базу, отсортировала клиентов по убыванию интереса к определенному товару. Берем самый топ из списка и отправляем маркетинговые сообщения этим клиентам? К сожалению, нет.
В самом верху списка окажутся действительно самые лояльные к предложению клиенты, но как раз им ничего дополнительно отправлять и не следует.
Uplift-модель. Наиболее интересны для нас клиенты из группы «Убеждаемые»
Клиенты по-разному реагируют на маркетинговые предложения. Если игнорирование рассылки — это нормальная ситуация, то отпугивание чрезмерной назойливостью клиента, который и так хотел у нас что-то приобрести, — это точно не то, чего мы хотим добиться при построении рекомендательной системы.
Методика Uplift-моделирования разделяет клиентов на четыре категории. Согласно ей, на маркетинговую работу с «потерянными» и «лояльными» мы попусту потратим деньги и/или время; клиентов из группы «не беспокоить» вовсе настроим против себя;, а вот «убеждаемые» — как раз те, кого мы ищем. Именно среди этой группы конверсия от правильно подобранных предложений повысится больше всего.
DMP
Где же хранить все важные данные по клиентам и почему нельзя просто использовать данные, хранимые в CRM или системе по управлению лояльностью? Часто нужна информация из множества дополнительных источников: активность на сайте, мобильных платформах, обогащенные данные из внешних систем и т.д. Мы для для этих задач используем DMP-кластер (Data Management Platform) — систему по сбору, анализу и управлению информацией о клиентах.
Перечень задач, которые решает платформа
- Унификация сбора максимально возможного количества данных о клиентах из различных источников:
a. поведение на веб-сайтах;
b. поведение и использование мобильных приложений;
c. импорт данных о клиентском взаимодействии из корпоративных систем (CRM, Service Desk и др);
d. импорт данных о маркетинговом взаимодействии и конверсиях. - Идентификация клиента и его устройств во всех возможных каналах, связывание «пути клиента» (customer journey) из различных источников, матчинг идентификаторов.
- Унификация доступа к данным по клиентам и пользователям, а также их «пути» для целей аналитики.
- Сегментация аудитории, определение попадания клиента или посетителя в тот или иной сегмент на основе описанных правил.
- Активация сегментов для маркетинговых коммуникаций — обновление сегментов в настроенных рекламных каналах.
Сбор клиентских и пользовательских данных возможен из различных собственных источников:
- собственные сайты и лендинги;
- собственные мобильные приложения;
- сайты партнеров;
- CRM;
- клиентский сервис;
- Wi-Fi ловушки;
- другие корпоративные системы.
Платформа оперирует двумя основными типами сущностей:
- профиль клиента;
- событие пути клиента.
Профиль клиента (Customer Profile) представляет собой набор известных идентификаторов клиента, а также атрибуты, которые ему назначены. Атрибуты представляют собой более-менее стойкие во времени характеристики или черты (traits) клиента. Они могут быть известными на основе анкетных данных (предоставленные самим клиентом), аналитическими (характеристики клиента, рассчитанные по каким-либо алгоритмам или формулам), либо предиктивными (предсказательные характеристики, полученные в результате работы моделей машинного обучения).
Событие пути клиента (Customer Journey) представляет собой запись о произошедшем событии в какой-то точке контакта с клиентом, его идентификаторы и атрибуты, описывающие событие и его контекст. Допустим, пользователь зашел на страницу сайта. В таком случае атрибутами, описывающими событие, будут наименование страницы, раздел сайта, в котором находится пользователь, браузер и операционная система пользователя, форм-фактор устройства (мобильный телефон, планшет, компьютер). Также может определяться регион, из которого пользователь делал запрос — страна, город. Если клиент интернет-магазина положил товар в корзину, то такими данными будут название товара, категория товара, стоимость, которую видел пользователь, количество и т.д. Если пользователь перешел на сайт с какого-то рекламного объявления, то в привязке к событию сохраняются UTM-метки.
Чем больше различных признаков присутствует в данных, тем больше вероятность того, что рекомендательная система будет успешно справляться со своей задачей, поэтому для улучшения качества данных применяются методы обогащения данных и сквозной аналитики. Разница между ними состоит в том, что под обогащением данных подразумевается получение дополнительной информации из внешних сервисов, в то время как сквозная аналитика предполагает объединение данных из внутренних систем.
NiFi
Прежде чем обрабатывать данные, нужно их получить, а учитывая, что задача построения рекомендаций требует актуальной информации, то и организовать автоматическое обновление данных. Для решения такого класса задач применяются ETL-системы. Мы выбрали NiFi, т.к. его удобнее всего интегрировать с нашей остальной инфраструктурой, построенной на базе кластера Hadoop.
Пайплайн в NiFi выстраивается из блоков, именуемых процессорами. Каждый процессор выполняет свою задачу. Приведу пример из четырех блоков.
- ListFTP получает список файлов по заданному пути на FTP-сервере, возможен обход вложенных папок. ListFTP удобен тем, что хранит состояние последнего сканирования папок: для каждого файла записывается timestamp его последнего изменения, и до тех пор, пока он не изменится, этот файл не будет загружаться повторно.
- После того, как процессор ListFTP получил список файлов, этот перечень отправляется в процессор FetchFTP, который осуществляет загрузку данных. Имеется возможность указать регулярное выражение для имен файлов, которые следует загружать.
- Предположим, что данные на сервере заказчика хранятся в виде архивов и было бы удобно на лету распаковывать их, чтобы на нашем сервере оказались данные, пригодные для непосредственного считывания. С этой задачей нам поможет процессор UnpackContent, позволяющий распаковывать tar и zip-архивы.
- Заключительный этап нашего пайплайна — загрузка данных в HDFS при помощи PutHDFS. В настройках этого процессора нужно указать директорию, в которую будут сложены файлы.
NiFi обладает широким набором процессоров для загрузки (например, для взаимодействия с S3 и Azure), преобразования данных (например, преобразования форматов) и других операций. Также имеется возможность создания своего собственного процессора.
Spark
Объем данных, с которым приходится работать при построении рекомендательных моделей, может измеряться сотнями гигабайт. В таких условиях не обойтись без инструмента, справляющегося с большими объемами информации. Мы выбрали pySpark, развернутый на кластере Hadoop.
Преимущества такого подхода
- Все процессы по получению и обработке информации существуют в рамках единой инфраструктуры: NiFi обеспечивает удобную доставку файлов с серверов заказчика, HDFS — хранение файлов на дисковой подсистеме кластера и резервное копирование, Yarn — управление задачами.
- Spark обладает очень гибкими возможностями конфигурирования, что позволяет эффективно управлять ресурсами при построении пайплайна.
- Хотя Spark в некоторых задачах и проигрывает в быстродействии Pandas, особенно на небольших датасетах, все его сильные стороны раскрываются при работе с большими объемами данных.
AirFlow
Airflow — библиотека для разработки и управления рабочими процессами. Пайплайны представлены в виде DAG’ов (directed acyclic graph), которые представляют собой код на языке Python, описывающий последовательность производимых действий. Для удобства работы Airflow имеет встроенный набор операторов, облегчающих выполнение определенных действий, например: bash_operator, s3_file_transform_operator, sqlite_operator и другие. Имеется планировщик задач и удобный веб-интерфейс.
Разработка рекомендательных моделей
Наша инфраструктура готова и пора перейти непосредственно к разработке рекомендательной системы.
Основные методы построения рекомендательных систем:
- Контент-ориентированный подход основан на анализе истории пользователя. Производится оценка отношения клиента к товарам, с которыми он взаимодействовал ранее, и на основании этого выполняется построение рекомендаций. Преимущества такого подхода: легко строить рекомендации для новых товаров, т.к. в основе работы модели лежит анализ признаков. Недостатки: сложно строить рекомендации для клиентов, по которым имеется мало истории.
- Коллаборативная фильтрация. Суть этого метода заключается в следующем: если клиент A покупает товары №1, №2, №3, а клиент B товары №1 и №3, то вероятно, что товар №2 также будет интересен клиенту B. В отличие от клиент-ориентированного подхода, при коллаборативной фильтрации не используются признаки товаров или клиентов, а только матрица оценок, в которой на пересечении клиента и товара находится метрика полезности.
- Кластеризация. В случае, когда имеется мало исторических данных, можно прибегнуть к кластеризации клиентов на основе их признаков с последующим построением рекомендаций. Недостатком такого подхода является невозможность построения индивидуальных рекомендаций.
Важно отметить, что принципы формирования рекомендаций во многом зависят от предметной области: где-то лучше будут работать рекомендации по подобию, где-то по сопутствующим товарам, где-то по связи покупок клиентов. Одна из наших рекомендательных систем предназначается для сети общественного питания. В ней мы используем модель Bayesian Personalized Ranking, суть которой заключается в следующем: оптимизация модели выполняется на основе ранга пар пользователь — товар. Для этого формируется матрица оценок — таблица размерности (количество клиентов Х количество товаров), где в ячейках указана метрика — степень заинтересованности клиента в товаре. В качестве метрики можно выбрать количество покупок, сумму, частоту, длительность просмотра товара в каталоге и другие производные метрики. Затем на основе этой матрицы оценок формируется датасет: (u, i, j) ∈ DS, что означает, что пользователь u предпочитает товар i товару j.
Такой подход может быть хорош, когда у нас мало дополнительной информации о клиентах, а имеется, например, только его история навигации по сайту. Но в том случае, когда данные о покупателях содержат дополнительные сведения, можно построить рекомендательную систему при помощи градиентного бустинга.
В этом случае важно максимально обогатить имеющиеся данные новыми признаками, такими как:
- частота покупок внутри товарной категории,
- частота и доля покупок конкретного продукта или внутри группы товаров,
- вариативность покупок, значимость конкретного бренда,
- влияние рассылок,
- общая частота визитов в магазин,
- наличие определенной периодичности визитов,
- влияние скидок и акций.
Модель, обученная на таких данных, сможет не только подобрать наиболее интересный для клиента товар, но и выбрать самое подходящее время рассылки и канал коммуникации. Обучение модели производится при помощи градиентного бустинга. Наш выбор — XGBoost, но CatBoost или LightGBM тоже показывают достойные результаты.
A/B тестирование
Как проще всего оценить рост конверсии от применения рекомендательной модели? Можно сравнить исторические данные по конверсии по прошедшим рассылкам, но возникает много вопросов.
- Нужно посчитать долю клиентов получивших рассылку и совершивших покупку. Но как это посчитать? Клиент пришел через три дня после получения, его считать? Клиент пришел и купил 10 товаров, но не тот, который был в рассылке? Клиент ходил каждую неделю, он пришел из-за сообщения?
- Как влияет содержание маркетингового сообщения на конверсию? Очевидно, что предложение 90% скидки вызовет более высокую конверсию чем скидка в 10%.
Для оценки качества рекомендательных моделей мы обычно применяем A/B-тестирование, т.е. в тестовых рассылках выделяем контрольные группы, в которых создаем сегменты из случайных клиентов или специально вручную сформированных. Но это уже тема отдельной большой статьи.
Если говорить про наш опыт, то использование специальных моделей по формированию персональных маркетинговых предложений для SMS-рассылок позволила повысить конверсию клиентов с 3% до 25%.
Выводы
Текст получился длиннее, чем я планировал, но теперь вы знаете, как работают наши сервисы рекомендаций. При построении рекомендательной модели в случае отсутствия дополнительной информации о клиентах преимущество отдаем, например, Bayesian Personalized Ranking (использование ранга пар пользователь-товар). Если же дополнительная информация о клиентах присутствует, можно пробовать градиентный бустинг (XGBoost, CatBoost, LightGBM), но не забываем при этом максимально обогащать новыми признаками. Правильно выстроенная инфраструктура при внедрении сервиса рекомендаций поможет сократить время в дальнейшем, она автоматизирует многие процессы (сбор, обработку данных), поэтому Hadoop, Spark, NiFi, AirFlow — отличные помощники.
Для оценки эффективности рекомендательных моделей мы используем A/B-тесты и считаем долю клиентов, совершивших после получения сообщения целевую покупку, или же увеличение среднего чека при просмотре рекомендательных лент.