Fundamentos para la Investigación Experimental en Ingeniería, Ciencias y Humanidades
Estimados estudiantes de Maestría en Ingenierías y Especialización en Estadística Aplicada, bienvenidos al curso de Diseño de Experimentos.
El interés principal de estas notas de clases es sentar las bases para la preparación de un documento fruto de investigación y trabajo en común, para el cual están cordialmente invitados, puesto que este curso los preparará para iniciar investigaciones en cualquiera de los campos de la Ingeniería, las Ciencias de la Salud, las Humanidades y las Ciencias Básicas, donde se vean involucrados los diseños experimentales, y es deseo del autor, incorporar a éstas notas esas futuras investigaciones.
En este documento encontramos algunas temáticas tratadas textualmente de los textos:
📘 Análisis y Diseños de Experimentos de los autores Humberto Gutiérrez Pulido y Román de la Vara Salazar;
📗 Diseño y Análisis de Experimentos de Douglas Montgomery,
que son los textos más importantes y reconocidos en este tema y, de antemano, los invito a que los adquieran, pues serán de gran ayuda para el éxito del curso.
Muchas cosas se quedan por fuera de estas notas, pero esperamos que siembren el deseo de fomentar una cultura en este campo.
De la teoría a la práctica: el camino del investigador
La estadística es, en principio, una ciencia auxiliar; sus procedimientos nos ayudan a encontrar, verificar y/o rechazar, si es del caso, ciertos aspectos, relaciones, reglas, propiedades, etc., que pueden ser relevantes para algún problema de investigación.
Desde este punto de vista, el trabajo estadístico del investigador involucra una serie de pasos al momento de iniciar el estudio de un problema, los cuales se describen a continuación:
Toda investigación empieza con un problema práctico de un contexto en particular. En la exploración del problema, se deben: identificar las variables que involucra o lo explican; considerar las escalas adecuadas (nominal, ordinal, métrica); distinguir entre variables independientes (X) (causas) y variables dependientes (Y) (efectos).
Consiste en traducir el problema a un modelo probabilístico. Si \(Y\) es la v.a. que representa el problema, su función densidad se denomina modelo probabilístico: \(Y \sim f_Y(y, \theta)\).
Se observa \(n\) veces la variable, obteniendo una muestra \(\mathbf{Y} = (Y_1, \ldots, Y_n)\) cuya distribución conjunta es el modelo estadístico.
Funciones \(S(\mathbf{Y})\) que reducen la dimensión de los datos. Las estadísticas suficientes permiten esta reducción sin pérdida de información.
Estimación puntual: \(\hat{\theta}(\mathbf{Y})\); Estimación por intervalo: \(IC(\mathbf{y}) = \hat{\theta}(\mathbf{y}) \pm D(\mathbf{y})\).
Se prueba \(H_0\) vs \(H_1\) con un nivel de significancia \(\alpha\) (error tipo I).
📊 EL CICLO DEL TRABAJO ESTADÍSTICO
En esta sección se tratarán funciones de las variables \(Y_1, Y_2, \ldots, Y_n\) observadas en una muestra aleatoria de tamaño \(n\) seleccionada de una población bajo estudio. El supuesto básico es que las variables son independientes y tienen una distribución común \(f_{Y_i}(y_i, \theta)\).
Un estadístico \(S(\mathbf{Y}) = S(Y_1, Y_2, \ldots, Y_n)\) es una función de las variables aleatorias que se pueden observar en una muestra. Al ser \(S(\mathbf{Y})\) una variable aleatoria, su distribución de probabilidad se llama distribución muestral.
Si se desean estimar la media y la varianza de una población \(\theta = (\mu, \sigma^2)\), se usan los estadísticos:
\[\bar{Y} = \frac{1}{n} \sum_{i=1}^{n} Y_i\]
\[S^2 = \frac{1}{n-1} \sum_{i=1}^{n} (Y_i - \bar{Y})^2\]
Sea \(Y_1, Y_2, \ldots, Y_n\) una muestra aleatoria de tamaño \(n\) tomada de una distribución normal con media \(\mu\) y varianza \(\sigma^2\). Entonces:
\[\bar{Y} = \frac{1}{n} \sum_{i=1}^{n} Y_i \sim N\left(\mu, \frac{\sigma^2}{n}\right)\]
Una embotelladora llena botellas con contenido \(Y \sim N(\mu, 1)\). Se toma una muestra de \(n=9\) botellas.
(a) Probabilidad de que \(|\bar{Y} - \mu| \leq 0.3\)
(b) Tamaño de muestra para que \(P(|\bar{Y} - \mu| \leq 0.3) = 0.95\)
📝 Solución Analítica
(a) \(P(|\bar{Y} - \mu| \leq 0.3) = P(-0.9 \leq Z \leq 0.9) = 0.6318\)
(b) \(0.3\sqrt{n} = 1.96 \Rightarrow n = 42.68 \approx 43\)
# ============================================
# EJEMPLO DE LA EMBOTELLADORA
# Distribución muestral de la media
# ============================================
# Parámetros
sigma <- 1
n <- 9
error <- 0.3
# (a) Probabilidad de que |Xbar - mu| <= 0.3
# La distribución de Xbar es N(mu, sigma^2/n)
# La variable tipificada Z = (Xbar - mu)/(sigma/sqrt(n))
z_value <- error / (sigma / sqrt(n))
prob_a <- pnorm(z_value) - pnorm(-z_value)
cat("(a) P(|Xbar - mu| <= 0.3) =", round(prob_a, 4), "\n")
# (b) Tamaño de muestra necesario
confianza <- 0.95
z_alpha_2 <- qnorm((1 + confianza)/2) # 1.96 para 95%
n_required <- (z_alpha_2 * sigma / error)^2
cat("(b) Tamaño de muestra necesario:", ceiling(n_required), "\n\n")
# ============================================
# VISUALIZACIÓN DE LA DISTRIBUCIÓN MUESTRAL
# ============================================
# Para n = 9
mu <- 0 # Centramos en 0 para visualizar la desviación
x_vals <- seq(-1, 1, length.out = 200)
densidad <- dnorm(x_vals, mean = mu, sd = sigma/sqrt(9))
# Región de aceptación (|Xbar - mu| <= 0.3)
x_fill <- seq(-0.3, 0.3, length.out = 100)
y_fill <- dnorm(x_fill, mean = mu, sd = sigma/sqrt(9))
# Gráfico
par(mfrow = c(1, 2), mar = c(4, 4, 4, 2))
# Gráfico 1: n = 9
plot(x_vals, densidad, type = "l", lwd = 2, col = "steelblue",
xlab = expression(bar(Y) - mu), ylab = "Densidad",
main = paste("Distribución muestral n = 9\nÁrea sombreada =", round(prob_a, 4)))
polygon(c(x_fill, rev(x_fill)), c(y_fill, rep(0, length(x_fill))),
col = rgb(0.2, 0.6, 0.8, 0.4), border = NA)
abline(v = c(-0.3, 0.3), lty = 2, col = "red")
legend("topright", legend = paste("P =", round(prob_a, 4)),
fill = rgb(0.2, 0.6, 0.8, 0.4), bty = "n")
# Gráfico 2: Comparación de tamaños de muestra
n_values <- c(9, 20, 43, 100)
colors <- c("steelblue", "forestgreen", "orange", "red")
plot(0, 0, type = "n", xlim = c(-1, 1), ylim = c(0, 5),
xlab = expression(bar(Y) - mu), ylab = "Densidad",
main = "Efecto del tamaño de muestra\nen la precisión")
for (i in 1:length(n_values)) {
x <- seq(-1, 1, length.out = 200)
y <- dnorm(x, mean = 0, sd = sigma/sqrt(n_values[i]))
lines(x, y, col = colors[i], lwd = 2)
# Marcar región de error
abline(v = c(-0.3, 0.3), lty = 2, col = "gray")
}
legend("topright", legend = paste("n =", n_values),
col = colors, lwd = 2, bty = "n")
# ============================================
# EJEMPLO DE LA EMBOTELLADORA
# Distribución muestral de la media
# ============================================
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Parámetros
sigma = 1
n = 9
error = 0.3
# (a) Probabilidad de que |Xbar - mu| <= 0.3
z_value = error / (sigma / np.sqrt(n))
prob_a = norm.cdf(z_value) - norm.cdf(-z_value)
print(f"(a) P(|Xbar - mu| <= 0.3) = {prob_a:.4f}")
# (b) Tamaño de muestra necesario
confianza = 0.95
z_alpha_2 = norm.ppf((1 + confianza)/2) # 1.96 para 95%
n_required = (z_alpha_2 * sigma / error)**2
print(f"(b) Tamaño de muestra necesario: {int(np.ceil(n_required))}")
# ============================================
# VISUALIZACIÓN DE LA DISTRIBUCIÓN MUESTRAL
# ============================================
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Gráfico 1: n = 9
mu = 0 # Centramos en 0 para visualizar la desviación
x_vals = np.linspace(-1, 1, 200)
densidad = norm.pdf(x_vals, loc=mu, scale=sigma/np.sqrt(9))
axes[0].plot(x_vals, densidad, 'b-', lw=2, label='Distribución muestral')
# Región de aceptación
x_fill = np.linspace(-0.3, 0.3, 100)
y_fill = norm.pdf(x_fill, loc=mu, scale=sigma/np.sqrt(9))
axes[0].fill_between(x_fill, y_fill, alpha=0.4, color='steelblue',
label=f'Área = {prob_a:.4f}')
axes[0].axvline(-0.3, color='red', linestyle='--')
axes[0].axvline(0.3, color='red', linestyle='--')
axes[0].set_xlabel(r'$\bar{Y} - \mu$')
axes[0].set_ylabel('Densidad')
axes[0].set_title(f'Distribución muestral n = 9')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# Gráfico 2: Comparación de tamaños de muestra
n_values = [9, 20, 43, 100]
colors = ['steelblue', 'forestgreen', 'orange', 'red']
for i, n_val in enumerate(n_values):
x = np.linspace(-1, 1, 200)
y = norm.pdf(x, loc=0, scale=sigma/np.sqrt(n_val))
axes[1].plot(x, y, color=colors[i], lw=2, label=f'n = {n_val}')
axes[1].axvline(-0.3, color='gray', linestyle='--', alpha=0.7)
axes[1].axvline(0.3, color='gray', linestyle='--', alpha=0.7)
axes[1].set_xlabel(r'$\bar{Y} - \mu$')
axes[1].set_ylabel('Densidad')
axes[1].set_title('Efecto del tamaño de muestra en la precisión')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Sea \(Y_1, Y_2, \ldots, Y_n\) una muestra aleatoria de tamaño \(n\) tomada de una población con media \(\mu\) y varianza finita \(\sigma^2\) (no necesariamente normal). Entonces, para \(n\) suficientemente grande:
\[\bar{Y} \approx N\left(\mu, \frac{\sigma^2}{n}\right)\]
# ============================================
# SIMULACIÓN DEL TEOREMA DEL LÍMITE CENTRAL
# Población no normal (distribución exponencial)
# ============================================
# Configuración de la simulación
set.seed(123)
n_simulaciones <- 10000
n_muestras <- c(1, 5, 10, 30) # Diferentes tamaños de muestra
# Función para generar medias muestrales
generar_medias <- function(n, n_sim, lambda = 1) {
replicas <- replicate(n_sim, mean(rexp(n, rate = lambda)))
return(replicas)
}
# Parámetro de la exponencial
lambda <- 1 # media = 1, varianza = 1
mu_poblacional <- 1/lambda
sigma_poblacional <- 1/lambda
# Crear gráficos
par(mfrow = c(2, 2), mar = c(4, 4, 4, 2))
for (n in n_muestras) {
# Generar medias muestrales
medias <- generar_medias(n, n_simulaciones, lambda)
# Histograma
hist(medias, breaks = 30, prob = TRUE,
main = paste("n =", n),
xlab = expression(bar(Y)),
col = rgb(0.2, 0.6, 0.8, 0.6),
border = "white")
# Superponer curva normal teórica
x_vals <- seq(min(medias), max(medias), length.out = 100)
curve(dnorm(x_vals, mean = mu_poblacional,
sd = sigma_poblacional/sqrt(n)),
add = TRUE, col = "red", lwd = 2)
# Superponer densidad estimada
lines(density(medias), col = "darkgreen", lwd = 2, lty = 2)
legend("topright",
legend = c("Distribución normal teórica", "Densidad estimada"),
col = c("red", "darkgreen"), lwd = 2, lty = c(1, 2), bty = "n")
# Agregar texto con media y varianza
text(x = quantile(medias, 0.05),
y = max(hist(medias, plot = FALSE)$density) * 0.9,
labels = paste("Media =", round(mean(medias), 3),
"\nVar =", round(var(medias), 3)),
cex = 0.8, pos = 4)
}
# Título general
mtext("Teorema del Límite Central - Población Exponencial",
outer = TRUE, cex = 1.2, line = -1)
# ============================================
# COMPARACIÓN CON DIFERENTES POBLACIONES
# ============================================
# Funciones para generar diferentes distribuciones
generar_poblacion <- function(n, tipo, n_sim = 10000) {
if (tipo == "uniforme") {
datos <- replicate(n_sim, mean(runif(n, min = 0, max = 1)))
mu <- 0.5; sigma <- sqrt(1/12)
} else if (tipo == "exponencial") {
datos <- replicate(n_sim, mean(rexp(n, rate = 1)))
mu <- 1; sigma <- 1
} else if (tipo == "binomial") {
datos <- replicate(n_sim, mean(rbinom(n, size = 1, prob = 0.2)))
mu <- 0.2; sigma <- sqrt(0.2 * 0.8)
} else if (tipo == "poisson") {
datos <- replicate(n_sim, mean(rpois(n, lambda = 2)))
mu <- 2; sigma <- sqrt(2)
}
return(list(datos = datos, mu = mu, sigma = sigma))
}
# Parámetros de simulación
n_sim <- 10000
n <- 30
tipos <- c("uniforme", "exponencial", "binomial", "poisson")
nombres <- c("Uniforme(0,1)", "Exponencial(1)",
"Binomial(1,0.2)", "Poisson(2)")
par(mfrow = c(2, 2), mar = c(4, 4, 4, 2))
for (i in 1:length(tipos)) {
resultado <- generar_poblacion(n, tipos[i], n_sim)
medias <- resultado$datos
mu <- resultado$mu
sigma <- resultado$sigma
hist(medias, breaks = 30, prob = TRUE,
main = paste("Población:", nombres[i], "\nn =", n),
xlab = expression(bar(Y)),
col = rgb(0.2, 0.6, 0.8, 0.6),
border = "white")
# Curva normal teórica
x_vals <- seq(min(medias), max(medias), length.out = 100)
lines(x_vals, dnorm(x_vals, mean = mu, sd = sigma/sqrt(n)),
col = "red", lwd = 2)
# Densidad estimada
lines(density(medias), col = "darkgreen", lwd = 2, lty = 2)
legend("topright",
legend = c("Normal teórica", "Densidad estimada"),
col = c("red", "darkgreen"), lwd = 2, lty = c(1, 2), bty = "n")
}
mtext("Teorema del Límite Central - Diferentes poblaciones (n=30)",
outer = TRUE, cex = 1.2, line = -1)
# ============================================
# SIMULACIÓN DEL TEOREMA DEL LÍMITE CENTRAL
# Población no normal (distribución exponencial)
# ============================================
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, uniform, expon, binom, poisson
# Configuración
np.random.seed(123)
n_simulaciones = 10000
n_muestras = [1, 5, 10, 30]
# Función para generar medias muestrales de población exponencial
def generar_medias(n, n_sim, lambda_param=1):
muestras = np.random.exponential(scale=1/lambda_param,
size=(n_sim, n))
return muestras.mean(axis=1)
# Parámetros de la exponencial (media = 1)
mu_poblacional = 1
sigma_poblacional = 1
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()
for idx, n in enumerate(n_muestras):
# Generar medias muestrales
medias = generar_medias(n, n_simulaciones)
# Histograma
axes[idx].hist(medias, bins=30, density=True, alpha=0.6,
color='steelblue', edgecolor='white')
# Curva normal teórica
x_vals = np.linspace(medias.min(), medias.max(), 100)
y_normal = norm.pdf(x_vals, loc=mu_poblacional,
scale=sigma_poblacional/np.sqrt(n))
axes[idx].plot(x_vals, y_normal, 'r-', lw=2, label='Normal teórica')
# Densidad estimada
from scipy.stats import gaussian_kde
kde = gaussian_kde(medias)
axes[idx].plot(x_vals, kde(x_vals), 'g--', lw=2,
label='Densidad estimada')
axes[idx].set_title(f'n = {n}')
axes[idx].set_xlabel(r'$\bar{Y}$')
axes[idx].set_ylabel('Densidad')
axes[idx].legend()
axes[idx].grid(True, alpha=0.3)
# Texto con estadísticas
axes[idx].text(0.05, 0.95,
f'Media = {medias.mean():.3f}\nVar = {medias.var():.3f}',
transform=axes[idx].transAxes, verticalalignment='top',
bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
plt.suptitle('Teorema del Límite Central - Población Exponencial', fontsize=14)
plt.tight_layout()
plt.show()
# ============================================
# COMPARACIÓN CON DIFERENTES POBLACIONES
# ============================================
def generar_medias_poblacion(n, n_sim, distribucion, **kwargs):
if distribucion == 'uniforme':
muestras = np.random.uniform(0, 1, size=(n_sim, n))
mu, sigma = 0.5, np.sqrt(1/12)
elif distribucion == 'exponencial':
muestras = np.random.exponential(scale=1, size=(n_sim, n))
mu, sigma = 1, 1
elif distribucion == 'binomial':
p = kwargs.get('p', 0.2)
muestras = np.random.binomial(1, p, size=(n_sim, n))
mu, sigma = p, np.sqrt(p*(1-p))
elif distribucion == 'poisson':
lam = kwargs.get('lam', 2)
muestras = np.random.poisson(lam, size=(n_sim, n))
mu, sigma = lam, np.sqrt(lam)
return muestras.mean(axis=1), mu, sigma
# Parámetros
n_sim = 10000
n = 30
distribuciones = {
'Uniforme(0,1)': ('uniforme', {}),
'Exponencial(1)': ('exponencial', {}),
'Binomial(1,0.2)': ('binomial', {'p': 0.2}),
'Poisson(2)': ('poisson', {'lam': 2})
}
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()
for idx, (nombre, (tipo, params)) in enumerate(distribuciones.items()):
medias, mu, sigma = generar_medias_poblacion(n, n_sim, tipo, **params)
axes[idx].hist(medias, bins=30, density=True, alpha=0.6,
color='steelblue', edgecolor='white')
x_vals = np.linspace(medias.min(), medias.max(), 100)
y_normal = norm.pdf(x_vals, loc=mu, scale=sigma/np.sqrt(n))
axes[idx].plot(x_vals, y_normal, 'r-', lw=2, label='Normal teórica')
kde = gaussian_kde(medias)
axes[idx].plot(x_vals, kde(x_vals), 'g--', lw=2,
label='Densidad estimada')
axes[idx].set_title(f'{nombre} (n = {n})')
axes[idx].set_xlabel(r'$\bar{Y}$')
axes[idx].set_ylabel('Densidad')
axes[idx].legend()
axes[idx].grid(True, alpha=0.3)
plt.suptitle('Teorema del Límite Central - Diferentes poblaciones', fontsize=14)
plt.tight_layout()
plt.show()
# ============================================
# INTERVALOS DE CONFIANZA PARA LA MEDIA
# ============================================
# Generar una muestra
set.seed(456)
n <- 30
mu_verdadera <- 100
sigma <- 15
muestra <- rnorm(n, mean = mu_verdadera, sd = sigma)
# Estadísticos
media_muestral <- mean(muestra)
desv_muestral <- sd(muestra)
error_estandar <- desv_muestral / sqrt(n)
# Intervalo de confianza del 95%
confianza <- 0.95
t_valor <- qt((1 + confianza)/2, df = n - 1)
ic_inferior <- media_muestral - t_valor * error_estandar
ic_superior <- media_muestral + t_valor * error_estandar
cat("Media muestral:", round(media_muestral, 2), "\n")
cat("Desviación estándar muestral:", round(desv_muestral, 2), "\n")
cat("IC 95%: [", round(ic_inferior, 2), ",", round(ic_superior, 2), "]\n")
# ============================================
# VISUALIZACIÓN DEL INTERVALO DE CONFIANZA
# ============================================
# Simulación de múltiples muestras para mostrar cobertura
n_sim <- 100
n_muestra <- 30
confianza <- 0.95
t_valor <- qt((1 + confianza)/2, df = n_muestra - 1)
# Almacenar resultados
contiene_mu <- logical(n_sim)
ic_inferiores <- numeric(n_sim)
ic_superiores <- numeric(n_sim)
for (i in 1:n_sim) {
muestra_i <- rnorm(n_muestra, mean = mu_verdadera, sd = sigma)
media_i <- mean(muestra_i)
desv_i <- sd(muestra_i)
ee_i <- desv_i / sqrt(n_muestra)
ic_inferiores[i] <- media_i - t_valor * ee_i
ic_superiores[i] <- media_i + t_valor * ee_i
contiene_mu[i] <- (ic_inferiores[i] <= mu_verdadera &
ic_superiores[i] >= mu_verdadera)
}
# Gráfico de intervalos
plot(1:n_sim, ic_inferiores, type = "n",
xlab = "Muestra", ylab = "Intervalo de confianza",
ylim = range(c(ic_inferiores, ic_superiores)),
main = paste("Intervalos de confianza del", confianza*100, "%\n",
"Cobertura:", mean(contiene_mu)*100, "%"))
for (i in 1:n_sim) {
if (contiene_mu[i]) {
segments(i, ic_inferiores[i], i, ic_superiores[i], col = "steelblue", lwd = 1)
} else {
segments(i, ic_inferiores[i], i, ic_superiores[i], col = "red", lwd = 2)
}
}
abline(h = mu_verdadera, col = "darkgreen", lwd = 2, lty = 2)
legend("topright", legend = c("Intervalo contiene μ", "Intervalo NO contiene μ", "μ verdadera"),
col = c("steelblue", "red", "darkgreen"), lwd = c(1, 2, 2), lty = c(1, 1, 2))
# ============================================
# INTERVALOS DE CONFIANZA PARA LA MEDIA
# ============================================
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# Generar una muestra
np.random.seed(456)
n = 30
mu_verdadera = 100
sigma = 15
muestra = np.random.normal(mu_verdadera, sigma, n)
# Estadísticos
media_muestral = np.mean(muestra)
desv_muestral = np.std(muestra, ddof=1)
error_estandar = desv_muestral / np.sqrt(n)
# Intervalo de confianza del 95%
confianza = 0.95
t_valor = stats.t.ppf((1 + confianza)/2, df=n-1)
ic_inferior = media_muestral - t_valor * error_estandar
ic_superior = media_muestral + t_valor * error_estandar
print(f"Media muestral: {media_muestral:.2f}")
print(f"Desviación estándar muestral: {desv_muestral:.2f}")
print(f"IC 95%: [{ic_inferior:.2f}, {ic_superior:.2f}]")
# ============================================
# VISUALIZACIÓN DE INTERVALOS DE CONFIANZA
# ============================================
# Simulación de múltiples muestras
n_sim = 100
n_muestra = 30
confianza = 0.95
t_valor = stats.t.ppf((1 + confianza)/2, df=n_muestra-1)
# Almacenar resultados
ic_inferiores = []
ic_superiores = []
contiene_mu = []
for i in range(n_sim):
muestra_i = np.random.normal(mu_verdadera, sigma, n_muestra)
media_i = np.mean(muestra_i)
desv_i = np.std(muestra_i, ddof=1)
ee_i = desv_i / np.sqrt(n_muestra)
ic_inf = media_i - t_valor * ee_i
ic_sup = media_i + t_valor * ee_i
ic_inferiores.append(ic_inf)
ic_superiores.append(ic_sup)
contiene_mu.append(ic_inf <= mu_verdadera <= ic_sup)
# Convertir a arrays
ic_inferiores = np.array(ic_inferiores)
ic_superiores = np.array(ic_superiores)
contiene_mu = np.array(contiene_mu)
# Gráfico
fig, ax = plt.subplots(figsize=(12, 6))
for i in range(n_sim):
color = 'steelblue' if contiene_mu[i] else 'red'
ax.plot([i+1, i+1], [ic_inferiores[i], ic_superiores[i]],
color=color, lw=1 if contiene_mu[i] else 2)
ax.axhline(mu_verdadera, color='darkgreen', lw=2, linestyle='--',
label='μ verdadera')
ax.set_xlabel('Muestra')
ax.set_ylabel('Intervalo de confianza')
ax.set_title(f'Intervalos de confianza del {confianza*100}%\n'
f'Cobertura: {np.mean(contiene_mu)*100:.1f}%')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
✅ RESUMEN - ESTADÍSTICA INFERENCIAL
Seis pasos: Problema → Modelo Probabilístico → Modelo
Estadístico → Muestreo Aleatorio → Estimación → Prueba de Hipótesis
Teorema del Límite Central: Para \(n\) grande, \(\bar{Y} \approx N(\mu, \sigma^2/n)\),
independientemente de la distribución original.
Herramientas
computacionales: R y Python permiten simular, visualizar y
validar estos conceptos fundamentales.