1 Introducción

El presente informe demuestra empíricamente la Ley de los Grandes Números mediante simulaciones en R aplicadas a un contexto educativo de metrología automotriz.

En un laboratorio de mecánica automotriz, los estudiantes realizan mediciones de piezas como ejes, bujes, pernos, cilindros o discos utilizando instrumentos de precisión. En estas prácticas se evalúan dos aspectos: la cantidad de mediciones fuera de tolerancia y el error de medición respecto a una pieza patrón.

La Ley de los Grandes Números establece que, para variables aleatorias independientes e idénticamente distribuidas con esperanza finita, el promedio muestral tiende a estabilizarse alrededor del valor esperado poblacional cuando el tamaño de muestra aumenta.

Se analizarán los tamaños muestrales:

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

2 Preparación del entorno

options(repos = c(CRAN = "https://cloud.r-project.org"))

paquetes <- c("tidyverse", "patchwork", "knitr")
faltantes <- paquetes[!sapply(paquetes, requireNamespace, quietly = TRUE)]

if(length(faltantes) > 0){
  install.packages(faltantes)
}

library(tidyverse)
library(patchwork)
library(knitr)

set.seed(123)

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

color_barra_discreta <- "#2C7FB8"
color_linea_teorica <- "#F03B20"
color_media_teorica <- "#31A354"
color_media_muestral <- "#756BB1"
color_histograma <- "#FDB863"
color_densidad <- "#542788"
color_convergencia <- "#1B9E77"

theme_set(theme_minimal(base_size = 12))

3 Contexto del problema

En una práctica de metrología automotriz, cada estudiante mide una pieza patrón con instrumentos como calibrador Vernier o micrómetro. Si la diferencia entre la medición registrada y el valor patrón supera la tolerancia permitida, la medición se considera fuera de tolerancia.

También se analiza el error individual de medición:

\[ \text{Error de medición} = \text{Medición observada} - \text{Valor patrón} \]

Con este contexto se definen dos variables aleatorias:

  • \(X\): número de mediciones fuera de tolerancia en una práctica.
  • \(Y\): error de medición en milímetros.

4 Definición de variables aleatorias

4.1 Variable discreta

Sea \(X\) el número de mediciones fuera de tolerancia en una práctica de 20 mediciones independientes.

\[ X \sim Binomial(m = 20,\ p = 0.15) \]

Su función de masa de probabilidad es:

\[ P(X=x)=\binom{m}{x}p^x(1-p)^{m-x}, \quad x=0,1,2,\dots,m \]

El valor esperado es:

\[ E[X]=mp=20(0.15)=3 \]

Esto significa que se espera un promedio de 3 mediciones fuera de tolerancia por práctica.

4.2 Variable continua

Sea \(Y\) el error de medición, en milímetros, cometido al medir una pieza patrón.

\[ Y \sim Normal(\mu = 0,\ \sigma = 0.02) \]

Su función de densidad es:

\[ f(y)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\left(\frac{y-\mu}{\sigma}\right)^2} \]

El valor esperado es:

\[ E[Y]=0 \]

Esto significa que, si no existe sesgo sistemático, los errores positivos y negativos tienden a compensarse.

5 Parámetros teóricos

m_binom <- 20
p_binom <- 0.15
mu_binom <- m_binom * p_binom

mu_normal <- 0
sigma_normal <- 0.02

tabla_parametros <- tibble(
  Tipo = c("Discreta", "Continua"),
  Variable = c(
    "Mediciones fuera de tolerancia",
    "Error de medición"
  ),
  Distribucion = c(
    "Binomial(20, 0.15)",
    "Normal(0, 0.02)"
  ),
  Espacio_muestral = c(
    "0, 1, 2, ..., 20",
    "(-infinito, infinito)"
  ),
  Unidad = c(
    "conteo",
    "milímetros"
  ),
  Valor_esperado = c(mu_binom, mu_normal)
)

kable(
  tabla_parametros,
  caption = "Variables aleatorias y parámetros teóricos"
)
Variables aleatorias y parámetros teóricos
Tipo Variable Distribucion Espacio_muestral Unidad Valor_esperado
Discreta Mediciones fuera de tolerancia Binomial(20, 0.15) 0, 1, 2, …, 20 conteo 3
Continua Error de medición Normal(0, 0.02) (-infinito, infinito) milímetros 0

6 Simulación de muestras aleatorias

simular_binomial <- function(n, size = m_binom, prob = p_binom) {
  x <- rbinom(n = n, size = size, prob = prob)
  i <- seq_along(x)
  
  tibble(
    n = n,
    i = i,
    x = x,
    media_acumulada = cumsum(x) / i
  )
}

simular_normal <- function(n, media = mu_normal, desviacion = sigma_normal) {
  y <- rnorm(n = n, mean = media, sd = desviacion)
  i <- seq_along(y)
  
  tibble(
    n = n,
    i = i,
    y = y,
    media_acumulada = cumsum(y) / i
  )
}

datos_binom <- map_dfr(n_cortes, simular_binomial)
datos_normal <- map_dfr(n_cortes, simular_normal)

7 Variable discreta: mediciones fuera de tolerancia

7.1 Tabla de convergencia

resumen_binom <- datos_binom %>%
  group_by(n) %>%
  summarise(
    media_muestral = mean(x),
    valor_esperado = mu_binom,
    error_absoluto = abs(media_muestral - valor_esperado),
    error_relativo_pct = 100 * error_absoluto / valor_esperado,
    .groups = "drop"
  )

kable(
  resumen_binom,
  digits = 4,
  caption = "Convergencia de la media muestral para X ~ Binomial(20, 0.15)"
)
Convergencia de la media muestral para X ~ Binomial(20, 0.15)
n media_muestral valor_esperado error_absoluto error_relativo_pct
10 3.500 3 0.500 16.6667
50 3.020 3 0.020 0.6667
100 2.990 3 0.010 0.3333
1000 2.959 3 0.041 1.3667
10000 2.988 3 0.012 0.4000

7.2 Gráficos e interpretaciones

graficar_binomial <- function(datos_n) {
  n_actual <- unique(datos_n$n)
  soporte_x <- 0:m_binom
  
  teorico <- tibble(
    x = soporte_x,
    prob_teorica = dbinom(x, size = m_binom, prob = p_binom)
  )
  
  muestra <- datos_n %>%
    count(x) %>%
    mutate(prob_muestral = n / sum(n))
  
  g1 <- ggplot() +
    geom_col(
      data = muestra,
      aes(x = x, y = prob_muestral),
      fill = color_barra_discreta,
      alpha = 0.75
    ) +
    geom_point(
      data = teorico,
      aes(x = x, y = prob_teorica),
      color = color_linea_teorica,
      size = 2.2
    ) +
    geom_line(
      data = teorico,
      aes(x = x, y = prob_teorica),
      color = color_linea_teorica,
      linewidth = 0.8
    ) +
    geom_vline(
      xintercept = mu_binom,
      color = color_media_teorica,
      linetype = "dashed",
      linewidth = 0.9
    ) +
    geom_vline(
      xintercept = mean(datos_n$x),
      color = color_media_muestral,
      linetype = "dotted",
      linewidth = 0.9
    ) +
    scale_x_continuous(breaks = soporte_x) +
    labs(
      title = paste0("Binomial(20, 0.15), n = ", n_actual),
      subtitle = "Azul: muestra | Rojo: FMP teórica | Verde: E[X] | Morado: media muestral",
      x = "Mediciones fuera de tolerancia",
      y = "Probabilidad"
    )
  
  g2 <- ggplot(datos_n, aes(x = i, y = media_acumulada)) +
    geom_line(color = color_convergencia, linewidth = 0.8) +
    geom_hline(
      yintercept = mu_binom,
      color = color_media_teorica,
      linetype = "dashed",
      linewidth = 0.9
    ) +
    geom_hline(
      yintercept = mean(datos_n$x),
      color = color_media_muestral,
      linetype = "dotted",
      linewidth = 0.9
    ) +
    labs(
      title = "Promedio acumulado",
      subtitle = paste0("Media final = ", round(mean(datos_n$x), 4)),
      x = "Prácticas acumuladas",
      y = "Promedio acumulado"
    )
  
  g1 + g2 + plot_layout(widths = c(1, 1))
}

