Введение

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

  • портфолио: содержит идентификаторы предложений и метаданные о каждом предложении (длительность, тип и т. д.). 10 строк, 6 столбцов.
  • профиль: демографические данные для каждого клиента. 17 000 строк, 5 столбцов.
  • расшифровка: записи о транзакциях, полученных предложениях, просмотренных предложениях и выполненных предложениях. 306 534 строки, 4 столбца.

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

Понимание бизнеса

Цель здесь — найти закономерности и показать, когда и где делать конкретное предложение конкретному клиенту.

Понимание данных

Давайте посмотрим таблицу за таблицей, чтобы мы могли получить общее представление.

Во-первых, портфолиофрейм данных:

Затем фрейм данных profile:

Наконец, фрейм данных стенограммы:

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

Подготовка данных и споры

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

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

Правильно выглядит лучше! что делает его еще лучше, так это то, что у нас нет значений NaN! так до следующего.

В нашем следующем профиле фрейма данных у нас было некоторое количество NaN и None как для «пола», так и для «дохода». Во-первых, мы заменим «Нет» в «поле» на «Н/Д», а затем заменим «Нет» в «доходе» на средний доход. После применения этих двух шагов таблица будет выглядеть так:

Выглядит отлично!!

Для нашего третьего и последнего фрейма данных стенограммамыможем изначально подтвердить отсутствие NaN с помощью следующего вывода:

event     0
person    0
time      0
value     0
dtype: int64

Но, как видно выше, столбец «значение» содержит словарь, что означает, что мы должны отделить каждое значение и удалить столбец «значение», так как он больше не нужен. Чтобы узнать, какое значение оно содержит, мы используем цикл for и находим ключи. После повторения столбца «значение» мы можем обнаружить, что у нас есть следующие ключи: [«идентификатор предложения», «сумма», «идентификатор_предложения», «вознаграждение»]. Наш следующий шаг — перебрать таблицу транскриптов, проверить столбец значений и обновить его, но каждый ключ в отдельном столбце и, наконец, удалить столбец «значение». После применения того, что я обсуждал, таблица будет выглядеть так:

Все выглядит готовым к анализу и моделированию. Вот так!

Анализ данных

В этой части он будет разделен на Одномерное исследование и Многомерное исследование.

Во-первых, давайте начнем с одномерного исследования и попробуем ответить на следующие вопросы:

  • Каков средний доход клиентов Starbucks?
  • Каков средний возраст клиентов Starbucks?
  • Какая акция самая распространенная?
  • Каковы наиболее распространенные возрастная группа и пол?
  • Кто самый лояльный клиент (большинство расшифровок)?

Начнем с первого вопроса, каков средний доход клиентов Starbucks? это довольно легко рассчитать, просто используйте .mean(), и средний доход:

65404.99156829799

это не так уж и мало, но учтите, что это их годовой доход.

К следующему вопросу. Каков средний возраст клиентов Starbucks? чтобы сделать это аналогично нашему предыдущему вопросу, используйте функцию .mean(). Результат:

62.53141176470588

Хм, так что большинство из них старшие…

Наш третий вопрос: какова самая распространенная акция? Это было немного сложно, так как их нужно было сначала преобразовать в текст. После преобразования и кодирования/декодирования я решил показать только топ-3 акции и показать только завершенные акции, поскольку они более важны. Итак, мы получили следующий вывод:

ВАУ! BOGO(купи один, получи один бесплатно) является наиболее часто используемым, за ним следует скидка с небольшой разницей. Хотя информация заняла третье место с разницей примерно в 40 000, это огромный разрыв.

Что касается четвертого вопроса, каковы наиболее распространенные возрастная группа и пол? Во-первых, я решил использовать возрастные группы, чтобы было легче иметь дело и читать. Следующий код показывает, как я их разделил:

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

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

Теперь давайте проверим группы gender:

ВАУ! большинство из них - мужчины с ~ 2000 отличиями от шкафа, в котором находятся женщины.

Теперь давайте посмотрим на наш последний вопрос, связанный с однофакторным анализом: кто является самым лояльным клиентом (большинство расшифровок)? Это может помочь нам, чтобы мы могли дать им больше рекламы, чтобы вознаградить их лояльность 😄. Чтобы подойти к этому вопросу, мы можем упорядочить «сумму» в порядке убывания и получить 10 лучших. После применения действия мы получим следующий вывод:

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

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

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

  • Какая реклама наиболее распространена среди детей, подростков, молодежи, взрослых и пожилых клиентов?
  • Из профилей, которые получают больше дохода, мужчины или женщины?
  • Какой тип продвижения нравится полу?

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

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

Наш второй вопрос: из профилей, которые получают больше дохода, мужчины или женщины? В этом вопросе мы проигнорируем группу N/A, потому что они не указали свой пол. Кроме того, мы будем использовать график, называемый скрипкой, и использовать как доход, так и пол, чтобы ответить на наш вопрос. Вывод будет выглядеть так:

O (зеленый) = Другое

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

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

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

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

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

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

Поскольку у нас есть простая задача классификации, я буду использовать точность для оценки своих моделей. Мы хотим увидеть, насколько хороша наша модель, увидев количество правильных прогнозов по сравнению с общим количеством прогнозов. Почему выбирают точность? Сначала давайте определим точность, отношение правильно помеченных предметов ко всему пулу предметов. Кроме того, точность отвечает на такие вопросы, как: сколько учеников мы правильно обозначили из всех учеников? Похоже на нашу ситуацию, да? потому что мы хотим узнать, сколько клиентов пользуются предложениями Starbucks. Кроме того, Точность = (TP+TN)/(TP+FP+FN+TN). Не забывайте, что это простая проблема классификации, так что это мое мнение и аргументация, почему использовать самый простой (точность).

Нашими особенностями будут:

  • Событие. (Будет заменено с категориального на числовое)
  • Время. (нормализованный)
  • Offer_id. (Будет заменено с категориального на числовое)
  • Количество. (нормализованный)
  • Награда. (нормализованный)
  • Возрастная группа. (Будет заменено с категориального на числовое)
  • Пол. (Будет заменено с категориального на числовое).
  • Доход. (нормализованный)

Пока нашей целью будет тип предложения.

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

Сравните производительность модели

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

Основываясь на приведенной выше таблице, мы видим, что мы добились 100% точности в наборах данных для обучения и тестирования на 4 моделях. Чтобы избежать переобучения, я выберу логистическую регрессию, так как она дает хорошие результаты 80,5% при обучении и 92,8% при тестировании наборов данных. Здесь лучше использовать логистическую регрессию, так как у нас мало биномиальных результатов. Здесь также хорошо, потому что у нас есть приличный объем данных для работы. Теперь давайте улучшим нашу модель, чтобы получить лучшие результаты.

Улучшения модели

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

Best Score: 0.8217311874728143
Best params: {'C': 3.5, 'dual': True, 'max_iter': 100}

Вывод

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

Улучшения

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