1 Introducción

La Ley de los Grandes Números (LGN) establece que, cuando el tamaño de una muestra aleatoria aumenta, el promedio muestral tiende a aproximarse al valor esperado teórico de la variable aleatoria.

En el presente trabajo se realiza una comprobación empírica de esta ley mediante simulaciones Monte Carlo desarrolladas en el lenguaje R. El estudio se contextualiza en la operación de un call center, donde la variabilidad de la demanda y de los tiempos de atención constituye un problema fundamental para la planificación operativa.

Se analizan dos variables aleatorias:

Se generan muestras de tamaños:

\[ n = 10,\ 50,\ 100,\ 1000,\ 10000 \]

y en cada caso se calcula el promedio muestral para verificar su convergencia hacia el valor esperado teórico.

2 Objetivo

Demostrar empíricamente la Ley de los Grandes Números mediante simulaciones Monte Carlo aplicadas al contexto operativo de un call center.

3 Contexto del estudio

Los call centers representan sistemas altamente dependientes de procesos aleatorios. La llegada de llamadas y el tiempo de atención presentan incertidumbre natural y requieren modelos probabilísticos para su análisis.

En este estudio se consideran dos fenómenos fundamentales:

Estas variables permiten evaluar cómo el promedio muestral se estabiliza cuando aumenta el número de observaciones.

4 Definición de variables

4.1 Variable discreta

Sea:

\[ X = \text{Número de llamadas recibidas por hora} \]

La variable se modela mediante una distribución de Poisson:

\[ X \sim Poisson(\lambda = 25) \]

donde:

\[ \lambda = 25 \]

representa el número promedio de llamadas por hora.

4.1.1 Propiedades teóricas

\[ E[X] = \lambda = 25 \]

\[ Var(X) = \lambda = 25 \]

\[ \sigma_X = \sqrt{25} = 5 \]

4.1.2 Interpretación

Se espera que el call center reciba, en promedio, 25 llamadas por hora.

5 Variable continua

Sea:

\[ Y = \text{Tiempo de atención por llamada (minutos)} \]

La variable se modela mediante una distribución Gamma:

\[ Y \sim Gamma(\alpha = 4,\ \beta = 2) \]

donde:

5.0.1 Propiedades teóricas

\[ E[Y] = \frac{\alpha}{\beta} = \frac{4}{2} = 2 \]

\[ Var(Y) = \frac{\alpha}{\beta^2} = \frac{4}{4} = 1 \]

\[ \sigma_Y = 1 \]

5.0.2 Interpretación

El tiempo promedio esperado de atención es de 2 minutos por llamada.

6 Metodología de simulación

Se generaron muestras aleatorias con tamaños:

\[ n = 10,\ 50,\ 100,\ 1000,\ 10000 \]

Para la variable discreta se utilizó:

Para la variable continua:

En cada simulación se calcularon:

7 Simulación inicial de datos

datos_demo <- data.frame(
  Operador = 1:10,
  Llamadas = rpois(10, lambda = 25),
  Tiempo_Atencion = round(rgamma(10, shape = 4, rate = 2), 2)
)

kable(
  datos_demo,
  caption = "Primeros 10 datos simulados del call center"
) %>%
  kable_styling(full_width = FALSE)
Primeros 10 datos simulados del call center
Operador Llamadas Tiempo_Atencion
1 27 3.41
2 19 1.08
3 15 1.63
4 32 1.60
5 30 3.61
6 23 3.99
7 28 3.74
8 21 1.80
9 20 2.41
10 12 3.74

8 Funciones para simulación y análisis

simular_poisson <- function(n, lambda){

  datos <- rpois(n, lambda)

  media <- mean(datos)

  ic <- t.test(datos)$conf.int

  error <- abs(media - lambda)

  promedio_acumulado <- cumsum(datos)/seq_along(datos)

  lista <- list(
    datos = datos,
    media = media,
    ic = ic,
    error = error,
    promedio_acumulado = promedio_acumulado
  )

  return(lista)
}

simular_gamma <- function(n, shape, rate){

  datos <- rgamma(n, shape = shape, rate = rate)

  esperado <- shape/rate

  media <- mean(datos)

  ic <- t.test(datos)$conf.int

  error <- abs(media - esperado)

  promedio_acumulado <- cumsum(datos)/seq_along(datos)

  lista <- list(
    datos = datos,
    media = media,
    ic = ic,
    error = error,
    promedio_acumulado = promedio_acumulado
  )

  return(lista)
}

