1 Introducción

2 Objetivos

2.1 Objetivo general

2.2 Objetivos específicos

3 Antecedentes

El artículo de @maldonado2021brechas busca visibilizar y analizar la desigualdad de género en la composición del empleo público de la Administración Pública Nacional (APN). El trabajo se basa en datos del año 2020 de la Base Integrada de Empleo Público elaborada por la Secretaría de Gestión y Empleo Público de la Jefatura de Gabinete de Ministros a partir de registros administrativos. A partir esta se realiza una aproximación cuantitativa de la cantidad de empleados y empleadas en los organismos de la APN e identifica salarios, si se trata de personal civil y el tipo de administración, jurisdicción y escalafón al que pertenecen. Debe señalarse que la BIEP utiliza una codificación binaria del género de los y las empleadas. Si bien los derechos de las mujeres se encuentran vulnerados de distintas maneras dentro del mercado de trabajo, en este ensayo tomaremos tres de las principales: la segregación horizontal, los “techos de cristal” y la brecha salarial. El primero refiere a la existencia de trabajos con mayor presencia de mujeres/varones en algunos sectores, el segundo a la menor presencia de mujeres en puestos jerárquicos y el tercero a la diferencia de ingresos respecto a sus pares varones.

4 Fuente de datos

https://datos.sfp.gov.py/data/funcionarios/download

Ruta de trabajo: “G:unidad”

5 Procesamiento de datos

5.1 Carga de los archivos

# librerias necesarias

#install.packages(dplyr, tidyverse)

