Advertisement
yayopoint

Imacec No Minero Desestacionalizado Per cápita

Jul 16th, 2024 (edited)
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 5.80 KB | Science | 0 0
  1. ###              ###
  2. # Nota Importante: #
  3. ###              ###
  4. #   Los nombres de los meses abreviados en español pueden ser problemáticos de
  5. # transformar en fechas de R.
  6. #   El buen funcionamiento de este script podría depender de la localización
  7. # de la versión de R y del sistema operativo. Eventualmente podría requerir
  8. # ajustes manuales para que se ejecute correctamente.
  9.  
  10. #   Hay que jugar con los parámetros de las etiquetas para que queden bien
  11. # posicionadas. A veces se solapan con el gráfico.
  12.  
  13. # Paquetes ----------------------------------------------------------------
  14. library(tidyverse)
  15. library(rvest)
  16. library(tsibble)
  17. library(fabletools)
  18. library(magrittr, include.only="%<>%")
  19. library(zoo, include.only="na.approx")
  20. library(ggrepel)
  21.  
  22. # IMACEC ------------------------------------------------------------------
  23. # Url a la tabla de IMACEC desestacionalizado del banco central
  24. url <- "https://si3.bcentral.cl/Siete/ES/Siete/Cuadro/CAP_CCNN/MN_CCNN76/CCNN2018_IMACEC_03_A/638131831615238879?cbFechaInicio=1996&cbFrecuencia=MONTHLY&cbCalculo=NONE&cbFechaBase="
  25.  
  26. # Se lee la tabla utilizando las herramientas de webscrapping de rvest
  27. imacec <- read_html(url) %>%
  28.   html_element("table") %>%
  29.   html_table()
  30.  
  31. #   Transformamos la tablas con pivot para dejar las fechas en las filas y las
  32. # series en las columnas.
  33. imacec %<>%
  34.   pivot_longer(cols=-c(Sel., Serie), names_to="Fecha") %>%
  35.   select(-Sel.) %>%
  36.   pivot_wider(names_from = Serie) %>%
  37.   mutate(across(-Fecha, ~ str_replace(.x, ",", ".") |> as.numeric())) %>%
  38.   mutate(Fecha = paste(Fecha, "01") |> as.Date(format="%b.%Y %d"))
  39.  
  40. # Se transforma la tabla en una tsibble.
  41. imacec %<>%
  42.   mutate(Fecha = yearmonth(Fecha)) %>%
  43.   as_tsibble(index=Fecha)
  44.  
  45. # Gráfico de prueba del Imacec no minero desestacionalizado
  46. imacec %>%
  47.   autoplot(`Imacec no minero`) +
  48.   scale_x_yearmonth(breaks="2 year") +
  49.   theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
  50.  
  51. # Proyecciones Censales ---------------------------------------------------
  52. # Url al archivo csv de población per cápita del sitio web del INE
  53. url <- "https://www.ine.gob.cl/docs/default-source/proyecciones-de-poblacion/cuadros-estadisticos/base-2017/ine_estimaciones-y-proyecciones-de-poblaci%C3%B3n-1992-2050_base-2017_base-de-datos.csv?sfvrsn=4022da86_11&download=true"
  54.  
  55. # Se descarga la base de datos
  56. proyeccion_censal <- read_csv2(url, skip=1)
  57. proyeccion_censal %<>%
  58.   # Tomamos sólo la edad total (suma hombres y mujeres)
  59.   filter(EDAD=="TOTAL") %>%
  60.   .[1,] %>%
  61.   #   Seleccionamo sólo las columnas cuyo nombre sea un número de cuatro cifras,
  62.   # es decir, un año.
  63.   select(matches("^[0-9]{4}$")) %>%
  64.   # Usando pivot cambiamos los años a las filas y la población a las columnas.
  65.   pivot_longer(cols=everything(), names_to = "Año", values_to = "Población") %>%
  66.   # Definimos enero como mes para hacer las proyecciones intermensuales.
  67.   mutate(Mes=month(1, label=TRUE),
  68.          Año=as.numeric(Año))
  69.  
  70. # Expandir la serie y rellenar los puntos medios.
  71. proyeccion_censal %<>%
  72.   # Expandimos la proyección censal a todos los meses
  73.   expand(Año, Mes) %>%
  74.   #   Unimos a la base de datos original, generando valores perdidos para los
  75.   # meses distintos de Enero.
  76.   left_join(proyeccion_censal) %>%
  77.   #   Se utiliza na.approx para rellenar los valores intermedios con
  78.   # interpolaciones lineales.
  79.   mutate(Población=na.approx(Población, na.rm=FALSE)) %>%
  80.   fill(Población)
  81.  
  82. # Transformamos la tabla en un tsibble.
  83. proyeccion_censal %<>%
  84.   mutate(Fecha=paste(Año, Mes,01 ) |> as.Date("%Y %b %d") |> yearmonth()) %>%
  85.   select(Fecha, Población) %>%
  86.   as_tsibble(index=Fecha)
  87.  
  88. # Se une ambas tablas y se genera el gráfico.
  89. imacec %<>%
  90.   # Se una la tabla imacec con las proyecciones censales
  91.   left_join(proyeccion_censal) %>%
  92.   # Se calcula el Imacec no Minero per cápita en dos etapas:
  93.   #   1.- Se multiplica por el valor máximo de la población para mantener la
  94.   #       base.
  95.   #   2.- Se divide el valor anterior por la población proyectada.
  96.   mutate(`INM per capita` = `Imacec no minero`*max(Población),
  97.          `INM per capita` = `INM per capita`/Población)
  98.   #   Se utiliza autoplot del paquete fabletools para simplificar la producción
  99.   # del gráfico
  100.  
  101. puntos_relevantes <- tribble(
  102.   ~Fecha, ~Evento,
  103.   "2012-07", "Cambio Tendencia",
  104.   "2014-04", "Reforma Tributaria Bachelet",
  105.   "2019-09", "Estallido Social",
  106.   "2020-03", "Pandemia (1er caso en Chile)",
  107.   "2022-03", "Gabriel Boric"
  108. ) %>%
  109.   mutate(Fecha = yearmonth(Fecha)) %>%
  110.   as_tsibble(index=Fecha)
  111.  
  112.  
  113. # Se genera el gráfico final y se añade etiquetas con geom_label_repel
  114. imacec %>%
  115.   left_join(puntos_relevantes) %>%
  116.   autoplot(`INM per capita`) +
  117.   # Ajustamos la escala del eje x a dos años
  118.   scale_x_yearmonth(breaks="2 year") +
  119.   # Rotamos las etiquetas del eje x a 45°
  120.   theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
  121.   #   Trazamos una línea vertical en julio de 2012 como punto de inflexión
  122.   # relevante en la tendencia
  123.   geom_vline(xintercept = as.Date("2012-07-01"),
  124.              linetype = 2, color = 2, linewidth = 1) +
  125.   labs(
  126.     title="Imacec No minero por mes",
  127.     subtitle = "Cifras desestacionalizadas per cápita (según proyecciones intercensales)",
  128.     x="Fecha",
  129.     y="Imacec no minero desestacionalizado\n(per cápita)",
  130.     caption="Autor: Andrés Necochea\n
  131.    Fuentes: Serie imacec desestacionalizado de Banco Central\n
  132.    Proyecciones censales de INE Chile.") +
  133.   geom_label_repel(aes(label=Evento),
  134.                    box.padding = 2,
  135.                    max.overlaps = Inf,
  136.                    segment.linetype = 2,
  137.                    nudge_x = .15,
  138.                    nudge_y = .5,
  139.                    na.rm=TRUE) +
  140.   geom_point(data=imacec[imacec$Fecha %in% puntos_relevantes$Fecha,],
  141.              color = "red")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement