Actividad 1 (2do 50%) — Interfaz Streamlit y DCA

Oct 15, 2026 · @Justo

Cada estudiante construye, en su propio repositorio de GitHub, la interfaz de la App de Diseño Experimental y el módulo DCA funcional, después de resolver el mismo DCA a mano. Es la 1.ª nota del 2.º 50 % y se trabaja en modalidad virtual, por cualquiera de dos rutas que llevan al mismo producto y se califican con la misma rúbrica.

Datos generales

Campo Detalle
Asignatura Diseño Experimental · Ingeniería Agrícola · Universidad de Sucre · 2026-2
Docente Justo Fuentes
Evaluación Actividad 1 de 3 del 2.º 50 % (Interfaz + DCA). Siguen: Actividad 2 (DBCA, DCL, DPD) y Actividad 3 (Factoriales y RSM)
Tipo Individual. Cada estudiante tiene su repositorio y su variante de datos
Modalidad Virtual (2 sesiones semanales de 2 h por videollamada) + trabajo autónomo en casa
Duración sugerida 2 semanas: semana 1 = Fase 1 + interfaz; semana 2 = módulo DCA + verificación + entrega
Rutas de trabajo Ruta A: Copilot en modo agente (VS Code local o Codespaces). Ruta B: agente de IA externo + pegado manual en Codespaces
Peso en la nota Por definir por el docente: ___ %
Fecha de entrega Por definir por el docente: ________

Entregables (un solo envío por el aula virtual):

  1. Foto o PDF de la Fase 1 (lápiz y papel), con nombre y código en cada hoja.
  2. Enlace al repositorio público app-diseno-experimental en GitHub.
  3. Dos capturas de la app corriendo: página de inicio y módulo DCA con la tabla ANOVA de su variante.
  4. Archivo verificacion/verificacion_dca.R en el repositorio, con su salida pegada como comentario.
  5. Archivo BITACORA_IA.md en el repositorio, con los prompts usados y qué se verificó.
  6. Indicar en el envío la ruta usada (A o B). La ruta no cambia la nota.

Parte A — Actividad evaluativa

Descripción

La cooperativa de un productor de Sampués quiere saber cuál de sus 4 secadores solares por convección natural (A, B, C, D) deja las rodajas de yuca con menor humedad final. Se secó un lote en cada secador en 4 ocasiones, asignando los lotes al azar: es un Diseño Completamente al Azar (DCA) con 4 tratamientos y 4 réplicas.

Analogía para el estudiante: construir la app es como montar la planta de secado. La interfaz (app.py) es la nave con su señalización; cada módulo (pages/) es un secador; las funciones de utils/ son las herramientas que todos los secadores comparten. Hoy se levanta la nave y se pone a funcionar el primer secador: el DCA.

La actividad sigue la metodología de reserva cognitiva, en este orden obligatorio:

  1. Fase 1 — Lápiz y papel. Resolver a mano el ANOVA y la prueba de Tukey de su variante de datos.
  2. Fase 2 — Verificación con código. Construir la app con ayuda de IA, cargar sus datos y comprobar que la app (Python) y un script en R reproducen su cálculo manual.

La IA escribe código; el estudiante responde por la estadística. Ningún resultado de la app se acepta sin compararlo con la Fase 1.

Objetivos

General. Construir la interfaz multipágina de la App de Diseño Experimental y su módulo DCA, verificando que el análisis automatizado coincide con el cálculo manual y con R.

Específicos. El estudiante será capaz de:

  1. Calcular a mano las sumas de cuadrados, la tabla ANOVA y la DMS de Tukey de un DCA balanceado.
  2. Organizar un proyecto de Streamlit con estructura modular (app.py, pages/, utils/, data/) y control de versiones en GitHub.
  3. Formular prompts precisos para que un agente de IA genere código estadístico correcto y documentado.
  4. Implementar en la app el ANOVA de un factor, las medias, el boxplot, la prueba de Tukey y el diagnóstico de supuestos.
  5. Contrastar los resultados de la app con la Fase 1 y con R, y explicar cualquier diferencia.
  6. Interpretar el resultado en términos de la decisión agrícola: qué secador recomendar y por qué.

Competencias

Tipo Competencia
Específica Analiza experimentos agrícolas con el DCA para tomar decisiones técnicas sustentadas en evidencia estadística
Específica Desarrolla herramientas de software en Python para automatizar análisis estadísticos de ingeniería
Genérica Usa de forma crítica y ética la inteligencia artificial, verificando y documentando sus resultados
Genérica Gestiona su trabajo con control de versiones y comunica resultados técnicos por escrito

