La prueba de hipótesis es un procedimiento estadístico que nos permite tomar decisiones sobre una población basándonos en una muestra. En lugar de afirmar algo con certeza absoluta, evaluamos la evidencia muestral para decidir si rechazamos o no una suposición inicial.

Idea central: Planteamos dos hipótesis contrapuestas y usamos datos para ver cuál es más plausible.

El planteamiento de una hipótesis estadística se realiza de la siguiente manera:

Ejemplo:
Si queremos probar que la media de una población es diferente de 100:
\(H_0: \mu = 100\)
\(H_1: \mu \neq 100\)

Como ya se mencionó la prueba de hipótesis puede ser bilateral o unilateral. A continuación se define cada una de las pruebas de hipótesis:

En las pruebas de hipótesis se tienen conceptos importantes como el error tipo I y el error tipo II.

Decisión / Realidad \(H_0\) es verdadera \(H_0\) es falsa
Rechazar \(H_0\) Error Tipo I (α) Decisión correcta (1-β)
No rechazar \(H_0\) Decisión correcta (1-α) Error Tipo II (β)

Prueba de hipótesis para la media con varianza conocida

Cuando la población sigue una distribución normal y la varianza poblacional \(\sigma^2\) es conocida, el estadístico de prueba para la media sigue una distribución normal estándar bajo \(H_0\).

Hipótesis (para un contraste bilateral): \[ H_0: \mu = \mu_0 \quad \text{vs.} \quad H_1: \mu \neq \mu_0 \]

Estadístico de prueba: \[ Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}} \sim N(0,1) \]

Regla de decisión (nivel \(\alpha\)):

Ejemplo en R

Una empresa de bebidas embotelladoras controla la calidad del llenado de sus envases de 500 ml. La máquina llenadora debe tener una media de llenado de 500 ml, pero se sabe por estudios previos que la desviación estándar del proceso es \(\sigma = 1.2\) ml (varianza conocida). Se desea probar si la media es diferente de 500 ml con \(\alpha = 0.05\).

# Datos
x <- c(500.2, 499.8, 501.0, 500.5, 499.7, 500.3, 500.9, 499.5,
       500.1, 500.4, 500.0, 501.2, 499.6, 500.7, 500.8)
sigma <- 1.2      # varianza conocida
mu0 <- 500        # valor bajo H0
alpha <- 0.05

# Media muestral y n
xbar <- mean(x)
n <- length(x)

# Estadístico Z
Z <- (xbar - mu0) / (sigma / sqrt(n))

# Valor crítico bilateral
z_crit <- qnorm(1 - alpha/2)

# Valor p bilateral
p_valor <- 2 * (1 - pnorm(abs(Z)))

# Resultados
cat("Media muestral:", round(xbar, 3), "\n")
## Media muestral: 500.313
cat("Estadístico Z:", round(Z, 4), "\n")
## Estadístico Z: 1.0113
cat("Valor crítico z(0.025):", round(z_crit, 4), "\n")
## Valor crítico z(0.025): 1.96
cat("Valor p:", round(p_valor, 4), "\n")
## Valor p: 0.3119

Gráfico

Se muestra la distribución normal estándar, la región de rechazo bilateral y la posición del estadístico \(Z\).

library(ggplot2)

# Datos para la curva N(0,1)
x_vals <- seq(-4, 4, length = 300)
y_vals <- dnorm(x_vals)

# Regiones de rechazo
limite <- z_crit
region_rechazo_izq <- data.frame(x = x_vals[x_vals <= -limite],
                                 y = y_vals[x_vals <= -limite])
region_rechazo_der <- data.frame(x = x_vals[x_vals >= limite],
                                 y = y_vals[x_vals >= limite])

ggplot() +
  geom_line(aes(x_vals, y_vals), color = "black", size = 1) +
  geom_area(data = region_rechazo_izq, aes(x, y), fill = "red", alpha = 0.4) +
  geom_area(data = region_rechazo_der, aes(x, y), fill = "red", alpha = 0.4) +
  geom_vline(xintercept = Z, color = "blue", linetype = "dashed", size = 1) +
  geom_vline(xintercept = c(-limite, limite), color = "darkred", linetype = "dotted") +
  annotate("text", x = Z, y = 0.1, label = paste("Z =", round(Z,2)), color = "blue") +
  annotate("text", x = limite + 0.3, y = 0.05, label = "Región de rechazo", color = "darkred") +
  annotate("text", x = -limite - 0.3, y = 0.05, label = "Región de rechazo", color = "darkred") +
  labs(title = "Prueba Z bilateral para la media (varianza conocida)",
       subtitle = paste("H0: μ = 500, H1: μ ≠ 500 | α = 0.05"),
       x = "Estadístico Z", y = "Densidad") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

