Validación y Análisis · Tema 13

Test chi-cuadrado

La distancia D del Tema 12 con fórmula, grados de libertad y p-valor: comparar frecuencias por clases sin mirar gráficos con ganas de creer.

01 · Punto de partida

Del «se ve cargado» al «χ² = 14,2, p ≈ 0,01»

El laboratorio del Tema 12 mostraba barras contra lo esperado. El chi-cuadrado convierte esa imagen en un número con distribución conocida bajo H0, para juzgar con α pre-fijado y decir qué clase aporta el desajuste.

  • ¿Cómo se agrupa en clases sin hacer trampa?
  • ¿Cuánto vale (O−E)²/E en cada clase?
  • ¿Cuántos grados de libertad quedan?
  • ¿El rechazo señala todo o una clase puntual?

02 · Definición

Estadístico, grados y condiciones

Σ

Estadístico

Suma ponderada por 1/E: un desvío de 5 pesa más si lo esperado era 5 que si era 50. Por eso se divide.

gl

Grados de libertad

k clases − 1 (suman n) − p parámetros estimados con los datos. Cada estimación «gasta» un grado.

✓

Condiciones

n grande, Eᵢ ≥ 5 en cada clase (agrupar colas si no), observaciones independientes. Sin esto, el p es ficticio.

Valores críticos χ² con α = 0,05 (rechazar si χ² supera).
glCríticoEjemplo
37,814 clases sin estimar
511,07Dado justo, 6 caras
815,519 intervalos

03 · Método

Protocolo sin p-hacking de clases

  1. 1
    Fijar H0, clases y α antes.

    Ej.: «H0: dado justo, 6 caras, α = 0,05». Los bordes de clase no se mueven para que «pase».

  2. 2
    Calcular E bajo H0 y verificar E ≥ 5.

    Si una cola queda flaca, se fusiona con la vecina antes de calcular, no después de ver el p.

  3. 3
    Sumar χ² y restar grados.

    gl = k − 1 − estimados. Estimar la media con los datos cuesta 1 grado.

  4. 4
    Traducir a p y mirar residuos.

    Residuo estandarizado (O−E)/√E por clase: |·| > 2 señala la culpable.

  5. 5
    Informar clases + χ² + gl + p + n.

    «6 clases, χ² = 4,2, gl = 5, p ≈ 0,52, n = 60: no se rechaza».

clases previas→χ² + gl→p + residuos→dictamen

04 · Residuos y trampas

Dónde falla y cómo se maquilla

Lectura útil

Residuos señalan

χ² = 14 con 12 aportados por la clase 6 = dado cargado en el 6. El total rechaza; el residuo explica.

Trampa común

Clases a medida

Mover bordes hasta que el p pase es p-hacking. Las clases se fijan por criterio físico o equiprobable, antes.

E < 5
Clases flacas inflan χ² por dividir entre poco. Se fusionan colas vecinas y baja gl en consecuencia.
Parámetros estimados
Estimar λ de Poisson con la muestra cuesta 1 gl. No restarlo fabrica rechazos falsos… o al revés.
n gigante
Con n = 10000, desvíos irrelevantes dan p ≈ 0. Informar residuos y efecto, no solo p.

05 · Representación en Python

χ² a mano, sin caja negra

Python en tu navegador. H0: dado justo, n=60. El crítico 11,07 para gl=5 ya está puesto.

obs = [12, 9, 11, 8, 10, 10]
esp = [10]*6
CRITICO, GL = 11.07, 5  # gl=6-1, alfa=0.05

contrib = [(o-e)**2/e for o, e in zip(obs, esp)]
chi = sum(contrib)
residuos = [(o-e)/(e**0.5) for o, e in zip(obs, esp)]
print("contribuciones:", [round(c, 2) for c in contrib])
print(f"chi² = {chi:.2f} (gl={GL}, crítico {CRITICO})")
print("residuos:", [round(r, 2) for r in residuos])
print("Veredicto:", "Se rechaza" if chi > CRITICO else "No se rechaza")

χ² = 1,00 ≪ 11,07: no se rechaza. Cambiá obs a [20, 5, 5, 10, 10, 10] y mirá qué clase aporta casi todo.

Condición E ≥ 5 y fusión de colas

obs2 = [12, 9, 11, 8, 10, 2, 1]  # dos colas flacas
esp2 = [8, 8, 8, 8, 8, 3, 2]
print("E<5 en:", [e for e in esp2 if e < 5], "-> fusionar últimas dos")
obs_f = obs2[:-2] + [obs2[-2] + obs2[-1]]
esp_f = esp2[:-2] + [esp2[-2] + esp2[-1]]
print("fusionado:", obs_f, esp_f, "k:", len(obs_f))

