В области науки о данных Time Series (TS) считается одним из малоизвестных навыков (я сам понятия не имел, что это было пару дней назад).
Чтобы изучить основы решения задач временных рядов, я отправился в путешествие, и здесь я делюсь своим опытом. Любой будущий проект, за который вы возьметесь, обязательно выиграет от этих советов!
Временные ряды: что делает их такими особенными?
Точки данных собираются с постоянными интервалами в TS, как следует из названия. Из этих данных определяется долгосрочная тенденция, чтобы можно было сделать прогноз на будущее или выполнить другие формы анализа. Чем TS отличается, скажем, от обычной задачи регрессии? Необходимо упомянуть две вещи:
- зависит от времени. В результате предположение о том, что наблюдения независимы, не выполняется в случае линейной регрессии.
- Помимо тенденций увеличения или уменьшения, большинство TS также демонстрируют тенденции сезонности, т. е. вариации, характерные для определенного периода времени. Например, продажи шерстяных курток, как правило, выше в зимние сезоны, если вы посмотрите на продажи с течением времени.
Анализ TS включает в себя различные этапы из-за присущих ему свойств. Ниже мы обсудим каждый из них более подробно. Вот скрипт Python, который загружает объект TS. Будут использованы данные AirPassengers.
В этом примере я сосредоточусь на охвате широкого круга тем, а не на очень точном прогнозе.
2. Временные ряды Pandas по загрузке и обработке
Мы можем выполнять некоторые очень быстрые операции с объектами TS с помощью класса Pandas datatime64[ns], который хранит информацию о времени. Для начала нам нужно запустить следующие библиотеки:
Рассмотрим подробнее каждый аргумент:
- В этом столбце содержится информация о дате и времени, проанализированная с помощью parse_dates. «Месяц» — это название столбца.
- Для данных TS index_col должен быть переменной, отображающей информацию о дате и времени, так как это ключ к использованию Pandas. Столбец «Месяц» используется в качестве индекса этим аргументом.
- Data_parser: указывает функцию для преобразования входных строк в переменные даты и времени. Данные считываются Pandas в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС по умолчанию. Формат должен быть определен вручную, если данные не в этом формате. Это можно сделать с помощью функции, аналогичной dataparse.
Теперь мы видим, что данные имеют объект времени в качестве индекса и столбец с именем #Пассажиры. С помощью следующей команды мы можем проверить тип данных индекса:
Объекты DateTime имеют dtype=’datetime[ns]’, что подтверждает, что они являются объектами DateTime. Я бы преобразовал столбец в объект Series, чтобы не ссылаться на имена столбцов каждый раз, когда я использую TS. Dataframes также приемлемы, если вы предпочитаете.
Прежде чем идти дальше, я хотел бы обсудить некоторые методы индексации данных TS. Используя объект Series, давайте выберем конкретное значение. Можно использовать следующие два метода:
Как также видно из предыдущего вывода, оба вернут значение «112». Рассмотрим все данные до мая 1949 года. Сделать это можно двумя способами:
В результате обоих будет получено следующее:
В этом случае необходимо отметить две вещи:
- Этот индекс включает конечный индекс, в отличие от числового индекса. Если список проиндексирован как [:5], то будут возвращены значения с индексами [0,1,2,3,4]. Однако здесь в выводе был указан индекс «1949–05–01».
- Чтобы диапазоны работали, индексы должны быть отсортированы. Это не сработает, если индекс перемешивается случайным образом.
Если вам нужны все значения 1949 года, рассмотрите другой пример. Вы можете сделать это следующим образом:
Пропущена часть месяца. Точно так же, если вы опускаете часть дня определенного месяца, вы можете опустить и часть месяца.
Следующим шагом является анализ ТС.
3. Как лучше всего определить, является ли временной ряд стационарным?
Если среднее значение и дисперсия TS остаются постоянными во времени, говорят, что она стационарна. Каково значение этого? Большинство моделей ТС предполагают, что ТС является стационарным. TS имеют очень высокую вероятность следовать тому же поведению в будущем, если они будут демонстрировать определенный шаблон с течением времени. По сравнению с нестационарными рядами теории стационарных рядов более зрелые и простые в реализации.
очень строгий критерий используется для определения стационарности. Статистические свойства ряда остаются стабильными во времени, что делает его стационарным для практических целей. Предоставляются следующие детали:
- постоянное среднее
- постоянная дисперсия
- Это автоковариантность, не зависящая от времени.
Далее давайте посмотрим, как можно протестировать стационарность. Нанесение данных на график и их визуальный анализ — первый и главный шаг. Используя следующую команду, вы можете построить данные:
Как видно из данных, наблюдается общее увеличение тенденций, а также сезонных колебаний. Однако в некоторых случаях такие визуальные выводы невозможны (мы увидим такие случаи позже). Ниже приведен более формальный метод проверки стационарности:
- Скользящие средние и скользящие отклонения могут быть нанесены на график, чтобы показать, как они меняются с течением времени. Другими словами, когда я говорю скользящее среднее/отклонение, я имею в виду, что мы возьмем среднее/отклонение от предыдущего года в любое время «t». Однако визуальный подход все же более привлекателен.
- Примером статистического теста на стационарность является тест Дики-Фуллера. Нулевая гипотеза состоит в том, что TS в этом случае не является стационарным. Результаты теста можно разделить на два типа: статистика теста и критические значения. Сравнивая «тестовую статистику» с «критическим значением», мы можем исключить нулевую гипотезу.
На данный момент может показаться неинтуитивным понимание этих концепций. Рекомендуется прочитать предысторию. Введение Брокуэлла и Дэвиса во временные ряды и прогнозирование может предоставить вам некоторую теоретическую статистику. Читая между строк, можно понять понятия и косвенно коснуться статистики.
Функцию можно использовать для создания графиков скользящей статистики с результатами теста Дики-Фуллера для проверки стационарности с использованием TS в качестве входных данных. Вместо дисперсии нанесено стандартное отклонение, чтобы единица измерения была похожа на среднее значение.
В коде нет ничего сложного. Если у вас возникли трудности с пониманием кода, пожалуйста, не стесняйтесь комментировать.
Мы запустим его со следующими входными данными:
Ясно, что среднее значение увеличивается со временем, несмотря на небольшую вариацию стандартного отклонения. Кроме того, тестовая статистика значительно превышает критические значения. Вы должны сравнивать значения со знаком, а не абсолютные значения.
Затем мы обсудим методы, которые можно использовать для стационаризации этого ТС.
4. Как лучше всего построить стационарный временной ряд?
Хотя многие модели TS предполагают стационарность, практически ни один временной ряд не является стационарным. В результате статистики разработали методы стационарности рядов, которые мы сейчас обсудим. Подобрать серию как можно ближе к стационарной почти невозможно.
ТС не являются стационарными по ряду причин. Нестационарный характер ТС можно объяснить двумя основными факторами:
1. Увеличение или уменьшение среднего значения во времени называется тенденцией. Количество пассажиров со временем увеличивалось, например, в этом случае.
2. Вариации, происходящие в определенное время года. В течение определенного месяца люди могут с большей вероятностью покупать автомобили из-за повышения заработной платы или фестиваля, например.
Чтобы получить стационарный ряд, тренд и сезонность ряда моделируются или оцениваются и удаляются. Этот ряд можно прогнозировать с помощью статистических методов. Наконец, к прогнозируемым значениям необходимо применить ограничения тренда и сезонности, чтобы привести их в соответствие с исходной шкалой.
Будут рассмотрены следующие методы. В этом случае одни могут работать хорошо, а другие нет. Вместо того, чтобы просто сосредоточиться на одном методе, постарайтесь понять их все.
Для начала давайте обсудим тренды.
Оценка и устранение тренда
Тренд можно уменьшить, преобразовав данные. Тенденция в данном случае явно положительная, что видно из графика. Это можно сделать, применив преобразование, которое штрафует большие значения сильнее, чем меньшие. Есть несколько способов их вычисления: логарифмы, квадратные корни, кубические корни и т. д. Для простоты возьмем логарифмическое преобразование:
Данные в этом более простом примере легко показывают поступательный тренд. Однако это не очень интуитивно понятно, когда присутствует шум. Чтобы удалить эту тенденцию из ряда, мы можем использовать некоторые методы для ее оценки или моделирования. Для этого можно использовать множество способов, но вот некоторые из наиболее распространенных:
- Получение среднего значения за определенный период времени, например, среднее значение за месяц/неделю.
- Среднее сглаживается путем взятия скользящего среднего
- Моделирование с помощью полиномов - подгонка уравнения регрессии
Важно попробовать другие методы, а также сглаживание, которое будет обсуждаться здесь. Гладкие оценки учитывают несколько последних случаев, т. е. скользящие оценки. Можно использовать разные методы, но я остановлюсь на двух.
Скользящее среднее
Основываясь на частоте временных рядов, мы берем среднее значение «k» последовательных значений. Здесь можно взять среднее из последних 12 значений за последний год. Для расчета скользящей статистики в Pandas есть специальные функции.
Как показано красной линией, вычисляется скользящее среднее. Это должно быть вычтено из исходного ряда. Поскольку мы берем среднее из последних 12 значений, скользящее среднее не определяется для первых 11 значений. Поэтому наблюдаем:
В первых 11 11 Nans. Для проверки стационарности отбросим значения NaN.
Сейчас сериал выглядит намного лучше. В скользящих значениях есть небольшая вариация, но не очевидная тенденция. Мы также можем с уверенностью 95% сказать, что этот ряд является стационарным, поскольку тестовая статистика меньше критического значения 5%.
Однако одним из недостатков этого подхода является то, что период времени должен быть строго определен. В этом случае мы можем использовать среднегодовые значения, но прогнозировать цену акции в сложных ситуациях сложнее. Более поздним значениям придается больший вес в «взвешенном скользящем среднем». Присвоить веса можно несколькими способами. В экспоненциально взвешенных скользящих средних всем предыдущим значениям присваиваются веса с коэффициентом затухания. Pandas можно использовать для реализации этого:
Параметр под названием «период полураспада» используется здесь для определения экспоненциального распада. Здесь многое зависит от сферы деятельности, и это всего лишь предположение. В приведенной выше ссылке обсуждаются другие параметры, которые вы можете использовать для определения затухания, включая размах и центр масс. Проверьте стационарность, удалив это из ряда:
Стандартное отклонение и среднее значение этой TS еще меньше различаются по величине, чем у предыдущей TS. Статистика теста также меньше критического значения 1%, таким образом, улучшаясь по сравнению с предыдущим случаем. В этом случае не будет пропущенных значений, поскольку все значения взвешиваются с самого начала. Он по-прежнему будет работать без предыдущих значений.
Устранение тренда и сезонности
Когда сезонность высока, простые методы уменьшения тенденции могут не сработать. Тенденции и сезонность можно удалить двумя способами:
- Это известно как разность, чтобы получить разницу с определенной временной задержкой.
- Моделирование тренда и сезонности отдельно и удаление их из модели.
Дифференциация
Дифференциация является одним из наиболее распространенных методов работы с сезонностью и тенденциями. В этой методике учитывается различие между наблюдением в конкретный момент и в предыдущий момент. В результате стационарность обычно улучшается. Панды могут выполнять дифференцирование первого порядка следующим образом:
Это, по-видимому, значительно снизило тенденцию. Давайте проверим, используя наши графики:
Мы видим, что среднее значение и стандартное отклонение имеют небольшие изменения с течением времени. Кроме того, статистика теста Дики-Фуллера ниже критического значения 10%, что указывает на то, что TS является стационарным с достоверностью более 90%. В некоторых приложениях мы могли бы получить еще лучшие результаты, взяв разности второго или третьего порядка. Давайте проверим их.
Разложение
Этот метод моделирует как сезонность, так и тенденцию отдельно и возвращает оставшиеся части ряда. Вот результаты, без статистики:
Основываясь на этом примере, мы видим, что тренд и сезонность были удалены из данных, и можно смоделировать остатки. Чтобы определить, являются ли остатки стационарными, проведем следующий тест:
Существует значительная разница между статистикой теста Дики-Фуллера и критическим значением 1%. Поэтому для данного ТС он очень близок к стационарному. Также можно использовать передовые методы декомпозиции для получения лучших результатов. Кроме того, в этом сценарии не очень интуитивно понятно преобразовывать остатки в исходные значения.
5. Прогнозирование временных рядов
Стационарный ТС создавался разными способами, и все они были достаточно удачными. TS — очень популярный метод моделирования после дифференцирования, поэтому давайте попробуем его. В этом случае также относительно легко добавить шум и сезонность обратно в прогнозируемые остатки. В случае оценки тренда и оценки сезонности возможны два результата:
- Зависимости между значениями в строго стационарном ряду нет. Остатки в этом случае можно смоделировать как белый шум. Тем не менее, это очень редкое явление.
- Значения в ряду существенно зависят друг от друга. Данные необходимо прогнозировать с использованием некоторых статистических моделей, таких как ARIMA.
Позвольте мне кратко представить вам ARIMA. Если вы хотите более эффективно применять эти концепции, вам следует разобраться в этих концепциях в деталях. Термин ARIMA относится к авторегрессивным интегрированным скользящим средним. В модели прогнозирования ARIMA стационарные временные ряды моделируются линейными уравнениями (аналогично линейной регрессии). Параметры модели (p, d, q) определяют предикторы:
- Количество терминов AR (авторегрессивных) (p): лаги зависимой переменной — это то, чем являются термины AR. Например, если p равно 5, то x(t-1)…x(t-5) являются предикторами для x(t).
- Количество терминов MA (скользящее среднее) (q): Запаздывающие ошибки прогноза представлены терминами MA в уравнениях прогнозирования. Скользящее среднее в i-й момент и фактическое значение в i-й момент являются предикторами для x(t), если q равно 5.
- Количество различий (d): В результате мы взяли разницу первого порядка в этом случае, то есть количество несезонных различий. Мы можем либо передать исходную переменную и установить d=0, либо передать исходную переменную и установить d=1. Там не будет никакой разницы в результатах, полученных ни тем, ни другим.
Здесь важно определить значение «p» и «q». Мы определяем эти числа с помощью двух графиков. Во-первых, давайте обсудим их.
- Функция автокорреляции (ACF): в этом случае отложенная версия TS используется для измерения корреляции между ней и исходной TS. АКФ сравнивает серию с задержкой 5 с серией с задержкой 5 в момент t1 с серией с задержкой 5 в момент t2 с серией с задержкой 5 в момент t2 с задержкой 5.
- Функция частичной автокорреляции (PACF). Эта мера измеряет, как TS коррелирует с запаздывающей версией самого себя после исключения вариаций, объясненных промежуточными сравнениями. При удалении задержки 5 будет проверяться только корреляция, но не эффекты, объясняемые задержками с 1 по 4.
После разности TS графики ACF и PACF выглядят следующим образом:
Эти две пунктирные линии представляют собой доверительные интервалы по обе стороны от 0. Используя их, значения «p» и «q» можно рассчитать следующим образом:
- p: для диаграммы PACF это значение принимается в качестве значения запаздывания, когда оно впервые пересекает верхний доверительный интервал. В этом случае p=2.
- q: Диаграммы ACF представляют пересечения верхнего доверительного интервала значениями запаздывания. Здесь q=2, если вы обратите пристальное внимание.
Теперь создадим три разные модели ARIMA с учетом индивидуальных и комбинированных эффектов. Каждый RSS также будет распечатан. Важно отметить, что RSS здесь относится к остаточным значениям, а не к фактическим рядам.
Сначала необходимо загрузить модель ARIMA:
Можно указать значения p, d, q, используя аргумент порядка ARIMA, который принимает кортеж (p, d, q). В качестве примера рассмотрим три случая:
Дополненная модель
МА Модель
Комбинация моделей
Наш результат показывает, что RSS моделей AR и MA почти одинаковы, но их совокупный RSS значительно выше. Последним шагом является восстановление этих значений в исходном масштабе.
Восстановление исходного масштаба
Поскольку комбинированная модель дала наилучшие результаты, давайте вернемся к исходным значениям, чтобы посмотреть, как это работает. Чтобы наблюдать прогнозируемые результаты, первым шагом будет их сохранение в виде отдельной серии.
Здесь есть разница между «1949–02–01» и «1949–02–01». В чем причина? Поскольку мы взяли задержку 1, перед первым элементом нечего вычитать. Последовательное добавление разностей к базовому числу преобразует разность в логарифмическую шкалу. Добавление кумулятивной суммы по индексу к базовому числу — это простой способ сделать это. В результате мы можем найти кумулятивную сумму следующим образом:
Проверьте правильность этих расчетов, используя предыдущие выходные данные, выполнив некоторые расчеты в уме. Добавление их к базовому номеру является следующим шагом. Здесь мы создадим серию со всеми значениями в качестве базового числа и добавим к ней различия. Можно сделать следующее:
Во-первых, у нас есть само базовое число, а затем мы добавляем значения кумулятивно оттуда. Взятие экспоненты и сравнение ее с исходным рядом — последний шаг.
Для всего этого используется Python. Давайте посмотрим, как использовать R для создания прогноза временных рядов.
Прогнозирование временных рядов в R
Чтение данных и вычисление основной сводки — это первый шаг.
Выход
Второй шаг - проверить цикл необработанных данных и построить необработанные данные.
Выход
Третий шаг — декомпозиция данных временного ряда.
Выход
Проверка стационарности данных — четвертый шаг
Выход
Мы отвергаем нулевую гипотезу, поскольку p-значение равно 0,01, что равно 0,05; в результате временной ряд является стационарным.
Существует положительная связь между 12-месячным циклом и максимальным отставанием в 1 или 12 месяцев.
Исключить значения NA из автографика случайных наблюдений с 7:138
Подгонка модели – пятый шаг
Результат
Прогнозирование – шестой шаг
Результат
Наконец, мы можем увидеть прогноз в исходном масштабе. Прогноз, я бы сказал, не очень хороший, но вы поняли, верно? Следующим шагом будет дальнейшее усовершенствование методологии и поиск лучшего решения.