27 · El test chi-cuadrado
Prueba si las frecuencias observadas coinciden con las esperadas — para ajustar un modelo (bondad de ajuste) o detectar asociación entre dos variables categóricas (test de independencia).
El chi-cuadrado comprueba si las frecuencias OBSERVADAS coinciden con las ESPERADAS — para ajustar un modelo o verificar independencia en una tabla de contingencia.
Sin esto:
Sin él, no puedes comparar formalmente frecuencias observadas vs. esperadas en ningún análisis categórico.
Todos los tests que hemos visto hasta ahora trabajan con medidas continuas (medias, varianzas). Pero muchos datos reales son categóricos: género, tipo de dispositivo, grupo de tratamiento, caras de un dado, respuestas de encuesta. El test chi-cuadrado (χ²) es la herramienta principal para datos categóricos.
El estadístico chi-cuadrado mide cuánto se alejan los conteos observados de los que esperarías bajo un modelo nulo:
χ² = Σ (O − E)² / E
La suma recorre todas las celdas de tu tabla de frecuencias. Cuando cada conteo observado coincide exactamente con su valor esperado, χ² = 0. Valores más grandes implican mayores desviaciones.
Bajo la hipótesis nula, χ² sigue una distribución chi-cuadrado con gl grados de libertad. La distribución chi-cuadrado es asimétrica a la derecha y acotada inferiormente por 0 — naturalmente, porque las desviaciones al cuadrado son siempre no negativas.
Dos variantes del test chi-cuadrado:
| Test | Pregunta | gl | |------|----------|-----| | Bondad de ajuste | ¿Sigue esta variable categórica una distribución hipotética? | k − 1 | | Independencia | ¿Son independientes dos variables categóricas en esta tabla de contingencia? | (r−1)(c−1) |
La fórmula del estadístico y la regla de rechazo son idénticas para ambos; solo difiere la fuente de los conteos esperados.
Python (in browser)
Test de bondad de ajuste sobre 60 lanzamientos de dado. Calculamos χ² a mano primero para hacer concreta la fórmula, luego verificamos con scipy.stats.chisquare. gl = k − 1 = 5.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Test de independencia sobre una tabla de contingencia 2×3 (tratamiento/control vs. mejorado/sin cambio/empeorado). scipy.stats.chi2_contingency devuelve el estadístico, p-value, gl y la matriz de conteos esperados.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Distribuciones chi-cuadrado para gl = 1, 4, 10. A medida que crecen los gl, la distribución se desplaza a la derecha y se vuelve más simétrica. La cola sombreada es la región de rechazo a α = 0.05.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Verificación de supuesto: si algún conteo esperado es < 5, el test exacto de Fisher (para tablas 2×2) es la alternativa correcta. El odds ratio mide la fuerza de asociación entre los dos resultados.
Para un test chi-cuadrado de bondad de ajuste sobre un dado de 6 caras (categorías: caras 1–6), ¿cuál es el número de grados de libertad?
- **Estadístico chi-cuadrado:** χ² = Σ (O − E)² / E, sumado sobre todas las celdas. χ² grande → los conteos observados son improbables bajo la nula.
- **Bondad de ajuste** (una variable categórica): gl = k − 1, donde k es el número de categorías.
- **Test de independencia** (dos variables categóricas, tabla r×c): gl = (r − 1)(c − 1). Usa `scipy.stats.chi2_contingency`.
- **Supuesto clave:** todos los conteos esperados deben ser ≥ 5. Si alguna celda es < 5, usa el test exacto de Fisher.
Selección de features categóricos (`sklearn.feature_selection.chi2`); detectar desplazamientos de distribución en campos categóricos entre entrenamiento y producción; tests A/B de conversiones por segmento.
Si lo quitas: No puedes responder formalmente '¿tiene este feature categórico alguna relación con la variable objetivo?'