Возможно, вы захотите выпить кофе, пока читаете это

Введение

Давайте разберемся с этим: я кофеман. Честно говоря, сейчас я делаю глоток кофе, пока делаю этот пост. Вот почему, когда мне дали варианты относительно того, какие данные я возьму в основу своего ключевого проекта для программы Udacity Data Scientist Nano Degree, было очевидно, что это будет Starbucks Capstone Challenge.

Starbucks, крупнейшая сеть кофеен в мире, была основана в Сиэтле, штат Вашингтон, в 1971 году. Но кофе — не единственное, что пользуется популярностью в Starbucks. Уже ~5 лет ни для кого не секрет, что они много инвестируют в науку о данных. Я был в Сиэтле в 2017 году на Microsoft Build, когда впервые услышал о Starbucks и о том, что они делают в области науки о данных. Их стенд на мероприятии демонстрировал результаты их исследований в области науки о данных, предоставляя рекомендации на своем мониторе. . Кажется, они назвали этот проект Deep Brew.

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

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

Бизнес Старбакс

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

Стремясь идти в ногу с оцифровкой, Starbucks разработала собственное приложение, участником которого я также являюсь. Приложение работает двумя способами: во-первых, как место, где вы можете просматривать и покупать кофе; и, во-вторых, как средство для рассылки рекламных акций непосредственно клиентам. Можно сказать, что в разработку приложения было вложено много усилий, чтобы оно могло превзойти кредитные карты и Apple Pay с точки зрения платежных транзакций в США.

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

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

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

История данных

О чем говорят нам данные из приложения Starbucks? Давай выясним.

Предоставленные данные взяты из моделирования, которое имитирует поведение клиентов в мобильном приложении Starbucks Rewards. Нам предоставляется три набора данных:

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

Давайте подробнее рассмотрим каждый набор данных.

портфолио

Этот набор данных содержит 10 предложений, варьирующихся от скидок, «купи один-получи один» (bogo) и информационных. Типы скидки дают часть сложности (сумму, которую нужно потратить в первую очередь) в качестве вознаграждения. Награда варьируется от ~ 20–40%, а сложность — от 7 до 20. Валюта здесь не указана, поэтому мы будем предполагать, что все они находятся в одной и той же валюте, если не указано иное. Тип купи-один-получи-один (bogo) является наиболее щедрым, поскольку он дает точное значение суммы сложности в качестве вознаграждения (поэтому он называется «купи-один-получи-один»). Сложность и награда за этот тип колеблется всего от 5 до 10. Наконец, информационный тип просто отправляет пользователям push-рекламу без соответствующего вознаграждения. Как правило, они хороши для объявлений о новых продуктах, которые будут предлагаться в течение ограниченного времени. Эта акция является самой дешевой среди предложений, потому что клиентам не выплачивается вознаграждение.

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

Очистка данных

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

Профиль

Этот набор данных содержит анонимную информацию о клиентах, содержащую только пол, возраст, доход и дату членства. Таблица содержит 17 000 записей, однако в 2 175 пропущены значения по полу, возрасту и доходу. Я предполагаю, что приложение имеет два шага регистрации, запрашивая учетные данные (имя пользователя, адрес электронной почты и пароль), и на этом шаге мы можем получить дату членства. На другом этапе вы заполняете свой профиль, такой как день рождения (где мы получаем возраст), пол и доход. Второй шаг не требуется, поэтому отсутствует 2175 записей.

Клиенты в этом наборе данных состоят из 57% мужчин, 41% женщин и 1% других. Распределение между мужчинами и женщинами, хотя разница составляет 16%, мы все же можем считать это балансом на данный момент.

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

Возрастная группа:

  • 18–25: молодые
  • 26–40: взрослый
  • 41–60: Средневековье
  • 61–100: старый

Поколения:

  • 17–21: поколение Z
  • 22–37: миллениалы
  • 38–53: Поколение X
  • 54–72: Бумеры
  • 73–101: Тишина

Извлечение этих групп поможет нам лучше понять наши данные.