La potencia de la prueba se obtiene a continuación:

potencia_z <- function(mu1, mu0, sigma, n, alpha = 0.05) {
  delta <- (mu1 - mu0) / (sigma / sqrt(n))
  z_crit <- qnorm(1 - alpha/2)
  poder <- pnorm(-z_crit - delta) + (1 - pnorm(z_crit - delta))
  return(poder)
}


# Potencia para detectar una media = 500.5
mu1 <- 500.5
pot <- potencia_z(mu1, mu0, sigma, n)
cat("Potencia para μ =", mu1, ":", round(pot, 4), "\n")
## Potencia para μ = 500.5 : 0.3648

Prueba de hipótesis para media con varianza desconocida

Es una prueba estadística utilizada para determinar si la media de una población difiere de un valor específico cuando se desconoce la desviación estándar real de esa población. Para compensar esta falta de información, se utiliza la desviación estándar de la muestra y la distribución \(t\) de Student.

Cuando la varianza poblacional \(\sigma^2\) es desconocida (situación más realista), se estima mediante la cuasi-varianza muestral \(S^2\). El estadístico de prueba sigue una distribución t de Student con \(n-1\) grados de libertad.

Hipótesis (para un contraste bilateral): \[ H_0: \mu = \mu_0 \qquad \text{vs.} \qquad H_1: \mu \neq \mu_0 \]

Estadístico de prueba: \[ t = \frac{\bar{x} - \mu_0}{S / \sqrt{n}}, \quad \text{donde} \quad S = \sqrt{\frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}} \] Bajo \(H_0\): \(t \sim t_{n-1}\).

Regla de decisión (nivel \(\alpha\)): \[ \text{Rechazar } H_0 \text{ si } |t| > t_{\alpha/2,\, n-1} \] donde \(t_{\alpha/2,\, n-1}\) es el cuantil \(1-\alpha/2\) de la distribución t con \(n-1\) grados de libertad.

Valor p (bilateral): \[ p\text{-valor} = 2 \cdot P(t_{n-1} > |t|) \]

Ejemplo en R

Se desea probar si el volumen medio de llenado de botellas (500 ml esperados) es diferente de 500 ml. Se desconoce la varianza. Datos muestrales (\(n=15\)):

x <- c(500.2, 499.8, 501.0, 500.5, 499.7, 500.3, 500.9, 499.5,
       500.1, 500.4, 500.0, 501.2, 499.6, 500.7, 500.8)
mu0 <- 500
alpha <- 0.05

xbar <- mean(x)
S <- sd(x)
n <- length(x)
t_stat <- (xbar - mu0) / (S / sqrt(n))
t_crit <- qt(1 - alpha/2, df = n-1)
p_valor <- 2 * (1 - pt(abs(t_stat), df = n-1))

cat("Media:", round(xbar,3), "  S:", round(S,3), "\n")
## Media: 500.313   S: 0.534
cat("Estadístico t:", round(t_stat,4), "\n")
## Estadístico t: 2.2711
cat("Valor crítico t(0.025,14):", round(t_crit,4), "\n")
## Valor crítico t(0.025,14): 2.1448
cat("Valor p:", round(p_valor,4), "\n")
## Valor p: 0.0395
if (abs(t_stat) > t_crit) cat("Decisión: Rechazar H0.\n") else cat("Decisión: No rechazar H0.\n")
## Decisión: Rechazar H0.

Gráfico

x_vals <- seq(-5, 5, length = 300)
y_vals <- dt(x_vals, df = n-1)
limite <- t_crit
region_izq <- data.frame(x = x_vals[x_vals <= -limite], y = y_vals[x_vals <= -limite])
region_der <- data.frame(x = x_vals[x_vals >= limite], y = y_vals[x_vals >= limite])

ggplot() +
  geom_line(aes(x_vals, y_vals), color = "black", size = 1) +
  geom_area(data = region_izq, aes(x, y), fill = "red", alpha = 0.4) +
  geom_area(data = region_der, aes(x, y), fill = "red", alpha = 0.4) +
  geom_vline(xintercept = t_stat, color = "blue", linetype = "dashed", size = 1) +
  labs(title = "Prueba t bilateral (varianza desconocida)",
       subtitle = paste("gl =", n-1), x = "t", y = "Densidad") + theme_minimal()

La potencia de la prueba se muestra a continuación.

