Загрузка данных

Пакет sophisthse предназначен для скачивания временных рядов с sophist.hse.ru.

Загрузка нужного ряда данных и его описание:

constr <- sophisthse("CONSTR_M_NAT")
sophisthse_metadata(constr)
## # A tibble: 2 x 7
##   tsname  unit   fullname       methodology      source      comment  freq
##   <chr>   <chr>  <chr>          <chr>            <chr>       <chr>   <dbl>
## 1 CONSTR… тыс.к… Ввод в действ… Общая площадь ж… Федеральна… -          12
## 2 CONSTR… тыс.к… Ввод в действ… Сезонное сглажи… Рассчитан … -          12
constr_1 <- constr[, 'CONSTR_M_NAT'] # извлекаем 1-й столбец

Получили таблицу, в которой присутствует один ряд: Ввод в действие жилых домов (CONSTR_M_NAT). Методология: Определение общей площади жилых домов в тыс.кв.метров. Структура таблицы следующая:

# Вывод значений
constr_1 %>% 
  head(36)
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov
## 1993   500   500  3200  1200  1300  4800  1800  1500  4000  2000  2000
## 1994   500   500  3000  1000  1300  4300  1600  1600  3700  1700  1700
## 1995   400   600  3300  1200  1500  5000  1800  1800  3800  1800  1800
##        Dec
## 1993 19000
## 1994 18300
## 1995 18000

Анализ данных

Посмотрим, как выглядит ряд на графике.

autoplot(constr_1) +
  labs(y = 'Общая площадь жилых домов, тыс.кв.метров',  x = 'Год',
       title = 'Ввод в действие жилых домов',
       caption = 'Источник: sophist.hse')

Очистка выбросов

Посмотрим на фрагмент ряда со значениями, которые можно принять за выброс:

constr_1 %>%
  window(start = c(1993, 1), end = c(1998, 1)) %>%
  autoplot()

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

constr_2 <- constr %>%
  .[, 1] %>% # убираем лишние атрибуты
  tsclean()

autoplot(constr_1, series = 'Исходный ряд') +
  autolayer(constr_2, series = 'Очищенный ряд') +
  labs(y = 'Общая площадь жилых домов, тыс.кв.метров',  x = 'Год',
       title = 'Ввод в действие жилых домов',
       caption = 'Источник: sophist.hse')

STL-декомпозиция

Выполним декомпозицию, используя функцию forecast::stl() (Seasonal and Trend decomposition using Loess). Данная функция выделяет тренд с помощью сглаживания, но использует вместо скользящего среднего метод локальной регрессии - LOESS. Это позволяет исключить потерю данных на концах ряда. Кроме того, метод более устойчив к выбросам в данных ряда.

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

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

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

Преобразование Бокса-Кокса применяется для уменьшения зависимости амплитуды колебаний от уровня ряда. Lambda = 0,94. В связи с этим можно сделать вывод, что логарифмирование в данном случае не подходит.

lam <- BoxCox.lambda(constr_2) 
autoplot(BoxCox(constr_2, lambda = lam)) + 
    labs(title = paste('lambda = ', round(lam, 2)),
         x = NULL, y = NULL)

constr_sd <- constr_2 %>%
  BoxCox(lambda = lam) %>%
  stl(s.window = 'periodic')
  
autoplot(constr_sd) +
  labs(title = 'STL-декомпозиция')

Далее компоненты будут рассмотрены на общем графике.

# Все компоненты на одном графике

autoplot(constr_2, series = 'Оригинал') +
  autolayer(trendcycle(constr_sd), series = 'Тренд') +
  autolayer(trendcycle(constr_sd) + seasonal(constr_sd),
            series = 'Модель ряда') +
 labs(y = 'Общая площадь жилых домов, тыс.кв.метров',  x = 'Год',
       title = 'Ввод в действие жилых домов',
       caption = 'Источник: sophist.hse') +
  scale_color_manual(values = c("#CC99FF", "#FFCCFF", "#CC0000"))

Тренд - устойчивая долговременная тенденция изменения значений временного ряда, закономерно изменяющаяся во времени.

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

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

Видны сильные расхождения оригинала и модели ряда с учетом сезонности и тренда. Эти расхождения выражены остатками. Рассмотрим их на графике ниже.

Остаток (нерегулярный компонент) ряда - величина, показывающая нерегулярную (не описываемую трендом или сезонностью) составляющую исходного ряда в определённом временном интервале.

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

Остаток:

autoplot(remainder(constr_sd)) +
  labs(y = NULL, x = NULL,
     title = 'Нерегулярный компонент ряда') +
  geom_line(color = 'darkgray')

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


Полезные ссылки

  1. Пример прогнозирования в R

  2. Учет инфляции при анализе временных рядов