Starbucks предоставила набор данных, который имитирует поведение клиентов, использующих мобильное приложение Starbucks Rewards. Приложение Starbucks предоставляет возможность рекламировать и делиться предложениями с клиентами. Клиенты также могут использовать его для оплаты в магазинах. Starbucks рассылает различные виды рекламы и предлагает своим клиентам один раз через равные промежутки времени. Клиент может получить одно из следующих предложений:

  • Информационное предложение (т.е. реклама)
  • Предложение скидки
  • Купи один, получи один (BOGO) предложение

Предложения со скидками и BOGO имеют определенную сложность: покупатель должен совершить минимальную покупку, прежде чем он сможет воспользоваться предложением. Кроме того, каждое предложение имеет срок действия. В случае информационных предложений срок годности наступает, когда покупатель перестает ощущать влияние рекламы.

Предоставляемые данные включают демографические данные каждого клиента, активность клиентов в приложении за период 30 дней. Он включает временные метки, когда клиент получил, просмотрел и выполнил предложение, когда была совершена покупка, а также сумма потраченных денег.

Постановка задачи

Целью рассылки рекламы и предложений клиентам является увеличение количества покупок клиентов. Однако было бы наивно рассылать все предложения всем клиентам одновременно. Цель проекта — использовать транзакционные и демографические данные для определения предложений, которые должны быть ориентированы на разные группы клиентов.

Проблема, которую я решил решить, заключается в следующем:

1- Каковы основные факторы эффективного предложения в приложении Starbucks?

2- Создайте модель, чтобы предсказать, примет ли пользователь предложение?

Наборы данных

Ниже приведены файлы данных, включенные в репозиторий проекта.

  • portfolio.json содержит подробную информацию о каждом предложении: продолжительность, вознаграждение, тип и т. д.
  • profile.json содержит демографическую информацию о клиенте
  • transcript.json содержит всю активность клиентов: транзакции, полученные предложения, просмотренные предложения и выполненные предложения.

Наборы данных были очищены и объединены таким образом, чтобы каждая строка включала активность клиентов, демографические данные клиентов и метаданные предложений.

Исследование данных

Из наборов данных мы сначала отметим, что смоделированные данные были получены за период 29,75 дней с 306 534 событиями. Каждое событие представляет собой транзакцию, полученное предложение, просмотренное предложение или завершенное предложение. На рисунке показано распределение населения по полу, доходу и возрасту.

Мы отмечаем, что возраст также приближается к нормальному распределению. Это необходимо для усечения на левой стороне кривой из-за того, что покупателю должно быть 18 лет или больше, чтобы быть частью программы Starbucks. Мы можем видеть выше, что значение age == 118 не имеет смысла, поскольку оно явно выходит за рамки нормального распределения, мы их отбросим во время предварительной обработки. Отметим, что около 8 500 клиентов — мужчины, 6 100 — женщины и около 200 — представители другого пола. Наконец, в случае дохода большинство людей имеют доход от 50 000 до 80 000.

Предварительная обработка данных

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

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

Назначение идентификаторов предложений транзакциям

Пометка транзакций и предложений, завершенных после просмотра предложений

Учет длительности/действительности предложений в конверсионных транзакциях из информационных предложений

Разработка функций

Подготовка данных для реализации

Реализация модели:

мы создаем три модели для прогнозирования эффективности предложения в каждом типе в зависимости от атрибутов предложения и демографических данных пользователей.

BOGO предлагает модель:

Точность модели случайного лесного классификатора (RF) фактически немного превосходит модель классификатора дерева решений (DT), но в целом производительность обеих моделей примерно одинакова (82,14% против 81,77% соответственно с точки зрения точности). Точность для первой попытки неплохая, более 80%. Я постараюсь настроить модель дальше, чтобы получить лучшую точность.

Однако с точки зрения оценки F1 обе модели ниже 80%, при этом модель случайного леса работает хуже по сравнению с классификатором дерева решений: 75,91% против 79,63%. Чтобы проанализировать это, мы должны обратиться к формуле для точности, отзыва и оценки F1.