# Potencia para detectar una media + 0.5 (delta)
potencia_t <- power.t.test(n = n, delta = 0.5, sd = S, sig.level = alpha, type = "one.sample", alternative = "two.sided")
print(potencia_t)
## 
##      One-sample t test power calculation 
## 
##               n = 15
##           delta = 0.5
##              sd = 0.5343443
##       sig.level = 0.05
##           power = 0.9201746
##     alternative = two.sided

Prueba de hipótesis para la varianza

Cuando se desea inferir sobre la varianza poblacional \(\sigma^2\) de una variable que sigue una distribución normal, se utiliza la prueba chi‑cuadrado (\(\chi^2\)).

Hipótesis (para un contraste bilateral): \[ H_0: \sigma^2 = \sigma_0^2 \qquad \text{vs.} \qquad H_1: \sigma^2 \neq \sigma_0^2 \]

Estadístico de prueba: \[ \chi^2 = \frac{(n-1)S^2}{\sigma_0^2}, \quad \text{donde} \quad S^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1} \] es la cuasi-varianza muestral.
Bajo \(H_0\) y el supuesto de normalidad, \(\chi^2\) sigue una distribución chi‑cuadrado con \(n-1\) grados de libertad.

Regla de decisión (nivel \(\alpha\)): \[ \text{Rechazar } H_0 \text{ si } \chi^2 < \chi^2_{1-\alpha/2,\, n-1} \quad \text{o} \quad \chi^2 > \chi^2_{\alpha/2,\, n-1} \] donde \(\chi^2_{\alpha/2,\, n-1}\) es el cuantil \(1-\alpha/2\) de la distribución \(\chi^2\) con \(n-1\) gl.

Valor p (bilateral): \[ p\text{-valor} = 2 \cdot \min\left( P(\chi^2_{n-1} < \chi^2_{\text{obs}}), \ P(\chi^2_{n-1} > \chi^2_{\text{obs}}) \right) \]

Ejemplo en R

Se quiere probar si la varianza del volumen de llenado de las botellas es igual a \(1.2^2 = 1.44\) ml² (\(\sigma_0 = 1.2\)). Se dispone de la misma muestra de 15 botellas.

sigma0 <- 1.2
var0 <- sigma0^2
n <- length(x)
S2 <- var(x)
chi2_stat <- (n-1) * S2 / var0
chi2_lim_inf <- qchisq(alpha/2, df = n-1)
chi2_lim_sup <- qchisq(1 - alpha/2, df = n-1)
p_valor <- 2 * min(pchisq(chi2_stat, df = n-1), 1 - pchisq(chi2_stat, df = n-1))

cat("S2 =", round(S2,4), "  χ² =", round(chi2_stat,4), "\n")
## S2 = 0.2855   χ² = 2.7759
cat("Valores críticos: (", round(chi2_lim_inf,4), ",", round(chi2_lim_sup,4), ")\n")
## Valores críticos: ( 5.6287 , 26.1189 )
cat("Valor p =", round(p_valor,4), "\n")
## Valor p = 0.0012

Gráfico

x_vals <- seq(0, 40, length = 300)
y_vals <- dchisq(x_vals, df = n-1)
region_inf <- data.frame(x = x_vals[x_vals <= chi2_lim_inf], y = y_vals[x_vals <= chi2_lim_inf])
region_sup <- data.frame(x = x_vals[x_vals >= chi2_lim_sup], y = y_vals[x_vals >= chi2_lim_sup])

ggplot() +
  geom_line(aes(x_vals, y_vals), color = "black") +
  geom_area(data = region_inf, aes(x, y), fill = "red", alpha = 0.4) +
  geom_area(data = region_sup, aes(x, y), fill = "red", alpha = 0.4) +
  geom_vline(xintercept = chi2_stat, color = "blue", linetype = "dashed") +
  labs(title = "Prueba χ² para la varianza", x = "χ²", y = "Densidad") + theme_minimal()

La potencia de la prueba es:

potencia_var <- function(sigma1, sigma0, n, alpha = 0.05) {
  lambda <- (sigma1^2 / sigma0^2)
  gl <- n - 1
  chi2_inf <- qchisq(alpha/2, gl)
  chi2_sup <- qchisq(1 - alpha/2, gl)
  poder <- pchisq(chi2_inf / lambda, gl) + (1 - pchisq(chi2_sup / lambda, gl))
  return(poder)
}

# Potencia para detectar una sigma = 1.5 ml
sigma1 <- 1.5
pot <- potencia_var(sigma1, sigma0, n)
cat("Potencia para σ =", sigma1, ":", round(pot, 4), "\n")
## Potencia para σ = 1.5 : 0.2742