06 · Exploración

Laboratorio: cada clase aporta su culpa

H0: dado justo (6 caras, gl = 5, crítico 11,07). Mové la carga hacia el 6 y el n. Las barras muestran O vs. E; la seleccionada exhibe su aporte (O−E)²/E. El p se estima por Monte Carlo honesto (500 dados justos con igual n).

EXPERIMENTO 13

χ² por clases en vivo

χ² = Σ (O−E)²/E · gl = 5 · crítico 11,07

Los resultados numéricos aparecen debajo.
χ²0,00
p aprox.1,00
Aporte clase0,00
Veredicto—

Con carga 30% y n=60, la clase 6 aporta casi todo el χ².

Altura = conteo observado; línea blanca = esperado n/6. El número sobre cada barra es su aporte al χ². La clase 6 cargada se despega primero.

Preguntas para explorar

  1. Con carga 30% y n=60: ¿χ², p y aporte de la clase 6? ¿Qué fracción del total explica una sola cara?
  2. Quitá la carga (0%) con n=60: ¿χ² y veredicto? Subí a n=240 sin carga: ¿el χ² se dispara o ronda gl=5?
  3. Con carga 15% probá n=30 y n=240. ¿Mismo efecto, mismo veredicto? ¿Qué manda?
Ver respuestas sugeridas
  1. χ² ≈ 12–16 > 11,07, p ≈ 0,01: se rechaza. La clase 6 aporta ~80%: el residuo (+3 o más) la señala sin dudar.
  2. Sin carga χ² ≈ 3–6 ≈ gl: no se rechaza. Con n=240 sin carga sigue ≈ gl: bajo H0 el χ² ronda sus grados, no crece con n.
  3. Mismo efecto relativo, veredicto opuesto: n=30 impotente (p alto), n=240 contundente (p ≈ 0). Efecto + n, siempre.

07 · Comprensión

Confusiones frecuentes

«χ² grande = efecto grande»

χ² mezcla efecto y n. Con n gigante, efectos irrelevantes dan χ² enorme. Mirar residuos y efecto relativo.

«Puedo reagrupar hasta que pase»

Reagrupar tras ver el p es trampa. Las clases se fijan antes por criterio físico o equiprobable.

«E ≥ 5 es un capricho»

Con E chico, (O−E)²/E explota por dividir entre poco y el p miente. Fusionar colas es obligatorio, no opcional.

«Chi sirve para todo continuo»

Agrupar continuo desperdicia información. Para continuo sin clases, K-S (Tema 14) es más potente.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: calcular y señalar la culpable

¿χ², veredicto (crítico 11,07) y clase culpable?

obs = [20, 5, 5, 10, 10, 10]
esp = [10]*6
contrib = [(o-e)**2/e for o, e in zip(obs, esp)]
print(contrib, "chi =", round(sum(contrib), 2))
print("culpable: clase 1 con", contrib[0])
Ver solución razonada

χ² = 10 + 2,5 + 2,5 + 0 + 0 + 0 = 15,00 > 11,07 → se rechaza. La clase 1 aporta 10/15: dado cargado al 1, residuo +3,16.

Ejercicio 2: grados que cuestan

Estimaste la media con los datos para calcular E. ¿gl?

k, estimados = 8, 1
print("gl =", k - 1 - estimados, "(no 7)")
Ver solución

gl = 6, no 7. No restarlo usa un crítico demasiado chico y rechaza de más. Cada estimación gasta un grado.

Ejercicio 3: fusionar colas flacas

¿Qué hacer con E = [20, 20, 20, 3, 2]?

Ver una posible respuesta
print("Fusionar las dos últimas en E=5 antes de calcular; k pasa de 5 a 4")

Con E=3 y E=2 el test es inválido. Fusionadas dan E=5 (límite aceptable) y gl baja en 1. Decidido antes, documentado siempre.

09 · Síntesis

Ideas para recordar

  • χ² = Σ (O−E)²/E por clases; gl = k−1−estimados; p ≤ α rechaza.
  • Condiciones: E ≥ 5, independencia, clases fijadas antes.
  • Residuos (O−E)/√E señalan la clase culpable: |·| > 2 grita.
  • Informar clases + χ² + gl + p + n + tabla O/E: veredicto con pruebas.
  • Para continuo sin agrupar, pasar a K-S (Tema 14).

En el próximo tema veremos el test de Kolmogorov-Smirnov: comparar distribuciones sin perder detalle en clases.