Resultados de aprendizaje

RA Resultado de aprendizaje Evidencia
RA1 Calcula correctamente a mano el ANOVA y la prueba de Tukey de un DCA y concluye sobre la hipótesis de igualdad de medias Hoja de la Fase 1
RA2 Estructura un proyecto Streamlit multipágina y lo versiona en GitHub con commits descriptivos Repositorio y su historial
RA3 Implementa el módulo DCA con carga de datos, ANOVA, medias, gráfica, Tukey y supuestos App corriendo y código
RA4 Verifica la concordancia entre cálculo manual, app (Python) y R, y explica las diferencias Tabla de verificación en BITACORA_IA.md y script R
RA5 Documenta el uso de IA con prompts, respuestas y decisiones propias BITACORA_IA.md y defensa oral breve

Fase 1 — Lápiz y papel (antes de abrir cualquier IA)

Cada estudiante resuelve a mano el DCA de su variante: sume k = (último dígito de su código estudiantil) ÷ 10 a las cuatro observaciones del secador D. Ejemplo: código terminado en 7 → k = 0,7 → D queda 14,2; 13,7; 14,5; 14,0.

Datos base: humedad final de rodajas de yuca (% base húmeda)

Réplica Secador A Secador B Secador C Secador D (+ k)
1 12,4 14,1 11,8 13,5
2 13,1 14,8 12,3 13,0
3 12,8 13,9 11,5 13,8
4 13,5 14,6 12,2 13,3

Pasos (mostrar todas las operaciones):

  1. Plantear el modelo y las hipótesis: H₀: μ_A = μ_B = μ_C = μ_D; H₁: al menos una media difiere.
  2. Calcular totales y medias por secador, el gran total Y.. y el factor de corrección.
  3. Calcular SC Total, SC Tratamientos y SC Error con las fórmulas de abajo.
  4. Completar la tabla ANOVA: fuente, gl, SC, CM, F calculada.
  5. Comparar con F crítica: F(0,05; 3; 12) = 3,49. Concluir sobre H₀.
  6. Si se rechaza H₀, calcular la DMS de Tukey con q(0,05; 4; 12) = 4,20, ordenar las medias y asignar letras de grupo.
  7. Calcular el coeficiente de variación: CV = (√CME ÷ media general) × 100.
  8. Responder en 3 a 5 líneas: ¿qué secador recomienda a la cooperativa y por qué?

\[FC = \frac{Y_{..}^{2}}{t\,r} \qquad SC_{Total} = \sum_{i}\sum_{j} Y_{ij}^{2} - FC \qquad SC_{Trat} = \frac{\sum_{i} Y_{i.}^{2}}{r} - FC\]

\[SC_{Error} = SC_{Total} - SC_{Trat} \qquad F = \frac{CM_{Trat}}{CM_{Error}} \qquad DMS_{Tukey} = q_{(0.05;\,t;\,gl_E)}\sqrt{\frac{CM_{Error}}{r}}\]

Pregunta de reserva cognitiva: sin hacer cuentas, ¿qué le pasa a la SC Error cuando se suma la misma constante k a todas las observaciones de un tratamiento? Comprobarlo después con la app.

La hoja se fotografía o escanea antes de pasar a la Fase 2 y se sube al aula virtual. Sus valores serán el patrón contra el que se verifica la app.

Rúbrica de evaluación por criterios

Nota final = Σ (nota del criterio × peso), en escala de 0,0 a 5,0. La ruta (A o B) no influye en la nota.

