Actividad Evaluativa — 2da Nota (Segundo 50 %)

“Mi app agrícola en la nube”: primeros pasos en Codespaces con GitHub Copilot (modo Agente) y Análisis Exploratorio de Datos (EDA) con Streamlit

Asignatura: Estadística Aplicada con Python y R

Programa: Ingeniería Agrícola — Universidad de Sucre

Grupos: 1 y 2

Tema: Análisis Exploratorio de Datos (EDA) + control de versiones con Git/GitHub + desarrollo asistido por IA

Modalidad: Individual. Repositorio en GitHub + hoja manuscrita escaneada dentro del repositorio (Lápiz y Algoritmo)

Duración: 2 sesiones de 2 horas + trabajo autónomo

Entregable único: la URL de tu repositorio en GitHub (https://github.com/TU_USUARIO/app-estadistica-agricola)

Importante: este repositorio te acompañará el resto del semestre. En las próximas actividades le agregarás las páginas de Regresión y Series de tiempo. Lo que construyas hoy es la base de tu proyecto final.


1. Descripción de la actividad

Una cooperativa de productores de Sucre quiere una aplicación web sencilla para explorar los datos de sus parcelas: cuánto rinden, qué tan variables son, si hay parcelas con comportamiento extraño y si el riego o el tipo de suelo parecen marcar diferencias. Tú serás el ingeniero que construye esa app.

Para hacerlo usarás tres herramientas profesionales:

  • GitHub Codespaces: un computador Linux en la nube con VS Code. No instalas nada en tu equipo.
  • GitHub Copilot en modo Agente: un asistente de IA que crea archivos y ejecuta comandos mientras tú supervisas, lees y apruebas.
  • Git y el panel “Control de código fuente”: para guardar cada avance (commit) y sincronizarlo con GitHub.

Analogía agrícola:

  • El repositorio es el cuaderno de campo de la finca: allí queda registrado todo.
  • Cada commit es una anotación fechada y firmada en ese cuaderno (“hoy se fertilizó el lote 3”).
  • Sincronizar (push/pull) es llevar una copia del cuaderno a la oficina de la cooperativa y traer las anotaciones que otros hicieron allá.
  • El entorno virtual (.venv) es el cuarto de herramientas propio de cada lote: las herramientas de un lote no se mezclan con las de otro.
  • El agente de IA es un operario muy rápido: trabaja bien, pero el ingeniero responsable revisa y firma. Si el operario se equivoca, la responsabilidad es tuya.

Metodología del Lápiz y el Algoritmo: antes de que la app te muestre los resultados, calcularás a mano las medidas descriptivas de 10 parcelas que te asigna tu código estudiantil (Fase 1). Después las verificarás con Python y R (Fase 2).


2. ¿Por qué no sirve copiar el repositorio de otro compañero?

Mecanismo Qué lo hace personal
Semilla = código estudiantil El script generar_datos.py usa tu código para asignarte cultivo, municipio, número de parcelas, datos, atípicos y faltantes.
Huella digital Un código de 8 caracteres (p. ej. 83C6B069) que aparece en tu app y en tu README. El docente la regenera con tu código.
Muestra de 10 parcelas Cada estudiante calcula a mano con números distintos; la hoja debe tener tu letra, nombre y código.
Historial de commits GitHub registra fecha, hora y autor de cada commit. Se revisa que el trabajo se haya hecho en las dos sesiones y con tu correo institucional.
Bitácora de IA Tus prompts, lo que aceptaste, lo que rechazaste y los errores que corregiste.

Si dos repositorios tienen textos de hallazgos o bitácoras idénticas, ambos estudiantes presentan una sustentación oral corta antes de asignar la nota.


3. Objetivos

Objetivo general

Construir, en un GitHub Codespace y con apoyo supervisado de GitHub Copilot en modo Agente, la primera versión de una aplicación en Python y Streamlit que realice el Análisis Exploratorio de Datos de un conjunto de parcelas agrícolas personalizado, gestionando su desarrollo con Git y GitHub.

Objetivos específicos

  • Crear un repositorio público en GitHub con la cuenta asociada al correo institucional.
  • Crear, usar y detener correctamente un Codespace, controlando el consumo de horas-núcleo.
  • Dirigir al modo Agente con prompts claros para crear el entorno virtual, los archivos .gitignore y requirements.txt, e instalar las dependencias.
  • Generar con el agente una app multipágina de Streamlit con páginas de Inicio, Datos y EDA, y dejar preparadas las páginas de Regresión y Series de tiempo.
  • Calcular a mano media, mediana, varianza, desviación estándar, CV, cuartiles, RIC y vallas de Tukey para 10 parcelas, y verificarlos con Python y R.
  • Interpretar los resultados del EDA con criterio agronómico (variabilidad, atípicos, faltantes, diferencias por riego y suelo, correlaciones).
  • Usar el panel Control de código fuente para hacer commits y sincronizar, y también instruir al agente para que actualice el repositorio.
  • Documentar de forma crítica y honesta el uso de la IA.

4. Competencias, resultados de aprendizaje y estrategias

Competencia Resultado de aprendizaje Estrategia pedagógica
Pensamiento computacional y reproducibilidad Organiza un proyecto de Python con entorno virtual, dependencias declaradas y archivos excluidos del control de versiones Prompt 1 al agente + revisión de cada comando antes de aprobarlo
Gestión de versiones (Git/GitHub) Registra su trabajo en commits con mensajes claros y sincroniza su repositorio local con el remoto, de forma manual y mediante el agente Panel Control de código fuente, edición web + pull, Prompt 3
Análisis exploratorio de datos Describe una variable agrícola con medidas de tendencia central, dispersión y posición; detecta atípicos y datos faltantes; compara grupos y explora correlaciones Página EDA de la app con datos personalizados
Razonamiento cuantitativo manual (Lápiz y Algoritmo) Calcula a mano las medidas descriptivas de 10 observaciones y las contrasta con Python y R Hoja manuscrita + verificar_muestra.py y verificar_muestra.R
Uso ético y crítico de la IA Dirige, supervisa y corrige a un agente de IA, y documenta su uso Bitácora de IA (Hoja de Ruta para la Adopción Ética y Sostenible de la IA en Colombia, 2024)
Comunicación técnica Redacta hallazgos agronómicos con unidades, a partir de la evidencia estadística Sección “Hallazgos del EDA” del README

5. Lo que necesitas

No necesitas tener aprobado GitHub Education: la cuenta gratuita incluye Codespaces y Copilot Free con modo Agente. La cuota del agente es limitada: usa cada prompt una sola vez, completo, y no lo repitas sin necesidad.


6. Sesión 1 (2 horas): repositorio, Codespace, entorno y primeros commits

Paso 1. Crear el repositorio (10 min)

  1. Entra a github.com con tu cuenta (la del correo institucional).
  2. Clic en + (arriba a la derecha) → New repository.
  3. Configura:
    • Repository name: app-estadistica-agricola
    • Description: App de Streamlit para análisis estadístico agrícola — Estadística Aplicada con Python y R, Unisucre
    • Public (obligatorio, para que el docente pueda evaluarlo).
    • Marca Add a README file.
    • En .gitignore y license deja None (el agente creará el .gitignore).
  4. Clic en Create repository.

Paso 2. Configurar el consumo y crear el Codespace (10 min)

  1. Abre github.com/settings/codespaces y ajusta:
    • Default idle timeout: 15 minutos (se apaga solo si lo dejas sin uso).
    • Default retention period: 30 días.
  2. Vuelve a tu repositorio → botón verde Code → pestaña Codespaces → Create codespace on main.
  3. Espera 1–2 minutos. Se abre VS Code en el navegador con tu README.md y una terminal abajo.
  4. En la terminal, identifícate (usa el correo de tu cuenta de GitHub):
git config --global user.name "Nombre Apellido"            # tu nombre real
git config --global user.email "usuario@unisucrevirtual.edu.co"   # tu correo institucional
git config --global --list                                   # verifica que quedaron guardados

¿Cuánto se consume? Un Codespace de 2 núcleos gasta 2 horas-núcleo por cada hora encendido. La cuenta gratuita trae 120 horas-núcleo al mes (unas 60 horas reales). Un Codespace olvidado encendido toda la noche gasta la quinta parte de tu cuota. Detenido no gasta horas.

Paso 3. Prompt 1 al Agente: entorno virtual, .gitignore y requirements.txt (25 min)

Cómo trabajar con el agente:

  1. Abre el chat de Copilot (icono de Copilot arriba o Ctrl+Alt+I) y en el selector de modo elige Agent.
  2. Pega el prompt completo y espera.
  3. Cuando quiera ejecutar un comando, aparece el botón Continue / Allow: lee el comando antes de aceptar.
  4. Cuando cree o cambie archivos, revisa y elige Keep (conservar) o Undo (deshacer).
  5. Copia cada prompt que uses en tu BITACORA_IA.md (Paso 11).
Actúa como tutor de Python y Streamlit para estudiantes de Ingeniería Agrícola.
Responde en español y explica en una o dos líneas cada paso antes de ejecutarlo.
Estamos en un GitHub Codespace (Linux) dentro de mi repositorio app-estadistica-agricola,
que por ahora solo tiene README.md. Prepara el proyecto así:
1. Crea un entorno virtual llamado .venv con: python -m venv .venv
2. Actívalo con: source .venv/bin/activate  y verifica con: which python
3. Configura VS Code para usar .venv/bin/python como intérprete (archivo .vscode/settings.json).
4. Crea un .gitignore para Python que excluya: .venv/, __pycache__/, *.pyc,
   .ipynb_checkpoints/, .streamlit/secrets.toml y .DS_Store
5. Crea requirements.txt con: streamlit, pandas, numpy, scipy, matplotlib, seaborn, statsmodels
6. Instala las dependencias con: .venv/bin/pip install -r requirements.txt
7. Verifica la instalación imprimiendo la versión de cada librería.
No crees ningún otro archivo y no hagas commits. Al final muéstrame el árbol de archivos
(sin .venv) y explícame en 5 líneas para qué sirven el entorno virtual, .gitignore y requirements.txt.

Verifica tú mismo: en el explorador de la izquierda aparecen .gitignore, requirements.txt y .vscode/. La carpeta .venv existe, pero no debe aparecer en el panel Control de código fuente.

Paso 4. Tu primer commit con el panel “Control de código fuente” (15 min)

  1. Abre el panel Control de código fuente (icono de ramas a la izquierda, o Ctrl+Shift+G).
  2. En Changes verás los archivos nuevos (letra U = untracked, sin seguimiento). Comprueba que no aparece .venv.
  3. Pasa el cursor sobre Changes y haz clic en + (Stage All Changes). Ahora están en Staged Changes (preparados).
  4. En el cuadro Message escribe: [manual] Configura entorno: .gitignore, requirements.txt y VS Code
  5. Clic en Commit.
  6. Clic en Sync Changes (sincronizar). Si pregunta, acepta. Esto hace pull + push.
  7. Recarga tu repositorio en GitHub: los archivos ya están allá.

Regla de los mensajes: los commits que hagas tú desde el panel empiezan por [manual]; los que hagas en la web, por [web]; los que haga el agente, por [agente]. Así el docente puede evaluar cada forma de trabajo.

Paso 5. Generar tus datos personalizados (20 min)

  1. En el explorador, crea el archivo generar_datos.py en la raíz del proyecto.
  2. Copia el código del Anexo A. Modifica solo las líneas de codigo y nombre.
  3. Ejecuta en la terminal:
.venv/bin/python generar_datos.py      # ejecuta el script con el Python del entorno virtual
  1. Se crea la carpeta datos/ con parcelas.csv, clima_mensual.csv, muestra10.csv y metadatos.json. En la terminal verás tu huella, tu cultivo, tu municipio y tus 10 parcelas para el cálculo a mano.
  2. Copia en tu hoja manuscrita la tabla de las 10 parcelas (la usarás en la Sesión 2).
  3. Commit desde el panel: [manual] Agrega generador y datos personalizados → Commit → Sync Changes.

No vuelvas a ejecutar el script con otro código. Si lo vuelves a ejecutar con el mismo código, los datos salen idénticos.

Paso 6. Detener el Codespace (5 min)

  1. En la terminal, confirma que todo está guardado:
git status      # debe decir: nothing to commit, working tree clean
  1. Abre github.com/codespaces → … junto a tu Codespace → Stop codespace.
Opción Cuándo usarla
Stop codespace Siempre, al terminar cada sesión
Delete Solo al final del semestre y después de verificar que todo está en GitHub

Push y apagar, siempre en ese orden. Nunca borres un Codespace sin haber sincronizado.


7. Sesión 2 (2 horas): Lápiz y Algoritmo, app de Streamlit y actualización del repositorio

Paso 7. Fase 1 — Lápiz y papel (30 min, antes de abrir el Codespace)

Con las 10 parcelas de muestra10 que copiaste en tu hoja (nombre, código y huella en el encabezado):

  1. Predicción previa (antes de calcular): mirando los 10 valores, ¿crees que hay algún atípico? ¿La media quedará por encima o por debajo de la mediana? ¿Por qué?
  2. Ordena los datos de menor a mayor: \(x_{(1)} \le x_{(2)} \le \dots \le x_{(10)}\).
  3. Calcula a mano, con su procedimiento:
    • Media: \(\bar{x} = \dfrac{\sum x_i}{n}\)
    • Mediana (\(n = 10\), par): \(Me = \dfrac{x_{(5)} + x_{(6)}}{2}\)
    • Varianza muestral: construye la tabla con columnas \(x_i\), \((x_i - \bar{x})\), \((x_i - \bar{x})^2\) y usa \(s^2 = \dfrac{\sum (x_i - \bar{x})^2}{n - 1}\)
    • Desviación estándar: \(s = \sqrt{s^2}\) y CV \(= 100 \cdot s / \bar{x}\) (%)
    • Cuartiles (método tipo 7, el que usan por defecto Python y R): posición \(h = (n - 1)\,p + 1\)
      • \(Q_1\): \(h = 3{,}25 \Rightarrow Q_1 = x_{(3)} + 0{,}25\,[x_{(4)} - x_{(3)}]\)
      • \(Q_3\): \(h = 7{,}75 \Rightarrow Q_3 = x_{(7)} + 0{,}75\,[x_{(8)} - x_{(7)}]\)
    • RIC \(= Q_3 - Q_1\) y vallas de Tukey: \(LI = Q_1 - 1{,}5\,RIC\), \(LS = Q_3 + 1{,}5\,RIC\)
    • Atípicos: parcelas con rendimiento menor que \(LI\) o mayor que \(LS\).
    • Media por riego: media de las parcelas con riego “Sí” y con riego “No”.
  4. Dibuja a mano el diagrama de caja con \(Q_1\), \(Me\), \(Q_3\), bigotes y atípicos.
  5. Interpretación (3–4 líneas): ¿qué tan variable es el rendimiento de tu cultivo? ¿Qué pudo causar el atípico en campo (plaga, encharcamiento, error de pesaje, parcela con mejor manejo)?

Analogía: el atípico es como esa parcela del lote que se ve “distinta” desde la carretera. El EDA no la borra de inmediato: primero pregunta por qué es distinta.

Escanea la hoja en PDF con el nombre hoja_manuscrita.pdf.

Paso 8. Abrir el Codespace y sincronizar un cambio hecho en la web (15 min)

  1. En GitHub (navegador), abre tu README.md → icono del lápiz → reemplaza su contenido por la plantilla del Anexo C y completa tus datos y tu huella. Mensaje del commit: [web] Actualiza README con datos del estudiante → Commit changes.
  2. Crea la carpeta de evidencias desde la web: Add file → Create new file → en el nombre escribe evidencias/LEEME.md (al escribir la / se crea la carpeta) → contenido: Evidencias de la actividad → mensaje [web] Crea carpeta de evidencias → Commit changes.
  3. Entra a la carpeta evidencias/ → Add file → Upload files → arrastra hoja_manuscrita.pdf → mensaje [web] Agrega hoja manuscrita → Commit changes.
  4. Abre tu Codespace: Code → Codespaces → tu Codespace (ya existe, no crees otro).
  5. En el panel Control de código fuente haz clic en Sync Changes (o en la terminal git pull). Verás aparecer el README actualizado y la carpeta evidencias/.
git log --oneline      # deben aparecer tus commits [manual] y [web]

Paso 9. Prompt 2 al Agente: la app de Streamlit (35 min)

Ahora crea una app de Streamlit multipágina. El proyecto ya tiene la carpeta datos/ con:
- parcelas.csv: parcela, suelo, riego, dosis_N [kg/ha], lamina_riego [mm],
  materia_organica [%], ph, rendimiento [t/ha]. Tiene valores faltantes en
  materia_organica y posibles atípicos en rendimiento.
- clima_mensual.csv: fecha, precipitacion_mm, temperatura_c (mensual, 2015-2025).
- muestra10.csv: parcela, suelo, riego, rendimiento.
- metadatos.json: codigo, nombre, cultivo, municipio, n_parcelas, huella.
NO modifiques la carpeta datos/ ni generar_datos.py.
Crea esta estructura, usando .venv/bin/python y .venv/bin/pip en todos los comandos:
1. src/__init__.py y src/eda.py con funciones con docstrings: cargar_datos(nombre_csv)
   con @st.cache_data, cargar_metadatos(), resumen_numerico(serie) [n, media, mediana,
   desviación estándar muestral, CV %, mínimo, Q1, Q3, máximo, RIC, asimetría],
   valores_faltantes(df) y atipicos_iqr(serie) [vallas de Tukey con 1.5·RIC].
2. app.py (Inicio): título "Estadística Aplicada con Python y R — Ingeniería Agrícola,
   Unisucre"; tarjeta con nombre, código, cultivo, municipio y huella leídos de
   metadatos.json; descripción breve de la app y de cada página.
3. pages/1_Datos.py: tabla de parcelas, número de filas y columnas, tipo de cada variable
   (cualitativa o cuantitativa), tabla de valores faltantes y botón para descargar el CSV.
4. pages/2_EDA.py: filtros en la barra lateral por suelo y riego, y cuatro secciones:
   a) Univariado: selector de variable numérica, tabla resumen_numerico, histograma con
      curva de densidad y diagrama de caja con seaborn, y lista de parcelas atípicas.
   b) Cualitativo: tabla de frecuencias absolutas y relativas, y gráfico de barras de
      suelo y de riego.
   c) Bivariado: diagramas de caja de rendimiento por suelo y por riego; dispersión de una
      variable X elegida contra rendimiento, coloreada por riego; mapa de calor de la
      matriz de correlación de Pearson de las variables numéricas.
   d) "Muestra de 10 parcelas (verificación del cálculo a mano)": tabla de muestra10,
      su resumen_numerico, sus vallas de Tukey, sus atípicos y la media por riego.
5. pages/3_Regresion.py: página "en construcción" con st.info y la lista de temas que
   vendrán: correlación, regresión lineal simple, regresión múltiple y diagnóstico de residuos.
6. pages/4_Series_de_tiempo.py: página "en construcción" con st.info, la lista de temas
   (componentes, descomposición, promedios móviles, pronóstico) y, como vista previa,
   un gráfico de línea de precipitacion_mm de clima_mensual.csv.
Requisitos: solo librerías de requirements.txt; textos de la interfaz en español; ejes
con unidades; código comentado paso a paso para estudiantes de Ingeniería Agrícola.
No hagas commits. Al final ejecuta:
.venv/bin/streamlit run app.py --server.headless true
y dime cómo abrir la app desde la pestaña Puertos (puerto 8501). Si hay errores, corrígelos.

Supervisa al agente:

  • Lee cada comando antes de aprobarlo. Si propone instalar librerías que no están en requirements.txt, rechaza y pídele que use solo las de la lista.
  • Abre la app (pestaña Puertos → icono de globo del puerto 8501) y recorre las cuatro páginas.
  • Compara la sección “Muestra de 10 parcelas” con tu hoja manuscrita.
  • Toma dos capturas de pantalla (Inicio y EDA) y súbelas a evidencias/ arrastrándolas al explorador del Codespace: captura_inicio.png y captura_eda.png.
  • Para detener la app: Ctrl+C en la terminal donde corre.

