Actividad 3 (2do 50%) — Factoriales y Superficie de Respuesta

Oct 19, 2026 · @Justo

Cada estudiante completa su App de Diseño Experimental con el módulo de diseños factoriales y el módulo de Metodología de Superficie de Respuesta (RSM) con sus siete secciones, después de resolver a mano un experimento factorial, un modelo de primer orden con su trayectoria de máximo ascenso y el punto estacionario de un modelo de segundo orden. Es la 3.ª y última nota del 2.º 50 %, continúa el mismo repositorio y conserva las dos rutas de trabajo 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 3 de 3 del 2.º 50 %: Factoriales y RSM. Cierra la app que se sustenta en S16
Requisito Actividades 1 y 2 entregadas: portada, DCA, DBCA, DCL y DPD funcionando en app-diseno-experimental
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 ejercicio 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 (factorial, RSM de primer orden y punto estacionario), con nombre y código en cada hoja.
  2. Enlace al repositorio app-diseno-experimental con las páginas Factoriales y RSM funcionando.
  3. Cuatro capturas: ANOVA factorial, trayectoria de máximo ascenso, punto estacionario y superficie 3D, todas con su variante.
  4. Dos figuras exportadas desde la app (superficie y curvas de nivel) en PNG y PDF, guardadas en figuras/.
  5. Scripts verificacion/verificacion_factorial.R y verificacion/verificacion_rsm.R con su salida como comentario.
  6. BITACORA_IA.md actualizada con los Prompts 13 a 18 y las tablas de verificación.
  7. Ruta usada (A o B). La ruta no cambia la nota.

Parte A — Actividad evaluativa

Descripción

Hasta ahora se comparó un factor a la vez. En el secador real las decisiones se combinan, y la mejor respuesta suele estar en un punto que nadie probó. Esta actividad cierra el proyecto con dos herramientas:

Herramienta Pregunta del experimento Idea clave
Diseño factorial ¿Cómo influyen juntas la carga de la bandeja (2, 4, 6 kg/m²) y el pretratamiento (sin, escaldado) en la humedad final? La interacción: el efecto de un factor depende del nivel del otro
RSM de primer orden ¿Hacia dónde mover la inclinación del colector y la apertura de ventilación para aumentar la eficiencia del secador? La trayectoria de máximo ascenso: subir por la pendiente más empinada
RSM de segundo orden ¿Cuál es la combinación óptima cerca de la cima? El punto estacionario: dónde la superficie es plana y si es máximo, mínimo o silla

Analogía para el estudiante: la RSM es como buscar la cima de una loma en la neblina. Primero se mide la pendiente donde uno está (modelo de primer orden) y se camina cuesta arriba (trayectoria). Cuando el terreno se aplana se mira la forma de la cima (modelo de segundo orden) para pararse en el punto más alto (punto estacionario). Las curvas de nivel de la app son el mapa topográfico de esa loma.

Se mantiene la metodología de reserva cognitiva:

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

Objetivos

General. Completar la App de Diseño Experimental con los módulos de diseños factoriales y de superficie de respuesta, verificando cada análisis con el cálculo manual y con R.

Específicos. El estudiante será capaz de:

  1. Calcular a mano el ANOVA de un factorial a × b con réplicas e interpretar la interacción con efectos simples.
  2. Ajustar a mano un modelo de primer orden en un 2² con puntos centrales, probar la curvatura y construir la trayectoria de máximo ascenso en unidades codificadas y naturales.
  3. Calcular el punto estacionario de un modelo de segundo orden y clasificarlo con los valores propios de la matriz B.
  4. Implementar los módulos Factoriales y RSM en Streamlit con funciones separadas en utils/.
  5. Generar e interpretar la superficie 3D y las curvas de nivel, y exportarlas en PNG y PDF.
  6. Verificar los resultados de la app con el cálculo manual y con R, y traducirlos en recomendaciones de diseño del secador.

Competencias

Tipo Competencia
Específica Planea y analiza experimentos factoriales para estudiar efectos combinados en procesos agrícolas y agroindustriales
Específica Aplica la metodología de superficie de respuesta para optimizar variables de operación de equipos agrícolas
Específica Desarrolla software modular en Python que automatiza el análisis, la visualización y la exportación de resultados
Genérica Usa de forma crítica y ética la inteligencia artificial, verificando y documentando sus resultados

Resultados de aprendizaje

RA Resultado de aprendizaje Evidencia
RA1 Calcula a mano el ANOVA factorial e interpreta la interacción con una gráfica y efectos simples Hoja 1 de la Fase 1
RA2 Ajusta a mano el modelo de primer orden, prueba la curvatura y construye la trayectoria de máximo ascenso Hoja 2 de la Fase 1
RA3 Calcula y clasifica el punto estacionario y lo expresa en unidades naturales Hoja 3 de la Fase 1
RA4 Implementa los módulos Factoriales y RSM con sus siete secciones y exportación de figuras App, código y carpeta figuras/
RA5 Verifica la concordancia entre cálculo manual, app y R, y documenta el uso de IA Tablas de verificación, scripts R y BITACORA_IA.md

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