9 Resultados de la variable discreta

La variable discreta representa el número de llamadas recibidas por hora.

\[ X \sim Poisson(25) \]

\[ E[X] = 25 \]

muestras <- c(10,50,100,1000,10000)

resultados_poisson <- list()

for(i in muestras){

  resultados_poisson[[as.character(i)]] <- simular_poisson(i,25)

}

10 Simulación para n = 10

res <- resultados_poisson[["10"]]

cat("Tamaño de muestra:",10,"\n")
## Tamaño de muestra: 10
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 25.5
cat("Valor esperado teórico:",25,"\n")
## Valor esperado teórico: 25
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.5
df <- data.frame(x=res$datos)

ggplot(df,aes(x=x))+

geom_histogram(
  aes(y=after_stat(density)),
  binwidth=1,
  fill="steelblue",
  color="white"
)+

stat_function(
  fun=dpois,
  args=list(lambda=25),
  color="red",
  linewidth=1
)+

geom_vline(
  xintercept=25,
  color="darkgreen",
  linewidth=1.2,
  linetype="dashed"
)+

labs(
  title="Poisson - n = 10",
  x="Número de llamadas",
  y="Densidad"
)+

theme_minimal()

Interpretación.

Para \(n=10\), el promedio muestral presenta una variabilidad considerable debido al tamaño reducido de la muestra.

11 Simulación para n = 50

res <- resultados_poisson[["50"]]

cat("Tamaño de muestra:",50,"\n")
## Tamaño de muestra: 50
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 24.98
cat("Valor esperado teórico:",25,"\n")
## Valor esperado teórico: 25
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.02

12 Simulación para n = 100

res <- resultados_poisson[["100"]]

cat("Tamaño de muestra:",100,"\n")
## Tamaño de muestra: 100
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 25.5
cat("Valor esperado teórico:",25,"\n")
## Valor esperado teórico: 25
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.5

13 Simulación para n = 1000

res <- resultados_poisson[["1000"]]

cat("Tamaño de muestra:",1000,"\n")
## Tamaño de muestra: 1000
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 24.887
cat("Valor esperado teórico:",25,"\n")
## Valor esperado teórico: 25
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.113

14 Simulación para n = 10000

res <- resultados_poisson[["10000"]]

cat("Tamaño de muestra:",10000,"\n")
## Tamaño de muestra: 10000
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 25.002
cat("Valor esperado teórico:",25,"\n")
## Valor esperado teórico: 25
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.002

15 Resumen de la variable discreta

tabla_poisson <- data.frame(
  n = muestras,
  Promedio_Muestral = sapply(resultados_poisson,function(x) round(x$media,4)),
  Valor_Esperado = 25,
  Diferencia_Absoluta = sapply(resultados_poisson,function(x) round(x$error,4))
)

kable(
  tabla_poisson,
  caption = "Resumen de convergencia - Variable discreta"
) %>%
  kable_styling(full_width = FALSE)
Resumen de convergencia - Variable discreta
n Promedio_Muestral Valor_Esperado Diferencia_Absoluta
10 10 25.5000 25 0.5000
50 50 24.9800 25 0.0200
100 100 25.5000 25 0.5000
1000 1000 24.8870 25 0.1130
10000 10000 25.0017 25 0.0017

16 Gráfico de convergencia estocástica

trayectoria_poisson <- cumsum(
  rpois(10000,25)
)/seq_len(10000)

df_conv <- data.frame(
  n = 1:10000,
  promedio = trayectoria_poisson
)

ggplot(df_conv,aes(x=n,y=promedio))+

geom_line(color="steelblue")+

geom_hline(
  yintercept=25,
  color="red",
  linetype="dashed",
  linewidth=1
)+

scale_x_log10()+

labs(
  title="Convergencia estocástica - Poisson",
  x="Tamaño muestral",
  y="Promedio acumulado"
)+

theme_minimal()

17 Resultados de la variable continua

La variable continua representa el tiempo de atención por llamada.

\[ Y \sim Gamma(4,2) \]

\[ E[Y] = 2 \]

resultados_gamma <- list()

for(i in muestras){

  resultados_gamma[[as.character(i)]] <- simular_gamma(i,4,2)

}

18 Simulación para n = 10

res <- resultados_gamma[["10"]]

