Este trabajo analiza una base de datos económica con 328 registros de estudiantes. Cada registro trae el estrato socioeconómico (1 a 4), la renta (ingreso, en pesos) y el valor de la matrícula (en pesos). Con ella se aplica la estadística inferencial: a partir de una muestra se estiman características de toda la población (media, varianza, desviación estándar y mediana) y se decide cuáles estimadores son los más adecuados.
En la realidad no es posible medir la renta y la matrícula de todos los estudiantes, así que se trabaja con una muestra. Pero los estudiantes no son iguales: los de estrato 1 pagan matrículas muy distintas a los de estrato 4. Si se tomara una muestra sin tener en cuenta el estrato, algunos grupos podrían quedar mal representados y las estimaciones perderían precisión.
Problema: ¿cuál es la renta y el valor de matrícula típicos de la población estudiantil, y qué estimadores (media, varianza, desviación estándar o mediana) son los mejores para estimarlos cuando el muestreo se hace por estratos?
Renta y Valor de matrícula con un muestreo
estratificado y seleccionar los mejores estimadores.| Variable | Tipo | Papel |
|---|---|---|
Estrato |
Cualitativa ordinal (1 a 4) | Variable de estratificación |
Renta |
Cuantitativa continua (pesos) | Variable de estudio |
Matricula |
Cuantitativa continua (pesos) | Variable de estudio |
library(readxl)
library(MASS)
datos <- read_excel("Economía.xlsx")
names(datos) <- c("Estrato", "Renta", "Matricula")
datos$Estrato <- as.integer(datos$Estrato)
n <- nrow(datos)
nh <- table(datos$Estrato)
cat("n =", n, "| datos faltantes:", sum(is.na(datos)), "\n")
## n = 328 | datos faltantes: 0
nh
##
## 1 2 3 4
## 109 192 21 6
summary(datos)
## Estrato Renta Matricula
## Min. :1.000 Min. : 2160000 Min. : 256230
## 1st Qu.:1.000 1st Qu.: 8126580 1st Qu.: 400703
## Median :2.000 Median : 13175385 Median : 513182
## Mean :1.768 Mean : 43286426 Mean : 761998
## 3rd Qu.:2.000 3rd Qu.: 28222000 3rd Qu.:1012141
## Max. :4.000 Max. :1648706000 Max. :2848569
La base está completa. Hay 109 datos del estrato 1, 192 del estrato
2, 21 del estrato 3 y solo 6 del estrato 4. En Renta la
media (≈ 43,3 millones) es mucho mayor que la mediana (≈ 13,2 millones):
unos pocos ingresos muy altos jalan la media hacia arriba.
La población se divide en grupos homogéneos llamados
estratos (aquí, Estrato 1, 2, 3 y 4) y
dentro de cada uno se toma una muestra aleatoria simple, independiente
de las demás.
La matrícula cambia mucho entre estratos y poco dentro de ellos; ese es el caso en que estratificar mejora la precisión.
Notación.
Como la base no trae los \(N_h\), se
supone asignación proporcional: \(W_h = n_h/n\). Si conoces los tamaños
reales de la población por estrato, escríbelos en Nh.
# >>> Reemplaza por los N_h reales si los tienes, por ejemplo: Nh <- c(5200, 9300, 1000, 300)
Nh <- as.numeric(nh)
usar_fpc <- FALSE # TRUE solo si Nh son los tamaños reales de la población
Wh <- Nh / sum(Nh)
fpc <- if (usar_fpc) 1 - as.numeric(nh) / Nh else rep(1, length(Nh))
data.frame(Estrato = names(nh), nh = as.numeric(nh), Nh = Nh, Wh = round(Wh, 4))
## Estrato nh Nh Wh
## 1 1 109 109 0.3323
## 2 2 192 192 0.5854
## 3 3 21 21 0.0640
## 4 4 6 6 0.0183
El estrato 2 pesa el 58,5 %, el 1 el 33,2 %, el 3 el 6,4 % y el 4 solo el 1,8 %. Las estimaciones globales se calculan con estos pesos, así los estratos pequeños no distorsionan el resultado.
Todo se calcula directamente sobre los datos, sin transformaciones.
| Estimador | Fórmula |
|---|---|
| Media por estrato | \(\bar y_h=\frac{1}{n_h}\sum y_{hi}\) |
| Varianza por estrato | \(s_h^2=\frac{1}{n_h-1}\sum (y_{hi}-\bar y_h)^2\) |
| Desviación estándar por estrato | \(s_h=\sqrt{s_h^2}\) |
| Mediana por estrato | valor central de los datos ordenados del estrato |
| Media estratificada | \(\bar y_{st}=\sum_h W_h\,\bar y_h\) |
| Varianza de la media estratificada | \(\widehat{\text{Var}}(\bar y_{st})=\sum_h W_h^2\,\dfrac{(1-f_h)\,s_h^2}{n_h}\) |
| Varianza poblacional estratificada | \(\sum_h W_h\left[s_h^2+(\bar y_h-\bar y_{st})^2\right]\) (variación dentro + entre estratos) |
| Desviación estándar poblacional | raíz cuadrada de la varianza anterior |
| Mediana global | mediana de los datos ponderando cada dato por \(W_h/n_h\) |
tabla_estrato <- function(v) {
do.call(rbind, lapply(split(datos[[v]], datos$Estrato), function(x)
data.frame(n = length(x), media = mean(x), varianza = var(x),
desv_est = sd(x), mediana = median(x))))
}
cat("RENTA por estrato\n"); print(round(tabla_estrato("Renta")))
## RENTA por estrato
## n media varianza desv_est mediana
## 1 109 46649407 37599617552446680 193906208 9374904
## 2 192 31902650 5527000806463716 74343801 13785696
## 3 21 120664070 37521862363308440 193705607 40811000
## 4 6 75651315 1623149293873698 40288327 74885812
cat("\nMATRÍCULA por estrato\n"); print(round(tabla_estrato("Matricula")))
##
## MATRÍCULA por estrato
## n media varianza desv_est mediana
## 1 109 527377 133156277812 364906 386679
## 2 192 775949 190343309655 436284 550918
## 3 21 1475487 420342469177 648338 1461943
## 4 6 2080635 191362176180 437450 2031442
Renta supera a la media, es decir, los datos son muy
dispersos.mediana_pond <- function(x, w) {
o <- order(x); cum <- cumsum(w[o]) / sum(w)
x[o][which(cum >= 0.5)[1]]
}
w_i <- Wh[datos$Estrato] / as.numeric(nh)[datos$Estrato] # peso de cada dato
global <- function(v) {
x <- datos[[v]]
m_h <- tapply(x, datos$Estrato, mean)
s2h <- tapply(x, datos$Estrato, var)
m_st <- sum(Wh * m_h)
var_m <- sum(Wh^2 * fpc * s2h / as.numeric(nh))
var_pob <- sum(Wh * (s2h + (m_h - m_st)^2))
data.frame(
media_estratificada = m_st,
error_estandar_media = sqrt(var_m),
IC95_inferior = m_st - qnorm(.975) * sqrt(var_m),
IC95_superior = m_st + qnorm(.975) * sqrt(var_m),
varianza = var_pob,
desviacion_estandar = sqrt(var_pob),
mediana = mediana_pond(x, w_i))
}
resultados <- rbind(Renta = global("Renta"), Matricula = global("Matricula"))
round(resultados, 1)
## media_estratificada error_estandar_media IC95_inferior IC95_superior
## Renta 43286426 7441298.4 28701748.7 57871102.5
## Matricula 761998 23818.6 715314.3 808681.6
## varianza desviacion_estandar mediana
## Renta 18644429221517900 136544605.2 13150770
## Matricula 268890214319 518546.3 513182
Como Estrato es la variable de estratificación, su
composición la fija el diseño. Por eso se estima otra proporción: la de
estudiantes con matrícula mayor a 1 millón de
pesos.
alto <- datos$Matricula > 1e6
p_h <- tapply(alto, datos$Estrato, mean)
p_st <- sum(Wh * p_h)
ee_p <- sqrt(sum(Wh^2 * fpc * p_h * (1 - p_h) / (as.numeric(nh) - 1)))
data.frame(Estrato = names(p_h), proporcion = round(p_h, 4))
## Estrato proporcion
## 1 1 0.1193
## 2 2 0.2656
## 3 3 0.6667
## 4 4 1.0000
cat("Proporción estratificada =", round(p_st, 4), "| error estándar =", round(ee_p, 4),
"| IC 95% = [", round(p_st - 1.96 * ee_p, 4), ",", round(p_st + 1.96 * ee_p, 4), "]\n")
## Proporción estratificada = 0.2561 | error estándar = 0.0224 | IC 95% = [ 0.2121 , 0.3001 ]
Alrededor del 25,6 % de los estudiantes paga una matrícula mayor a 1 millón (IC 95 %: ≈ 21,2 % a 30,0 %). La proporción sube con el estrato: ≈ 12 % en el 1, ≈ 27 % en el 2, ≈ 67 % en el 3 y 100 % en el 4. Este último valor se basa en solo 6 datos, por lo que no es concluyente.
Para elegir el modelo se comparan varias distribuciones con el criterio AIC (cuanto menor, mejor ajuste). Los valores se expresan en millones de pesos solo para que el cálculo numérico sea estable.
comparar <- function(x) {
aj <- list(Normal = fitdistr(x, "normal"),
Exponencial = fitdistr(x, "exponential"),
Gamma = fitdistr(x, "gamma", lower = 1e-6),
Weibull = fitdistr(x, "weibull", lower = 1e-6),
Lognormal = fitdistr(x, "lognormal"))
aic <- sapply(aj, function(a) -2 * a$loglik + 2 * length(a$estimate))
data.frame(AIC = round(aic, 1))[order(aic), , drop = FALSE]
}
cat("RENTA\n"); comparar(datos$Renta / 1e6)
## RENTA
## AIC
## Lognormal 2819.4
## Weibull 3010.6
## Gamma 3084.5
## Exponencial 3129.7
## Normal 4155.7
cat("\nMATRÍCULA\n"); comparar(datos$Matricula / 1e6)
##
## MATRÍCULA
## AIC
## Lognormal 289.6
## Gamma 333.9
## Weibull 369.3
## Exponencial 479.7
## Normal 500.5
par(mfrow = c(1, 2))
hist(datos$Renta / 1e6, breaks = 40, main = "Renta", xlab = "Millones de pesos", col = "grey85")
hist(datos$Matricula / 1e6, breaks = 25, main = "Valor de matrícula", xlab = "Millones de pesos", col = "grey85")
par(mfrow = c(1, 1))
El modelo con menor AIC en ambas variables es la lognormal. Significa simplemente que los datos son siempre positivos y están muy sesgados a la derecha (muchos valores pequeños y pocos muy grandes), como pasa con ingresos y pagos. La normal es el peor modelo, lo que confirma que los datos no son simétricos.
Esto solo sirve para entender la forma de los datos: los estimadores de la sección 4 no usan ninguna transformación.
Como los datos son asimétricos y la renta tiene valores extremos, la media muestral se comporta peor de lo que tendría con datos simétricos, y la mediana se vuelve una alternativa mejor. Esto se comprueba en la sección 6. El ajuste no es perfecto (hay una mezcla de estratos y valores extremos), pero es el mejor entre los comparados.
Para la proporción se usa el modelo Bernoulli dentro de cada estrato (cada estudiante tiene o no matrícula > 1 millón) y Binomial(\(n_h\), \(p_h\)) para el conteo.
| Propiedad | Idea | Cómo se verifica |
|---|---|---|
| Insesgado | En promedio, acierta: \(E(\hat\theta)=\theta\) | Teoría (esperanza del estimador) |
| Consistente | Con muestras más grandes, se acerca al valor real | La varianza baja al aumentar \(n\) |
| Eficiente | Entre estimadores insesgados, el de menor varianza | Comparar errores estándar |
| Suficiente | Resume toda la información de la muestra sobre el parámetro | Teorema de factorización |
Para comparar la precisión de la media y la mediana se repite 2.000 veces el muestreo (bootstrap estratificado: remuestrear con reemplazo dentro de cada estrato) y se mide cuánto varía cada estimador. El coeficiente de variación (error estándar / valor estimado) permite comparar estimadores con distinta escala.
set.seed(2026)
varpob <- function(x, e) {
m_h <- tapply(x, e, mean); s2h <- tapply(x, e, var)
sum(Wh * (s2h + (m_h - sum(Wh * m_h))^2))
}
boot <- function(v, B = 2000) {
t(replicate(B, {
idx <- unlist(lapply(split(seq_len(n), datos$Estrato), function(i) sample(i, length(i), replace = TRUE)))
x <- datos[[v]][idx]; e <- datos$Estrato[idx]
c(media = sum(Wh * tapply(x, e, mean)),
mediana = mediana_pond(x, Wh[e] / as.numeric(nh)[e]),
desv = sqrt(varpob(x, e)))
}))
}
resumen_boot <- function(b) {
data.frame(estimador = colnames(b),
valor_medio = colMeans(b),
error_estandar = apply(b, 2, sd),
coef_variacion_pct = round(100 * apply(b, 2, sd) / colMeans(b), 1),
row.names = NULL)
}
cat("RENTA\n"); resumen_boot(boot("Renta"))
## RENTA
## estimador valor_medio error_estandar coef_variacion_pct
## 1 media 42978337 7412078 17.2
## 2 mediana 13036470 1164653 8.9
## 3 desv 131421718 32240931 24.5
cat("\nMATRÍCULA\n"); resumen_boot(boot("Matricula"))
##
## MATRÍCULA
## estimador valor_medio error_estandar coef_variacion_pct
## 1 media 761620.0 23052.62 3.0
## 2 mediana 519295.0 22984.73 4.4
## 3 desv 516963.2 22404.30 4.3
| Estimador | Insesgado | Consistente | Eficiente | Suficiente |
|---|---|---|---|---|
| Media estratificada \(\bar y_{st}\) | Sí, para cualquier distribución | Sí | Sí en Matricula (menor error). No en
Renta: los valores extremos inflan su varianza |
Solo bajo ciertos modelos (por ejemplo normal o exponencial); con datos asimétricos no se puede asegurar |
| Mediana | No exactamente (sesgo pequeño en muestras finitas) | Sí | Sí en Renta (menor error). No en
Matricula |
No (no resume toda la información) |
| Varianza \(s_h^2\) (divisor \(n_h-1\)) | Sí | Sí | Sí entre los insesgados si hay normalidad | Junto con la media, suficiente bajo normalidad |
| Varianza con divisor \(n_h\) | No (subestima) | Sí | Menor varianza pero sesgada | Igual que la anterior |
| Desviación estándar \(s\) | No (sesgo pequeño) | Sí | Aceptable | Igual que la varianza |
| Proporción \(\hat p_h=X_h/n_h\) y \(\hat p_{st}\) | Sí | Sí | Sí (alcanza la cota de Cramér-Rao) | Sí (el conteo \(X_h\) es suficiente para el modelo Binomial) |
Por qué la media estratificada es insesgada (para cualquier distribución): \(E(\bar y_{st})=\sum W_h E(\bar y_h)=\sum W_h\mu_h=\mu\), porque los \(W_h\) son constantes del diseño.
Por qué es consistente: \(\text{Var}(\bar y_{st})=\sum W_h^2\sigma_h^2/n_h\to 0\) cuando los \(n_h\) crecen.
Por qué \(s^2\) es insesgada: se divide por \(n_h-1\) y no por \(n_h\), lo que corrige la subestimación: \(E(s_h^2)=\sigma_h^2\).
Sobre suficiencia (honestidad con los datos). La suficiencia depende del modelo. La media y la varianza forman estadísticos suficientes si los datos fueran normales. Como los datos son asimétricos, en las variables económicas esa propiedad no está garantizada. En cambio, para la proporción el modelo Binomial sí se cumple y el conteo es suficiente.
Muestreo: estratificado por
Estrato, con pesos proporcionales (reemplazar por \(N_h\) reales si se conocen).
Resultados principales:
| Renta | Matrícula | |
|---|---|---|
| Media estratificada | ≈ 43,3 millones | ≈ 762 mil |
| Mediana | ≈ 13,2 millones | ≈ 513 mil |
| Desviación estándar | ≈ 137 millones | ≈ 519 mil |
Mejor estimador del valor típico:
Mejor estimador de la dispersión: \(s^2\) con divisor \(n_h-1\) (insesgado y consistente).
Proporción: \(\hat p_{st}\) cumple las cuatro propiedades (insesgado, consistente, eficiente y suficiente).
Limitaciones: el estrato 4 tiene solo 6 datos; hay rentas superiores a 600 millones que conviene verificar en la fuente; y los \(N_h\) son supuestos si no se conocen.