Введение

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

Различные кейсы для прогнозной маркетинговой аналитики:

  1. Подробная оценка лидов
  2. Сегментация потенциальных клиентов для развития кампании
  3. Целевое распространение контента
  4. Прогноз пожизненной ценности
  5. Прогноз скорости оттока
  6. Допродажи и готовность к кросс-продажам
  7. Понимание соответствия продукта
  8. Оптимизация маркетинговых кампаний

В этом посте мы рассмотрим случай Оптимизация маркетинговых кампаний.

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

1. Прогнозная аналитика: что это такое и почему это важно

2. Маркетинговая аналитика для сред с большим объемом данных

3. Как использовать прогнозную аналитику для повышения эффективности маркетинга

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

В этом посте мы рассмотрим технику прогнозного моделирования поведения клиентов на примере набора данных Starbucks. Starbucks предоставил смоделированные данные, которые имитируют поведение клиентов в мобильном приложении Starbucks Rewards. Набор данных можно найти здесь. Раз в несколько дней Starbucks рассылает предложение пользователям мобильного приложения. Предложение может быть просто рекламой напитка или реальным предложением, таким как скидка или BOGO (купите один, получите второй бесплатно). Некоторые пользователи могут не получать никаких предложений в течение определенных недель. Не все пользователи получают одно и то же предложение, и этот набор данных представляет собой упрощенную версию реального приложения Starbucks, потому что базовый симулятор имеет только один продукт, тогда как Starbucks на самом деле продает десятки продуктов.

Starbucks хочет объединить данные о предложениях, данные о клиентах и ​​данные о транзакциях (операционные данные), чтобы получить представление о поведении клиентов и общей эффективности предложений как ценности для бизнеса.

Учитывая приведенное выше ключевое утверждение, ниже приводится основная цель, мотивация проблемы или формулировка проблемы:

Создайте модель, которая прогнозирует, ответит ли клиент на предложение или нет.

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

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

Обзор

Весь анализ будет состоять из следующих шагов:

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

Шаг 1 — Анализ каждого портфеля, профиля и данных о транзакциях

Этот набор данных содержит смоделированные данные, которые имитируют поведение клиентов в мобильном приложении Starbucks Rewards. Данные содержатся в трех файлах:

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

Вот схема и объяснение каждой переменной в файлах:

portfolio.json

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

profile.json

  • age (int) — возраст покупателя (отсутствует значение, закодированное как 118)
  • стал_member_on (целое число) — дата, когда клиент создал учетную запись приложения (формат ГГГГММДД)
  • гендер (str) — пол клиента (обратите внимание, что некоторые записи содержат «O» вместо M или F)
  • id (str) — идентификатор клиента
  • доход (float) — доход клиента

транскрипт.json

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

Шаг 2. Очистите и преобразуйте все данные портфеля, профиля и транзакции.

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

данные портфолио

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

4. Наконец, ниже приведены характеристики фрейма данных портфолио.

данные профиля

  1. Удалены наблюдения за клиентами в возрасте 118 лет, у которых пол был равен None, а доход – nan. Таких наблюдений 2175. Кроме того, значение 118 в признаке возраста представляет нулевое значение.
  2. Функция «возраст» и «доход» преобразована в ячейки. Функция «Возраст» была объединена в функции «возраст_10», «возраст_20», «возраст_30», «возраст_40», «возраст_50», «возраст_60», «возраст_70», «возраст_80», «возраст_90» и «возраст_100».

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

Из приведенного выше графика видно, что возраст признака после снижения возраста 118 лет распределен равномерно.

3. Функция «Доход» была объединена в функции «доход_30-й», «доход_40-й», «доход_50-й», «доход_60-й», «доход_70-й», «доход_80-й», «доход_90-й», «доход_100-й», «доход_110-й» и «доход_120-й».

4. Функция «пол» была закодирована OneHotEncoded в «F», «M» и «O», обозначающие женщин, мужчин и других.

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

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

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

5. Разработка функций была выполнена для функции «становился_членом_на», и было создано несколько других функций, а именно —

  • «membership_tenure» — обозначает продолжительность членства клиента
  • «2013», «2014», «2015», «2016», «2017» и «2018» — год, когда клиент стал участником Starbucks.
  • 'month_1', 'month_2', 'month_3', 'month_4', 'month_5', 'month_6', 'month_7', 'month_8', 'month_9', 'month_10', 'month_11' и 'month_12' — месяц в какой клиент стал членом Starbucks.

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

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

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

6. Наконец, ниже приведены характеристики профиля Dataframe.

данные расшифровки

  1. В кадре данных транскрипта нет нулевых значений.