Prueba de hipótesis para una proporción

Cuando se desea inferir sobre la proporción \(p\) de una población (por ejemplo, proporción de éxitos, clientes satisfechos, piezas defectuosas), y se dispone de una muestra de tamaño \(n\) suficientemente grande, se utiliza una aproximación normal al binomio.

Hipótesis (para un contraste bilateral): \[ H_0: p = p_0 \qquad \text{vs.} \qquad H_1: p \neq p_0 \]

Condición de validez: \[ n p_0 \geq 5 \quad \text{y} \quad n(1-p_0) \geq 5 \]

Estadístico de prueba: \[ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1-p_0)}{n}}}, \quad \text{donde} \quad \hat{p} = \frac{\text{número de éxitos en la muestra}}{n} \] Bajo \(H_0\) y las condiciones anteriores, \(Z\) sigue aproximadamente una distribución normal estándar \(N(0,1)\).

Regla de decisión (nivel \(\alpha\)): \[ \text{Rechazar } H_0 \text{ si } |Z| > z_{\alpha/2} \] donde \(z_{\alpha/2}\) es el cuantil \(1-\alpha/2\) de la normal estándar.

Valor p (bilateral): \[ p\text{-valor} = 2 \cdot P(Z > |z| \mid H_0) \]

Ejemplo en R

Un fabricante asegura que el 90% de sus envíos llegan a tiempo. En una muestra aleatoria de 200 envíos, solo 170 llegaron a tiempo. ¿Existe evidencia suficiente para afirmar que la proporción de envíos puntuales es diferente del 90%? Utilice \(\alpha = 0.05\).

# Datos
n <- 200
exitos <- 170
p0 <- 0.90
alpha <- 0.05

# Proporción muestral
phat <- exitos / n

# Estadístico Z
Z <- (phat - p0) / sqrt(p0 * (1 - p0) / n)

# Valor crítico (bilateral)
z_crit <- qnorm(1 - alpha/2)

# Valor p bilateral
p_valor <- 2 * (1 - pnorm(abs(Z)))

cat("Proporción muestral (phat):", round(phat, 4), "\n")
## Proporción muestral (phat): 0.85
cat("Estadístico Z:", round(Z, 4), "\n")
## Estadístico Z: -2.357
cat("Valor crítico z(0.025):", round(z_crit, 4), "\n")
## Valor crítico z(0.025): 1.96
cat("Valor p:", round(p_valor, 4), "\n")
## Valor p: 0.0184

Gráfico

x_vals <- seq(-4, 4, length = 300)
y_vals <- dnorm(x_vals)
limite <- z_crit

region_izq <- data.frame(x = x_vals[x_vals <= -limite], y = y_vals[x_vals <= -limite])
region_der <- data.frame(x = x_vals[x_vals >= limite], y = y_vals[x_vals >= limite])

ggplot() +
  geom_line(aes(x_vals, y_vals), color = "black", size = 1) +
  geom_area(data = region_izq, aes(x, y), fill = "red", alpha = 0.4) +
  geom_area(data = region_der, aes(x, y), fill = "red", alpha = 0.4) +
  geom_vline(xintercept = Z, color = "blue", linetype = "dashed", size = 1) +
  geom_vline(xintercept = c(-limite, limite), color = "darkred", linetype = "dotted") +
  annotate("text", x = Z, y = 0.1, label = paste("Z =", round(Z, 2)), color = "blue") +
  annotate("text", x = limite + 0.4, y = 0.05, label = "Región de rechazo", color = "darkred") +
  annotate("text", x = -limite - 0.4, y = 0.05, label = "Región de rechazo", color = "darkred") +
  labs(title = "Prueba Z bilateral para una proporción",
       subtitle = paste("H0: p =", p0, "vs H1: p ≠", p0, "| α = 0.05, n =", n),
       x = "Estadístico Z", y = "Densidad") +
  theme_minimal()

La potencia de la prueba es:

# Potencia para detectar una proporción real p1 = 0.85
p1 <- 0.85
potencia <- power.prop.test(n = n, p1 = p1, p2 = p0, 
                            sig.level = alpha, alternative = "two.sided")
print(potencia)
## 
##      Two-sample comparison of proportions power calculation 
## 
##               n = 200
##              p1 = 0.85
##              p2 = 0.9
##       sig.level = 0.05
##           power = 0.3265745
##     alternative = two.sided
## 
## NOTE: n is number in *each* group