library(dplyr)
library(tidyverse)
library(data.table)
library(readr)
# variables=c("anio", "mes","descripcionEntidad" , "codigoPersona", "sexo", "fechaIngreso",        "tipoPersonal",  "lugar","montoPresupuestado")
# 
#  FP2015ene=fread( "D:/FUNPUBLICOS/nomina_2015-01.csv", select=variables )
#  FP2015feb=fread( "D:/FUNPUBLICOS/nomina_2015-02.csv", select=variables )
#  FP2015mar=fread( "D:/FUNPUBLICOS/nomina_2015-03.csv", select=variables )
#  FP2015abr=fread( "D:/FUNPUBLICOS/nomina_2015-04.csv", select=variables )
#  FP2015may=fread( "D:/FUNPUBLICOS/nomina_2015-05.csv", select=variables )
#  FP2015jun=fread( "D:/FUNPUBLICOS/nomina_2015-06.csv", select=variables )
#  FP2015jul=fread( "D:/FUNPUBLICOS/nomina_2015-07.csv", select=variables )
#  FP2015ago=fread( "D:/FUNPUBLICOS/nomina_2015-08.csv", select=variables )
#  FP2015sep=fread( "D:/FUNPUBLICOS/nomina_2015-09.csv", select=variables )
#  FP2015oct=fread( "D:/FUNPUBLICOS/nomina_2015-10.csv", select=variables )
#  FP2015nov=fread( "D:/FUNPUBLICOS/nomina_2015-11.csv", select=variables )
#  FP2015dic=fread( "D:/FUNPUBLICOS/nomina_2015-12.csv", select=variables )
# 
#  FP2016ene=fread( "D:/FUNPUBLICOS/nomina_2016-01.csv", select=variables )
#  FP2016feb=fread( "D:/FUNPUBLICOS/nomina_2016-02.csv", select=variables )
#  FP2016mar=fread( "D:/FUNPUBLICOS/nomina_2016-03.csv", select=variables )
#  FP2016abr=fread( "D:/FUNPUBLICOS/nomina_2016-04.csv", select=variables )
#  FP2016may=fread( "D:/FUNPUBLICOS/nomina_2016-05.csv", select=variables )
#  FP2016jun=fread( "D:/FUNPUBLICOS/nomina_2016-06.csv", select=variables )
#  FP2016jul=fread( "D:/FUNPUBLICOS/nomina_2016-07.csv", select=variables )
#  FP2016ago=fread( "D:/FUNPUBLICOS/nomina_2016-08.csv", select=variables )
#  FP2016sep=fread( "D:/FUNPUBLICOS/nomina_2016-09.csv", select=variables )
#  FP2016oct=fread( "D:/FUNPUBLICOS/nomina_2016-10.csv", select=variables )
#  FP2016nov=fread( "D:/FUNPUBLICOS/nomina_2016-11.csv", select=variables )
#  FP2016dic=fread( "D:/FUNPUBLICOS/nomina_2016-12.csv", select=variables )
# 
#  FP2017ene=fread( "D:/FUNPUBLICOS/nomina_2017-01.csv", select=variables )
#  FP2017feb=fread( "D:/FUNPUBLICOS/nomina_2017-02.csv", select=variables )
#  FP2017mar=fread( "D:/FUNPUBLICOS/nomina_2017-03.csv", select=variables )
#  FP2017abr=fread( "D:/FUNPUBLICOS/nomina_2017-04.csv", select=variables )
#  FP2017may=fread( "D:/FUNPUBLICOS/nomina_2017-05.csv", select=variables )
#  FP2017jun=fread( "D:/FUNPUBLICOS/nomina_2017-06.csv", select=variables )
#  FP2017jul=fread( "D:/FUNPUBLICOS/nomina_2017-07.csv", select=variables )
#  FP2017ago=fread( "D:/FUNPUBLICOS/nomina_2017-08.csv", select=variables )
#  FP2017sep=fread( "D:/FUNPUBLICOS/nomina_2017-09.csv", select=variables )
#  FP2017oct=fread( "D:/FUNPUBLICOS/nomina_2017-10.csv", select=variables )
#  FP2017nov=fread( "D:/FUNPUBLICOS/nomina_2017-11.csv", select=variables )
#  FP2017dic=fread( "D:/FUNPUBLICOS/nomina_2017-12.csv", select=variables )
# 
#  FP2018ene=fread( "D:/FUNPUBLICOS/nomina_2018-01.csv", select=variables )
#  FP2018feb=fread( "D:/FUNPUBLICOS/nomina_2018-02.csv", select=variables )
#  FP2018mar=fread( "D:/FUNPUBLICOS/nomina_2018-03.csv", select=variables )
#  FP2018abr=fread( "D:/FUNPUBLICOS/nomina_2018-04.csv", select=variables )
#  FP2018may=fread( "D:/FUNPUBLICOS/nomina_2018-05.csv", select=variables )
#  FP2018jun=fread( "D:/FUNPUBLICOS/nomina_2018-06.csv", select=variables )
#  FP2018jul=fread( "D:/FUNPUBLICOS/nomina_2018-07.csv", select=variables )
#  FP2018ago=fread( "D:/FUNPUBLICOS/nomina_2018-08.csv", select=variables )
#  FP2018sep=fread( "D:/FUNPUBLICOS/nomina_2018-09.csv", select=variables )
#  FP2018oct=fread( "D:/FUNPUBLICOS/nomina_2018-10.csv", select=variables )
#  FP2018nov=fread( "D:/FUNPUBLICOS/nomina_2018-11.csv", select=variables )
#  FP2018dic=fread( "D:/FUNPUBLICOS/nomina_2018-12.csv", select=variables )
# 
#  FP2019ene=fread( "D:/FUNPUBLICOS/nomina_2019-01.csv", select=variables )
#  FP2019feb=fread( "D:/FUNPUBLICOS/nomina_2019-02.csv", select=variables )
#  FP2019mar=fread( "D:/FUNPUBLICOS/nomina_2019-03.csv", select=variables )
#  FP2019abr=fread( "D:/FUNPUBLICOS/nomina_2019-04.csv", select=variables )
#  FP2019may=fread( "D:/FUNPUBLICOS/nomina_2019-05.csv", select=variables )
#  FP2019jun=fread( "D:/FUNPUBLICOS/nomina_2019-06.csv", select=variables )
#  FP2019jul=fread( "D:/FUNPUBLICOS/nomina_2019-07.csv", select=variables )
#  FP2019ago=fread( "D:/FUNPUBLICOS/nomina_2019-08.csv", select=variables )
#  FP2019sep=fread( "D:/FUNPUBLICOS/nomina_2019-09.csv", select=variables )
#  FP2019oct=fread( "D:/FUNPUBLICOS/nomina_2019-10.csv", select=variables )
#  FP2019nov=fread( "D:/FUNPUBLICOS/nomina_2019-11.csv", select=variables )
#  FP2019dic=fread( "D:/FUNPUBLICOS/nomina_2019-12.csv", select=variables )
# 
#  FP2020ene=fread( "D:/FUNPUBLICOS/nomina_2020-01.csv", select=variables )
#  FP2020feb=fread( "D:/FUNPUBLICOS/nomina_2020-02.csv", select=variables )
#  FP2020mar=fread( "D:/FUNPUBLICOS/nomina_2020-03.csv", select=variables )
#  FP2020abr=fread( "D:/FUNPUBLICOS/nomina_2020-04.csv", select=variables )
#  FP2020may=fread( "D:/FUNPUBLICOS/nomina_2020-05.csv", select=variables )
#  FP2020jun=fread( "D:/FUNPUBLICOS/nomina_2020-06.csv", select=variables )
#  FP2020jul=fread( "D:/FUNPUBLICOS/nomina_2020-07.csv", select=variables )
#  FP2020ago=fread( "D:/FUNPUBLICOS/nomina_2020-08.csv", select=variables )
#  FP2020sep=fread( "D:/FUNPUBLICOS/nomina_2020-09.csv", select=variables )
#  FP2020oct=fread( "D:/FUNPUBLICOS/nomina_2020-10.csv", select=variables )
#  FP2020nov=fread( "D:/FUNPUBLICOS/nomina_2020-11.csv", select=variables )
#  FP2020dic=fread( "D:/FUNPUBLICOS/nomina_2020-12.csv", select=variables )
# 
#  FP2021ene=fread( "D:/FUNPUBLICOS/nomina_2021-01.csv", select=variables )
#  FP2021feb=fread( "D:/FUNPUBLICOS/nomina_2021-02.csv", select=variables )
#  FP2021mar=fread( "D:/FUNPUBLICOS/nomina_2021-03.csv", select=variables )
#  FP2021abr=fread( "D:/FUNPUBLICOS/nomina_2021-04.csv", select=variables )
#  FP2021may=fread( "D:/FUNPUBLICOS/nomina_2021-05.csv", select=variables )
#  FP2021jun=fread( "D:/FUNPUBLICOS/nomina_2021-06.csv", select=variables )
#  FP2021jul=fread( "D:/FUNPUBLICOS/nomina_2021-07.csv", select=variables )
#  FP2021ago=fread( "D:/FUNPUBLICOS/nomina_2021-08.csv", select=variables )
#  FP2021sep=fread( "D:/FUNPUBLICOS/nomina_2021-09.csv", select=variables )
#  FP2021oct=fread( "D:/FUNPUBLICOS/nomina_2021-10.csv", select=variables )
#  FP2021nov=fread( "D:/FUNPUBLICOS/nomina_2021-11.csv", select=variables )
#  FP2021dic=fread( "D:/FUNPUBLICOS/nomina_2021-12.csv", select=variables )
# 
#  FP2022ene=fread( "D:/FUNPUBLICOS/nomina_2022-01.csv", select=variables )
#  FP2022feb=fread( "D:/FUNPUBLICOS/nomina_2022-02.csv", select=variables )
#  FP2022mar=fread( "D:/FUNPUBLICOS/nomina_2022-03.csv", select=variables )
#  FP2022abr=fread( "D:/FUNPUBLICOS/nomina_2022-04.csv", select=variables )
#  FP2022may=fread( "D:/FUNPUBLICOS/nomina_2022-05.csv", select=variables )
#  FP2022jun=fread( "D:/FUNPUBLICOS/nomina_2022-06.csv", select=variables )
#  FP2022jul=fread( "D:/FUNPUBLICOS/nomina_2022-07.csv", select=variables )
#  FP2022ago=fread( "D:/FUNPUBLICOS/nomina_2022-08.csv", select=variables )
#  FP2022sep=fread( "D:/FUNPUBLICOS/nomina_2022-09.csv", select=variables )
#  FP2022oct=fread( "D:/FUNPUBLICOS/nomina_2022-10.csv", select=variables )
#  FP2022nov=fread( "D:/FUNPUBLICOS/nomina_2022-11.csv", select=variables )
#  FP2022dic=fread( "D:/FUNPUBLICOS/nomina_2022-12.csv", select=variables )
# 
#  FP2023ene=fread( "D:/FUNPUBLICOS/nomina_2023-01.csv", select=variables )
#  FP2023feb=fread( "D:/FUNPUBLICOS/nomina_2023-02.csv", select=variables )
#  FP2023mar=fread( "D:/FUNPUBLICOS/nomina_2023-03.csv", select=variables )
#  FP2023abr=fread( "D:/FUNPUBLICOS/nomina_2023-04.csv", select=variables )
#  FP2023may=fread( "D:/FUNPUBLICOS/nomina_2023-05.csv", select=variables )
#  FP2023jun=fread( "D:/FUNPUBLICOS/nomina_2023-06.csv", select=variables )
#  FP2023jul=fread( "D:/FUNPUBLICOS/nomina_2023-07.csv", select=variables )
#  FP2023ago=fread( "D:/FUNPUBLICOS/nomina_2023-08.csv", select=variables )
#  FP2023sep=fread( "D:/FUNPUBLICOS/nomina_2023-09.csv", select=variables )
#  FP2023oct=fread( "D:/FUNPUBLICOS/nomina_2023-10.csv", select=variables )
#  FP2023nov=fread( "D:/FUNPUBLICOS/nomina_2023-11.csv", select=variables )
#  FP2023dic=fread( "D:/FUNPUBLICOS/nomina_2023-12.csv", select=variables )
# 
#  FP2024ene=fread( "D:/FUNPUBLICOS/nomina_2024-01.csv", select=variables )
#  FP2024feb=fread( "D:/FUNPUBLICOS/nomina_2024-02.csv", select=variables )
#  FP2024mar=fread( "D:/FUNPUBLICOS/nomina_2024-03.csv", select=variables )
#  FP2024abr=fread( "D:/FUNPUBLICOS/nomina_2024-04.csv", select=variables )
#  FP2024may=fread( "D:/FUNPUBLICOS/nomina_2024-05.csv", select=variables )
#  FP2024jun=fread( "D:/FUNPUBLICOS/nomina_2024-06.csv", select=variables )
#  FP2024jul=fread( "D:/FUNPUBLICOS/nomina_2024-07.csv", select=variables )
#  FP2024ago=fread( "D:/FUNPUBLICOS/nomina_2024-08.csv", select=variables )
#  FP2024sep=fread( "D:/FUNPUBLICOS/nomina_2024-09.csv", select=variables )
#  FP2024oct=fread( "D:/FUNPUBLICOS/nomina_2024-10.csv", select=variables )
#  FP2024nov=fread( "D:/FUNPUBLICOS/nomina_2024-11.csv", select=variables )
#  FP2024dic=fread( "D:/FUNPUBLICOS/nomina_2024-12.csv", select=variables )
# FPcomp=bind_rows(
#    FP2015ene, FP2015feb, FP2015mar, FP2015abr, FP2015may, FP2015jun, FP2015jul, FP2015ago, FP2015sep, FP2015oct, FP2015nov, FP2015dic,
#    FP2016ene, FP2016feb, FP2016mar, FP2016abr, FP2016may, FP2016jun, FP2016jul, FP2016ago, FP2016sep, FP2016oct, FP2016nov, FP2016dic,
#    FP2017ene, FP2017feb, FP2017mar, FP2017abr, FP2017may, FP2017jun, FP2017jul, FP2017ago, FP2017sep, FP2017oct, FP2017nov, FP2017dic,
#    FP2018ene, FP2018feb, FP2018mar, FP2018abr, FP2018may, FP2018jun, FP2018jul, FP2018ago, FP2018sep, FP2018oct, FP2018nov, FP2018dic,
#    FP2019ene, FP2019feb, FP2019mar, FP2019abr, FP2019may, FP2019jun, FP2019jul, FP2019ago, FP2019sep, FP2019oct, FP2019nov, FP2019dic,
#    FP2020ene, FP2020feb, FP2020mar, FP2020abr, FP2020may, FP2020jun, FP2020jul, FP2020ago, FP2020sep, FP2020oct, FP2020nov, FP2020dic,
#    FP2021ene, FP2021feb, FP2021mar, FP2021abr, FP2021may, FP2021jun, FP2021jul, FP2021ago, FP2021sep, FP2021oct, FP2021nov, FP2021dic,
#    FP2022ene, FP2022feb, FP2022mar, FP2022abr, FP2022may, FP2022jun, FP2022jul, FP2022ago, FP2022sep, FP2022oct, FP2022nov, FP2022dic,
#    FP2023ene, FP2023feb, FP2023mar, FP2023abr, FP2023may, FP2023jun, FP2023jul, FP2023ago, FP2023sep, FP2023oct, FP2023nov, FP2023dic,
#    FP2024ene, FP2024feb, FP2024mar, FP2024abr, FP2024may, FP2024jun, FP2024jul, FP2024ago, FP2024sep, FP2024oct, FP2024nov, FP2024dic
#  )
 # FP2025mar=fread( "D:/FUNPUBLICOS/nomina_2025-03.csv" )
 # names(FP2025mar)
 # FP2025abr=fread( "D:/FUNPUBLICOS/nomina_2025-04.csv" )
 # names(FP2025abr)
 # FP2025may=fread( "D:/FUNPUBLICOS/nomina_2025-05.csv" )
 # names(FP2025may)