Paso 10. Fase 2 — Verificación con Python y R (15 min)

  1. Crea la carpeta verificacion/ con los dos scripts del Anexo B.
  2. Python (en el Codespace):
.venv/bin/python verificacion/verificar_muestra.py     # verifica tu cálculo a mano
  1. R (en Posit Cloud): sube datos/muestra10.csv y verificar_muestra.R a un proyecto, y ejecuta el script.
  2. Crea verificacion/RESULTADOS.md con la tabla del Anexo B (manual vs Python vs R). Si algún valor no coincide (más allá del redondeo), busca el error en tu hoja; no cambies la hoja para que coincida: anótalo y explica qué pasó.

Paso 11. Hallazgos y Bitácora de IA, con commit manual (15 min)

  1. En el README.md, completa la sección “Hallazgos del EDA” (6–10 líneas, escritas por ti, no por la IA), con base en tu app:
    • Rendimiento medio y su variabilidad (CV) para tu cultivo en tu municipio.
    • Atípicos y datos faltantes encontrados: ¿qué harías con ellos?
    • ¿Riego y tipo de suelo parecen asociarse con el rendimiento? (según los diagramas de caja)
    • ¿Qué variable numérica tiene la correlación más fuerte con el rendimiento? Recuerda: correlación no implica causalidad.
  2. Crea BITACORA_IA.md con la plantilla del Anexo D.
  3. Commit desde el panel: [manual] Agrega verificación, hallazgos del EDA y bitácora de IA → Commit → Sync Changes.

