Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ##########################
- # Autor: Andrés Necochea #
- ##########################
- ######################################################
- # pastebin: https://pastebin.com/N2h6An0h #
- ######################################################
- # IMPORTANTE:
- # Los cálculos de indicadores y tasas se han tomado del siguiente manual:
- # https://www.ine.gob.cl/docs/default-source/ocupacion-y-desocupacion/bbdd/libro-de-codigos/codigos-ene-2020.pdf
- library(haven)
- library(ggplot2)
- library(ggpubr)
- library(gridExtra)
- library(stringr)
- library(scales)
- #Función para descargar las bases de datos de la Encuesta Nacional de Empleos (Chile)
- #Descargará las bases de datos en el subdirectorio DB si es que no están descargadas,
- #Lueego las leerá usando el haven:read_spss
- #Las bases de datos serán cargadas en un ambiente (enviroment) que puede asignar a un objeto
- #Ejemplo de uso:
- # ENE <- descargarENE("2022-01","2022-12")
- # Argumentos:
- # inicio: Mes inicio formato aaaa-mm
- # fin: Mes fin formato aaaa-mm
- descargarENE <- function(inicio, fin) {
- # Url de bases de datos Encuestas hasta el año 2019
- urlENE19 <- "https://ine.cl/docs/default-source/ocupacion-y-desocupacion/bbdd/####/formato-spss/"
- # url de bases de datos a partir de 2020
- urlENE <- "https://www.ine.cl/docs/default-source/ocupacion-y-desocupacion/bbdd/####/spss/"
- # letras de los meses del año paraser usado en el sufijo del trimestre de las bases de datos
- letras <- "defmamjjasonde"
- # establece un rango de fechas desde el mes de inicio hasta el mes de término
- rangoFecha <- seq(as.Date(paste0(inicio,"-01")),
- to=as.Date(paste0(fin,"-01")),
- by="months")
- # Crea el directorio de bases de datos si no existe
- if(!dir.exists(file.path("DB"))) {
- dir.create(file.path("DB"))
- }
- # Se crea un ambiente para almacenar las bases de datos
- ENE <- new.env()
- # Descargará la base de datos de la encuesta nacional de empleos en formato SAV
- # en Windows se requiere especificar mode "wb" para que el archivo pueda ser
- # leído por read_spss de haven
- for(fecha in as.character(rangoFecha)) {
- nMes <- as.numeric(format(as.Date(fecha), "%m"))
- nAno <- as.numeric(format(as.Date(fecha), "%Y"))
- nombreENE <- paste0("ene-",
- format(as.Date(fecha), "%Y-%m"))
- nombreENEL <- paste0(nombreENE, "-", substr(letras,nMes,nMes+2))
- filePath <- file.path(paste0("DB/", nombreENE,".sav"))
- if(!file.exists(filePath)) {
- url <- sub("####", format(as.Date(fecha), "%Y"), urlENE)
- download.file(paste0(url,nombreENEL,".sav"), destfile = filePath, mode="wb")
- # Anteriormente los nombres de las bases de datos cambiaban para los años
- # 2019 y anteriores
- # Aunque se han estandarizado los nombres de las bases de datos, se ha mantenido
- # estas líneas en forma de comentario.
- #if (nAno <= 2019) {
- # url <- sub("####", format(as.Date(fecha), "%Y"), urlENE19)
- # #nombreENE19 <- sub("^(ene-[0-9]{4}-[0-9]{2})(-[a-z]{3})$","\\1", nombreENE)
- # download.file(paste0(url,nombreENE,".sav"), destfile = filePath)
- #} else {
- # url <- sub("####", format(as.Date(fecha), "%Y"), urlENE)
- # download.file(paste0(url,nombreENEL,".sav"), destfile = filePath)
- #}
- }
- nombreBaseDatos <- gsub("-", "_", nombreENE)
- if(!exists(nombreBaseDatos, envir=ENE)) {
- assign(nombreBaseDatos, read_spss(filePath), envir=ENE)
- }
- }
- return(ENE)
- }
- # Generará las series ENE en un dataframe
- # Las series son indicadores estadísticos de acuerdo a las definiciones operacionales de INE
- generarSeriesENE <- function(ENE, appendTo=NULL) {
- # Genera un listado de bases de datos contenidas en el ambiente
- names(ENE) |>
- grep("ene_[0-9]{4}_[0-9]{2}", x=_, value=TRUE) |>
- sort() -> listadoBaseDatos
- if(!is.null(appendTo)) {
- nombreSeries <- c("mes","desocupados","desocupadosH","desocupadosM","ocupados",
- "ocupadosH","ocupadosM","fuerzaTrabajo","fuerzaTrabajoH","fuerzaTrabajoM",
- "poblacionEdadTrabajar","poblacionEdadTrabajarH","poblacionEdadTrabajarM",
- "iniciadoresDisponibles","iniciadoresDisponiblesH","iniciadoresDisponiblesM",
- "tiempoParcialInvoluntario","tiempoParcialInvoluntarioH","tiempoParcialInvoluntarioM",
- "ocupadosBuscaronEmpleo","ocupadosBuscaronEmpleoH","ocupadosBuscaronEmpleoM",
- "ocupadosInformales","ocupadosInformalesH","ocupadosInformalesM",
- "ocupadosSectorInformal","ocupadosSectorInformalH","ocupadosSectorInformalM",
- "tasaDesocupacion","tasaDesocupacionH","tasaDesocupacionM",
- "tasaOcupacion", "tasaOcupacionH", "tasaOcupacionM","tasaParticipacion",
- "tasaPresionLaboral","tasaDesocupacionIniciadores", "tasaDesocupacionTPI")
- if(all(names(appendTo) == nombreSeries)) {
- series <- appendTo
- } else {
- stop("No es un data.frame de series ENE")
- }
- } else {
- # Base de datos de las series estadísticas
- series <- data.frame(mes=as.Date(numeric(0)),
- desocupados=numeric(0), desocupadosH=numeric(0), desocupadosM=numeric(0),
- ocupados=numeric(0), ocupadosH=numeric(0),ocupadosM=numeric(0),
- fuerzaTrabajo=numeric(0), fuerzaTrabajoH=numeric(0),fuerzaTrabajoM=numeric(0),
- poblacionEdadTrabajar=numeric(0), poblacionEdadTrabajarH=numeric(0), poblacionEdadTrabajarM=numeric(0),
- iniciadoresDisponibles=numeric(0), iniciadoresDisponiblesH=numeric(0), iniciadoresDisponiblesM=numeric(0),
- tiempoParcialInvoluntario=numeric(0), tiempoParcialInvoluntarioH=numeric(0), tiempoParcialInvoluntarioM=numeric(0),
- ocupadosBuscaronEmpleo=numeric(0), ocupadosBuscaronEmpleoH=numeric(0), ocupadosBuscaronEmpleoM=numeric(0),
- ocupadosInformales=numeric(0), ocupadosInformalesH=numeric(0), ocupadosInformalesM=numeric(0),
- ocupadosSectorInformal=numeric(0), ocupadosSectorInformalH=numeric(0), ocupadosSectorInformalM=numeric(0),
- stringsAsFactors=FALSE)
- }
- ### Se calculará los principales indicadores de empleo
- ### Para cada base de datos
- ### Estos cálculos se han tomado de las instrucciones de los manuales de INE
- for (nombreBaseDatos in listadoBaseDatos) {
- # Personas Desocupadas
- DO <- ENE[[nombreBaseDatos]]$cae_especifico == 8 | ENE[[nombreBaseDatos]]$cae_especifico == 9
- # Personas Ocupadas
- O <- ENE[[nombreBaseDatos]]$cae_especifico >= 1 & ENE[[nombreBaseDatos]]$cae_especifico <= 7
- # Fuerza de trabajo
- FT <- ENE[[nombreBaseDatos]]$cae_especifico >= 1 & ENE[[nombreBaseDatos]]$cae_especifico <= 9
- # Población en Edad de Trabajar
- PET <- ENE[[nombreBaseDatos]]$edad >= 15
- # Iniciadores Disponibles
- ID <- ENE[[nombreBaseDatos]]$cae_especifico == 10
- # Personas a tiempo parcial involuntario
- TPI <- O & ENE[[nombreBaseDatos]]$habituales <= 30 & ENE[[nombreBaseDatos]]$c10 == 1 &
- (ENE[[nombreBaseDatos]]$c11 == 1 | ENE[[nombreBaseDatos]]$c11 == 2)
- # Personas ocupadas que buscaron empleo
- OBE <- O & (ENE[[nombreBaseDatos]]$e4 >=1 & ENE[[nombreBaseDatos]]$e4 <=6)
- # Personas ocupadas informales
- OI <- ENE[[nombreBaseDatos]]$ocup_form == 2
- # Personas ocupadas en el sector informal
- OSI <- ENE[[nombreBaseDatos]]$sector == 2
- # Añadir indicadores a la serie estadística
- series[nrow(series)+1, 1] <- as.Date(sub("(ene_)([0-9]{4}_[0-9]{2})", "\\2_01", nombreBaseDatos), "%Y_%m_%d")
- i <- 2
- for (indicador in list(DO,O,FT,PET,ID,TPI,OBE,OI,OSI)) {
- series[nrow(series),i:(i+2)] <- c(sum(indicador*ENE[[nombreBaseDatos]]$fact_cal, na.rm=TRUE),
- tapply(indicador*ENE[[nombreBaseDatos]]$fact_cal, ENE[[nombreBaseDatos]]$sexo, sum, na.rm=TRUE))
- i <- i+3
- }
- }
- # Calcular tasas de acuerdo a las definiciones operacionales de INE
- series$tasaDesocupacion <- with(series, desocupados/fuerzaTrabajo)
- series$tasaDesocupacionH <- with(series, desocupadosH/fuerzaTrabajoH)
- series$tasaDesocupacionM <- with(series, desocupadosM/fuerzaTrabajoM)
- series$tasaOcupacion <- with(series, ocupados/poblacionEdadTrabajar)
- series$tasaOcupacionH <- with(series, ocupadosH/poblacionEdadTrabajarH)
- series$tasaOcupacionM <- with(series, ocupadosM/poblacionEdadTrabajarM)
- series$tasaParticipacion <- with(series, fuerzaTrabajo/poblacionEdadTrabajar)
- series$tasaPresionLaboral <- with(series, (desocupados+iniciadoresDisponibles+ocupadosBuscaronEmpleo)/(fuerzaTrabajo+iniciadoresDisponibles))
- series$tasaDesocupacionIniciadores <- with(series, (desocupados+iniciadoresDisponibles)/(fuerzaTrabajo+iniciadoresDisponibles))
- series$tasaDesocupacionTPI <- with(series, (desocupados+iniciadoresDisponibles+tiempoParcialInvoluntario)/(fuerzaTrabajo+iniciadoresDisponibles))
- return(series)
- }
- # Generará series basadas en la pregunta E9
- # Las categorías se han agrupado para hacer más fácil la lectura de resultados
- generarSerieE9 <- function(ENE, appendTo=NULL) {
- if (is.null(appendTo)) {
- serieE9 <- data.frame(mes=as.Date(numeric(0)), motivoInactividad=numeric(0), Freq=numeric(0),
- hombres=numeric(0), mujeres=numeric(0))
- } else {
- nombreSerieE9 <- c("mes", "motivoInactividad", "Freq", "hombres", "mujeres")
- if (all(names(appendTo) == nombreSerieE9)) {
- serieE9 <- appendTo
- } else {
- stop("La base de datos no corresponde a las series E9")
- }
- }
- # Genera un listado de bases de datos contenidas en el ambiente
- names(ENE) |>
- grep("ene_[0-9]{4}_[0-9]{2}", x=_, value=TRUE) |>
- sort() -> listadoBaseDatos
- for (nombreBaseDatos in listadoBaseDatos) {
- mes <- as.Date(sub("(ene_)([0-9]{4}_[0-9]{2})", "\\2_01", nombreBaseDatos), "%Y_%m_%d")
- f <- ENE[[nombreBaseDatos]]$activ == 3 &
- ENE[[nombreBaseDatos]]$edad >= 15
- if("e9_otro_covid" %in% names(ENE[[nombreBaseDatos]]) & "e12_otro_covid" %in% names(ENE[[nombreBaseDatos]])) {
- subsetENE <- ENE[[nombreBaseDatos]][f,c("sexo", "e9", "e12", "e9_otro_covid", "e12_otro_covid" ,"fact_cal")]
- } else {
- subsetENE <- ENE[[nombreBaseDatos]][f,c("sexo", "e9", "e12" ,"fact_cal")]
- }
- attach(subsetENE)
- motivoInactividad <- numeric(nrow(subsetENE))
- # Espera iniciar un empleo o actividad por cuenta propia
- motivoInactividad[e9 %in% c(1,2,9,13) | (is.na(e9) & e12 %in% 1:2)] <- 1
- # Responsabilidades familiares (embarazo o cuidado de menores o personas dependientes)
- motivoInactividad[e9 %in% c(3,11,12,14) | (is.na(e9) & e12 %in% c(4,10,11))] <- 2
- # Estudios
- motivoInactividad[e9 == 4 | (is.na(e9) & e12 == 3)] <- 3
- # Es Jubilado/a, Rentista, Pensionado/a o Montepiada
- motivoInactividad[e9 %in% 5:7 | (is.na(e9) & e12 %in% 5:7)] <- 4
- # Razones de salud
- motivoInactividad[e9 %in% c(8,10) | (is.na(e9) & e12 %in% c(8,9))] <- 5
- # Razones de desaliento
- motivoInactividad[e9 %in% 15:20] <- 6
- # No quiere o no necesita trabajar
- motivoInactividad[e9 == 21 | (is.na(e9) & e12 == 12)] <- 7
- if ("e9_otro_covid" %in% names(ENE[[nombreBaseDatos]]) & "e12_otro_covid" %in% names(ENE[[nombreBaseDatos]])) {
- # Razones asociadas al covid 19
- motivoInactividad[(e9 == 22 & e9_otro_covid == 1) | (is.na(e9) & e12 == 13 & e12_otro_covid ==1)] <- 8
- # Otras razones
- motivoInactividad[(e9 == 22 & (e9_otro_covid == 0 | is.na(e9_otro_covid))) | (is.na(e9) & e12 == 13 & (e12_otro_covid ==0 | is.na(e12_otro_covid)))] <- 9
- } else {
- motivoInactividad[e9 == 22 | (is.na(e9) & e12 == 13)] <- 9
- }
- motivoInactividad[motivoInactividad == 0] <- NA
- detach(subsetENE)
- motivoInactividad <- factor(motivoInactividad,
- levels=1:9,
- labels=c("Espera iniciar un empleo o actividad por cuenta propia", #1
- "Responsabilidades familiares (embarazo, cuidado de menores o personas dependientes)", #2
- "Estudios", #3
- "Es Jubilado/a, Rentista, Pensionado/a o Montepiada", #4
- "Razones de salud", #5
- "Razones de desaliento", #6
- "No quiere o no necesita trabajar", #7
- "Razones asociadas al covid-19", #8
- "Otras Razones")) #9
- subsetENE <- data.frame(subsetENE, motivoInactividad)
- tmi <- with(subsetENE, xtabs(fact_cal ~ motivoInactividad))
- tmis <- with(subsetENE, xtabs(fact_cal ~ motivoInactividad + sexo))
- serieE9 <- rbind(serieE9, data.frame(mes=rep(mes,nrow(tmi)), tmi,
- hombres=tmis[,1], mujeres=tmis[,2]))
- rm(f,motivoInactividad,tmi,tmis,subsetENE)
- }
- return(serieE9)
- }
- ##################################
- # Ejemplo de uso básico #
- ##################################
- # Para un uso básico de estas funciones, se proporciona el siguiente ejemplo
- # Se descargará las bases de datos de la encuesta nacional de empleo
- # desde Enero de 2022 a Diciempre de 2022:
- #
- # ENE <- descargarENE("2022-01","2022-12")
- # seriesENE <- generarSeriesENE(ENE)
- # serieE9 <- generarSerieE9(ENE)
- #
- # Para evitar cargar grandes cantidades de datos en la memoria, se puede generar
- # las series cargando conjuntos pequeñños de bases de datos y agregarlos usando el
- # argumento appendTo
- # Ejemplo:
- # ENE <- descargarENE("2019-01","2019-12")
- # seriesENE <- generarSeriesENE(ENE)
- # ENE <- descargarENE("2020-01","2020-12")
- # seriesENE <- generarSeriesENE(ENE, appendTo=seriesENE)
- # Matriz con fechas de inicio y término para ser usadas en la descarga de bases de datos
- fechas <- rbind(c("2019-01", "2020-01", "2021-01", "2022-01", "2023-01"),
- c("2019-12", "2020-12", "2021-12", "2022-12", "2023-06"))
- rownames(fechas) <- c("fechaInicio", "fechaFin")
- for (i in 1:ncol(fechas)) {
- ENE <- descargarENE(fechas["fechaInicio",i], fechas["fechaFin",i])
- if (i==1) {
- seriesENE <- generarSeriesENE(ENE)
- serieE9 <- generarSerieE9(ENE)
- } else {
- seriesENE <- generarSeriesENE(ENE, appendTo = seriesENE)
- serieE9 <- generarSerieE9(ENE, appendTo = serieE9)
- }
- rm(ENE)
- }
- rm(fechas, i)
- ##################################
- # GRÁFICO 1: #
- # TASA DE DESEMPLEO SEGÚN GÉNERO #
- ##################################
- ggplot(data = seriesENE, aes(x = as.Date(mes), y = tasaDesocupacion, color="Total"))+
- geom_line(linewidth=1) +
- geom_line(aes(y=tasaDesocupacionH, color="Hombres"),linewidth=1) +
- geom_line(aes(y=tasaDesocupacionM, color="Mujeres"),linewidth=1) +
- scale_color_manual("Género:", values = c("Total"="#00AABB", "Hombres"="#AA00BB", "Mujeres"="#AABB00")) +
- scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("months")) +
- scale_y_continuous(labels = scales::percent) +
- theme(legend.position="top", axis.text.x = element_text(angle=45, hjust=1, size=7)) +
- labs(title = "Tasa de desocupación por trimestre móvil, según género",
- x="Trimestre Móvil",
- y="Tasa de desocupación %",
- caption="Autor: Andrés Necochea, Fuente: Elaboración propia\n
- en base a datos de Encuesta Nacional de Empleo\n
- (Instituto Nacional de Estadística de Chile,2023)")
- ##################################
- # GRÁFICO 2: #
- # TASA DE OCUPACIÓN SEGÚN GÉNERO #
- ##################################
- ggplot(data = seriesENE, aes(x = as.Date(mes), y = tasaOcupacion, color="Total"))+
- geom_line(linewidth=1) +
- geom_line(aes(y=tasaOcupacionH, color="Hombres"),linewidth=1) +
- geom_line(aes(y=tasaOcupacionM, color="Mujeres"),linewidth=1) +
- scale_color_manual("Género:", values = c("Total"="#00AABB", "Hombres"="#AA00BB", "Mujeres"="#AABB00")) +
- scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("months")) +
- scale_y_continuous(labels = scales::percent) +
- theme(legend.position="top", axis.text.x = element_text(angle=45, hjust=1, size=7)) +
- labs(title = "Tasa de ocupación por trimestre móvil, según género",
- x="Trimestre Móvil",
- y="Tasa de ocupación %",
- caption="Autor: Andrés Necochea, Fuente: Elaboración propia\n
- en base a datos de Encuesta Nacional de Empleo\n
- (Instituto Nacional de Estadística de Chile,2023)")
- ###################################
- # GRÁFICO 3: #
- # Motivo Inactividad según género #
- ###################################
- levels(serieE9$motivoInactividad) <- str_wrap(levels(serieE9$motivoInactividad),40)
- g1 <- ggplot(data=serieE9, aes(x=as.Date(mes), y=Freq, fill=motivoInactividad)) +
- geom_area(alpha=0.7, color = 1, lwd=0.5, linetype=1) +
- scale_fill_brewer(palette = "Set1", name=str_wrap("Motivo por el cual no ha trabajado, buscado empleo o no ha estado disponible para trabajar en las últimas cuatro semanas",30)) +
- guides(fill=guide_legend(legend.key.height=unit(2, "cm"),ncol=1)) +
- labs(x="Trimestre Móvil", y="Población Total\n(Millones de personas)") +
- scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("months")) +
- theme(axis.text.x = element_text(angle=45, hjust=1, size=7)) +
- scale_y_continuous(labels = label_number(suffix = " M", scale = 1e-6))
- g2 <- ggplot(data=serieE9, aes(x=as.Date(mes), y=hombres, fill=motivoInactividad)) +
- geom_area(alpha=0.7, color = 1, lwd=0.5, linetype=1) +
- scale_fill_brewer(palette = "Set1") +
- labs(x="Trimestre Móvil", y="Hombres\n(Millones de personas)") +
- scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("months")) +
- theme(axis.text.x = element_text(angle=45, hjust=1, size=7)) +
- scale_y_continuous(labels = label_number(suffix = " M", scale = 1e-6))
- g3 <- ggplot(data=serieE9, aes(x=as.Date(mes), y=mujeres, fill=motivoInactividad)) +
- geom_area(alpha=0.7, color = 1, lwd=0.5, linetype=1) +
- scale_fill_brewer(palette = "Set1") +
- labs(x="Trimestre Móvil", y="Mujeres\n(Millones de personas)") +
- scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("months")) +
- theme(axis.text.x = element_text(angle=45, hjust=1, size=7)) +
- scale_y_continuous(labels = label_number(suffix = " M", scale = 1e-6))
- legend <- get_legend(g1)
- # Descomentar esta línea y dev.off para exportar a png
- #png("grafico3.png", width=8.5, height=11, units="in", res=300)
- grid.arrange(arrangeGrob(g1 + theme(legend.position = "none"),
- g2 + theme(legend.position = "none"),
- g3 + theme(legend.position = "none")),
- as_ggplot(legend),
- ncol=2,
- widths=c(1.5,1),
- top=grid::textGrob("Motivo por el que no ha trabajado o buscado empleo",gp=grid::gpar(fontsize=20,font=3)),
- bottom="Autor: Andrés Necochea, Fuente: Elaboración propia en base a Encuesta Nacional de Empleo (INE Chile, 2023)"
- )
- #dev.off()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement