Q2003B — Diseño de Experimentos

🗺️ Hoja de Ruta — Sesión 4

Pipeline Automatizado de ANOVA
Convierte tu diagrama de flujo en código con IA

¿Qué vamos a hacer hoy?

En la sesión pasada diseñaste un diagrama de flujo con la lógica de ANOVA: Shapiro → Levene → ANOVA o Kruskal → Tukey.

Hoy vas a convertir cada caja de ese diagrama en una función de Python, usando Gemini como tu copiloto de código.

🎯 Tú ya sabes la estadística. Gemini te ayuda a escribir el código. Tú eres el piloto.

💡 Antes de empezar — Configura tu Replit

1
Validar Supuestos
Shapiro-Wilk + Levene → ¿Mis datos cumplen?
¿Qué hace este paso? Revisa si tus datos son normales (Shapiro-Wilk por cada grupo) y si las varianzas son iguales (Levene). Es la primera decisión de tu diagrama de flujo.
📋 Prompt para Gemini — copia y pega esto:
📋 Copiar Escribe una función en Python llamada validar_supuestos(grupos, alpha) que haga:

1. Para CADA grupo en la lista 'grupos', correr stats.shapiro(grupo) e imprimir el p-value. Si p < alpha en CUALQUIER grupo → normalidad_ok = False. Si todos p >= alpha → normalidad_ok = True.

2. Correr stats.levene(*grupos) e imprimir el p-value. Si p < alpha → homocedasticidad_ok = False.

3. Imprimir un resumen: "Normalidad: Sí/No" y "Homocedasticidad: Sí/No".

4. Retornar: normalidad_ok, homocedasticidad_ok

Usa scipy.stats (ya importado como stats). Alpha por default es 0.05.
🎯 ¿Cómo sé que funcionó? Al correr el script, el PASO 1 muestra ✅ con "Normalidad: Sí/No" y "Homocedasticidad: Sí/No" en vez de "⏳ Pendiente".
2
Correr Análisis
ANOVA Fisher o Kruskal-Wallis según supuestos
¿Qué hace este paso? Aquí está el corazón de tu diagrama: si los datos son normales → ANOVA Fisher. Si no → Kruskal-Wallis. Es una decisión automática basada en el paso anterior.
📋 Prompt para Gemini — copia y pega esto:
📋 Copiar Escribe una función en Python llamada correr_analisis(grupos, normalidad_ok, alpha) que haga:

1. Si normalidad_ok es True → correr stats.f_oneway(*grupos), nombre = "ANOVA Fisher"
2. Si normalidad_ok es False → correr stats.kruskal(*grupos), nombre = "Kruskal-Wallis"

3. Imprimir: qué prueba se usó, el estadístico, el p-valor, y si hay diferencia significativa (p < alpha).

4. Retornar: nombre_prueba, estadistico, p_valor, hay_diferencia (bool)

Usa scipy.stats. Alpha default 0.05.
🎯 ¿Cómo sé que funcionó? El PASO 2 muestra el nombre de la prueba, el valor F o H, el p-valor, y si la diferencia es SIGNIFICATIVA o no.
3
Post-hoc Tukey
¿Cuáles grupos son diferentes entre sí?
¿Qué hace este paso? Si ANOVA dice "hay diferencia", Tukey HSD te dice exactamente cuáles pares de grupos son diferentes. Si no hay diferencia, este paso se salta automáticamente.
📋 Prompt para Gemini — copia y pega esto:
📋 Copiar Escribe una función en Python llamada post_hoc(datos, factor, respuesta, hay_diferencia, normalidad_ok) que haga:

1. Si hay_diferencia es False → imprimir "Post-hoc no necesario" y retornar None.
2. Si hay_diferencia es True Y normalidad_ok es True → correr pairwise_tukeyhsd(datos[respuesta].values, datos[factor].values), imprimir el resultado y retornarlo.
3. Si normalidad_ok es False → imprimir "Datos no paramétricos, Tukey no aplica" y retornar None.

pairwise_tukeyhsd ya está importado. datos es un DataFrame de pandas. factor y respuesta son strings.
🎯 ¿Cómo sé que funcionó? Ves una tabla comparando cada par de grupos con "reject: True/False". O bien el mensaje de que no es necesario.
4
Visualización
Boxplot + gráfica de medias
¿Qué hace este paso? Genera una imagen con dos gráficas lado a lado: un boxplot (para ver distribución) y barras con medias (para comparar grupos). La imagen se guarda como PNG.
📋 Prompt para Gemini — copia y pega esto:
📋 Copiar Escribe una función en Python llamada visualizar(datos, factor, respuesta) que haga:

1. Crear figura: fig, axes = plt.subplots(1, 2, figsize=(12, 5))
2. axes[0]: boxplot con datos.boxplot(column=respuesta, by=factor, ax=axes[0])
3. axes[1]: barras con datos.groupby(factor)[respuesta].mean().plot(kind='bar', ax=axes[1])
4. Poner títulos descriptivos a cada gráfica.
5. plt.savefig('anova_resultado.png', bbox_inches='tight', dpi=150)
6. plt.close()
7. Imprimir "Imagen guardada: anova_resultado.png"

matplotlib.pyplot ya está importado como plt.
🎯 ¿Cómo sé que funcionó? Aparece el archivo anova_resultado.png en tu proyecto de Replit. Haz clic para verlo.
5
Generar Reporte HTML
Todo tu análisis en una página web
¿Qué hace este paso? Crea un archivo HTML con todos los resultados: datos, supuestos, prueba estadística e imagen. Es tu entregable visual — como un mini paper automático.
📋 Prompt para Gemini — copia y pega esto:
📋 Copiar Escribe una función en Python llamada generar_reporte(factor, respuesta, n_datos, n_grupos, normalidad_ok, homo_ok, nombre_prueba, estadistico, p_valor, hay_diferencia) que haga:

1. Crear un string HTML con estilo CSS bonito que incluya: título "Reporte ANOVA", sección de datos (N y grupos), sección de supuestos (normalidad y homocedasticidad Sí/No), sección de análisis (prueba, estadístico, p-valor), y si existe 'anova_resultado.png' incluir la imagen con <img>.

2. Guardar en "reporte_anova.html".
3. Imprimir "Reporte guardado: reporte_anova.html".

IMPORTANTE: El reporte NO debe incluir conclusiones ni interpretación. Solo los datos y números. La interpretación la hace el científico.
🎯 ¿Cómo sé que funcionó? En la Shell escribe python3 -m http.server 8000 y abre el Preview de Replit. Navega a reporte_anova.html y verás tu reporte.

✅ Checklist — Marca cada paso completado

🆘 ¿Te atoraste?