Это отчет о проекте Starbucks. Вы можете найти соответствующий ресурс github по этой ссылке: https://github.com/tylerzhang77/Starbucks-Offer-Analysis.

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

Я попытаюсь решить три проблемы, перечисленные ниже:

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

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

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

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

Каждое предложение имеет срок действия до истечения срока действия предложения. Например, предложение BOGO может быть действительно только 5 дней. Вы увидите в наборе данных, что информационные предложения имеют срок действия, даже если эти объявления просто предоставляют информацию о продукте; например, если информационное предложение действует 7 дней, можно предположить, что покупатель ощущает влияние предложения в течение 7 дней после получения рекламы.

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

Имейте также в виду, что кто-то, использующий приложение, может совершить покупку через приложение, не получив предложение или не увидев предложение.

В этот проект включены три набора данных: портфолио, профиль и стенограмма.

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

Портфолио содержит информацию об отправленных предложениях. Вот описание колонки:

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

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

Затем это набор данных профиля. Этот набор данных содержит всю информацию о пользователях в программе вознаграждений. См. заголовок набора данных и описание столбца ниже:

  • пол: (категория) M, F, O или null
  • возраст: (числовое) отсутствующее значение, закодированное как 118
  • идентификатор: (строка/хэш)
  • became_member_on: (дата) в формате ГГГГ/ММ/ДД
  • доход: (числовой)

Есть несколько вещей, которые нужно сделать, чтобы очистить этот набор данных:

  1. Отбросьте необоснованные данные.
  2. Dummy кодирует год, когда пользователь стал участником.
  3. Манекен кодирует пол.

Вот так выглядит набор данных после очистки:

Последним является набор данных расшифровки, содержащий журнал событий.

  • человек: (строка/хэш)
  • событие: (строка) предложение получено, предложение просмотрено, транзакция, предложение завершено
  • значение: (словарь) разные значения в зависимости от типа события
  • идентификатор предложения: (строка/хэш), не связанный с какой-либо «транзакцией»
  • сумма: (числовое) деньги, потраченные на «транзакцию»
  • вознаграждение: (числовое) деньги, полученные в результате выполнения предложения
  • время: (число) часов после начала теста

Этапы очистки следующие:

  1. Разверните столбец значений для другого типа события.
  2. Изменить единицу времени с часов на дни

После очистки набор данных выглядит следующим образом:

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

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

Я создам индикаторы для каждого полученного предложения, чтобы показать его статус:

  • offer_viewed : 1, если полученное предложение просматривается позже; иначе 0.
  • offer_completed : 1, если полученное предложение завершается позже; в противном случае 0. Примечание: предложение можно завершить, не просматривая его.
  • viewed_before_completed : 1, если полученное предложение сначала просматривается, а затем завершается; 0 иначе. Этот индикатор показывает, действительно ли предложение сработало.

Я также создам несколько переменных для хранения числовых значений, которые мы сможем изучить позже:

  • trans_amount_comp : общая сумма транзакции между началом предложения и его завершением.
  • reward_amount : сумма вознаграждения по предложению.
  • total_trans_amount : общая сумма транзакции между началом и окончанием предложения.

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

Элементарный анализ данных

  1. Доля просмотренных предложений среди всех полученных предложений составляет 73,9%. При этом доля выполненного предложения среди всех поступивших предложений составляет 48,8%.

2. Распределение вознаграждения за выполненное предложение:

Из двух приведенных ниже сюжетов мы можем наблюдать некоторые забавные факты:

  • В успешных предложениях предложения на 2, 3, 5 и 10 долларов США имеют схожие пропорции.
  • Предложение 3USD было предоставлено в наименьшей сумме. Однако в удачных предложениях его доля относительно высока. Мы видим, что это сумма вознаграждения, у которой есть потенциал.

3. Распределение суммы сделки по выполненным предложениям.

На графике ниже мы видим, что сумма транзакции достигла пика около 18 долларов США среди успешных предложений.

4. Распределение по возрасту для тех, кто завершил предложение

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

5. Распределение доходов для тех, кто завершил предложение

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

6. Влияние типа канала

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

7. Влияние количества сложности предложения

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

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

Часть 1. Классификатор завершения предложения

Я хочу использовать демографическую информацию о пользователях и информацию о портфолио предложений, чтобы предсказать, будет ли предложение выполнено. Будут использоваться и сравниваться три метода машинного обучения: логистическая регрессия, K ближайших соседей и случайный лес. Набор данных разделен на обучающий набор и тестовый набор с соотношением 80/20.

Метод 1. Логистическая регрессия

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

Мы можем получить матрицу путаницы и несколько метрик классификации в тестовом наборе, как показано ниже:

Метод 2: K ближайших соседей

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

Из графика видно, что точность тестового набора перестает увеличиваться после K = 15. Мы выбираем его в качестве параметра для обучения модели.

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

Способ 3. Случайный лес

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

Из приведенного выше вывода мы можем видеть метрики классификатора без какой-либо настройки.

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

Вот код для случайного поиска по сетке. 4-кратная перекрестная проверка будет выполнена для 30 итераций.

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

Запустим классификатор случайного леса с оптимальными параметрами, и мы получим следующие результаты на тестовом наборе:

Заключение по классификации

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

Часть 2. Прогнозирование прибыли

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

Примечание. Около 1,6 % данных содержат экстремальные значения. Здесь мы удаляем их для лучшей производительности. Мы подмножаем набор данных, чтобы он содержал только записи с прибылью в пределах 40 долларов США.

Метод 1. Регрессия лассо

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

Мы проведем 5-кратную перекрестную проверку, чтобы найти оптимальную альфу. Из вывода мы видим, что оптимальная альфа равна 0,001.

Затем мы подбираем модель с оптимальным параметром и получаем обучающую выборку и тестовую выборку MSE.

Метод 2: K ближайших соседей

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

Из графика видно, что MSE тестового набора перестает уменьшаться примерно после того, как n_neighbors = 15. Итак, мы выбираем 15 соседей и запускаем модель. Мы можем увидеть обучающую и тестовую MSE на выходе.

Способ 3. Случайный лес

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

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

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

Сначала мы выполним случайный поиск по сетке. Код и лучшие результаты параметров показаны ниже:

Мы получаем лучшую случайную сетку из приведенного выше вывода. Затем мы можем настроить полную сетку в соответствии с набором оптимальных параметров:

С помощью оптимальной модели мы можем подобрать и предсказать данные, а также получить результаты MSE.

Заключение прогноза

Из вывода мы видим, что случайный лес имеет лучшую общую производительность.

Заключение

Проект сложен в отношении работы по предварительной обработке данных. Мне удалось реализовать пару вещей ниже:

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