Завершающий проект 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 со всем кодом, используемым в этом проекте.