rlabuonora.com

Feriados en Uruguay

El primero de Mayo conmemoramos el días de los trabajadores. Lamentablemente, este año nos cayó sábado, por lo que nos perdimos el día libre. En este post uso lubridate para visualizar este lamentable fenómeno de la vida labora de este país.

Wikipedia tiene una tabla con los feriados en Uruguay. Traté de scrapearla directo con rvest pero la última columna de la tabla da problemas así que copié los datos a mano.

library(tidyverse)

feriados_tabla <- tibble::tribble(
  ~fecha,       ~nombre,    
  "1 de enero", "Año Nuevo",
  "6 de enero", "Día de los Niños",
  "19 de abril", "Desembarco de los Treinta y Tres Orientales",
  "1 de mayo",    "Día de los Trabajadores",
  "18 de mayo",  "Batalla de Las Piedras",
  "19 de junio", "Natalicio de Artigas",
  "18 de julio", "Jura de la Constitución",
  "25 de agosto","Declaratoria de la Independencia", 
  "12 de octubre", "Día de la Raza",
  "2 de noviembre", "Día de los Difuntos",
  "25 de diciembre", "Día de la Familia") %>% 
  # Sacamos " de" para que no moleste a lubridate
  mutate(fecha = str_replace(fecha, " de", ""))

Parsear fechas (en español).

En Uruguay hay 11 feriados. Para convertirlas en fechas, usamos expand_grid para combinar las fechas con todos los años entre 2015 y 2030, y para parsear el texto de la fecha usamos readr::parse_date. La función wday nos da el día de la semana en que cae determinada fecha.

Para que parse_date entienda bien el texto de los meses (enero, febrero, etc.) especifico el argumento locale=locale("es"). Para que wday nos de el día de la semana de cada fecha, hay que setear la locale del sistema con Sys.setlocale.

library(lubridate)

Sys.setlocale("LC_TIME", "Spanish_Spain.1252")
## [1] "Spanish_Spain.1252"
feriados <- expand_grid(t=2017:2032, fecha=feriados_tabla$fecha) %>% 
  left_join(feriados_tabla, by="fecha") %>% 
  mutate(fecha = paste(fecha, t)) %>% 
  mutate(fecha=parse_date(fecha, "%d %B %Y", locale=locale("es"))) %>% 
  mutate(wdia=wday(fecha, label=TRUE, abbr=FALSE)) %>% 
  mutate(wdia = stringr::str_to_title(wdia))

Visualización

Ahora una visualización bien simple para ver que nos deparan los próximos años:

feriados %>% 
  mutate(fin_de_semana = wdia %in% c("Sábado", "Domingo")) %>% 
  count(t, fin_de_semana) %>% 
  ggplot(aes(t, n, fill=fin_de_semana)) + 
  geom_col() + 
  scale_x_continuous(breaks=2017:2032) + 
  theme(legend.position = "bottom")

Parecería que después de dos años medios 2021 y 2022, en 2023 vamos a tener muy pocos feriados que caen fin de semana y 2024 va a ser nefasto. Quiero saber dos cosas: ¿cuáles son los feriados que caen juntos?

¿Cómo juegan los años bisiestos?

Los feriados van cambiando de a un día en los años normales y de a dos los años bisiestos:

feriados %>% 
  filter(nombre=="Año Nuevo")
## # A tibble: 16 x 4
##        t fecha      nombre    wdia     
##    <int> <date>     <chr>     <chr>    
##  1  2017 2017-01-01 Año Nuevo Domingo  
##  2  2018 2018-01-01 Año Nuevo Lunes    
##  3  2019 2019-01-01 Año Nuevo Martes   
##  4  2020 2020-01-01 Año Nuevo Miércoles
##  5  2021 2021-01-01 Año Nuevo Viernes  
##  6  2022 2022-01-01 Año Nuevo Sábado   
##  7  2023 2023-01-01 Año Nuevo Domingo  
##  8  2024 2024-01-01 Año Nuevo Lunes    
##  9  2025 2025-01-01 Año Nuevo Miércoles
## 10  2026 2026-01-01 Año Nuevo Jueves   
## 11  2027 2027-01-01 Año Nuevo Viernes  
## 12  2028 2028-01-01 Año Nuevo Sábado   
## 13  2029 2029-01-01 Año Nuevo Lunes    
## 14  2030 2030-01-01 Año Nuevo Martes   
## 15  2031 2031-01-01 Año Nuevo Miércoles
## 16  2032 2032-01-01 Año Nuevo Jueves

El primero de Enero cayó Viernes en 2016, y cómo 2016 fue bisiesto, en 2017 cayó domingo. En 2018 cayó Lunes, 2019 Martes, etc. El día de los Trabajadores es después del 29 de Febrero, por lo que los años bisiestos lo afectan diferente.

feriados %>% 
  filter(nombre=="Día de los Trabajadores")
## # A tibble: 16 x 4
##        t fecha      nombre                  wdia     
##    <int> <date>     <chr>                   <chr>    
##  1  2017 2017-05-01 Día de los Trabajadores Lunes    
##  2  2018 2018-05-01 Día de los Trabajadores Martes   
##  3  2019 2019-05-01 Día de los Trabajadores Miércoles
##  4  2020 2020-05-01 Día de los Trabajadores Viernes  
##  5  2021 2021-05-01 Día de los Trabajadores Sábado   
##  6  2022 2022-05-01 Día de los Trabajadores Domingo  
##  7  2023 2023-05-01 Día de los Trabajadores Lunes    
##  8  2024 2024-05-01 Día de los Trabajadores Miércoles
##  9  2025 2025-05-01 Día de los Trabajadores Jueves   
## 10  2026 2026-05-01 Día de los Trabajadores Viernes  
## 11  2027 2027-05-01 Día de los Trabajadores Sábado   
## 12  2028 2028-05-01 Día de los Trabajadores Lunes    
## 13  2029 2029-05-01 Día de los Trabajadores Martes   
## 14  2030 2030-05-01 Día de los Trabajadores Miércoles
## 15  2031 2031-05-01 Día de los Trabajadores Jueves   
## 16  2032 2032-05-01 Día de los Trabajadores Sábado

Esto implica que los años bisiestos cambian la distribución de feriados por día, y esta queda estable y se mueve hacia la derecha cada año hasta el próximo año bisiesto:

dias <- c("Domingo", "Lunes", "Martes",
          "Miércoles", "Jueves", "Viernes",
          "Sábado")

feriados %>% 
  mutate(wdia=str_sub(wdia, 1, 3)) %>% 
  count(t, wdia) %>% 
  mutate(wdia=factor(wdia, levels=str_sub(dias, 1, 3))) %>% 
  ggplot(aes(wdia, n)) +
  geom_col() +
  facet_wrap(~t, ncol = 4) + 
  guides(fill="none")