20 mar 2023

Gráfico de recesión (Reccesion plot) en R y ggplot2

En la siguiente entrada se muestra un ejemplo de gráficos con bandas de recesión en ggplot2 de R. La idea se toma de “rstudio-pubs[1]. Desde Excel, se cargan los datos conteniendo los precios mensuales del precio del petróleo.

library(readxl)
library(dplyr)
library(ggplot2)
library(tidyr) #gather
library(lubridate)
 
series_mes <- read_excel("series_examples.xlsx", sheet = "mes")
 
series_mes  %>%
  select(fecha,p_wti) %>%
  na.omit()
 
# A tibble: 446 x 2
   fecha               p_wti
   <dttm>              <dbl>
 1 1986-01-01 00:00:00  22.9
 2 1986-02-01 00:00:00  15.5
 3 1986-03-01 00:00:00  12.6
 4 1986-04-01 00:00:00  12.8
 5 1986-05-01 00:00:00  15.4
 6 1986-06-01 00:00:00  13.4
 7 1986-07-01 00:00:00  11.6
 8 1986-08-01 00:00:00  15.1
 9 1986-09-01 00:00:00  14.9
10 1986-10-01 00:00:00  14.9
# ... with 436 more rows

Posteriormente, se crea una base de referencia llamada reccess, donde se coloca una variable con las fechas de inicio y final de cada crisis, estas son llamadas begin y end, respectivamente. Respecto al código original, aquí se agrega la crisis financiera de 2003 dada su relevancia para la economía dominicana, además de la crisis del COVID-19. Adicionalmente, en la variable evento coloca el nombre del evento asociado a cada crisis. Esto le permitirá colocar etiquetas sobre el gráfico posteriormente.

recess <- data.frame(
  begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01",
             "1990-07-01","2001-03-01","2003-01-01","2007-12-01",
             "2020-03-01"),
   end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01",
           "1991-03-01","2001-11-01","2004-01-01","2009-07-30",
           "2021-12-01"),
 event = c( "Fiscal & Monetary ", "1973 Oil crisis","Double dip I",
            "Double dip II", "Oil price shock", "Dot-com bubble",
             "Crisis Bancaria RD","Sub-prime crisis", "COVID-19"),
  y =  c(.014, 0.020, 0.029,  0.0341,  0.027, 0.02,0.02, 0.025, 0.2),
  stringsAsFactors = F
)

La variable y es la referencia sobre el valor de ese eje en donde entendemos debe aparecer las etiquetas asociadas a cada crisis. Es decir, que debemos cambiar estos valores para cada serie que quisiéramos representar. Sin embargo, dado que tenemos un vector de fechas en nuestra serie temporal este proceso es necesario automatizar. La opción utilizada en este ejemplo utiliza la función %in% combinada con which para identificar las posiciones de fechas en nuestra base de datos que coincide con las crisis. Estas posiciones se guardan en el vector recesion_index. Finalmente, se usa la indexación numérica para recuperar los calores de mi serie que coinciden con estas fechas. Por ejemplo, imaginemos que una recesión inició en enero de 2003, la idea es buscar el valor de mi serie en ese mes.  Estos valores se guardan en el vector position_labels.

#ubicando las posiciones de las fechas
recesion_index <- which(format(series_mes$fecha, "%y-%b") %in% format(recess$begin, "%y-%b"))
recesion_index
[1]  78 206 228 287 434
 
position_labels <- series_mes$p_wti[recesion_index]
position_labels
[1] 16.70 29.61 29.46 94.77 50.54

Finalmente, se usan diferentes geom de ggplot2 para obtener la representación deseada.
·         geom_line, gráfico de línea con el precio del petróleo.
·         geom_rect, franja roja asociada a cada crisis.
·         geom_label, posición de las etiquetas.

ggplot(series_mes, aes(x = fecha, y = p_wti)) +
  geom_line(size=1.1) +
  geom_rect(data = dplyr::filter(recess, begin >= as.Date("1986-01-01")),
            aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"),
            inherit.aes = FALSE, alpha = 0.2) +
  geom_label(data = dplyr::filter(recess, begin >= as.Date("1986-01-01")),
             aes(x = end, y = position_labels, label=event), size = 3) +
  scale_fill_manual(name = "", values="red", label="Recessions")  +
  theme_minimal() +
  ggtitle(c("Precio del petróleo (WTI) \n Datos mensuales 1986-2023")) +
  theme(legend.position = "none") +
  ylab(NULL) +  xlab(NULL)
 
ggsave("plot0.png")




[1] Introduction to Visualization with ggplot2. 

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...