Este informe estudia, mediante simulacion en R, como se comporta el promedio de una muestra aleatoria cuando el tamano de la muestra (B) crece. Se trabajan dos variables con contexto aplicado:
| Tipo | Contexto | Distribucion |
|---|---|---|
| Discreta | Pacientes criticos que llegan por hora a emergencias | Poisson (lambda = 3) |
| Continua | Tiempo de aprobacion de un credito hipotecario (3 etapas) | Gamma (forma = 3, escala = 2 horas) |
Los tamanos de muestra simulados son B = 10, 50, 100, 1000 y 10000.
Funciones de simulacion y apoyo utilizadas en R:
set.seed(): fija la semilla del generador para que los
resultados sean reproducibles.rpois(n, lambda): genera n valores
aleatorios de una distribucion Poisson.rgamma(n, shape, scale): genera n valores
aleatorios de una distribucion Gamma.cumsum(x) / seq_along(x): calcula el promedio acumulado
(promedio muestral conforme aumenta la muestra).replicate(): repite una simulacion muchas veces (se usa
para el Teorema del Limite Central).dpois(), ppois(), dgamma(),
pgamma(): calculan la funcion de masa o densidad y la
funcion de distribucion acumulada teoricas.hist(), barplot(), plot(),
lines(), abline(): construyen los
graficos.Sea \(X\) el numero de pacientes criticos que llegan a emergencias en una hora, con \(X \sim Poisson(lambda = 3)\).
lambda <- 3
E_pois <- lambda
SD_pois <- sqrt(lambda)
cat("E[X] =", E_pois, " | Var(X) =", lambda, " | Desv. estandar =", round(SD_pois, 4), "\n")
## E[X] = 3 | Var(X) = 3 | Desv. estandar = 1.7321
par(mfrow = c(1, 2), mar = c(4.5, 4.5, 3, 1))
x <- 0:12
# Panel izquierdo: FMP
plot(x, dpois(x, lambda), type = "h", lwd = 4, col = "steelblue",
xlab = "Pacientes criticos por hora (x)", ylab = "P(X = x)",
main = "FMP: Poisson(3)")
points(x, dpois(x, lambda), pch = 16, col = "steelblue")
# Panel derecho: FDA (funcion escalonada)
plot(x, ppois(x, lambda), type = "s", lwd = 2, col = "firebrick", ylim = c(0, 1),
xlab = "Pacientes criticos por hora (x)", ylab = "F(x) = P(X <= x)",
main = "FDA: Poisson(3)")
points(x, ppois(x, lambda), pch = 16, col = "firebrick")
Variable discreta: Poisson(3). Izquierda: FMP. Derecha: FDA.
par(mfrow = c(1, 1))
Sea \(X\) el tiempo total (en horas) de procesamiento y aprobacion de un credito hipotecario complejo, con \(X \sim Gamma(forma = 3, escala = 2)\).
forma <- 3
escala <- 2
E_gam <- forma * escala
SD_gam <- sqrt(forma * escala^2)
cat("E[X] =", E_gam, "horas | Var(X) =", forma * escala^2, "| Desv. estandar =", round(SD_gam, 4), "horas\n")
## E[X] = 6 horas | Var(X) = 12 | Desv. estandar = 3.4641 horas
par(mfrow = c(1, 2), mar = c(4.5, 4.5, 3, 1))
x <- seq(0, 25, length.out = 500)
# Panel izquierdo: FDP
plot(x, dgamma(x, shape = forma, scale = escala), type = "l", lwd = 2, col = "steelblue",
xlab = "Tiempo de tramite (horas)", ylab = "f(x)",
main = "FDP: Gamma(3, 2)")
abline(v = E_gam, lty = 2, col = "darkgreen")
legend("topright", legend = "E[X] = 6", lty = 2, col = "darkgreen", bty = "n")
# Panel derecho: FDA
plot(x, pgamma(x, shape = forma, scale = escala), type = "l", lwd = 2, col = "firebrick", ylim = c(0, 1),
xlab = "Tiempo de tramite (horas)", ylab = "F(x) = P(X <= x)",
main = "FDA: Gamma(3, 2)")
Variable continua: Gamma(forma = 3, escala = 2). Izquierda: FDP. Derecha: FDA.
par(mfrow = c(1, 1))
Se genera una muestra grande de 10000 observaciones para cada variable y se toman las primeras B observaciones para cada corte (B = 10, 50, 100, 1000, 10000). Asi las muestras son anidadas, y la trayectoria del promedio acumulado muestra de forma continua como se estabiliza el promedio al crecer la muestra.
set.seed(2026) # semilla para reproducibilidad
muestra_pois <- rpois(10000, lambda = 3) # variable discreta
muestra_gamma <- rgamma(10000, shape = 3, scale = 2) # variable continua
cortes <- c(10, 50, 100, 1000, 10000)
Cada grafico tiene dos paneles. Izquierda: histograma de la muestra, con la distribucion teorica superpuesta (puntos rojos para la FMP, curva roja para la FDP), una linea verde con el valor esperado teorico E[X] y una linea naranja con el promedio muestral. Derecha: trayectoria del promedio muestral acumulado frente al valor esperado teorico.
# ---- Variable discreta: histograma de frecuencias relativas + promedio acumulado ----
graf_discreta <- function(B) {
x <- muestra_pois[1:B]
rango <- 0:max(12, max(x))
frec <- as.numeric(table(factor(x, levels = rango))) / B
par(mfrow = c(1, 2), mar = c(4.5, 4.5, 3.5, 1))
# Panel izquierdo: histograma de la muestra
bp <- barplot(frec, names.arg = rango, col = "lightsteelblue", border = "white",
xlab = "Pacientes criticos por hora (x)", ylab = "Frecuencia relativa",
main = paste0("Histograma de la muestra (B = ", B, ")"),
ylim = c(0, max(frec, dpois(rango, 3)) * 1.2))
paso <- bp[2] - bp[1]
points(bp, dpois(rango, 3), pch = 16, col = "firebrick", type = "b")
abline(v = bp[1] + 3 * paso, lty = 2, lwd = 2, col = "darkgreen")
abline(v = bp[1] + mean(x) * paso, lty = 3, lwd = 2, col = "darkorange")
legend("topright", cex = 0.8, bty = "n",
legend = c("FMP teorica", "E[X] teorico = 3",
paste0("Media muestral = ", round(mean(x), 3))),
col = c("firebrick", "darkgreen", "darkorange"),
lty = c(1, 2, 3), pch = c(16, NA, NA), lwd = c(1, 2, 2))
# Panel derecho: promedio muestral acumulado
medias <- cumsum(x) / seq_len(B)
plot(seq_len(B), medias, type = if (B <= 100) "o" else "l", pch = 16, lwd = 1.5,
col = "steelblue", ylim = range(c(medias, 3)),
xlab = "Tamano de la muestra (n)", ylab = "Promedio muestral",
main = paste0("Promedio acumulado (B = ", B, ")"))
abline(h = 3, lty = 2, lwd = 2, col = "darkgreen")
legend("topright", cex = 0.8, bty = "n",
legend = c("Promedio muestral", "E[X] teorico = 3"),
col = c("steelblue", "darkgreen"), lty = c(1, 2), lwd = c(1.5, 2))
par(mfrow = c(1, 1))
}
# ---- Variable continua: histograma de densidad + promedio acumulado ----
graf_continua <- function(B) {
x <- muestra_gamma[1:B]
par(mfrow = c(1, 2), mar = c(4.5, 4.5, 3.5, 1))
# Panel izquierdo: histograma de la muestra
tope <- max(25, max(x))
hist(x, freq = FALSE, breaks = "Sturges", col = "lightsteelblue", border = "white",
xlim = c(0, tope),
xlab = "Tiempo de tramite (horas)", ylab = "Densidad",
main = paste0("Histograma de la muestra (B = ", B, ")"))
xx <- seq(0, tope, length.out = 400)
lines(xx, dgamma(xx, shape = 3, scale = 2), col = "firebrick", lwd = 2)
abline(v = 6, lty = 2, lwd = 2, col = "darkgreen")
abline(v = mean(x), lty = 3, lwd = 2, col = "darkorange")
legend("topright", cex = 0.8, bty = "n",
legend = c("FDP teorica", "E[X] teorico = 6",
paste0("Media muestral = ", round(mean(x), 3))),
col = c("firebrick", "darkgreen", "darkorange"),
lty = c(1, 2, 3), lwd = c(2, 2, 2))
# Panel derecho: promedio muestral acumulado
medias <- cumsum(x) / seq_len(B)
plot(seq_len(B), medias, type = if (B <= 100) "o" else "l", pch = 16, lwd = 1.5,
col = "steelblue", ylim = range(c(medias, 6)),
xlab = "Tamano de la muestra (n)", ylab = "Promedio muestral (horas)",
main = paste0("Promedio acumulado (B = ", B, ")"))
abline(h = 6, lty = 2, lwd = 2, col = "darkgreen")
legend("topright", cex = 0.8, bty = "n",
legend = c("Promedio muestral", "E[X] teorico = 6"),
col = c("steelblue", "darkgreen"), lty = c(1, 2), lwd = c(1.5, 2))
par(mfrow = c(1, 1))
}
graf_discreta(10)
Poisson(3), B = 10.
graf_discreta(50)
Poisson(3), B = 50.
graf_discreta(100)
Poisson(3), B = 100.
graf_discreta(1000)
Poisson(3), B = 1000.
graf_discreta(10000)
Poisson(3), B = 10000.
graf_continua(10)
Gamma(3, 2), B = 10.
graf_continua(50)
Gamma(3, 2), B = 50.
graf_continua(100)
Gamma(3, 2), B = 100.
graf_continua(1000)
Gamma(3, 2), B = 1000.
graf_continua(10000)
Gamma(3, 2), B = 10000.
La tabla compara el promedio muestral con el valor esperado teorico. El error estandar teorico del promedio es la desviacion estandar dividida por la raiz cuadrada de B, y mide cuanto fluctua tipicamente el promedio muestral por azar.
resumen <- function(muestra, E, SD) {
medias <- sapply(cortes, function(B) mean(muestra[1:B]))
data.frame(
B = cortes,
Media_muestral = medias,
Error_abs = abs(medias - E),
Error_rel_pct = 100 * abs(medias - E) / E,
EE_teorico = SD / sqrt(cortes)
)
}
res_pois <- resumen(muestra_pois, E_pois, SD_pois)
res_gamma <- resumen(muestra_gamma, E_gam, SD_gam)
knitr::kable(res_pois, digits = 4, caption = "Poisson(3): promedio muestral frente a E[X] = 3")
| B | Media_muestral | Error_abs | Error_rel_pct | EE_teorico |
|---|---|---|---|---|
| 10 | 2.6000 | 0.4000 | 13.3333 | 0.5477 |
| 50 | 2.3200 | 0.6800 | 22.6667 | 0.2449 |
| 100 | 2.8900 | 0.1100 | 3.6667 | 0.1732 |
| 1000 | 2.9630 | 0.0370 | 1.2333 | 0.0548 |
| 10000 | 2.9919 | 0.0081 | 0.2700 | 0.0173 |
knitr::kable(res_gamma, digits = 4, caption = "Gamma(3, 2): promedio muestral frente a E[X] = 6 horas")
| B | Media_muestral | Error_abs | Error_rel_pct | EE_teorico |
|---|---|---|---|---|
| 10 | 5.9012 | 0.0988 | 1.6474 | 1.0954 |
| 50 | 6.7624 | 0.7624 | 12.7062 | 0.4899 |
| 100 | 6.3749 | 0.3749 | 6.2490 | 0.3464 |
| 1000 | 6.2476 | 0.2476 | 4.1268 | 0.1095 |
| 10000 | 6.0213 | 0.0213 | 0.3552 | 0.0346 |
rpois() y rgamma() generan
esas observaciones en segundos.set.seed) para que otra persona obtenga los mismos
resultados.El error estandar teorico del promedio, en la variable discreta, pasa de 0.548 pacientes por hora con B = 10 a 0.055 con B = 1000 y a 0.017 con B = 10000. En la variable continua pasa de 1.095 horas con B = 10 a 0.11 con B = 1000 y a 0.035 con B = 10000.
Interpretacion con el ejercicio. En el caso de emergencias, con B = 1000 horas observadas el promedio de llegadas queda muy cerca de 3 pacientes criticos por hora, y un hospital que planifique su personal con ese promedio estara apoyado en una estimacion estable. En el caso del credito, con B = 1000 tramites simulados el tiempo promedio queda muy cerca de 6 horas (3 etapas de 2 horas), por lo que ese valor es confiable como tiempo de referencia. En cambio, con solo 10 observaciones el promedio podria sugerir un tiempo de tramite o una carga de pacientes bastante distintos de la realidad.
(Nota: al ser una simulacion, los valores exactos de la tabla dependen de la semilla; la conclusion general sobre la estabilizacion se mantiene.)
La LGN establece que, al aumentar el tamano de la muestra, el promedio muestral converge al valor esperado teorico. Es justamente lo que muestran los paneles derechos de los graficos: la trayectoria del promedio acumulado oscila al inicio y se pega a la linea verde de E[X] (3 pacientes por hora en la Poisson y 6 horas en la Gamma) conforme n crece. Tambien se refleja en los histogramas, donde la frecuencia relativa de cada valor se acerca a la FMP, y la forma del histograma a la FDP, a medida que B aumenta.
El TLC dice que el promedio de n observaciones independientes tiene una distribucion aproximadamente Normal, con media E[X] y desviacion estandar SD / raiz(n), sin importar la forma de la distribucion original, siempre que n sea suficientemente grande. Es importante distinguir: el histograma de una muestra grande se parece a la distribucion original (Poisson o Gamma, ambas asimetricas), no a una Normal; la forma de campana aparece en la distribucion de los promedios de muchas muestras.
Para verlo, se repite 5000 veces el experimento “tomar una muestra de tamano n y calcular su promedio”, con n = 2, 10 y 50, y se compara con la curva Normal que predice el TLC.
# Distribucion de los promedios muestrales y curva Normal del TLC
graf_tlc <- function(generador, E, SD, etiqueta, ns = c(2, 10, 50), R = 5000) {
par(mfrow = c(1, 3), mar = c(4.5, 4.5, 3.5, 1))
for (n in ns) {
promedios <- replicate(R, mean(generador(n)))
hist(promedios, freq = FALSE, breaks = 30, col = "lightsteelblue", border = "white",
xlab = etiqueta, ylab = "Densidad",
main = paste0("Promedios de n = ", n, " (", R, " repeticiones)"))
xx <- seq(min(promedios), max(promedios), length.out = 300)
lines(xx, dnorm(xx, mean = E, sd = SD / sqrt(n)), col = "firebrick", lwd = 2)
abline(v = E, lty = 2, lwd = 2, col = "darkgreen")
}
par(mfrow = c(1, 1))
}
set.seed(2026)
graf_tlc(function(n) rpois(n, 3), E = 3, SD = sqrt(3),
etiqueta = "Promedio muestral (pacientes por hora)")
TLC con la variable discreta: distribucion de los promedios de muestras Poisson(3). Curva roja: Normal teorica del TLC. Linea verde: E[X] = 3.
set.seed(2026)
graf_tlc(function(n) rgamma(n, shape = 3, scale = 2), E = 6, SD = sqrt(12),
etiqueta = "Promedio muestral (horas)")
TLC con la variable continua: distribucion de los promedios de muestras Gamma(3, 2). Curva roja: Normal teorica del TLC. Linea verde: E[X] = 6.
Con n = 2 los promedios conservan la asimetria de la distribucion original; con n = 10 la forma ya se aproxima a una campana; y con n = 50 la distribucion de los promedios coincide practicamente con la curva Normal. Ademas, el ancho de la campana disminuye con n (SD / raiz(n)), lo que explica por que el promedio de una muestra grande se mantiene tan cerca de E[X] como se observo en la LGN.