La variante personal sigue siendo k = (último dígito del código estudiantil) ÷ 10. En cada ejercicio se indica dónde se suma.

Ejercicio 1 — Factorial 3 × 2: carga de bandeja × pretratamiento

Respuesta: humedad final de la yuca (% b.h.); menor es mejor. Factor A: carga (2, 4 y 6 kg/m²). Factor B: pretratamiento (P0 sin, P1 escaldado). Tres réplicas por combinación, en orden aleatorio. Sume k a las tres réplicas de 6 kg/m² con P0.

Carga (kg/m²) P0 r1 P0 r2 P0 r3 P1 r1 P1 r2 P1 r3
2 12,2 12,1 12,3 12,0 11,7 11,3
4 13,7 13,9 13,6 12,1 12,7 12,4
6 (+ k en P0) 15,3 15,2 15,6 12,8 13,2 12,9
  1. Plantear el modelo Yᵢⱼₖ = μ + αᵢ + βⱼ + (αβ)ᵢⱼ + εᵢⱼₖ y las tres hipótesis.
  2. Construir la tabla de totales por celda (Yᵢⱼ.) y los totales marginales.
  3. Calcular FC, SC Total, SC A, SC B, SC Subtotales, SC A×B y SC Error.
  4. Tabla ANOVA: A y A×B contra F(0,05; 2; 12) = 3,89; B contra F(0,05; 1; 12) = 4,75.
  5. Dibujar la gráfica de interacción (carga en el eje x, una línea por pretratamiento).
  6. Si A×B es significativa, comparar las 6 medias de celda con Tukey: q(0,05; 6; 12) = 4,75. Responder: ¿a partir de qué carga vale la pena escaldar?

\[SC_{A} = \frac{\sum_{i} Y_{i..}^{2}}{b\,r} - FC \qquad SC_{B} = \frac{\sum_{j} Y_{.j.}^{2}}{a\,r} - FC \qquad SC_{Sub} = \frac{\sum_{i}\sum_{j} Y_{ij.}^{2}}{r} - FC\]

\[SC_{AB} = SC_{Sub} - SC_{A} - SC_{B} \qquad SC_{Error} = SC_{Total} - SC_{Sub} \qquad gl_{E} = a\,b\,(r-1)\]

Ejercicio 2 — RSM de primer orden y trayectoria de máximo ascenso

Respuesta: eficiencia del secador (%); mayor es mejor. Variables: ξ₁ = inclinación del colector (°), ξ₂ = apertura de ventilación (cm). Codificación: x₁ = (ξ₁ − 15) / 5 y x₂ = (ξ₂ − 10) / 4. Diseño 2² con 4 puntos centrales. Sume k a la corrida 4.

Corrida x₁ x₂ Inclinación (°) Ventilación (cm) Eficiencia (%)
1 −1 −1 10 6 38,2
2 +1 −1 20 6 42,6
3 −1 +1 10 14 40,9
4 +1 +1 20 14 45,3 (+ k)
5 0 0 15 10 41,6
6 0 0 15 10 41,9
7 0 0 15 10 41,4
8 0 0 15 10 41,8
  1. Ajustar ŷ = b₀ + b₁x₁ + b₂x₂ (y calcular b₁₂ para revisar la interacción). Por la ortogonalidad del diseño, cada coeficiente se calcula como en la fórmula de abajo.
  2. Probar la curvatura con los puntos centrales: F = SC Curvatura / s² de los centros, contra F(0,05; 1; 3) = 10,13. ¿Es adecuado el modelo de primer orden?
  3. Construir la trayectoria: Δx₁ = 1 y Δx₂ = b₂ / b₁. Tabla con los pasos 0 a 4 en unidades codificadas y naturales.
  4. Se corrieron experimentos a lo largo de la trayectoria y se obtuvo esta eficiencia por paso: 0: 41,7 · 1: 45,1 · 2: 47,8 · 3: 46,2 · 4: 42,5. ¿Dónde se ubica el nuevo centro para el modelo de segundo orden? Redondear a valores prácticos.

\[b_{0} = \bar{y} \qquad b_{j} = \frac{\sum x_{j}\,y}{n_{F}} \qquad SC_{Curv} = \frac{n_{F}\,n_{C}\,(\bar{y}_{F} - \bar{y}_{C})^{2}}{n_{F} + n_{C}} \qquad \xi_{1} = 15 + 5\,x_{1} \qquad \xi_{2} = 10 + 4\,x_{2}\]

Ejercicio 3 — Punto estacionario del modelo de segundo orden

Alrededor del nuevo centro (25°, 15 cm) se corrió un diseño central compuesto con α = 1,414 y 5 puntos centrales, con la codificación x₁ = (ξ₁ − 25) / 3 y x₂ = (ξ₂ − 15) / 2. Sus 13 corridas están en la Preparación de la Parte B. El modelo ajustado fue:

Coeficiente b₀ b₁ b₂ b₁₁ b₂₂ b₁₂
Valor 48,120 0,406 0,513 + k −1,273 −1,098 −0,225
  1. Escribir la matriz B y el vector b.
  2. Calcular a mano B⁻¹ (matriz 2 × 2) y el punto estacionario xₛ = −½ B⁻¹ b.
  3. Calcular la respuesta estimada en el punto estacionario: ŷₛ = b₀ + ½ xₛᵀ b.
  4. Calcular los valores propios de B resolviendo det(B − λI) = 0 y clasificar el punto (máximo, mínimo o silla).
  5. Convertir xₛ a unidades naturales y escribir la recomendación de inclinación y ventilación para el secador.

\[B = \begin{pmatrix} b_{11} & b_{12}/2 \\ b_{12}/2 & b_{22} \end{pmatrix} \qquad \mathbf{b} = \begin{pmatrix} b_{1} \\ b_{2} \end{pmatrix} \qquad \mathbf{x}_{s} = -\tfrac{1}{2}\,B^{-1}\mathbf{b} \qquad \hat{y}_{s} = b_{0} + \tfrac{1}{2}\,\mathbf{x}_{s}^{T}\mathbf{b}\]

Preguntas de reserva cognitiva:

  • En el Ejercicio 1, ¿por qué no tiene sentido hablar del «mejor pretratamiento» sin decir la carga?
  • En el Ejercicio 3, ¿cambian los valores propios con su k? ¿Qué parte del modelo determina la forma de la loma y cuál su ubicación?

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 ejercicios a mano (25 %) — RA1, RA2, RA3 ANOVA factorial, gráfica de interacción y Tukey correctos; coeficientes, curvatura y trayectoria en ambas unidades; B⁻¹, punto estacionario, valores propios y recomendación correctos para su variante Los tres completos con 1–3 errores aritméticos que no cambian las conclusiones Dos ejercicios correctos o falta la interpretación Un solo ejercicio, no corresponde a su variante o se entregó después de usar la IA
C2. Módulo Factoriales (15 %) — RA4 Dos o más factores con fórmula construida automáticamente; validación de balance; ANOVA; gráficas de efectos principales e interacción; Tukey de celdas con el CME del modelo cuando hay interacción; supuestos Funciona con 2 factores; falta Tukey de celdas o supuestos ANOVA correcto sin gráficas de interacción Falla o el ANOVA es incorrecto
C3. RSM: primer orden y trayectoria (15 %) — RA4 Codificación y decodificación; modelo con coeficientes, R² y p-valores; prueba de curvatura; trayectoria en tabla (unidades codificadas y naturales) y en gráfica sobre el plano Funciona; falta la prueba de curvatura o las unidades naturales Modelo correcto, trayectoria incompleta Falla o la dirección de la trayectoria es incorrecta
C4. RSM: segundo orden, punto estacionario y superficies (15 %) — RA4 Modelo cuadrático; punto estacionario en ambas unidades y clasificado con valores propios; superficie 3D y curvas de nivel con el punto marcado Todo funciona; falta marcar el punto o la clasificación Modelo y punto correctos sin superficies Falla o el punto estacionario es incorrecto
C5. Verificación mano ↔︎ Python ↔︎ R (10 %) — RA5 Tablas de verificación de los tres ejercicios; scripts R ejecutados (incluido rsm::rsm) con su salida Falta una comparación o una salida Verifica solo un ejercicio No hay verificación o es copiada
C6. Exportación de figuras (5 %) — RA4 Botones de descarga en PNG y PDF de la superficie y las curvas de nivel; archivos en figuras/ Exporta solo un formato Exporta solo una figura No exporta
C7. GitHub y bitácora de IA (5 %) — RA5 ≥ 6 commits nuevos con mensajes descriptivos en distintos días; bitácora reflexiva; README final completo 4–5 commits; bitácora poco reflexiva 1–3 commits o bitácora incompleta Un solo commit o sin bitácora
C8. Defensa oral breve (10 %) — RA3, RA5 En 3 min muestra dónde se calcula el punto estacionario en utils/, lo relaciona con su hoja 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.

Reto opcional (+0,3 sobre la nota final, sin superar 5,0): desplegar la app completa en Streamlit Community Cloud y entregar el enlace público.

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 (factorial) a mano Revisión de la interacción; Prompt 13 Módulo Factoriales funcionando
2 Ejercicio 2 (primer orden) a mano Revisión de la trayectoria; Prompt 14 Secciones 1 y 2 de la RSM
3 Ejercicio 3 (punto estacionario) a mano Revisión de valores propios; Prompts 15 y 16 Secciones 3 a 6 de la RSM
4 Prompt 17 Prompt 18, verificación con R, bitácora y defensas orales App completa y entrega

Los prompts continúan la numeración de las actividades anteriores (la Actividad 2 terminó en el 12).

Rutas de trabajo

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 en github.dev y ejecutando en el Codespace solo para probar

Se puede cambiar de ruta en cualquier prompt. Recordatorio: una cuenta de GitHub con correo personal sirve para el repositorio, Codespaces y Copilot Free.

