📚 DISEÑO DE EXPERIMENTOS

📖 PREFACIO

Fundamentos para la Investigación Experimental en Ingeniería, Ciencias y Humanidades


📌 PREFACIO

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.

El autor

📌 ESTADÍSTICA INFERENCIAL

📊 ESTADÍSTICA INFERENCIAL

De la teoría a la práctica: el camino del investigador


📌 1. INTRODUCCIÓN

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.


📌 2. LOS SEIS PASOS DEL TRABAJO ESTADÍSTICO

🔍 EL CAMINO DEL INVESTIGADOR

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:

📌 Primer paso: El problema práctico

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).

📌 Segundo paso: El modelo probabilístico

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)\).

📌 Tercer paso: El modelo estadístico

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.

📌 Cuarto paso: Las Estadísticas

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.

📌 Quinto paso: Estimación

Estimación puntual: \(\hat{\theta}(\mathbf{Y})\); Estimación por intervalo: \(IC(\mathbf{y}) = \hat{\theta}(\mathbf{y}) \pm D(\mathbf{y})\).

📌 Sexto paso: Prueba de Hipótesis

Se prueba \(H_0\) vs \(H_1\) con un nivel de significancia \(\alpha\) (error tipo I).

📊 EL CICLO DEL TRABAJO ESTADÍSTICO

1️⃣ Problema
2️⃣ Modelo Probabilístico
3️⃣ Modelo Estadístico
4️⃣ Muestreo Aleatorio
5️⃣ Estimación
6️⃣ Prueba de Hipótesis

📌 3. DISTRIBUCIONES MUESTRALES Y EL TEOREMA DEL LÍMITE CENTRAL

🔍 DISTRIBUCIONES MUESTRALES

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)\).


📌 Definición de un Estadístico

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.


📌 Ejemplo de Estadísticos

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\]


📌 Teorema: Distribución muestral para la media de una población normal

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)\]


📌 Ejemplo con Estadísticos: La embotelladora

🥤 Problema contextual

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\)


💻 Código en R

# ============================================
# 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 con Visualización en Python

# ============================================
# 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()

📌 Teorema del Límite Central (TLC)

🎯 El Teorema Fundamental de la Inferencia Estadística

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

💻 Simulación en R: Demostración del TLC

# ============================================
# 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 en Python: Teorema del Límite Central

# ============================================
# 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()

📌 Aplicación Práctica: Intervalos de Confianza

📊 Construcción de Intervalos de Confianza

# ============================================
# 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.