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

Определение

Обзор проекта

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

Не все клиенты одинаково реагируют на предложения. Некоторые клиенты хватаются за каждое предложение, чтобы пожинать плоды, в то время как другие, похоже, никогда не реагируют на предложения. Цель Starbucks должна состоять в том, чтобы нацеливаться на большее количество клиентов с «высокой реакцией» и меньше на клиентов с «низкой реакцией».

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

Данные для этого проекта состоят из смоделированных транзакций для анонимных клиентов и разбиты на три разных источника. Хотя это файлы JSON, библиотека Python Pandas упрощает преобразование в фреймы данных.

  • portfolio.json — содержит идентификаторы предложений и метаданные о каждом предложении (длительность, сложность, тип и т. д.)
  • profile.json — демографические данные для каждого клиента.
  • transcript.json — записи о транзакциях, полученных предложениях, просмотренных предложениях и выполненных предложениях.

В течение 30 дней отслеживаются десять предложений (четыре бонусных, четыре дисконтных и два информационных) для 17 000 различных клиентов, однако не у каждого клиента есть данные о транзакциях, и не у каждого клиента, у которого есть данные о транзакциях, есть профиль в Starbucks. приложение. Как только мы учитываем только клиентов, у которых есть профиль Starbucks И есть данные о транзакциях, у нас остается набор данных, состоящий из данных о транзакциях среди 14 825 клиентов (все еще много данных, из которых можно извлечь полезную информацию).

ПроблемаПостановка

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

Для построения модели будут предприняты следующие шаги.

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

Метрики

Точность и F-оценка будут использоваться для измерения того, насколько хорошо классификатор делает прогнозы. F-оценка будет использоваться в тандеме с точностью для учета точности и отзыва. Поскольку мы заинтересованы в правильном определении клиентов, которые просматривают и завершают предложения, мы хотели бы уделить больше внимания точности F-показателя. При этом бета, которая будет использоваться для измерения F-показателя, будет равна 0,5.

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

Анализ

Исследование и визуализация данных

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

портфолио

  • каналы (категориальные): способы получения клиентом предложения (Интернет, электронная почта, мобильные устройства, социальные сети).
  • сложность (целое число): сумма в долларах, которую необходимо потратить, чтобы выполнить предложение.
  • duration (int): срок действия предложения в днях.
  • id (str): идентификатор предложения
  • offer_type (категория): бого, скидка или информационное
  • reward (int): сумма вознаграждения в долларах после выполнения предложения.

Хотя в этом наборе данных всего 10 уникальных предложений, все же совершенно ясно, что большинство предложений попадают в среднее значение в соответствующих полях. Большинство предложений требуют, чтобы клиент потратил не менее 10 долларов США, чтобы претендовать на вознаграждение, и предложения действительны от 1 до 10 дней, причем большинство из них имеют срок действия 7 дней.

Большинство предложений (8 из 10) являются либо bogo (купи одно, получи одно), либо скидками, что имеет смысл, поскольку это типы предложений, когда клиент получает что-то взамен, если предложение выполнено. Все равно будет интересно посмотреть, как клиенты взаимодействуют с информационными предложениями. Хотя за предложения информационного типа вознаграждения нет, будет интересно посмотреть, вызовут ли эти типы предложений покупательскую привычку у некоторых клиентов.

профиль

  • age (int) — возраст клиента в годах.
  • gender (categorical) — пол клиента (мужской, женский, другой)
  • id (str) — идентификатор клиента
  • income (float) — годовой доход клиента.

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

  1. Из 17 000 строк в этом наборе данных у нас есть данные о доходах только 14 825 клиентов.
  2. В строках, содержащих отсутствующие значения дохода, также указан возраст клиента, представленный как 118 (слишком старый, чтобы разумно считать его действительным возрастом).

Из-за этих выводов строки со значениями NaN в поле «доход» будут удалены из набора данных.

После удаления строк со значениями NaN оказывается, что возраст клиентов обычно распределяется со средним возрастом около 54 лет.

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

расшифровка

  • событие (категориальное) — классификация типа транзакции (предложение получено, предложение просмотрено, предложение выполнено, транзакция)
  • person (str) — идентификатор клиента
  • time (int) - время транзакции в часах, начиная с 0
  • value (dict) — словарь либо offer_id, либо транзакций за заданное время.

Интересно отметить хронометраж событий. Существуют заметные пики и спады количества событий, происходящих в течение примерно 30-дневного (700-часового) размера выборки.

Похоже, что Starbucks рассылает предложения клиентам в определенное время в течение месяца — примерно раз в два дня или около того в начале и середине месяца. Когда месяц подходит к концу, Starbucks увеличивает частоту отправки предложений клиентам.

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

Методология

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

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

  1. Очистить/преобразовать данные
  • Портфолио — категориальные функции быстрого кодирования (каналы, offer_type)
  • профиль. Поля «возраст» и «доход» объединяются в категориальные группы, а затем кодируются одним нажатием этих новых полей вместе с полем «пол».
  • стенограмма — разделите различные ключи словаря в поле «значение» на отдельные столбцы, а затем верните соответствующие значения для каждого значения «время».
  • расшифровка — заполните значения NaN 0 в полях «сумма» и «вознаграждение».

2. Объедините поля из наборов данных «портфолио» и «профиль» в набор данных «транскрипт», чтобы все функции содержались в одном наборе данных.

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

4. Создайте поле вывода, которое определяет, было ли получено, просмотрено и выполнено определенное предложение. Это важный шаг к построению прогностической модели.

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

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

Выполнение

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

  1. Остальные категориальные признаки в окончательном наборе данных были масштабированы таким образом, чтобы признаки с разными значениями размера не влияли на то, как модель обрабатывала признаки.
  2. Окончательный набор данных был разделен на три отдельных набора данных — по одному для каждого из типов предложений, чтобы каждый из них мог быть отдельно пропущен через модель.
  3. Отбросьте поля, которые в конечном итоге считаются ненужными как часть анализа или могут привести к тому, что модель классификатора не будет работать оптимально.
  4. Создайте набор данных «функции» и «выход» для обучения.
  5. Разделите данные на наборы данных для обучения и тестирования.
  6. Перед запуском наборов данных через модель следует инициализировать «наивный предиктор», чтобы сравнить результаты и увидеть, улучшает ли обработка данных с помощью алгоритма машинного обучения точность прогнозов.
  7. Пропустите каждый набор данных через модель классификации случайного леса, используя гиперпараметры по умолчанию.

Ниже приведены результаты классификатора Random Forest.

Модель Бого

Naive Predictor: [Accuracy score: 0.4960, F-score: 0.5516]

Training Accuracy: 0.7719984135078475
Training F-Score: 0.7754986024918281
Test Accuracy: 0.6145479265805575
Test F-Score: 0.6106651376146789

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

Naive Predictor: [Accuracy score: 0.5178, F-score: 0.5731]
Training Accuracy: 0.7897711217858152
Training F-Score: 0.7994176354219921
Test Accuracy: 0.6824141048824593
Test F-Score: 0.6983215151243156

Информационная модель

Naive Predictor: [Accuracy score: 0.3763, F-score: 0.4300]
Training Accuracy: 0.7703804347826086
Training F-Score: 0.7081948258418848
Test Accuracy: 0.6215482118605704
Test F-Score: 0.47119645494830137

После прохождения каждого набора данных через классификатор Random Forest становится ясно, что модель обеспечивает повышение точности и F-показателя. В то время как точность и F-показатель для наивных предикторов варьировались в пределах 37–57 %, те же данные, пропущенные через модель классификации, дали точность и F-показатели в диапазоне 47–80 %.

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

Уточнение

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

parameters = {“max_depth”: [15, 20, 30],
              “n_estimators”: [90, 100, 150],
              “min_samples_split”: [10, 20, 25],
              “min_samples_leaf”: [10, 12, 15],
              “bootstrap”: [True, False],
              “criterion”: [“gini”, “entropy”]}

Ниже приведены результаты после оптимизации гиперпараметров.

Модель Бого

Unoptimized model
------
Accuracy score on testing data: 0.6145
F-score on testing data: 0.6107

