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.
| 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):
app-diseno-experimental con las
páginas Factoriales y RSM funcionando.figuras/.verificacion/verificacion_factorial.R y
verificacion/verificacion_rsm.R con su salida como
comentario.BITACORA_IA.md actualizada con los Prompts 13 a 18 y
las tablas de verificació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:
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:
utils/.| 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 |
| 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 |
La variante personal sigue siendo k = (último dígito del código estudiantil) ÷ 10. En cada ejercicio se indica dónde se suma.
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 |
\[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)\]
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 |
\[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}\]
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 |
\[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:
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 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.
| 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).
| 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.
git pull en VS Code local, o
reabrir el Codespace existente desde
github.com/codespaces.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).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.
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:
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.
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.
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
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
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
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).
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
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.
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.
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:
.github/copilot-instructions.md): el chat ya tiene esas
reglas. Instale matplotlib con pip install matplotlib y
agréguelo usted a requirements.txt.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: …».MIS_VALORES_A_MANO
lo llena usted, nunca la IA.utils/rsm_stationary.py); si ya existe, abrirlo,
Ctrl+A, pegar y Ctrl+S.streamlit run app.py, abrir el
puerto 8501 y revisar la página 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 "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.
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.
MIS_VALORES_A_MANO con sus hojas, ejecutar
python verificacion/prueba_rapida.py y revisar que todo
salga con ✔.../data/ de la ruta) o
en RStudio. Pegar las salidas como comentario al final
de cada script.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₁.canonical() de R y con su Ejercicio 3. Diferencias en el
tercer decimal se deben a que la hoja usa coeficientes redondeados.Agrega verificación completa de la Actividad 3.| 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 |
app-diseno-experimental, rama main y archivo
app.py → Deploy.requirements.txt
incluya todas las librerías usadas y no incluya kaleido.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 |
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.
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₁₂».