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

Мой бывший коллега показал мне этот способ автоматизации, прежде чем уйти с нашего рабочего места в то время на другую работу. В конце концов мне пришлось поддерживать его, что побудило меня развивать его дальше и думать о новых способах его оптимизации. В этом посте я покажу вам, как загрузить данные Евростата о годовом процентном изменении HICP с помощью запроса SDMX, а затем создать квантильный график, который визуализирует, как конкретная страна сравнивается с ее аналогами в ЕС. На веб-сайте Евростата есть пошаговое руководство по созданию запросов SDMX, а также фактический конструктор запросов. Однако гораздо интереснее автоматизировать этот процесс самостоятельно. Пакет pdfetch предназначен для загрузки экономических и финансовых данных из различных источников, таких как Евростат, Всемирный банк, ЕЦБ, Yahoo Finance, Бюро трудовой статистики США и многих других. Это довольно полезно в целом. Однако здесь я в основном буду полагаться на пакет rsdmx по причинам, которые вы поймете ниже.

Прежде чем продолжить, я перечислю пакеты, которые вам понадобятся для выполнения кода, который я приведу ниже: rsdmx, pdfetch, data.table, ggplot2, zoo. Излишне говорить, что вам также понадобится какая-то IDE для работы с R. Лично я предпочитаю RStudio. Есть простой способ загрузить все эти пакеты из менеджера пакетов в RStudio. В противном случае вы можете просто написать install.packages("ggplot2") в консоли для каждого пакета отдельно.

После установки всех необходимых пакетов вы можете загрузить их следующим образом:

# used for SDMX queries
library(rsdmx)
# used for plotting data
library(ggplot2)
# used as a very good substitution of data frames
library(data.table)
# used for dates manipulation
library(zoo)
# used to fetch macro data from various public sources
library(pdfetch)

Следующим шагом будет загрузка структуры данных SDMX для годового процентного изменения ГИПЦ через соответствующую ссылку. Изменив последнюю часть ссылки, вы можете найти схему для каждого индикатора в базе данных. В разделе база данных веб-сайта Евростата каждый показатель имеет псевдоним. Смотрите изображение ниже:

Для годовой скорости изменения HICP следует использовать prc_hicp_manr. Следовательно, ссылка на определение структуры данных или dsd для этого индикатора будет следующей:

schema_url <- “http://ec.europa.eu/eurostat/SDMX/diss-web/rest/datastructure/ESTAT/DSD_prc_hicp_manr"

Чтобы прочитать схему, вы можете использовать функцию readSDMX из пакета rsdmx.

dsd <- readSDMX(schema_url)

После запуска приведенной выше команды у вас будет загружен объект dsd SDMX, который вы можете просмотреть. Это не очень удобная структура данных, но вскоре мы преобразуем ее части в таблицу данных. Альтернативный способ получить структуру данных определенного временного ряда — использовать пакет pdfetch:

dsd <- pdfetch_EUROSTAT_DSD(“prc_hicp_manr”)

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

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

codelists <- dsd@codelists@codelists
dimensions <- sapply(code lists, function(x) x@id)

Символ @ используется для доступа к подмножествам объекта данных SDMX (очень похоже на $ для кадров данных). С помощью приведенного выше кода мы получаем все отдельные идентификаторы списков кодов. Объект dimensions дает нам следующее:

> dimensions
[1] “CL_COICOP” “CL_FREQ” “CL_GEO” “CL_OBS_FLAG” “CL_OBS_STATUS” “CL_UNIT”

Чтобы уточнить, что означает каждый из них:

  • CL_COICOP — это часть индекса HICP, которую вы хотите использовать. Вас интересует либо общий индекс для всех продуктов, либо, например, субиндекс для продуктов питания. Каждый уровень индекса имеет уникальный идентификатор.
  • CL_FREQ — частота индикатора, которая может быть ежемесячной, квартальной, годовой и т. д. Здесь нас интересует месячная периодичность.
  • CL_GEO — это страна или набор стран, для которых мы хотим загрузить данные.
  • CL_OBS_FLAG — это флаг, который присваивается определенным наблюдениям. Например, это могут быть «Предварительные данные» или «Прогноз», которые должны сообщить вам, что некоторые наблюдения будут подвергаться пересмотру и не будут окончательными.
  • CL_OBS_STATUS — это статус того, существует ли наблюдение или нет. Это может быть, например, NA для наблюдений, по которым еще нет данных.
  • CL_UNIT — это единица измерения, которая может быть, например, индексом 2015 = 100 или, в нашем случае, годовым процентным изменением.

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

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

