Пакет 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')
Выполним декомпозицию, используя функцию 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')
Колебания значительны, что означает не полное исключение закономерных компонентов. Это возникло в связи с тем, что на протяжении всего периода анализа величина сезонных коэффициентов менялась, но данная модель этого не учитывает.
Полезные ссылки