Paso 12. Prompt 3 al Agente: actualizar el repositorio (10 min)

Actúa como mi asistente de control de versiones con Git. Explica cada comando antes de
ejecutarlo y espera mi aprobación.
1. Ejecuta git status y confirma que .venv/ NO aparece; si aparece, corrige .gitignore
   antes de continuar.
2. Ejecuta git pull para traer los cambios que haya en GitHub.
3. Agrupa los archivos pendientes en commits separados y lógicos (por ejemplo: src/ y
   app.py; pages/; evidencias/; otros). Cada mensaje en español debe empezar por "[agente]"
   y describir el cambio.
4. Ejecuta git push y muéstrame git log --oneline -20.
5. Explícame en 3 líneas la diferencia entre hacer commit y hacer push, y dame la URL de mi
   repositorio en GitHub.

Si al llegar aquí ya no tienes archivos pendientes, primero pídele al agente un cambio pequeño (por ejemplo, agregar en app.py un pie de página con la fecha de la última actualización) y después usa el Prompt 3.

Paso 13. Cierre y entrega (5 min)

  1. En GitHub, verifica que están todos los archivos y que no se subió .venv.
  2. Abre la URL de tu repositorio en una ventana de incógnito: debe verse sin iniciar sesión.
  3. Detén el Codespace (Stop codespace).
  4. Entrega la URL del repositorio en el formulario / grupo de WhatsApp de la asignatura, con tu nombre completo y código.