interpretar_binomial <- function(datos_n) {
  n_actual <- unique(datos_n$n)
  media_n <- mean(datos_n$x)
  error_abs <- abs(media_n - mu_binom)
  error_rel <- 100 * error_abs / mu_binom
  
  conclusion <- case_when(
    n_actual <= 50 ~ "La muestra es pequeña, por lo que el promedio acumulado fluctúa de forma visible.",
    n_actual < 1000 ~ "El promedio empieza a acercarse al valor esperado, aunque aún presenta variación.",
    TRUE ~ "El promedio se estabiliza con mayor claridad alrededor del valor esperado."
  )
  
  paste0(
    "\n\n**Interpretación para n = ", n_actual, ".** ",
    "La media muestral fue ", round(media_n, 4),
    " y el valor esperado teórico es 3. ",
    "El error absoluto fue ", round(error_abs, 4),
    " y el error relativo fue ", round(error_rel, 2), "%. ",
    conclusion,
    "\n\n"
  )
}
for(n_actual in n_cortes) {
  datos_n <- datos_binom %>% filter(n == n_actual)
  cat("\n\n### n =", n_actual, "\n\n")
  print(graficar_binomial(datos_n))
  cat(interpretar_binomial(datos_n))
}

7.2.1 n = 10

Interpretación para n = 10. La media muestral fue 3.5 y el valor esperado teórico es 3. El error absoluto fue 0.5 y el error relativo fue 16.67%. La muestra es pequeña, por lo que el promedio acumulado fluctúa de forma visible.

7.2.2 n = 50

Interpretación para n = 50. La media muestral fue 3.02 y el valor esperado teórico es 3. El error absoluto fue 0.02 y el error relativo fue 0.67%. La muestra es pequeña, por lo que el promedio acumulado fluctúa de forma visible.

7.2.3 n = 100

Interpretación para n = 100. La media muestral fue 2.99 y el valor esperado teórico es 3. El error absoluto fue 0.01 y el error relativo fue 0.33%. El promedio empieza a acercarse al valor esperado, aunque aún presenta variación.

7.2.4 n = 1000

Interpretación para n = 1000. La media muestral fue 2.959 y el valor esperado teórico es 3. El error absoluto fue 0.041 y el error relativo fue 1.37%. El promedio se estabiliza con mayor claridad alrededor del valor esperado.

7.2.5 n = 10000

Interpretación para n = 10000. La media muestral fue 2.988 y el valor esperado teórico es 3. El error absoluto fue 0.012 y el error relativo fue 0.4%. El promedio se estabiliza con mayor claridad alrededor del valor esperado.

8 Variable continua: error de medición

8.1 Tabla de convergencia

resumen_normal <- datos_normal %>%
  group_by(n) %>%
  summarise(
    media_muestral = mean(y),
    valor_esperado = mu_normal,
    error_absoluto = abs(media_muestral - valor_esperado),
    .groups = "drop"
  ) %>%
  mutate(
    criterio_precision = if_else(
      error_absoluto <= 0.002,
      "Cumple",
      "No cumple"
    )
  )

kable(
  resumen_normal,
  digits = 6,
  caption = "Convergencia de la media muestral para Y ~ Normal(0, 0.02)"
)
Convergencia de la media muestral para Y ~ Normal(0, 0.02)
n media_muestral valor_esperado error_absoluto criterio_precision
10 0.002228 0 0.002228 No cumple
50 -0.002169 0 0.002169 No cumple
100 0.002911 0 0.002911 No cumple
1000 -0.000055 0 0.000055 Cumple
10000 -0.000053 0 0.000053 Cumple

8.2 Gráficos e interpretaciones