11,02%, т. е. 33772 наблюдения в базе данных расшифровки, принадлежат клиентам в возрасте 118 лет. Поэтому мы удалили наблюдения с клиентами в возрасте 118 лет, поскольку у нас все еще есть около 89% данных для дальнейшего анализа.

45,45 % событий представлены как транзакции, 24,38 % событий — как полученные предложения, 18,28 % событий — как просмотренные предложения и 11,89 % событий — как завершенные предложения. Мы бы разделили события с типами «транзакции» и «предложения», чтобы использовать их позже для анализа.

2. Наконец, ниже приведены особенности фрейма данных стенограммы.

Шаг 3 — Объедините данные о портфеле, профиле и транзакциях

  1. Данные о предложениях и данные о транзакциях были разделены, и были созданы 2 новых кадра данных, а именно: i) offer_df, который содержит только события с типом «предложение получено», «предложение просмотрено» и «предложение выполнено», и ii) dataframe transaction_df содержит только событие с типом «транзакция». '.

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

2. Преобразуйте предложения_дф и транзакции_дф.

3. Объедините данные о транзакциях, демографии и предложениях в Combine_data_df.

4. Наконец, ниже приведены характеристики фрейма данных Combined_data_df.

5.Проанализируйте процент откликов на предложения

Распределение предложений, отправленных клиентам, близкое и равномерное.

Ниже приведена скорость отклика клиентов на различные предложения.

Предложение с offer_id как «fafdcd668e3743c1bb461111dcafc2a4» с типом предложения «скидка» получило самый высокий отклик от клиентов с коэффициентом отклика 76%, тогда как предложение с offer_id как «3f207df678b143eea3cee63160fa8bed» с типом предложения «информационное» получило самый низкий отклик от клиентов с 37% Скорость отклика.

Offer_id ‘fafdcd668e3743c1bb461111dcafc2a4’ является наиболее успешным предложением и соответствует «скидочному» предложению с минимальной тратой 10 долларов в течение 10 дней с момента получения предложения и вознаграждением в размере 2 долларов. Offer_id ‘3f207df678b143eea3cee63160fa8bed’ является наименее успешным предложением и соответствует информационному предложению без минимальной суммы затрат и без вознаграждения.

Шаг 4 — Выберите показатель производительности для анализа производительности модели и сравнения различных моделей.

  1. Ниже показано распределение целевого класса в объединенных данных.

Наш комбинированный набор данных, созданный из наборов данных Starbucks (данные о предложениях, демографические данные клиентов и данные о транзакциях), почти сбалансирован (слегка несбалансирован) с точки зрения распределения целевого класса (клиенты, которые отвечают на предложение (54%), представленные классом). 1 и которые не отвечают на предложение (46%), представленное классом 0), такие показатели производительности, как точность, не будут правильным показателем производительности модели в этом случае, и их следует избегать. Вместо этого точность, полнота и f1_score являются хорошими мерами для оценки модели в этом случае.

В этом случае оценка модели с точностью и полнотой даст лучшее представление о ее производительности, а не о точности. Потому что Starbucks хотела бы отправлять предложения тем клиентам, у которых больше шансов воспользоваться предложениями, а не отправлять предложения всем клиентам, что позволило бы Starbucks иметь эффективный маркетинг и получить больше пользы для бизнеса от предложений. Метрика F1-score — это гармоническое среднее метрик точности и полноты и лучший способ обеспечить большую прогностическую силу проблемы и то, насколько хорошо прогностическая модель делает прогнозы. См. Точность классификации недостаточна: вы можете использовать дополнительные показатели эффективности для получения дополнительной информации.

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

Мы создадим базовую модель (наивную модель)с которой мы сравним нашу модель, чтобы определить, работает ли наша модель лучше базовой модели или нет. Наша базовая модель предсказывает, что все пользователи отреагируют на предложение. Итак, мы рассчитали бы f1_score базовой модели.

Наша базовая модель дала f1_score 0,6996. Следовательно, наш другой обученный классификатор должен давать f1_score лучше, чем пороговое значение f1_score, равное 0,6996.

Шаг 6 — Выберите наиболее эффективную модель на основе метрики и времени обучения.

  1. Перед обучением таких классификаторов, как логистическая регрессия, случайный лес, Adaboost и GradientBoosting, объединенные данные были разделены на обучающие и тестовые данные.

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

3. Несколько функций из Combined_data_df были исключены, поскольку они не будут играть никакой роли во время обучения модели, например «customer_id», «offer_id», «время», «электронная почта».

i) Отбросьте «customer_id» и «offer_id», поскольку они являются уникальными идентификаторами.

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

