Capítulo 2

ANOVA

2.1 ¿Por qué no múltiples t-tests?

Comparar k grupos con t-tests por pares requiere (k2)\binom{k}{2} pruebas. Con k=5 grupos son 10 tests — la probabilidad de al menos un falso positivo se dispara (inflación del error tipo I). ANOVA prueba si todos los grupos tienen la misma media en un solo test.

H0:μ1=μ2==μkvsH1:ij:μiμjH_0: \mu_1 = \mu_2 = \cdots = \mu_k \quad \text{vs} \quad H_1: \exists i \neq j : \mu_i \neq \mu_j

2.2 One-Way ANOVA

Descomponemos la variabilidad total:

SStotal=SSentre+SSdentroSS_{\text{total}} = SS_{\text{entre}} + SS_{\text{dentro}}

Donde SSentre=j=1knj(xˉjxˉ)2SS_{\text{entre}} = \sum_{j=1}^k n_j (\bar{x}_j - \bar{x})^2 ySSdentro=j=1ki=1nj(xijxˉj)2SS_{\text{dentro}} = \sum_{j=1}^k \sum_{i=1}^{n_j} (x_{ij} - \bar{x}_j)^2.

F=SSentre/(k1)SSdentro/(nk)Fk1,nkF = \frac{SS_{\text{entre}} / (k-1)}{SS_{\text{dentro}} / (n-k)} \sim F_{k-1, n-k}

Un F grande indica que las medias de los grupos son significativamente diferentes.

python
import numpy as np
from scipy import stats

# Tres grupos
np.random.seed(42)
g1 = np.random.normal(5, 1, 30)
g2 = np.random.normal(6, 1, 30)
g3 = np.random.normal(7, 1, 30)

F, p = stats.f_oneway(g1, g2, g3)
print(f"F = {F:.3f}, p = {p:.4f}")
# p < 0.05 → rechazamos H0, al menos un grupo difiere

2.3 Two-Way ANOVA

Dos factores (A y B) y su interacción:

SStotal=SSA+SSB+SSA×B+SSerrorSS_{\text{total}} = SS_A + SS_B + SS_{A\times B} + SS_{\text{error}}

Prueba tres hipótesis simultáneamente: efecto de A, efecto de B, e interacción A×B. Ej: ¿El fármaco funciona? ¿El sexo influye? ¿Hay interacción (el fármaco funciona solo en mujeres)?

python
import statsmodels.api as sm
from statsmodels.formula.api import ols
import pandas as pd

df = pd.DataFrame({
    'rendimiento': np.random.randn(60),
    'metodo': np.repeat(['A', 'B', 'C'], 20),
    'nivel': np.tile(['bajo', 'alto'], 30)
})
modelo = ols('rendimiento ~ C(metodo) + C(nivel) + C(metodo):C(nivel)', data=df).fit()
print(sm.stats.anova_lm(modelo, typ=2))

2.4 Supuestos

Normalidad

Residuos ~ N(0, σ²). Test: Shapiro-Wilk o Q-Q plot. ANOVA es robusto si n es grande.

Homocedasticidad

Varianza igual entre grupos. Test: Levene o Bartlett.

Independencia

Observaciones independientes dentro y entre grupos. Diseño experimental.

python
# Tests de supuestos
from scipy import stats

# Normalidad (Shapiro-Wilk)
for i, g in enumerate([g1, g2, g3]):
    W, p = stats.shapiro(g)
    print(f"Grupo {i+1}: W={W:.3f}, p={p:.3f}")

# Homocedasticidad (Levene)
W, p = stats.levene(g1, g2, g3)
print(f"Levene: W={W:.3f}, p={p:.3f}")

2.5 Post-Hoc: ¿Qué grupos difieren?

Si ANOVA es significativo, necesitamos pruebas post-hoc con corrección por comparaciones múltiples:

Tukey HSD

Compara todos los pares. Controla el error familiar (FWER). Más potente que Bonferroni.

Bonferroni

Ajusta α dividiendo por número de comparaciones. Conservador.

python
from scipy.stats import tukey_hsd

result = tukey_hsd(g1, g2, g3)
print("Tukey HSD:")
for i in range(3):
    for j in range(i+1, 3):
        print(f"  Grupo {i+1} vs {j+1}: p={result.pvalue[i,j]:.4f}")