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"
dias_semana <- c("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")

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(dia_semana = factor(
      wday(fecha), 
      levels = 1:7,
      labels = dias_semana,
      ordered = TRUE
    ))

Visualización

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

feriados %>% 
  mutate(fin_de_semana = dia_semana %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?

Este post recibió algo de atención entre algunos colegas. Una visualización útil que se me ocurrió sirve para planificar días de clases o teletrabajo:

feriados |> 
  count(dia_semana, t) |> 
  filter(between(t, 2025, 2028)) |> 
  ggplot(aes(forcats::fct_reorder2(dia_semana, n, t), n, fill=as.factor(t))) +
  geom_col() +
  coord_flip() +
  facet_wrap(~t, scales = "free_y") +
  guides(fill=FALSE) +
  labs(x="", y="", title="Feriados por día de la semana")

El gráfico permite concluir que en 2025 sería bueno un día de clase los martes que no hay feriados y nos perderíamos horas de clase.