Комплексный исследовательский анализ временных рядов

Всесторонний анализ временных рядов исследование исследователей

Глубокий погружение в данные об качестве воздуха

Фото Джейсона Блэкаи с Unsplash

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

Содержание

Цель этой статьи

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

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

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

Исследуемые данные поступают из четырех станций мониторинга в городе Ванкувер, Британская Колумбия, Канада. Они содержат средние значения по часам тонких частиц PM 2.5 (частиц с диаметрами 2,5 микрона и меньше) в µg/m3 (микрограммах на кубический метр) с 1 января 2016 года по 3 июля 2022 года.

Частицы PM 2,5 в основном образуются при сжигании ископаемого топлива, и в городах они обычно происходят от автомобильного движения и строительных площадок. Другим крупным источником загрязнителя являются лесные и травяные пожары, которые легко распространяются ветром [1].

На изображении ниже показаны примерные местоположения станций, которые мы исследуем.

Рисунок 1. Карта Ванкувера с станциями контроля воздуха. Автор настроил карту, созданную в Google Maps.

Набор данных взят из Каталога данных Британской Колумбии, и, как заявлено издателем, он не прошел проверку качества [5]. В версии, которую вы увидите здесь, я предварительно обработал некоторые незначительные проблемы, такие как присвоение отрицательных измерений (только 6 из 57 тысяч наблюдений) пропущенным значениям и создание основного DataFrame со станциями нашего выбора.

Библиотеки и зависимости

Для наших визуализаций мы будем использовать Python 3.9 и библиотеки построения графиков Matplotlib и Seaborn. Для статистических тестов и исследования данных мы будем работать с модулем statsmodels и библиотекой SciPy . Все операции по манипулированию данными и вспомогательным задачам будут выполняться с использованием Pandas и Numpy.

Эти пакеты доступны в популярных дистрибутивах Python и хостинге блокнотов, таких как Anaconda и Miniconda, Google Collab или Kaggle Notebooks. Так что каждый пример кода здесь должен быть легко воспроизводим в вашей выбранной среде.

Начало работы

Начнем с импорта наших библиотек. Мы вызовем matplotlib.dates.mdates и модуль datetime , чтобы нам было проще работать с нашим индексом DateTime. Чтобы создавать согласованные визуализации, я также привык начинать с определения стилей графиков и цветовых палитр. Итак, давайте начнем.

Рисунок 2. Цветовая палитра Seaborn "mako". Изображение автора.

После чтения файла .csv мы определим временную метку DATE_PS как объект datetime64 в NumPy и установим его как индекс DataFrame. Этот общий шаг позволит использовать некоторые возможности временных рядов Pandas, например, для создания функций с учетом даты в нашем наборе данных.

Рисунок 3. Срез основного DataFrame с функциями даты. Изображение автора.

Общая картина

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

Для этой визуализации мы будем использовать связанные графики Seaborn, которые будут читать из агрегированной длинной версии нашего DataFrame. Для этого мы будем использовать методы Pandas melt и resample с агрегацией в среднее за интервалы в 24 часа. Это позволит уменьшить гранулярность данных с часовой на суточные средние измерения и сократит время, необходимое для создания графика.

Рисунок 4. График временных рядов PM 2.5 для станций мониторинга. Изображение автора.

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

  • Есть некоторые серьезные аномалии, и они, кажется, преобладают летом и осенью.
  • Эти аномалии, по видимому, возникают из-за крупномасштабных событий, так как они влияют на все четыре станции примерно в одинаковые промежутки времени.
  • Если вы посмотрите внимательно, я включил нерезкую серую диаграмму рассеяния всех станций внутри каждой диаграммы. С помощью этой тонкой детали можно увидеть, что аномалия, например, в 2017 году, имела серьезное влияние на обе станции Северного Ванкувера (они достигли более высоких значений PM 2.5), в то время как обратное справедливо для события 2018 года. Эта техника также гарантирует, что все четыре линейные графики находятся в пределах одного диапазона Y-оси.

Некоторые полезные практики, которые вы можете извлечь из этого первого графика:

  • Matplotlib позволяет очень гибко настраивать расположение и форматирование осей. В этом примере я использовал MonthLocator из модуля mdates для создания вспомогательных незначительных локаторов по месяцам на оси X, что помогает общей читаемости.
  • Точные ожидаемые даты из нашего графика передаются в заголовок или подзаголовок графика. “Ожидаемые”, потому что наша визуализация может быть усечена из-за отсутствия значений на обоих концах отображаемого периода, и эта практика поможет идентифицировать эти проблемы. Также это хорошая практика документирования ваших результатов.

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