Nota técnica sobre la exportación: el plan original usaba Kaleido para exportar figuras de Plotly. Sus versiones recientes necesitan Google Chrome instalado, lo que falla en Codespaces y en Streamlit Cloud con internet lento. Por eso esta guía usa Plotly para ver las figuras en la app y Matplotlib para exportarlas en PNG y PDF, sin dependencias adicionales.

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

  1. Abrir el repositorio: git pull en VS Code local, o reabrir el Codespace existente desde github.com/codespaces.
  2. Comprobar que la app abre y que los módulos de las actividades anteriores funcionan.
  3. Crear a mano los tres CSV de su variante en data/:
    • factorial_mi_variante.csv con columnas carga,pretratamiento,replica,humedad (18 filas). Sume k a las tres filas de carga 6 con P0.
    • rsm1_mi_variante.csv con columnas x1,x2,eficiencia (8 filas). Sume k a la corrida (+1, +1).
    • ccd_mi_variante.csv con columnas x1,x2,eficiencia (13 filas). A cada eficiencia súmele k × x₂ (ver tabla).
  4. Commit: Agrega datos de mi variante para la Actividad 3.

Datos del diseño central compuesto (base, sin k). Columna «Sume»: lo que debe agregar a cada eficiencia en su variante.

Corrida x₁ x₂ Inclinación (°) Ventilación (cm) Eficiencia (%) Sume
1 −1 −1 22 13 45,0 −k
2 +1 −1 28 13 45,8 −k
3 −1 +1 22 17 46,3 +k
4 +1 +1 28 17 46,2 +k
5 −1,414 0 20,8 15 44,6 0
6 +1,414 0 29,2 15 46,4 0
7 0 −1,414 25 12,2 45,0 −1,414k
8 0 +1,414 25 17,8 46,7 +1,414k
9–13 0 0 25 15 47,7 · 49,0 · 48,1 · 47,9 · 47,9 0

Al sumar k × x₂, el modelo ajustado cambia solo en b₂, que pasa a ser 0,513 + k. Por eso la app debe reproducir los coeficientes del Ejercicio 3.

Plantilla de la tabla de verificación

Copie esta tabla en BITACORA_IA.md, una por ejercicio, con una fila por cada valor calculado (SC y F del factorial; b₀, b₁, b₂ y F de curvatura; xₛ, ŷₛ, λ₁ y λ₂):

### Verificación Ejercicio N
| Valor | A mano | App (Python) | R | ¿Coincide? |
|---|---|---|---|---|
|  |  |  |  |  |
- Conclusión para el secador en 2 líneas:

Ruta A — Copilot en modo agente

Se usa el mismo ciclo de siempre: 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.

Prompt 13 — Datos de ejemplo y módulo de Factoriales

1. Agrega a .github/copilot-instructions.md:
   - Librería adicional permitida: matplotlib (solo para exportar figuras a PNG y PDF). No uses kaleido.
   - En RSM las variables se trabajan codificadas (x1, x2) y siempre se muestran también en unidades naturales.
   Agrega matplotlib a requirements.txt e instálalo.
2. Crea en data/ tres CSV de ejemplo:
   - factorial_carga_pretrat.csv, columnas carga,pretratamiento,replica,humedad. Carga 2: P0 12.2, 12.1, 12.3 | P1 12.0, 11.7, 11.3. Carga 4: P0 13.7, 13.9, 13.6 | P1 12.1, 12.7, 12.4. Carga 6: P0 15.3, 15.2, 15.6 | P1 12.8, 13.2, 12.9.
   - rsm_primer_orden.csv, columnas x1,x2,eficiencia: (-1,-1) 38.2; (1,-1) 42.6; (-1,1) 40.9; (1,1) 45.3; (0,0) 41.6; (0,0) 41.9; (0,0) 41.4; (0,0) 41.8.
   - rsm_ccd.csv, columnas x1,x2,eficiencia: (-1,-1) 45.0; (1,-1) 45.8; (-1,1) 46.3; (1,1) 46.2; (-1.414,0) 44.6; (1.414,0) 46.4; (0,-1.414) 45.0; (0,1.414) 46.7; (0,0) 47.7; (0,0) 49.0; (0,0) 48.1; (0,0) 47.9; (0,0) 47.9.
3. Crea utils/factorial_utils.py con:
   - construir_formula(resp, factores) -> str: arma "Q('resp') ~ C(Q('A')) * C(Q('B')) * ..." para 2 o más factores.
   - validar_factorial(df, factores, resp) -> list[str]: todas las combinaciones presentes, mismo número de réplicas en cada una, respuesta numérica, sin faltantes.
   - anova_factorial(df, factores, resp) -> pd.DataFrame con anova_lm(typ=2), filas en español (A, B, A × B, Error, Total) y columnas gl, SC, CM, F, p-valor.
   - medias_celdas(df, factores, resp) -> pd.DataFrame.
