В этой статье мы узнаем, как построить простую модель временных рядов на Python для прогнозирования количества новых подписчиков на новостную рассылку в Mailchimp. Затем мы покажем, как этот процесс можно значительно упростить с помощью Magicsheets.

  • ПРИМЕЧАНИЕ 1: Вы можете напрямую внедрить код в этот блокнот самостоятельно: просто перейдите по ссылке ниже

  • ПРИМЕЧАНИЕ 2. Эту записную книжку можно использовать непосредственно с вашим собственным набором данных Mailchimp. Просто сохраните его на своем ноутбуке вместе с собственным набором данных под названием data.csv и снова запустите код.

Мотивация

Независимо от того,

  • бизнес на основе подписки,
  • управлять Slack каналом,
  • управлять информационным бюллетенем о стартапах,
  • и т. д….

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

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

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

Один из способов сделать это — использовать модель временных рядов.

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

Давайте рассмотрим пример, чтобы понять, что это значит.

Проблема прогнозирования подписчиков Mailchimp

Мы постараемся ответить на вопрос:

Сколько новых подписчиков на информационный бюллетень я могу получить на следующей неделе?

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

Набор данных

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

Экспортируйте набор данных Mailchimp и сохраните его в той же папке, что и этот блокнот Jupyter. Кроме того, вы можете сохранить его в облаке, используя, например. Гитхаб или Google Диск. В этом уроке мы используем фальшивый (сгенерированный случайным образом) набор данных подписчиков новостной рассылки Mailchimp Magicsheets.io.

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

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

Mailchimp предоставляет нам массу полезной информации, такой как IP-адрес подписчика, местоположение IP-адреса, часовой пояс подписчика и т. д.

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

Таким образом, ключевым столбцом для нас является столбец «CONFIRM_TIME», который сообщает нам, когда подписчик стал подписчиком.

После того, как мы изолировали нужный набор данных «times», мы хотим сгруппировать номера подписки по дате.

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

Это показывает вам общее количество новых подписчиков каждый день.

CONFIRM_TIME  count
0    2021-07-26     46
1    2021-07-27     59
2    2021-07-28     50
3    2021-07-29     57
4    2021-07-30     62
..          ...    ...
87   2021-10-21     55
88   2021-10-22     56
89   2021-10-23     44
90   2021-10-24     56
91   2021-10-25     65

Визуализация набора данных

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

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

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

Разделение набора данных

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

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

Сюда,

  • модель сначала обучается на *большинстве* информации, например, 70% набора данных.
  • Затем вы спрашиваете модель: что вы предсказываете для оставшихся 30% набора данных?
  • этот прогноз вы теперь можете сравнить с реальными данными, которые вы скрывали от модели при обучении.

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

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

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

Теперь мы строим модель временного ряда. Его также можно загрузить непосредственно из библиотеки sktime.

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

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

Мы обучаем нашу модель, используя набор данных временных рядов, напрямую применяя функцию *fit* и передавая в модель столбец *count* переменной times_day_count.

Тестирование модели

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

Это будут оставшиеся дни, соответствующие точкам данных в data_set.

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

Оценка того, насколько хороша модель

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

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

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

mean of the actual data:  54.47826086956522
prediction value:  69    54.304351
70    54.304351
71    54.304351
72    54.304351
73    54.304351
74    54.304351
75    54.304351
76    54.304351
77    54.304351
78    54.304351
79    54.304351
80    54.304351
81    54.304351
82    54.304351
83    54.304351
84    54.304351
85    54.304351
86    54.304351
87    54.304351
88    54.304351
89    54.304351
90    54.304351
91    54.304351
dtype: float64

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

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

Подробнее о MSE можно прочитать здесь.

51.323250355315075

Улучшение прогностической модели

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

Вы можете думать о модели как об *общей структуре*, а гиперпараметры - как о определяющей фактической форме модели. Например, «модель параболы» — это любая функция в форме y=ax²+bx+c. Различные значения гиперпараметров a, b, c дадут вам разные формы параболического семейства.

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

Обучение вашей модели периодичности

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

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

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

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

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

Мы также можем сравнить MSE (значение ошибки) для model_2 и предыдущего model, который вообще не учитывал периодичность:

the new model's error is =  47.13314112736905
the new model's error is a  8.164154060659747 % improvement over the old model

Добавление периодичности уже улучшает предсказательную силу модели!

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

(Для сравнения, при использовании Magicsheets этот процесс был бы на 100% автоматизирован.)

Прогнозирование новых номеров подписчиков Mailchimp

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

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

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

day   prediction
69    51.888901
70    53.800013
71    57.400023
72    53.500012
73    55.100009
74    56.100020
75    52.100006

Поскольку мы имеем дело с целыми (не дробными) вещами (количество новых подписчиков), эти числа следует округлить до ближайшего целого числа, чтобы 1,96≈2,0, 1,01≈1,0 и т. д.

print(np.floor(predictions))
day   prediction
69    51.0
70    53.0
71    57.0
72    53.0
73    55.0
74    56.0
75    52.0

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

Автоматизация прогнозов подписчиков с помощью Magicsheets

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

  1. Войдите в свой Mailchimp, найдите регистрационные данные Audience и загрузите набор данных на свой компьютер.
  2. Загрузите набор данных в Python с помощью Pandas.
  3. Определите и выберите соответствующие столбцы данных.
  4. Постройте модель временных рядов (в нашем случае это модель экспоненциального сглаживания).
  5. Обучите модель на тренировочном наборе.
  6. Протестируйте модель на тестовом наборе.
  7. Рассчитайте MSE, постройте прогнозы и настройте гиперпараметры.
  8. Повторяйте 4→7, пока вы не будете довольны MSE вашей модели.
  9. Делайте прогнозы
  10. На следующий день (или неделю, или месяц): полоскать, мыть, повторять!

Это выглядит — и на самом деле — пугающе.

Вот почему мы создали Magicsheets, которые упрощают этот процесс всего до двух шагов:

  1. Войдите в свой Mailchimp и выберите аудиторию для прогнозов
  2. Переобучайте модель и создавайте новые прогнозы в любое время в выделенном канале Slack, введя простую команду «/run-magicpipe».

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

Вы можете посмотреть короткую демонстрацию того, как работает Magicsheet здесь.

Я хочу это! Как мне это получить?

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