Capítulo 3

Métodos No Paramétricos

3.1 ¿Cuándo usar no paramétricos?

Los tests paramétricos (t-test, ANOVA) asumen normalidad y homocedasticidad. Cuando estos supuestos no se cumplen —o con datos ordinales o muestras pequeñas— los no paramétricos son más robustos (aunque menos potentes).

Paramétrico

Asume distribución conocida. Más potente si los supuestos se cumplen.

No paramétrico

Sin asunciones distribucionales. Basado en rangos. Más robusto, menos potente.

3.2 Mann-Whitney U (2 grupos independientes)

Alternativa no paramétrica al t-test de muestras independientes. Prueba si una población tiende a tener valores mayores que la otra.

U=i=1n1j=1n21(xi>yj)U = \sum_{i=1}^{n_1} \sum_{j=1}^{n_2} \mathbb{1}(x_i > y_j)

Bajo H₀, los valores de ambos grupos vienen de la misma distribución.

python
from scipy.stats import mannwhitneyu

g1 = [2, 3, 4, 5, 6]
g2 = [7, 8, 9, 10, 11]

U, p = mannwhitneyu(g1, g2, alternative='two-sided')
print(f"U = {U}, p = {p:.4f}")

# Tamaño del efecto: r = Z / sqrt(n)
from scipy.stats import norm
z = norm.ppf(p / 2)
r = abs(z) / np.sqrt(len(g1) + len(g2))
print(f"Tamaño del efecto r = {r:.3f}")

3.3 Wilcoxon (2 grupos pareados)

Alternativa al t-test pareado (antes/después, mismo sujeto).

W=i=1nsgn(di)R(di)W = \sum_{i=1}^{n} \text{sgn}(d_i) \cdot R(|d_i|)

Donde did_i son las diferencias pareadas y R son los rangos.

python
from scipy.stats import wilcoxon

antes = [85, 90, 78, 92, 88]
despues = [88, 91, 82, 95, 87]

W, p = wilcoxon(antes, despues)
print(f"W = {W}, p = {p:.4f}")

3.4 Kruskal-Wallis (k grupos)

Alternativa no paramétrica a ANOVA de una vía. Compara k grupos independientes.

H=12N(N+1)j=1kRj2nj3(N+1)H = \frac{12}{N(N+1)} \sum_{j=1}^k \frac{R_j^2}{n_j} - 3(N+1)
python
from scipy.stats import kruskal

g1 = [2, 3, 4, 5]
g2 = [6, 7, 8, 9]
g3 = [10, 11, 12, 13]

H, p = kruskal(g1, g2, g3)
print(f"H = {H:.3f}, p = {p:.4f}")

# Post-hoc: Dunn con corrección Bonferroni
# scikit-posthocks: sp.posthoc_dunn([g1,g2,g3], p_adjust='bonferroni')

3.5 Correlación de Spearman

Correlación basada en rangos. Mide relaciones monótonas (no solo lineales). Alternativa a Pearson cuando hay outliers o relaciones no lineales.

ρ=16di2n(n21)\rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)}

Donde did_i es la diferencia entre los rangos de cada par.

python
from scipy.stats import spearmanr, pearsonr

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]  # relación cuadrática

r_p, p_p = pearsonr(x, y)
r_s, p_s = spearmanr(x, y)
print(f"Pearson: r={r_p:.3f}, p={p_p:.4f}")
print(f"Spearman: ρ={r_s:.3f}, p={p_s:.4f}")
# Pearson detecta lineal, Spearman detecta monótona

3.6 Tabla Resumen

SituaciónParamétricoNo paramétrico
2 grupos independientest-testMann-Whitney U
2 grupos pareadost-test pareadoWilcoxon
k gruposANOVAKruskal-Wallis
CorrelaciónPearsonSpearman