8. Estructura esperada del repositorio

app-estadistica-agricola/
├── README.md                  ← datos del estudiante, huella, hallazgos del EDA
├── .gitignore                 ← creado por el agente (excluye .venv/)
├── requirements.txt           ← creado por el agente
├── .vscode/settings.json      ← intérprete .venv/bin/python
├── generar_datos.py           ← Anexo A (con tu código)
├── app.py                     ← página de Inicio
├── src/
│   ├── __init__.py
│   └── eda.py                 ← funciones reutilizables
├── pages/
│   ├── 1_Datos.py
│   ├── 2_EDA.py
│   ├── 3_Regresion.py         ← en construcción (próxima actividad)
│   └── 4_Series_de_tiempo.py  ← en construcción (final del semestre)
├── datos/
│   ├── parcelas.csv  clima_mensual.csv  muestra10.csv  metadatos.json
├── verificacion/
│   ├── verificar_muestra.py  verificar_muestra.R  RESULTADOS.md
├── evidencias/
│   ├── hoja_manuscrita.pdf  captura_inicio.png  captura_eda.png
└── BITACORA_IA.md

Historial mínimo de commits: 3 [manual] + 2 [web] + 2 [agente], distribuidos en las dos sesiones.


9. Rúbrica de evaluación

Escala de 0,0 a 5,0. Nota de la actividad = Σ (nota del criterio × peso), redondeada a un decimal.

# Criterio Peso Excelente (4,6–5,0) Bueno (3,6–4,5) Aceptable (3,0–3,5) Insuficiente (0,0–2,9)
1 Repositorio e identificación 10 % Repositorio público app-estadistica-agricola; commits firmados con el correo institucional; README con nombre, código, grupo, cultivo, municipio y huella coincidente con el código Completo con un detalle menor (descripción o grupo faltante) Falta un dato clave del README o el nombre del repositorio es distinto Repositorio privado o inaccesible, sin datos del estudiante, o huella que no corresponde al código
2 Entorno de trabajo en el Codespace 15 % .gitignore correcto y .venv no subido; requirements.txt con las 7 librerías; .vscode/settings.json con el intérprete; Prompt 1 registrado en la bitácora Un archivo con detalle menor (p. ej. falta una exclusión) Falta uno de los archivos o .venv aparece subido Sin entorno virtual, sin .gitignore ni requirements.txt
3 App de Streamlit (estructura y funcionamiento) 20 % Inicio, Datos y EDA completos con las 4 secciones; páginas de Regresión y Series de tiempo preparadas; src/eda.py con funciones documentadas; capturas que muestran la app funcionando con sus datos Falta una sección del EDA o una página preparada Varias secciones ausentes o la app solo funciona parcialmente Sin app, app que no corresponde a sus datos o sin evidencia de funcionamiento
4 Análisis exploratorio e interpretación agronómica 20 % Hallazgos propios (6–10 líneas) con cifras y unidades: CV, atípicos, faltantes, efecto de riego y suelo, correlación más fuerte, y advertencia de que correlación ≠ causalidad Hallazgos correctos pero incompletos (faltan 1–2 aspectos) Hallazgos superficiales, sin cifras o genéricos Sin hallazgos, o texto generado por IA sin relación con sus datos
5 Lápiz y Algoritmo (manuscrito + verificación Python y R) 15 % Predicción previa; tabla de desviaciones; media, mediana, \(s^2\), \(s\), CV, \(Q_1\), \(Q_3\), RIC, vallas, atípicos y medias por riego correctos a mano; diagrama de caja dibujado; RESULTADOS.md comparando manual, Python y R Cálculos correctos con un error menor de redondeo o sin predicción previa Cálculo incompleto o con errores de procedimiento; verificación solo en un lenguaje Ausente, no manuscrito o con una muestra distinta a la asignada
6 Control de versiones: panel y agente 10 % ≥ 3 commits [manual], ≥ 2 [web] sincronizados con pull, ≥ 2 [agente]; mensajes claros; trabajo distribuido en las dos sesiones Cumple el mínimo con algún mensaje poco descriptivo Falta un tipo de commit (manual, web o agente) Uno o dos commits con todo el trabajo, o subido con Upload files sin usar Git
7 Bitácora de IA y uso responsable de recursos 10 % Los 3 prompts exactos; qué aprobó, rechazó o corrigió y por qué; al menos un error detectado; reflexión honesta; declara que detuvo el Codespace Bitácora completa pero con poco detalle en las correcciones Bitácora genérica o incompleta Sin bitácora