4. Reemplaza pages/05_Factoriales.py por el módulo completo. Ejemplo por defecto: data/factorial_carga_pretrat.csv. Selector múltiple de factores (2 o más) y selector de respuesta. Pestañas:
   - "Datos": tabla y tabla de medias de celda.
   - "ANOVA": tabla, F críticas, CV e interpretación que empiece por la interacción (si es significativa, advertir que los efectos principales no se interpretan solos).
   - "Gráficos": efectos principales (medias por nivel de cada factor) y gráfica de interacción con plotly (primer factor en el eje x, una línea por nivel del segundo).
   - "Comparaciones": si la interacción es significativa, Tukey entre medias de celda con tukey_con_cme de utils/comparaciones_utils.py (CME y gl del modelo); si no, Tukey para cada efecto principal significativo.
   - "Supuestos": reutiliza utils/diagnostico_utils.py.
5. Ejecuta la app, prueba con el ejemplo y corrige los errores.

Commit: Implementa módulo de diseños factoriales. Cargar factorial_mi_variante.csv y comparar con su Ejercicio 1.

Prompt 14 — RSM: codificación, primer orden y trayectoria

Crea el módulo de RSM por partes.
1. utils/rsm_coding.py: codificar(valor, centro, semirango) y decodificar(x, centro, semirango), con la fórmula x = (ξ - centro) / semirango en el comentario.
2. utils/rsm_models.py:
   - ajustar_primer_orden(df, y, x1, x2): ols("y ~ x1 + x2") y devuelve el modelo, la tabla de coeficientes en español (coeficiente, error estándar, t, p-valor) y R².
   - prueba_curvatura(df, y, x1, x2) -> dict: separa puntos factoriales y centrales (x1 = x2 = 0); calcula yF, yC, SC curvatura = nF*nC*(yF - yC)^2 / (nF + nC), s² de los centros, F y p-valor con gl (1, nC - 1), y una conclusión.
   - trayectoria_ascenso(b1, b2, pasos=5, paso_x1=1.0) -> pd.DataFrame: Δx1 = paso_x1 y Δx2 = (b2 / b1) * paso_x1 (si |b2| > |b1|, toma x2 como variable base); columnas paso, x1, x2.
3. Reemplaza pages/06_RSM.py: entradas en la barra lateral para el centro y el semirango de cada variable natural (valores por defecto: inclinación 15 y 5; ventilación 10 y 4) y sus nombres y unidades. Crea st.tabs con 7 pestañas: "1. Primer orden", "2. Trayectoria", "3. Segundo orden", "4. Punto estacionario", "5. Superficie 3D", "6. Curvas de nivel", "7. Exportar". Implementa solo las dos primeras; en las demás, st.info("En construcción").
   - Pestaña 1: carga CSV (por defecto data/rsm_primer_orden.csv), tabla de datos con columnas naturales calculadas, coeficientes, R², prueba de curvatura e interpretación (¿sirve el modelo de primer orden?).
   - Pestaña 2: número de pasos, tabla de la trayectoria en unidades codificadas y naturales, ŷ predicho en cada paso y gráfica del plano (x1, x2) con los puntos del diseño y la trayectoria como flecha.
4. Ejecuta la app y corrige los errores.

Commit: Agrega RSM de primer orden y trayectoria de máximo ascenso

Prompt 15 — RSM: segundo orden y punto estacionario

1. En utils/rsm_models.py agrega ajustar_segundo_orden(df, y, x1, x2): ols("y ~ x1 + x2 + I(x1**2) + I(x2**2) + x1:x2"); devuelve el modelo, la tabla de coeficientes con nombres b0, b1, b2, b11, b22, b12, R², R² ajustado y la prueba de falta de ajuste si hay réplicas en el centro.
2. Crea utils/rsm_stationary.py:
   - matriz_B(b11, b22, b12) -> np.ndarray con [[b11, b12/2], [b12/2, b22]].
   - punto_estacionario(b1, b2, B) -> np.ndarray: xs = -0.5 * inv(B) @ b.
   - respuesta_en_punto(b0, b, xs) -> float: ys = b0 + 0.5 * xs @ b.
   - clasificar(B) -> tuple[np.ndarray, str]: valores propios con np.linalg.eigvalsh; todos negativos = máximo, todos positivos = mínimo, signos distintos = punto de silla.
   - Advertencia si el punto estacionario cae fuera de la región experimental (distancia al centro mayor que 1.414).
3. En pages/06_RSM.py la barra lateral debe permitir un segundo centro y semirango para el diseño central compuesto (por defecto: inclinación 25 y 3; ventilación 15 y 2). Implementa:
   - Pestaña 3: carga CSV (por defecto data/rsm_ccd.csv), coeficientes, R², falta de ajuste e interpretación.
   - Pestaña 4: matriz B, vector b, punto estacionario en unidades codificadas y naturales, ŷs, valores propios, clasificación y recomendación en lenguaje sencillo para el secador.
4. Prueba en la terminal: con b0 = 10, b1 = 1, b2 = -1, b11 = -2, b22 = -1, b12 = 0 imprime xs, ys y los valores propios (deben salir xs = (0.25, -0.5), ys = 10.375, valores propios -2 y -1, máximo).