graficar_normal <- function(datos_n) {
  n_actual <- unique(datos_n$n)
  
  x_min <- min(quantile(datos_n$y, 0.01), qnorm(0.001, mean = mu_normal, sd = sigma_normal))
  x_max <- max(quantile(datos_n$y, 0.99), qnorm(0.999, mean = mu_normal, sd = sigma_normal))
  
  teorico <- tibble(
    y = seq(x_min, x_max, length.out = 500),
    densidad = dnorm(y, mean = mu_normal, sd = sigma_normal)
  )
  
  g1 <- ggplot(datos_n, aes(x = y)) +
    geom_histogram(
      aes(y = after_stat(density)),
      bins = 30,
      fill = color_histograma,
      color = "white",
      alpha = 0.85
    ) +
    geom_line(
      data = teorico,
      aes(x = y, y = densidad),
      color = color_densidad,
      linewidth = 1
    ) +
    geom_vline(
      xintercept = mu_normal,
      color = color_media_teorica,
      linetype = "dashed",
      linewidth = 0.9
    ) +
    geom_vline(
      xintercept = mean(datos_n$y),
      color = color_media_muestral,
      linetype = "dotted",
      linewidth = 0.9
    ) +
    coord_cartesian(xlim = c(x_min, x_max)) +
    labs(
      title = paste0("Normal(0, 0.02), n = ", n_actual),
      subtitle = "Naranja: muestra | Morado: FDP teórica | Verde: E[Y] | Morado punteado: media muestral",
      x = "Error de medición en milímetros",
      y = "Densidad"
    )
  
  g2 <- ggplot(datos_n, aes(x = i, y = media_acumulada)) +
    geom_line(color = color_convergencia, linewidth = 0.8) +
    geom_hline(
      yintercept = mu_normal,
      color = color_media_teorica,
      linetype = "dashed",
      linewidth = 0.9
    ) +
    geom_hline(
      yintercept = mean(datos_n$y),
      color = color_media_muestral,
      linetype = "dotted",
      linewidth = 0.9
    ) +
    labs(
      title = "Promedio acumulado",
      subtitle = paste0("Media final = ", round(mean(datos_n$y), 6), " mm"),
      x = "Mediciones acumuladas",
      y = "Promedio acumulado"
    )
  
  g1 + g2 + plot_layout(widths = c(1, 1))
}

interpretar_normal <- function(datos_n) {
  n_actual <- unique(datos_n$n)
  media_n <- mean(datos_n$y)
  error_abs <- abs(media_n - mu_normal)
  
  conclusion <- case_when(
    n_actual <= 50 ~ "La muestra es pequeña y el promedio del error puede alejarse temporalmente de cero.",
    n_actual < 1000 ~ "El promedio acumulado se aproxima a cero, aunque aún presenta fluctuaciones.",
    TRUE ~ "El promedio se estabiliza alrededor de cero, compensando errores positivos y negativos."
  )
  
  paste0(
    "\n\n**Interpretación para n = ", n_actual, ".** ",
    "La media muestral del error fue ", round(media_n, 6),
    " mm y el valor esperado teórico es 0 mm. ",
    "El error absoluto fue ", round(error_abs, 6), " mm. ",
    conclusion,
    "\n\n"
  )
}
for(n_actual in n_cortes) {
  datos_n <- datos_normal %>% filter(n == n_actual)
  cat("\n\n### n =", n_actual, "\n\n")
  print(graficar_normal(datos_n))
  cat(interpretar_normal(datos_n))
}

8.2.1 n = 10

Interpretación para n = 10. La media muestral del error fue 0.002228 mm y el valor esperado teórico es 0 mm. El error absoluto fue 0.002228 mm. La muestra es pequeña y el promedio del error puede alejarse temporalmente de cero.

8.2.2 n = 50

Interpretación para n = 50. La media muestral del error fue -0.002169 mm y el valor esperado teórico es 0 mm. El error absoluto fue 0.002169 mm. La muestra es pequeña y el promedio del error puede alejarse temporalmente de cero.

8.2.3 n = 100

Interpretación para n = 100. La media muestral del error fue 0.002911 mm y el valor esperado teórico es 0 mm. El error absoluto fue 0.002911 mm. El promedio acumulado se aproxima a cero, aunque aún presenta fluctuaciones.

8.2.4 n = 1000

Interpretación para n = 1000. La media muestral del error fue -5.5e-05 mm y el valor esperado teórico es 0 mm. El error absoluto fue 5.5e-05 mm. El promedio se estabiliza alrededor de cero, compensando errores positivos y negativos.

8.2.5 n = 10000

Interpretación para n = 10000. La media muestral del error fue -5.3e-05 mm y el valor esperado teórico es 0 mm. El error absoluto fue 5.3e-05 mm. El promedio se estabiliza alrededor de cero, compensando errores positivos y negativos.

9 Estabilización cuantitativa