Подробный обзор

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

Эта первая функция поможет нам рассмотреть отдельные временные ряды в определенный период времени. Мы начнем с рассмотрения года 2017 года для станции Северного Ванкувера – Мэхон Парк.

Рисунок 5. График PM 2.5 Мэхон Парк в Северном Ванкувере для 2017 года. Изображение автора.

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

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

Рисунок 6. График PM 2.5 Мэхон Парк в Северном Ванкувере с 15 апреля по 1 июля 2017 года. Изображение автора.

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

Еще одна деталь, которую вы могли заметить, – это пользовательский формат даты на оси X. Для вышеуказанного графика я улучшил нашу функцию plot_sequence() с пользовательскими основными и вспомогательными локаторами и форматировщиками. Эта новая функциональность теперь адаптирует наш график к временному промежутку визуализации и соответствующим образом форматирует ось X. Ниже приведен фрагмент кода, который был включен в функцию.

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

Пропущенные значения

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

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

Рисунок 7. Тепловая карта пропущенных значений. Изображение автора.

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

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

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

  • Методы Pandas ffill() и bfill(). Они используются для передачи, соответственно, ближайшего доступного значения вперед или назад.
  • Линейная или сплайновая интерполяция с помощью метода Pandas interpolate(). Он использует соседние наблюдения для построения кривой и заполнения пропущенного интервала.

Прерывистость

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

Рисунок 8. Сводные статистики. Изображение автора.

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

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

Рисунок 9. Количество нулевых значений. Изображение автора.

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

Сезонность

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

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

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

Рис. 10. Почасовые значения PM 2.5. Изображение автора.

Этот первый график показывает почасовые измерения. Здесь мы можем видеть:

  • Постоянно более высокие значения PM 2.5 с 9 утра до 2 дня.
  • Станции за пределами Северной Ванкувера также показывают пик с 8 вечера до 10 вечера.
  • Ранним утром наблюдаются наименьшие значения PM 2.5 с 2 часов ночи до 5 часов утра.

Теперь рассмотрим недельную сезонность и разницу в значениях в течение недели.

Рис. 11. Ежедневные значения PM 2.5. Изображение автора.

Из этого мы видим:

  • Более низкие значения PM 2.5 в выходные дни.
  • Небольшая тенденция к повышению уровня загрязнения по вторникам.

И, наконец, посмотрим на месяц к месяцу тенденцию.

Рис. 12. Месячные значения PM 2.5. Изображение автора.

Где мы можем наблюдать:

  • Постоянно более высокие значения PM 2.5 в августе для всех лет.
  • У южных станций более низкие значения PM 2.5 в июне и июле, тогда как станции Северной Ванкувера показывают более низкие показатели в январе.

Наконец, еще несколько полезных рекомендаций из этих графиков:

  • Не используйте наивно вашу цветовую палитру, так как они могут ввести в заблуждение вас при интерпретациях. Если бы мы просто передали pallette="mako" в наши “ящики с усами” (boxplots), она была бы сопоставлена с нашей осью Х, а не с нашей переменной интереса.
  • Сетчатые графики являются мощными контейнерами информации для низкомерных данных, и их можно быстро настроить с помощью функций relplot() в Seaborn или subplots() в Matplotlib.
  • Вы можете использовать параметр order в функции boxplot() в Seaborn для упорядочивания вашей оси Х в соответствии с вашими потребностями. Я использовал его для упорядочивания меток дней недели в осмысленном порядке.

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

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

Коэффициент Пирсона

Программисты R могут знакомы с следующим графиком. Коррелограмма – это лаконичная и очень информативная визуализация, которая реализована в нескольких библиотеках R, таких как ggpairs() в пакете GGally. Верхняя диагональ коррелограммы показывает нам двумерные корреляции или коэффициенты корреляции Пирсона между числовыми переменными наших данных. В нижней диагонали мы видим точечные диаграммы с регрессионными кривыми, подогнанными к нашим данным. Наконец, в главной диагонали у нас есть гистограммы и кривая плотности для каждой переменной.

Следующий код представляет адаптированную реализацию с использованием графика Seaborn PairGrid()и еще одной функции для нашего аналитического инструментария.

Рисунок 13. Коррелограмма PM 2.5 по всем четырем станциям. Изображение автора.

Как и ожидалось, наши станции сильно коррелируют, особенно те, которые находятся ближе друг к другу, например, оба в Норт-Ванкувере.

