Recession shading em gráficos no R

(Post originalmente publicado no Open Code Community)

Nesse post iremos ensinar a construir um gráfico de linha com indicações para períodos de recessão em séries temporais (gráficos com recession shading).

Iremos nos basear no gráfico abaixo, retirado do FRED, para desenvolver a nossa versão.

Começaremos importando os dados da série temporal do ‘Personal Consumer Expenditures’. Após isso, importamos um dataframe a partir de um .csv contendo as datas de início e fim de cada recessão nos EUA. Realizamos, então, um tratamento dos dados desse dataframe, de modo a restarmos somente com recessões que se encontrarem no período em que desejamos plotar. No final, elaboraremos um gráfico de linha que mostrará a série temporal e indicará os períodos recessivos.

Importando as bibliotecas necessárias.
library(tidyquant) # Utilizado para importar os dados da série temporal.
library(dplyr) # Utilizado para fazer o tratamento dos dados.
library(ggplot2) # Utilizado para construir os gráficos.

Importando os dados da série temporal

# Utilizaremos a série temporal do Personal Consumer Expenditures, 
# disponível no FRED. 
# Observação: como os dados são obtidos do FRED, temos que usar o código da 
# série utilizado por ele. Nesse caso, o código é "PCE".
# Usaremos a função tq_get() da biblioteca tidyquant para importar os dados
# da série temporal escolhida.

inicio = '2000-01-01'
fim = '2021-04-01'

df = 'PCE' %>%
  tq_get(get  = "economic.data",
        from = inicio,
        to   = fim)

Agora, iremos fazer o tratamento dos dados de recessões

Primeiro, importamos os dados

# Infelizmente o FRED não disponibiliza de forma tão concisa os dados 
# necessários. Embora eles estejam disponíveis neste link
# (fredhelp.stlouisfed.org/fred/data/understanding-the-data/recession-bars),
# não há nenhum arquivo do FRED, ao menos que tenha chegado ao conhecimento 
# dos autores, que esteja disponível com esses dados.

# Por esse motivo, um dos autores fez a transposição desses dados para um 
# arquivo .csv e o disponibilizou na internet, facilitando o processo para
# outros que queiram replicar o código.

# Para efetivamente importar os dados, utilizamos a função read.csv().

recessoes_nber = read.csv('https://fqueiroz.netlify.app/uploads/recessoes_nber.csv', 
                         sep = ',')

# Realizmos, também, uma pequena mudança de nome das colunas, apenas para 
# simplificar o processo.

names(recessoes_nber) = c('start', 'end') 

Para podermos trabalhar com esse dataframe, precisamos transformar os seus valores em data.

# Usaremos a função as.Date()

recessoes_nber$start = as.Date(recessoes_nber$start)
recessoes_nber$end = as.Date(recessoes_nber$end)

Agora, podemos selecionar apenas as recessões que estão no período de interesse.

# Selecionamos, a partir da função subset(), apenas as recessões que tem 
# seu fim nos períodos de interesse ou que ainda estão ocorrendo (ou não 
# possuem data definida de término)

recessoes_nber = subset(recessoes_nber, 
                        (end >= min(df$date) | is.na(end)))

# Utilizamos a função is.na() para determinar se há alguma recessão ainda 
# ocorrendo, já que nesse caso, não há nenhum valor de data na célula que 
# indicaria a data do fim da recessão.

Realizaremos o tratamento dos dados de datas de início e fim das recessões.

# Primeiro, substituímos os valores em que não há data (recessão ainda está 
# ocorrendo) pelo valor máximo da data na série temporal de interesse. Se 
# não houver nenhuma recessão em andamento, nada será feito.

recessoes_nber[is.na(recessoes_nber)] = max(df$date)

# Após isso, substituímos os valores de data de início da recessão que estão
# localizados fora do período de interesse, pelo valor mínimo de data da 
# série temporal. Isso será importante caso o usuário selecione o início da 
# série temporal dentro de um período de recessão. Se esse nao for o caso, 
# nada ocorrerá.

recessoes_nber$start[recessoes_nber$start < min(df$date)] = min(df$date)

Agora, já temos os dados de recessão tratados e temos os dados da série temporal. Já podemos elaborar o gráfico com esses dados.

Construiremos o gráfico utilizando o pacote ggplot2.

# Para indicar os períodos recessivos, vamos utilizar o geom_rect, que 
# colocará retângulos no gráfico entre as datas de início de fim das 
# recessões. Colocamos a cor e a transparência desejadas como parâmetro.

df %>%
  ggplot() +
  geom_rect(data = recessoes_nber, 
            aes(xmin = start, xmax = end, ymin = -Inf, ymax = +Inf), 
            fill='#FEF3DE', alpha=0.8, col="#FEF3DE") +
  geom_line(aes(x=date, y=price), size = 1, color = "dodgerblue3") +
  labs(x = 'Data',
      y = 'Bilhões de US$',
      title = 'Personal Consumption Expenditures',
      caption = "Dados: U.S. Bureau of Economic Analysis. Elaboração própria.") +
  theme_light() +
  scale_x_date(breaks = scales::pretty_breaks(n = 8), expand = c(0,0)) +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 8))    

Isso nos dá como output a imagem abaixo, que é exatamente o que nós desejavamos.

Felipe Queiroz
Felipe Queiroz
Associado na Liga de Mercado Financeiro PUC-Rio

Estudo Economia na PUC-Rio e sou Associado na Liga de Mercado de Financeiro da PUC-Rio. Gosto muito de programação, economia e finanças.

Relacionados