Criterio (peso) Excelente (4,6–5,0) Bueno (4,0–4,5) Aceptable (3,0–3,9) Insuficiente (0,0–2,9)
C1. Fase 1: cálculo manual del DCA (25 %) — RA1 Hipótesis, SC, tabla ANOVA, F, DMS de Tukey, letras y CV correctos para su variante; operaciones visibles; recomendación agrícola argumentada Procedimiento completo con 1–2 errores aritméticos que no cambian la conclusión ANOVA correcto pero sin Tukey, sin CV o sin conclusión agrícola Errores de procedimiento, no corresponde a su variante o se entregó después de usar la IA
C2. Interfaz y estructura del proyecto (15 %) — RA2 app.py con portada, propósito, módulos y advertencia académica; menú con las 6 páginas (5 en construcción); estructura pages/, utils/, data/, verificacion/ completa Interfaz y estructura completas con detalles menores de orden o redacción Interfaz básica; faltan páginas o carpetas La app no abre o no tiene estructura multipágina
C3. Módulo DCA funcional (25 %) — RA3 Carga CSV/Excel y ejemplo embebido; selección de columnas; ANOVA, medias, boxplot, Tukey condicionado al p-valor, supuestos (Shapiro-Wilk, Levene, gráficas) e interpretación; funciones en utils/anova_utils.py con comentarios Todo funciona; faltan supuestos o la interpretación es pobre ANOVA y medias funcionan; falta Tukey o carga de archivos El módulo falla o los resultados son incorrectos
C4. Verificación mano ↔︎ Python ↔︎ R (15 %) — RA4 Tabla comparativa con SC, CM, F, p y DMS de las tres fuentes; script R ejecutado con salida; explica las diferencias de redondeo Tabla completa, sin explicar diferencias Compara solo la F o solo dos fuentes No hay verificación o se copió la de otro estudiante
C5. GitHub y bitácora de IA (10 %) — RA2, RA5 ≥ 6 commits con mensajes descriptivos en distintos días; .gitignore correcto; README; bitácora con prompts, qué se aceptó, qué se corrigió y por qué 4–5 commits; bitácora completa pero poco reflexiva 1–3 commits o bitácora incompleta Un solo commit con todo, o sin bitácora
C6. Defensa oral breve (10 %) — RA1, RA5 En 3 min explica una función de anova_utils.py y relaciona la SC Error con su cálculo a mano; responde la pregunta de reserva cognitiva Explica el código con apoyo; respuesta parcial Lee el código sin explicarlo No puede explicar su propio código

Regla de integridad: si el estudiante no puede explicar el código de su repositorio en la defensa, C3 se califica como máximo en 3,0.

Parte B — Guía del estudiante

Agenda de las 4 sesiones virtuales

Sesión (2 h) Qué se hace Resultado al terminar
1 Presentación de la actividad, repaso del DCA y Fase 1 guiada Fase 1 resuelta y subida al aula virtual
2 Preparación del repositorio + Prompts 0, 1 y 2 Interfaz de la app corriendo y 3 commits
3 Prompts 3, 4 y 5 Módulo DCA con Tukey y supuestos funcionando
4 Prompt 6, verificación con R, bitácora y defensas orales de 3 min Entrega completa

El trabajo que no se termine en la sesión se completa en casa. Los prompts son iguales en contenido para ambas rutas; solo cambia cómo llega el código al repositorio.

¿Qué ruta me corresponde?

Mi situación Ruta
Inicié sesión en GitHub (con correo institucional o personal), tengo Copilot activo y trabajo en mi portátil Ruta A — Copilot en modo agente
No pude validar el correo institucional, no tengo Copilot o se me agotó la cuota Ruta B — agente externo + pegado manual
Mi internet es lento y el Codespace tarda mucho Ruta A en VS Code instalado en el portátil (sin Codespace), o Ruta B con el plan liviano (abajo)

Importante para la Ruta B: GitHub no exige el correo institucional. Una cuenta creada con Gmail u otro correo personal sirve para tener repositorio, Codespaces (cuota gratuita mensual para cuentas personales) y Copilot Free. El correo institucional solo se necesita para los beneficios de GitHub Education. Si aún no tiene cuenta, créela con su correo personal y siga la Ruta B.

Preparación común (ambas rutas, 10 min)

  1. En github.com → New repository. Nombre: app-diseno-experimental. Público. Marcar Add a README file y en .gitignore elegir la plantilla Python. Crear.
  2. Abrir el entorno de trabajo:
    • VS Code en el portátil (recomendado en casa): en la terminal, git clone https://github.com/USUARIO/app-diseno-experimental.git, luego cd app-diseno-experimental y code .
    • Codespaces: en el repositorio, botón Code → Codespaces → Create codespace on main. Se crea una sola vez.
  3. Comprobar que la terminal responde: python --version y git --version.
  4. Crear en la raíz el archivo BITACORA_IA.md y hacer el primer commit: git add ., git commit -m "Inicia bitácora de IA", git push.

Consejos para internet lento en Codespaces:

  • No cree un Codespace nuevo cada vez. Entre a github.com/codespaces y abra el que ya existe: reabrir tarda mucho menos que crear.
  • Al terminar, deténgalo (menú … → Stop codespace) para no gastar horas gratuitas.
  • En esta actividad se instalan solo 7 librerías livianas. Kaleido y las de exportación se instalan en la Actividad 3.
  • Plan liviano (solo Ruta B): para pegar código y hacer commits basta el editor web github.dev (en su repositorio, presione la tecla .). Carga en segundos porque no crea una máquina. No ejecuta la app: use el Codespace solo para el paso de ejecutar y verificar.

Plantilla de la bitácora de IA

Copie este bloque en BITACORA_IA.md una vez por cada prompt usado:

### Prompt N — (título)
- Ruta: A (Copilot agente) / B (agente externo: nombre)
- Fecha:
- Qué generó la IA (archivos):
- Qué acepté sin cambios:
- Qué corregí y por qué:
- Cómo lo verifiqué (ejecuté la app / comparé con mi Fase 1 / R):

Ruta A — Copilot en modo agente (VS Code o Codespaces)

Con 7 prompts el agente crea los archivos, instala librerías y ejecuta la app; el estudiante revisa, prueba y hace commit después de cada uno.

Ciclo para cada prompt:

  1. Abrir el chat de Copilot (Ctrl+Alt+I) y elegir el modo Agent en el selector inferior.
  2. Pegar el prompt completo una sola vez. No enviar mensajes cortos de prueba: cada mensaje gasta cuota.
  3. Cuando el agente pida permiso para ejecutar un comando en la terminal, leerlo y aceptar.
  4. Revisar los cambios propuestos y pulsar Keep (conservar) solo si se entienden.
  5. Probar: streamlit run app.py (en Codespaces aparece un aviso para abrir el puerto 8501 en el navegador). Detener con Ctrl+C.
  6. Hacer commit con el mensaje sugerido y git push. Registrar el prompt en la bitácora.

Ahorro de cuota: use el modo Ask para preguntas («¿qué hace esta línea?») y reserve Agent para estos 7 prompts. Si la cuota se agota a mitad de camino, continúe con el mismo número de prompt en la Ruta B.

Prompt 0 — Instrucciones permanentes para el agente

Copilot lee automáticamente el archivo .github/copilot-instructions.md en cada conversación, así no hay que repetir el contexto.

Crea el archivo .github/copilot-instructions.md con estas reglas permanentes para este repositorio:
- Proyecto: App de Diseño Experimental en Python y Streamlit, curso de Diseño Experimental, Ingeniería Agrícola, Universidad de Sucre.
- Estructura: app.py (portada), pages/ (un archivo por diseño), utils/ (funciones reutilizables, con __init__.py), data/ (CSV de ejemplo), verificacion/ (scripts de R).
- Todo el código, comentarios, docstrings y mensajes de la interfaz en español.
- Cada paso estadístico lleva un comentario que explique qué calcula y por qué, pensado para estudiantes de Ingeniería Agrícola.
- Funciones con type hints y docstrings estilo Google.
- Librerías permitidas: streamlit, pandas, numpy, scipy, statsmodels, plotly, openpyxl. No agregues otras sin pedir permiso.
- Los ANOVA se ajustan con statsmodels.formula.api.ols y statsmodels.stats.anova.anova_lm(typ=2). Tukey con statsmodels.stats.multicomp.pairwise_tukeyhsd.
- No inventes resultados: los números salen siempre del cálculo.
- Antes de terminar una tarea, ejecuta el código y corrige los errores que aparezcan.
No modifiques ningún otro archivo.

Commit: Agrega instrucciones para el agente

Prompt 1 — Estructura del proyecto y librerías

Prepara la estructura del proyecto en este repositorio.
1. Crea las carpetas pages/, utils/, data/ y verificacion/. Crea utils/__init__.py vacío.
2. Crea requirements.txt con: streamlit, pandas, numpy, scipy, statsmodels, plotly, openpyxl (sin versiones fijas).
3. Completa el .gitignore existente para que también excluya: .venv/, __pycache__/, .streamlit/secrets.toml, exports/.
4. Crea data/dca_secadores.csv con columnas secador,replica,humedad y estos 16 datos de humedad final de yuca (% b.h.):
   A: 12.4, 13.1, 12.8, 13.5 | B: 14.1, 14.8, 13.9, 14.6 | C: 11.8, 12.3, 11.5, 12.2 | D: 13.5, 13.0, 13.8, 13.3 (réplicas 1 a 4 en ese orden).
5. Instala las librerías:
   - Si la variable de entorno CODESPACES existe, instala directo con: pip install -r requirements.txt
   - Si no (VS Code local en Windows), crea el entorno con python -m venv .venv, actívalo con .venv\Scripts\Activate.ps1 e instala dentro de él.
6. Verifica con: python -c "import streamlit, statsmodels; print(streamlit.__version__, statsmodels.__version__)"
Al final, muéstrame el árbol de carpetas y explica en 5 líneas para qué sirve cada carpeta.

Commit: Crea estructura del proyecto y datos de ejemplo

Prompt 2 — Interfaz: portada y menú de módulos

Crea la interfaz de la app multipágina usando la carpeta pages/ (Streamlit muestra cada archivo como una página del menú lateral).
1. app.py (portada):
   - st.set_page_config(page_title="App de Diseño Experimental", page_icon="🌱", layout="wide").
   - Título, subtítulo "Ingeniería Agrícola – Universidad de Sucre" y un párrafo sobre para qué sirve el diseño experimental en el campo.
   - Tabla con los 6 módulos (DCA, DBCA, DCL, DPD, Factoriales, RSM): nombre completo, cuándo se usa y un ejemplo agrícola de una línea; columna Estado: DCA = "Disponible", los demás = "En construcción".
   - Instrucciones de uso en 4 pasos (elegir módulo, cargar datos, revisar resultados, verificar a mano).
   - st.warning con: "Esta app apoya el aprendizaje. El estudiante interpreta los resultados, verifica supuestos y compara con su cálculo manual."
   - En st.sidebar: nombre del autor (dejar AUTOR = "Escribe aquí tu nombre" como constante al inicio del archivo), curso y semestre 2026-2.
2. Crea pages/01_DCA.py con solo un título y st.info("Módulo en desarrollo") (se completará después).
3. Crea pages/02_DBCA.py, 03_DCL.py, 04_DPD.py, 05_Factoriales.py y 06_RSM.py, cada una con su título, una definición de 2 líneas del diseño y st.info("En construcción: Actividad 2") o ("En construcción: Actividad 3") para Factoriales y RSM.
4. Ejecuta streamlit run app.py --server.headless true, comprueba que no hay errores y detén la app.
No agregues cálculos estadísticos todavía.

Commit: Agrega portada y menú de módulos. Luego cambiar la constante AUTOR por su nombre a mano.

Prompt 3 — Funciones estadísticas reutilizables

Crea utils/anova_utils.py con estas funciones para un DCA (un factor). Usa nombres de columna genéricos y protege los nombres en la fórmula con Q("nombre").
1. cargar_datos(archivo) -> pd.DataFrame: lee CSV (detecta separador , o ;) o Excel (.xlsx).
2. validar_dca(df, col_trat, col_resp) -> list[str]: devuelve una lista de mensajes de error en español si: faltan columnas, la respuesta no es numérica, hay datos faltantes, hay menos de 2 tratamientos o algún tratamiento tiene menos de 2 réplicas. Lista vacía si todo está bien.
3. ajustar_dca(df, col_trat, col_resp): ajusta ols("Q(resp) ~ C(Q(trat))") y devuelve el modelo.
4. tabla_anova(modelo) -> pd.DataFrame: anova_lm(typ=2) con columnas en español: Fuente, gl, SC, CM, F, p-valor; renombra las filas a "Tratamientos" y "Error" y agrega la fila "Total". Calcula CM = SC/gl.
5. resumen_tratamientos(df, col_trat, col_resp) -> pd.DataFrame: n, total, media, desviación estándar por tratamiento.
6. coeficiente_variacion(modelo, df, col_resp) -> float: CV = sqrt(CME) / media general * 100.
7. tukey(df, col_trat, col_resp, alfa=0.05) -> tuple[pd.DataFrame, float]: resultado de pairwise_tukeyhsd como DataFrame en español y la DMS = q(alfa; t; glE) * sqrt(CME / r) usando scipy.stats.studentized_range.ppf. Si el diseño no está balanceado, avisa que la DMS es aproximada.
8. interpretar_dca(tabla, alfa=0.05) -> str: texto sencillo que diga si se rechaza H0 y qué significa para la decisión.
Cada función: type hints, docstring estilo Google, comentarios paso a paso y la fórmula usada en el comentario.
Al final, prueba las funciones en la terminal con data/dca_secadores.csv e imprime la tabla ANOVA, el CV y la DMS.

Commit: Agrega funciones del ANOVA de un factor. Comparar ya la tabla impresa con la Fase 1 (con k = 0 los valores deben coincidir con los datos base).

Prompt 4 — Módulo DCA en la app

Reemplaza el contenido de pages/01_DCA.py por el módulo completo del DCA, usando SOLO las funciones de utils/anova_utils.py (importa con: from utils.anova_utils import ...).
1. Título y una explicación breve del DCA con el ejemplo de los 4 secadores solares.
2. st.file_uploader para CSV o Excel. Si no se carga archivo, usar data/dca_secadores.csv y avisarlo con st.caption.
3. Selectores (st.selectbox) para la columna de tratamiento y la de respuesta; st.slider para alfa (0.01 a 0.10, por defecto 0.05).
4. Mostrar validaciones con st.error y detener con st.stop() si hay errores.
5. Pestañas (st.tabs): "Datos", "ANOVA", "Comparaciones", "Gráficos".
   - Datos: tabla y resumen por tratamiento.
   - ANOVA: tabla ANOVA (4 decimales), F crítica, CV y la interpretación con st.success o st.info.
   - Comparaciones: si p-valor < alfa, tabla de Tukey y la DMS; si no, explicar por qué no se hace Tukey.
   - Gráficos: boxplot con plotly.express (respuesta por tratamiento, con los puntos) y gráfico de medias.
6. Usa @st.cache_data en la carga de datos.
7. Ejecuta la app, revisa que las 4 pestañas funcionen con el ejemplo y corrige cualquier error (en especial ModuleNotFoundError).

Commit: Implementa módulo DCA

Prompt 5 — Diagnóstico de supuestos

Agrega el diagnóstico de supuestos del DCA.
1. Crea utils/diagnostico_utils.py con: residuos_y_ajustados(modelo), prueba_shapiro(residuos), prueba_levene(df, col_trat, col_resp) (scipy.stats.levene con center="median"), grafico_residuos_vs_ajustados(...) y grafico_qq(...) con plotly. Cada prueba devuelve estadístico, p-valor y una conclusión en español.
2. En pages/01_DCA.py agrega una quinta pestaña "Supuestos" con: las dos gráficas, una tabla con Shapiro-Wilk y Levene, y una explicación de qué supuesto revisa cada una (normalidad, homogeneidad de varianzas, independencia por la aleatorización).
3. Ejecuta la app y comprueba que la pestaña funciona.

Commit: Agrega diagnóstico de supuestos al DCA

Prompt 6 — Verificación con R y README

Antes de este prompt, crear a mano el archivo data/dca_mi_variante.csv con sus datos (sume k al secador D). Escribirlo usted mismo es parte de la verificación.

1. Crea verificacion/verificacion_dca.R que lea ../data/dca_mi_variante.csv, ajuste aov(humedad ~ factor(secador)), imprima summary(), las medias por secador, el CV y TukeyHSD(). Comenta cada línea en español para estudiantes. No lo ejecutes si R no está instalado.
2. Actualiza README.md con: título, descripción, módulos y su estado, estructura de carpetas, cómo instalar y ejecutar (local y Codespaces), autor y uso de IA declarado.
No modifiques el código de la app.

Commit: Agrega verificación en R y README. La ejecución del script R se explica en la sección de verificación final.

Ruta B — Agente de IA externo + pegado manual

Un chat web gratuito (Claude, ChatGPT, Gemini o Copilot web) genera el código; el estudiante crea cada archivo en el Codespace, lo pega, lo ejecuta y actualiza GitHub con la terminal o con el panel de control de código fuente. Se usan los mismos prompts 1 a 6 de la Ruta A con un bloque adicional al final.

Paso B0 — Abrir un chat nuevo y pegar el contexto

Trabaje toda la actividad en una misma conversación, para que el agente recuerde los archivos que ya generó. Pegue primero esto:

Vas a ser mi asistente de programación para construir una App de Diseño Experimental en Python y Streamlit (curso de Diseño Experimental, Ingeniería Agrícola, Universidad de Sucre).
Tú NO puedes ver ni ejecutar mis archivos. Yo copio tu código en GitHub Codespaces, lo ejecuto y te devuelvo los errores.
Reglas para todas tus respuestas:
1. Entrega cada archivo COMPLETO (nunca fragmentos ni "...resto igual"), en su propio bloque de código, precedido de su ruta exacta, por ejemplo: Archivo: pages/01_DCA.py
2. Si un archivo ya existe y cambia, vuelve a entregarlo completo.
3. Después de los archivos, dame los comandos de terminal exactos (Linux/bash de Codespaces) para crear carpetas, instalar y ejecutar, en orden.
4. Termina con: cómo sé que funcionó (qué debo ver) y el mensaje de commit sugerido.
Reglas del proyecto:
- Estructura: app.py (portada), pages/ (un archivo por diseño), utils/ (con __init__.py), data/, verificacion/.
- Código, comentarios y mensajes en español, con comentarios paso a paso pensados para estudiantes de Ingeniería Agrícola. Type hints y docstrings estilo Google.
- Solo estas librerías: streamlit, pandas, numpy, scipy, statsmodels, plotly, openpyxl.
- ANOVA con statsmodels.formula.api.ols y anova_lm(typ=2); Tukey con pairwise_tukeyhsd.
- No inventes resultados numéricos.
Responde solo "Listo" y espera mi primera tarea.

Pasos B1 a B6 — Los prompts de la Ruta A con un bloque final

Para cada prompt N (de 1 a 6): copie el texto del Prompt N de la Ruta A, péguelo en el chat y agréguele al final este bloque:

IMPORTANTE: tú no puedes ejecutar nada. Donde la tarea dice "ejecuta", "instala", "prueba" o "verifica", dame los comandos para que yo los ejecute en la terminal de Codespaces y dime qué salida debo esperar. Entrega cada archivo completo con su ruta.

Ajustes puntuales:

  • B1: en Codespaces no se crea .venv; el agente debe darle pip install -r requirements.txt.
  • B4 y B5: si abrió un chat nuevo, antes pegue el contenido actual de utils/anova_utils.py con: «Este es mi archivo utils/anova_utils.py actual:».
  • B6: cree usted mismo data/dca_mi_variante.csv antes de enviar el prompt.

Cómo llevar el código al Codespace

  1. En el Explorador (barra izquierda), clic derecho → New File y escribir la ruta completa, por ejemplo utils/anova_utils.py (las carpetas se crean solas).
  2. En el chat externo, pulsar Copiar en el bloque de código. Pegar en el archivo con Ctrl+V y guardar con Ctrl+S.
  3. Si el archivo ya existía: Ctrl+A para seleccionar todo, pegar encima y guardar.
  4. Ejecutar en la terminal (Ctrl+ñ o menú Terminal → New Terminal) los comandos que dio el agente. Para la app: streamlit run app.py y abrir el puerto 8501 cuando aparezca el aviso.
  5. Revisar que funciona antes de hacer el commit.

Cómo actualizar GitHub

Opción 1 — Terminal:

# 1. Ver qué archivos cambiaron (rojo = sin preparar)
git status
# 2. Preparar todos los cambios para el commit
git add .
# 3. Guardar una versión con un mensaje que diga qué cambió
git commit -m "Implementa módulo DCA"
# 4. Subir la versión a GitHub
git push
# 5. Comprobar el historial (un commit por línea)
git log --oneline

Opción 2 — Panel de control de código fuente (Ctrl+Shift+G):

  1. Revisar la lista Changes (cambios).
  2. Pulsar + junto a Changes (equivale a git add .).
  3. Escribir el mensaje en la caja superior y pulsar Commit (equivale a git commit).
  4. Pulsar Sync Changes (equivale a git push).

En github.dev (plan liviano) el botón es Commit & Push y hace todo en un paso.

Cuando aparece un error

Copie el error completo de la terminal o de la app y envíelo en el mismo chat con este prompt:

Al ejecutar [comando] obtuve este error:
[pegar el error completo]
Este es el archivo donde ocurre: [ruta]
[pegar el contenido completo del archivo]
Explícame en 3 líneas la causa, desde Python y desde la estadística si aplica, y dame el archivo corregido completo.

Error frecuente: ModuleNotFoundError: No module named 'utils'. Casi siempre se debe a que falta utils/__init__.py o a que la app no se ejecutó desde la carpeta raíz del repositorio.

Verificación final (ambas rutas)

La app y R deben reproducir la Fase 1 con su variante. Diferencias en el tercer decimal son de redondeo; diferencias mayores indican un error que hay que encontrar.

  1. En la app, cargar data/dca_mi_variante.csv en el módulo DCA.
  2. Ejecutar verificacion/verificacion_dca.R. Codespaces no trae R instalado; use una de estas opciones:
    • Google Colab con R: menú Entorno de ejecución → Cambiar tipo → R, subir el CSV y pegar el script (cambiar la ruta a dca_mi_variante.csv).
    • RStudio instalado en el portátil (como en Estadística Aplicada con Python y R).
  3. Pegar la salida de R como comentario al final del script y hacer commit: Agrega salida de la verificación en R.
  4. Copiar en BITACORA_IA.md esta tabla y llenarla:
| Valor | Fase 1 (a mano) | App (Python) | R | ¿Coincide? |
|---|---|---|---|---|
| SC Tratamientos |  |  |  |  |
| SC Error |  |  |  |  |
| CM Error |  |  |  |  |
| F calculada |  |  |  |  |
| p-valor | (no aplica) |  |  |  |
| DMS Tukey |  |  | (no aplica) |  |
| CV (%) |  |  |  |  |
| Grupos de Tukey |  |  |  |  |
  1. Escribir 3 líneas: ¿la app coincidió con su cálculo? Si no, ¿quién estaba equivocado y por qué?

Lista de verificación de la entrega

Solución de problemas frecuentes

Síntoma Causa probable Solución
ModuleNotFoundError: No module named 'utils' Falta utils/__init__.py o se ejecutó desde otra carpeta Crear el archivo vacío y ejecutar streamlit run app.py desde la raíz
streamlit: command not found Librerías no instaladas (o .venv sin activar en local) pip install -r requirements.txt; en local, activar .venv primero
La app no abre en Codespaces El puerto no se abrió Pestaña Ports → puerto 8501 → ícono del globo
git push rechazado Hay cambios en GitHub que no tiene localmente git pull y luego git push
El Codespace tarda varios minutos Se está creando uno nuevo Reabrir el existente desde github.com/codespaces o usar github.dev para editar
Se agotó la cuota de Copilot Límite mensual del plan gratuito Continuar en la Ruta B con el mismo número de prompt
La tabla ANOVA no coincide con la Fase 1 Datos mal digitados o typ distinto en anova_lm Revisar el CSV fila por fila; pedir a la IA que use typ=2

Notas para el docente (eliminar esta sección antes de compartir con los estudiantes)

Clave de respuestas. En todas las variantes SC Error = 1,9300; gl Error = 12; CM Error = 0,1608; DMS Tukey = 0,842; CV ≈ 3,0 %. Solo cambia el secador D. Es también la respuesta a la pregunta de reserva cognitiva: sumar una constante a un tratamiento no altera la variabilidad dentro de él.

Dígito (k) Y.. SC Total SC Trat F calc. Media D Grupos de Tukey (α = 0,05)
0 (0,0) 210,6 13,8575 11,9275 24,72 13,40 B a · D b · A b · C c
1 (0,1) 211,0 14,0775 12,1475 25,18 13,50 B a · D b · A b · C c (B–D = 0,85, límite)
2 (0,2) 211,4 14,3575 12,4275 25,76 13,60 B a · D ab · A b · C c
3 (0,3) 211,8 14,6975 12,7675 26,46 13,70 B a · D ab · A b · C c
4 (0,4) 212,2 15,0975 13,1675 27,29 13,80 B a · D a · A b · C c (D–A = 0,85, límite)
5 (0,5) 212,6 15,5575 13,6275 28,24 13,90 B a · D a · A b · C c
6 (0,6) 213,0 16,0775 14,1475 29,32 14,00 B a · D a · A b · C c
7 (0,7) 213,4 16,6575 14,7275 30,52 14,10 B a · D a · A b · C c
8 (0,8) 213,8 17,2975 15,3675 31,85 14,20 B a · D a · A b · C c
9 (0,9) 214,2 17,9975 16,0675 33,30 14,30 B a · D a · A b · C c

Medias fijas: A = 12,95; B = 14,35; C = 11,95. En todas las variantes F > 3,49 y p < 0,0001, así que se rechaza H₀. La recomendación correcta es el secador C, con la menor humedad final, distinto de todos los demás. En las variantes 1 y 4 la diferencia queda a menos de 0,01 de la DMS: acepte cualquiera de las dos agrupaciones si el procedimiento es correcto.

Sobre las rutas. La cuenta de GitHub con correo personal resuelve el bloqueo de los estudiantes sin correo institucional; solo pierden Copilot Student, no el repositorio ni Codespaces. Conviene verificar en la sesión 2 que todos tengan cuenta y repositorio creado.

Defensas orales (C6). Con 3 minutos por estudiante, un curso de 30 requiere unos 90 minutos de la sesión 4. Pregunta sugerida: «muéstrame en anova_utils.py dónde se calcula el CM Error y relaciónalo con tu hoja».