Para la variable discreta se considera estabilización cuando el error relativo es menor o igual al 5%. Para la variable continua se usa error absoluto menor o igual a 0.002 mm, porque su valor esperado es cero.

obtener_estabilidad_relativa <- function(tabla_resumen, umbral = 5) {
  candidatos <- tabla_resumen %>%
    filter(error_relativo_pct <= umbral) %>%
    pull(n)
  
  if(length(candidatos) == 0) NA else min(candidatos)
}

obtener_estabilidad_absoluta <- function(tabla_resumen, umbral = 0.002) {
  candidatos <- tabla_resumen %>%
    filter(error_absoluto <= umbral) %>%
    pull(n)
  
  if(length(candidatos) == 0) NA else min(candidatos)
}

tabla_estabilidad <- tibble(
  Variable = c(
    "Mediciones fuera de tolerancia",
    "Error de medición"
  ),
  Distribucion = c(
    "Binomial(20, 0.15)",
    "Normal(0, 0.02)"
  ),
  Valor_esperado = c(mu_binom, mu_normal),
  Criterio = c(
    "Error relativo <= 5%",
    "Error absoluto <= 0.002 mm"
  ),
  Primer_n_estable = c(
    obtener_estabilidad_relativa(resumen_binom),
    obtener_estabilidad_absoluta(resumen_normal)
  )
)

kable(
  tabla_estabilidad,
  caption = "Primer tamaño de muestra donde se cumple el criterio de estabilización"
)
Primer tamaño de muestra donde se cumple el criterio de estabilización
Variable Distribucion Valor_esperado Criterio Primer_n_estable
Mediciones fuera de tolerancia Binomial(20, 0.15) 3 Error relativo <= 5% 50
Error de medición Normal(0, 0.02) 0 Error absoluto <= 0.002 mm 1000

10 Análisis general

Los resultados muestran que el promedio muestral se aproxima al valor esperado conforme aumenta el tamaño de muestra. Para \(X \sim Binomial(20,0.15)\), la media se estabiliza alrededor de \(E[X]=3\), lo que representa el promedio esperado de mediciones fuera de tolerancia en una práctica.

Para \(Y \sim Normal(0,0.02)\), la media se estabiliza alrededor de \(E[Y]=0\), lo que indica ausencia de sesgo sistemático en el error de medición cuando se acumula un número grande de observaciones.

Las muestras pequeñas presentan mayor variabilidad porque pocas observaciones no representan de forma estable el comportamiento poblacional. En cambio, en \(n=1000\) y \(n=10000\) se observa una convergencia visual y cuantitativa más clara.

11 Razones para simular

La simulación permite estudiar el comportamiento de las mediciones sin recolectar miles de datos reales en laboratorio. En educación automotriz, levantar muestras grandes puede requerir muchos estudiantes, instrumentos calibrados, piezas patrón y varias jornadas de práctica.

La principal restricción es que los resultados dependen del modelo probabilístico seleccionado. En datos reales podrían influir la habilidad del estudiante, la calibración del instrumento, la iluminación, la temperatura, el desgaste de la pieza y la técnica de medición.

12 Conclusiones

La simulación confirma la Ley de los Grandes Números en un contexto de metrología automotriz. Para la variable discreta, el promedio de mediciones fuera de tolerancia converge hacia 3. Para la variable continua, el promedio del error de medición converge hacia 0 mm.

En ambos casos, la estabilidad mejora conforme aumenta \(n\). Visualmente, la convergencia se aprecia con mayor claridad desde \(n=1000\) y se confirma en \(n=10000\).

13 Referencias

BIPM, IEC, IFCC, ILAC, ISO, IUPAC, IUPAP, & OIML. (2008). Evaluation of measurement data—Guide to the expression of uncertainty in measurement (JCGM 100:2008).

JCGM. (2012). International vocabulary of metrology—Basic and general concepts and associated terms (VIM, 3rd ed., JCGM 200:2012).

Universidad Politécnica Estatal del Carchi. (2026). Distribuciones de variables aleatorias discretas [Material de clase].

Universidad Politécnica Estatal del Carchi. (2026). Distribuciones de variables aleatorias continuas [Material de clase].

Universidad Politécnica Estatal del Carchi. (2026). Simulación de muestras aleatorias [Material de clase].