Actividad 2 (2do 50%) — Diseños con bloques: DBCA, DCL y DPD

Oct 15, 2026 · @Justo

Cada estudiante agrega a su App de Diseño Experimental los módulos DBCA, DCL y DPD, después de resolver a mano un experimento de cada diseño con su variante personal. Es la 2.ª nota del 2.º 50 %. Continúa el mismo repositorio de la Actividad 1 y conserva las dos rutas de trabajo, con la misma rúbrica para ambas.

Datos generales

Campo Detalle
Asignatura Diseño Experimental · Ingeniería Agrícola · Universidad de Sucre · 2026-2
Docente Justo Fuentes
Evaluación Actividad 2 de 3 del 2.º 50 %: diseños con bloques (DBCA, DCL, DPD). Sigue la Actividad 3 (Factoriales y RSM)
Requisito Actividad 1 entregada: repositorio app-diseno-experimental con la portada y el módulo DCA funcionando
Tipo Individual, con variante personal de datos (último dígito del código estudiantil)
Modalidad Virtual (2 sesiones semanales de 2 h) + trabajo autónomo en casa
Duración sugerida 2 semanas (4 sesiones). Cada cálculo a mano se hace en casa antes de la sesión de su módulo
Rutas de trabajo Ruta A: Copilot en modo agente. 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. Fotos o PDF de la Fase 1: tres ejercicios a mano (DBCA, DCL y DPD), con nombre y código en cada hoja.
  2. Enlace al mismo repositorio app-diseno-experimental, ahora con las páginas DBCA, DCL y DPD funcionando.
  3. Tres capturas: la tabla ANOVA de cada módulo con su variante cargada.
  4. Tres scripts en verificacion/ (verificacion_dbca.R, verificacion_dcl.R, verificacion_dpd.R), con su salida pegada como comentario.
  5. BITACORA_IA.md actualizada con los prompts 7 a 12 y las tres tablas de verificación.
  6. Ruta usada (A o B). La ruta no cambia la nota.

Parte A — Actividad evaluativa

Descripción

En la Actividad 1 los lotes de yuca se asignaron al azar sin controlar nada más. En el campo eso casi nunca basta: la radiación cambia de un día a otro, las bandejas de abajo se calientan más que las de arriba y hay factores que no se pueden cambiar en cada lote. Esta actividad estudia tres diseños que controlan esas fuentes de variación con bloques, todos con el proyecto de secadores solares:

Diseño Pregunta del experimento Qué se controla
DBCA ¿Qué secador (A, B, C, D) deja la menor humedad final? El día de secado (bloque), porque la radiación cambia cada día
DCL ¿Qué pretratamiento de la yuca (T1 a T4) seca mejor? Dos gradientes a la vez: el día (fila) y la posición de la bandeja (columna)
DPD ¿Cómo influyen el tipo de secador y el espesor de la rodaja? El secador es difícil de cambiar (parcela principal); el espesor se cambia en cada bandeja (subparcela)

Analogía para el estudiante: comparar secadores en días distintos sin bloques es como comparar el rendimiento de dos lotes de maíz sembrados uno en vega y otro en loma: la diferencia puede ser del suelo y no de la variedad. El bloque pone a todos los tratamientos a competir en las mismas condiciones.

Se mantiene la metodología de reserva cognitiva:

  1. Fase 1 — Lápiz y papel. Resolver a mano cada diseño con su variante, antes de construir su módulo.
  2. Fase 2 — Verificación con código. Construir los módulos con ayuda de IA y comprobar que la app (Python) y R reproducen el cálculo manual.

Objetivos

General. Implementar en la App de Diseño Experimental los módulos DBCA, DCL y DPD, verificando que cada análisis coincide con el cálculo manual y con R.

Específicos. El estudiante será capaz de:

  1. Calcular a mano el ANOVA del DBCA, del DCL y del DPD, incluidas las dos fuentes de error del DPD.
  2. Explicar qué fuente de variación controla cada diseño y cuánto se gana frente a un DCA (eficiencia relativa).
  3. Aplicar la prueba de Tukey con el CM del Error del modelo y no el de un análisis de un factor.
  4. Implementar los tres módulos en Streamlit, reutilizando funciones de utils/.
  5. Verificar los resultados de la app con el cálculo manual y con R, y explicar las diferencias.
  6. Interpretar la interacción en el DPD y traducir los resultados en una recomendación de secado.

Competencias

Tipo Competencia
Específica Selecciona y analiza diseños con control local (DBCA, DCL, DPD) según las fuentes de variación del experimento agrícola
Específica Desarrolla módulos de software en Python que automatizan análisis estadísticos con estructuras de error distintas
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 con argumentos

Resultados de aprendizaje

RA Resultado de aprendizaje Evidencia
RA1 Calcula a mano el ANOVA de un DBCA, un DCL y un DPD, y concluye sobre cada hipótesis Hojas de la Fase 1
RA2 Justifica la elección del diseño según la estructura del experimento y calcula la eficiencia relativa del bloqueo Fase 1 (DBCA) y defensa oral
RA3 Implementa los módulos DBCA, DCL y DPD con validación de la estructura, ANOVA, comparaciones y gráficos App y código en el repositorio
RA4 Verifica la concordancia entre cálculo manual, app (Python) y R para los tres diseños Tablas de verificación y scripts R
RA5 Documenta el uso de IA, señalando qué corrigió de lo generado y por qué BITACORA_IA.md y defensa oral

Fase 1 — Lápiz y papel (antes de cada módulo)

La variante personal es la misma de la Actividad 1: k = (último dígito del código estudiantil) ÷ 10. En cada ejercicio, k se suma solo al tratamiento indicado. Respuesta en los tres casos: humedad final de rodajas de yuca (% base húmeda); menor humedad = mejor secado.

Ejercicio 1 — DBCA: secadores con el día como bloque

Cada día se secó un lote en cada uno de los 4 secadores. Sume k a la columna del secador D.

Día (bloque) Secador A Secador B Secador C Secador D (+ k)
1 12,6 14,3 12,0 13,6
2 13,2 15,1 12,6 13,7
3 12,3 13,4 11,4 13,2
4 12,9 14,8 12,4 13,6
  1. Plantear el modelo Yᵢⱼ = μ + τᵢ + βⱼ + εᵢⱼ y las hipótesis para tratamientos.
  2. Calcular FC, SC Total, SC Secadores, SC Días y SC Error. Completar la tabla ANOVA.
  3. Comparar con F(0,05; 3; 9) = 3,86. Concluir para secadores y comentar si el bloqueo fue útil.
  4. Tukey con q(0,05; 4; 9) = 4,41 y CM Error del DBCA; letras de grupo.
  5. Calcular el CV y la eficiencia relativa del DBCA frente a un DCA (fórmula abajo). ¿Cuántas réplicas habría necesitado un DCA para lograr la misma precisión?

\[SC_{Bloques} = \frac{\sum_{j} Y_{.j}^{2}}{t} - FC \qquad SC_{Error} = SC_{Total} - SC_{Trat} - SC_{Bloques} \qquad gl_{E} = (t-1)(b-1)\]

\[ER = \frac{(b-1)\,CM_{Bloques} + b\,(t-1)\,CM_{Error}}{(b\,t-1)\,CM_{Error}}\]

Ejercicio 2 — DCL: pretratamientos con día y posición de bandeja

En un solo secador se probaron 4 pretratamientos: T1 sin pretratamiento, T2 escaldado, T3 inmersión en ácido cítrico y T4 inmersión en salmuera. Las filas son los días y las columnas la posición de la bandeja (1 = superior, 4 = inferior). Cada celda indica el pretratamiento y la humedad. Sume k a las cuatro celdas de T4.

Día (fila) Bandeja 1 Bandeja 2 Bandeja 3 Bandeja 4
1 T2 · 12,9 T4 · 13,5 T1 · 14,3 T3 · 12,5
2 T3 · 13,4 T1 · 14,1 T4 · 14,0 T2 · 12,9
3 T1 · 13,6 T3 · 11,8 T2 · 12,0 T4 · 12,7
4 T4 · 13,6 T2 · 11,9 T3 · 12,7 T1 · 13,8
  1. Comprobar que es un cuadro latino: cada pretratamiento aparece una vez por fila y una vez por columna.
  2. Calcular totales por fila, por columna y por pretratamiento; luego SC Filas, SC Columnas, SC Pretratamientos y SC Error.
  3. Tabla ANOVA con gl Error = (t − 1)(t − 2) = 6. Comparar con F(0,05; 3; 6) = 4,76.
  4. Tukey con q(0,05; 4; 6) = 4,90; letras de grupo y CV.
  5. Responder: ¿qué pretratamiento recomienda? ¿Fue útil controlar la posición de la bandeja?

\[SC_{Error} = SC_{Total} - SC_{Filas} - SC_{Columnas} - SC_{Trat} \qquad gl_{E} = (t-1)(t-2)\]

Ejercicio 3 — DPD: tipo de secador × espesor de rodaja

Cambiar de secador cada lote no es práctico, así que cada día (bloque) se usaron los dos secadores (parcela principal: a1 = sin chimenea, a2 = con chimenea) y dentro de cada uno se secaron tres espesores de rodaja (subparcela: 3, 5 y 7 mm) en bandejas asignadas al azar. Sume k a todas las observaciones de 7 mm.

Día (bloque) Secador 3 mm 5 mm 7 mm (+ k)
1 a1 sin chimenea 13,1 13,8 15,1
1 a2 con chimenea 12,2 13,1 13,6
2 a1 sin chimenea 12,6 13,4 14,7
2 a2 con chimenea 10,7 11,5 12,2
3 a1 sin chimenea 12,9 14,0 15,0
3 a2 con chimenea 11,4 12,5 12,9
  1. Dibujar el croquis de un bloque: parcelas grandes (secador) divididas en subparcelas (espesor).
  2. Calcular FC, SC Total, SC Bloques, SC A (secador) y SC de parcelas principales; obtener SC Error (a).
  3. Calcular SC B (espesor), SC A×B y SC Error (b).
  4. Tabla ANOVA con dos errores: A se prueba contra CM Error (a) con F(0,05; 1; 2) = 18,51; B y A×B contra CM Error (b) con F(0,05; 2; 8) = 4,46.
  5. Calcular las medias de las 6 combinaciones, dibujar a mano la gráfica de interacción y explicarla en 3 líneas.
  6. Calcular CV(a) y CV(b) y explicar por qué uno es mucho mayor que el otro.

\[SC_{PP} = \frac{\sum_{k}\sum_{i} Y_{ik.}^{2}}{b} - FC \qquad SC_{E(a)} = SC_{PP} - SC_{Bloques} - SC_{A} \qquad gl_{E(a)} = (r-1)(a-1)\]

\[SC_{AB} = \frac{\sum_{i}\sum_{j} Y_{.ij}^{2}}{r} - FC - SC_{A} - SC_{B} \qquad SC_{E(b)} = SC_{Total} - SC_{PP} - SC_{B} - SC_{AB} \qquad gl_{E(b)} = a\,(r-1)(b-1)\]

Preguntas de reserva cognitiva:

  • En el DPD, ¿qué pasaría con la F del secador si, por error, se usara un solo término de error como en un DBCA? Comprobarlo después con R.
  • En los tres ejercicios, ¿qué sumas de cuadrados cambian con su k y cuáles no? ¿Por qué?

Cada hoja se escanea y se sube antes de la sesión en que se construye su módulo.

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: tres diseños a mano (25 %) — RA1, RA2 Los tres ANOVA correctos para su variante; DPD con dos errores bien separados; Tukey, CV, eficiencia relativa e interacción dibujada; conclusiones agrícolas Los tres completos con 1–3 errores aritméticos que no cambian las conclusiones Dos diseños correctos, o el DPD con un solo término de error Un solo diseño, no corresponde a su variante o se entregó después de usar la IA
C2. Módulo DBCA (15 %) — RA3 Selección de bloque, tratamiento y respuesta; validación de estructura completa; ANOVA; Tukey con el CME del modelo; eficiencia relativa; gráfico de perfiles por bloque; supuestos Todo funciona; falta la eficiencia relativa o los supuestos ANOVA correcto pero Tukey con el CME de un factor El módulo falla o el ANOVA es incorrecto
C3. Módulo DCL (15 %) — RA3 Valida que sea cuadro latino y explica el error si no lo es; mapa de calor del croquis; ANOVA con filas, columnas y tratamientos; Tukey; supuestos Funciona; validación incompleta o sin croquis ANOVA correcto sin validación ni Tukey El módulo falla o confunde filas con tratamientos
C4. Módulo DPD (15 %) — RA3 Tabla ANOVA con Error (a) y Error (b) correctos; F de A contra Error (a); medias y gráfica de interacción; advertencia de que la parcela principal tiene pocos gl Dos errores correctos; interpretación de la interacción pobre Usa un solo error, pero lo reconoce y lo explica en la bitácora Un solo error sin advertencia o el módulo falla
C5. Verificación mano ↔︎ Python ↔︎ R (15 %) — RA4 Tres tablas de verificación completas; tres scripts R con salida; en el DPD compara el análisis correcto con el de un solo error Tres tablas, falta una comparación o una salida de R Verifica solo uno o dos diseños No hay verificación o es copiada
C6. GitHub y bitácora de IA (5 %) — RA5 ≥ 6 commits nuevos con mensajes descriptivos en distintos días; bitácora con lo que se aceptó, corrigió y por qué 4–5 commits; bitácora poco reflexiva 1–3 commits o bitácora incompleta Un solo commit o sin bitácora
C7. Defensa oral breve (10 %) — RA2, RA5 En 3 min explica por qué el DPD tiene dos errores, lo señala en su código y responde una pregunta de reserva cognitiva Explica con apoyo; respuesta parcial Lee el código sin explicarlo No puede explicar su código

Regla de integridad: si el estudiante no puede explicar el código de su repositorio, C2, C3 y C4 se califican como máximo en 3,0.

Parte B — Guía del estudiante

Agenda de las 4 sesiones virtuales

Sesión (2 h) Antes de la sesión (en casa) En la sesión Resultado al terminar
1 Ejercicio 1 (DBCA) a mano Revisión del DBCA y eficiencia relativa; Prompts 7 y 8 Módulo DBCA funcionando
2 Ejercicio 2 (DCL) a mano Revisión del DCL; Prompt 9 Módulo DCL funcionando
3 Ejercicio 3 (DPD) a mano Revisión de los dos errores del DPD; Prompt 10 Módulo DPD funcionando
4 Prompt 11 Prompt 12, verificación con R, bitácora y defensas orales Entrega completa

Los prompts siguen la numeración de la Actividad 1 (que terminó en el 6) para que la bitácora quede continua.

Rutas de trabajo

Se mantienen las mismas rutas de la Actividad 1. Un estudiante puede cambiar de ruta en cualquier prompt, por ejemplo si se le agota la cuota de Copilot.

Mi situación Ruta
Tengo Copilot activo y trabajo en mi portátil o en Codespaces Ruta A — Copilot en modo agente
No tengo Copilot, no pude validar el correo institucional o se agotó la cuota Ruta B — agente externo + pegado manual
Mi internet es lento Ruta A en VS Code instalado, o Ruta B pegando el código en github.dev (tecla . en el repositorio) y ejecutando en el Codespace solo para verificar

Recordatorio: una cuenta de GitHub con correo personal sirve para el repositorio, Codespaces y Copilot Free.

Preparación (5 min, al inicio de la sesión 1)

  1. Abrir el repositorio app-diseno-experimental: en VS Code local con git pull, o reabriendo el Codespace existente desde github.com/codespaces.
  2. Ejecutar streamlit run app.py y comprobar que la portada y el DCA siguen funcionando. Si algo falla, corregirlo antes de seguir.
  3. Crear a mano, con sus valores de k, los tres archivos de su variante en data/:
    • dbca_mi_variante.csv con columnas dia,secador,humedad (16 filas)
    • dcl_mi_variante.csv con columnas dia,bandeja,pretratamiento,humedad (16 filas)
    • dpd_mi_variante.csv con columnas dia,secador,espesor,humedad (18 filas)
  4. Commit: Agrega datos de mi variante para la Actividad 2.

Digitar los datos usted mismo es parte de la verificación: si la app no coincide con su hoja, lo primero que se revisa es el CSV.

Plantilla de la tabla de verificación

Copie una por diseño en BITACORA_IA.md, con una fila por cada fuente de variación de su tabla ANOVA:

### Verificación DBCA / DCL / DPD
| Fuente | SC a mano | SC app | SC R | F a mano | F app | F R | ¿Coincide? |
|---|---|---|---|---|---|---|---|
|  |  |  |  |  |  |  |  |
- DMS de Tukey (a mano / app):
- Conclusión agrícola en 2 líneas:

Ruta A — Copilot en modo agente

Se usa el mismo ciclo de la Actividad 1: modo Agent, pegar el prompt completo una sola vez, leer cada comando antes de aceptarlo, revisar y pulsar Keep, probar con streamlit run app.py, hacer commit y registrar en la bitácora. Son 6 prompts; use Ask para las dudas y así cuida la cuota.

Prompt 7 — Reglas nuevas, comparaciones múltiples y datos de ejemplo

Corrige un error típico de la IA: usar pairwise_tukeyhsd en un DBCA. Esa función ignora los bloques y calcula un CM Error equivocado.

1. Agrega al final de .github/copilot-instructions.md estas reglas:
   - En DBCA, DCL y DPD la prueba de Tukey usa el CM Error y los gl Error DEL MODELO ajustado, nunca pairwise_tukeyhsd (que ignora bloques).
   - En el DPD hay dos errores: Error (a) para la parcela principal y Error (b) para la subparcela y la interacción.
2. Crea utils/comparaciones_utils.py con:
   - tukey_con_cme(medias: pd.Series, cme: float, gl_error: int, r: int, alfa=0.05) -> tuple[pd.DataFrame, float]: compara todos los pares; para cada par calcula la diferencia, q = |diferencia| / sqrt(cme / r) y el p-valor con scipy.stats.studentized_range.sf(q, t, gl_error); devuelve la tabla en español y la DMS = studentized_range.ppf(1 - alfa, t, gl_error) * sqrt(cme / r).
   - letras_tukey(medias: pd.Series, dms: float) -> pd.DataFrame: ordena las medias de mayor a menor y asigna letras de grupo (medias que no difieren comparten letra).
   Type hints, docstrings estilo Google y comentarios con la fórmula en cada paso.
3. Crea tres CSV de ejemplo en data/ (humedad final de yuca, % b.h.):
   - dbca_secadores.csv, columnas dia,secador,humedad. Día 1: A 12.6, B 14.3, C 12.0, D 13.6 | Día 2: A 13.2, B 15.1, C 12.6, D 13.7 | Día 3: A 12.3, B 13.4, C 11.4, D 13.2 | Día 4: A 12.9, B 14.8, C 12.4, D 13.6
   - dcl_pretratamientos.csv, columnas dia,bandeja,pretratamiento,humedad. Fila = día, columna = bandeja 1 a 4:
     Día 1: T2 12.9, T4 13.5, T1 14.3, T3 12.5 | Día 2: T3 13.4, T1 14.1, T4 14.0, T2 12.9 | Día 3: T1 13.6, T3 11.8, T2 12.0, T4 12.7 | Día 4: T4 13.6, T2 11.9, T3 12.7, T1 13.8
   - dpd_secador_espesor.csv, columnas dia,secador,espesor,humedad (secador: a1, a2; espesor: 3mm, 5mm, 7mm):
     Día 1: a1 13.1, 13.8, 15.1 | a2 12.2, 13.1, 13.6 · Día 2: a1 12.6, 13.4, 14.7 | a2 10.7, 11.5, 12.2 · Día 3: a1 12.9, 14.0, 15.0 | a2 11.4, 12.5, 12.9 (valores en orden 3mm, 5mm, 7mm)
4. Prueba tukey_con_cme en la terminal con medias = {A: 10.0, B: 12.0, C: 11.0, D: 10.5}, cme = 0.25, gl_error = 9, r = 4, e imprime la tabla, la DMS y las letras.

Commit: Agrega Tukey con CME del modelo y datos de ejemplo. Con los datos de prueba, la DMS impresa debe ser ≈ 1,10 (4,41 × √(0,25/4)); calcúlela a mano para comprobarlo.

Prompt 8 — Módulo DBCA

Reemplaza pages/02_DBCA.py por el módulo completo del DBCA. Pon las funciones de cálculo en utils/bloques_utils.py y úsalas desde la página; reutiliza cargar_datos de utils/anova_utils.py, tukey_con_cme y letras_tukey de utils/comparaciones_utils.py y las funciones de utils/diagnostico_utils.py.
1. Carga CSV/Excel; si no hay archivo, usa data/dbca_secadores.csv y avísalo con st.caption.
2. Selectores para bloque, tratamiento y respuesta; slider de alfa (0.01 a 0.10).
3. validar_dbca: cada tratamiento aparece exactamente una vez en cada bloque, respuesta numérica y sin faltantes. Mostrar errores con st.error y detener con st.stop().
4. Modelo: ols("Q(resp) ~ C(Q(trat)) + C(Q(bloque))") con anova_lm(typ=2). Tabla en español con filas Tratamientos, Bloques, Error y Total; columnas gl, SC, CM, F, p-valor.
5. eficiencia_relativa(cm_bloques, cm_error, t, b) con ER = ((b-1)*CMB + b*(t-1)*CME) / ((b*t-1)*CME), y su interpretación: cuántas réplicas necesitaría un DCA para igualar la precisión.
6. Pestañas: "Datos" (tabla y tabla de doble entrada tratamiento × bloque), "ANOVA" (tabla, F crítica, CV, ER e interpretación), "Comparaciones" (Tukey con el CME del modelo y letras, solo si p < alfa), "Gráficos" (boxplot por tratamiento y gráfico de perfiles: una línea por bloque a través de los tratamientos), "Supuestos" (residuos vs ajustados, QQ, Shapiro-Wilk y una nota sobre aditividad bloque × tratamiento).
7. Ejecuta la app, prueba las 5 pestañas con el ejemplo y corrige los errores.

Commit: Implementa módulo DBCA. Cargar dbca_mi_variante.csv y comparar con su Ejercicio 1.

Prompt 9 — Módulo DCL

Reemplaza pages/03_DCL.py por el módulo completo del Cuadro Latino. Agrega las funciones de cálculo a utils/bloques_utils.py y reutiliza las de comparaciones y diagnóstico.
1. Carga CSV/Excel; ejemplo por defecto: data/dcl_pretratamientos.csv.
2. Selectores para fila, columna, tratamiento y respuesta.
3. validar_cuadro_latino: mismo número t de niveles en fila, columna y tratamiento; t² observaciones; cada tratamiento exactamente una vez por fila y una vez por columna. Si falla, explica cuál regla se rompe y en qué fila o columna.
4. Croquis: mapa de calor con plotly (filas × columnas) coloreado por la respuesta y con el nombre del tratamiento escrito en cada celda.
5. Modelo: ols("Q(resp) ~ C(Q(fila)) + C(Q(col)) + C(Q(trat))") con anova_lm(typ=2). Tabla en español con Filas, Columnas, Tratamientos, Error y Total. Comprueba que gl Error = (t-1)(t-2).
6. Pestañas: "Croquis y datos", "ANOVA" (con F crítica, CV e interpretación), "Comparaciones" (Tukey con el CME del modelo y letras), "Gráficos" (medias por tratamiento con barras de error, medias por fila y por columna), "Supuestos".
7. Agrega un st.expander "¿Qué controla cada factor?" que explique fila (día), columna (posición de bandeja) y tratamiento con el ejemplo del secador.
8. Ejecuta la app, prueba con el ejemplo y también con un CSV mal construido (un tratamiento repetido en una fila) para ver el mensaje de error.

Commit: Implementa módulo DCL

Prompt 10 — Módulo DPD con dos errores

Reemplaza pages/04_DPD.py por el módulo de Parcelas Divididas en bloques. Crea utils/dpd_utils.py.
1. anova_parcelas_divididas(df, bloque, factor_a, factor_b, resp) -> pd.DataFrame calcula las SC con las fórmulas clásicas usando groupby de pandas (r bloques, a niveles de A, b niveles de B):
   FC = Y..² / (r a b); SC Total; SC Bloques; SC A; SC Parcelas principales = Σ Y(bloque, A)² / b - FC; SC Error(a) = SC PP - SC Bloques - SC A; SC B; SC AB = Σ Y(A, B)² / r - FC - SC A - SC B; SC Error(b) = SC Total - SC PP - SC B - SC AB.
   gl: Bloques r-1; A a-1; Error(a) (r-1)(a-1); B b-1; AB (a-1)(b-1); Error(b) a(r-1)(b-1).
   F de Bloques y de A se calculan con CM Error(a); F de B y de AB con CM Error(b). p-valores con scipy.stats.f.sf.
   Devuelve la tabla en ese orden, con una línea separadora lógica entre parcela principal y subparcela.
2. Comprobación interna: ajusta también ols("Y ~ C(bloque) + C(A) + C(bloque):C(A) + C(B) + C(A):C(B)") con anova_lm(typ=1) y verifica con assert que la SC de C(bloque):C(A) es igual a SC Error(a) y la SC residual es igual a SC Error(b) (tolerancia 1e-6).
3. Valida que el diseño esté completo y balanceado (cada combinación bloque × A × B una vez).
4. Pestañas: "Estructura" (explicación y croquis de un bloque: parcelas grandes con A y subparcelas con B), "ANOVA" (tabla, F críticas, CV(a) y CV(b), interpretación), "Medias e interacción" (medias de A, de B y de A×B; gráfica de interacción con plotly: B en el eje x, una línea por nivel de A), "Supuestos" (residuos del modelo completo).
5. Muestra un st.warning cuando gl Error(a) sea menor que 4: "La parcela principal tiene pocos grados de libertad; la prueba de A tiene poca potencia".
6. Agrega un st.expander "¿Qué pasa si uso un solo error?" que muestre la F de A calculada con el error combinado y explique por qué es incorrecta.
7. Ejecuta la app con data/dpd_secador_espesor.csv y corrige los errores.

Commit: Implementa módulo DPD con dos errores

Prompt 11 — Portada actualizada y prueba rápida contra mi hoja

Antes de enviarlo, tenga a mano sus tres hojas de la Fase 1.

1. En app.py cambia el estado de DBCA, DCL y DPD a "Disponible" y agrega una sección "¿Qué diseño uso?" con una tabla de 3 columnas: situación del experimento, diseño recomendado y ejemplo agrícola (DCA, DBCA, DCL, DPD).
2. Crea verificacion/prueba_rapida.py que:
   - Lea data/dbca_mi_variante.csv, data/dcl_mi_variante.csv y data/dpd_mi_variante.csv.
   - Calcule las tablas ANOVA con las funciones de utils/.
   - Compare cada SC y cada F con un diccionario MIS_VALORES_A_MANO que dejarás VACÍO con las claves necesarias y el comentario "# Copia aquí los valores de tu hoja".
   - Imprima por cada valor: ✔ si la diferencia es menor que 0.01, o ✘ con ambos valores si no.
3. No llenes MIS_VALORES_A_MANO: lo hago yo a mano.

Commit: Actualiza portada y agrega prueba rápida. Luego llenar el diccionario a mano, ejecutar python verificacion/prueba_rapida.py y copiar la salida en la bitácora.

Prompt 12 — Scripts de R y README

1. Crea tres scripts en verificacion/, comentados línea por línea en español para estudiantes:
   - verificacion_dbca.R: lee ../data/dbca_mi_variante.csv; aov(humedad ~ factor(secador) + factor(dia)); summary(); medias; CV; TukeyHSD(modelo, "factor(secador)"); eficiencia relativa calculada desde la tabla.
   - verificacion_dcl.R: lee ../data/dcl_mi_variante.csv; aov(humedad ~ factor(dia) + factor(bandeja) + factor(pretratamiento)); summary(); TukeyHSD para pretratamiento.
   - verificacion_dpd.R: lee ../data/dpd_mi_variante.csv; modelo correcto aov(humedad ~ secador * espesor + Error(factor(dia)/secador)); summary(); medias de la interacción; interaction.plot(). Luego, como comparación, el modelo INCORRECTO con un solo error aov(humedad ~ factor(dia) + secador * espesor) y un comentario que explique la diferencia en la F de secador.
2. Actualiza README.md: módulos disponibles (DCA, DBCA, DCL, DPD), formato de los CSV que acepta cada módulo y cómo ejecutar la verificación.
No modifiques el código de la app.

Commit: Agrega verificación en R de los diseños con bloques

Ruta B — Agente de IA externo + pegado manual

Un chat web gratuito (Claude, ChatGPT, Gemini o Copilot web) genera el código y el estudiante lo pega en el Codespace (o en github.dev). Se usan los mismos Prompts 7 a 12 de la Ruta A con un bloque al final. La diferencia con la Actividad 1: el chat externo no conoce su repositorio, así que hay que pegarle primero los archivos de los que depende el código nuevo.

Paso B7.0 — Abrir un chat nuevo y darle el contexto

Use un chat nuevo para esta actividad y trabaje todos los prompts en él. Pegue primero el bloque de contexto de la Actividad 1 (Paso B0) y, en un segundo mensaje, esto:

Continúo el proyecto. Ya tengo funcionando la portada y el módulo DCA.
Esta es la estructura actual de mi repositorio:
[pegar aquí la salida del comando: find . -name "*.py" -not -path "./.venv/*"]
Este es mi archivo utils/anova_utils.py:
[pegar el contenido completo]
Este es mi archivo utils/diagnostico_utils.py:
[pegar el contenido completo]
Reglas nuevas para esta actividad:
- En DBCA, DCL y DPD la prueba de Tukey usa el CM Error y los gl Error del modelo ajustado, nunca pairwise_tukeyhsd.
- En el DPD hay dos errores: Error (a) para la parcela principal y Error (b) para la subparcela y la interacción.
Responde solo "Listo" y espera la primera tarea.

Para obtener la estructura, ejecute en la terminal del Codespace: find . -name "*.py" -not -path "./.venv/*".

Pasos B7 a B12 — Los prompts de la Ruta A con un bloque final

Copie el Prompt N de la Ruta A (de 7 a 12), péguelo en el chat y agréguele al final:

IMPORTANTE: tú no puedes ejecutar nada. Donde la tarea dice "ejecuta", "prueba" o "verifica", dame los comandos para la terminal de Codespaces y la salida que debo esperar. Entrega cada archivo nuevo o modificado COMPLETO, con su ruta exacta antes del bloque de código. Al final, lista los archivos que debo crear o reemplazar.

Ajustes puntuales:

  • B7: el punto 1 del prompt (editar .github/copilot-instructions.md) no aplica en la Ruta B; bórrelo antes de enviarlo. Las reglas ya las tiene el chat.
  • B8, B9 y B10: si el chat responde con un archivo incompleto o con «…resto igual…», pídale: «Entrégame el archivo \[ruta\] completo, sin omitir nada».
  • B10 (DPD): es el archivo más largo. Si el chat se corta, pídale primero utils/dpd_utils.py y después, en otro mensaje, pages/04_DPD.py.
  • B11: el diccionario MIS_VALORES_A_MANO lo llena usted, nunca la IA.

Cómo llevar el código y actualizar GitHub

El procedimiento es el de la Actividad 1:

  1. Crear o reemplazar el archivo: en el Explorador, clic derecho → New File con la ruta completa (por ejemplo utils/bloques_utils.py); o, si ya existe, abrirlo, Ctrl+A, pegar y Ctrl+S.
  2. Probar: streamlit run app.py, abrir el puerto 8501 y revisar la página nueva con el ejemplo y con su variante.
  3. Subir a GitHub por terminal o por el panel Control de código fuente (Ctrl+Shift+G: +, mensaje, Commit, Sync Changes):
# Ver qué cambió, preparar, guardar la versión y subirla
git status
git add .
git commit -m "Implementa módulo DBCA"
git push

Plan liviano con github.dev: se pueden pegar los archivos y hacer Commit & Push sin crear la máquina. La app solo se ejecuta en el Codespace, así que conviene agrupar las pruebas: pegar los archivos de un prompt en github.dev y abrir el Codespace una sola vez para probarlos. Antes de probar, hacer git pull en el Codespace para traer los cambios hechos en github.dev.

Cuando aparece un error

En el mismo chat:

Al ejecutar [comando] obtuve este error:
[pegar el error completo]
Archivo donde ocurre: [ruta]
[pegar el contenido completo del archivo]
Explica en 3 líneas la causa (Python y, si aplica, estadística) y entrégame el archivo corregido completo.

Si la app corre pero los números no coinciden con su hoja, no le pida a la IA que «arregle los números». Péguele su tabla a mano, la tabla de la app y el CSV, y pregúntele: «¿Cuál de los dos cálculos está mal y en qué paso?». Puede estar equivocada su hoja.

Verificación final (ambas rutas)

Los tres diseños deben coincidir en las tres fuentes: a mano, app y R. Diferencias en el tercer decimal son de redondeo.

  1. Cargar cada *_mi_variante.csv en su módulo y tomar las capturas de la tabla ANOVA.
  2. Ejecutar python verificacion/prueba_rapida.py con su diccionario lleno y revisar que todo salga con ✔.
  3. Ejecutar los tres scripts de R en Google Colab con entorno R (Entorno de ejecución → Cambiar tipo → R; subir los CSV y quitar ../data/ de la ruta) o en RStudio. Pegar cada salida como comentario al final de su script.
  4. En el DPD, anotar en la bitácora la F del secador con el modelo correcto y con el de un solo error, y explicar en 3 líneas cuál es válida y por qué.
  5. Llenar las tres tablas de verificación de la bitácora.
  6. Commit final: Agrega verificación completa de la Actividad 2.

Lista de verificación de la entrega

Solución de problemas frecuentes

Síntoma Causa probable Solución
La DMS del DBCA no coincide con la hoja La IA usó pairwise_tukeyhsd, que ignora los bloques Usar tukey_con_cme con el CME y los gl del modelo
En el DCL sale gl Error = 12 en vez de 6 El modelo no incluyó filas o columnas Revisar la fórmula: fila + columna + tratamiento
El DCL dice que no es cuadro latino Un nombre mal escrito en el CSV (por ejemplo t4 y T4) Revisar mayúsculas y espacios en el CSV
La F del secador en el DPD sale muy grande (≈ 100 o más) Se usó un solo error La F de A va contra CM Error (a)
AssertionError en dpd_utils.py Las fórmulas y statsmodels no coinciden: hay un error en una SC Pegar el error y el archivo en el chat; comparar paso a paso con la hoja
KeyError al cargar el CSV Nombres de columnas distintos a los esperados Usar exactamente los nombres de la Preparación, sin tildes ni espacios
El chat externo entrega código que importa funciones inexistentes No conocía sus archivos de utils/ Repetir el Paso B7.0 pegando esos archivos

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

En los tres diseños, sumar k a un tratamiento solo cambia el Y.., la SC Total y la SC de ese factor. Bloques, errores e interacción son iguales para todas las variantes, y esa es la respuesta a la segunda pregunta de reserva cognitiva.

Clave DBCA

Fijos: SC Días = 2,5969; SC Error = 0,5006 (gl 9); CM Error = 0,0556; F Días = 15,56; DMS = 0,521; ER = 3,91 (un DCA necesitaría unas 16 réplicas por secador en vez de 4); CV ≈ 1,8 %. Medias A = 12,75; B = 14,40; C = 12,10. Recomendación: secador C.

Dígito Y.. SC Total SC Secadores F Secadores Media D Grupos de Tukey
0 211,1 14,9294 11,8319 70,90 13,525 B a · D b · A c · C d
1 211,5 15,2244 12,1269 72,67 13,625 B a · D b · A c · C d
2 211,9 15,5794 12,4819 74,80 13,725 B a · D b · A c · C d
3 212,3 15,9944 12,8969 77,28 13,825 B a · D b · A c · C d
4 212,7 16,4694 13,3719 80,13 13,925 B a · D a · A b · C c
5 213,1 17,0044 13,9069 83,34 14,025 B a · D a · A b · C c
6 213,5 17,5994 14,5019 86,90 14,125 B a · D a · A b · C c
7 213,9 18,2544 15,1569 90,83 14,225 B a · D a · A b · C c
8 214,3 18,9694 15,8719 95,11 14,325 B a · D a · A b · C c
9 214,7 19,7444 16,6469 99,76 14,425 D a · B a · A b · C c

Clave DCL

Fijos: SC Días = 2,5219; SC Bandejas = 0,7569; SC Error = 0,1088 (gl 6); CM Error = 0,0181; F Días = 46,38; F Bandejas = 13,92 (ambas > 4,76: los dos controles fueron útiles); DMS = 0,330; CV ≈ 1,0 %. Medias T1 = 13,95; T2 = 12,425; T3 = 12,60. Recomendación: T2 (escaldado) o T3 (ácido cítrico), que no difieren entre sí.

Dígito Y.. SC Total SC Pretrat. F Pretrat. Media T4 Grupos de Tukey
0 209,7 9,5894 6,2019 114,06 13,45 T1 a · T4 b · T3 c · T2 c
1 210,1 9,8944 6,5069 119,67 13,55 T1 a · T4 b · T3 c · T2 c
2 210,5 10,2594 6,8719 126,38 13,65 T1 a · T4 a · T3 b · T2 b
3 210,9 10,6844 7,2969 134,20 13,75 T1 a · T4 a · T3 b · T2 b
4 211,3 11,1694 7,7819 143,11 13,85 T1 a · T4 a · T3 b · T2 b
5 211,7 11,7144 8,3269 153,14 13,95 T1 a · T4 a · T3 b · T2 b
6 212,1 12,3194 8,9319 164,26 14,05 T4 a · T1 a · T3 b · T2 b
7 212,5 12,9844 9,5969 176,49 14,15 T4 a · T1 a · T3 b · T2 b
8 212,9 13,7094 10,3219 189,83 14,25 T4 a · T1 a · T3 b · T2 b
9 213,3 14,4944 11,1069 204,26 14,35 T4 a · T1 b · T3 c · T2 c

En las variantes 2 y 8, la diferencia T1–T4 (0,30) queda cerca de la DMS (0,33): acepte la agrupación si el procedimiento es correcto.

Clave DPD

Fijos: SC Bloques = 2,8578; SC Secador (A) = 11,6806; SC Error (a) = 0,8711 (gl 2); CM Error (a) = 0,4356; SC A×B = 0,4044; SC Error (b) = 0,0844 (gl 8); CM Error (b) = 0,0106; F Bloques = 3,28; F A = 26,82 (> 18,51; p ≈ 0,035); F A×B = 19,16 (> 4,46; p ≈ 0,0009); CV(a) ≈ 5,0 %; CV(b) ≈ 0,8 %. Medias 3 mm = 12,15 y 5 mm = 13,05.

Con un solo error (modelo incorrecto), CM Error = 0,0956 con 10 gl y la F del secador sube a ≈ 122: el efecto del secador se exagera, porque se compara con la variación entre bandejas y no con la variación entre parcelas grandes.

Dígito Y.. SC Total SC Espesor (B) F Espesor Media 7 mm Media a1 Media a2
0 234,7 25,2628 9,3644 443,58 13,917 13,844 12,233
1 235,3 26,3561 10,4578 495,37 14,017 13,878 12,267
2 235,9 27,5294 11,6311 550,95 14,117 13,911 12,300
3 236,5 28,7828 12,8844 610,32 14,217 13,944 12,333
4 237,1 30,1161 14,2178 673,47 14,317 13,978 12,367
5 237,7 31,5294 15,6311 740,42 14,417 14,011 12,400
6 238,3 33,0228 17,1244 811,16 14,517 14,044 12,433
7 238,9 34,5961 18,6978 885,68 14,617 14,078 12,467
8 239,5 36,2494 20,3511 964,00 14,717 14,111 12,500
9 240,1 37,9828 22,0844 1046,11 14,817 14,144 12,533

Interpretación esperada: el secador con chimenea (a2) siempre seca más, y el aumento de humedad con el espesor es mayor sin chimenea (de 12,87 a 14,93 + k) que con chimenea (de 11,43 a 12,90 + k). Mejor combinación: a2 con chimenea y 3 mm (11,43 %). Advertencia didáctica: el Error (a) tiene solo 2 gl, así que la prueba del secador tiene poca potencia aunque la diferencia de medias sea grande.

Defensas orales (C7). Pregunta sugerida: «muéstrame en dpd_utils.py dónde se calcula el Error (a) y explícame por qué la F del secador no usa el Error (b)».