Важно отметить, что для уменьшения вычислительного времени наши данные были агрегированы по 6-часовым периодам. Если вы экспериментируете с этим графиком с большими периодами агрегации, вы увидите увеличение коэффициентов корреляции, так как усреднение по среднему tend to сглаживает выбросы, присутствующие в данных.

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

Стационарность

Стационарный временной ряд – это такой, у которого статистические свойства не меняются со временем. Другими словами, он имеет постоянное среднее значение, дисперсию и автокорреляцию, независимую от времени [4].

Несколько моделей прогнозирования опираются на стационарность временных рядов, поэтому важно проверить это на этапе исследования. Наша следующая функция будет использовать реализацию библиотеки statsmodels, в которой используются два часто используемых теста на стационарность: расширенный тест Дики-Фуллера (“ADF”) и тест Квиатковского-Филлипса-Шмидта-Шина (“KPSS”).

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

Тест Дики-Фуллера (ADF): гипотеза:

H0: В выборке временного ряда присутствует единичный корень (Нестационарный)

Ha: В выборке временного ряда отсутствует единичный корень (Стационарный)

Тест Квиатковского-Филлипса-Шмидта-Шина (KPSS): гипотеза:

H0: Данные стационарны вокруг постоянного значения (Стационарный)

Ha: В выборке временного ряда присутствует единичный корень (Нестационарный)

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

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

Вы можете помнить из раздела о пропущенных значениях, что мы можем использовать методы Pandas ffill(), bfill() и interpolate() для быстрого заполнения прерываний в ряде. Вы можете видеть, что я определил отдельный аргумент fillna для нашей функции, чтобы выбрать один из этих методов для быстрого устранения пропущенных значений, так как оба теста принимают только полные выборки.

Теперь вернемся к нашим результатам.

Рисунок 14. Результаты теста на стационарность ADF и KPSS для января 2016 года. Изображение автора.
Рисунок 15. Результаты стационарного теста ADF и KPSS для января 2022 года. Изображение автора.

Мы видим, что для 2016 года оба теста указывали на нестационарность, но для 2022 года результаты расходятся. Документация statsmodels ясно перечисляет интерпретации результатов, когда тесты ADF и KPSS выполняются вместе [6]:

Случай 1: Оба теста указывают на то, что ряд нестационарен — Ряд нестационарен

• Случай 2: Оба теста указывают на то, что ряд стационарен — Ряд стационарен

• Случай 3: KPSS указывает на стационарность, а ADF указывает на нестационарность — Ряд является стационарным с трендом. Требуется удалить тренд, чтобы ряд стал строго стационарным. Детрендированный ряд проверяется на стационарность.

• Случай 4: KPSS указывает на нестационарность, а ADF указывает на стационарность — Ряд является разностным стационарным. Применяется дифференцирование, чтобы сделать ряд стационарным. Проверяется стационарность обрабатываемого ряда.

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

Дифференцирование первого порядка

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

Рисунок 16. График PM 2.5 Vancouver International Airport для января 2016 года. Изображение автора.

Мы видим, что дисперсия в этот период значительно меняется с начала месяца до конца. Среднее значение PM 2.5 также изменяется от более высокого к более низкому, более стабильному значению. Это некоторые из характеристик, которые подтверждают нестационарность ряда.

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

Рисунок 17. График дифференцированного значения PM 2.5 Vancouver International Airport для января 2016 года. Изображение автора.

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

Рисунок 18. Результаты стационарного теста ADF и KPSS для дифференцированных данных. Изображение автора.

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

  • Мы имеем дело с нестационарными временными рядами.
  • Первопорядочное дифференцирование является подходящей техникой преобразования, чтобы сделать их стационарными.

И это, в конечном итоге, приводит нас к нашей последней секции.

Автокорреляция

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

Функция автокорреляции (ACF) измеряет линейную зависимость между отстающими значениями временного ряда. Другими словами, она измеряет корреляцию временного ряда с самим собой. [2]

Функция частичной автокорреляции (PACF) измеряет корреляцию между отстающими значениями временного ряда, когда мы удаляем влияние коррелированных отстающих значений между ними. Они известны как конфаундинговые переменные. [3]

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

Поскольку этот статья сосредоточена на исследовательском анализе и эти концепции являются фундаментальными для статистических моделей прогнозирования, я представлю краткое объяснение, но имейте в виду, что это очень важные идеи, на которых можно построить прочное интуитивное понимание работы с временными рядами. Для подробного изучения я рекомендую прочитать отличное ядро «Time Series: Interpreting ACF and PACF» от Кагловского Мастера-консультанта Леони Монигатти.

Как указано выше, автокорреляция показывает, как временные ряды коррелируют с самими собой на предыдущих q лагах. Можно считать это измерением линейной зависимости подмножества ваших данных с копией самих себя, сдвинутой назад на q периодов. Автокорреляция, или ACF, является важным показателем для определения порядка q в моделях скользящего среднего (MA).

С другой стороны, частичная автокорреляция – это корреляция временного ряда с его отстающей версией p, но только в отношении его прямых эффектов. Например, если я хочу проверить частичную автокорреляцию периода времени t-3 до t-1 с моим текущим значением t0, мне не будет важно, как t-3 влияет на t-2 и t-1 или как t-2 влияет на t-1. Я буду сосредоточен только на прямых эффектах t-3, t-2 и t-1 на мой текущий временной момент t0. Частичная автокорреляция, или PACF, является важным показателем для определения порядка p в моделях авторегрессии (AR).

Очистив эти понятия, мы теперь можем вернуться к нашим данным. Поскольку оба показателя часто анализируются вместе, наша последняя функция объединит графики PACF и ACF в общий график, который покажет коррелограммы для нескольких переменных. Она будет использовать функции plot_pacf() и plot_acf() из пакета statsmodels, а также привязывать их к сетке Matplotlib с помощью функции subplots().

Обратите внимание, что обе функции statsmodels используют одни и те же аргументы, за исключением параметра method, который отличается только в графике plot_pacf().

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

Рисунок 19. PACF и ACF коррелограммы для января 2016 года. Рисунок от автора.

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

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

  • Лаги 1, 2, 3 (t-6h, t-12h и t-18h), а также иногда 4 (t-24h) имеют значительные PACF.
  • Лаги 1 и 4 (t-6h и t-24h) показывают значительные ACF в большинстве случаев.

Также обратите внимание на несколько конечных правил практики:

  • Отрисовка коррелограмм для больших временных рядов с высокой грануляцией (например, построение коррелограммы на весь год для набора данных с часовыми измерениями) должна быть избегнута, так как порог значимости сужается до нуля с увеличением размера выборки.
  • Я определил параметр x_label в нашей функции, чтобы легко размечать ось X с указанием периода времени, представленного каждым лагом. Часто можно встретить коррелограммы без такой информации, но наличие легкого доступа к ней может избежать неправильной интерпретации результатов.
  • По умолчанию значения функций plot_acf() и plot_pacf() в Statsmodels включают коэффициент корреляции с лагом 0 в графике. Поскольку корреляция числа с самим собой всегда равна единице, я установил наши графики таким образом, чтобы они начинались с первого лага с помощью параметра zero=False. Это также улучшает масштаб оси Y и делает более читаемыми лаги, которые нам фактически необходимо анализировать.

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

Понравилась эта история?

Вы можете следить за мной здесь, на VoAGI, чтобы читать больше статей о науке о данных, машинном обучении, визуализации и анализе данных.

Вы также можете найти меня на LinkedIn, где я делюсь более краткими версиями этих материалов.

Ссылки

[1] “Отдел здоровья – Вопросы и ответы о мелких частицах (PM 2.5)”. Дата обращения: 14 октября 2022 г. https://www.health.ny.gov/environmental/indoors/air/pmq_a.htm.

[2] Пейксейро, Марко. “3. Идем на случайную прогулку”. Очерк. В Прогнозирование временных рядов в Python, 30–58. O’Reilly Media, 2022.

[3] Пейксейро, Марко. “5. Моделирование авторегрессионного процесса”. Очерк. В Прогнозирование временных рядов в Python, 81–100. O’Reilly Media, 2022.

[4] Пейксейро, Марко. “8. Учет сезонности”. Очерк. В Прогнозирование временных рядов в Python, 156–79. O’Reilly Media, 2022.

[5] Службы, Министерство гражданского населения. “Каталог данных по Британской Колумбии”. Провинция Британская Колумбия. Провинция Британская Колумбия, 2 февраля 2022 г. https://www2.gov.bc.ca/gov/content/data/bc-data-catalogue.

[6] “Стационарность и детрендирование (ADF/KPSS)”. statsmodels. Дата обращения: 17 октября 2022 г. https://www.statsmodels.org/dev/examples/notebooks/generated/stationarity_detrending_adf_kpss.html.