Commit: Agrega RSM de segundo orden y punto estacionario

Prompt 16 — Superficie 3D y curvas de nivel

1. Crea utils/rsm_mesh.py: malla(x_min=-1.5, x_max=1.5, n=60) y predecir_malla(modelo, X1, X2) usando el modelo de segundo orden.
2. Crea utils/rsm_plots.py con plotly.graph_objects:
   - superficie_3d(X1, X2, Z, xs, ys, etiquetas): go.Surface con barra de color y el punto estacionario como marcador.
   - curvas_nivel(X1, X2, Z, xs, puntos_diseno, etiquetas): go.Contour con etiquetas en las curvas, los puntos del diseño y el punto estacionario.
   Ejes en unidades naturales (decodifica con utils/rsm_coding.py) y títulos con nombres y unidades.
3. Implementa las pestañas 5 y 6 de pages/06_RSM.py con esas figuras y una explicación de 3 líneas de cómo leerlas (cima, pendiente, forma de las curvas).
4. Ejecuta la app y comprueba que las dos figuras se ven y que el punto estacionario coincide con la pestaña 4.

Commit: Agrega superficie 3D y curvas de nivel

Prompt 17 — Exportación de figuras y tablas

1. Crea utils/rsm_export.py usando matplotlib (no kaleido):
   - figura_superficie_mpl(X1, X2, Z, xs, ys, etiquetas) con plot_surface.
   - figura_contornos_mpl(X1, X2, Z, xs, puntos_diseno, etiquetas) con contourf, contour con etiquetas (clabel) y los puntos marcados.
   - a_bytes(fig, formato) -> bytes: guarda en io.BytesIO con dpi=300 para PNG y formato vectorial para PDF.
   - guardar_en_carpeta(fig, nombre, carpeta="figuras"): guarda PNG y PDF en esa carpeta (la crea si no existe).
2. Implementa la pestaña 7 de pages/06_RSM.py: vista previa de las dos figuras, cuatro st.download_button (superficie PNG, superficie PDF, contornos PNG, contornos PDF), un botón "Guardar en la carpeta figuras/" y un st.download_button para descargar en Excel (openpyxl) las tablas de coeficientes de primer y segundo orden y la trayectoria, cada una en su hoja.
3. En pages/05_Factoriales.py agrega un botón para descargar en Excel la tabla ANOVA y las medias de celda.
4. Ejecuta la app, prueba todas las descargas y confirma que figuras/ queda con 4 archivos.

Commit: Agrega exportación de figuras y tablas (incluye la carpeta figuras/ con las figuras de su variante).

Prompt 18 — Prueba rápida, scripts de R y README final

1. Amplía verificacion/prueba_rapida.py para que lea factorial_mi_variante.csv, rsm1_mi_variante.csv y ccd_mi_variante.csv y compare con nuevas claves VACÍAS en MIS_VALORES_A_MANO: SC y F del factorial; b0, b1, b2, b12 y F de curvatura; xs1, xs2, ys, lambda1 y lambda2. No llenes los valores.
2. Crea en verificacion/, comentados línea por línea en español:
   - verificacion_factorial.R: aov(humedad ~ factor(carga) * pretratamiento); summary(); medias de celda; interaction.plot(); TukeyHSD sobre la interacción.
   - verificacion_rsm.R: install.packages("rsm") si falta; library(rsm); modelo de primer orden rsm(eficiencia ~ FO(x1, x2)) con summary() y steepest(); modelo de segundo orden rsm(eficiencia ~ SO(x1, x2)) con summary() y canonical(); persp() y contour() del modelo de segundo orden.
3. Actualiza README.md como documento final del proyecto: descripción, los 6 módulos, estructura de carpetas, formato de CSV por módulo, instalación y ejecución, verificación, uso declarado de IA, autor y referencias (Montgomery; Gutiérrez y De la Vara).
No modifiques el código de la app.

Commit: Agrega verificación en R y README final

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 13 a 18 de la Ruta A con un bloque al final. El chat externo no conoce el repositorio, así que primero se le pegan los archivos de los que depende el código nuevo.

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

Use un chat nuevo para esta actividad. Pegue primero el bloque de contexto de la Actividad 1 (Paso B0) y luego este mensaje:

Continúo el proyecto. Ya tengo funcionando la portada y los módulos DCA, DBCA, DCL y DPD.
Esta es la estructura actual de mi repositorio:
[pegar la salida de: find . -name "*.py" -not -path "./.venv/*"]
Este es mi archivo utils/comparaciones_utils.py:
[pegar el contenido completo]
Este es mi archivo utils/diagnostico_utils.py:
[pegar el contenido completo]
Este es mi requirements.txt:
[pegar el contenido]
Reglas nuevas para esta actividad:
- Librería adicional permitida: matplotlib, solo para exportar figuras a PNG y PDF. No uses kaleido.
- En RSM las variables se trabajan codificadas (x1, x2) y siempre se muestran también en unidades naturales.
- Si la interacción de un factorial es significativa, Tukey se hace entre medias de celda con el CM Error del modelo.
Responde solo "Listo" y espera la primera tarea.