iii) Отбросьте «электронную почту», так как она имеет только 1 значение во всех наблюдениях, и значение равно 1.

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

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

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

Все наши обученные классификаторы дают лучшее значение f1_score, чем пороговое значение f1_score, равное 0,6996. RandomForestClassifier и GradientBoostingClassifier получили почти равные f1_score (приблизительно 0,92), но RandomForestClassifier потребовалось гораздо меньше времени для обучения, чем GradientBoostingClassifier. Таким образом, наиболее эффективным алгоритмом классификатора среди четырех вышеперечисленных классификаторов был RandomForestClassifier.

7. После точной настройки гиперпараметров обученного RandomForestClassifier с помощью GridSearchCV наша модель была улучшена и дала лучшее значение f1_score 0,9319 с перекрестной проверкой на тестовых данных. Наша окончательная модель сильнее, чем эталонная модель, базовая модель или наивная модель, о которых сообщалось ранее, с f1_score 0,6996.

Шаг 7 - Рассчитайте важность функций, заданную наилучшей оценкой обученной модели.

  1. Ниже приведены 10 основных функций, а также их важность.

2. Ниже приведено наблюдение о 10 лучших функциях —

  • 10 основных функций, которые влияют на то, ответит ли клиент на предложение или нет после просмотра предложения: 'total_amount', 'membership_tenure' , 'social', 'difficulty', 'duration', 'reward', '2018', '2016', 'income_30ths' и 'age_50s'.
  • total_amount, потраченные покупателем, — это самая большая и самая большая характеристика, которая может односторонне повлиять на то, совершит ли покупатель предложение после просмотра предложения, т. е. на какую сумму покупатель, вероятно, потратит, решит, совершит ли покупатель предложение. Таким образом, знание заранее, сколько клиент может потратить, может определенно помочь в определении того, ответит ли клиент на предложение и выполнит ли его. Для этого потребуются другие алгоритмы контролируемого обучения, т. е. регрессионные модели, чтобы предсказать общую сумму, которую человек может потратить, на основе данных о предложениях и демографических данных клиентов.
  • После 'total_amount', 'membership_tenure' является второй по величине характеристикой, которая показывает, как долго клиент был участником программы вознаграждений Starbucks, в значительной степени влияет на то, выполнит ли клиент предложение после ответа на него.
  • После 'membership_tenure', 'social feature', что означает, что если Starbucks отправит предложение покупателю через социальные сети, вероятно, будет больше откликов, чем при другом способе коммуникации.
  • После функции 'social' следует функция 'difficulty', которая представляет минимальную сумму, потраченную для завершения предложения, влияет на то, ответит ли клиент и завершит предложение.
  • После функции 'difficulty' следует функция 'duration', которая показывает, как долго действует предложение, влияет на реакцию клиента и завершение предложения.
  • После функции 'duration', функция 'reward' показывает, какую сумму в качестве вознаграждения клиент получает в ответ, если клиент ответит и выполнит предложение.
  • После функции 'reward', функции '2018' и '2016' означают, что если клиент стал участником программы вознаграждений Starbucks в 2016 и 2018 годах, у него было больше шансов ответить на предложение и выполнить его.
  • После функции '2018' и '2016' следует функция 'income_30ths', которая представляет собой - если доход клиента составляет 30000, что является начальной группой доходов, то клиент, скорее всего, больше отреагирует на предложение и завершит его.
  • После функции 'income_30ths’ следует функция 'age_50s', которая означает, что если возраст клиента составляет 50 лет, то клиент, скорее всего, больше откликнется на предложение и завершит его.

Шаг 8. Вычислите производительность лучшей модели на тестовом наборе и визуализируйте производительность с помощью графика матрицы путаницы.

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

2. Рассчитайте f1_score на тестовых данных

Точно настроенный лучший оценщик RandomForestClassifier дал f1_score 0,9336 на тестовых данных, что довольно хорошо.

3. Рассчитайте истинно отрицательные, ложноположительные, ложноотрицательные и истинные положительные результаты из матрицы путаницы.

4. Постройте матрицу путаницы без нормализации.

5. Постройте нормализованную матрицу путаницы.

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

Отражение

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

Улучшение

1. «Придумывать фичи сложно, отнимает много времени, требует экспертных знаний. «Прикладное машинное обучение» — это, по сути, разработка функций». — Профессор Эндрю Нг. Таким образом, можно было бы разработать дополнительные функции для предложений, демографических данных клиентов и данных о транзакциях, чтобы получить более качественную модель.

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

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

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

Весь код для этого анализа можно найти здесь.