# library(data.table)
# 
#  variables=c("anio", "mes","descripcionEntidad" ,"codigoPersona", "sexo", "fechaIngreso",        "tipoPersonal",  "lugar","montoPresupuestado")
#  
#   FP2025ene=fread( "D:/FUNPUBLICOS/nomina_2025-01.csv", select=variables )
#   FP2025feb=fread( "D:/FUNPUBLICOS/nomina_2025-02.csv", select=variables )
#   FP2025abr=fread( "D:/FUNPUBLICOS/nomina_2025-04.csv", select=variables )
# 
#   
# # Nombres originales en el CSV
# seleccionadosV3 <- c("anho", "mes", "descripcion_entidad", "concepto",
#                      "documento", "sexo","fechaIngreso","fecha_acto", "estado","lugar", "presupuestado")
# 
#  FP2025mar=fread( "D:/FUNPUBLICOS/nomina_2025-03.csv", select=seleccionadosV3 )
# 
#  FP2025may=fread( "D:/FUNPUBLICOS/nomina_2025-05.csv", select=seleccionadosV3 )
#  FP2025jun=fread( "D:/FUNPUBLICOS/nomina_2025-06.csv", select=seleccionadosV3 )
#  FP2025jul=fread( "D:/FUNPUBLICOS/nomina_2025-07.csv", select=seleccionadosV3 )
#  #FP2025ago=fread( "D:/FUNPUBLICOS/nomina_2025-08.csv", select=seleccionadosV3 )
#  #FP2025sep=fread( "D:/FUNPUBLICOS/nomina_2025-09.csv", select=seleccionadosV3 )
#  #FP2025oct=fread( "D:/FUNPUBLICOS/nomina_2025-10.csv", select=seleccionadosV3 )
#  #FP2025nov=fread( "D:/FUNPUBLICOS/nomina_2025-11.csv", select=seleccionadosV3 )
#  #FP2025dic=fread( "D:/FUNPUBLICOS/nomina_2025-12.csv", select=seleccionadosV3 )
# 
#  newnames <- c("anio", "mes", "descripcionEntidad", "conceptoGasto",
#                  "codigoPersona", "sexo", "fechaIngreso",
#                  "tipoPersonal", "lugar", "montoPresupuestado")
#  # Diccionario de renombrado: nombres nuevos = nombres originales
#  names(FP2025mar) <- newnames
#  names(FP2025may) <- newnames
#  names(FP2025jun) <- newnames
#  names(FP2025jul) <- newnames
# str(FP2025ene$fechaIngreso)
# str(FP2025mar$fechaIngreso)
# library(dplyr)
# library(lubridate)
# 
# # Función para normalizar fechas
# normalizar_fecha <- function(df) {
#   df %>%
#     mutate(
#       fechaIngreso = case_when(
#         grepl("-", fechaIngreso) ~ as.Date(fechaIngreso),     # "2016-04-11"
#         grepl("/", fechaIngreso) ~ as.Date(ymd_hms(fechaIngreso)), # "2021/11/09 00:00:00.000"
#         TRUE ~ NA_Date_
#       )
#     )
# }
# 
# # Aplicar a cada base
# FP2025ene <- normalizar_fecha(FP2025ene)
# FP2025feb <- normalizar_fecha(FP2025feb)
# FP2025mar <- normalizar_fecha(FP2025mar)
# FP2025abr <- normalizar_fecha(FP2025abr)
# FP2025may <- normalizar_fecha(FP2025may)
# FP2025jun <- normalizar_fecha(FP2025jun)
# FP2025jul <- normalizar_fecha(FP2025jul)
# FPcomp2=bind_rows(
#    FP2025ene,
#    FP2025feb,
#    FP2025mar,
#    FP2025abr,
#    FP2025may,
#    FP2025jun,
#    FP2025jul
#    #FP2025ago,
#    #FP2025sep,
#    #FP2025oct,
#    #FP2025nov,
#    #FP2025dic
#  )
# table(FPcomp2$anio, FPcomp2$mes)
# library(dplyr)
# library(lubridate)
# 
# # Normalizar formatos
# FPcomp <- normalizar_fecha(FPcomp)
# FPcomp2 <- normalizar_fecha(FPcomp2)
# str(FPcomp$fechaIngreso)
# str(FPcomp2$fechaIngreso)
# Unir
# FPcomp3 <- bind_rows(FPcomp, FPcomp2)
# library(data.table)
# 
#  setDT(FPcomp3)   #asegura que FP sea data.table
# 
#  FPcompsd <- FPcomp3[
#    , .(salario = sum(montoPresupuestado, na.rm = TRUE)),
#    by = .(anio, mes, codigoPersona, sexo, descripcionEntidad, fechaIngreso, tipoPersonal)
#  ][
#    , fecha := as.IDate(paste0(anio, "-", sprintf("%02d", mes), "-01"))
#  ]
# #Una sola vez: convertir tu RDS a .qs
#  library(qs)
#  qs::qsave(
#    FPcompsd, "D:/FUNPUBLICOS/nominaFPcomp.qs",
#    preset = "high", nthreads = parallel::detectCores()
#  )
#  rm(FP); gc()
# #Carga diaria (rápida y multihilo)
# system.time(
#     FP <- qs::qread("D:/FUNPUBLICOS/nominaFPcomp.qs",
#                 nthreads = parallel::detectCores())
# )
# table(FP$anio, FP$mes)