Pasos B13 a B18 — Los prompts de la Ruta A con un bloque final

Copie el Prompt N de la Ruta A (de 13 a 18), péguelo y agréguele al final:

IMPORTANTE: tú no puedes ejecutar nada. Donde la tarea dice "ejecuta", "instala", "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:

  • B13: borre la primera parte del punto 1 (editar .github/copilot-instructions.md): el chat ya tiene esas reglas. Instale matplotlib con pip install matplotlib y agréguelo usted a requirements.txt.
  • B14 y B15: pages/06_RSM.py crece en cada prompt. Antes de B15, B16 y B17, pegue el contenido actual de pages/06_RSM.py y de utils/rsm_models.py: «Este es mi archivo actual: …».
  • B16 y B17: si el chat corta la respuesta, pídale un archivo por mensaje: «Entrégame ahora solo \[ruta\] completo».
  • B18: el diccionario MIS_VALORES_A_MANO lo llena usted, nunca la IA.

Cómo llevar el código y actualizar GitHub

  1. Crear o reemplazar el archivo: en el Explorador, clic derecho → New File con la ruta completa (por ejemplo utils/rsm_stationary.py); 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 con el ejemplo y con su variante.
  3. Subir a GitHub por terminal o con 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 "Agrega RSM de segundo orden y punto estacionario"
git push

Figuras exportadas (Prompt 17): el botón «Guardar en la carpeta figuras/» escribe los archivos dentro del Codespace, así que aparecen en el panel de control de código fuente y se suben con el commit. En github.dev no se puede ejecutar la app: genere las figuras en el Codespace.

Plan liviano con github.dev: pegue los archivos y haga Commit & Push sin crear la máquina. Para probar, abra el Codespace una sola vez por prompt y haga git pull antes de ejecutar.

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, péguele su cálculo, el resultado 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)

  1. Cargar cada CSV de su variante en su módulo y tomar las cuatro capturas pedidas.
  2. Llenar MIS_VALORES_A_MANO con sus hojas, ejecutar python verificacion/prueba_rapida.py y revisar que todo salga con ✔.
  3. Ejecutar los dos scripts de R en Google Colab con entorno R (subir los CSV y quitar ../data/ de la ruta) o en RStudio. Pegar las salidas como comentario al final de cada script.
  4. Al comparar la trayectoria con steepest() de R, tenga en cuenta que R avanza por distancia (0,5; 1,0; …) y no por Δx₁ = 1. Lo que debe coincidir es la dirección: el cociente x₂/x₁ en cada paso debe ser igual a su b₂/b₁.
  5. Comparar el punto estacionario y los valores propios de la app con canonical() de R y con su Ejercicio 3. Diferencias en el tercer decimal se deben a que la hoja usa coeficientes redondeados.
  6. Llenar las tres tablas de verificación de la bitácora. Commit final: Agrega verificación completa de la Actividad 3.

Lista de verificación de la entrega

Solución de problemas frecuentes

Síntoma Causa probable Solución
PatsyError con x1**2 en la fórmula Falta envolver el término cuadrático Usar I(x1**2) en la fórmula de statsmodels
El punto estacionario sale muy lejos (por ejemplo x₁ = 8) Se usó b₁₂ completo en la matriz B en vez de b₁₂/2, o se olvidó el −½ Revisar matriz_B y punto_estacionario contra su hoja
La trayectoria va en dirección contraria Se minimizó en vez de maximizar, o se invirtió b₂/b₁ La eficiencia se maximiza: Δx₂ = (b₂/b₁)Δx₁ con el signo de los coeficientes
Error de Kaleido o Chrome al exportar Se usó fig.write_image de Plotly Exportar con las funciones de Matplotlib de rsm_export.py
Los ejes de las figuras salen en −1 a 1 Faltó decodificar Usar decodificar de rsm_coding.py con el centro y semirango del CCD
El factorial dice que falta una combinación Nombres inconsistentes en el CSV (p0 y P0, 6 y 6.0) Revisar el CSV; usar texto uniforme
ModuleNotFoundError: rsm en R Paquete no instalado install.packages("rsm") al inicio del script

Reto opcional: publicar la app en Streamlit Community Cloud

  1. Entrar a share.streamlit.io e iniciar sesión con la cuenta de GitHub (sirve la cuenta con correo personal).
  2. Create app → elegir el repositorio app-diseno-experimental, rama main y archivo app.py → Deploy.
  3. Si falla la instalación, revisar que requirements.txt incluya todas las librerías usadas y no incluya kaleido.
  4. Agregar el enlace público al README y entregarlo en el aula virtual.

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

Clave Ejercicio 1 — Factorial