В возрасте 50–60 лет больше всего пьющих кофе [среднее: 54,4, медиана: 55, мода: 58]. Эта возрастная группа связана с middle_age и boomers, поскольку на протяжении всего анализа эти группы тратят больше на кофе. Гендерное распределение людей в профиле, как мужчин, так и женщин, также достигает пика в возрасте 50-60 лет.

Переходя к членству, данные варьировались с 2013 по 2018 год. В течение этих лет мы можем наблюдать постоянный рост членства с падением в 2018 году, возможно, потому, что данные о членстве закончились в середине того же года (июль 2018 года). Каждый год появляется больше новых столяров-мужчин, чем женщин, за исключением 2016 года, но только с очень небольшим отрывом.

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

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

Очистка данных

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

Другое дело, что в этом наборе данных есть всплеск возраста 118. По совпадению, когда возраст равен нулю, возраст всегда равен 118, что заставило меня задуматься: «Почему 118?» Похоже, что, поскольку даты в некоторых языках не могут быть обнулены, а SQL не поддерживает сверхминимальное значение даты, Starbucks просто установила минимальную дату на 1900 год, что, если данные относятся к 2018 году, означает возраст 118. Поэтому для согласованности я установил для всего возраста со 118 значение null.

Стенограмма

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

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

  • транзакция — событие, когда клиент совершает покупку. В этом случае сумма заполняется, но нет предложения. Не документировано, как транзакция относится к какому-либо предложению. Тем не менее, есть определенное задокументированное поведение того, как предложение завершается. Подумайте об этом так: в течение того времени, когда клиент начал получать предложение и до его продолжительности, клиент накапливает сумму, пока не достигнет сложности, за которую к тому времени клиент получает вознаграждение. Вот почему всегда совпадает то, что если текущая транзакция уже выполняет сложность, завершенное предложение также доступно с тем же временем, что и транзакция. Другим сложным аспектом является привязка информационных предложений, в которых нет предложения о завершении события. В документе бизнес предполагал, что любые транзакции, совершенные во время акции, будут связаны с информационным предложением. Так как нет никакой сложности, предложение завершается сразу.
  • предложение получено — событие, когда покупатель получает предложение по любому из каналов
  • просмотр предложения — событие, когда покупатель открыл и, возможно, просмотрел предложение. Это может быть определяющим фактором, если какая-либо покупка вызвана предложением.
  • предложение выполнено — событие, зафиксированное, когда клиент завершает предложение. Это, однако, не фиксирует завершение информационных предложений. Обратитесь к разделу о типах транзакций о том, как мы можем подключить их позже.

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

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

  • успешно — предложение получено, просмотрено и выполнено
  • успешно без предложения — предложение было получено и выполнено даже без просмотра
  • не удалось — предложение было получено, но не было ни просмотрено, ни завершено
  • просмотрено, но не выполнено — предложение было получено и просмотрено, но так и не выполнено

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

С другой стороны, функция времени — это время выполнения эксперимента, которое начинается с 0 и продолжается до завершения эксперимента. Максимальное значение времени равно 714, и поскольку оно представлено в часах, 714/24 = 29,75 (~30 дней или месяц). Это означает, что эксперимент длился месяц.

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

Основываясь на этом графике, предложения отправляются в дни 1, 8, 15, 18, 22 и 25. Первые 3 волны — еженедельные, затем — два раза в неделю. Кроме того, просто визуализируя график, мы видим, что отправленные предложения как-то пропорциональны другим предложениям.

Очистка данных

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

Примечания

Вам может быть интересно, как я сгенерировал эти графики. Их легко создать, если вы ознакомитесь с python и jupyter notebook, а также библиотеками pandas, numpy и построением графиков с помощью seaborn и matplotlib. Я думаю, что это необходимые компетенции, которые необходимо изучить, прежде чем браться за роль специалиста по данным, поскольку они позволят вам легко анализировать свои данные.

Анализ начального эксперимента

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

Обогащение наших данных

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