Модель со скидкой:

На этот раз модель классификатора случайного леса также имеет лучшую производительность по сравнению с классификатором дерева решений с точки зрения точности (87,23% против 86,72%), а оценка F1 также ниже (81,43% против 82,87%).

Оценка F1 для этих моделей в целом ниже по сравнению с оценкой точности. Это может указывать на то, что в некоторых случаях обе модели ошибочно классифицируют отрицательные случаи (efficient_offer = 0). Опять же, меня это не слишком беспокоит, так как меня больше беспокоит модель, точно предсказывающая положительные случаи, поэтому я предпочел бы использовать модель с более высокой точностью, где показатель F1 для случаев Effective_offer=1 выше, для чего наш классификатор RF имеет лучшую производительность. (0,9317 против 0,9280).

Модель информационных предложений:

Производительность этих моделей хуже по сравнению с двумя другими наборами данных с точностью ниже 80% для обеих моделей, но модель RF по-прежнему работает лучше. Оценка F1 также хуже: 67,54% RF Classifier, хуже, чем у модели DT (68,66%).

Уточнение

При уточнении модели я сначала попробую настроить параметры для трех моделей RF, прежде чем экспериментировать с удалением или добавлением функций для улучшения производительности модели. Я решил провести GridSearch, чтобы определить оптимальные параметры модели. Для всех трех предложений модель Random Forest показала относительно хорошую производительность, поэтому я использовал поиск по сетке, чтобы определить наилучшие параметры.

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

Проверяя важность функции для анализа основных движущих сил эффективного предложения, мы видим, что наиболее важным фактором эффективных предложений во всех трех случаях является срок членства. Однако вторая по важности функция отличается для каждой из трех моделей.

Для предложения BOGO срок членства является наиболее важной характеристикой, а другие переменные имеют гораздо меньшие пропорции. Доход, возраст и offer_received_cnt — это 2-я, 3-я и 4-я по важности характеристики, но их пропорции очень малы.

Для предложения скидки после срока членства следующими наиболее важными переменными являются возраст и доход. Но он все еще очень мал в пропорциях.

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

Изучение демографии различных групп клиентов:

Мне было интересно понять, каковы характеристики групп 3 и 4, то есть клиентов, на которых предложение вообще не влияет. Однако, сравнив их характеристики с группами 1 и 2, я не увидел существенных различий в их демографии.

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

В трех сегментах большинство людей попадают в средний диапазон доходов (50–100 тысяч). Распределение доходов между тремя сегментами относительно одинаково.

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

Группа 2 — это люди, которые вообще не тратили, так как предложения для них оказались неэффективными, поэтому их нет на графике. Но для групп 1 и 3+4 мы видим, что сумма расходов относительно одинакова, за исключением того, что люди из группы 1 тратят немного больше. Этого следовало ожидать, поскольку мы могли бы ожидать, что предложения смогли побудить их покупать больше, следовательно, их общие расходы увеличились.

Выводы

Выводы по вопросу 1:

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

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

Для BOGO и предложений скидок распределение важности функций было относительно одинаковым. Однако для информационных предложений распределение несколько более сбалансировано, а доход является второй по важности переменной.

Выводы по вопросу 2:

Мое решение использовать три отдельные модели для прогнозирования эффективности каждого типа предложений оказалось с хорошей точностью для моделей BOGO и моделей скидок (82,83% для BOGO и 87,35% для скидок), но чуть менее точно для информационных предложений (75,3%). . Тем не менее, я бы счел 75% приемлемыми в бизнес-среде, что касается информационных предложений, для информирования пользователей о продукте не требуется никаких затрат.

Между тем, для моделей BOGO и дисконтных моделей я вполне доволен точностью 80% и выше, так как в бизнес-среде, которая была бы приемлемой для показа предложений людям, даже если модель неправильно классифицирует несколько, общее увеличение дохода может оправдать мало ошибок.

Полный исходный код присутствует на Github.