5.2 Obtener la base final de analisis

Añadir valores del salario minimo

# algunos filtros necesarios
# 
# nrow(FP)
# FPfil <- FP %>% 
#   filter(
#     tipoPersonal %in% c("CON", "PER", "COM"),      #conservar solo esos valores
#     salario > 0,
#     !is.na(salario), 
#     !is.na(sexo)                            #excluir valores NA
#   ) 
# 
# nrow(FPfil)
# library(tibble)
# library(lubridate)
# 
# sml_data <- tribble(
#   ~year, ~mes, ~sml,
#   2015, 7, 644350,  # SMMLV en julio 2015 :contentReference[oaicite:1]{index=1}
#   2016, 7, 689455,  # julio 2016 :contentReference[oaicite:2]{index=2}
#   2017, 7, 737717,  # julio 2017 :contentReference[oaicite:3]{index=3}
#   2018, 7, 781242,  # julio 2018 :contentReference[oaicite:4]{index=4}
#   2019, 7, 828116,  # julio 2019 :contentReference[oaicite:5]{index=5}
#   2020, 7, 877803,  # julio 2020 :contentReference[oaicite:6]{index=6}
#   2021, 7, 908526,  # julio 2021 :contentReference[oaicite:7]{index=7}
#   2022, 7, 1000000, # julio 2022 :contentReference[oaicite:8]{index=8}
#   2023, 7, 1160000, # julio 2023 :contentReference[oaicite:9]{index=9}
#   2024, 7, 1300000, # julio 2024 :contentReference[oaicite:10]{index=10}
#   2025, 7, 1423500  # julio 2025 :contentReference[oaicite:11]{index=11}
# ) %>%
#   mutate(fecha = make_date(year, mes, 1))
# 
# sml_data
# # agregar el valor del sml a cada fecha de la base FPfil usando como llave la fecha
# library(data.table)
# 
# setDT(FPfil)
# setDT(sml_data)
# 
# FPfil[sml_data, on = "fecha", sml := i.sml]