10. Problemas frecuentes

Lo que ves Solución
No aparece el modo Agent Recarga la página del Codespace y verifica que iniciaste sesión en Copilot con tu cuenta de GitHub
“You’ve reached your monthly chat/agent limit” Se agotó la cuota gratuita: pega el prompt en otro asistente, crea los archivos a mano y anótalo en la bitácora
.venv aparece en Control de código fuente Falta .venv/ en .gitignore: agrégalo antes del commit
Push rechazado por “private email” En Settings → Emails, desmarca Block command line pushes that expose my email
Push rechazado porque hay cambios en GitHub Sync Changes (o git pull y luego git push)
ModuleNotFoundError al correr la app Usa .venv/bin/streamlit run app.py o activa el entorno con source .venv/bin/activate
La app no abre Pestaña Puertos → globo del puerto 8501
El Codespace se detuvo solo Es el idle timeout: vuelve a abrirlo, no se pierde nada
generar_datos.py da error con mi código El código debe contener solo números y estar entre comillas: "1102345678"

11. Recomendaciones

  • Primero el lápiz: haz el cálculo a mano antes de abrir la sección “Muestra de 10 parcelas” de tu app.
  • El agente escribe, tú verificas: no apruebes un comando que no entiendas; pregunta en el chat qué hace antes de aceptarlo.
  • Un prompt, una tarea: la cuota del agente es limitada.
  • Commit pequeño y frecuente: como anotar en el cuaderno de campo al terminar cada labor, no al final del mes.
  • Push y apagar, siempre en ese orden.

Anexo A. generar_datos.py

Modifica solo las líneas de codigo y nombre.

"""
generar_datos.py
Genera los datos PERSONALIZADOS de tu app a partir de tu código estudiantil.
Asignatura: Estadística Aplicada con Python y R · Ingeniería Agrícola · Unisucre
NO modifiques nada, excepto las dos líneas marcadas con  <--
"""
import hashlib   # para calcular la "huella" única de tus datos
import json      # para guardar los metadatos
from pathlib import Path

import numpy as np
import pandas as pd

# ------------------------------------------------------------------
# 0. Tus datos de identificación (ÚNICAS líneas que modificas)
# ------------------------------------------------------------------
codigo = "XXXXXXXXXX"            # <-- tu código estudiantil completo, entre comillas
nombre = "Nombre Apellido"       # <-- tus nombres y apellidos

semilla = int(codigo) % 2**32            # la semilla depende de tu código
rng = np.random.default_rng(semilla)     # generador de números aleatorios
Path("datos").mkdir(exist_ok=True)       # carpeta donde se guardan los CSV

# ------------------------------------------------------------------
# 1. Escenario asignado: cultivo y municipio
# ------------------------------------------------------------------
cultivos = {  # cultivo: (rendimiento base en t/ha, escala de variación)
    "Maíz": (4.5, 1.0), "Arroz": (5.5, 0.9), "Yuca": (18.0, 3.5),
    "Ñame": (14.0, 3.0), "Ajonjolí": (0.9, 0.2), "Plátano": (12.0, 2.5),
    "Frijol": (1.4, 0.3), "Sorgo": (3.8, 0.8)}
