Завершающий проект Udacity Data Science Nanodegree

Введение

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

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

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

Данные

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

Три предоставленных набора данных (в формате .json):

1 — портфолио.json

id (string): id предложения
offer_type (string): тип предложения, т. е. BOGO, скидка, информационная
сложность (int): минимальные затраты, необходимые для завершения предложения
вознаграждение (int): вознаграждение за завершение предложения
продолжительность (целое): время открытия предложения в днях каналы (список строк)

2 — профиль.json

age (int): возраст клиента
made_member_on (int): дата, когда клиент создал учетную запись приложения
gender (str): пол клиента (обратите внимание, что некоторые записи содержат «O» для других, а не M или F)
id (str) : идентификатор клиента
доход (float): доход клиента

3 — расшифровка.json

event (str): описание записи (например, транзакция, полученное предложение, просмотренное предложение и т. д.)
person (str): идентификатор клиента
time (int): время в часах с момента начала теста. Данные начинаются в момент времени t=0
value — (dict of strings): либо идентификатор предложения, либо сумма транзакции в зависимости от записи

Обработка данных

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

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

Некоторые этапы предварительной обработки:

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

Исследовательский анализ данных

Всего в наборе данных профиля 17 000 уникальных идентификаторов, 306 534 записи в расшифровке и 10 различных типов предложений в данных портфолио. Одной из наших
характеристик является тип события, и в связи с этим у нас есть четыре возможности: транзакция, полученное предложение, просмотренное предложение и завершенное предложение. Они распределены, как показано ниже, и мы видим большую разницу между транзакцией и тремя другими меньшими группами.

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

Средний возраст по нашим данным составляет 53 года после удаления выбросов. Средний доход составляет около 64 000 и колеблется от 30 000 до 120 000. Год, когда клиент стал участником, варьируется от 2013 до 2018. Наконец, что касается общей информации, сумма, необходимая для завершения предложения, наиболее представленного в записях, составляет около 10 и колеблется от 0 до 20.

Говоря о коэффициенте конверсии каждого вида рекламы, для BOGO и скидки я разделяю клиентов, которые видели и завершили акцию, а для информационных я вычислил коэффициент просмотра (когда пользователь видит предлагаемую акцию). Ниже приведены коэффициенты конвертации.

БОГО — 59,57%

Скидка — 74,71%

Информационная — 70,38%

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

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

БОГО

Средний возраст положительных пользователей в нише BOGO — 55 лет, а средний доход — 67 772 года. Что касается отрицательных пользователей, средний возраст составляет 50 лет, а средний доход равен 57 088. Легко заметить, что пожилые люди с более высоким доходом в среднем лучше воспринимают промо-акцию BOGO. Пользователи, которые конвертировали промо-акцию BOGO, имеют возраст на 8,1676 % выше и доход на 18,7148 % выше.

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

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

СКИДКА

В дисконтной нише средний возраст положительных пользователей составляет около 54 лет, а средний доход — 65 882 года. Для отрицательных пользователей средний возраст составляет 52 года, а средний доход равен 59 996. Как мы видели на примере BOGO, для пользователей скидок пожилые люди с более высоким доходом, как правило, в среднем лучше принимают промо, но разница немного меньше.
Пользователи, которые конвертировали промо-акцию со скидкой, имеют возраст на 3,3632 % выше, а доход на 9,8109 % выше.

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

ИНФОРМАЦИЯ

Что касается пользователей в информационной нише, средний возраст положительных пользователей составляет около 54 лет, а средний доход — 64 473 года. Для отрицательных пользователей средний возраст составляет 53 года, а средний доход равен 63 623 годам. То есть пользователи, сконвертировавшие информационную акцию, имеют возраст на 1,2987 % выше, а доход

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

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

Некоторая информация, которую мы можем выделить из приведенного выше анализа:

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

Моделирование

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

Некоторые важные моменты:

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

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

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

Применить модель

Чтобы улучшить/настроить нашу модель, мы использовали GridsearchCV, изменяя параметры: (a) max_leaf_nodes; (б) скорость обучения; и (c) n_оценщиков. Важно отметить, что мы решили уменьшить количество параметров для улучшения производительности. В другом сценарии мы могли бы изменить больше параметров, чтобы получить лучший результат.

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

Выбранная модель — AdaBoostClassifier, основанная на классификаторе дерева решений — комбинация, которая оказалась хорошим выбором для задач бинарной классификации
.

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

Результаты

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

В соответствии с метрикой, выбранной для оценки нашей модели, точность, мы нашли лучшие параметры и обучили нашу модель с ними.

Протестированные параметры перечислены ниже, а лучшие из найденных для нашей модели выделены жирным шрифтом.

clf__base_estimator__max_leaf_nodes: [6, 7]
clf__learning_rate: [0,9, 0,8]
clf__n_estimators: [200, 300]

Нашей базовой моделью, выбранной для AdaBoost, было дерево решений, и его параметр «максимальное количество листовых узлов» был протестирован с разными числами. Это означает, что это последний узел дерева решений, и установка этого значения так, чтобы оно не было большим, может быть важно, чтобы избежать переобучения в наших обучающих данных. В диапазоне от 6 до 7 второе число лучше всего соответствовало остальным параметрам.

Еще одним параметром, выбранным для изменения, была «скорость обучения». Проще говоря, поскольку Adaboost — это алгоритм, который несколько раз использует слабые классификаторы для повышения своей производительности, скорость обучения определяет, насколько новая модель будет способствовать существующей. В нашем случае из доступных вариантов было выбрано 0,9.

Наконец, мы решили варьировать «n_estimators», так как это коррелирует со скоростью обучения — обычно это компромиссное соотношение. Согласно документации Sklearn, определение таково: максимальное количество оценок, при котором бустинг прекращается. В случае идеальной подгонки процедура обучения останавливается досрочно. В нашей модели выбрано число 300 (на основе доступных вариантов).

Результат нашего прогноза получил точность около 78% для положительного класса. Это означает, что, предлагая промо пользователю, который, по прогнозам, будет положительным, мы попадаем в нужного пользователя (который будет конвертироваться) в 78% случаев в нашем тестовом наборе.

Ниже вы можете найти другие метрики модели из отчета о классификации.

Обоснование

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

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

Улучшение

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

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

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

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

Вывод

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

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