Agregar la fecha de nacimiento y el sexo a partir de basepolicia_desdup_nroced,

# # cargar el dato de la policia nacional basepolicia_desdup_nroced.csv
# 
# datospol <- fread("D:/FUNPUBLICOS/basepolicia_desdup_nroced.csv", encoding = "UTF-8")
# names(datospol)
# primero unificar el nombre de la llave 
# 
# # Aseguramos que FPfil es data.table
# setDT(FPfil)
# datospolfil <- datospol %>% 
#   select("nroced", "sexo", "fechanacim")
# datospolfil
# library(dplyr)
# names(FPfil)
# library(dplyr)
# 
# FPfil <- FPfil %>% 
#   rename(
#     nroced    = codigoPersona,
#     sexo_orig = sexo
#   )
# Merge por la llave "cedula"
# 
# 

# FPfil[,  nroced := as.character(nroced)]
# datospolfil[, nroced := as.character(nroced)]
# 
# FPfilc <- merge(FPfil, datospolfil,
#                by = "nroced",
#                all.x = TRUE)
# names(FPfilc)
# library(data.table)
# setDT(FPfilc)
# 
# FPfilc[, fechanacim := {
#   ref <- first(na.omit(fechanacim))
#   if (length(ref) == 0) fechanacim else fifelse(is.na(fechanacim), ref, fechanacim)
# }, by = nroced]
# 
# library(data.table)
# setDT(FPfilc)
# 
# # Convertir a Date base R
# FPfilc[, `:=`(
#   fecha      = as.Date(fecha),
#   fechanacim = as.Date(fechanacim)
# )]
# 
# # Calcular edad y tramos
# FPfilc[, edad := as.integer(floor((fecha - fechanacim) / 365.25))]
# FPfilc[, edad_tramo := cut(
#   edad,
#   breaks = c(seq(0, 70, by = 5), Inf),
#   labels = c("0-4","5-9","10-14","15-19","20-24","25-29",
#              "30-34","35-39","40-44","45-49","50-54",
#              "55-59","60-64","65-69","70+"),
#   right = FALSE
# )]
# hist(FPfilc$edad)