Fijos: SC Error = 0,6667 (gl 12); CM Error = 0,0556; DMS de Tukey para 6 celdas = 0,646; CV ≈ 1,8 %. Medias de celda fijas: 2-P0 = 12,20; 4-P0 = 13,73; 2-P1 = 11,67; 4-P1 = 12,40; 6-P1 = 12,97. Efectos simples P0 − P1: con 2 kg/m² = 0,53 (no significativo); con 4 kg/m² = 1,33 y con 6 kg/m² = 2,40 + k (significativos). Respuesta esperada: escaldar vale la pena desde 4 kg/m². La menor humedad la da 2 kg/m² con escaldado (11,67), aunque no difiere de 2 kg/m² sin escaldar (12,20); en la práctica, quien necesite cargar 4 o 6 kg/m² debe escaldar.

Dígito Y… SC Total SC Carga SC Pretrat. SC A×B F Carga F Pretrat. F A×B Media 6-P0
0 235,0 27,3644 14,9644 9,1022 2,6311 134,68 163,84 23,68 15,37
1 235,3 28,7761 15,6411 9,5339 2,9344 140,77 171,61 26,41 15,47
2 235,6 30,2378 16,3378 9,9756 3,2578 147,04 179,56 29,32 15,57
3 235,9 31,7494 17,0544 10,4272 3,6011 153,49 187,69 32,41 15,67
4 236,2 33,3111 17,7911 10,8889 3,9644 160,12 196,00 35,68 15,77
5 236,5 34,9228 18,5478 11,3606 4,3478 166,93 204,49 39,13 15,87
6 236,8 36,5844 19,3244 11,8422 4,7511 173,92 213,16 42,76 15,97
7 237,1 38,2961 20,1211 12,3339 5,1744 181,09 222,01 46,57 16,07
8 237,4 40,0578 20,9378 12,8356 5,6178 188,44 231,04 50,56 16,17
9 237,7 41,8694 21,7744 13,3472 6,0811 195,97 240,25 54,73 16,27

Clave Ejercicio 2 — Primer orden y trayectoria

Fijos: ȳC = 41,675; s² de los centros = 0,0492 (gl 3). En todas las variantes F de curvatura < 10,13: no hay curvatura y el modelo de primer orden es adecuado. Según las eficiencias dadas, el mejor paso es el 2, así que el nuevo centro es 25° y unos 15 cm, el mismo del diseño central compuesto.

Dígito b₀ b₁ b₂ b₁₂ ȳF F curvatura Δx₂ = b₂/b₁ Ventilación en el paso 2 (cm)
0 41,7125 2,200 1,350 0,000 41,750 0,23 0,614 14,91
1 41,7250 2,225 1,375 0,025 41,775 0,41 0,618 14,94
2 41,7375 2,250 1,400 0,050 41,800 0,64 0,622 14,98
3 41,7500 2,275 1,425 0,075 41,825 0,92 0,626 15,01
4 41,7625 2,300 1,450 0,100 41,850 1,25 0,630 15,04
5 41,7750 2,325 1,475 0,125 41,875 1,63 0,634 15,08
6 41,7875 2,350 1,500 0,150 41,900 2,06 0,638 15,11
7 41,8000 2,375 1,525 0,175 41,925 2,54 0,642 15,14
8 41,8125 2,400 1,550 0,200 41,950 3,08 0,646 15,17
9 41,8250 2,425 1,575 0,225 41,975 3,66 0,650 15,20

La inclinación en cada paso es 15 + 5 × paso (paso 2 = 25°) para todas las variantes.

Clave Ejercicio 3 — Punto estacionario

Fijos: B = \[\[−1,273; −0,1125\], \[−0,1125; −1,098\]]; valores propios λ₁ = −1,328 y λ₂ = −1,043; ambos negativos, así que el punto es un máximo en todas las variantes. Es la respuesta a la segunda pregunta de reserva cognitiva: la matriz B fija la forma de la loma y el vector b su ubicación. La app ajusta el CCD de la variante y obtiene b₀ = 48,120; b₁ = 0,4057; b₂ = 0,5131 + k; b₁₁ = −1,2727; b₂₂ = −1,0976; b₁₂ = −0,2250; con R² ≈ 0,93 a 0,96.

Dígito b₂ x₁ₛ x₂ₛ Inclinación (°) Ventilación (cm) ŷₛ (%)
0 0,513 0,140 0,219 25,42 15,44 48,20
1 0,613 0,136 0,265 25,41 15,53 48,23
2 0,713 0,132 0,311 25,40 15,62 48,26
3 0,813 0,128 0,357 25,38 15,71 48,29
4 0,913 0,124 0,403 25,37 15,81 48,33
5 1,013 0,120 0,449 25,36 15,90 48,37
6 1,113 0,116 0,495 25,35 15,99 48,42
7 1,213 0,112 0,541 25,33 16,08 48,47
8 1,313 0,108 0,587 25,32 16,17 48,53
9 1,413 0,104 0,633 25,31 16,27 48,59

Recomendación esperada: inclinar el colector unos 25° y abrir la ventilación entre 15,4 y 16,3 cm, según la variante, para una eficiencia cercana al 48 %.

Defensas orales (C8). Pregunta sugerida: «muéstrame en rsm_stationary.py dónde se arma la matriz B y explícame por qué va b₁₂/2 y no b₁₂».