1 Introduccion

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.

2 Fase 1: Definicion de variables y ley de probabilidad

2.1 Variable discreta: Poisson

Sea \(X\) el numero de pacientes criticos que llegan a emergencias en una hora, con \(X \sim Poisson(lambda = 3)\).

  • Parametro: lambda = 3 pacientes por hora (tasa promedio de llegada).
  • Espacio muestral: {0, 1, 2, 3, …} (enteros no negativos, sin limite superior).
  • FMP: \(P(X = x) = e^{-3} 3^x / x!\)
  • Valor esperado y varianza: \(E[X] = 3\) y \(Var(X) = 3\), por lo que la desviacion estandar es \(\sqrt{3} = 1.732\).
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.

Variable discreta: Poisson(3). Izquierda: FMP. Derecha: FDA.

par(mfrow = c(1, 1))

2.2 Variable continua: Gamma

Sea \(X\) el tiempo total (en horas) de procesamiento y aprobacion de un credito hipotecario complejo, con \(X \sim Gamma(forma = 3, escala = 2)\).

  • Parametros: forma = 3 (el proceso tiene 3 etapas) y escala = 2 horas (duracion promedio de cada etapa).
  • Espacio muestral: \(x > 0\) (numeros reales positivos).
  • FDP: \(f(x) = x^{2} e^{-x/2} / 16\) para \(x > 0\) (el denominador es el factorial de 2, igual a 2, multiplicado por 2 al cubo, igual a 8).
  • Valor esperado y varianza: \(E[X] = 3 \times 2 = 6\) horas y \(Var(X) = 3 \times 2^2 = 12\), por lo que la desviacion estandar es \(\sqrt{12} = 3.464\) horas.
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.

Variable continua: Gamma(forma = 3, escala = 2). Izquierda: FDP. Derecha: FDA.

par(mfrow = c(1, 1))

3 Fase 2: Simulacion y visualizacion

3.1 Diseno de la simulacion

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)

3.2 Funciones de graficacion

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))
}

3.3 Variable discreta (Poisson): graficos por tamano de muestra

3.3.1 B = 10

graf_discreta(10)
Poisson(3), B = 10.

Poisson(3), B = 10.

3.3.2 B = 50

graf_discreta(50)
Poisson(3), B = 50.

Poisson(3), B = 50.

3.3.3 B = 100

graf_discreta(100)
Poisson(3), B = 100.

Poisson(3), B = 100.

3.3.4 B = 1000

graf_discreta(1000)
Poisson(3), B = 1000.

Poisson(3), B = 1000.

3.3.5 B = 10000

graf_discreta(10000)
Poisson(3), B = 10000.

Poisson(3), B = 10000.

3.4 Variable continua (Gamma): graficos por tamano de muestra

3.4.1 B = 10

graf_continua(10)
Gamma(3, 2), B = 10.

Gamma(3, 2), B = 10.

3.4.2 B = 50

graf_continua(50)
Gamma(3, 2), B = 50.

Gamma(3, 2), B = 50.

3.4.3 B = 100

graf_continua(100)
Gamma(3, 2), B = 100.

Gamma(3, 2), B = 100.

3.4.4 B = 1000

graf_continua(1000)
Gamma(3, 2), B = 1000.

Gamma(3, 2), B = 1000.

3.4.5 B = 10000

graf_continua(10000)
Gamma(3, 2), B = 10000.

Gamma(3, 2), B = 10000.

3.5 Resumen numerico de la convergencia

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")
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")
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

4 Analisis

4.1 Por que se deben simular los datos

  • Verificar la teoria de forma empirica. Un resultado como “el promedio muestral converge al valor esperado” se comprende mejor al verlo ocurrir, que solo al leer la formula.
  • Estudiar sistemas donde no hay datos reales o son costosos. Esperar a que lleguen miles de pacientes a emergencias, o tramitar miles de creditos, es costoso e inviable. Con un modelo calibrado, rpois() y rgamma() generan esas observaciones en segundos.
  • Evaluar la variabilidad del azar. Repetir el experimento muchas veces permite medir cuanto cambia un resultado de una muestra a otra, algo imposible de ver con una sola muestra real.
  • Probar escenarios y decisiones. Por ejemplo, estimar cuantos pacientes por hora debe poder atender el hospital, o que plazo prometer al cliente de un credito.

4.2 Restricciones al tomar una muestra aleatoria de cierto tamano

  • Una muestra es solo una realizacion del azar. Con otra semilla se obtendrian otros valores; con B pequeno, el resultado puede alejarse bastante del parametro.
  • El error disminuye lentamente. La fluctuacion del promedio baja con la raiz de B: para reducir el error a la mitad se necesita una muestra cuatro veces mayor.
  • Costo y tiempo. En la realidad, cada observacion tiene un costo (tiempo, dinero, recursos), de modo que no siempre se puede tomar B = 10000.
  • Dependencia del modelo. La simulacion solo es tan buena como los supuestos de la distribucion y de sus parametros. Si la distribucion elegida no representa al fenomeno real, las conclusiones tampoco lo haran.
  • Independencia y aleatoriedad. Las observaciones deben ser independientes e identicamente distribuidas; en datos reales esto puede fallar (por ejemplo, llegadas de pacientes en horas pico).
  • Reproducibilidad. Los generadores son pseudoaleatorios, por lo que se debe fijar la semilla (set.seed) para que otra persona obtenga los mismos resultados.

4.3 Punto de estabilizacion visual

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.

  • B = 10 y B = 50: el promedio acumulado oscila mucho y el histograma tiene forma irregular; no se parece todavia a la FMP o FDP teorica. El error relativo del promedio puede superar el 10 %.
  • B = 100: la trayectoria ya se acerca a la linea de E[X], pero todavia se perciben oscilaciones.
  • B = 1000: segun mi criterio, aqui se observa la estabilizacion visual clara. La trayectoria permanece pegada a la linea de E[X], el histograma reproduce la forma de la distribucion teorica y el error relativo es de aproximadamente 1.23 % en la variable discreta y 4.13 % en la continua.
  • B = 10000: la mejora es pequena respecto a B = 1000 (el error estandar solo baja alrededor de tres veces), por lo que el promedio es practicamente indistinguible del valor esperado.

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.)

4.4 Ley de los Grandes Numeros (LGN)

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.

4.5 Teorema del Limite Central (TLC)

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.

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.

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.