Ученый по данным Udacity, наноградус

Разошлите предложение Starbucks, перед которым невозможно устоять

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

Это Starbucks Capstone Challenge для специалиста по данным Nanograde в Udacity. Мы получаем набор данных из программы, которая создает данные, моделирующие, как люди принимают решения о покупке и как на эти решения влияют рекламные предложения. Мы хотим сделать рекомендательный механизм, который рекомендует Starbucks, какие предложения следует отправить конкретному клиенту.

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

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

Нас интересуют ответы на следующие два вопроса:

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

Описание набора данных

Данные содержатся в трех файлах:

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

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

portfolio.json

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

profile.json

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

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

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

Очистка и исследование данных

Для porto.json я выполнил однократное кодирование категориальных столбцов: Channels и offer_type. Затем я умножил 24 на столбец продолжительности (измеряется в днях), потому что время записи в файле Transcription.json записывается как часы.

Для profile.json сначала я изменил все возрасты со значением 118 на NaN, потому что отсутствующее значение в age закодировано как 118. Затем я удалил все строки с отсутствующими значениями. Наконец, я подсчитал количество дней, в течение которых пользователь был нашим участником, с даты, когда пользователь стал нашим участником.

Давайте изучим распределение возраста клиентов, дней участников и их доходов.

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

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

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

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

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

Алгоритм

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

Метрики

Хорошо оценивать нашу модель, используя среднеквадратичную ошибку, и отслеживать итерации FunkSVD. Алгоритм следующий: для каждой пары пользователь-предложение, если мы отправили предложение, то вычисляем ошибку как фактическую минус скалярное произведение пользователя и предложения скрытых функций, а затем суммируем все квадратные ошибки для матрицы. Для настройки параметров мы выбираем количество скрытых функций 5, 10 и 15, чтобы проверить, какой из них является лучшим. Для 15 скрытых функций у нас есть MSE 0,003823; Для 10 скрытых функций у нас есть MSE 0,006241; Для 5 скрытых функций у нас есть MSE 0,022370. 15 скрытых функций обеспечивают самый низкий MSE.

Оценка

После того, как мы разложим матрицу пользовательского предложения на матрицу пользователя и матрицу предложения, мы протестируем ее с помощью нашего тестового набора. Для тестирования мы обнаружили интересное явление: модель, построенная с 15 скрытыми функциями, показала наихудшую производительность MSE 0,3303. Тот, который построен с 10 скрытыми функциями, дает лучший результат в предсказании MSE 0,009175, в то время как тот, который построен с 5 скрытыми функциями, имел аналогичную производительность до MSE 0,02391. Этот интересный результат может быть результатом переобучения. Кроме того, это может быть связано с разделением записей, поскольку предложение отправляется часто и через несколько дней. Мы столкнемся с некоторыми случаями, когда пользователь получил предложение и просмотрел предложение в обучающем наборе, но завершил предложение в тестовом наборе. В этом случае мы не учитывали, что пользователь выполнил предложение. Исходя из вышеизложенного, мы не можем быть уверены, сколько функций использовать, потому что просто наличие лучшего способа прогнозирования значения матрицы точно не дает нам указания на то, можем ли мы дать хорошие рекомендации.

Система рекомендаций

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

Мы можем использовать эту модель для прогнозирования реакции пользователя при получении предложений. Например, мы прогнозируем, что для этого пользователя он положительно отреагирует на «Купи 7 долларов и получи 3 скидки в течение 7 дней» и «BOGO на 5 долларов через 5 дней». Хотя значение последнего выше, чем первого, мы предлагаем этому пользователю «BOGO с 5 долларами за 5 дней».

Мужчина или женщина лучше реагируют на BOGO или скидку?

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

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

Какой тип предложения должен сделать Starbucks, чтобы увеличить доход?

Мы суммируем все расходы ответивших клиентов на основе предложения. «Купите 10 долларов и получите скидку 2 доллара в течение 10 дней!» получает наибольшую продажу.

Вы можете увидеть детали из диаграммы ниже.

Улучшение

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

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

Вывод

Мы исследовали базовое распределение профиля клиента. На основе записей расшифровки мы строим матрицу пользовательских элементов, которая показывает, как пользователи реагировали на полученные ими предложения. Затем мы разделили записи на обучающий набор и тестовый набор и обучили наш алгоритм SVD предсказывать реакцию пользователя на конкретное предложение. Мы достигли наименьшей среднеквадратичной ошибки около 0,003823 с 15 скрытыми функциями в обучающем наборе и около 0,009175 с 10 скрытыми функциями в тестовом наборе. После этого мы создали механизм рекомендаций, который рекомендует Starbucks, какие предложения следует отправить конкретному пользователю.

Женщины реагируют гораздо лучше, чем мужчины

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

Продвижение через соцсети — лучшее решение

Среди десяти предложений отправка предложения «Купи 10 долларов и получи скидку 2 доллара в течение 10 дней» по электронной почте, через Интернет, на мобильных устройствах и в социальных сетях приносит Starbucks больше прибыли. Пока это лучшее предложение!

Купи 10 долларов и получи скидку 2 доллара в течение 10 дней!

Чтобы узнать больше об этом анализе, см. ссылку на мой Github, доступную здесь.