Группа стенограмм

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

  • волна — текущая волна для оффера. Это фиксируется путем получения диапазона дат между событиями получения предложений и нумерации их от 1 до 6. Всем событиям между этим диапазоном дат присваивается соответствующий номер волны.
  • diffs — средняя разница во времени между событиями. Это пригодится позже при разработке предложения. Это было получено путем выполнения текущей разницы в отсортированной группе данных времени для каждого клиента. Первое событие всегда равно 0, поэтому для нормализации средней разницы в формате сглаживания значение первого события заменяется средним значением различий.
  • получено, просмотрено, выполнено — теперь они представляют собой столбцы с логическими значениями при возникновении этих событий. Просмотры отбрасываются, если они выполнены после того, как предложение завершено, поэтому устанавливается в false.
  • закуплено — это логическое резюме, если клиент получил, просмотрел и выполнил предложение, то есть успешное предложение.
  • сумма — теперь это сумма, потраченная на предложение. Это рассчитывается путем получения всех транзакций, необходимых для завершения предложения. Затем получить сумму этой транзакции.
  • non_offer_amount — это сумма потраченных средств, не связанных с предложением. Это сумма всех остальных транзакций, если активных предложений нет или текущее предложение уже завершено.
  • mapped_offer — исходя из нашего понимания того, как работает расшифровка, мы можем успешно сопоставить предложение с любыми событиями. Это активное предложение на текущей волне.
  • расходы — сумма + сумма не оффера, суммируется сумма, потраченная на каждую волну
  • рекомендованный_оффер — идентификаторы оффера только в случае успешного оффера (purchased=true)

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

Q1: Какое предложение дает наилучшие результаты?

Инкрементная скорость отклика

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

  • Группа лечения — клиенты, которым были предоставлены предложения, и информация о том, завершили ли они предложение (покупка = правда).
  • Контрольная группа — клиенты, которым не предоставляются предложения и информация, если они все равно покупают какой-либо продукт независимо (non_offer_amount › 0)

Этот метод эксперимента мы называем A/B/N-тестированием, поскольку у нас есть более одного предложения для сравнения с контрольной группой. Обратите внимание, что при тестировании A/B/N сравнения должны быть независимыми друг от друга.

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

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

Чтобы рассчитать скорость отклика, вот наша формула.

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

Инвариантный тест

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

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

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

Следующим шагом является сравнение между контрольной группой и всеми объединенными предложениями.

В группе лечения 76277, а в контрольной группе 25723. Это дает нам 75 (лечение) : 25 (контроль), основываясь на исследовании, проведенном здесь, 25% - это просто наилучшее, прежде чем статистическая мощность значительно упадет. .

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

Статистический тест

Поскольку мы выбрали метрику, является ли покупка успешной с предложением или без него, это соответствует Bernoulli совокупности. Кроме того, размер нашей выборки больше 10, поэтому у нас достаточно выборок для выполнения z-test. По сути, z-test заключается в том, чтобы узнать z-оценку наших данных и получить P-значение (линия на диаграмме z-оценки). Кроме того, прежде чем мы сможем выполнить тест, нам нужно определить нашу гипотезу.

Подробности теста

Уровень значимости: 0,05

Тип: Z-тест с верхним хвостом

Гипотеза:

Чтобы мы могли успешно отвергнуть нулевую гипотезу (что означает, что эксперимент прошел успешно), нам нужно наше P-значение ‹ Уровень значимости.

Результаты

Z-оценка: -30,02

Р-значение: 1,0

Поэтому нам не удалось отвергнуть нулевую гипотезу, а это означает, что раздача предложений не повысит скорость отклика клиента. Они все равно пойдут покупать продукт, независимо от того, есть предложения или нет.

Результаты отдельных предложений

Как мы видим в нашем индивидуальном тесте предложений, прошли только предложения 6 и 7, в которых последнее имеет лучший балл.

  • Предложение 7: скидка на уровне сложности 10 с вознаграждением в размере 2 и продолжительностью 10.
  • Предложение 6: скидка на уровне сложности 7 с вознаграждением в размере 3 и длительностью в 7

Практический тест

Допустим, у нас средняя цена товара 8, а учитывая стоимость продвижения 0,15 на каждый канал (4 канала это 0,6 в сумме). Нам нужно увеличить скорость отклика на 0,075 до безубыточности. В этом упражнении мы скорректируем его до 0,10, чтобы по-прежнему получать доход от предложения. Кроме того, поскольку размер нашей выборки непропорционален, мы собираемся использовать версию стандартной ошибки без пула.