cultivo = list(cultivos)[semilla % len(cultivos)]
base, esc = cultivos[cultivo]
municipio = ["Sincelejo", "Corozal", "Sampués", "Los Palmitos",
             "San Marcos", "Majagual", "Tolú", "Ovejas"][(semilla // 8) % 8]

# ------------------------------------------------------------------
# 2. parcelas.csv: una fila por parcela (para EDA y, luego, regresión)
# ------------------------------------------------------------------
n = 80 + semilla % 41                                   # entre 80 y 120 parcelas
suelo = rng.choice(["Franco", "Arcilloso", "Arenoso"], n, p=[0.45, 0.35, 0.20])
riego = rng.choice(["Sí", "No"], n, p=[0.4, 0.6])
dosis_N = rng.uniform(0, 180, n).round(0)               # kg/ha de nitrógeno
lamina = np.where(riego == "Sí", rng.uniform(250, 600, n),
                  rng.uniform(100, 350, n)).round(0)    # mm de agua recibida
mo = rng.normal(2.5, 0.8, n).clip(0.5, 5.0).round(2)    # materia orgánica (%)
ph = rng.normal(6.2, 0.5, n).clip(4.8, 7.8).round(2)    # pH del suelo
efecto_suelo = {"Franco": 0.25, "Arcilloso": 0.0, "Arenoso": -0.30}
rend = (base
        + esc * (0.9 * dosis_N / 180 + 0.8 * (lamina - 100) / 500 + 0.20 * (mo - 2.5))
        - esc * 0.6 * (ph - 6.3) ** 2
        + esc * np.vectorize(efecto_suelo.get)(suelo)
        + rng.normal(0, 0.45 * esc, n))
rend = np.clip(rend, 0.2 * base, None)
atipicos = rng.choice(n, 2, replace=False)               # 2 parcelas atípicas
rend[atipicos[0]] *= 1.9                                  # una muy alta
rend[atipicos[1]] *= 0.35                                 # una muy baja (plaga)
mo_con_faltantes = mo.astype(float)
mo_con_faltantes[rng.choice(n, 3 + semilla % 4, replace=False)] = np.nan  # datos faltantes

parcelas = pd.DataFrame({
    "parcela": [f"P{i:03d}" for i in range(1, n + 1)],
    "suelo": suelo, "riego": riego,
    "dosis_N": dosis_N, "lamina_riego": lamina,
    "materia_organica": mo_con_faltantes, "ph": ph,
    "rendimiento": rend.round(2)})
parcelas.to_csv("datos/parcelas.csv", index=False)

# ------------------------------------------------------------------
# 3. clima_mensual.csv: serie mensual 2015-2025 (para series de tiempo al final)
# ------------------------------------------------------------------
fechas = pd.date_range("2015-01-01", "2025-12-01", freq="MS")
mes = fechas.month.values
t = np.arange(len(fechas))
# régimen bimodal del Caribe: lluvias en abril-mayo y septiembre-noviembre
patron = np.array([15, 20, 45, 110, 160, 110, 90, 120, 160, 190, 130, 45])
precip = (patron[mes - 1] * rng.uniform(0.85, 1.15)
          * rng.lognormal(0, 0.30, len(t))).round(1)
temp = (27.5 + 0.012 * t + 0.9 * np.cos(2 * np.pi * (mes - 3) / 12)
        + rng.normal(0, 0.35, len(t))).round(2)
pd.DataFrame({"fecha": fechas.strftime("%Y-%m-%d"),
              "precipitacion_mm": precip,
              "temperatura_c": temp}).to_csv("datos/clima_mensual.csv", index=False)

# ------------------------------------------------------------------
# 4. muestra10.csv: 10 parcelas para el cálculo A MANO (Lápiz y Algoritmo)
# ------------------------------------------------------------------
sin_atipicos = parcelas.drop(index=atipicos)
muestra10 = sin_atipicos.sample(9, random_state=semilla % 10_000)
muestra10 = pd.concat([muestra10, parcelas.loc[[atipicos[0]]]])  # incluye 1 atípico
muestra10 = muestra10[["parcela", "suelo", "riego", "rendimiento"]].sort_values("parcela")
muestra10.to_csv("datos/muestra10.csv", index=False)

# ------------------------------------------------------------------
# 5. Huella y metadatos
# ------------------------------------------------------------------
huella = hashlib.md5(f"{codigo}|{n}|{parcelas['rendimiento'].sum():.2f}".encode()
                     ).hexdigest()[:8].upper()
meta = {"codigo": codigo, "nombre": nombre, "cultivo": cultivo,
        "municipio": municipio, "n_parcelas": int(n), "huella": huella}
Path("datos/metadatos.json").write_text(json.dumps(meta, ensure_ascii=False, indent=2),
                                        encoding="utf-8")

print(f"Estudiante: {nombre} | Código: {codigo} | Huella: {huella}")
print(f"Cultivo: {cultivo} | Municipio: {municipio} | Parcelas: {n}")
print("\nMuestra de 10 parcelas para tu cálculo a mano:")
print(muestra10.to_string(index=False))

Qué contiene cada archivo y para qué se usará en el semestre:

Archivo Contenido Se usa en
parcelas.csv 80–120 parcelas con suelo, riego, dosis de N, lámina de riego, materia orgánica, pH y rendimiento EDA (hoy) y regresión simple y múltiple (próximas actividades)
clima_mensual.csv Precipitación y temperatura mensual 2015–2025 Series de tiempo (final del semestre)
muestra10.csv 10 parcelas (incluye un atípico) Lápiz y Algoritmo de hoy
metadatos.json Nombre, código, cultivo, municipio, huella Página de Inicio de la app

Anexo B. Scripts de verificación y tabla de resultados

verificacion/verificar_muestra.py

# verificar_muestra.py — Fase 2 del Lápiz y Algoritmo (verificación con Python)
# Ejecuta desde la raíz del repositorio:  .venv/bin/python verificacion/verificar_muestra.py
import pandas as pd

m = pd.read_csv("datos/muestra10.csv")      # 1. Leer las 10 parcelas asignadas
y = m["rendimiento"]                         # 2. Variable de interés (t/ha)

media = y.mean()                             # 3. Media aritmética
mediana = y.median()                         # 4. Mediana
var = y.var(ddof=1)                          # 5. Varianza muestral (divide entre n-1)
de = y.std(ddof=1)                           # 6. Desviación estándar muestral
cv = 100 * de / media                        # 7. Coeficiente de variación (%)
q1, q3 = y.quantile([0.25, 0.75])            # 8. Cuartiles (método tipo 7, igual que R)
ric = q3 - q1                                # 9. Rango intercuartílico
li, ls = q1 - 1.5 * ric, q3 + 1.5 * ric      # 10. Límites (vallas) de Tukey
atipicos = m.loc[(y < li) | (y > ls), "parcela"].tolist()

print(f"n = {len(y)}  media = {media:.3f}  mediana = {mediana:.3f}")
print(f"varianza = {var:.4f}  desv. est. = {de:.4f}  CV = {cv:.2f} %")
print(f"Q1 = {q1:.4f}  Q3 = {q3:.4f}  RIC = {ric:.4f}")
print(f"Límite inferior = {li:.4f}  Límite superior = {ls:.4f}  Atípicos: {atipicos}")
print("\nMedia por riego:")
print(m.groupby("riego")["rendimiento"].mean().round(3))   # 11. Media por grupo

verificacion/verificar_muestra.R (ejecutar en Posit Cloud)

# verificar_muestra.R — Fase 2 del Lápiz y Algoritmo (verificación con R)
# En Posit Cloud: sube datos/muestra10.csv al proyecto y ejecuta este script.
m <- read.csv("muestra10.csv")              # 1. Leer las 10 parcelas asignadas
y <- m$rendimiento                           # 2. Variable de interés (t/ha)

media    <- mean(y)                          # 3. Media
mediana  <- median(y)                        # 4. Mediana
varianza <- var(y)                           # 5. Varianza muestral (n-1)
de       <- sd(y)                            # 6. Desviación estándar
cv       <- 100 * de / media                 # 7. CV (%)
q        <- quantile(y, c(0.25, 0.75), type = 7)  # 8. Cuartiles tipo 7
ric      <- q[2] - q[1]                      # 9. Rango intercuartílico
li <- q[1] - 1.5 * ric; ls <- q[2] + 1.5 * ric   # 10. Vallas de Tukey

cat("n =", length(y), " media =", round(media, 3), " mediana =", round(mediana, 3), "\n")
cat("varianza =", round(varianza, 4), " desv. est. =", round(de, 4), " CV =", round(cv, 2), "%\n")
cat("Q1 =", round(q[1], 4), " Q3 =", round(q[2], 4), " RIC =", round(ric, 4), "\n")
cat("Lím. inf. =", round(li, 4), " Lím. sup. =", round(ls, 4), "\n")
cat("Atípicos:", m$parcela[y < li | y > ls], "\n")
print(tapply(y, m$riego, mean))              # 11. Media por riego
boxplot(y, horizontal = TRUE, main = "Rendimiento (t/ha) - muestra de 10 parcelas")

verificacion/RESULTADOS.md (plantilla)

# Verificación del Lápiz y Algoritmo — Muestra de 10 parcelas

| Medida              | A mano | Python | R    | ¿Coincide? |
|---------------------|--------|--------|------|------------|
| Media (t/ha)        |        |        |      |            |
| Mediana (t/ha)      |        |        |      |            |
| Varianza            |        |        |      |            |
| Desv. estándar      |        |        |      |            |
| CV (%)              |        |        |      |            |
| Q1                  |        |        |      |            |
| Q3                  |        |        |      |            |
| RIC                 |        |        |      |            |
| Límite inferior     |        |        |      |            |
| Límite superior     |        |        |      |            |
| Parcela(s) atípica(s)|       |        |      |            |
| Media riego "Sí"    |        |        |      |            |
| Media riego "No"    |        |        |      |            |

## ¿Se cumplió mi predicción previa?
(2–3 líneas)

## Diferencias encontradas y su causa
(si no hubo, escribe "Ninguna, solo redondeo")

Anexo C. Plantilla del README.md

# App de Estadística Aplicada con Python y R — Ingeniería Agrícola (Unisucre)

**Estudiante:** Nombres y apellidos
**Código:** XXXXXXXXXX  ·  **Grupo:** 1 / 2
**Cultivo asignado:** ______  ·  **Municipio:** ______  ·  **Huella:** ________
**Docente:** Justo Fuentes  ·  **Semestre:** 2026-2

## Descripción
App de Streamlit para el análisis estadístico de parcelas agrícolas.
Páginas: Inicio · Datos · EDA · Regresión (próximamente) · Series de tiempo (próximamente).

## Cómo ejecutarla
1. Abrir el repositorio en un Codespace.
2. `python -m venv .venv && .venv/bin/pip install -r requirements.txt`
3. `.venv/bin/streamlit run app.py`

## Hallazgos del EDA
(6–10 líneas escritas por ti, con cifras y unidades)

Anexo D. Plantilla de BITACORA_IA.md

# Bitácora de uso de IA

**Herramienta:** GitHub Copilot (modo Agent) · **Modelo mostrado en el chat:** ______

## Prompt 1 — Entorno virtual, .gitignore y requirements.txt
- Prompt usado (texto exacto):
- Comandos que aprobé:
- Comandos o cambios que rechacé o corregí, y por qué:

## Prompt 2 — App de Streamlit
- Prompt usado (texto exacto):
- ¿Funcionó al primer intento? ¿Qué errores aparecieron y cómo se corrigieron?
- ¿Coincidió la sección "Muestra de 10 parcelas" con mi cálculo a mano?

## Prompt 3 — Actualización del repositorio
- Prompt usado (texto exacto):
- Commits que creó el agente:

## Reflexión (5–6 líneas)
- ¿Qué aprendí haciéndolo yo mismo que no habría aprendido si el agente lo hacía todo?
- ¿En qué se equivocó o podría equivocarse la IA?
- ¿Detuve el Codespace al terminar cada sesión? (Sí / No)