1. Simulación de la Población y Muestreo

Generamos una población de \(100,000\) microtransacciones modeladas bajo una distribución exponencial (\(\lambda = 1\)), la cual refleja una clara asimetría hacia la derecha (no normal). Posterior a esto, simulamos \(10,000\) medias muestrales para tamaños de muestra \(n \in \{5, 30, 50\}\).

set.seed(123)

# 1. Generación de la población original
poblacion <- rexp(100000, rate = 1)

# 2. Función para simular medias muestrales
simular_medias <- function(n, rep = 10000) {
  replicate(rep, mean(sample(poblacion, size = n, replace = TRUE)))
}

# 3. Simulación para distintos tamaños de muestra
medias_5  <- simular_medias(5)
medias_30 <- simular_medias(30)
medias_50 <- simular_medias(50)

2. Visualización Comparativa

Analizamos la evolución de la forma funcional de los promedios al compararlos con la curva normal teórica (línea roja) ajustada a la media y desviación estándar de cada muestra.

par(mfrow = c(2, 2), mar = c(4, 4, 3, 1))

# Población Original
hist(poblacion, probability = TRUE, breaks = 40,
     main = "1. Población Original (Exponencial)",
     xlab = "Monto de transacción", ylab = "Densidad",
     col = "#E0E0E0", border = "white")
lines(density(poblacion), col = "darkgray", lwd = 2)

# n = 5
hist(medias_5, probability = TRUE, breaks = 40,
     main = "2. Medias Muestrales (n = 5)",
     xlab = "Promedio muestral", ylab = "Densidad",
     col = "#A8DADC", border = "white")
curve(dnorm(x, mean = mean(medias_5), sd = sd(medias_5)), 
      add = TRUE, col = "#E63946", lwd = 2)

# n = 30
hist(medias_30, probability = TRUE, breaks = 40,
     main = "3. Medias Muestrales (n = 30)",
     xlab = "Promedio muestral", ylab = "Densidad",
     col = "#A8E6CF", border = "white")
curve(dnorm(x, mean = mean(medias_30), sd = sd(medias_30)), 
      add = TRUE, col = "#E63946", lwd = 2)

# n = 50
hist(medias_50, probability = TRUE, breaks = 40,
     main = "4. Medias Muestrales (n = 50)",
     xlab = "Promedio muestral", ylab = "Densidad",
     col = "#FFD3B6", border = "white")
curve(dnorm(x, mean = mean(medias_50), sd = sd(medias_50)), 
      add = TRUE, col = "#E63946", lwd = 2)

par(mfrow = c(1, 1)) # Restablecer panel gráfico

3. Análisis Estadístico Descriptivo

A continuación se evalúa la reducción del Error Estándar (\(\sigma / \sqrt{n}\)) y la convergencia de los momentos centrales a medida que aumenta \(n\):

library(knitr)

# 1. Crear el data frame con los datos calculados
tabla_resumen <- data.frame(
  Configuracion = c("Población Base", "Muestra n = 5", "Muestra n = 30", "Muestra n = 50"),
  Media_Observada = round(c(mean(poblacion), mean(medias_5), mean(medias_30), mean(medias_50)), 3),
  Desviacion_Estandar = round(c(sd(poblacion), sd(medias_5), sd(medias_30), sd(medias_50)), 3),
  Comportamiento_Forma = c(
    "Sesgada a la derecha (Asimétrica)",
    "Sesgo moderado persistente",
    "Aproximación simétrica (Normal)",
    "Ajuste Gaussiano de alta precisión"
  )
)

# 2. Renderizar la tabla en formato HTML usando kable
kable(
  tabla_resumen,
  col.names = c("Configuración", "Media Observada", "Desviación Estándar (σ)", "Comportamiento de la Forma"),
  align = c("l", "c", "c", "l"),
  caption = "Tabla 1: Comparativa de momentos muestrales según el tamaño de n"
)
Tabla 1: Comparativa de momentos muestrales según el tamaño de n
Configuración Media Observada Desviación Estándar (σ) Comportamiento de la Forma
Población Base 0.997 0.995 Sesgada a la derecha (Asimétrica)
Muestra n = 5 1.001 0.452 Sesgo moderado persistente
Muestra n = 30 0.997 0.181 Aproximación simétrica (Normal)
Muestra n = 50 0.997 0.143 Ajuste Gaussiano de alta precisión

4. Conclusiones y Respuesta a la Gerencia

Respuesta a la pregunta planteada:

Sí, es totalmente razonable y estadísticamente válido suponer que la distribución de las medias muestrales se aproxima a una distribución normal, aun cuando la población original de microtransacciones no sea normal.