Подробности теста

Граница практической значимости: 0,10

Стандартная ошибка: не объединено

Тип теста: Доверительный интервал

Z: 1,645 (верхний хвост 95%)

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

Результаты

Доверительный интервал

  • мин: -0,11
  • макс: -0,09

Стандартная ошибка: 0,004

Погрешность: 0,006

Разница: -0,11

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

Результаты отдельных предложений

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

Краткое содержание

Таким образом, у нас есть только один явный победитель, чтобы ответить на вопрос, и это Предложение 7, предложение типа скидки со сложностью 10 и вознаграждением 2, действующим в течение 10 дней. Второй — Offer 6, однако он не прошел нашу практическую проверку. Худшим в обоих тестах является Предложение 5, тип скидки с очень высокой сложностью 20 и вознаграждением 5, действующим в течение 10 дней.

Q2: Какое предложение заставляет клиента тратить больше?

Доходная ставка

Больше расходов — больше доходов. Однако нам нужно учитывать сумму, которую мы теряем, давая вознаграждения и отправляя предложения. Поскольку у нас нет хорошего баланса между лечением и контролем, вместо этого мы собираемся использовать индивидуальную ставку дохода. Доход рассчитывается по-разному между экспериментальной и контрольной группой.

Для экспериментальной группы получение только суммы, потраченной на предложение, будет недостаточно для расчета дохода. Нам нужно вычесть вознаграждение и стоимость рассылки предложений (по 0,15 каждая). Здесь мы хотим определить, как предложения влияют на структуру расходов, поэтому мы собираемся добавить непредложение к сумме предложения как часть расходов клиента в течение этого периода.

  • Группа лечения — клиенты, которым предоставляются предложения, и информация о доходах.
  • Контрольная группа — клиенты, которым не предоставляются предложения и информация о доходах.

Прежде чем мы начнем, давайте быстро визуально сравним 2.

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

Инвариантный тест

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

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

Статистический тест

Выбранные нами метрики представляют собой разницу в среднем, поэтому это не соответствует популяции Бернулли. Еще одна заметная вещь заключается в том, что у нас неравные пропорции между группами, поэтому мы собираемся использовать не объединенный способ вычисления стандартной ошибки. Наконец, дисперсия населения неизвестна, поэтому тест, который мы будем проводить, — это t-тест.

Подробности теста

Уровень значимости: 0,05

Тип: Т-тест с верхним хвостом

Гипотеза:

Чтобы мы могли успешно отвергнуть нулевую гипотезу (что означает, что эксперимент прошел успешно), нам нужно наше P-значение ‹ Уровень значимости.

Результаты

Т-балл: 29,53

P-значение: 0,0

Степени свободы: 61297.097

На самом деле p-значение очень близко к нулю при 1.39e-190, для удобочитаемости я просто установил его равным нулю. Поскольку он меньше уровня значимости, гипотезу отвергаем. Это означает, что предложения каким-то образом повлияли на то, что клиенты стали тратить больше.

Результаты отдельных предложений

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

Практический тест

Что касается практического теста, мы собираемся предположить, что уровень влияния должен заставить клиента купить дополнительную порцию кофе. Мы не знаем цену кофе, но средняя сумма, потраченная на предложения, составляет 8,18. Чтобы упростить нашу границу, мы установим ее на 10,0.

Подробности теста

Граница практической значимости: 0,10

Стандартная ошибка: не объединено

Тип теста: Доверительный интервал

T: 1,645 (верхний хвост 95%)

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

Результаты

Доверительный интервал

  • мин: 6,98
  • макс: 7,80

Стандартная ошибка: 0,25

Погрешность: 0,41

Разница: 7,39

Степени свободы: 61287.097

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

Результаты отдельных предложений

На этот раз у нас есть только два предложения, Предложения 6 и 7, оба конца которых превышают нашу границу практической значимости. Отвечая на вопрос, Предложение 7 по-прежнему является лучшим предложением, а Предложение 5 — самым низким.

Краткое содержание