# creating a data table from the SDMX object to list all values for # the codelist id = CL_GEO
geo_descr <- data.table(as.data.frame(dsd@codelists, codelistId = “CL_GEO”))
# delete the second and third column to make it more neat
geo_descr <- geo_descr[, -c(2:3)]
# change the names of the columns
setnames(geo_descr, c(‘GEO’,’GEO_DESCR’))

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

На самом деле нам понадобится эта таблица geo_descr, чтобы выбрать, для каких стран мы хотим извлечь индекс HICP. Я хочу извлечь его для всех 27 стран ЕС (не включая Великобританию), поэтому мне нужно удалить все агрегированные индексы (EA, EU-27 и т. д.) и все страны, не входящие в ЕС, такие как США и Турция. Мы получаем это с помощью следующего скрипта.

# put all countries from the geo_descr table in one string which we
# will use later on in the query. Notice that the separator is a +
# symbol as this is required by the query syntax
string_geo <- paste(geo_descr$GEO, collapse = “+”) 
# delete all aggregate indices and non-EU countries
string_geo <- substring(string_geo, nchar(“EU+EU28+EU27_2019+EA+EA19+EA18+”)+1, nchar(string_geo)-nchar(“+UK+EEA+IS+NO+CH+MK+RS+TR+US”))

Это дает нам строку с 27 странами ЕС, разделенными плюсом (поскольку этого требует синтаксис запроса):

> string_geo
[1] “BE+BG+CZ+DK+DE+EE+IE+EL+ES+FR+HR+IT+CY+LV+LT+LU+HU+MT+NL+AT+PL+PT+RO+SI+SK+FI+SE”

Затем мы создаем URL-адрес запроса следующим образом:

url <- paste(“http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/prc_hicp_manr/M.RCH_A.CP00.", string_geo, "/?startPeriod=2007", sep="")

Обратите внимание, что после начальной общей части ссылки у нас есть псевдоним индикатора (prc_hicp_manr), а затем по одному каждому из измерений. M означает Ежемесячно для CL_FREQ. RCH_A означает годовое процентное изменение для CL_UNIT. CP00 — это классификация COICOP для общего индекса HICP. После этого мы добавляем список стран, который мы создали ранее. В конце добавляем период начала запроса, а именно 2007 год.

Чтобы узнать, каков правильный порядок различных значений измерений в URL-адресе запроса, вы можете либо посмотреть на dsd -> datastructures -> datastructures -> [[1]] -> components -> dimensions (из предварительного просмотра объекта в R studio), либо на выходные данные упомянутой выше команды pdfetch_EUROSTAT_DSD. Первый предоставит вам список необходимых размеров, упорядоченных по тому, как они должны отображаться в URL-адресе. Последний предоставит вам все значения списков кодов для каждого измерения в том порядке, в котором они должны использоваться в URL-адресе.

Далее мы загрузим данные:

# create sdmx object
sdmx <- readSDMX(url)
# convert to data.table
stats <- data.table(as.data.frame(sdmx))
# add the description of each country by merging with geo_descr
data <-merge(stats, geo_descr, by=”GEO”)
# convert the datetime in order to be more friendly to R and ggplot2
data[, Date := as.Date(as.yearmon(obsTime))]

Обратите внимание, что способ загрузки данных создаст сложенную таблицу данных, отсортированную по странам. Далее я получу квантильное распределение годового процентного изменения HICP по странам ЕС:

data_quantiles <- data[, 
list(
quant.0 = quantile(obsValue, probs = 0, na.rm = T, names = T)[[1]], 
quant.25 = quantile(obsValue, probs = 0.25, na.rm = T, names = T)[[1]], 
quant.50 = quantile(obsValue, probs = 0.50, na.rm = T, names = T)[[1]], 
quant.75 = quantile(obsValue, probs = 0.75, na.rm = T, names = T)[[1]],
quant.100 = quantile(obsValue, probs = 1, na.rm = T, names = T)[[1]]), by = list(Date)
]

Приведенный выше код вычисляет квантили для каждого месяца в объекте данных (примечание by = list(Date)). Таким образом, у нас есть все необходимое для построения графика с помощью ggplot2. Мы делаем это с помощью следующего кода:

HICP <- ggplot(data = data_quantiles, aes(x = Date)) + 
# sets data_quantiles as the dataset to use and the date as the 
# x axis
geom_ribbon(aes(ymin = quant.0, ymax = quant.25, fill = ‘0% — 25%’), alpha=0.3) +
geom_ribbon(aes(ymin = quant.25, ymax = quant.50, fill = ‘25% — 50%’), alpha=0.3) +
geom_ribbon(aes(ymin = quant.50, ymax = quant.75, fill = ‘50% — 75%’), alpha=0.3) +
geom_ribbon(aes(ymin = quant.75, ymax = quant.100, fill = ‘75% — 100%’), alpha=0.3)+ 
# the four lines above create filled in areas to visualize the 
# quantile distribution, while the alpha sets the graph objects 
# semi-transparent
geom_line(data = data[GEO == ‘BG’], aes(x = Date, y = obsValue, fill=’Bulgaria’), size = 1, alpha=0.7)+
# create a line for Bulgaria in order to compare with the quantile 
# distribution
scale_fill_manual(values = c("#01A9DB", "#086A87", "#086A87", "#01A9DB", "black"))+
# set the colours for the quantiles and the country line
# here the two middle parts (between 0.25 and 0.75 quantiles of the # distribution) will have the same darker colour
geom_hline(aes(yintercept=0), colour=”red”,size=1, alpha=0.5)+
theme_bw()+theme(panel.grid.major=element_line(size=0.3, colour=’grey92'))+
guides(fill=guide_legend(title=NULL))+
ylab(“Annual % Change”)+
theme(axis.title.x = element_blank(),panel.border = element_blank())+
ggtitle(“HICP”)+
theme(plot.title = element_text(hjust = 0.5))
# adjust the colours and appearance of the axis, gridlines, set the # title of the y axis and the graph itself and their position
# also set a red line for y axis = 0

Это создает следующий объект графика:

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

Далее мы видим период между концом 2013 и концом 2017 года, когда уровень инфляции был отрицательным и одним из самых низких в ЕС. Однако средняя инфляция в ЕС в этот период также была очень низкой и около нуля. Причинами этого, вероятно, были низкие цены на сырьевые товары и низкие условия роста. Мы видим рост инфляции за последние два года по мере нормализации цен на сырье и ускорения экономического роста. Есть Документ ЕЦБ, в котором я обсуждал низкую инфляцию в зоне евро в годы после мирового финансового кризиса.

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

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

# create a list of all countries (I will not bother removing the 
# aggregates and the non-EU countries here)
list_geo <- as.list(geo_descr$GEO)
# download the data
data_pdfetch <- data.table(pdfetch_EUROSTAT(“prc_hicp_manr”, FREQ=”M”, UNIT=”RCH_A”,
 COICOP=”CP00", GEO=list_geo, from=”2007–01–01"))

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

Это всего лишь относительно простой пример того, что можно сделать в R с точки зрения автоматизации макроэкономической отчетности. Используя rsdmx и/или pdfetch, можно автоматизировать загрузку данных широкого спектра индикаторов и использовать R для анализа данных и их визуализации в презентабельном виде. Следует иметь в виду, что время от времени Евростат меняет структуры данных, и для работы скрипта могут потребоваться небольшие изменения. Также, если вы не знакомы с R, имейте в виду, что запросы SDMX можно выполнять и в Excel. Я надеюсь, что вы нашли это пошаговое руководство полезным. Не стесняйтесь задать вопрос или начать обсуждение.