cat("Tamaño de muestra:",10,"\n")
## Tamaño de muestra: 10
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 2.136
cat("Valor esperado teórico:",2,"\n")
## Valor esperado teórico: 2
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.136
df <- data.frame(x=res$datos)

ggplot(df,aes(x=x))+

geom_histogram(
  aes(y=after_stat(density)),
  bins=10,
  fill="skyblue",
  color="white"
)+

stat_function(
  fun=dgamma,
  args=list(shape=4,rate=2),
  color="blue",
  linewidth=1
)+

geom_vline(
  xintercept=2,
  color="darkgreen",
  linewidth=1.2,
  linetype="dashed"
)+

labs(
  title="Gamma - n = 10",
  x="Tiempo de atención",
  y="Densidad"
)+

theme_minimal()

19 Simulación para n = 50

res <- resultados_gamma[["50"]]

cat("Tamaño de muestra:",50,"\n")
## Tamaño de muestra: 50
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 1.995
cat("Valor esperado teórico:",2,"\n")
## Valor esperado teórico: 2
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.005

20 Simulación para n = 100

res <- resultados_gamma[["100"]]

cat("Tamaño de muestra:",100,"\n")
## Tamaño de muestra: 100
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 1.972
cat("Valor esperado teórico:",2,"\n")
## Valor esperado teórico: 2
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.028

21 Simulación para n = 1000

res <- resultados_gamma[["1000"]]

cat("Tamaño de muestra:",1000,"\n")
## Tamaño de muestra: 1000
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 1.994
cat("Valor esperado teórico:",2,"\n")
## Valor esperado teórico: 2
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.006

22 Simulación para n = 10000

res <- resultados_gamma[["10000"]]

cat("Tamaño de muestra:",10000,"\n")
## Tamaño de muestra: 10000
cat("Promedio muestral:",round(res$media,3),"\n")
## Promedio muestral: 2.008
cat("Valor esperado teórico:",2,"\n")
## Valor esperado teórico: 2
cat("Diferencia absoluta:",round(res$error,3),"\n")
## Diferencia absoluta: 0.008

23 Resumen de la variable continua

tabla_gamma <- data.frame(
  n = muestras,
  Promedio_Muestral = sapply(resultados_gamma,function(x) round(x$media,4)),
  Valor_Esperado = 2,
  Diferencia_Absoluta = sapply(resultados_gamma,function(x) round(x$error,4))
)

kable(
  tabla_gamma,
  caption = "Resumen de convergencia - Variable continua"
) %>%
  kable_styling(full_width = FALSE)
Resumen de convergencia - Variable continua
n Promedio_Muestral Valor_Esperado Diferencia_Absoluta
10 10 2.1363 2 0.1363
50 50 1.9949 2 0.0051
100 100 1.9721 2 0.0279
1000 1000 1.9939 2 0.0061
10000 10000 2.0077 2 0.0077

24 Gráfico de convergencia estocástica

trayectoria_gamma <- cumsum(
  rgamma(10000,shape=4,rate=2)
)/seq_len(10000)

df_conv2 <- data.frame(
  n = 1:10000,
  promedio = trayectoria_gamma
)

ggplot(df_conv2,aes(x=n,y=promedio))+

geom_line(color="darkorange")+

geom_hline(
  yintercept=2,
  color="red",
  linetype="dashed",
  linewidth=1
)+

scale_x_log10()+

labs(
  title="Convergencia estocástica - Gamma",
  x="Tamaño muestral",
  y="Promedio acumulado"
)+

theme_minimal()

25 Comparación de convergencia

comparacion <- data.frame(
  n = 1:10000,
  Poisson = trayectoria_poisson/25,
  Gamma = trayectoria_gamma/2
)

ggplot(comparacion,aes(x=n))+

geom_line(aes(y=Poisson,color="Poisson"))+

geom_line(aes(y=Gamma,color="Gamma"))+

geom_hline(
  yintercept=1,
  linetype="dashed",
  color="black"
)+

scale_x_log10()+

labs(
  title="Comparación normalizada de convergencia",
  x="Tamaño muestral",
  y="Promedio normalizado"
)+

theme_minimal()

26 Análisis general

Los resultados muestran claramente la Ley de los Grandes Números.

En muestras pequeñas:

En muestras grandes:

En ambas variables se observa una estabilización clara aproximadamente desde:

\[ n \approx 1000 \]

27 Conclusiones

\[ E[X]=25 \]

\[ E[Y]=2 \]

28 Referencias