Optimized Model
------
Final accuracy score on the testing data: 0.6651
Final F-score on the testing data: 0.6621
{'bootstrap': True, 'criterion': 'entropy', 'max_depth': 20, 'min_samples_leaf': 12, 'min_samples_split': 10, 'n_estimators': 90}

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

Unoptimized model
------
Accuracy score on testing data: 0.6824
F-score on testing data: 0.6983

Optimized Model
------
Final accuracy score on the testing data: 0.7231
Final F-score on the testing data: 0.7349
{'bootstrap': True, 'criterion': 'gini', 'max_depth': 30, 'min_samples_leaf': 15, 'min_samples_split': 10, 'n_estimators': 100}

Информационная модель

Unoptimized model
------
Accuracy score on testing data: 0.6215
F-score on testing data: 0.4712

Optimized Model
------
Final accuracy score on the testing data: 0.6655
Final F-score on the testing data: 0.5258
{'bootstrap': True, 'criterion': 'entropy', 'max_depth': 30, 'min_samples_leaf': 12, 'min_samples_split': 10, 'n_estimators': 100}

Результаты

Оценка и проверка модели

После уточнения гиперпараметров модели классификации и получения оптимизированной точности и F-показателя последним шагом является сбор важности функций для каждой из моделей. Это скажет нам, какие функции в данных были наиболее предсказуемыми. Для каждой модели я перечислю 5 наиболее предсказуемых функций, и это будет определение того, какие демографические данные клиентов с наибольшей вероятностью отреагируют на каждый тип предложения.

Модель Бого

  1. Стал участником в 2018 году
  2. Доход варьируется от 30 000 до 48 000 долларов.
  3. Стал участником в 2016 году
  4. Мужской пол
  5. Женский пол

По сути, это говорит нам о том, что большинство клиентов, которые положительно реагируют на предложения BoGo, — это как мужчины, так и женщины, которые недавно стали участниками Starbucks Rewards (в ​​течение последних 2 лет) и имеют доход в более низком диапазоне.

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

  1. Получил предложение через соц.
  2. Стал участником в 2018 году
  3. Получено предложение через мобильный
  4. Сложность предложения 20
  5. Награда 5

Хотя недавнее членство в Starbucks Rewards похоже на модель Bogo, клиенты, которые склонны реагировать на предложения со скидками, похоже, больше зависят от получения предложения через социальные и мобильные платформы. Кроме того, что удивительно, эти клиенты, скорее всего, отреагируют положительно, если им будет предложено предложение с довольно высокой сложностью и вознаграждением в размере 5 долларов.

Информационная модель

  1. Стал участником в 2018 году
  2. Получил предложение через соц.
  3. Доход варьируется от 30 000 до 48 000 долларов.
  4. Продолжительность предложения 3 дня
  5. Получено предложение через Интернет

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

Обоснование

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

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

Вывод

Отражение

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

  1. Исходную проблему попросили решить и предоставили соответствующие данные
  2. Данные были собраны, очищены и предварительно обработаны (обработка данных)
  3. Наивное предсказание было установлено в качестве ориентира для производительности модели.
  4. Классификатор был обучен с помощью Random Forest и оптимизирован с помощью GridSearchCV.
  5. Были извлечены значения функций, и функции с наибольшим весом были признаны ключевыми демографическими данными клиентов, которым нужно отправить конкретное предложение.

Как подтвердят многие аналитики данных и ученые, этап 2 (обработка данных) был, безусловно, самой трудоемкой и сложной частью этого проекта. Очистка и преобразование данных таким образом, чтобы получить приемлемые результаты при выполнении алгоритма машинного обучения, может быть очень сложной задачей, и этот проект не вызывал возражений. Мне пришлось проявить творческий подход к преобразованиям данных, особенно с набором данных «стенограмма».

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

Улучшение

Хотя в начале этого проекта казалось, что у нас было много данных для работы, после того, как значения NaN и ненужные функции, такие как транзакции, были удалены, а данные были разделены на три части (по типу предложения), казалось, что модели могли бы выиграть от большего количества данных. Имея больше данных, модели классификации, возможно, смогли бы обеспечить более высокую точность и результат F-показателя.

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

Чтобы узнать больше об этом анализе, см. ссылку на мой Github, доступную здесь