На этот раз у нас есть два предложения, которые прошли как статистическую, так и практическую проверку: Предложения 6 и 7 снова дают последнему победителю в этом раунде. Разница между предложениями 6 и 7 заключается в том, что первое имеет меньшую сложность (7), более высокую награду (3), но более короткую продолжительность (7).

Примечания

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

Я предоставлю ссылку на Github ниже, чтобы вы узнали, как я рассчитал значения. Z-Test и T-Test легко выполняются с помощью statsmodel, у которого есть методы для обоих (ztest и ttest_ind соответственно). У них также есть параметр, который вы можете установить в зависимости от характера вашей альтернативной гипотезы (нижняя, верхняя или двусторонняя). Однако для практического теста я не могу найти библиотеку, которая выполняет то, что я хочу, поэтому я создал метод, который вычисляет их на основе математической формулы для доверительного интервала.

Что касается того, как я выбрал тип теста, я следовал блок-схеме, описанной в этой ссылке. Это легко понять: как только я узнаю тип теста, все, что я сделал, — это либо нашел формулу, либо нашел библиотеку, которая ее выполняет.

Планирование следующего эксперимента

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

Q3: При подготовке к следующему эксперименту, как мы можем использовать результат, чтобы улучшить наше предложение для клиентов?

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

Есть две вещи, на которые мы можем ориентироваться.

  • Первый заключается в том, чтобы определить, какие демографические группы, скорее всего, ответят на предложения. Таким образом, мы не потеряем деньги, если будем рассылать предложения тем, кого это не касается.
  • Второй — определить, какие предложения эффективны для определенной демографической группы человека.

Эти два соответствуют отдельным моделям, и мы разделяем их для гибкости. Вот несколько сценариев.

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

Часть 1: Кому раздавать предложения

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

Очистка данных

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

Шаги

  1. Загрузите сводную стенограмму (transcript_group.csv). Обратитесь к разделу «Обогащение наших данных» выше для получения подробной информации о разработанных функциях.
  2. Удалить анонимного клиента без указания возраста, дохода и пола (transcript_group.age.isna()). Именно на эту информацию мы будем опираться при обучении модели.
  3. Удалите также тех, кто не получил предложение (transcript_group.received == False). У них не было никакого взаимодействия с предложениями, поэтому мы никогда не узнаем, как они отреагировали на предложение.
  4. Мы собираемся упростить gender до 1 для мужчин и 0 для женщин. Тем не менее, около 200 человек имеют другой пол. Мы собираемся использовать Многомерное вменение по цепочке уравнений для вменения этих полов. Этот метод пытается найти лучший прогноз из других столбцов, чтобы заполнить отсутствующее значение.
  5. Удалите выбросы в доходе, используя правило Тьюки.
  6. Выберите поля purchased, gender, age, income, membership_year, membership_month, membership_day, generation и age_group.
  7. Обманите generation и age_group

Обучение модели

Мы собираемся использовать бинарную классификацию для этого, используя purchased в качестве переменной ответа. Для алгоритмов мы опробовали кучу, но чтобы ограничить их тремя лучшими, мы выбрали LogisticRegression, DecisionTreeClassifier и KNeighborsClassifier. Поскольку мы все еще пытаемся найти лучший алгоритм для использования, мы собираемся использовать их настройки параметров по умолчанию. В процессе кодирования проблем не возникло.

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

Показатели

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

Результаты

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

  • class_weight: [Нет, сбалансированный]
  • критерий: [джини, энтропия]
  • max_features: [авто, sqrt, log2, Нет]
  • разделитель: [лучший, случайный]

Средневзвешенный показатель f1 составляет 0,6100730914664464.

Краткое содержание

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

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

Часть 2: Какое предложение мы должны выдать?

Изучив текущие данные, которые у нас есть, на этот вопрос можно ответить, создав рекомендательную систему для заказчика. Однако мы делаем это, применяя предложения, которые эффективны для клиента, и используя эту информацию, мы сможем выполнить классификатор с несколькими выходами.

Очистка данных

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

