true

Introducción

texto

Datos

Los dastos provienen de https://datos.hacienda.gov.py/data/nomina/descargas

Procedimiento para la gestión de datos con R

Acceso y descarga de datos

# librerias a usar
# 
# install.packages("dplyr")
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.3.3
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(stringr)
## Warning: package 'stringr' was built under R version 4.3.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.3.3
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:lubridate':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
# # Descarga de los datos desde https://datos.hacienda.gov.py/odmh-core/rest/nomina/datos/nomina_2013-01.zip
# 
# download.file("https://datos.hacienda.gov.py/odmh-core/rest/nomina/datos/nomina_2013-01.zip", destfile = "G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01.zip")
# 
# # descomprimir el archivo
# 
# unzip("G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01.zip", exdir = "G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01")

Cargar los datos con las variables seleccionadas

Cargar los 24 meses de datos usando data.table

# Cargar librería
library(readr)


# Leer CSV con solo esos campos y especificando la codificación con `locale`
ruta_csv <- "I:/Mi unidad/articuloMuestreo/nomina_2025-04.csv"
fp <- read_csv(ruta_csv, col_types = cols(), locale = locale(encoding = "Latin1"))
# Mostrar nombres de columnas para confirmar
print(colnames(fp))
##  [1] "anio"                         "mes"                         
##  [3] "codigoNivel"                  "descripcionNivel"            
##  [5] "codigoEntidad"                "descripcionEntidad"          
##  [7] "codigoPrograma"               "descripcionPrograma"         
##  [9] "codigoSubprograma"            "descripcionSubprograma"      
## [11] "codigoProyecto"               "descripcionProyecto"         
## [13] "codigoUnidadResponsable"      "descripcionUnidadResponsable"
## [15] "codigoObjetoGasto"            "conceptoGasto"               
## [17] "fuenteFinanciamiento"         "linea"                       
## [19] "codigoPersona"                "nombres"                     
## [21] "apellidos"                    "sexo"                        
## [23] "discapacidad"                 "codigoCategoria"             
## [25] "cargo"                        "horasCatedra"                
## [27] "fechaIngreso"                 "tipoPersonal"                
## [29] "lugar"                        "montoPresupuestado"          
## [31] "montoDevengado"               "mesCorte"                    
## [33] "anioCorte"                    "fechaCorte"                  
## [35] "nivelAbr"                     "entidadAbr"                  
## [37] "programaAbr"                  "subprogramaAbr"              
## [39] "proyectoAbr"                  "unidadAbr"
# Definir campos de interés
campodeinteres <- c(
  "anio",
  "mes",
  "descripcionNivel",
  "descripcionEntidad",
  "sexo",
  "codigoPersona",
  "tipoPersonal",
  "montoPresupuestado"
)
# Cargar librería dplyr para realizar operaciones de agrupación
library(dplyr)

# Filtrar solo las columnas de interés
fpfil <- fp[, campodeinteres]