Eliminar los valores de sexo y edad faltantes

# library(data.table)
# setDT(FPfilc)
# 
# FPfilc <- FPfilc[!is.na(sexo_orig) & !is.na(edad)]
# names(FPfilc)
# FPfilc <- FPfilc[sexo_orig %in% c("M", "F")]
# FPfilc[, sexo := fifelse(sexo_orig == "M", "Hombres", "Mujeres")]
# table(FPfilc$sexo)
# FPfilc <- FPfilc[edad >= 18 & edad <= 85]
# 
# table(FPfilc$edad, FPfilc$sexo)

Descripcion entidad

# FPfilc[, desc_low := iconv(descripcionEntidad,
#                            from = "",      # intenta detectar
#                            to   = "UTF-8", # convertir a UTF-8
#                            sub  = " ")]    # reemplaza inválidos
# FPfilc[, desc_low := tolower(desc_low)]
# FPfilc[, grupo := fcase(
#   isTRUE(grepl("defensa nacional|fuerzas armadas|militar", desc_low)) ~ "Militares",
#   isTRUE(grepl("policia|interior", desc_low)) ~ "Policías",
#   isTRUE(grepl("educacion|educación|universidad|instituto superior|colegio", desc_low)) ~ "Maestros",
#   isTRUE(grepl("salud|hospital|sanitaria|vigilancia sanitaria|bienestar", desc_low)) ~ "Médicos",
#   isTRUE(grepl("justicia|corte|ministerio público|defensoria|congreso|senadores|diputados|magistratura", desc_low)) ~ "Funcionarios Públicos - Justicia",
#   isTRUE(grepl("presidencia|vicepresidencia|hacienda|economía|finanzas|contraloría", desc_low)) ~ "Funcionarios Públicos - Gobierno Central",
#   default = "Otros"
# )]
# 
# 
# table(FPfilc$grupo)
# library(dplyr)
# 
# # Ver clase y primeros valores
# glimpse(FPfilc$fechaIngreso)
# summary(FPfilc$fechaIngreso)
# 
# # Cantidad de valores faltantes
# sum(is.na(FPfilc$fechaIngreso))
# mean(is.na(FPfilc$fechaIngreso))  # proporción de NA
# library(lubridate)
# 
# FPfilc[, fechaIngreso := as.Date(fechaIngreso)]
# FPfilc[, antiguedad := floor(interval(fechaIngreso, fecha) / years(1))]
# 
# 
# FPfilc[antiguedad < 0, antiguedad := 0L]
# summary(FPfilc$antiguedad)
# hist(FPfilc$antiguedad, breaks = 30, main = "Distribución de antigüedad", xlab = "Años")

5.3 Guardar la base final resultante

# library(arrow)
# write_parquet(FPfilc, "G:/Mi unidad/FUNPUBLICOS/FPfilc_final.parquet")
# names(FPfilc)

6 Resultados

6.1 Evolucion de la cantidad de funcionarios a lo largo del tiempo

library(data.table)
system.time(
  FPdb <- as.data.table(arrow::read_parquet("G:/Mi unidad/FUNPUBLICOS/FPfilc_final.parquet"))
)
##    user  system elapsed 
##   15.22    3.14   20.67
library(dplyr)

tab1 <- FPdb %>% 
  filter(
    tipoPersonal %in% c("CON", "PER"),      #conservar solo esos valores
    anio > 2017,
    salario > 0,
    !is.na(sexo)                            #excluir valores NA
  ) %>% 
  group_by(fecha, anio, sexo) %>% 
  summarise(
    cantidad = n(),
    .groups = "drop"
  )

tab1
## # A tibble: 174 × 4
##    fecha       anio sexo    cantidad
##    <date>     <int> <chr>      <int>
##  1 2018-01-01  2018 Hombres   109415
##  2 2018-01-01  2018 Mujeres   120010
##  3 2018-02-01  2018 Hombres   111033
##  4 2018-02-01  2018 Mujeres   121475
##  5 2018-03-01  2018 Hombres   111516
##  6 2018-03-01  2018 Mujeres   121756
##  7 2018-04-01  2018 Hombres   111726
##  8 2018-04-01  2018 Mujeres   122081
##  9 2018-05-01  2018 Hombres   111821
## 10 2018-05-01  2018 Mujeres   122296
## # ℹ 164 more rows
library(ggplot2)
library(dplyr)
library(scales)

# Crear dataframe con intervalos de años
anios <- data.frame(
  xmin = as.Date(paste0(unique(tab1$anio), "-01-01")),
  xmax = as.Date(paste0(unique(tab1$anio), "-12-31")),
  anio = unique(tab1$anio)
)

# Alternar color de sombreado por año
anios$fill <- rep(c("gray90", "white"), length.out = nrow(anios))

# Punto medio de cada año
anios$xmid <- anios$xmin + (anios$xmax - anios$xmin) / 2

g1 <- ggplot(tab1, aes(x = fecha, y = cantidad, color = sexo, group = sexo)) +
  # Fondo sombreado por año
  geom_rect(
    data = anios,
    aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf, fill = fill),
    inherit.aes = FALSE, alpha = 0.3
  ) +
  scale_fill_identity() +
  geom_text(
    data = anios,
    aes(x = xmid, y = 160000, label = anio),
    inherit.aes = FALSE,
    vjust = -0.5, fontface = "bold", size = 3.5
  ) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 2.5, alpha = 0.8) +
  scale_color_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#e377c2")) +
  labs(
    x = "Fecha",
    y = "Cantidad de funcionarios",
    color = "Sexo",
    title = "Evolución de la cantidad de funcionarios por sexo"
    #subtitle = "Áreas sombreadas y etiquetas por año"
  ) +
  scale_y_continuous(limits = c(100000, 150000), labels = comma) +
  scale_x_date(
    breaks = unique(tab1$fecha),
    labels = date_format("%Y-%m")
  ) +
  theme_minimal(base_size = 13) +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1, size = 8),
    legend.position = "top"
  )

g1

library(dplyr)

tab2 <- FPdb %>% 
  group_by(fecha, anio, sexo) %>% 
  filter(tipoPersonal!= "COM"  & anio>2017 ) %>% 
  summarize(salariomed = median(salario, na.rm = TRUE),
    .groups = "drop"
  )
tab2
## # A tibble: 174 × 4
##    fecha       anio sexo    salariomed
##    <date>     <int> <chr>        <dbl>
##  1 2018-01-01  2018 Hombres   5000936 
##  2 2018-01-01  2018 Mujeres   4654990 
##  3 2018-02-01  2018 Hombres   5442207 
##  4 2018-02-01  2018 Mujeres   4700000 
##  5 2018-03-01  2018 Hombres   5055236.
##  6 2018-03-01  2018 Mujeres   4682760.
##  7 2018-04-01  2018 Hombres   5052254 
##  8 2018-04-01  2018 Mujeres   4684000 
##  9 2018-05-01  2018 Hombres   5008611 
## 10 2018-05-01  2018 Mujeres   4664598 
## # ℹ 164 more rows
library(data.table)
setDT(FPdb)

tab2 <- FPdb[
  tipoPersonal != "COM" & anio > 2017,
  .(salariomed = median(salario, na.rm = TRUE)),
  by = .(fecha, anio, sexo)
]


library(ggplot2)
library(dplyr)
library(scales)

# Crear dataframe con intervalos de años
anios <- data.frame(
  xmin = as.Date(paste0(unique(tab1$anio), "-01-01")),
  xmax = as.Date(paste0(unique(tab1$anio), "-12-31")),
  anio = unique(tab1$anio)
)

# Alternar color de sombreado por año
anios$fill <- rep(c("gray90", "white"), length.out = nrow(anios))

# Punto medio de cada año
anios$xmid <- anios$xmin + (anios$xmax - anios$xmin) / 2

g1 <- ggplot(tab2, aes(x = fecha, y = salariomed, color = sexo, group = sexo)) +
  # Fondo sombreado por año
  geom_rect(
    data = anios,
    aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf, fill = fill),
    inherit.aes = FALSE, alpha = 0.3
  ) +
  scale_fill_identity() +
  # Etiqueta con el año
  geom_text(
    data = anios,
    aes(x = xmid, y = max(tab1$salario_promedio, na.rm = TRUE) * 1.02, label = anio),
    inherit.aes = FALSE,
    vjust = 0, fontface = "bold", size = 3.5
  ) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 2.5, alpha = 0.8) +
  scale_color_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#e377c2")) +
  labs(
    x = "Fecha",
    y = "Salario promedio (Gs.)",
    color = "Sexo",
    title = "Evolución del salario promedio por sexo"
  ) +
  scale_y_continuous(labels = comma) +
  scale_x_date(
    breaks = unique(tab1$fecha),
    labels = date_format("%Y-%m")
  ) +
  theme_minimal(base_size = 13) +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1, size = 8),
    legend.position = "top"
  )

g1

6.2 Trayectorias salariales por edad

tab_trayectorias <- FPdb %>%
  filter(edad >= 18, edad <= 80, salario > 0) %>%
  group_by(edad, sexo) %>%
  summarize(
    salario_trim = mean(salario, trim = 0.05, na.rm = TRUE),
    n = n(),  # cantidad de observaciones
    .groups = "drop"
  ) %>%
  filter(n > 50)   # elimina edades con menos de 50 observaciones
g_trayectorias <- ggplot(tab_trayectorias, aes(x = edad, y = salario_trim, color = sexo)) +
  geom_point(alpha = 0.5, size = 1.8) +
  geom_smooth(method = "loess", span = 0.4, linewidth = 1.2, se = FALSE) +
  scale_color_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#e377c2")) +
  labs(
    title = "Trayectorias salariales por edad",
    subtitle = "Media recortada al 95% (sin valores atípicos extremos)",
    x = "Edad",
    y = "Salario promedio (Gs.)",
    color = "Sexo"
  ) +
  scale_y_continuous(labels = scales::comma) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "top")
g_trayectorias

6.3 Trayectorias salariales por edad segun tipo de contrato

library(data.table)
setDT(FPdb)

tab_trayectorias_tc <- FPdb[edad >= 18 & edad <= 80 & salario > 0,
  .(salario_trim = mean(salario, trim = 0.05, na.rm = TRUE),
    n = .N),
  by = .(edad, tipoPersonal)
][n > 50]   # opcional
library(ggplot2)
library(scales)

g_tc <- ggplot(tab_trayectorias_tc, aes(x = edad, y = salario_trim, color = tipoPersonal)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2, alpha = 0.6) +
  labs(
    title = "Trayectorias salariales por edad según tipo de contrato",
    subtitle = "Media recortada al 95% (trimmed mean)",
    x = "Edad",
    y = "Salario promedio (Gs.)",
    color = "Tipo de contrato"
  ) +
  scale_y_continuous(labels = comma) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "top",
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 11)
  )

g_tc

6.4 Trayectorias salariales por años de antiguedad

library(dplyr)

tab_trayectorias_ant <- FPdb %>%
  filter(antiguedad >= 0, antiguedad <= 40, salario > 0) %>%
  group_by(antiguedad, sexo) %>%
  summarize(
    salario_trim = mean(salario, trim = 0.05, na.rm = TRUE),
    n = n(),
    .groups = "drop"
  ) %>%
  filter(n > 50)   # opcional: eliminar antigüedades con pocos registros
library(ggplot2)
library(scales)

g_antiguedad <- ggplot(tab_trayectorias_ant, aes(x = antiguedad, y = salario_trim, color = sexo)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2, alpha = 0.6) +
  scale_color_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#e377c2")) +
  labs(
    title = "Trayectorias salariales por antigüedad",
    subtitle = "Media recortada al 95% (trimmed mean)",
    x = "Años de antigüedad",
    y = "Salario promedio (Gs.)",
    color = "Sexo"
  ) +
  scale_y_continuous(labels = comma) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "top",
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 11)
  )

g_antiguedad

7 Conclusiones