Шаги

  1. Загрузите сводную стенограмму (transcript_group.csv). Обратитесь к разделу «Обогащение наших данных» выше для получения подробной информации о разработанных функциях.
  2. Удалить анонимного клиента без указания возраста, дохода и пола (transcript_group.age.isna()). Именно на эту информацию мы будем опираться при обучении модели.
  3. Удалить все транзакции, которые не получили никаких предложений (transcript_group.received == False)
  4. Удалить все неудачные предложения, нас интересуют только удачные (transcript_group.purchased == False)
  5. Упростите пол, используя 1 для мужчин и 0 для женщин. Снова используйте MICE для импутации «других» данных.
  6. Выровняйте данные, сгруппировав их по идентификатору человека и идентификатору волны в качестве ключей. Внесите удачные предложения в столбец массива (recommended_offers), а остальные получат следующие поля: gender, age, income, membership_year, membership_month, membership_day.
  7. Обманывать recommended_offers

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

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

После очистки мы собираемся даммифицировать все категориальные переменные и подготовиться к обучению модели.

Обучение модели

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

Для данных нам нужно, чтобы y были фиктивными рекомендуемыми предложениями, а X — функциями клиентов.

Показатели

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

Результаты

Опять же, DecisionTreeClassifier выиграл этот раунд. Я дополнительно настроил его, но получил лишь очень небольшое улучшение. Полученные наилучшие параметры (выделены жирным шрифтом):

  • class_weight: [Нет, сбалансированный]
  • критерий: [джини, энтропия]
  • max_features: [авто, sqrt, log2, Нет]
  • разделитель: [лучший, случайный]

Средневзвешенный показатель f1 составляет 0,2560590665020447.

Краткое содержание

Производительность во второй части по-прежнему низкая — 0,26, однако с очень ограниченными функциями, с которыми мы можем работать, это все, что я могу сделать. Я по-прежнему рекомендую использовать эту модель для проведения следующего эксперимента и сбора дополнительных данных, и, возможно, поведение будет точно настроено после того, как мы реализуем эту модель.

В этом раунде победил DecisionTreeClassifier, а затем ExtraTreeClassifier, которые оба являются древовидными алгоритмами. Автоматический выбор признаков на деревьях сделан более заметными, так как их различие с KNeighborsClassifier или более значительным.

Заключение

Ваш третий кофе уже наполовину готов. Мы многому научились в этом исследовании.

Отражение

Проект посвящен применению процесса обработки данных к данным, предоставленным Starbucks. Благодаря этому проекту я могу расширить свои знания даже за пределы того, что я узнал из программы Udacity Data Science Nano Degree. Я могу создать свой собственный рабочий процесс, который я буду называть своим.

Структура проекта

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

Предварительная обработка

С самого начала я столкнулся с проблемами, как работать с файлами json, так как я больше привык работать с файлами csv. Затем еще одна странность заключается в том, что все идентификаторы находятся в GUID. Мой опыт работы с SQL помогает мне понять, как заменить значения идентификаторов портфолио, профиля и стенограммы с GUID на целое число.

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

Имея не так много документации о данных, именно здесь я провел большую часть своего времени при выполнении проекта, разбираясь в данных, особенно в наборе данных расшифровки, в поисках шаблонов, которые мне нужно будет использовать, чтобы получить данные, которые я хочу. Также нет прямого сопоставления SQL для преобразования данных, я использовал все свои навыки в разработке программного обеспечения, чтобы создать собственный код только для преобразования данных. Я даже сделал это в стиле ООП (объектно-ориентированное программирование), чтобы уменьшить сложность.

Экспериментальное тестирование

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

Обучение моделей

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

Резюме результатов

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

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

И, наконец, формат этого блога чем-то близок к методологии CRISP-DM, но это подробно раздуто в пространстве моего проекта. Обязательно загляните здесь.

Улучшение

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

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

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

Ресурсы

https://digital.hbs.edu/platform-digit/submission/starbucks-mobile-app-a-winner-in-bridging-the-retail-digital-divide/

https://www.youtube.com/watch?v=XxK1PyaF1bw

https://disturbmenot.co/coffee-statistics/

https://www.markhw.com/blog/control-size

https://github.com/tirthajyoti/Stats-Maths-with-Python/blob/master/Intro_Hypothesis_Testing.ipynb

https://www.youtube.com/watch?v=6uw0A3aKwMc

https://github.com/netxph/sb-capstone