# Calcular el salario total por códigoPersona, anio y mes
fppers <- fpfil %>%
  group_by(codigoPersona,sexo, descripcionNivel,descripcionEntidad, anio, mes) %>%
  summarise(salario_total = sum(montoPresupuestado, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'codigoPersona', 'sexo',
## 'descripcionNivel', 'descripcionEntidad', 'anio'. You can override using the
## `.groups` argument.
# Mostrar las primeras filas del resultado
head(fppers)
## # A tibble: 6 × 7
##   codigoPersona  sexo  descripcionNivel           descripcionEntidad  anio   mes
##   <chr>          <chr> <chr>                      <chr>              <dbl> <dbl>
## 1 00E4D153DFF8CD F     23-ENTES AUTÓNOMOS Y AUTÁ… 032-SECRETARIA NA…  2025     4
## 2 01361698BFAE2B F     12-PODER EJECUTIVO         001-PRESIDENCIA D…  2025     4
## 3 01ADA3880BB1A1 M     12-PODER EJECUTIVO         001-PRESIDENCIA D…  2025     4
## 4 01EC7A3035BB31 M     23-ENTES AUTÓNOMOS Y AUTÁ… 032-SECRETARIA NA…  2025     4
## 5 029895AECA69C7 M     12-PODER EJECUTIVO         001-PRESIDENCIA D…  2025     4
## 6 02FAC3C824ACCD M     12-PODER EJECUTIVO         001-PRESIDENCIA D…  2025     4
## # ℹ 1 more variable: salario_total <dbl>
# Calcular la proporción de mujeres en la función pública
# 
proporcion_mujeres <- fppers %>%
  filter(sexo == "F") %>%
  summarise(proporcion = n() / nrow(fppers))  # Proporción de mujeres

# Calcular el salario total promedio mensual
salario_promedio_mensual <- fppers %>%
  summarise(salario_promedio = mean(salario_total, na.rm = TRUE))  # Promedio de salario total mensual

# Calcular el tamaño de la población (total de registros)
tamano_poblacion <- nrow(fppers)

# Crear una tabla con los resultados
tabla_parametros <- tibble(
  Proporcion_mujeres = proporcion_mujeres$proporcion,
  Salario_promedio_mensual = salario_promedio_mensual$salario_promedio,
  Tamano_poblacion = tamano_poblacion
)

# Mostrar la tabla
tabla_parametros
## # A tibble: 1 × 3
##   Proporcion_mujeres Salario_promedio_mensual Tamano_poblacion
##                <dbl>                    <dbl>            <int>
## 1              0.524                 7077586.           279152
# Cargar la librería xtable para generar código LaTeX
library(xtable)
## Warning: package 'xtable' was built under R version 4.3.3
# Crear la tabla de parámetros (ya calculada previamente)
tabla_parametros <- tibble(
  Proporcion_mujeres = proporcion_mujeres$proporcion,
  Salario_promedio_mensual = salario_promedio_mensual$salario_promedio,
  Tamano_poblacion = tamano_poblacion
)

# Generar el código LaTeX de la tabla
tabla_latex <- xtable(tabla_parametros, caption = "Parámetros Poblacionales")

# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex), file = "I:/Mi unidad/articuloMuestreo/tabla_parametros.tex")

# Mostrar el código LaTeX
print(tabla_latex)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:37 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrr}
##   \hline
##  & Proporcion\_mujeres & Salario\_promedio\_mensual & Tamano\_poblacion \\ 
##   \hline
## 1 & 0.52 & 7077586.11 & 279152 \\ 
##    \hline
## \end{tabular}
## \caption{Parámetros Poblacionales} 
## \end{table}

Cálculo del tamaño minimo de muestra para estimar la proporcion

# Definir los parámetros
nivel_confianza <- 0.95
z <- qnorm(1 - (1 - nivel_confianza) / 2)  # Valor crítico Z para un nivel de confianza del 95%
p <- proporcion_mujeres$proporcion  # Proporción de mujeres calculada previamente
E <- 0.05  # Margen de error (5%)

# Calcular el tamaño muestral mínimo (n)
n_min <- (z^2 * p * (1 - p)) / E^2
n_min <- ceiling(n_min)  # Redondear al siguiente número entero

# Crear una tabla con los resultados
tabla_tamano_muestral <- tibble(
  Nivel_confianza = nivel_confianza,
  Valor_Z = z,
  Proporcion_mujeres = p,
  Margen_error = E,
  Tamano_muestral_minimo = n_min
)

# Mostrar la tabla
tabla_tamano_muestral
## # A tibble: 1 × 5
##   Nivel_confianza Valor_Z Proporcion_mujeres Margen_error Tamano_muestral_minimo
##             <dbl>   <dbl>              <dbl>        <dbl>                  <dbl>
## 1            0.95    1.96              0.524         0.05                    384
# Generar la tabla LaTeX con los resultados del tamaño muestral
tabla_latex_muestra <- xtable(tabla_tamano_muestral, caption = "Cálculo del Tamaño Muestral para Estimar la Proporción de Mujeres")

# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex_muestra), file = "I:/Mi unidad/articuloMuestreo/tabla_tamano_muestral.tex")

# Mostrar la tabla LaTeX en la consola
print(tabla_latex_muestra)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:37 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
##   \hline
##  & Nivel\_confianza & Valor\_Z & Proporcion\_mujeres & Margen\_error & Tamano\_muestral\_minimo \\ 
##   \hline
## 1 & 0.95 & 1.96 & 0.52 & 0.05 & 384.00 \\ 
##    \hline
## \end{tabular}
## \caption{Cálculo del Tamaño Muestral para Estimar la Proporción de Mujeres} 
## \end{table}

Cálculo del tamaño minimo de muestra para estimar la media poblacional

# Definir los parámetros
nivel_confianza <- 0.95
z <- qnorm(1 - (1 - nivel_confianza) / 2)  # Valor crítico Z para un nivel de confianza del 95%
sigma <- 2000000  # Suponiendo una desviación estándar de 100,000 Gs (este valor es un ejemplo, puedes usar otro valor estimado)
E <- 200000  # Margen de error de 200,000 Gs

# Calcular el tamaño muestral mínimo (n) para la media
n_min_media <- (z^2 * sigma^2) / E^2
n_min_media <- ceiling(n_min_media)  # Redondear al siguiente número entero

# Crear una tabla con los resultados
tabla_tamano_muestral_media <- tibble(
  Nivel_confianza = nivel_confianza,
  Valor_Z = z,
  Desviacion_estandar = sigma,
  Margen_error = E,
  Tamano_muestral_minimo = n_min_media
)

# Mostrar la tabla
tabla_tamano_muestral_media
## # A tibble: 1 × 5
##   Nivel_confianza Valor_Z Desviacion_estandar Margen_error
##             <dbl>   <dbl>               <dbl>        <dbl>
## 1            0.95    1.96             2000000       200000
## # ℹ 1 more variable: Tamano_muestral_minimo <dbl>
# Generar la tabla LaTeX con los resultados del tamaño muestral
tabla_latex_media <- xtable(tabla_tamano_muestral_media, caption = "Cálculo del Tamaño Muestral para Estimar la Media Poblacional con Error de Estimación de 200,000 Gs")

# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex_media), file = "I:/Mi unidad/articuloMuestreo/tabla_tamano_muestral_media_200000gs.tex")

# Mostrar la tabla LaTeX en la consola
print(tabla_latex_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
##   \hline
##  & Nivel\_confianza & Valor\_Z & Desviacion\_estandar & Margen\_error & Tamano\_muestral\_minimo \\ 
##   \hline
## 1 & 0.95 & 1.96 & 2000000.00 & 200000.00 & 385.00 \\ 
##    \hline
## \end{tabular}
## \caption{Cálculo del Tamaño Muestral para Estimar la Media Poblacional con Error de Estimación de 200,000 Gs} 
## \end{table}

# Definir el tamaño muestral mínimo para la proporción (calculado previamente)
n_min_proporcion <- n_min  # Este valor proviene del cálculo del tamaño muestral para la proporción

# Paso 1: Seleccionar aleatoriamente 5 niveles de 'descripcionEntidad'
set.seed(123)  # Fijar la semilla para reproducibilidad
niveles_seleccionados <- sample(unique(fppers$descripcionEntidad), 5)

# Paso 2: Inicializar una lista para almacenar los casos seleccionados
muestra_seleccionada <- data.frame()

# Paso 3: Para cada nivel seleccionado, tomar los casos de manera proporcional
# Primero, dividir el tamaño muestral entre los 5 niveles seleccionados
casos_por_nivel <- rep(floor(n_min_proporcion / 5), 5)  # Dividir el tamaño muestral de manera equitativa

# Si el número total de casos seleccionados es menor que el tamaño muestral mínimo, ajustar el último nivel
casos_por_nivel[5] <- casos_por_nivel[5] + (n_min_proporcion - sum(casos_por_nivel))

# Paso 4: Seleccionar los primeros 'casos_por_nivel[i]' casos dentro de cada nivel
for (i in 1:length(niveles_seleccionados)) {
  nivel <- niveles_seleccionados[i]
  
  # Filtrar los datos para este nivel
  casos_nivel <- fppers %>% filter(descripcionEntidad == nivel)
  
  # Tomar los primeros 'casos_por_nivel[i]' casos
  muestra_nivel <- head(casos_nivel, casos_por_nivel[i])
  
  # Agregar la muestra al dataframe de la muestra seleccionada
  muestra_seleccionada <- rbind(muestra_seleccionada, muestra_nivel)
}

# Paso 5: Estimar la proporción de mujeres en la muestra seleccionada
proporcion_mujeres_muestra <- sum(muestra_seleccionada$sexo == "F") / nrow(muestra_seleccionada)

# Mostrar los resultados de la proporción de mujeres en la muestra
proporcion_mujeres_muestra
## [1] 0.4154303
# Mostrar la muestra seleccionada
head(muestra_seleccionada)
## # A tibble: 6 × 7
##   codigoPersona sexo  descripcionNivel     descripcionEntidad       anio   mes
##   <chr>         <chr> <chr>                <chr>                   <dbl> <dbl>
## 1 1003432       M     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## 2 1003520       F     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## 3 1003874       M     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## 4 1004786       F     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## 5 1017322       M     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## 6 1017918       M     11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS  2025     4
## # ℹ 1 more variable: salario_total <dbl>
# Crear una tabla de resumen con la cantidad de casos, la proporción de mujeres y el promedio de montoPresupuestado
tabla_resumen <- muestra_seleccionada %>%
  group_by(descripcionEntidad) %>%
  summarise(
    Total_Casos = n(),
    Mujeres = sum(sexo == "F"),
    Proporcion_Mujeres = Mujeres / Total_Casos,
    Promedio_Monto = mean(salario_total, na.rm = TRUE)
  ) %>%
  arrange(desc(Proporcion_Mujeres))  # Ordenar por la proporción de mujeres

tabla_resumen
## # A tibble: 5 × 5
##   descripcionEntidad       Total_Casos Mujeres Proporcion_Mujeres Promedio_Monto
##   <chr>                          <int>   <int>              <dbl>          <dbl>
## 1 001-CORTE SUPREMA DE JU…          76      42              0.553       7960050.
## 2 031-AUTORIDAD REGULADOR…          29      12              0.414      10067287 
## 3 004-CONSEJO DE LA MAGIS…          76      30              0.395       8838864.
## 4 039-DIRECCIÓN NACIONAL …          80      30              0.375       7196092.
## 5 003-CÁMARA DE DIPUTADOS           76      26              0.342      10330304.
# Generar la tabla LaTeX
tabla_latex_resumen <- xtable(tabla_resumen, caption = "Resumen de la Muestra Seleccionada por Conveniencia")

# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen), file = "I:/Mi unidad/articuloMuestreo/tabla_resumen_muestra.tex")

# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rlrrrr}
##   \hline
##  & descripcionEntidad & Total\_Casos & Mujeres & Proporcion\_Mujeres & Promedio\_Monto \\ 
##   \hline
## 1 & 001-CORTE SUPREMA DE JUSTICIA &  76 &  42 & 0.55 & 7960049.58 \\ 
##   2 & 031-AUTORIDAD REGULADORA RADIOLÓGICA Y NUCLEAR &  29 &  12 & 0.41 & 10067287.00 \\ 
##   3 & 004-CONSEJO DE LA MAGISTRATURA &  76 &  30 & 0.39 & 8838863.88 \\ 
##   4 & 039-DIRECCIÓN NACIONAL DE MIGRACIONES &  80 &  30 & 0.38 & 7196091.84 \\ 
##   5 & 003-CÁMARA DE DIPUTADOS &  76 &  26 & 0.34 & 10330303.95 \\ 
##    \hline
## \end{tabular}
## \caption{Resumen de la Muestra Seleccionada por Conveniencia} 
## \end{table}

Estimación de la media poblacional

# Calcular el promedio muestral de montoPresupuestado
promedio_muestral <- mean(muestra_seleccionada$salario_total, na.rm = TRUE)

# Calcular la desviación estándar muestral
desviacion_muestral <- sd(muestra_seleccionada$salario_total, na.rm = TRUE)

# Asumir o calcular el promedio poblacional (si no está calculado, usa un valor estimado)
# Suponiendo que el promedio poblacional se conoce o se ha calculado previamente
promedio_poblacional <- mean(fppers$salario_total, na.rm = TRUE)  # Promedio de toda la población

# Calcular el tamaño de la muestra
tamano_muestra <- nrow(muestra_seleccionada)

# Calcular el tamaño de la población (total de registros en la población completa)
tamano_poblacion <- nrow(fppers)

# Crear la tabla de resumen
tabla_resumen_media <- tibble(
  Promedio_Muestral = promedio_muestral,
  Promedio_Poblacional = promedio_poblacional,
  Desviacion_Estandar_Muestral = desviacion_muestral,
  Tamano_Muestra = tamano_muestra,
  Tamano_Poblacion = tamano_poblacion
)
tabla_resumen_media
## # A tibble: 1 × 5
##   Promedio_Muestral Promedio_Poblacional Desviacion_Estandar_Mu…¹ Tamano_Muestra
##               <dbl>                <dbl>                    <dbl>          <int>
## 1          8692757.             7077586.                 6831918.            337
## # ℹ abbreviated name: ¹​Desviacion_Estandar_Muestral
## # ℹ 1 more variable: Tamano_Poblacion <int>
# Generar la tabla LaTeX
tabla_latex_resumen_media <- xtable(tabla_resumen_media, caption = "Resumen de la Estimación de la Media Poblacional")

# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen_media), file = "tabla_resumen_media_comparacion.tex")

# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
##   \hline
##  & Promedio\_Muestral & Promedio\_Poblacional & Desviacion\_Estandar\_Muestral & Tamano\_Muestra & Tamano\_Poblacion \\ 
##   \hline
## 1 & 8692757.25 & 7077586.11 & 6831918.44 & 337 & 279152 \\ 
##    \hline
## \end{tabular}
## \caption{Resumen de la Estimación de la Media Poblacional} 
## \end{table}
# Generar la tabla LaTeX
tabla_latex_resumen_media <- xtable(tabla_resumen_media, caption = "Resumen de la Estimación de la Media Poblacional")

# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen_media), file = "tabla_resumen_media.tex")

# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
##   \hline
##  & Promedio\_Muestral & Promedio\_Poblacional & Desviacion\_Estandar\_Muestral & Tamano\_Muestra & Tamano\_Poblacion \\ 
##   \hline
## 1 & 8692757.25 & 7077586.11 & 6831918.44 & 337 & 279152 \\ 
##    \hline
## \end{tabular}
## \caption{Resumen de la Estimación de la Media Poblacional} 
## \end{table}

Replica del muestreo 10.000 vesces y dibujar la distribucipón de la estimacion de la proporcion

## ------------------------------------------------------------------
## Réplica del muestreo 10 000 veces y distribución de las estimaciones
## ------------------------------------------------------------------

library(purrr)      # para map_dfr
## Warning: package 'purrr' was built under R version 4.3.3
## 
## Attaching package: 'purrr'
## The following object is masked from 'package:data.table':
## 
##     transpose
library(ggplot2)    # para las gráficas

n_replicaciones    <- 1000         # número de réplicas
prop_est           <- numeric(n_replicaciones)
media_est          <- numeric(n_replicaciones)

set.seed(123)  # reproducibilidad

for (i in seq_len(n_replicaciones)) {

  # 1. Seleccionar cinco niveles de 'descripcionEntidad'
  niveles_i <- sample(unique(fppers$descripcionEntidad), 5)

  # 2. Definir el número de casos por nivel (muestreo por conveniencia)
  casos_i <- rep(floor(n_min_proporcion / 5), 5)
  casos_i[5] <- casos_i[5] + (n_min_proporcion - sum(casos_i))

  # 3. Extraer los primeros casos de cada nivel y combinarlos
  muestra_i <- map2_dfr(
    niveles_i, casos_i,
    ~ fppers %>%
        filter(descripcionEntidad == .x) %>%
        slice_head(n = .y)
  )

  # 4. Guardar las estimaciones
  prop_est[i]  <- mean(muestra_i$sexo == "F", na.rm = TRUE)
  media_est[i] <- mean(muestra_i$salario_total,  na.rm = TRUE)
}
## -----------------------------------------------------------
## Crear intervalos (clases) y contar frecuencias
## -----------------------------------------------------------

library(dplyr)
library(ggplot2)

# ── 1. Definir cortes de clase ──────────────────────────────
#    Para la proporción usaremos intervalos de ancho 0.02;
#    para la media muestral emplearemos cortes cada 100 000 Gs.
breaks_prop  <- seq(0, 1, by = 0.02)
breaks_media <- seq(floor(min(media_est) / 1e5) * 1e5,
                    ceiling(max(media_est) / 1e5) * 1e5,
                    by = 1e5)

# ── 2. Construir la tabla de frecuencias ────────────────────
tabla_prop  <- data.frame(Proporcion = prop_est)  |>
  mutate(Clase = cut(Proporcion, breaks = breaks_prop, include.lowest = TRUE)) |>
  count(Clase)

tabla_media <- data.frame(Media = media_est) |>
  mutate(Clase = cut(Media, breaks = breaks_media, include.lowest = TRUE)) |>
  count(Clase)
# ── 3. Gráfico de barras con las frecuencias por intervalo ──
ggplot(tabla_prop, aes(x = Clase, y = n)) +
  geom_col(fill = "steelblue") +
  labs(title = "Proporción de mujeres – Frecuencias por intervalo",
       x = "Intervalo de proporción", y = "Frecuencia") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

ggplot(tabla_media, aes(x = Clase, y = n)) +
  geom_col(fill = "darkorange") +
  labs(title = "Media muestral del salario – Frecuencias por intervalo",
       x = "Intervalo de media (Gs)", y = "Frecuencia") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

Intérvalos de confianza

## ------------------------------------------------------------------
## 10 000 IC para la proporción y la media  ─ Cobertura empírica
## ------------------------------------------------------------------

n_rep          <- 1000
z_975          <- 1.96
n_prop         <- n_min_proporcion               # tamaño de cada réplica p̂
n_media        <- n_min_media                    # tamaño de cada réplica x̄

# vectores de resultados
prop_hat       <- numeric(n_rep)
media_hat      <- numeric(n_rep)
ic_prop_lo     <- numeric(n_rep)
ic_prop_hi     <- numeric(n_rep)
ic_media_lo    <- numeric(n_rep)
ic_media_hi    <- numeric(n_rep)

set.seed(321)

for (i in seq_len(n_rep)) {

  # -------- muestreo por conveniencia (mismo esquema que antes) ----
  niv_i   <- sample(unique(fppers$descripcionEntidad), 5)
  k_i     <- rep(floor(n_prop / 5), 5); k_i[5] <- k_i[5] + (n_prop - sum(k_i))

  samp_i  <- purrr::map2_dfr(
               niv_i, k_i,
               ~ fppers |>
                   filter(descripcionEntidad == .x) |>
                   slice_head(n = .y)
             )

  ## ---------- proporción de mujeres y su IC -----------------------
  p_hat           <- mean(samp_i$sexo == "F")
  se_p            <- sqrt(p_hat * (1 - p_hat) / n_prop)
  ic_prop_lo[i]   <- p_hat - z_975 * se_p
  ic_prop_hi[i]   <- p_hat + z_975 * se_p
  prop_hat[i]     <- p_hat

  ## ---------- media salarial y su IC ------------------------------
  x_bar           <- mean(samp_i$salario_total, na.rm = TRUE)
  s_x             <- sd  (samp_i$salario_total,  na.rm = TRUE)
  se_x            <- s_x / sqrt(n_media)
  ic_media_lo[i]  <- x_bar - z_975 * se_x
  ic_media_hi[i]  <- x_bar + z_975 * se_x
  media_hat[i]    <- x_bar
}

# ------------------------------------------------------------------
# Coberturas empíricas
# ------------------------------------------------------------------
p_real  <- p                          # proporción poblacional verdadera
x_real  <- promedio_poblacional       # media poblacional verdadera

cover_prop  <- mean(ic_prop_lo <= p_real & ic_prop_hi >= p_real) * 100
cover_media <- mean(ic_media_lo <= x_real & ic_media_hi >= x_real) * 100

cobertura <- tibble(
  Estimador = c("Proporción", "Media"),
  Cobertura = c(cover_prop, cover_media)
)
cobertura
## # A tibble: 2 × 2
##   Estimador  Cobertura
##   <chr>          <dbl>
## 1 Proporción      46.6
## 2 Media           35
## ------------------------------------------------------------------
## Visualización tipo "cortina" para 500 IC de cada estimador
## ------------------------------------------------------------------

library(ggplot2)

# ------- preparar datos para la proporción ------------------------
plot_prop <- tibble(
  idx   = seq_len(500),
  lo    = ic_prop_lo[1:500],
  hi    = ic_prop_hi [1:500],
  cover = factor(if_else(lo <= p_real & hi >= p_real, "Sí", "No"),
                 levels = c("Sí", "No"))
)

ggplot(plot_prop, aes(y = idx, x = lo, xend = hi, colour = cover)) +
  geom_segment(size = 1.2) +
  geom_vline(xintercept = p_real, linetype = "dashed") +
  scale_colour_manual(values = c("Sí" = "forestgreen", "No" = "firebrick")) +
  labs(title = "Intervalos de confianza (500 réplicas) – Proporción de mujeres",
       x = "Proporción", y = "Réplicas", colour = "Contiene\nvalor real") +
  theme_minimal(base_size = 11) +
  theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# ------- preparar datos para la media -----------------------------
plot_media <- tibble(
  idx   = seq_len(500),
  lo    = ic_media_lo[1:500],
  hi    = ic_media_hi [1:500],
  cover = factor(if_else(lo <= x_real & hi >= x_real, "Sí", "No"),
                 levels = c("Sí", "No"))
)

ggplot(plot_media, aes(y = idx, x = lo, xend = hi, colour = cover)) +
  geom_segment(size = 1.2) +
  geom_vline(xintercept = x_real, linetype = "dashed") +
  scale_colour_manual(values = c("Sí" = "royalblue", "No" = "darkorange2")) +
  labs(title = "Intervalos de confianza (500 réplicas) – Media salarial",
       x = "Salario total (Gs)", y = "Réplicas", colour = "Contiene\nvalor real") +
  theme_minimal(base_size = 11) +
  theme(legend.position = "bottom")