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 \]
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))
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:
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.
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.
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"
)
| 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 |
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)
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)"
)
| 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 |
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))
}
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.
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.
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.
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.
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.
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)"
)
| 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 |
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))
}
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.
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.
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.
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.
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.
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"
)
| 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 |
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.
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.
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\).
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].