Анализ временного ряда Тыквенная пряность

Анализ временного ряда Тыква как пряность

Наденьте свой самый удобный lo-fi, возьмите большой свитер, вашу любимую горячую напиток и давайте в Python.

Фото от Nathan Dumlao на Unsplash

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

Гипотеза:

Популярность термина “Pumpkin Spice” в поиске Google в США будет иметь ярко выраженную сезонность, так как он связан с осенними американскими праздниками и сезонными блюдами.

Нулевая гипотеза:

Использование данных прошлой недели или прошлого года будет более предсказуемым для текущего уровня популярности поискового запроса “Pumpkin Spice”.

Данные:

Последние 5 лет данных от Google Trends, полученные 7 октября 2023 года. [1]

Итеративный метод моделирования:

  • Создание наивной модели, где данные прошлой недели/прошлого года являются прогнозом текущей недели. Важно, чтобы моя конечная модель превзошла использование исторических данных как прямого прогноза.
  • Разделение обучающего и тестового наборов данных, чтобы алгоритм мог учиться на одном и я мог проверить, насколько хорошо работает мой алгоритм.
  • Сезонное разложение для получения приблизительной идеи о предсказуемости данных путем разделения годового тренда, сезонных паттернов и шума. Меньший уровень шума означает, что больше данных можно учесть в алгоритме.
  • Серия статистических тестов для определения стационарности данных. Если данные не являются стационарными, мне потребуется провести первую разность (запустить функцию временного интервала, в которой данные каждого временного интервала показывают только разницу по сравнению с данными предыдущего временного интервала. Это приведет к стационарности данных.)
  • Создание моделей SARIMA, используя выводы из автокорреляционных графиков для термина скользящего среднего и выводы из графиков частичной автокорреляции для авторегрессионного термина. SARIMA – это стандартный выбор для моделирования временных рядов, и я буду пробовать ACF и PACF выводы, прежде чем применить грубую силу с Auto Arima.
  • Попытка использовать Auto Arima, который будет итерироваться через множество терминов и выбирать наилучшую комбинацию. Я хочу провести эксперимент, чтобы узнать, если параметры, которые он предоставляет для модели SARIMA, дают более эффективную модель.
  • Использование моделей ETS, используя выводы из сезонного разложения, чтобы определить, является ли x аддитивным или мультипликативным со временем. Модели ETS с большим вниманием уделяют сезонности и общему тренду, чем семейство моделей SARIMA, и могут дать мне преимущество при учете связи между временем и “Pumpkin Spice”.

Построение KPI-показателей производительности:

Визуальный анализ данных:

Изображение автора.

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

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

Импорты:

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

Изображение автора.

Вот библиотеки, которые я использовал для создания блокнота с кодом. Я выбрал statsmodels вместо scikit-learn из-за их пакетов для работы с временными рядами, мне статсмоделс нравится больше для большинства задач линейной регрессии.

Функциональный подход к коду:

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

Изображение автора.

Эти три небольшие функции работают вместе, поэтому мне достаточно запустить metrics_graph() с y_true и y_preds в качестве входных данных, и она покажет мне синюю линию с истинными данными и красную линию с предсказанными данными, а также MAPE и RMSE. Это позволит мне сэкономить время и избежать лишних хлопот.

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

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

Изображение автора.

Прогноз данных текущей недели на основе данных прошлой недели дал MAPE около 18 и RMSE около 11. В сравнении с данными прошлого года в качестве прямого прогноза на данные этого года, MAPE составило около 12, а RMSE около 7.

Изображение автора.

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

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

Изображение автора.

Ниже показано, как я использовал эту сезонную декомпозицию.

Изображение автора.

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

Изображение автора.

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

Но сейчас мне понадобилась функция для запуска моделей SARIMA, только вводя порядок. Я хотел экспериментировать, запуская c, t и ct версии модели SARIMA с этими порядками, так как сезонная декомпозиция предпочла мультипликативный тип модели перед аддитивным типом модели. Используя c, t и ct в параметре trend =, я смог добавить множители к моей модели SARIMA.

Изображение автора.

Я пропущу описание той части, где я смотрел графики AFC и PACF, и той части, где я также попытался использовать PMD auto arima, чтобы найти лучшие термины для использования в моделях SARIMA. Если вам интересны эти подробности, ознакомьтесь с моим полным кодовым блокнотом.

Моя лучшая модель SARIMA:

Изображение автора.

Итак, моя лучшая модель SARIMA имела более высокий показатель MAPE, чем моя наивная модель, почти 29 почти 12, но более низкий RMSE на единицу, почти 7 почти 6. Моя самая большая проблема при использовании этой модели заключается в том, что она действительно недооценивает пик в 2023 году, между красными и синими линиями в августе – сентябре 2023 года есть довольно большая площадь. Есть причины полюбить его больше, чем моя ежегодная наивная модель, или хуже, чем моя ежегодная наивная модель, в зависимости от вашего мнения о RMSE против MAPE. Однако я еще не закончил. Моя конечная модель была определенно лучше, чем моя ежегодная наивная модель.

Конечная модель:

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

Изображение автора.

Теперь вы можете подумать: “но эта модель имеет более высокий показатель MAPE, чем ежегодная наивная модель”. И вы будете правы, примерно на 0,3%. Однако, я считаю, что это более чем справедливая сделка, учитывая то, что теперь у меня есть RMSE около 4 с лишним, а не 7. Хотя эта модель немного хуже справляется с декабрем 2022 года, чем моя лучшая модель SARIMA, она сильно ошибается на меньшую площадь для того же пика, чем больший пик для осени 2023 года, на чем мне больше зависит. Вы можете найти эту модель здесь.

Дополнительная валидация:

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

Заключение:

Подводя итог, я смог опровергнуть нулевую гипотезу, моя конечная модель превзошла наивную ежегодную модель. Я доказал, что популярность тыквенных специй в Google очень сезонна и может быть предсказана. Среди наивной модели, моделей SARMA и моделей ETS, модель ETS лучше воспринимает связь между временем и популярностью тыквенных специй. Мультипликативная связь тыквенных специй со временем подразумевает, что популярность тыквенных специй основана не только на одной независимой переменной, помимо времени, в выражении время * неизвестная_независимая_переменная = популярность_тыквенных_специй.

Что я узнал и будущая работа:

Мой следующий шаг – использовать какую-либо версию графического API Meta для поиска использования “тыквенных специй” в бизнес-статьях. Интересно, насколько коррелированными будут эти данные с моими данными из Google Trends. Я также узнал, что когда сезонная декомпозиция указывает на мультипликативную модель, я буду сразу обращаться к модели ETS в моем процессе.

Кроме того, меня интересует автоматизация большей части этого процесса. В идеале, я бы хотел создать модуль Python, в котором ввод представляет собой CSV прямо из Google Trends, а на выходе будет получена используемая модель с достаточно хорошей документацией, чтобы непрофессиональный пользователь мог создавать и тестировать свои собственные прогностические модели. В случае, если пользователь выберет данные, которые сложно предсказать (например, наивная модель или модель случайного блуждания подойдут лучше), я надеюсь построить модуль, чтобы объяснить это пользователям. Затем я смог бы собирать данные с приложения, использующего этот модуль, для демонстрации сезонности на основе большого количества непроверенных данных.

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

[1] Google Trends, N/A (https://www.google.com/trends)