Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ### ###
- # Nota Importante: #
- ### ###
- # Los nombres de los meses abreviados en español pueden ser problemáticos de
- # transformar en fechas de R.
- # El buen funcionamiento de este script podría depender de la localización
- # de la versión de R y del sistema operativo. Eventualmente podría requerir
- # ajustes manuales para que se ejecute correctamente.
- # Hay que jugar con los parámetros de las etiquetas para que queden bien
- # posicionadas. A veces se solapan con el gráfico.
- # Paquetes ----------------------------------------------------------------
- library(tidyverse)
- library(rvest)
- library(tsibble)
- library(fabletools)
- library(magrittr, include.only="%<>%")
- library(zoo, include.only="na.approx")
- library(ggrepel)
- # IMACEC ------------------------------------------------------------------
- # Url a la tabla de IMACEC desestacionalizado del banco central
- 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="
- # Se lee la tabla utilizando las herramientas de webscrapping de rvest
- imacec <- read_html(url) %>%
- html_element("table") %>%
- html_table()
- # Transformamos la tablas con pivot para dejar las fechas en las filas y las
- # series en las columnas.
- imacec %<>%
- pivot_longer(cols=-c(Sel., Serie), names_to="Fecha") %>%
- select(-Sel.) %>%
- pivot_wider(names_from = Serie) %>%
- mutate(across(-Fecha, ~ str_replace(.x, ",", ".") |> as.numeric())) %>%
- mutate(Fecha = paste(Fecha, "01") |> as.Date(format="%b.%Y %d"))
- # Se transforma la tabla en una tsibble.
- imacec %<>%
- mutate(Fecha = yearmonth(Fecha)) %>%
- as_tsibble(index=Fecha)
- # Gráfico de prueba del Imacec no minero desestacionalizado
- imacec %>%
- autoplot(`Imacec no minero`) +
- scale_x_yearmonth(breaks="2 year") +
- theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
- # Proyecciones Censales ---------------------------------------------------
- # Url al archivo csv de población per cápita del sitio web del INE
- 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"
- # Se descarga la base de datos
- proyeccion_censal <- read_csv2(url, skip=1)
- proyeccion_censal %<>%
- # Tomamos sólo la edad total (suma hombres y mujeres)
- filter(EDAD=="TOTAL") %>%
- .[1,] %>%
- # Seleccionamo sólo las columnas cuyo nombre sea un número de cuatro cifras,
- # es decir, un año.
- select(matches("^[0-9]{4}$")) %>%
- # Usando pivot cambiamos los años a las filas y la población a las columnas.
- pivot_longer(cols=everything(), names_to = "Año", values_to = "Población") %>%
- # Definimos enero como mes para hacer las proyecciones intermensuales.
- mutate(Mes=month(1, label=TRUE),
- Año=as.numeric(Año))
- # Expandir la serie y rellenar los puntos medios.
- proyeccion_censal %<>%
- # Expandimos la proyección censal a todos los meses
- expand(Año, Mes) %>%
- # Unimos a la base de datos original, generando valores perdidos para los
- # meses distintos de Enero.
- left_join(proyeccion_censal) %>%
- # Se utiliza na.approx para rellenar los valores intermedios con
- # interpolaciones lineales.
- mutate(Población=na.approx(Población, na.rm=FALSE)) %>%
- fill(Población)
- # Transformamos la tabla en un tsibble.
- proyeccion_censal %<>%
- mutate(Fecha=paste(Año, Mes,01 ) |> as.Date("%Y %b %d") |> yearmonth()) %>%
- select(Fecha, Población) %>%
- as_tsibble(index=Fecha)
- # Se une ambas tablas y se genera el gráfico.
- imacec %<>%
- # Se una la tabla imacec con las proyecciones censales
- left_join(proyeccion_censal) %>%
- # Se calcula el Imacec no Minero per cápita en dos etapas:
- # 1.- Se multiplica por el valor máximo de la población para mantener la
- # base.
- # 2.- Se divide el valor anterior por la población proyectada.
- mutate(`INM per capita` = `Imacec no minero`*max(Población),
- `INM per capita` = `INM per capita`/Población)
- # Se utiliza autoplot del paquete fabletools para simplificar la producción
- # del gráfico
- puntos_relevantes <- tribble(
- ~Fecha, ~Evento,
- "2012-07", "Cambio Tendencia",
- "2014-04", "Reforma Tributaria Bachelet",
- "2019-09", "Estallido Social",
- "2020-03", "Pandemia (1er caso en Chile)",
- "2022-03", "Gabriel Boric"
- ) %>%
- mutate(Fecha = yearmonth(Fecha)) %>%
- as_tsibble(index=Fecha)
- # Se genera el gráfico final y se añade etiquetas con geom_label_repel
- imacec %>%
- left_join(puntos_relevantes) %>%
- autoplot(`INM per capita`) +
- # Ajustamos la escala del eje x a dos años
- scale_x_yearmonth(breaks="2 year") +
- # Rotamos las etiquetas del eje x a 45°
- theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
- # Trazamos una línea vertical en julio de 2012 como punto de inflexión
- # relevante en la tendencia
- geom_vline(xintercept = as.Date("2012-07-01"),
- linetype = 2, color = 2, linewidth = 1) +
- labs(
- title="Imacec No minero por mes",
- subtitle = "Cifras desestacionalizadas per cápita (según proyecciones intercensales)",
- x="Fecha",
- y="Imacec no minero desestacionalizado\n(per cápita)",
- caption="Autor: Andrés Necochea\n
- Fuentes: Serie imacec desestacionalizado de Banco Central\n
- Proyecciones censales de INE Chile.") +
- geom_label_repel(aes(label=Evento),
- box.padding = 2,
- max.overlaps = Inf,
- segment.linetype = 2,
- nudge_x = .15,
- nudge_y = .5,
- na.rm=TRUE) +
- geom_point(data=imacec[imacec$Fecha %in% puntos_relevantes$Fecha,],
- color = "red")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement