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.
| 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):
app-diseno-experimental,
ahora con las páginas DBCA, DCL y DPD funcionando.verificacion/
(verificacion_dbca.R, verificacion_dcl.R,
verificacion_dpd.R), con su salida pegada como
comentario.BITACORA_IA.md actualizada con los prompts 7 a 12 y las
tres tablas de verificació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:
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:
utils/.| 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 |
| 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 |
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.
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 |
\[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}}\]
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 |
\[SC_{Error} = SC_{Total} - SC_{Filas} - SC_{Columnas} - SC_{Trat} \qquad gl_{E} = (t-1)(t-2)\]
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 |
\[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:
Cada hoja se escanea y se sube antes de la sesión en que se construye su módulo.
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.
| 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.
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.
app-diseno-experimental: en VS
Code local con git pull, o reabriendo el Codespace
existente desde github.com/codespaces.streamlit run app.py y comprobar que la
portada y el DCA siguen funcionando. Si algo falla, corregirlo antes de
seguir.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)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.
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:
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.
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.
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.
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
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
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.
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
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.
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/*".
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:
.github/copilot-instructions.md) no aplica en la Ruta B;
bórrelo antes de enviarlo. Las reglas ya las tiene el chat.utils/dpd_utils.py y después, en otro
mensaje, pages/04_DPD.py.MIS_VALORES_A_MANO
lo llena usted, nunca la IA.El procedimiento es el de la Actividad 1:
utils/bloques_utils.py); o, si ya existe, abrirlo,
Ctrl+A, pegar y Ctrl+S.streamlit run app.py, abrir el
puerto 8501 y revisar la página nueva con el ejemplo y con su
variante.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.
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.
Los tres diseños deben coincidir en las tres fuentes: a mano, app y R. Diferencias en el tercer decimal son de redondeo.
*_mi_variante.csv en su módulo y tomar las
capturas de la tabla ANOVA.python verificacion/prueba_rapida.py con su
diccionario lleno y revisar que todo salga con ✔.../data/ de la ruta) o en RStudio.
Pegar cada salida como comentario al final de su script.Agrega verificación completa de la Actividad 2.| 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 |
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.
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 |
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.
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)».