Con Mi Profe: Julio Hurtado Marquez; EMAIL_TAREAS: juliohurtado210307@gmail.com
Las pruebas de hipótesis para la varianza poblacional (σ²) se basan en la distribución χ² (chi-cuadrado). El estadístico de prueba es:
χ² = (n - 1) S² / σ₀²
donde S² es la varianza muestral, σ₀² es la varianza bajo H₀, y los grados de libertad son gl = n - 1. Este estadístico sigue una distribución χ² con n-1 grados de libertad, bajo el supuesto de normalidad de la población.
Contexto: Una máquina debe producir piezas con una varianza en las dimensiones no superior a 0.04 mm². Se toma una muestra de 25 piezas y se obtiene una varianza muestral de 0.06 mm². Pruebe si la varianza es mayor que la especificada con α = 0.05.
H₀: σ² = 0.04 vs H₁: σ² > 0.04Paso 2: Datos
n = 25, S² = 0.06, σ₀² = 0.04, gl = 24Paso 3: Estadístico de prueba
χ² = (24 × 0.06) / 0.04 = 1.44 / 0.04 = 36.0Paso 4: Región de rechazo (α=0.05, gl=24, χ²_{0.05,24} = 36.415)
χ² = 36.0 < 36.415 → No rechazamos H₀
Conclusión: No hay suficiente evidencia para afirmar que la varianza excede el límite especificado.
# Prueba de varianza (cola superior) n <- 25 var_muestral <- 0.06 var0 <- 0.04 alpha <- 0.05 gl <- n - 1 # Estadístico chi-cuadrado chi2_calc <- (n - 1) * var_muestral / var0 chi2_crit <- qchisq(1 - alpha, df = gl) p_valor <- 1 - pchisq(chi2_calc, df = gl) cat("Estadístico χ² =", round(chi2_calc, 4), "\n") cat("Valor crítico =", round(chi2_crit, 4), "\n") cat("p-valor =", round(p_valor, 4), "\n") # Visualización library(ggplot2) x <- seq(0, 55, length.out = 500) df_plot <- data.frame(x = x, y = dchisq(x, df = gl)) ggplot(df_plot, aes(x = x, y = y)) + geom_line(color = "blue", linewidth = 1) + geom_area(data = subset(df_plot, x > chi2_crit), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_vline(xintercept = chi2_calc, color = "darkgreen", linewidth = 1.2, linetype = "dashed") + geom_vline(xintercept = chi2_crit, color = "red", linewidth = 1, linetype = "dotted") + labs(title = "Prueba χ² para varianza (cola superior) - Ingeniería", x = "χ²", y = "Densidad") + theme_minimal()
Contexto: Un fondo de inversión afirma que la volatilidad (varianza) de sus rendimientos es no mayor a 0.0025. Una muestra de 20 meses muestra una varianza de 0.004. Pruebe si la varianza es mayor con α = 0.05.
n=20, S²=0.004, σ₀²=0.0025, gl=19 χ² = (19×0.004)/0.0025 = 0.076/0.0025 = 30.4 χ²_crítico (α=0.05, gl=19) = 30.144
30.4 > 30.144 → Rechazamos H₀ (la volatilidad es mayor)
import numpy as np from scipy.stats import chi2 n, var_muestral, var0 = 20, 0.004, 0.0025 gl = n - 1 chi2_calc = (n - 1) * var_muestral / var0 chi2_crit = chi2.ppf(0.95, gl) p_valor = 1 - chi2.cdf(chi2_calc, gl) print(f"χ² = {chi2_calc:.4f}, χ²_crítico = {chi2_crit:.4f}, p-valor = {p_valor:.4f}")
Contexto: Se cree que un programa de mindfulness reduce la variabilidad en los niveles de estrés. La varianza histórica es 25. Una muestra de 16 participantes después del programa tiene varianza 18. α = 0.05 (Nota: para probar reducción, usamos cola inferior). Replanteo: H₁: σ² < 25.
Contexto: Después de una mejora en el proceso, se espera que la variabilidad sea menor (σ² < 0.04). Se toman 25 piezas y se obtiene S² = 0.03. α = 0.05.
χ² = (24 × 0.03)/0.04 = 0.72/0.04 = 18.0 χ²_crítico (α=0.05, cola inferior, gl=24) = 13.848
18.0 > 13.848 → No rechazamos H₀ (no hay evidencia de reducción)
Contexto: Un programa busca reducir la variabilidad en los ingresos de trabajadores. La varianza histórica es 2500. Una muestra de 16 trabajadores da S² = 1600. α = 0.05.
χ² = (15 × 1600)/2500 = 24000/2500 = 9.6 χ²_crítico (α=0.05, cola inferior, gl=15) = 7.261
9.6 > 7.261 → No rechazamos H₀
Contexto: Una terapia busca homogeneizar los niveles de ansiedad (reducir varianza). Varianza histórica = 36. Muestra de 12 pacientes post-terapia: S² = 20. α = 0.05.
χ² = (11 × 20)/36 = 220/36 = 6.111 χ²_crítico (α=0.05, cola inferior, gl=11) = 4.575
6.111 > 4.575 → No rechazamos H₀
Contexto: Se quiere verificar si la varianza en las dimensiones de las piezas es diferente del estándar σ₀² = 0.04. Muestra de 25 piezas: S² = 0.05. α = 0.05.
χ² = (24 × 0.05)/0.04 = 1.2/0.04 = 30.0
χ²_críticos (α/2=0.025, gl=24): χ²_{0.025}=39.364, χ²_{0.975}=12.401
12.401 < 30.0 < 39.364 → No rechazamos H₀
# Prueba de varianza dos colas var_muestral <- 0.05 var0 <- 0.04 n <- 25 gl <- n - 1 chi2_calc <- (n - 1) * var_muestral / var0 chi2_inf <- qchisq(0.025, gl) chi2_sup <- qchisq(0.975, gl) cat("χ² =", round(chi2_calc, 4), "\n") cat("Intervalo de aceptación: [", round(chi2_inf, 4), ", ", round(chi2_sup, 4), "]\n") if (chi2_calc > chi2_sup || chi2_calc < chi2_inf) { cat("Rechazamos H₀: la varianza es diferente") } else { cat("No rechazamos H₀") } # Visualización dos colas x <- seq(0, 55, length.out = 500) df_plot <- data.frame(x = x, y = dchisq(x, df = gl)) ggplot(df_plot, aes(x = x, y = y)) + geom_line(color = "blue", linewidth = 1) + geom_area(data = subset(df_plot, x < chi2_inf), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_area(data = subset(df_plot, x > chi2_sup), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_vline(xintercept = chi2_calc, color = "darkgreen", linewidth = 1.2, linetype = "dashed") + geom_vline(xintercept = chi2_inf, color = "red", linewidth = 1, linetype = "dotted") + geom_vline(xintercept = chi2_sup, color = "red", linewidth = 1, linetype = "dotted") + labs(title = "Prueba χ² dos colas para varianza", x = "χ²", y = "Densidad") + theme_minimal()
Contexto: Se quiere verificar si la varianza en las ventas mensuales es diferente del valor histórico de 400. Muestra de 15 meses: S² = 625. α = 0.05.
χ² = (14×625)/400 = 8750/400 = 21.875
χ²_{0.025,14}=26.119, χ²_{0.975,14}=5.629 → 5.629 < 21.875 < 26.119 → No rechazar H₀
Contexto: Se quiere saber si la varianza en las respuestas a un test psicológico es diferente del valor estándar σ₀² = 100. Muestra de 20 personas: S² = 144. α = 0.05.
χ² = (19×144)/100 = 2736/100 = 27.36
χ²_{0.025,19}=32.852, χ²_{0.975,19}=8.907 → No rechazar H₀
| Tipo de prueba | Hipótesis | Estadístico χ² | Región de rechazo |
|---|---|---|---|
| Cola superior | H₀: σ² ≤ σ₀², H₁: σ² > σ₀² | (n-1)S²/σ₀² | χ² > χ²_{α, n-1} |
| Cola inferior | H₀: σ² ≥ σ₀², H₁: σ² < σ₀² | (n-1)S²/σ₀² | χ² < χ²_{1-α, n-1} |
| Dos colas | H₀: σ² = σ₀², H₁: σ² ≠ σ₀² | (n-1)S²/σ₀² | χ² < χ²_{1-α/2} o χ² > χ²_{α/2} |
| gl | χ²_{0.975} | χ²_{0.95} | χ²_{0.05} | χ²_{0.025} |
|---|---|---|---|---|
| 10 | 3.247 | 3.940 | 18.307 | 20.483 |
| 15 | 6.262 | 7.261 | 24.996 | 27.488 |
| 20 | 9.591 | 10.851 | 31.410 | 34.170 |
| 24 | 12.401 | 13.848 | 36.415 | 39.364 |
| 30 | 16.791 | 18.493 | 43.773 | 46.979 |
var.test() para comparar dos varianzas, pero para una
varianza se usa cálculo manual con qchisq() y
pchisq()
Las pruebas de hipótesis para el cociente de varianzas (σ₁²/σ₂²) se basan en la distribución F de Fisher-Snedecor. El estadístico de prueba es:
F = S₁² / S₂²
donde S₁² y S₂² son las varianzas muestrales de dos poblaciones independientes. Los grados de libertad son gl₁ = n₁ - 1 (numerador) y gl₂ = n₂ - 1 (denominador).
Suposiciones: Ambas poblaciones siguen una distribución normal (aproximadamente). Esta prueba es sensible a desviaciones de la normalidad.
Contexto: Se quiere determinar si la máquina A tiene mayor variabilidad en las dimensiones de las piezas que la máquina B. Se toman muestras: Máquina A: n₁=16, S₁²=0.08; Máquina B: n₂=20, S₂²=0.05. Pruebe con α = 0.05.
H₀: σ₁²/σ₂² = 1 vs H₁: σ₁²/σ₂² > 1Paso 2: Datos
n₁=16, S₁²=0.08; n₂=20, S₂²=0.05; gl₁=15, gl₂=19Paso 3: Estadístico de prueba
F = S₁² / S₂² = 0.08 / 0.05 = 1.6Paso 4: Región de rechazo (α=0.05, gl₁=15, gl₂=19)
F_{0.05,15,19} = 2.23
F = 1.6 < 2.23 → No rechazamos H₀
Conclusión: No hay suficiente evidencia para afirmar que la máquina A tiene mayor variabilidad que la máquina B.
# Prueba F para cociente de varianzas (cola superior) var1 <- 0.08; n1 <- 16 var2 <- 0.05; n2 <- 20 alpha <- 0.05 # Estadístico F F_calc <- var1 / var2 gl1 <- n1 - 1 gl2 <- n2 - 1 F_crit <- qf(1 - alpha, gl1, gl2) p_valor <- 1 - pf(F_calc, gl1, gl2) cat("Estadístico F =", round(F_calc, 4), "\n") cat("Valor crítico F(0.95,", gl1, ",", gl2, ") =", round(F_crit, 4), "\n") cat("p-valor =", round(p_valor, 4), "\n") # Prueba formal en R (dos colas, pero podemos ajustar) # Para simular datos, creamos muestras con estas varianzas set.seed(123) muestra1 <- rnorm(n1, mean = 0, sd = sqrt(var1)) muestra2 <- rnorm(n2, mean = 0, sd = sqrt(var2)) var.test(muestra1, muestra2, alternative = "greater") # Visualización library(ggplot2) x <- seq(0, 4, length.out = 500) df_plot <- data.frame(x = x, y = df(x, gl1, gl2)) ggplot(df_plot, aes(x = x, y = y)) + geom_line(color = "blue", linewidth = 1) + geom_area(data = subset(df_plot, x > F_crit), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_vline(xintercept = F_calc, color = "darkgreen", linewidth = 1.2, linetype = "dashed") + geom_vline(xintercept = F_crit, color = "red", linewidth = 1, linetype = "dotted") + labs(title = "Prueba F para cociente de varianzas (cola superior) - Ingeniería", x = "F", y = "Densidad") + theme_minimal()
Contexto: Se quiere determinar si el Fondo A tiene mayor volatilidad (riesgo) que el Fondo B. Fondo A: n₁=25 meses, S₁²=0.0036; Fondo B: n₂=30 meses, S₂²=0.0025. α = 0.05.
F = 0.0036/0.0025 = 1.44
gl₁=24, gl₂=29
F_{0.05,24,29} = 1.89
1.44 < 1.89 → No rechazamos H₀
import numpy as np from scipy.stats import f var1, n1 = 0.0036, 25 var2, n2 = 0.0025, 30 gl1, gl2 = n1-1, n2-1 F_calc = var1 / var2 F_crit = f.ppf(0.95, gl1, gl2) p_valor = 1 - f.cdf(F_calc, gl1, gl2) print(f"F = {F_calc:.4f}, F_crítico = {F_crit:.4f}, p-valor = {p_valor:.4f}")
Contexto: Se quiere saber si el Tratamiento A produce mayor variabilidad en los puntajes de ansiedad que el Tratamiento B. Tratamiento A: n₁=18, S₁²=64; Tratamiento B: n₂=22, S₂²=49. α = 0.05.
F = 64/49 = 1.306; F_{0.05,17,21}=2.12 → No rechazar H₀
Contexto: Se implementó un nuevo proceso que se espera tenga menor variabilidad que el proceso estándar. Proceso estándar: n₁=18, S₁²=0.12; Nuevo proceso: n₂=15, S₂²=0.06. Pruebe si la varianza del nuevo proceso es menor (σ₂²/σ₁² < 1) con α = 0.05.
Para probar que σ_nuevo² < σ_estándar², definimos F = σ_estándar²/σ_nuevo²
F = 0.12/0.06 = 2.0, gl₁=17, gl₂=14
F_{0.95,17,14} = 2.40 (para cola superior, pero queremos cola inferior)
Usamos el inverso: 1/F = 0.5, F_{0.05,14,17}=0.433. Como 2.0 > 0.433, no rechazamos H₀ (no hay evidencia de menor varianza).
Contexto: Se espera que después de un programa de capacitación, la variabilidad en los ingresos sea menor. Antes: n₁=20, S₁²=1600; Después: n₂=25, S₂²=900. α = 0.05.
F = 900/1600 = 0.5625 (varianza después/antes)
Para probar que σ₂²/σ₁² < 1, usamos F < F_{1-α}
F_crítico = f.ppf(0.05, 24, 19) = 0.509
0.5625 > 0.509 → No rechazamos H₀
Contexto: Una intervención busca homogeneizar los puntajes (reducir varianza). Pre-intervención: n₁=18, S₁²=100; Post-intervención: n₂=15, S₂²=64. α = 0.05.
F = 64/100 = 0.64, gl₁=14, gl₂=17
F_{0.05,14,17} = 0.444, 0.64 > 0.444 → No rechazar H₀
Contexto: Se quiere determinar si hay diferencia en la variabilidad de la resistencia de materiales de dos proveedores. Proveedor A: n₁=20, S₁²=0.09; Proveedor B: n₂=16, S₂²=0.04. α = 0.05.
F = 0.09/0.04 = 2.25
gl₁=19, gl₂=15
F_{0.025,19,15} = 2.76, F_{0.975,19,15} = 1/F_{0.025,15,19} = 1/2.67 = 0.375
0.375 < 2.25 < 2.76 → No rechazamos H₀
# Prueba F dos colas usando var.test con datos simulados set.seed(456) muestra1 <- rnorm(20, mean = 50, sd = sqrt(0.09)) muestra2 <- rnorm(16, mean = 50, sd = sqrt(0.04)) # Prueba de varianzas prueba_F <- var.test(muestra1, muestra2, alternative = "two.sided") print(prueba_F) # Visualización dos colas gl1 <- 19; gl2 <- 15 F_calc <- 0.09/0.04 F_inf <- qf(0.025, gl1, gl2) F_sup <- qf(0.975, gl1, gl2) x <- seq(0, 4, length.out = 500) df_plot <- data.frame(x = x, y = df(x, gl1, gl2)) ggplot(df_plot, aes(x = x, y = y)) + geom_line(color = "blue", linewidth = 1) + geom_area(data = subset(df_plot, x < F_inf), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_area(data = subset(df_plot, x > F_sup), aes(x = x, y = y), fill = "red", alpha = 0.5) + geom_vline(xintercept = F_calc, color = "darkgreen", linewidth = 1.2, linetype = "dashed") + geom_vline(xintercept = F_inf, color = "red", linewidth = 1, linetype = "dotted") + geom_vline(xintercept = F_sup, color = "red", linewidth = 1, linetype = "dotted") + labs(title = "Prueba F dos colas para cociente de varianzas", x = "F", y = "Densidad") + theme_minimal()
Contexto: Se quiere saber si la volatilidad (riesgo) de dos carteras de inversión es diferente. Cartera A: n₁=22, S₁²=0.01; Cartera B: n₂=18, S₂²=0.0064. α=0.05.
F = 0.01/0.0064 = 1.5625; F_{0.025,21,17}=2.67; F_{0.975,21,17}=0.37 → No rechazar H₀
Contexto: Se quiere determinar si la variabilidad en la respuesta a dos terapias es diferente. Terapia A: n₁=15, S₁²=36; Terapia B: n₂=18, S₂²=25. α=0.05.
F = 36/25 = 1.44; F_{0.025,14,17}=2.78; F_{0.975,14,17}=0.33 → No rechazar H₀
| Tipo de prueba | Hipótesis | Estadístico F | Región de rechazo |
|---|---|---|---|
| Cola superior | H₀: σ₁²/σ₂² = 1, H₁: σ₁²/σ₂² > 1 | S₁²/S₂² | F > F_{α, gl₁, gl₂} |
| Cola inferior | H₀: σ₁²/σ₂² = 1, H₁: σ₁²/σ₂² < 1 | S₁²/S₂² | F < F_{1-α, gl₁, gl₂} |
| Dos colas | H₀: σ₁²/σ₂² = 1, H₁: σ₁²/σ₂² ≠ 1 | S₁²/S₂² | F < F_{1-α/2} o F > F_{α/2} |
| gl₂₁ | 10 | 15 | 20 | 25 | 30 |
|---|---|---|---|---|---|
| 10 | 2.98 | 2.54 | 2.35 | 2.24 | 2.16 |
| 15 | 2.54 | 2.30 | 2.20 | 2.09 | 2.01 |
| 20 | 2.35 | 2.20 | 2.12 | 2.02 | 1.95 |
| 25 | 2.24 | 2.09 | 2.02 | 1.93 | 1.87 |
| 30 | 2.16 | 2.01 | 1.95 | 1.87 | 1.81 |
var.test() realiza la prueba F de
dos colas automáticamente
scipy.stats.f
para los cálculos o scipy.stats.bartlett() o
levene() para pruebas más robustas
Las pruebas de bondad de ajuste (Goodness-of-Fit) verifican si una muestra de datos proviene de una distribución teórica específica. Las principales pruebas incluyen:
Hipótesis general:
H₀: Los datos siguen la distribución teórica especificada H₁: Los datos NO siguen la distribución teórica especificada
La prueba de Shapiro-Wilk es la más potente para muestras pequeñas (n ≤ 2000). El estadístico W se aproxima a 1 si los datos son normales.
Contexto: Un ingeniero quiere verificar si las dimensiones de 50 piezas fabricadas siguen una distribución normal para aplicar control estadístico de procesos. Datos simulados: media 10 mm, desviación 0.2 mm. α = 0.05.
H₀: Los datos siguen una distribución normal H₁: Los datos NO siguen una distribución normal
n = 50, W = 0.987, p-valor = 0.892
p-valor = 0.892 > 0.05 → No rechazamos H₀ → Los datos son normales.
# Generar datos normales set.seed(123) dimensiones <- rnorm(50, mean = 10, sd = 0.2) # Prueba de Shapiro-Wilk shapiro_test <- shapiro.test(dimensiones) print(shapiro_test) # Visualización: Q-Q plot qqnorm(dimensiones, main = "Q-Q Plot para dimensiones de piezas") qqline(dimensiones, col = "red", lwd = 2) # Histograma con curva normal library(ggplot2) df <- data.frame(dimensiones = dimensiones) ggplot(df, aes(x = dimensiones)) + geom_histogram(aes(y = ..density..), bins = 15, fill = "lightblue", color = "black") + stat_function(fun = dnorm, args = list(mean = mean(dimensiones), sd = sd(dimensiones)), color = "red", linewidth = 1.2) + labs(title = "Histograma de dimensiones con curva normal", x = "Dimensión (mm)", y = "Densidad") + theme_minimal()
import numpy as np import matplotlib.pyplot as plt from scipy.stats import shapiro, probplot np.random.seed(123) dimensiones = np.random.normal(10, 0.2, 50) # Prueba de Shapiro-Wilk stat, p_valor = shapiro(dimensiones) print(f"W = {stat:.4f}, p-valor = {p_valor:.4f}") # Q-Q plot fig, ax = plt.subplots(figsize=(8, 5)) probplot(dimensiones, dist="norm", plot=ax) ax.set_title("Q-Q Plot para dimensiones de piezas") plt.show()
Contexto: Un analista financiero quiere verificar si los rendimientos diarios de una acción siguen una distribución normal (supuesto común en finanzas). Datos de 100 días. α = 0.05.
Prueba de Shapiro-Wilk: W = 0.953, p-valor = 0.001
p-valor = 0.001 < 0.05 → Rechazamos H₀ → Los rendimientos NO son normales (colas pesadas).
Contexto: Un psicólogo quiere verificar si los puntajes de ansiedad de 30 pacientes siguen una distribución normal para aplicar pruebas paramétricas. α = 0.05.
p-valor = 0.234 > 0.05 → No rechazamos H₀ → Los datos son normales.
La prueba Chi-cuadrado compara las frecuencias observadas con las frecuencias esperadas bajo una distribución Poisson.
χ² = Σ (Oᵢ - Eᵢ)² / Eᵢ, gl = k - 1 - p
donde p = número de parámetros estimados (1 para Poisson: λ).
Contexto: Se registra el número de defectos por lote en una línea de producción durante 100 lotes. ¿Sigue una distribución Poisson?
Datos (frecuencias observadas):
| Defectos/Lote | 0 | 1 | 2 | 3 | 4 | 5+ |
|---|---|---|---|---|---|---|
| Observed | 35 | 30 | 20 | 10 | 4 | 1 |
λ estimado = (0×35 + 1×30 + 2×20 + 3×10 + 4×4 + 5×1)/100 = 1.25
χ² = 4.32, gl = 6-1-1=4, p-valor = 0.364 > 0.05 → No rechazamos H₀
# Datos observados obs <- c(35, 30, 20, 10, 4, 1) n <- sum(obs) k <- length(obs) valores <- 0:4 ultimo <- 5 # Estimar lambda lambda_est <- sum(valores * obs[1:5] + ultimo * obs[6]) / n # Calcular frecuencias esperadas esp <- dpois(0:4, lambda_est) * n esp[6] <- n - sum(esp[1:5]) # Prueba chi-cuadrado chi2 <- sum((obs - esp)^2 / esp) gl <- k - 1 - 1 p_valor <- 1 - pchisq(chi2, gl) cat("χ² =", round(chi2, 4), ", gl =", gl, ", p-valor =", round(p_valor, 4)) # Usando chisq.test (con correcciones) chisq.test(obs, p = esp/n)
Contexto: Un centro comercial registra el número de clientes por minuto en horario valle. ¿Sigue una distribución Poisson? α = 0.05.
Datos (100 minutos): λ estimado = 2.3, χ² = 5.67, gl=5, p-valor=0.34 → No rechazar H₀
Contexto: Se registra el número de episodios de ansiedad por semana en 80 pacientes. ¿Sigue una distribución Poisson? α = 0.05.
λ estimado = 1.8, χ² = 6.21, gl=5, p-valor=0.28 → No rechazar H₀
Se comparan las frecuencias observadas de éxitos en n ensayos con las esperadas bajo una distribución Binomial(n, p).
χ² = Σ (Oᵢ - Eᵢ)² / Eᵢ, gl = k - 1 - p
donde p = número de parámetros estimados (2 para Binomial: n y p, pero n suele conocido).
Contexto: Se lanza una moneda 5 veces y se repite el experimento 100 veces. ¿El número de caras sigue una distribución Binomial(5, 0.5)? α = 0.05.
Datos (frecuencias observadas):
| # Caras | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Observed | 2 | 14 | 35 | 32 | 15 | 2 |
Frecuencias esperadas: dbinom(0:5, 5, 0.5) × 100 = [3.125, 15.625, 31.25, 31.25, 15.625, 3.125]
χ² = 0.96, gl = 6-1-0=5, p-valor = 0.966 > 0.05 → No rechazar H₀
# R obs <- c(2, 14, 35, 32, 15, 2) prob_teo <- dbinom(0:5, 5, 0.5) chisq.test(obs, p = prob_teo) # Python from scipy.stats import chisquare, binom obs = [2, 14, 35, 32, 15, 2] prob = [binom.pmf(k, 5, 0.5) for k in range(6)] chi2, p_valor = chisquare(obs, f_exp=np.array(prob)*100)
Contexto: Se realiza un seguimiento de 10 llamadas de ventas por día durante 200 días. ¿El número de ventas sigue una Binomial(10, 0.3)? α = 0.05.
χ² = 8.45, gl=9, p-valor=0.49 → No rechazar H₀
Contexto: Un test de 8 preguntas verdadero/falso es respondido por 150 estudiantes. ¿El número de aciertos sigue una Binomial(8, 0.5)? α = 0.05.
χ² = 7.23, gl=7, p-valor=0.41 → No rechazar H₀
| Prueba | Distribución | Estadístico | Grados de libertad | Ventajas |
|---|---|---|---|---|
| Shapiro-Wilk | Normal | W | n | Potente para muestras pequeñas |
| Kolmogorov-Smirnov | Cualquiera | D | n | No paramétrica, sensible al centro |
| Anderson-Darling | Cualquiera | A² | n | Más sensible en colas |
| Chi-cuadrado | Discreta/agrupada | χ² | k-1-p | Fácil de calcular e interpretar |
A continuación se presentan tres pruebas adicionales de bondad de ajuste: Kolmogorov-Smirnov (K-S), Anderson-Darling (A-D) y Cramér-von Mises (C-vM).
La prueba de Kolmogorov-Smirnov compara la función de distribución empírica con la teórica. El estadístico D es la máxima distancia entre ambas curvas.
D = supx |Fn(x) - F(x)|
Contexto: Se prueban 45 especímenes de un nuevo material compuesto. ¿La resistencia sigue una distribución normal con μ=120 MPa y σ=10 MPa? α=0.05.
D = 0.092, p-valor = 0.784 > 0.05 → No rechazamos H₀
# Generar datos set.seed(123) resistencia <- rnorm(45, mean = 120, sd = 10) # Prueba KS ks_test <- ks.test(resistencia, "pnorm", mean = 120, sd = 10) print(ks_test) # Visualización: CDF empírica vs teórica library(ggplot2) df <- data.frame(resistencia = resistencia) ggplot(df, aes(x = resistencia)) + stat_ecdf(color = "blue", linewidth = 1.2) + stat_function(fun = pnorm, args = list(mean = 120, sd = 10), color = "red", linetype = "dashed", linewidth = 1.2) + labs(title = "CDF empírica vs teórica (Normal)", x = "Resistencia (MPa)", y = "Función de distribución") + theme_minimal()
Contexto: Un economista quiere verificar si los ingresos mensuales de 200 trabajadores siguen una distribución normal. α = 0.05.
D = 0.087, p-valor = 0.154 > 0.05 → No rechazamos H₀
Contexto: Se aplica un test de depresión a 60 pacientes. ¿Los puntajes siguen una distribución normal? α = 0.05.
D = 0.112, p-valor = 0.063 > 0.05 → No rechazamos H₀ (normalidad aceptada)
La prueba de Anderson-Darling da más peso a las colas de la distribución, siendo más sensible a desviaciones en los extremos.
A² = -n - (1/n) Σ (2i-1)[ln(F(xᵢ)) + ln(1-F(xₙ₊₁₋ᵢ))]
Contexto: Se miden las tolerancias de 80 piezas fabricadas. ¿Siguen una distribución normal? α=0.05.
import numpy as np from scipy.stats import anderson np.random.seed(123) tolerancias = np.random.normal(0.5, 0.02, 80) # Prueba de Anderson-Darling resultado = anderson(tolerancias, dist='norm') print(resultado) # Visualización import matplotlib.pyplot as plt import seaborn as sns sns.histplot(tolerancias, kde=True, stat='density', color='blue', alpha=0.5) x = np.linspace(0.4, 0.6, 100) plt.plot(x, np.exp(-0.5*((x-0.5)/0.02)**2)/(0.02*np.sqrt(2*np.pi)), color='red', linewidth=2, label='Distribución normal teórica') plt.title('Histograma de tolerancias vs curva normal') plt.xlabel('Tolerancia (mm)') plt.ylabel('Densidad') plt.legend() plt.show()
Contexto: Se analizan los rendimientos diarios de una acción durante 250 días. ¿Siguen una distribución normal? α=0.05 (Anderson-Darling es muy sensible a colas pesadas).
A² = 5.23, valor crítico para α=0.05 = 0.752 → 5.23 > 0.752 → Rechazamos H₀ (colas pesadas)
La prueba de Cramér-von Mises mide la integral del cuadrado de la diferencia entre la CDF empírica y la teórica.
W² = n ∫ [Fn(x) - F(x)]² dF(x)
Contexto: Se mide el tamaño de partículas en un proceso de filtración. ¿Siguen una distribución uniforme? α=0.05.
library(goftest) # Datos simulados: distribución uniforme set.seed(123) particulas <- runif(100, 0, 1) # Prueba de Cramér-von Mises para uniformidad cvm_test <- cvm.test(particulas, "punif", min = 0, max = 1) print(cvm_test) # Visualización hist(particulas, breaks = 20, col = "lightblue", main = "Distribución de tamaños de partículas", xlab = "Tamaño (mm)", prob = TRUE) abline(h = 1, col = "red", lwd = 2, lty = 2)
| Prueba | Estadístico | Ventajas | Desventajas | Mejor para |
|---|---|---|---|---|
| Shapiro-Wilk | W | Potente para muestras pequeñas | Limitado a n≤2000 | Normalidad general |
| Kolmogorov-Smirnov | D | No paramétrica, cualquier distribución | Más potencia en centro que en colas | Distribuciones continuas |
| Anderson-Darling | A² | Sensible a colas | Requiere más recursos | Detectar desviaciones en extremos |
| Cramér-von Mises | W² | Mejor que K-S en algunos casos | Menos conocida | Distribuciones continuas |
| Chi-cuadrado | χ² | Fácil, aplicable a discretas | Requiere agrupación, pérdida de información | Datos discretos/agrupados |
| Situación | Prueba recomendada |
|---|
Las pruebas de independencia y homogeneidad se utilizan para analizar tablas de contingencia y determinar si existe asociación entre variables categóricas o si las distribuciones son similares entre poblaciones.
χ² = Σ (Oᵢⱼ - Eᵢⱼ)² / Eᵢⱼ , gl = (r-1)(c-1)
donde Eᵢⱼ = (Total fila i × Total columna j) / Total general
Contexto: Un ingeniero de calidad quiere determinar si el número de defectos está asociado con el turno de trabajo (mañana, tarde, noche). Se registran los defectos en 300 productos. α = 0.05.
Tabla de contingencia (observados):
| Turno Defectos | Defectuoso | No defectuoso | Total |
|---|---|---|---|
| Mañana | 25 | 75 | 100 |
| Tarde | 35 | 65 | 100 |
| Noche | 40 | 60 | 100 |
| Total |
H₀: El turno y la calidad son independientes H₁: El turno y la calidad están asociadosPaso 2: Frecuencias esperadas (bajo independencia)
E₁₁ = (100×100)/300 = 33.33; E₁₂ = (100×200)/300 = 66.67 E₂₁ = 33.33; E₂₂ = 66.67; E₃₁ = 33.33; E₃₂ = 66.67Paso 3: Estadístico χ²
χ² = Σ (O-E)²/E = (25-33.33)²/33.33 + (75-66.67)²/66.67 +
(35-33.33)²/33.33 + (65-66.67)²/66.67 +
(40-33.33)²/33.33 + (60-66.67)²/66.67
= 2.08 + 1.04 + 0.08 + 0.04 + 1.33 + 0.67 = 5.24
Paso 4: Decisión (gl = (3-1)×(2-1) = 2, χ²₀.₀₅,₂ =
5.991)
χ² = 5.24 < 5.991 → No rechazamos H₀
Conclusión: No hay evidencia de asociación entre el turno de trabajo y la calidad del producto.
# Tabla de contingencia tabla <- matrix(c(25, 75, 35, 65, 40, 60), nrow = 3, byrow = TRUE) rownames(tabla) <- c("Mañana", "Tarde", "Noche") colnames(tabla) <- c("Defectuoso", "No defectuoso") print(tabla) # Prueba de independencia chi-cuadrado prueba_chi <- chisq.test(tabla) print(prueba_chi) # Residuos estandarizados prueba_chi$residuals # Visualización con mosaic plot library(ggplot2) library(ggmosaic) df <- as.data.frame(as.table(tabla)) names(df) <- c("Turno", "Calidad", "Freq") ggplot(data = df) + geom_mosaic(aes(x = product(Turno, Calidad), fill = Calidad, weight = Freq)) + labs(title = "Mosaic plot: Turno vs Calidad", x = "Turno", y = "Proporción") + theme_minimal()
import numpy as np from scipy.stats import chi2_contingency # Tabla de contingencia tabla = np.array([[25, 75], [35, 65], [40, 60]]) # Prueba chi-cuadrado de independencia chi2, p_valor, gl, esperados = chi2_contingency(tabla) print(f"χ² = {chi2:.4f}") print(f"p-valor = {p_valor:.4f}") print(f"Grados de libertad = {gl}") print(f"Frecuencias esperadas:\n{esperados}") # Visualización con heatmap import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8, 5)) sns.heatmap(tabla, annot=True, fmt='d', cmap='Blues', xticklabels=['Defectuoso', 'No defectuoso'], yticklabels=['Mañana', 'Tarde', 'Noche']) plt.title('Tabla de contingencia: Turno vs Calidad') plt.show()
Contexto: Una empresa quiere saber si la preferencia por un producto está relacionada con el nivel educativo de los consumidores. α = 0.05.
Datos (200 encuestados):
| Educación Producto | A | B | C | Total |
|---|---|---|---|---|
| Básica | 20 | 30 | 10 | 60 |
| Media | 25 | 35 | 20 | 80 |
| Superior | 15 | 25 | 20 | 60 |
| Total |
χ² = 6.82, p-valor = 0.146 > 0.05 → No rechazamos H₀ (independencia)
Contexto: Se quiere determinar si la respuesta a un tratamiento (mejoría/sin mejoría) es independiente del tipo de terapia (cognitiva, conductual, farmacológica). α = 0.05.
Datos (150 pacientes):
χ² = 6.45, gl = 2, p-valor = 0.040 < 0.05 → Rechazamos H₀ (existe asociación)
Conclusión: La respuesta al tratamiento depende del tipo de terapia.
A diferencia de la prueba de independencia (una población, dos variables), la prueba de homogeneidad compara la misma variable categórica en dos o más poblaciones.
H₀: Las distribuciones son iguales en todas las poblaciones H₁: Al menos una población tiene distribución diferente
Contexto: Se quiere comparar la distribución de calidad (Excelente, Bueno, Deficiente) en tres plantas de producción diferentes. α = 0.05.
Datos (450 productos):
| Planta Calidad | Excelente | Bueno | Deficiente | Total |
|---|---|---|---|---|
| Planta A | 50 | 70 | 30 | 150 |
| Planta B | 60 | 80 | 10 | 150 |
| Planta C | 40 | 60 | 50 | 150 |
| Total |
χ² = 28.57, gl = (3-1)×(3-1) = 4, p-valor = 9.4e-06 < 0.05
Decisión: Rechazamos H₀ → Las plantas tienen diferentes distribuciones de calidad.
# Tabla de contingencia (plantas como filas) tabla_hom <- matrix(c(50, 70, 30, 60, 80, 10, 40, 60, 50), nrow = 3, byrow = TRUE) rownames(tabla_hom) <- c("Planta A", "Planta B", "Planta C") colnames(tabla_hom) <- c("Excelente", "Bueno", "Deficiente") # Prueba de homogeneidad (mismo cálculo que independencia) prueba_hom <- chisq.test(tabla_hom) print(prueba_hom) # Gráfico de barras apiladas library(ggplot2) df_hom <- as.data.frame(as.table(tabla_hom)) names(df_hom) <- c("Planta", "Calidad", "Freq") ggplot(df_hom, aes(x = Planta, y = Freq, fill = Calidad)) + geom_bar(stat = "identity", position = "fill") + labs(title = "Distribución de calidad por planta", y = "Proporción", x = "Planta") + theme_minimal() + scale_fill_manual(values = c("#4ECDC4", "#FFE66D", "#FF6B6B"))
Contexto: Se quiere comparar la distribución de la intención de voto (Partido A, B, C) en tres regiones del país. α = 0.05.
χ² = 12.45, p-valor = 0.014 < 0.05 → Rechazamos H₀ → La intención de voto difiere por región.
Contexto: Se quiere comparar la distribución del nivel de estrés (Bajo, Medio, Alto) en tres ocupaciones (Profesional, Técnico, Administrativo). α = 0.05.
χ² = 8.92, gl=4, p-valor=0.063 > 0.05 → No rechazamos H₀ → Distribución de estrés similar entre ocupaciones.
La prueba exacta de Fisher se utiliza cuando las frecuencias esperadas son pequeñas (E < 5) y la prueba χ² no es confiable.
p = ( (a+b)!(c+d)!(a+c)!(b+d)! ) / ( a! b! c! d! n! )
Contexto: Se prueba un nuevo fármaco en un estudio pequeño con 20 pacientes. α = 0.05.
Datos:
| Mejoría | Sin mejoría | Total | |
|---|---|---|---|
| Fármaco | 8 | 2 | 10 |
| Placebo | 3 | 7 | 10 |
| Total | 11 | 9 | 20 |
p-valor (Fisher) = 0.069 > 0.05 → No rechazamos H₀
Conclusión: No hay evidencia suficiente de asociación entre el fármaco y la mejoría.
# Tabla 2x2 tabla_fisher <- matrix(c(8, 2, 3, 7), nrow = 2, byrow = TRUE) rownames(tabla_fisher) <- c("Fármaco", "Placebo") colnames(tabla_fisher) <- c("Mejoría", "Sin mejoría") # Prueba exacta de Fisher fisher.test(tabla_fisher)
| Prueba | Aplicación | Hipótesis | Estadístico | Condiciones |
|---|---|---|---|---|
| Independencia (χ²) | Dos variables categóricas, una población | H₀: Independencia | χ² = Σ(O-E)²/E | E ≥ 5 en 80% celdas |
| Homogeneidad (χ²) | Una variable, múltiples poblaciones | H₀: Distribuciones iguales | χ² = Σ(O-E)²/E | E ≥ 5 en 80% celdas |
| Exacta de Fisher | Tablas 2×2, muestras pequeñas | H₀: Independencia | p exacta | Cualquier tamaño |
| McNemar | Datos pareados (antes/después) | H₀: Proporciones marginales iguales | χ² = (b-c)²/(b+c) | Muestras dependientes |