Manual: Sistema, Datos, IA

Examen final de 24 horas. Analítica de Datos con Inteligencia Artificial, Universidad de La Sabana.

Un modelo de dinámica de sistemas propio, análisis de datos de sus variables clave y dos empleados IA con gobernanza. 110 modelos, un dataset común. Viernes 13 de noviembre 7:00 pm a sábado 14 de noviembre 7:00 pm, entrega única al cierre.

Versión 1, 2026-11-09. Un solo archivo; funciona sin internet y se puede imprimir.

Cómo usar este manual

Este manual reúne, en un solo archivo, todo el examen "Sistema, Datos, IA": el diseño para el profesor, el enunciado para el estudiante, una ficha de ejemplo, las plantillas de los empleados IA, la guía permanente y los anexos técnicos.

Si eres Lee primero Luego
Profesor Parte 1 (diseño, lista de chequeo, rúbrica) Anexos A y B (especificación y consenso MAGI-3)
Estudiante Parte 2 (el examen) y tu ficha Exxx Parte 4 (plantillas IA) y Parte 6 (guía permanente)
Cualquiera, en 5 años Parte 6 (guía permanente) La tarjeta de transferencia al final

Los archivos que no caben en un manual (modelos .stmx, datos_Exxx.csv, ingesta_Exxx.py, el dashboard, los scripts) están en el kit común y en la carpeta de cada estudiante. Aquí se explican; allá se usan.

Parte 1. Para el profesor

1.1 Qué es este examen

Tres pilares. En el centro, un modelo de dinámica de sistemas propio, dado al 69 % a 76 %, que el estudiante dibuja completo a mano y luego termina en una página HTML con solo nodos y arcos. A la izquierda, el análisis de datos: ingesta del dataset público a un DuckDB local con un script, y un dashboard en HTML, CSS y JS conectado a esa base con las estadísticas de sus variables clave (media, mediana, desviación estándar) y dos insights con su conclusión. A la derecha, dos empleados digitales (IA), uno por problemática (insight): prompt con rails y harness, hoja de vida y marco de gobierno de IA con riesgos AIR 2024.

Un solo dataset público común (datos.gov.co, casos COVID-19, agregado por día, departamento, sexo y grupo de edad) alimenta 110 modelos distintos: 11 familias (patrones reutilizables) por 10 territorios, con 3 variantes de tareas por familia.

1.2 Meta principal

  1. Que todos terminen: cada pilar vale un tercio y la nota es el promedio, solo necesitan Python en el computador, como en clase (el script instala DuckDB solo), y todo lo demás corre en el navegador; CSV de datos en cada carpeta; modelo que corre apenas se llenan las casillas; plan con reloj y sueño; se califica lo que llegue al cierre, aunque esté incompleto.
  2. Que se queden con una guía para siempre: enmarcar problemas con dinámica de sistemas, analizar datos que se puedan defender, y desarrollar, diseñar y gobernar IAs como co-inteligencia, co-socio y co-entidad.
  3. Que pasen por los seis actos: ingestar, completar el modelo, analizar, mostrar en dashboard, encontrar dos insights, diseñar dos empleados IA.

1.3 Lo que recibe cada estudiante

Archivo Qué es
Exxx-modelo.html Su modelo en una página web: nodos y arcos con signo, casillas ? y un nodo por agregar. Se completa después de dibujarlo a mano
ingesta_Exxx.py Script de ingesta (solo biblioteca estándar y duckdb): descarga el dataset de datos.gov.co, crea examen_Exxx.duckdb, limpia, arma la vista de su territorio, exporta mi_territorio_Exxx.csv, crea dashboard_Exxx.html con los datos adentro y escribe la evidencia sql_Exxx.txt
duckdb_Exxx.sql El mismo proceso en bloques SQL con las mismas rutas (plan B: DuckDB local o shell.duckdb.org)
dashboard_plantilla.html Copia de la plantilla del dashboard; sirve si el estudiante no corre el script
Exxx-ficha.md Panel de control, historia del sistema, ciclos, tareas con 3 niveles de pista, SQL, chequeos de aceptación
vista_Exxx_duckdb.sql La receta SQL de la vista de su territorio (solo lectura)
datos_Exxx.csv Respaldo (plan C): 731 días x 23 columnas (t, fecha y 21 variables) de su territorio, derivadas de datos.gov.co; mismo contenido que mi_territorio_Exxx.csv
Kit común Enunciado, guía, plantilla de empleado IA, dashboard, tarjeta AIR 2024, ejemplo resuelto

1.4 Cómo se califica

La rúbrica (sección 1.6) es una lista de sí o no por ítem. El dibujo a mano se califica contra el diagrama de la clave. Para el resto del Pilar 1, grade_model.py toma el modelo_Exxx.html completado por el estudiante, le inyecta los datos de la clave y compara cada nodo oculto con la clave: nRMSE menor que 0.15, pico a menos de 14 días, y un detector de constantes. Para el Pilar 2, las estadísticas se recalculan desde el salidas_Exxx.csv del propio estudiante con tolerancia de 0.5 %. Para el Pilar 3 se verifican las 5 anclas, la prueba en vivo, la tabla de disparadores, los metadatos y los 3 riesgos AIR 2024 con su mitigación. Dos puertas: bitácora de IA ausente, 5 puntos menos; llave de API en el ZIP, 5 puntos menos.

1.5 Decisiones que siguen abiertas

  1. Ruta de licencia de Stella: escritorio con Import Data, o pegar la serie en la función gráfica.
  2. PostgreSQL obligatorio o bonus (versión actual: DuckDB obligatorio, PostgreSQL bonus).
  3. URL donde se publica covid_diario.csv y su sha256 (reemplazar los marcadores en el enunciado).
  4. Probar un Exxx-modelo.html en Chrome, Edge y Safari antes del examen: Cargar datos, Correr, Exportar, Descargar.

1.6 Rúbrica

Rúbrica. Sistema, Datos, IA

Examen de 24 horas. Analítica de Datos con Inteligencia Artificial. Nota final = promedio simple de los tres pilares. Cada pilar vale un tercio (1/3), sin importar cuántas líneas tenga. Dentro de cada pilar, cada línea es binaria: se cumple o no se cumple. Cada línea tiene un "peso dentro del pilar". Nota del pilar = suma de pesos logrados / suma de pesos del pilar, en porcentaje o sobre 5.0. Las compuertas no suman. Si fallan, bajan la nota del pilar indicado.

Versión de la rúbrica: v4. Tres pilares, un tercio cada uno. DuckDB local como en clase; el resto pasa en el navegador. Los empleados IA se entregan como HTML descargados de empleado_ia_plantilla.html. El empleado IA 1 pesa 20 y el 2 pesa 15 dentro del pilar.

Resumen por pilar

Pilar Peso en la nota Suma de pesos internos
1. Modelo 1/3 25
2. Datos 1/3 40
3. Empleados IA 1/3 35

Nota final = (nota Pilar 1 + nota Pilar 2 + nota Pilar 3) / 3.


Pilar 1. Modelo (un tercio de la nota)

1a. Dibujo a mano completo y correcto (peso 8 de 25 del pilar).

Sí/No Criterio Peso
[ ] modelo_mano_Exxx.jpg (o .jpeg, .png, .pdf) está en el zip y la foto es legible: se lee cada nombre 1
[ ] Están todos los nodos de la clave, incluido el que faltaba, con su forma: caja, tubo con válvula, círculo 3
[ ] Los arcos coinciden con la clave y llevan su signo + o - correcto 1
[ ] Cada ciclo está marcado con su nombre y su letra R o B correcta 1
[ ] Hay 5 frases que describen cómo funciona el sistema, en palabras propias (en la foto o en insights_Exxx.txt) 2

Nota: el profesor califica la foto contra el diagrama de la clave (Exxx-clave.md). Sin foto, 1a = 0 y no se califica el Pilar 2 hasta recibirla.

1b. El HTML corre (peso 10 de 25 del pilar).

Sí/No Criterio Peso
[ ] modelo_Exxx.html está en el zip y no tiene ninguna fórmula vacía (grade_model.py lee el modelo embebido) 3
[ ] El nodo nuevo existe con sus entradas y su fórmula; la constante PROVISIONAL ya no está en los vecinos 3
[ ] Corre de t = 0 a t = 730 sin NaN con los datos de la clave trasplantados; las casillas coinciden con la clave (nRMSE menor que 0.15) 4

Nota: el nivel de pista usado (1, 2 o 3) se anota en insights_Exxx.txt. Es informativo. No cambia la nota.

1c. Chequeos de aceptación pasan (peso 4 de 25 del pilar).

Sí/No Criterio Peso
[ ] Chequeo de pico: el día del pico está dentro de ±14 días del de la clave 2
[ ] Chequeo de valor final o mínimo: dentro de la banda de la ficha 2

1d. Un ciclo explicado en palabras con un número (peso 3 de 25 del pilar).

Sí/No Criterio Peso
[ ] Usa la frase fija con X e Y que son nodos reales del modelo 1
[ ] La letra R o B es la correcta para ese ciclo 1
[ ] Incluye 1 número con unidad tomado de la corrida o del dato 1

Pilar 2. Datos (un tercio de la nota)

2a. Ingesta a DuckDB local con evidencia (peso 5 de 40 del pilar).

Sí/No Criterio Peso
[ ] sql_Exxx.txt (generado por ingesta_Exxx.py o escrito a mano) reporta 252,677 filas y 6,388,216 casos de la tabla covid_diario en la base local 2
[ ] Nombra la vista v_territorio_X y trae 3 números del resumen (días = 731, casos del territorio, casos_7d promedio) que coinciden con mi_territorio_Exxx.csv o datos_Exxx.csv 3

Nota: si sql_Exxx.txt falta, 2a = 0. Sin otra penalización. mi_territorio_Exxx.csv y datos_Exxx.csv traen los mismos números.

2b. Estadísticas de 5 variables (peso 10 de 40 del pilar).

Sí/No Criterio Peso
[ ] dashboard_Exxx.html muestra 5 o más variables; al menos 1 es real, de datos_Exxx.csv 2
[ ] Media de cada variable dentro del 0.5 % del recálculo sobre el CSV cargado 2
[ ] Mediana de cada variable dentro del 0.5 % 2
[ ] Moda de cada variable coincide con el recálculo (o dice "sin moda" cuando ningún valor se repite) 1
[ ] Desviación estándar muestral de cada variable dentro del 0.5 % 2
[ ] Coeficiente de variación de cada variable, o "no aplica" si min < 0 o media = 0 1

Nota: la plantilla calcula los números. Lo importante es elegir 5 variables válidas y no romper el cálculo.

2c. Histogramas (peso 5 de 40 del pilar).

Sí/No Criterio Peso
[ ] Hay un histograma por variable, 5 o más, visibles en el dashboard 3
[ ] Cada histograma tiene título con la variable y su unidad, y ejes legibles 2

2d. Lecturas DATO/JUICIO (peso 5 de 40 del pilar).

Sí/No Criterio Peso
[ ] Hay 1 lectura DATO y 1 lectura JUICIO por variable, marcadas 3
[ ] Las frases DATO contienen un número con unidad; las JUICIO dan una interpretación del histograma o de las estadísticas 2

2e. Hechos e insights (peso 10 de 40 del pilar).

Sí/No Criterio Peso
[ ] 3 hechos (información) con un número cada uno, tomado del dashboard o de la corrida 3
[ ] Insight 1 nace de un ciclo del modelo, usa la frase fija con la letra R o B correcta y tiene 1 número con unidad 2
[ ] Insight 2 nace de una variable, dice algo que los datos muestran y tiene 1 número con unidad 2
[ ] Cada insight define un empleado IA con arquetipo 1
[ ] Cada insight dice la problemática o situación encontrada y qué hacer para mejorar el sistema, en 1 frase concreta 2

2f. Tarjeta de transferencia (peso 5 de 40 del pilar).

Sí/No Criterio Peso
[ ] transferencia.txt (o .md) tiene 5 frases sobre un problema de comunicación que no es COVID 1
[ ] Nombra los stocks 1
[ ] Nombra 1 ciclo con la frase fija y la letra R o B 1
[ ] Nombra 1 fuente de datos concreta 1
[ ] Nombra 1 empleado IA con arquetipo 1

Nota: texto copiado de la ficha o idéntico entre estudiantes vale 0.


Pilar 3. Empleados IA (un tercio de la nota)

Cada empleado es un HTML descargado de empleado_ia_plantilla.html. Lleva el documento visible y un <script id="gov" type="application/json"> con los datos. Hay dos empleados IA, uno por problemática (insight). El empleado IA 1 (empleado_ia1_Exxx.html) vale 20. El empleado IA 2 (empleado_ia2_Exxx.html) vale 15 con los mismos criterios agrupados.

Empleado IA 1 (peso 20 de 35 del pilar)

3a. Prompt con rails y harness (peso 7 de 35 del pilar).

Sí/No Criterio Peso
[ ] Identidad y misión: la misión cita 1 número del dashboard y el ciclo con su letra R o B 1
[ ] Entradas (vista o CSV y nodo), pasos (máximo 5) y salidas con formato fijo 1
[ ] Rails G1 a G3 presentes; uno nace del ciclo y lo nombra 1
[ ] Rechazos R0 y R1 fijos (sin consejo médico individual; sin celda con n < 5) y R2 nacido del ciclo 1
[ ] Entrega a humano, 1 ejemplo normal y 1 ejemplo de rechazo 1
[ ] Harness: disparador, formato de entrada, formato de salida y 3 pruebas 1
[ ] Harness: registro, interruptor de apagado y costo 1

3b. Hoja de vida (peso 4 de 35 del pilar).

Sí/No Criterio Peso
[ ] Día a día de lunes a viernes con disparador, entrada, acción, salida y quién revisa 2
[ ] Incluye 1 día de espera (sin disparo) y 1 día de incidente con paso a un humano 1
[ ] Habilidades con herramienta, competencias, limitaciones, supervisor y KPIs 1

3c. Riesgos AIR 2024 (peso 3 de 35 del pilar).

Sí/No Criterio Peso
[ ] 3 o más riesgos, cada uno con su cadena AIR 2024 L1 → L2 → L3 1
[ ] Cada riesgo tiene nivel ALTO, MEDIO o BAJO y dice qué puede salir mal 1
[ ] Cada riesgo dice cómo lo evitamos y apunta a un rail G o a un rechazo R del prompt 1

3d. Políticas (peso 2 de 35 del pilar).

Sí/No Criterio Peso
[ ] Hay una política por riesgo 1
[ ] Cada política tiene hacer, no hacer y recordar 1

3e. Procesos con flujo (peso 3 de 35 del pilar).

Sí/No Criterio Peso
[ ] 3 o más procesos, cada uno con quién, inicio y fin 1
[ ] Cada proceso tiene pasos y al menos 1 pregunta sí/no con su salida "no" 1
[ ] El diagrama de flujo se ve dibujado en la página 1

3f. Protocolo de contención (peso 1 de 35 del pilar).

Sí/No Criterio Peso
[ ] SEV-1, SEV-2 y SEV-3 con tiempo de respuesta, y los 7 pasos: Parar, Contener, Deshacer, Buscar, Avisar, Arreglar, Aprender 1
Empleado IA 2 (peso 15 de 35 del pilar)

3g. Prompt y harness (peso 5 de 35 del pilar).

Sí/No Criterio Peso
[ ] Identidad, misión con número y ciclo, entradas, pasos y salidas 1
[ ] Rails G1 a G3; uno nace del ciclo 1
[ ] Rechazos R0 y R1 fijos y R2 del ciclo 1
[ ] Entrega a humano y 2 ejemplos (normal y rechazo) 1
[ ] Harness completo: disparador, formatos, 3 pruebas, registro, interruptor, costo 1

3h. Hoja de vida (peso 3 de 35 del pilar).

Sí/No Criterio Peso
[ ] Día a día de lunes a viernes con las 5 columnas 2
[ ] Incluye 1 día de espera y 1 día de incidente 1

3i. Riesgos AIR 2024 (peso 2 de 35 del pilar).

Sí/No Criterio Peso
[ ] 3 o más riesgos con cadena L1 → L2 → L3 1
[ ] Cada riesgo con nivel, qué puede salir mal y cómo lo evitamos 1

3j. Políticas (peso 2 de 35 del pilar).

Sí/No Criterio Peso
[ ] Hay una política por riesgo 1
[ ] Cada política tiene hacer, no hacer y recordar 1

3k. Procesos con flujo (peso 2 de 35 del pilar).

Sí/No Criterio Peso
[ ] 3 o más procesos con pasos 1
[ ] Cada proceso tiene 1 pregunta sí/no y el flujo se ve dibujado 1

3l. Protocolo de contención (peso 1 de 35 del pilar).

Sí/No Criterio Peso
[ ] SEV-1, SEV-2 y SEV-3 con tiempo, y los 7 pasos 1

Compuertas (no suman, bajan la nota)

Sí/No Compuerta Efecto
[ ] bitacora_ia.txt (o .md) existe con 1 a 5 entradas. Cada entrada tiene 5 campos: prompt resumido; error del modelo; qué cambié; entregable afectado; modelo usado Si falta: la nota del Pilar 3 baja 10 %
[ ] Ningún archivo del zip contiene sk-ant ni AIza Si hay llave: la nota del Pilar 3 baja 10 %
[ ] modelo_mano_Exxx.jpg (o .jpeg, .png, .pdf) está en el zip Si falta: 1a = 0 y no se califica el Pilar 2 (datos)

Notas del calificador: verificaciones automáticas

Entrega. El estudiante envía por correo EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip. El calificador descomprime cada zip y corre herramientas_profesor/verificar_entrega.py dentro de la carpeta. La entrega es única: sábado 14 de noviembre, 7:00 pm. Se califica lo que llegue antes de esa hora, aunque esté incompleto.

Foto del dibujo (1a). El profesor abre modelo_mano_Exxx.jpg junto al diagrama de la clave (Exxx-clave.md). Marca las 5 líneas de 1a a mano, incluidos los signos de los arcos. Si la foto falta, 1a = 0 y el Pilar 2 queda sin calificar hasta recibirla.

grade_model.py (1b y 1c). Se invoca como grade_model.py --student modelo_Exxx.html. Lee el modelo embebido en el HTML (<script id="spec" type="application/json">).

  1. Lista las fórmulas vacías del modelo embebido. Si hay alguna, 1b línea 1 = no.
  2. Trasplanta los datos de la clave (731 filas) en los nodos d_ del estudiante. Así el modelo se califica sin depender del CSV del estudiante.
  3. Corre de t = 0 a t = 730, dt = 1, Euler. Si hay NaN, 1b línea 3 = no.
  4. Compara cada variable oculta con la clave: nRMSE < 0.15 = sí.
  5. Día del pico de la variable de chequeo: ±14 días respecto a la clave.
  6. Detector de constantes: si el nodo nuevo falta o sus vecinos siguen con la constante PROVISIONAL, 1b línea 2 = no.
  7. Imprime una fila por criterio: Exxx, 1b.1, si/no.

Ingesta a DuckDB local (2a). Se leen los 3 números de sql_Exxx.txt y se buscan en mi_territorio_Exxx.csv o datos_Exxx.csv del estudiante (misma fila t). Los conteos deben ser 252,677 y 6,388,216.

Estadísticas (2b).

  1. Se abre dashboard_Exxx.html y se leen las 5 variables elegidas y sus 5 números.
  2. Se recalculan media, mediana, moda, stddev_samp y CV desde datos_Exxx.csv o salidas_Exxx.csv, según el origen de cada variable.
  3. Tolerancia: 0.5 % relativo. Para valores cuya media es 0, tolerancia absoluta 0.001.
  4. La plantilla calcula; el error típico es cargar un CSV equivocado o una variable con texto.

Empleados IA (3a a 3l). herramientas_profesor/verificar_entrega.py lee <script id="gov" type="application/json"> de cada empleado_ia*_Exxx.html: JSON no nulo, riesgos con 3 o más entradas, procesos con 3 o más. El resto se califica a mano sobre el documento visible, con las listas de arriba.

Secretos (compuerta). grep -rE "sk-ant|AIza" Exxx/. Cualquier coincidencia baja 10 % la nota del Pilar 3.

Originalidad. Comparación por pares de transferencia.txt y de los prompts (campo prompt del JSON gov) entre los 110 zip. Similitud alta se revisa a mano.

1.7 Lista de chequeo del profesor

Checklist del profesor. Sistema, Datos, IA

Examen de 24 horas. 110 estudiantes. Inicio viernes 13 de noviembre 19:00, cierre sábado 14 de noviembre 19:00. Entrega única al cierre. Marca cada línea. Si una línea falla, la columna "Si falla" dice qué hacer. Los estudiantes solo necesitan Python en su computador, como en clase. El script de ingesta instala DuckDB por sí solo. Todo lo demás pasa en el navegador.

A. La noche anterior (60 minutos)

Hecho Tarea Si falla
[ ] Publicar covid_diario.csv en https://class.audience-analysis.com/analitica-examen/covid_diario.csv con CORS abierto (Access-Control-Allow-Origin: *) El script ingesta_Exxx.py descarga el CSV de esa URL. Sin el archivo publicado, nadie puede hacer la ingesta. Sin CORS, el plan B en shell.duckdb.org tampoco lee el CSV. Es la primera tarea
[ ] Publicar dashboard_plantilla.html en https://class.audience-analysis.com/analitica-examen/dashboard_plantilla.html El script la descarga si falta la copia local. Sin ella, el estudiante que borró su copia no recibe dashboard_Exxx.html
[ ] Correr python ingesta_E003.py en una copia de la carpeta E003, con un Python que tenga duckdb. Debe imprimir 252,677 filas y 6,388,216 casos, y 731 días (coincide). Deben aparecer examen_E003.duckdb, mi_territorio_E003.csv, dashboard_E003.html y sql_E003.txt Si falla, revisa la URL, el sha256, la versión de Python y el generador del script. Anuncia el plan C: datos_Exxx.csv ya trae los números
[ ] Abrir dashboard_E003.html en el navegador. Debe decir "Leído (formato ancho): 731 filas, 21 variables" Si no lo dice, revisa el paso 5/6 del script y que dashboard_plantilla.html esté en la carpeta
[ ] Plan B: pegar los bloques de duckdb_E003.sql, uno por uno, en DuckDB local o en https://shell.duckdb.org/. El bloque 5 debe dar 731 días, 540,163 casos y casos_7d promedio 738.8 Si el SQL falla, corrige el generador antes de repartir. El bloque 6 (COPY a CSV) solo funciona en DuckDB local
[ ] Correr models/validate.py: 110 claves corren sin NaN, 110 páginas Exxx-modelo.html abren y muestran los signos de los arcos Retirar del sorteo el modelo que falle y asignar su set oculto vecino
[ ] Confirmar que asignacion.csv tiene 110 filas con código, familia, territorio y set oculto Sin asignación no se pueden repartir carpetas
[ ] Generar las 110 carpetas Exxx/ con 8 archivos: Exxx-modelo.html, Exxx-ficha.md, Exxx-ficha.html, ingesta_Exxx.py, duckdb_Exxx.sql, dashboard_plantilla.html, vista_Exxx_duckdb.sql, datos_Exxx.csv (t, fecha, 22 variables) ls Exxx/ debe mostrar los 8 archivos
[ ] Abrir un Exxx-modelo.html en Chrome, Edge y Safari: Cargar datos con su datos_Exxx.csv, Correr, cambiar un parámetro y volver a correr, Exportar salidas CSV, Descargar este HTML Si un navegador falla, anúncialo en la apertura y nombra los que sí sirven
[ ] Abrir estudiante/dashboard/dashboard_plantilla.html en los 3 navegadores: cargar mi_territorio_Exxx.csv, elegir 5 variables, ver media, mediana, moda, desviación, CV e histogramas, escribir una lectura, Descargar este HTML Si falla en uno, publica la lista de navegadores que sí sirven
[ ] Abrir estudiante/ia/empleado_ia_plantilla.html en los 3 navegadores: Cargar ejemplo, ver los 3 flujos dibujados, Descargar este HTML, abrir el archivo descargado Si el HTML descargado no abre, el Pilar 3 se cae. Revisa antes de repartir
[ ] Confirmar que el correo de recepción acepta adjuntos de hasta 25 MB La entrega única depende de esto. Si no, abre una carpeta compartida de respaldo

B. 30 minutos antes (18:30 a 19:00 del viernes)

Haz todo esto en un portátil Windows, no en tu máquina de desarrollo.

Hecho Tarea Si falla
[ ] Repetir la ingesta desde el portátil como la hace el estudiante: doble clic en ingesta_E003.py (si no abre la ventana negra: tecla Windows, cmd, Enter, py, espacio, arrastrar el archivo, Enter). Esperar el mensaje LISTO (1 a 3 minutos). Ver los dos números esperados y los 4 archivos creados, y que el tablero se abre solo en el navegador Si no corre, anuncia desde el inicio el plan B (bloques de duckdb_Exxx.sql) o el plan C: "usen datos_Exxx.csv, pierden solo el paso de ingesta (Paso 1)"
[ ] Abrir 1 Exxx-modelo.html, Cargar datos con mi_territorio_Exxx.csv, Correr. Debe mostrar 731 días, los signos de los arcos y los chequeos PASA/FALLA Si Cargar datos falla, anuncia el navegador que sí funciona
[ ] Verificar que la página corre con los ? llenos y sin el nodo faltante (insignia PROVISIONAL activa) Si no corre, lo que debe estar sí o sí se rompe. Revisa generate.py antes de abrir
[ ] Verificar que Descargar este HTML produce modelo_Exxx.html y que grade_model.py --student modelo_Exxx.html lo lee Si no lo lee, la calificación automática de 1b se cae
[ ] Abrir el dashboard, cargar un mi_territorio_Exxx.csv y un salidas_Exxx.csv, elegir 5 variables, descargar Si falla, publica la versión anterior de la plantilla
[ ] Abrir empleado_ia_plantilla.html, Cargar ejemplo, Descargar este HTML. Correr herramientas_profesor/verificar_entrega.py sobre una carpeta con ese archivo: debe leer el JSON gov Si no lo lee, la verificación del Pilar 3 se hace a mano
[ ] Verificar que estudiante/ia/ tiene: empleado_ia_plantilla.html, superprompt_plantilla.md, tarjeta_AIR2024.md, bitacora_ia_plantilla.md Sin la tarjeta AIR, los riesgos pierden sentido para todos
[ ] Publicar en el aula virtual: URL de datos, los pasos para correr ingesta_Exxx.py (Windows: doble clic; Mac: Terminal, python3, espacio, arrastrar el archivo, Enter) con los dos números esperados, EXAMEN.md, correo de entrega Los 4 van en un solo mensaje fijado

C. Apertura (19:00 a 19:30 del viernes)

Léelo en voz alta. Son 10 minutos. Proyecta EXAMEN.md.

Hecho Qué dices
[ ] Lee el plan de 24 horas completo, hora por hora, incluido el bloque de dormir
[ ] Di: "solo necesitan Python en su computador, como en clase; el script instala DuckDB solo y el resto pasa en el navegador"
[ ] Muestra dónde están las cajas "Si te atascas". Hay 1 por paso
[ ] Muestra las líneas "Ya es suficiente". Di: "cuando la lean, paren"
[ ] Di la regla de entrega: "entrega única el sábado 14 de noviembre a las 7:00 pm; se califica lo que llegue antes de esa hora, aunque esté incompleto"
[ ] Di: "cada pilar vale un tercio de la nota; la nota final es el promedio de los tres"
[ ] Di la regla de orden: "primero entender y dibujar el modelo con signos, después pasarlo al HTML, después los datos, al final los empleados IA"
[ ] Muestra cómo correr ingesta_Exxx.py (Windows: doble clic; Mac: Terminal, python3, espacio, arrastrar el archivo, Enter), espera el mensaje LISTO, y los dos números esperados: 252,677 y 6,388,216
[ ] Di los navegadores confirmados en B y que la foto modelo_mano_Exxx.jpg va dentro del zip
[ ] Di cómo se comprime: clic derecho, Comprimir (Mac) o Enviar a, Carpeta comprimida (Windows), y el nombre EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip
[ ] Lee la nota de contenido. Di que pueden escribirte en privado y que hay alternativa
[ ] Di los horarios de consulta y qué preguntas se responden

D. Durante el examen: horarios de consulta

Ventana Canal Para qué
19:00-19:30 viernes Presencial o videollamada Arranque: carpetas, página HTML del modelo, signos de los arcos
21:00-21:30 viernes Chat del aula Ingesta a DuckDB local (instalación, script, evidencia); dudas del dibujo a mano, los signos y la foto
08:00-08:30 sábado Chat del aula Página HTML: fórmulas, nodo nuevo, Cargar datos, chequeos, simular, exportar
11:00-11:30 sábado Chat del aula Dashboard: datos de la base, 5 variables, histogramas, lecturas
15:00-15:30 sábado Chat del aula Plantilla del empleado IA, flujos, descarga, bitácora
17:30-18:30 sábado Chat del aula Problemas al comprimir o enviar el zip

Fuera de estas ventanas no hay respuesta. Dilo en la apertura. Así nadie espera despierto.

Preguntas que sí se responden

  1. Herramienta que no abre o da error. Ejemplo: "la página no carga el CSV".
  2. Archivo que falta o nombre de archivo. Ejemplo: "¿insights_E042.txt o insights_E042.md? Los dos valen".
  3. Qué significa una instrucción de la guía. Ejemplo: "¿qué es la insignia PROVISIONAL?"
  4. Problemas para comprimir o enviar el zip.
  5. Nota de contenido, en privado.

Preguntas que no se responden

  1. La ecuación de un nodo. Respuesta fija: "usa la pista de nivel 3 de tu ficha".
  2. Si un insight está bien. Respuesta fija: "¿tiene un ciclo o una variable, un número y una acción? Entonces entrégalo".
  3. Qué variables elegir. Respuesta fija: "cinco que tengan números, al menos una real".
  4. Revisar un empleado IA antes de la entrega. Respuesta fija: "pulsa Cargar ejemplo y compara la forma".
  5. Extensiones de tiempo. Respuesta fija: "envía lo que tengas antes de las 19:00 del sábado; se califica".

Respuestas listas para los atascos más probables

Atasco Respuesta
El script dice que falta duckdb "El script lo instala por sí solo. Si no puede, corre el archivo otra vez. Si sigue fallando, usa el plan C."
El script no descarga el CSV "Revisa tu internet y corre el archivo otra vez. Si no, usa el plan B o datos_Exxx.csv. Pierdes solo el paso de ingesta (Paso 1)."
El SQL pegado da error (plan B) "Pega un bloque a la vez y espera a que termine. Revisa que el bloque termina con punto y coma."
El HTML no abre "Usa otro navegador: Chrome, Edge o Safari."
Cargar datos no funciona "Elige mi_territorio_Exxx.csv (o datos_Exxx.csv) de tu carpeta, no otro archivo. Prueba otro navegador."
No sabe si un ciclo es R o B "Cuenta los signos menos del ciclo. Par es R, impar es B."
La foto sale borrosa "Dibuja con marcador grueso. Foto desde arriba, con luz, sin sombra."
El modelo no corre "¿Queda algún ?. Si no, manda captura del error en la ventana de consulta."
No logra agregar el nodo "Déjalo con la constante PROVISIONAL. Exporta y descarga igual. Pierdes solo la línea del nodo nuevo en 1b."
El dashboard no guarda "Botón Descargar este HTML. Si no, Guardar como, página web completa, nombre dashboard_Exxx.html."
El flujo del proceso no se dibuja "Cada paso necesita texto y cada pregunta necesita su salida no."
El zip pesa mucho "Saca datos_Exxx.csv del zip. Ya lo tengo."

E. Nota de contenido: cómo atenderla

  1. Si un estudiante escribe en privado por el tema de fallecidos, responde el mismo día, en la ventana más cercana.
  2. Ofrece cambio de familia a una sin fallecidos en el mismo territorio: F1, F4, F5, F6, F7, F8, F10 o F11.
  3. Entrega la nueva carpeta Exxx/ por el canal privado. El código del estudiante no cambia.
  4. Si prefiere seguir, recuérdale que el Pilar 2 no exige la variable fallecidos.
  5. No pidas explicaciones. No lo anotes en ningún documento compartido.

F. Cierre y calificación (sábado 19:00 en adelante)

Hecho Tarea
[ ] Cerrar la recepción a las 19:00 del sábado. Descargar el zip de cada estudiante a una carpeta nueva y vacía
[ ] Descomprimir cada zip en su carpeta Exxx/. Correr herramientas_profesor/verificar_entrega.py dentro: lista OK/FALTA, casillas ?, JSON gov de los empleados, secretos
[ ] Correr el grep de secretos sobre todos: grep -rlE "sk-ant\|AIza". Anotar los códigos con coincidencia (el Pilar 3 baja 10 %)
[ ] Verificar que existe bitacora_ia.txt (o .md). Si falta, la nota del Pilar 3 baja 10 %
[ ] Correr grade_model.py --student modelo_Exxx.html sobre los 110 HTML. Guardar la tabla de si/no por criterio
[ ] Abrir cada modelo_mano_Exxx.jpg junto al diagrama de la clave y marcar 1a, incluidos los signos. Sin foto: 1a = 0 y el Pilar 2 espera
[ ] Leer sql_Exxx.txt (lo escribe el script; con el plan B lo escribe el estudiante): conteos 252,677 y 6,388,216, vista, fecha y hora, y los 3 números contra datos_Exxx.csv (2a, ingesta a DuckDB local con evidencia)
[ ] Abrir cada dashboard_Exxx.html: 5 variables, 5 estadísticas, histogramas, lecturas, hechos e insights con su conclusión: problemática, mejora y empleado IA (2b a 2e)
[ ] Abrir cada empleado_ia1_Exxx.html y empleado_ia2_Exxx.html: calificar 3a a 3l sobre el documento visible
[ ] Calificar a mano con RUBRICA.md: 1a, 1d, 2a, 2c, 2d, 2e, 2f y todo el Pilar 3
[ ] Comparar transferencia.txt y los prompts por pares. Revisar a mano los casos con similitud alta

Fuente de verdad de la rúbrica: rubrica/RUBRICA.md y rubrica/RUBRICA.csv. Rúbrica v4: tres pilares, un tercio de la nota cada uno; nota final = promedio de los tres. Líneas binarias con peso relativo dentro de cada pilar (suma interna P1 25, P2 40, P3 35, solo para el calificador, nunca se anuncia). Compuertas: sin bitácora de IA, la nota del Pilar 3 baja 10 %; una llave de API en el zip baja 10 % el Pilar 3; sin foto no se califica el Pilar 2. No hay camino mínimo.

Parte 2. El examen (enunciado del estudiante)

Sistema, Datos, IA

Examen final de 24 horas. Analítica de Datos con Inteligencia Artificial. Universidad de La Sabana.

Portada

Qué entregas, en una frase

Una carpeta comprimida con tu dibujo en foto, tu modelo corriendo, tu dashboard, 2 insights con su conclusión y 2 empleados IA, uno por problemática.

Qué vas a demostrar

  1. Que entiendes un modelo de Dinámica de Sistemas, lo dibujas y lo haces correr con datos reales.
  2. Que sabes ingestar datos reales en tu DuckDB local y conectarlos a un dashboard.
  3. Que sabes calcular media, mediana, moda, desviación y coeficiente de variación, y leer un histograma.
  4. Que sabes escribir 3 hechos y 2 insights con un número cada uno, y la conclusión de cada insight.
  5. Que sabes diseñar y gobernar 2 empleados IA, uno por problemática, con prompt, hoja de vida y marco de gobierno de IA.

Solo necesitas Python

Solo necesitas Python en tu computador, como en clase. El script de ingesta instala DuckDB por sí solo. Todo lo demás pasa en el navegador. Necesitas: Python, un navegador (Chrome, Edge o Safari), lápiz, papel, un celular para la foto y tu correo.

Nota de contenido

Los datos son los casos de COVID-19 en Colombia. Incluyen fallecidos. Si el tema te duele, el examen no te obliga a usar la variable fallecidos. Puedes decírselo al profesor en privado. Hay una alternativa lista.

Tres reglas que te cuidan

  1. El examen tiene tres pilares. Cada pilar vale un tercio de la nota. La nota final es el promedio de los tres.
  2. La entrega es única: sábado 14 de noviembre, 7:00 pm. Se califica lo que llegue antes de esa hora, aunque esté incompleto.
  3. Cada bloque tiene una línea "Ya es suficiente". Cuando la leas, para y sigue al siguiente bloque.

Panel de control

Llena esta tabla antes de empezar. Toma los datos de tu archivo Exxx-ficha.md. Ejemplo: si tu carpeta se llama E042, tu código es E042.

Campo Tu dato
Mi código E___
Mi territorio y su código ______________ (código __)
Mi familia (patrón) F__ ______________
Mi instancia COVID ______________
Mis ciclos (nombre y letra R o B) ____ (R/B), ____ (R/B)
Mi nodo por dibujar ______________
Mis 5 variables del dashboard Real (datos) o simulada (modelo) En ciclo sí/no
1. ______________
2. ______________
3. ______________
4. ______________
5. ______________

Archivos que recibes en tu carpeta Exxx/

Archivo Para qué sirve
Exxx-modelo.html Tu modelo en una página web, 70 % hecho. Se abre en el navegador
Exxx-ficha.md (y .html) Panel, historia del sistema, tareas con pistas, chequeos
ingesta_Exxx.py El script de ingesta. Crea tu base DuckDB local, tu CSV, tu dashboard y tu evidencia
duckdb_Exxx.sql El mismo proceso en bloques de SQL, con las mismas rutas. Es el plan B
dashboard_plantilla.html Copia de la plantilla del dashboard. Sirve si no corres el script
vista_Exxx_duckdb.sql La receta SQL de la vista de tu territorio. Solo lectura
datos_Exxx.csv Respaldo: los datos de tu territorio, 731 días, 21 variables, un día por fila

Herramientas comunes (kit común)

Archivo Para qué sirve
dashboard/dashboard_plantilla.html La plantilla del dashboard (también está en tu carpeta): estadísticas, histogramas, lecturas, hechos e insights
ia/empleado_ia_plantilla.html El formulario de cada empleado IA. Se llena y se descarga
ia/superprompt_plantilla.md Lectura corta: cómo escribir el prompt con rails y el harness
ia/tarjeta_AIR2024.md El catálogo de riesgos AIR 2024 en español
ia/bitacora_ia_plantilla.md La forma de tu bitácora de IA
guia/GUIA-PERMANENTE.md La guía que te queda: sistemas, datos, IA

Datos

Dato Valor
Archivo covid_diario.csv
Fuente datos.gov.co, conjunto gt2j-8ykr
Filas 252,677 filas
Casos 6,388,216 casos
URL https://class.audience-analysis.com/analitica-examen/covid_diario.csv

Tu plan de 24 horas

El examen empieza el viernes a las 19:00 y cierra el sábado a las 19:00. Sigue el reloj, no tu sensación de tiempo. Pon una alarma al inicio de cada bloque.

Hora Bloque Qué haces Pilar
Viernes 19:00-19:30 Bloque 0 Preparar: abrir carpeta, abrir Exxx-modelo.html, mirar el modelo y sus signos
19:30-21:00 Bloque 1 Ingesta a DuckDB local con ingesta_Exxx.py + mirar mi_territorio_Exxx.csv 2
21:00-23:00 Bloque 2 Dibujo a mano del modelo completo + 5 frases 1
23:30-07:00 Dormir 7 horas y media. Es parte del plan.
Sábado 07:00-08:30 Bloque 3 Pasar el dibujo al HTML: correr, chequeos, simular, exportar 1
08:30-10:30 Bloque 4 Dashboard conectado a tu base: 5 variables, estadísticas, histogramas, lecturas 2
10:30-12:00 Bloque 5 Entiende tu tablero: hechos, insights, conclusiones, transferencia 2
12:00-13:00 Almuerzo Comer lejos del computador
13:00-16:00 Bloque 6 Empleado IA 1 completo y empleado IA 2 + bitácora 3
16:30-18:30 Bloque 7 Revisar, comprimir, enviar
19:00 Entrega única y cierre Sábado 14 de noviembre, 7:00 pm. Se califica lo que llegue antes de esa hora, aunque esté incompleto

Los 3 pilares en un dibujo

+---------------------------+   +-----------------------------+   +---------------------------+
|  PILAR 1 (centro)         |   |  PILAR 2 (izquierda)        |   |  PILAR 3 (derecha)        |
|  Modelo de Dinámica       |-->|  Análisis de datos          |-->|  Dos empleados IA         |
|  de Sistemas  (un tercio) |   |  (un tercio)                |   |  (un tercio)              |
|                           |   |                             |   |                           |
|  nodos y arcos con signo  |   |  DuckDB local + ingesta     |   |  1 por problemática       |
|  dibujo a mano + HTML     |   |  5 variables: media,        |   |  hoja de vida             |
|  correr, chequeos,        |   |  mediana, moda, desviación, |   |  prompt con rails         |
|  simular, exportar        |   |  CV, histograma, lectura    |   |  harness                  |
|                           |   |  3 hechos + 2 insights      |   |  riesgos, políticas,      |
|                           |   |  dashboard HTML             |   |  procesos, contención     |
+---------------------------+   +-----------------------------+   +---------------------------+
       Bloques 0, 2 y 3               Bloques 1, 4 y 5                     Bloque 6

Regla de orden (obligatoria): modelo entendido y dibujado, luego datos, luego IA.

  1. Primero entiendes el modelo y lo dibujas completo a mano, con signos en los arcos (Pasos 0 y 2).
  2. Después pasas el dibujo al HTML y lo haces correr (Paso 3).
  3. Solo con la foto del dibujo y el HTML corriendo pasas al análisis de datos (Pasos 4 y 5).
  4. Solo después del análisis pasas a los empleados IA (Paso 6).

El Paso 1 (ingesta a DuckDB local) va el viernes porque dura poco y confirma que tus datos abren. Sin la foto modelo_mano_Exxx.jpg no se califica el Pilar 2. Es una puerta, no un bono.


Paso a paso

Paso 0. Preparar (Bloque 0)

Qué haces

  1. Descomprime tu carpeta Exxx/. Ejemplo: E042/.
  2. Llena el Panel de control de esta guía con tu ficha.
  3. Abre Exxx-modelo.html en el navegador. Debe mostrar el diagrama con casillas ?.
  4. Mira el modelo: nodos (cajas, válvulas, círculos) y arcos (flechas). Cada arco tiene un signo + o -.
  5. Lee el signo de 3 arcos en voz alta. Ejemplo: "Infectados a infeccion es +: más infectados, más contagios."
  6. Abre datos_Exxx.csv con doble clic. Mira sus columnas: t, fecha y 21 variables.
  7. Ten a mano lápiz, papel y un marcador grueso para el Paso 2.

Qué significa terminado: el panel está lleno, el navegador abrió tu modelo, entiendes qué dice un signo.

Este bloque no entra en la nota, pero te ahorra horas después.

Ya es suficiente: deja de leer la ficha completa. La vas a usar paso a paso.

Si te atascas El HTML no abre: prueba otro navegador. Chrome, Edge y Safari sirven. El CSV abre en una sola columna: no importa. El dashboard lo leerá bien. Si sigue fallando: usa el horario de consultas de 19:00 a 19:30. Sigue con el Paso 1 mientras esperas.


Paso 1. Ingesta a DuckDB local con evidencia (Bloque 1)

DuckDB es la base de datos que usaste en clase. Corre en tu computador. Tu carpeta trae un script que hace la ingesta por ti.

Qué haces (plan A, el normal)

1a. Descomprime tu zip y entra a la carpeta Exxx.

1b. Corre el archivo ingesta_Exxx.py. Cambia Exxx por tu código. Ejemplo: ingesta_E042.py.

  • Windows: doble clic en ingesta_Exxx.py. Se abre una ventana negra.
  • Mac: abre la app Terminal. Escribe python3 y un espacio. Arrastra ingesta_Exxx.py a la ventana. Pulsa Enter.

Si en Windows el doble clic no abre la ventana negra (abre un editor o no pasa nada): pulsa la tecla Windows, escribe cmd y Enter. Escribe py y un espacio. Arrastra ingesta_Exxx.py a la ventana. Pulsa Enter. Si py no sirve, prueba con python.

1c. Espera el mensaje LISTO (1 a 3 minutos). No instalas nada a mano: el script instala DuckDB si falta y abre tu tablero en el navegador. El script muestra 6 pasos:

Paso Qué hace Qué ves
[1/6] Descarga covid_diario.csv (15 MB, dataset gt2j-8ykr de datos.gov.co, resumido por día, departamento, sexo y grupo de edad) y revisa su sha256 El tamaño y que el sha256 es el esperado
[2/6] Crea tu base local examen_Exxx.duckdb con la tabla covid_diario 252,677 filas, 6,388,216 casos, 143,125 fallecidos COVID -> coincide
[3/6] Crea la tabla limpia covid_limpio y la vista de tu territorio v_territorio_X Ejemplo (E003, Valle del Cauca): v_territorio_76: 731 dias, 540,163 casos, 15,016 fallecidos, casos_7d promedio 738.8 -> 731 dias, coincide
[4/6] Exporta mi_territorio_Exxx.csv (731 filas, 23 columnas: t, fecha y las variables) El nombre del archivo y sus filas
[5/6] Crea dashboard_Exxx.html desde la plantilla, con tus datos ya adentro. Es la conexión base de datos -> tablero. Nunca borra un dashboard_Exxx.html que ya exista El nombre del archivo
[6/6] Escribe sql_Exxx.txt, tu evidencia El nombre del archivo

Al final lees: "LISTO. Siguiente paso: abre dashboard_Exxx.html y elige tus 5 variables."

1d. Abre sql_Exxx.txt. El script lo escribe solo. Trae la fecha y hora, la versión de DuckDB, el sha256, los conteos, los números de tu vista, las primeras filas y el SQL usado. Revisa que estén los dos conteos y los 3 números de tu vista. Ejemplo (Valle): "731 días, 540,163 casos, casos_7d promedio 738.8".

1e. Compara con tu respaldo. Abre mi_territorio_Exxx.csv y datos_Exxx.csv. Tienen el mismo contenido. Ejemplo: la suma de la columna casos debe dar los mismos casos de la ventana.

Plan B: SQL a mano

Si el script no corre, abre duckdb_Exxx.sql con un editor de texto (Bloc de notas o TextEdit). Tiene 7 bloques numerados. Pega un bloque a la vez. Espera a que termine antes del siguiente. Úsalo en tu DuckDB local (consola duckdb o duckdb -ui) o en https://shell.duckdb.org/. El bloque 6 (COPY a CSV) solo funciona en tu DuckDB local. El bloque 7 es opcional y muestra las trampas. Ahora escribes sql_Exxx.txt tú, con las mismas 4 cosas: los dos conteos (filas y casos), el nombre de tu vista, los 3 números y la fecha y hora. Ejemplo: "252,677 filas, 6,388,216 casos. Vista v_territorio_76. 731 días, 540,163 casos, casos_7d promedio 738.8. 2026-11-13 20:10."

Plan C: solo el CSV

Usa datos_Exxx.csv de tu carpeta. Tiene los mismos números. Pierdes solo el paso de ingesta (Paso 1).

Qué significa terminado: sql_Exxx.txt existe con los 2 conteos y los 3 números. Con el plan A, también existen examen_Exxx.duckdb, mi_territorio_Exxx.csv y dashboard_Exxx.html.

Se califica: ingesta a DuckDB local con evidencia.

Ya es suficiente: a las 20:00 deja de pelear con la instalación o el script. El resto del examen sigue sin ellos.

Si te atascas Dice que falta duckdb: el script lo instala por sí solo. Si no puede, corre el archivo otra vez. Si sigue fallando, usa el plan C. La descarga falla: revisa tu internet y corre el archivo otra vez. Si falla otra vez, usa el plan C. Nada funciona en 15 minutos: usa el plan C. Abre dashboard_plantilla.html con doble clic, pulsa Leer CSV y elige datos_Exxx.csv. Pierdes solo el paso de ingesta (Paso 1). El modelo y el dashboard siguen igual.


Paso 2. Dibujar el modelo completo a mano (Bloque 2)

Qué haces

2a. Abre Exxx-modelo.html. Mira el diagrama: nodos y arcos. Cada arco lleva un signo + o -. Lee las TAREAS de la página y de tu ficha. Una te dice qué nodo falta y en qué ciclo va. Toma lápiz y papel. Dibuja el modelo completo a mano, en este orden:

  1. Todos los stocks como cajas. Ejemplo: Susceptibles, Infectados, Recuperados.
  2. Todos los flujos como tubos con válvula. Las nubes marcan lo que queda fuera.
  3. Todos los convertidores como círculos, incluido el nodo que falta. Ejemplo: fraccion_susceptible.
  4. Todos los arcos con su signo. + si van en la misma dirección, - si van al revés.
  5. Cada ciclo con su nombre y su letra. Cuenta los signos - del ciclo: par es R, impar es B.
  6. Debajo del dibujo, 5 frases de cómo funciona el sistema.

Ejemplo de las 5 frases (familia F1): "Los Susceptibles se contagian y pasan a Infectados. Los Infectados se recuperan en 10 días. Más Infectados producen más contagios: ciclo R1. Menos Susceptibles frenan el contagio: ciclo B1. Los casos detectados son una parte de los contagios."

Fotografía el dibujo con buena luz, desde arriba. Guarda la foto como modelo_mano_Exxx.jpg (o .png o .pdf). Ponla en tu carpeta Exxx/. Si las 5 frases no se leen en la foto, cópialas en insights_Exxx.txt.

Qué significa terminado: la foto está en tu carpeta, se lee cada nombre y cada signo, cada ciclo tiene letra, hay 5 frases.

Se califica: dibujo a mano completo y correcto.

Ya es suficiente: deja de pasar el dibujo en limpio. Legible vale lo mismo que bonito.

Si te atascas No sabes dónde va el nodo nuevo: lee su TAREA en la ficha. Dice qué nodos lo alimentan y a cuál apunta. No sabes si un ciclo es R o B: cuenta los signos - del ciclo. Par es R, impar es B. La foto sale borrosa: dibuja con marcador grueso y toma la foto desde arriba, sin sombra.


Paso 3. Pasar el dibujo al HTML (Bloque 3)

Qué haces

3a. Abre Exxx-modelo.html. Los nodos con ? esperan tu fórmula. Una de ellas es un parámetro fácil. Ejemplo de parámetro fácil: duracion_infeccion = 10 días. Para cada ?, lee la TAREA en tu ficha. Hay 3 niveles de pista:

Nivel Qué te da Ejemplo (nodo recuperacion)
1 Concepto La idea "Cada día se recupera una parte de los infectados."
2 Fórmula en palabras La operación "Infectados dividido entre los días que dura la enfermedad."
3 Esqueleto con casillas La forma ____ / duracion_infeccion

Usa el nivel que necesites. No hay castigo. Anota el nivel usado en insights_Exxx.txt, sección "Pistas". Ejemplo: "recuperacion: pista nivel 2."

Escribe cada fórmula en su casilla. Usa los mismos nombres de los nodos. Ejemplo: Infectados / duracion_infeccion.

Agrega el nodo que faltaba con el botón Agregar convertidor. Es el mismo que dibujaste a mano. Escribe su nombre, sus entradas y su fórmula. Ejemplo: fraccion_susceptible = Susceptibles / poblacion. Luego busca la insignia PROVISIONAL en sus vecinos. Reemplaza la constante por el nombre del nodo nuevo. Ejemplo: en infeccion cambia 0.8 por fraccion_susceptible.

Pulsa Cargar datos y elige mi_territorio_Exxx.csv (o datos_Exxx.csv, tiene el mismo contenido). La página toma las columnas que necesitan los nodos d_. Ejemplo: la columna casos_7d alimenta d_casos_7d. Pulsa Correr. Debe correr de t = 0 a t = 730, 731 días. Mira el gráfico.

3b. Mira los chequeos de aceptación en la página. Cada uno dice PASA o FALLA. Ejemplo: "Infectados tiene su pico entre el día 90 y el día 130: PASA." Marca cada chequeo con sí o no en tu ficha.

3c. Simula una vez. Cambia un parámetro y vuelve a pulsar Correr. Mira qué cambia en el gráfico. Ejemplo: sube tasa_contacto de 6 a 8 y mira si el pico llega antes. Escribe 1 frase con lo que viste en insights_Exxx.txt, sección "Simulación". Luego devuelve el parámetro a su valor.

Exporta: pulsa Exportar salidas CSV. Se guarda salidas_Exxx.csv en formato largo: t, variable, valor, origen. Pulsa Descargar este HTML. Se guarda modelo_Exxx.html con tus fórmulas y tus datos dentro. Pon los 2 archivos en tu carpeta Exxx/.

3d. Explica 1 ciclo en palabras con 1 número. Escríbelo en insights_Exxx.txt, sección "Mi ciclo". Usa la frase fija: "Cuando X sube, Y sube, y eso hace que X suba más: ciclo R." "Cuando X sube, Y baja, y eso frena a X: ciclo B." Ejemplo: "Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: ciclo R1. El pico fue de 48,200 personas el día 112."

Qué significa terminado: cero ? en la página, el nodo nuevo existe y no queda PROVISIONAL. Los chequeos dicen PASA. salidas_Exxx.csv y modelo_Exxx.html están en tu carpeta. El ciclo está escrito.

Se califica: 3a el HTML corre con fórmulas y nodo nuevo, y está descargado. 3b los chequeos pasan. 3d un ciclo explicado con número.

Ya es suficiente: deja de ajustar parámetros para que la curva se parezca al dato. Eso no mejora tu nota. A las 08:15 exporta y descarga, con lo que tengas. Después vienen el Paso 4 y el Paso 5.

Si te atascas El navegador no abre el HTML: usa otro navegador. Chrome, Edge y Safari sirven. Cargar datos no funciona: revisa que elegiste mi_territorio_Exxx.csv (o datos_Exxx.csv) de tu carpeta, no otro archivo. Un chequeo dice FALLA: anótalo como "no" y sigue. 3a cuenta aunque 3b falle. No logras agregar el nodo: deja la constante PROVISIONAL. Exporta y descarga igual. Pierdes solo la línea del nodo nuevo, nada más.


Paso 4. Dashboard conectado a tu base: 5 variables, estadísticas, histogramas, lecturas (Bloque 4)

Qué haces

Abre dashboard_Exxx.html en el navegador. El script lo creó en el Paso 1. Ya trae los datos de tu base de datos. Si no corriste el script, abre dashboard_plantilla.html de tu carpeta. Pulsa Leer CSV y carga mi_territorio_Exxx.csv (o datos_Exxx.csv).

4a. Mira que el dashboard muestre tu tabla ancha de tu territorio. Si quieres, pulsa Leer CSV y carga también salidas_Exxx.csv. Así sumas variables simuladas del modelo.

Elige al menos 5 variables. Al menos 1 debe ser real, de tu territorio (mi_territorio_Exxx.csv). Ejemplo: casos_7d (real), fallecidos_7d (real), rezago_rep_prom (real), Infectados (simulada), fraccion_susceptible (simulada). Para cada variable, el dashboard calcula: media, mediana, moda, desviación estándar y coeficiente de variación (CV). También dibuja su histograma. Mira los 5 números y el histograma de cada variable.

4b. Mira cada histograma. Dice dónde se juntan los días y si hay una cola larga. Ejemplo: "casi todos los días están abajo, a la izquierda, y pocos días muy altos hacen una cola a la derecha."

4c. Escribe 1 lectura DATO y 1 lectura JUICIO por variable, en las casillas del dashboard. Ejemplo DATO: "La mediana de casos_7d es 529 casos por día." Ejemplo JUICIO: "La media está muy por encima de la mediana, así que hubo picos cortos y altos."

Guarda el dashboard: botón Descargar este HTML, o Guardar como, página completa. Nombre: dashboard_Exxx.html. No cambies el diseño ni los colores. Ya pasó la prueba de accesibilidad.

Qué significa terminado: dashboard_Exxx.html abre con 5 variables, sus 5 estadísticas, sus histogramas y sus lecturas.

Se califica: 4a estadísticas de 5 variables. 4b histogramas. 4c lecturas DATO/JUICIO.

Ya es suficiente: deja de buscar una sexta variable. Cinco bastan.

Si te atascas El dashboard no lee el CSV: revisa que sea mi_territorio_Exxx.csv (o datos_Exxx.csv) de tu carpeta y prueba otro navegador. El dashboard sale sin datos: abre dashboard_plantilla.html y carga el CSV con Leer CSV. Una variable sale con CV "no aplica": tiene valores negativos o media cero. Elige otra.


Paso 5. Entiende tu tablero: hechos, insights y conclusiones (Bloque 5)

Qué haces

5a. Escribe 3 hechos en el dashboard y en insights_Exxx.txt. Un hecho es información: un número que los datos muestran. Ejemplo: "El pico real de casos_7d fue 6,137 casos por día, el día 674."

5b. Escribe 2 insights: un insight de ciclo y un insight de variable. Cada uno tiene 1 número con unidad.

Insight De dónde sale Frase fija Ejemplo
1 Un ciclo (R o B) "Cuando X sube, Y ... : ciclo R/B" "Cuando Hospitalizados sube, ocupacion sube, letalidad sube y Hospitalizados baja: ciclo B1. La ocupación pasó de 1.0 durante 41 días."
2 Una variable Una lectura con número "El rezago de reporte tuvo desviación estándar de 3.2 días. Los datos de hoy son de hace 4 a 10 días."

Debajo de cada insight escribe su conclusión. Tiene 3 partes: 1. La problemática o situación que encontraste. 2. Qué hacer para mejorar el sistema. 3. El empleado IA que lo haría posible (nombre y arquetipo).

Ejemplo: "Problemática: la ocupación de camas llegó a 1.0 y nadie avisó antes." "Qué hacer para mejorar el sistema: abrir camas antes de que la ocupación llegue a 0.85." "Empleado IA: Vigía de camas, arquetipo Vigía, que avisa cuando ocupacion pasa de 0.85."

Puedes reusar el ciclo del Paso 3d como Insight 1. Pega los 2 insights y sus conclusiones en las tarjetas del dashboard y vuelve a descargarlo.

5c. Tarjeta de transferencia: escribe transferencia.txt con 5 frases, en tus palabras. Aplica el patrón de tu familia a un problema de comunicación que no sea COVID.

Frase Qué dice Ejemplo (patrón F7, dos relatos en competencia)
1 El problema "Un rumor sobre una marca de yogur en TikTok."
2 Los stocks "Indecisos, Informados, Desinformados."
3 Un ciclo "Cuando Desinformados sube, más videos del rumor, y eso hace que Desinformados suba más: ciclo R."
4 La fuente de datos "Conteo diario de videos con el hashtag, desde la API de TikTok."
5 Un empleado IA "Un Vigía que avisa cuando los videos del rumor pasan de 200 por día."

Qué significa terminado: 3 hechos y 2 insights con número y conclusión en insights_Exxx.txt y en el dashboard. 5 frases en transferencia.txt.

Se califica: 5a y 5b hechos e insights con número y conclusión (problemática, mejora y empleado IA). 5c tarjeta de transferencia.

Ya es suficiente: deja de buscar un tercer insight. Solo se califican 2.

Si te atascas No encuentras el número: usa la media, la mediana o el pico que muestra el dashboard. La transferencia no sale: mira la columna "Qué aprendes a enmarcar" de tu patrón en la ficha. Almuerzo a las 12:00. El Bloque 6 necesita cabeza fresca.


Paso 6. Dos empleados digitales (IA) y bitácora (Bloque 6)

Qué haces

Diseñas dos empleados digitales (IA), uno por problemática encontrada en tu análisis. Por cada uno entregas 3 cosas:

  1. Prompt con especificaciones, rieles (rails) y arnés (harness).
  2. Hoja de vida: tareas o funciones, habilidades, competencias y limitaciones.
  3. Marco de gobierno de IA: riesgos, políticas, procesos con diagrama de flujo y protocolo de contención.

Un empleado IA sugiere; una persona decide.

Elige el arquetipo de cada empleado:

Arquetipo Qué hace Ejemplo
Vigía Umbral → alerta "Avisa si ocupacion pasa de 0.85."
Redactor Números → nota pública "Escribe el parte diario de camas."
Verificador Calidad de datos "Revisa si el rezago llegó negativo."
Explicador Responde preguntas sobre el ciclo "Explica por qué la segunda ola fue más alta."

Abre ia/empleado_ia_plantilla.html en el navegador. A la izquierda hay un formulario. A la derecha se arma el documento. Pulsa Cargar ejemplo una vez para ver un empleado completo. Luego pulsa Vaciar todo y escribe el tuyo. Lee antes ia/superprompt_plantilla.md: 2 páginas sobre el prompt con rails y el harness.

El formulario tiene 10 secciones. Llénalas en orden:

Sección Qué escribes
0 Quién es Nombre, rol, arquetipo, insight de origen (tu problemática), ciclo o variable, qué mejora del sistema
1 Ficha de gobernanza Propósito, modelo (id exacto), proveedor, dónde corre, nivel de riesgo, dueño, despliegue, retiro, qué hace
2 Hoja de vida Habilidades con herramienta, competencias, limitaciones, supervisor, KPIs, día a día de lunes a viernes
3 Prompt con rails Identidad, misión con número y ciclo, entradas, pasos, salidas, rails G1 a G3, rechazos R0 R1 R2, entrega a humano, 2 ejemplos
4 Harness Disparador, formato de entrada, formato de salida, 3 pruebas, registro, interruptor, costo
5 Palabras usadas Las 5 palabras técnicas que usaste, con su definición corta
6 Riesgos 3 o más, cada uno con AIR 2024 L1 → L2 → L3, nivel ALTO/MEDIO/BAJO, qué puede salir mal, cómo lo evitamos
7 Políticas Una por riesgo: hacer, no hacer, recordar
8 Procesos 3 o más, con pasos y preguntas sí/no. La página dibuja el flujo
9 Protocolo de contención SEV-1, SEV-2, SEV-3 con tiempo, y los 7 pasos: Parar, Contener, Deshacer, Buscar, Avisar, Arreglar, Aprender

Las secciones 3 y 4 son la entrega 1 (prompt y arnés). La sección 2 es la entrega 2 (hoja de vida). Las secciones 6 a 9 son la entrega 3 (marco de gobierno).

Reglas que no cambian:

  1. El día a día tiene 5 días (lunes a viernes). Cada día: disparador, entrada, acción, salida, quién revisa.
  2. Incluye 1 día de espera (sin disparo) y 1 día de incidente (dato malo, pasa a un humano).
  3. Un rail G nace de tu ciclo. Ejemplo: "G3 (ciclo B1): nunca recomiendo trasladar pacientes; solo aviso."
  4. R0 y R1 son fijos: no da consejo médico individual; nunca publica una celda con n menor que 5.
  5. R2 nace de tu ciclo. Ejemplo: "No proyecto más de 14 días: el ciclo B1 cambia la letalidad."
  6. El número de la misión sale de tu dashboard. Ejemplo: "umbral 0.85 = media 0.62 + 1 desviación 0.23."

Al terminar cada empleado pulsa Descargar este HTML. Nombres: empleado_ia1_Exxx.html y empleado_ia2_Exxx.html. Los dos empleados IA se califican con los mismos criterios.

Bitácora de IA. Escribe bitacora_ia.txt (o .md) con cualquier editor. Máximo 5 entradas. Cada entrada tiene 5 campos: prompt resumido, qué se equivocó el modelo, qué cambié, qué entregable afectó, modelo usado. Ejemplo: "Pedí la fórmula de altas. Olvidó (1 - letalidad). La agregué. Afectó modelo_Exxx.html. Modelo: gemini-2.5-flash."

Qué significa terminado: los 2 HTML descargados abren y muestran las 10 secciones llenas. La bitácora tiene 1 a 5 entradas.

Se califica: prompt con rails y harness, hoja de vida, riesgos AIR, políticas, procesos con flujo y contención. Lo que debe estar sí o sí: el empleado IA 1 con prompt con rails y harness, hoja de vida y riesgos. Bitácora: compuerta. Si falta, la nota del Pilar 3 baja 10 %.

Ya es suficiente: a las 15:30 deja de pulir el segundo empleado.

Si te atascas No sabes qué riesgo elegir: la tarjeta AIR 2024 trae 1 fila ya resuelta. Copia su forma. El flujo del proceso no se dibuja: cada paso necesita texto. Las preguntas necesitan la salida "no". Te quedas sin tiempo: termina el empleado IA 1 completo. Eso debe estar sí o sí.


Paso 7. Revisar, comprimir y enviar (Bloque 7)

Qué haces

  1. Abre tu carpeta Exxx/. Revisa la lista de nombres fijos de la sección Entrega. Marca cada archivo.
  2. Arregla solo lo que falte y sea rápido. Ejemplo: un archivo con nombre mal escrito.
  3. Revisa que ningún archivo tenga una llave de API. Ejemplo de llave: empieza con sk-ant o con AIza.
  4. Comprime la carpeta. Windows: clic derecho, Enviar a, Carpeta comprimida. Mac: clic derecho, Comprimir.
  5. Cambia el nombre del zip a EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip.
  6. Envíalo por correo a la dirección del enunciado. Verifica que el correo salió antes de las 18:50.

Qué significa terminado: el zip está enviado y lo ves en tu bandeja de enviados.

Ya es suficiente: a las 18:30 envía lo que tengas. Un zip incompleto a tiempo vale más que uno completo tarde.

Si te atascas El zip pesa más de 25 MB: saca del zip covid_diario.csv, examen_Exxx.duckdb, mi_territorio_Exxx.csv y datos_Exxx.csv. El profesor ya los tiene; tu evidencia es sql_Exxx.txt. El correo no sale: escribe al profesor en el horario de 17:30 a 18:30 con una captura de pantalla.


Mapa de la nota

La nota tiene tres pilares. Cada pilar vale un tercio. La nota final es el promedio de los tres pilares.

Pilar 1. Modelo (un tercio)

Ítem
Dibujo a mano completo y correcto, con signos, foto y 5 frases
El HTML corre: fórmulas, nodo nuevo, datos, descargado
Chequeos de aceptación pasan
Un ciclo explicado con un número

Pilar 2. Datos (un tercio)

Ítem
Ingesta a DuckDB local con evidencia (sql_Exxx.txt)
Estadísticas de 5 variables: media, mediana, moda, desviación, CV
Histogramas de las 5 variables
Lecturas DATO/JUICIO
3 hechos y 2 insights con número y conclusión (problemática, mejora y empleado IA)
Tarjeta de transferencia

Pilar 3. Empleados IA (un tercio)

Ítem
Empleado IA 1: prompt con rails y harness, hoja de vida, riesgos AIR 2024, políticas, procesos con flujo y contención
Empleado IA 2: los mismos seis elementos

Dentro de cada pilar, cada ítem es sí o no. Algunos ítems pesan más que otros, y eso lo usa el calificador.

Compuertas: sin bitácora de IA, la nota del Pilar 3 baja 10 %. Una llave de API en el zip baja 10 % el Pilar 3. Puerta de la foto: sin modelo_mano_Exxx.jpg no se califica el Pilar 2 (datos).


Entrega

  1. Crea una carpeta con tu código. Ejemplo: E042.
  2. Pon dentro los archivos con nombre fijo de las tablas de abajo.
  3. Clic derecho sobre la carpeta. Windows: Enviar a, Carpeta comprimida. Mac: Comprimir.
  4. Nombra el zip EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip. Ejemplo: EXAMEN FINAL - E042 - NOMBRE COMPLETO.zip.
  5. Envíalo por correo a la dirección del enunciado.

Entrega única: sábado 14 de noviembre, 7:00 pm. Se califica lo que llegue antes de esa hora, aunque esté incompleto. Cada archivo presente cuenta en tu nota.

Nombres fijos de archivo (Pilar 1)

Archivo Qué contiene
modelo_mano_Exxx.jpg (o .png o .pdf) Foto de tu dibujo a mano con signos, ciclos y las 5 frases. Puerta del Pilar 2
modelo_Exxx.html Tu modelo completo, descargado de la página con el botón
salidas_Exxx.csv Corrida del modelo en formato largo: t, variable, valor, origen

Nombres fijos de archivo (Pilar 2)

Archivo Qué contiene
sql_Exxx.txt Evidencia de tu ingesta a DuckDB local: 2 conteos, vista, 3 números, fecha y hora. El script lo escribe solo. Puede faltar: pierdes solo el paso de ingesta (Paso 1)
dashboard_Exxx.html Tu dashboard con 5 variables, estadísticas, histogramas, lecturas, hechos e insights con su conclusión
insights_Exxx.txt (o .md) Pistas usadas, simulación, mi ciclo, 3 hechos, 2 insights con su conclusión, las 5 frases si no están en la foto
transferencia.txt (o .md) 5 frases

Nombres fijos de archivo (Pilar 3 y compuertas)

Archivo Qué contiene
empleado_ia1_Exxx.html Empleado IA 1, descargado de la plantilla
empleado_ia2_Exxx.html Empleado IA 2, descargado de la plantilla
bitacora_ia.txt (o .md) Máximo 5 entradas

Reglas de IA

Puedes usar Claude, Gemini u otro modelo durante todo el examen. El curso enseña a trabajar con ellos.

Qué sí

  1. Pedir que te explique un concepto. Ejemplo: "¿Qué es un ciclo de balance?"
  2. Pedir que corrija un error de SQL. Ejemplo: "Esta consulta da error en DuckDB, ¿por qué?"
  3. Pedir que revise tu redacción.
  4. Probar tu prompt con rails con 3 filas reales de mi_territorio_Exxx.csv.
  5. Anotar cada uso útil en la bitácora.

Qué no

  1. Pegar una llave de API en ningún archivo. Una llave en el zip baja 10 % la nota del Pilar 3.
  2. Entregar texto que no puedes explicar en voz alta.
  3. Copiar archivos de otra persona. Tu vista, tu nodo, tu ciclo y tu número hacen único tu trabajo.
  4. Pedir al modelo que lea gt2j-8ykr fila a fila. Solo se usa la vista agregada.
  5. Publicar una celda con menos de 5 personas.

Bitácora de IA: máximo 5 entradas, 5 campos cada una. Si falta, la nota del Pilar 3 baja 10 %. Secretos: una llave de API en el zip baja 10 % la nota del Pilar 3.


Glosario

Término Qué es, en una línea
Nodo Una pieza del modelo: stock (caja), flujo (válvula) o convertidor (círculo).
Arco Una flecha entre dos nodos. Lleva signo: + misma dirección, - dirección contraria.
Stock Una cantidad que se acumula. Ejemplo: Infectados, en personas.
Flujo Lo que entra o sale de un stock por día. Ejemplo: infeccion, en personas/día.
Convertidor Un cálculo auxiliar o un parámetro. Ejemplo: fraccion_susceptible.
Casilla ? Un nodo de la página HTML sin fórmula. Tú la escribes.
Ciclo R Refuerzo: X sube, Y sube, X sube más. Número par de signos -.
Ciclo B Balance: X sube, Y baja, X se frena. Número impar de signos -.
Término Qué es, en una línea
DuckDB Base de datos que corre en tu computador (como en clase) y recibe SQL. El script ingesta_Exxx.py la crea por ti.
Vista Una consulta SQL guardada con nombre. Ejemplo: v_territorio_76, 731 filas.
Media La suma de los valores dividida entre cuántos son.
Mediana El valor del medio cuando ordenas los datos.
Moda El valor que más se repite. En series diarias suele ser 0 o un valor redondeado.
Desviación estándar Cuánto se alejan los valores de la media, en las mismas unidades.
Coeficiente de variación Desviación estándar dividida entre la media. Sin unidades. Sirve para comparar.
Histograma Un gráfico de barras que dice cuántos días cayeron en cada rango de valores.
Término Qué es, en una línea
Hecho Información: un número que los datos muestran y cualquiera puede repetir.
Insight Un hecho unido a una estructura del modelo, con un número y una conclusión.
Problemática Una situación del sistema que tus datos muestran y que conviene mejorar. Cada empleado IA nace de una.
Prompt con rails Las instrucciones del empleado IA más sus reglas fijas (rails G) y sus rechazos (R).
Rail Una regla que el empleado IA sigue siempre. Ejemplo: "solo uso datos de la vista".
Harness Cómo se opera el empleado: disparador, formatos, pruebas, registro, interruptor, costo.
Protocolo de contención Qué hacer cuando el empleado falla: SEV-1/2/3 y los 7 pasos, de Parar a Aprender.
Gobernanza Las reglas para que un empleado IA exista con responsabilidad: riesgos, políticas, procesos, apagado.

Parte 3. Una ficha de ejemplo (E003)

Cada estudiante recibe una ficha como esta, con su código, su territorio y su familia. Las tareas, los supuestos y los chequeos cambian en cada una. Esta es la del modelo E003.

Ficha E003: Difusion con limite (Contagio basico (SIR con datos))

0. Panel de control

Campo Valor
Codigo E003
Territorio Valle del Cauca (codigos 76)
Poblacion 2020 4,532,152 (DANE proyecciones de poblacion 2020 (CNPV 2018) aprox.)
Familia F1 Difusion con limite. Instancia COVID: Contagio basico (SIR con datos)
Modelo E003-modelo.html, abrelo en el navegador (16 nodos, 15 presentes, 5 tareas)
Dibujo a mano modelo_mano_E003.jpg (o .png o .pdf): el modelo completo, con el nodo que falta, ciclos R/B y 5 frases
Ingesta a tu DuckDB local ingesta_E003.py: en Windows, doble clic; en Mac, Terminal, python3, espacio, arrastra el archivo, Enter. Instala DuckDB si falta, descarga los datos publicos, crea examen_E003.duckdb, exporta tu vista, deja dashboard_E003.html conectado y lo abre en el navegador
El mismo camino en SQL duckdb_E003.sql (DuckDB local o shell.duckdb.org como plan B)
Respaldo de tus datos datos_E003.csv: 731 dias x 21 variables de tu territorio, derivadas de datos.gov.co
Dataset covid_diario.csv, 252,677 filas, 6,388,216 casos, 143,125 fallecidos COVID, sha256 873db02a331ba22e...
Tiempo t = 0 es 2020-03-06; t = 730 es 2022-03-06; paso DT 0.25 dias

Patron reutilizable: Cualquier difusion: epidemias, contenido viral, adopcion de un producto.

1. Tu sistema en pocas frases

Las personas pasan de Susceptibles a Infectadas y luego a Recuperadas. Cuantas mas personas infectadas hay, mas contagios ocurren (ciclo que refuerza). Cuantas menos susceptibles quedan, menos contagios son posibles (ciclo que equilibra). Los casos importados llegan desde afuera. El modelo solo detecta una fraccion de los contagios; la brecha entre lo que el modelo detecta y los casos reportados dice cuanto se parece el modelo a la realidad de tu territorio.

2. Los ciclos

Ciclo Tipo Que pasa
R1 Refuerza (R) Infectados -> infeccion -> Infectados: mas infectados, mas contagios.
B1 Equilibra (B) Infectados -> Susceptibles bajan -> fraccion_susceptible baja -> infeccion baja.

Frase para tu insight de ciclo: Cuando X sube, Y sube, y eso hace que X suba mas: ciclo R. / Cuando X sube, Y baja, y eso frena a X: ciclo B.

3. Nodos del modelo

Nodo Tipo Unidad Que es Estado
Susceptibles stock personas Personas que aun pueden contagiarse listo
Infectados stock personas Personas infectadas hoy listo
Recuperados stock personas Personas que ya pasaron la enfermedad listo
infeccion flujo personas/dia Contagios nuevos por dia ? escribe la formula (tarea)
importacion flujo personas/dia Casos que llegan desde fuera del territorio (dato) ? escribe la formula (tarea)
recuperacion flujo personas/dia Personas que se recuperan por dia listo
fraccion_susceptible convertidor 1 Parte de la poblacion que aun puede contagiarse (0 a 1) FALTA: dibujalo (tarea)
casos_detectados_modelo convertidor personas/dia Contagios del modelo que el sistema de salud detectaria ? escribe la formula (tarea)
brecha_dato_modelo convertidor personas/dia Modelo menos dato listo
tasa_contacto parametro contactos/dia Contactos cercanos por persona y dia (supuesto) listo
prob_transmision parametro 1 Probabilidad de contagio por contacto (supuesto) listo
duracion_infeccion parametro dia Dias que una persona contagia (supuesto) listo
fraccion_deteccion parametro 1 Parte de los contagios que se diagnostican (supuesto) ? escribe la formula (tarea)
poblacion parametro personas Poblacion del territorio (DANE 2020 aprox.) listo
d_casos_7d dato personas/dia [DATO] columna casos_7d de la vista DATO: importalo
d_importados dato personas/dia [DATO] columna importados de la vista DATO: importalo

4. Tareas

Primero, a mano: dibuja el modelo completo en papel (todos los nodos, incluido fraccion_susceptible), las flechas y los ciclos marcados R o B; escribe 5 frases de como funciona; fotografia el dibujo como modelo_mano_E003.jpg. Despues, en la pagina E003-modelo.html: haz clic en cada nodo con ? y escribe su formula; agrega el nodo que falta con el boton Agregar convertidor. Cada tarea tiene 3 niveles de pista (tambien estan dentro de la pagina). Usa el que necesites y anota cual usaste en insights_E003.md.

Tarea 1: escribe la formula de fraccion_deteccion (1)

  • Flechas que le llegan: ninguna, es un numero.
  • Nivel 1 (concepto): Parte de los contagios que se diagnostican (supuesto).
  • Nivel 2 (en palabras): Supuesto: 0.3 (30 %).
  • Nivel 3 (esqueleto): [ ] donde cada [ ] es una de las flechas o un numero.

Tarea 2: escribe la formula de importacion (personas/dia)

  • Flechas que le llegan: d_importados.
  • Nivel 1 (concepto): Casos que llegan desde fuera del territorio (dato).
  • Nivel 2 (en palabras): Es igual al dato de casos importados del dia.
  • Nivel 3 (esqueleto): [ ] donde cada [ ] es una de las flechas o un numero.

Tarea 3: escribe la formula de infeccion (personas/dia)

  • Flechas que le llegan: Infectados, tasa_contacto, prob_transmision, fraccion_susceptible.
  • Nivel 1 (concepto): Contagios nuevos por dia.
  • Nivel 2 (en palabras): Contagios por dia = infectados x contactos por dia x probabilidad de contagio x fraccion de susceptibles. Mira las 4 flechas que le llegan.
  • Nivel 3 (esqueleto): [ ] * [ ] * [ ] * [ ] donde cada [ ] es una de las flechas o un numero.

Tarea 4: escribe la formula de casos_detectados_modelo (personas/dia)

  • Flechas que le llegan: infeccion, fraccion_deteccion.
  • Nivel 1 (concepto): Contagios del modelo que el sistema de salud detectaria.
  • Nivel 2 (en palabras): Solo una fraccion de los contagios se detecta: contagios por dia x fraccion de deteccion.
  • Nivel 3 (esqueleto): [ ] * [ ] donde cada [ ] es una de las flechas o un numero.

Tarea 5: agrega el convertidor fraccion_susceptible (1) y conectalo

  • Que es: Parte de la poblacion que aun puede contagiarse (0 a 1).
  • Flechas que deben llegarle: Susceptibles, poblacion.
  • A donde apunta: infeccion.
  • Nivel 2 (en palabras): Susceptibles dividido entre la poblacion. Usa MAX(0, ...) para que nunca sea negativa.
  • Nivel 3 (esqueleto): MAX([ ], [ ] / [ ]).
  • Hoy sus dependientes usan un valor PROVISIONAL (1). Cuando agregues el nodo en la pagina, abre infeccion y reemplaza (1) por fraccion_susceptible.

5. Conecta tus datos (el modelo sigue a la base de datos)

  1. Carga los datos publicos de datos.gov.co en tu DuckDB local con ingesta_E003.py, sin escribir comandos largos. Windows: doble clic en el archivo; se abre una ventana negra. Mac: abre Terminal, escribe python3 y un espacio, arrastra el archivo a la ventana y pulsa Enter. Espera el mensaje LISTO (1 a 3 minutos). Si en Windows no sale la ventana negra: tecla Windows, escribe cmd, Enter; escribe py y un espacio, arrastra el archivo y pulsa Enter. El script instala DuckDB si falta, descarga covid_diario.csv, crea la base examen_E003.duckdb, comprueba 252,677 filas y 6,388,216 casos, crea tu vista con 731 dias, exporta mi_territorio_E003.csv, deja dashboard_E003.html conectado a esos datos, escribe la evidencia sql_E003.txt y abre el tablero en tu navegador. Si prefieres escribir el SQL tu, duckdb_E003.sql trae el mismo camino en bloques (DuckDB local o shell.duckdb.org). Si nada funciona, datos_E003.csv ya viene en la carpeta con los mismos 731 dias y 21 columnas (pierdes solo el paso de ingesta).
  2. Abre mi_territorio_E003.csv en el navegador o en una hoja de calculo para mirarlo. No lo edites ni lo guardes desde Excel (cambia los decimales).
  3. Abre E003-modelo.html en el navegador. Boton Cargar datos (CSV): elige mi_territorio_E003.csv (o datos_E003.csv, es igual). La pagina toma las columnas que necesita (casos_7d, importados) para los nodos de datos d_casos_7d, d_importados.
  4. Boton Correr. Revisa los chequeos (PASA o FALLA) y la grafica.
  5. Boton Exportar salidas CSV: produce salidas_E003.csv en formato largo (t, variable, valor, origen). Boton Descargar este HTML: produce modelo_E003.html con tus formulas y tus datos. Los dos son entregables.

6. Chequeos de aceptacion (autoevaluate antes de entregar)

  • Infectados alcanza su maximo entre el dia 175 y el dia 215 (clave: dia 195, 2020-09-17).
  • Recuperados al dia 730 esta entre 2,249,737 y 3,043,762 (clave: 2,646,749).
  • Susceptibles nunca baja de 0 (clave: minimo 1,886,084).

Si un chequeo falla, revisa primero las formulas de las casillas ?; luego los datos cargados (deben tener 731 filas).

7. Variables elegibles para el analisis (elige 5, al menos una real; las marcadas con * son el camino sencillo)

Variable Origen En ciclo Unidad
d_casos_7d* real no personas/dia
d_importados real no personas/dia
casos_7d (columna de v_territorio) real no personas/dia
Susceptibles* simulado si personas
Infectados* simulado si personas
Recuperados simulado no personas

8. Donde buscar tus 2 insights

  • El dia del pico de Infectados del modelo frente al pico del dato casos_7d.
  • El signo de brecha_dato_modelo por tramos: cuando exagera y cuando se queda corto el modelo.

9. Ideas de empleados IA (elige o inventa; uno por insight)

  • Un empleado IA que recalibre tasa_contacto cada semana con la brecha y avise cuando el modelo se aleje del dato.
  • Un empleado IA que escriba el boletin semanal del territorio con la fraccion susceptible y el pico esperado.

10. Supuestos de esta ficha (valores ya puestos en el modelo)

Clave Valor Que significa
POB 4,532,152 poblacion del territorio, DANE 2020 aprox.

Nota de contenido: estos datos cuentan fallecidos. Si el tema te resulta dificil, el camino sencillo no usa esa variable y puedes hablar en privado con el profesor.

Parte 4. Empleados IA: plantilla y lecturas

Cada empleado IA se construye en la página empleado_ia_plantilla.html del kit: a la izquierda un formulario, a la derecha el documento que se arma solo (ficha de una página, hoja de vida con actividades día a día, prompt con rails, harness, palabras usadas, riesgos AIR 2024, políticas, procesos con diagrama de flujo y protocolo de contención). El botón Cargar ejemplo muestra el empleado Vigía de brecha del caso E003; el botón Descargar este HTML produce empleado_ia1_Exxx.html o empleado_ia2_Exxx.html. Las lecturas de apoyo son estas:

Cómo escribir el prompt con rails y el harness

Lectura corta, 2 páginas. El texto se escribe dentro de empleado_ia_plantilla.html, secciones 3 y 4. Aquí solo aprendes qué va en cada casilla.

Idea en una frase: el prompt dice cómo piensa el empleado y los rails dicen lo que nunca hace. El harness dice cómo se opera.


1. El prompt con rails (sección 3 de la plantilla)

Un prompt con rails tiene 9 casillas. Llénalas en orden. Cada una tiene un ejemplo del Vigía de camas, familia F2.

Casilla Qué escribes Regla
Identidad Quién es, a quién sirve, en qué tono, en qué idioma. Sin nombres de personas. Ejemplo: "sirve al equipo de prensa de la secretaría de salud".
Misión El insight de origen con su número y su ciclo. Qué hace con ese insight. El número sale de tu dashboard. El ciclo lleva su letra R o B.
Entradas La fuente (tu CSV o tu vista), el nodo que lo dispara, el umbral y de dónde salió. Una sola fuente. Ejemplo: "datos_E017.csv y salidas_E017.csv".
Pasos Máximo 5, en orden: leer, comparar, qué hacer si pasa, qué hacer si no, revisar los rechazos. El último paso siempre revisa R0, R1 y R2.
Salidas Formato exacto, longitud, idioma, qué siempre incluye, qué nunca incluye. Siempre: el día t, el valor, el umbral, la fuente. Nunca: nombres, consejo médico, celdas con n < 5.
Rails G1 a G3 Reglas que sigue siempre. Entre 3 y 6. Uno nace del ciclo y lo nombra.
Rechazos R0, R1, R2 Cuándo NO responde y qué frase dice. R0 y R1 son fijos. R2 nace del ciclo.
Entrega a humano Cuándo entrega, a quién (rol), con qué, en qué plazo. El empleado propone. El humano decide.
Ejemplos Uno normal y uno de rechazo o de entrega, con entrada y salida exactas. Usa filas reales de tu CSV.

Los dos rechazos fijos

Van iguales en todo prompt del curso. No se cambian.

  • R0: "Nunca doy consejo médico a una persona. Respondo: No puedo dar consejo médico individual. Consulta a tu servicio de salud."
  • R1: "Nunca publico una celda con n < 5 personas. Respondo: Dato suprimido por celda pequeña (n < 5)."

El rail y el rechazo que nacen del ciclo

Tu ciclo te dice qué puede salir mal si el empleado se pasa de listo.

  • Ciclo B1 de saturación hospitalaria: la letalidad cambia cuando la ocupación pasa de 1. Un rail: "nunca recomiendo trasladar pacientes; solo aviso". Un rechazo: "no proyecto más de 14 días, porque B1 cambia la letalidad".
  • Ciclo R1 de contagio: la curva crece hasta que un B la frena. Un rail: "nunca escribo una fecha de pico como certeza". Un rechazo: "no anuncio una nueva ola por mi cuenta; entrego a un humano".

Las cinco anclas

Un prompt es tuyo cuando tiene estas 5 cosas dentro del texto. Sin una, el prompt es genérico.

  1. El nombre de tu fuente. Ejemplo: datos_E017.csv.
  2. El nombre exacto de tu nodo. Ejemplo: ocupacion.
  3. Tu ciclo con letra. Ejemplo: B1.
  4. Un número de tu dashboard como umbral. Ejemplo: 0.85 = media 0.62 + 1 desviación 0.23.
  5. Tu R2, nacido del ciclo. Ejemplo: "no proyecto más de 14 días".

2. El ejemplo del Vigía en 10 líneas

Así se ve un prompt con rails completo, resumido. El tuyo es más largo, pero tiene la misma forma.

1. Identidad: Eres Vigía de camas. Sirves al equipo de prensa de la secretaría de salud. Tono claro y breve. Español de Colombia.
2. Misión: cuando ocupacion sube, letalidad sube, porque el ciclo B1 equilibra por el peor camino. Umbral 0.85 = media 0.62 + 1 desviación 0.23. Aviso cuando la ocupación del día pase de 0.85.
3. Entradas: datos_E017.csv (casos_7d) y salidas_E017.csv (ocupacion). Nodo que dispara: ocupacion.
4. Pasos: leo las filas; comparo ocupacion con 0.85; si supera, alerta de 3 líneas; si no, "Sin alerta" con el valor; reviso R0, R1, R2.
5. Salidas: lista de 3 puntos, máximo 60 palabras. Siempre: día t, valor, umbral 0.85, fuente. Nunca: nombres, consejo médico, celdas con n < 5.
6. G1: solo uso datos_E017.csv y salidas_E017.csv. G2: si una fila está vacía, lo digo y no invento. G3 (ciclo B1): nunca recomiendo trasladar pacientes ni abrir camas; solo aviso.
7. R0 y R1 fijos. R2 (ciclo B1): no proyecto más de 14 días. Respondo: "No proyecto más de 14 días."
8. Entrega a humano: si ocupacion > 0.85 o hay una fila vacía, entrego al editor de turno con las filas, el valor y mi borrador. Plazo: 2 horas.
9. Ejemplo normal: t=120, ocupacion=0.71 → "Día 120: ocupacion 0.71, umbral 0.85. Sin alerta. Fuente: salidas_E017.csv."
10. Ejemplo de entrega: t=290, ocupacion=0.91 → "ALERTA día 290: ocupacion 0.91 supera 0.85. Por B1 la letalidad puede subir. No recomiendo acciones (G3). Entrego al editor."

Las 5 anclas del ejemplo: datos_E017.csv, ocupacion, B1, 0.85, R2 de 14 días. Están las cinco.


3. El harness (sección 4 de la plantilla)

Harness significa arnés. Es lo que sujeta al empleado para que corra sin soltarse. Tiene 7 casillas.

Casilla Qué escribes Ejemplo del Vigía de camas
Disparador Cuándo arranca. "Cada día a las 08:00, cuando salidas_E017.csv tiene una fila nueva."
Formato de entrada Qué recibe, exacto. "CSV largo: t, variable, valor, origen. Solo la variable ocupacion de los últimos 7 días."
Formato de salida Qué entrega, exacto. "Lista de 3 puntos, máximo 60 palabras. Nada más."
3 pruebas Una normal, una de borde, una de rechazo. Con su resultado esperado. "0.71 → sin alerta. 0.85 exacto → sin alerta. Fila vacía → dice que falta y no inventa."
Registro Qué se guarda, dónde, cuánto tiempo. "Fecha, 7 valores, mensaje, id del modelo. En registro_vigia.csv, 90 días."
Interruptor Quién lo apaga y cómo, en menos de 5 minutos. "El editor o el analista quitan la tarea diaria y borran la llave del gestor de llaves."
Costo Cuánto cuesta al mes, con su cálculo. "30 llamadas al mes por 2,000 tokens: menos de 20,000 COP."

Cómo escribir las 3 pruebas

  1. Normal: una fila real donde el empleado debe hacer su trabajo normal.
  2. Borde: el valor justo en el umbral, o el primer día, o un día sin datos nuevos.
  3. Rechazo: una entrada que activa R0, R1 o R2. La salida esperada es la frase de rechazo.

Si no puedes escribir la prueba de rechazo, tu R2 no está claro. Vuelve al prompt.


4. Lista de chequeo antes de descargar el HTML

  • La misión tiene un número de mi dashboard y mi ciclo con letra.
  • Las entradas nombran mi CSV y mi nodo exacto.
  • Hay 3 o más rails y uno nace del ciclo.
  • R0 y R1 están iguales a los fijos. R2 nace del ciclo.
  • Hay un ejemplo normal y uno de rechazo con filas reales.
  • El harness tiene las 7 casillas y las 3 pruebas tienen resultado esperado.
  • No hay llaves ni contraseñas en ninguna casilla.

Tarjeta AIR 2024 (en español)

Úsala para la sección 6 (Riesgos) de empleado_ia_plantilla.html.


1. La fuente

Zeng, Klyman, Zhou et al. (2024). "AI Risk Categorization Decoded (AIR 2024): From Government Regulations to Corporate Policies". arXiv:2406.17864, junio de 2024.


2. Qué es, en 5 líneas

  1. Es un catálogo de 314 riesgos de la IA, ordenados en 4 niveles.
  2. Nivel 1 tiene 4 grupos grandes. Nivel 2 tiene 16 categorías.
  3. Se construyó leyendo 8 políticas de gobierno. Son el GDPR y el AI Act de la Unión Europea. También la Orden Ejecutiva de Estados Unidos de octubre de 2023. Y 5 regulaciones de China.
  4. También leyó 16 políticas de uso de 9 empresas que hacen modelos.
  5. Es un catálogo, no una evaluación. La severidad la pones tú.

3. Nivel 1: los 4 grupos

Letra Nombre en español Nombre original
A Riesgos del sistema y operativos System & Operational Risks
B Riesgos de seguridad del contenido Content Safety Risks
C Riesgos sociales Societal Risks
D Riesgos legales y de derechos Legal & Rights-Related Risks

4. Nivel 2: las 16 categorías, agrupadas

A. Riesgos del sistema y operativos (2)

  1. Riesgos de seguridad (Security Risks)
  2. Usos operativos indebidos (Operational Misuses)

B. Riesgos de seguridad del contenido (5)

  1. Violencia y extremismo (Violence & Extremism)
  2. Odio y toxicidad (Hate/Toxicity)
  3. Contenido sexual (Sexual Content)
  4. Daño a menores (Child Harm)
  5. Autolesión (Self-harm)

C. Riesgos sociales (5)

  1. Uso político (Political Usage)
  2. Daño económico (Economic Harm)
  3. Engaño (Deception)
  4. Manipulación (Manipulation)
  5. Difamación (Defamation)

D. Riesgos legales y de derechos (4)

  1. Derechos fundamentales (Fundamental Rights)
  2. Discriminación y sesgo (Discrimination/Bias)
  3. Privacidad (Privacy)
  4. Actividades delictivas (Criminal Activities)

5. Nivel 3: tarjeta curada de 18 riesgos para un empleado de DATOS

El catálogo completo tiene muchos más. Estos 18 son los que tocan a un empleado que lee totales de salud pública.

Etiquetas:

  • verbatim: el nombre existe en el paper con ese nombre.
  • lectura del curso: el curso lo lee desde una categoría de nivel 2. El paper no usa ese nombre exacto.

Grupo A. Riesgos del sistema y operativos (6)

# L2 L3 en español (original) Etiqueta Qué significa para tu empleado
1 Riesgos de seguridad Confidencialidad (Confidentiality) verbatim Filtra la llave o datos internos.
2 Riesgos de seguridad Integridad (Integrity) verbatim Alguien cambia los datos o el empleado los altera.
3 Riesgos de seguridad Disponibilidad (Availability) verbatim El empleado deja de correr cuando hace falta.
4 Usos operativos indebidos Toma de decisiones automatizada (Automated Decision-Making) verbatim Decide solo, sin que un humano pueda corregir.
5 Usos operativos indebidos Operación autónoma insegura de sistemas (Autonomous Unsafe Operation of Systems) verbatim Dispara acciones reales sin revisión.
6 Usos operativos indebidos Consejo en industrias muy reguladas (Advice in Heavily Regulated Industries) verbatim Da consejo de salud sin autorización.

Grupo B. Riesgos de seguridad del contenido (2)

# L2 L3 en español (original) Etiqueta Qué significa para tu empleado
7 Odio y toxicidad Lenguaje ofensivo (Offensive Language) verbatim Un tono que ofende a un territorio o a un grupo.
8 Odio y toxicidad Perpetuar creencias dañinas (Perpetuating Harmful Beliefs) verbatim Repite estereotipos sobre regiones, edades o sexos.

Grupo C. Riesgos sociales (6)

# L2 L3 en español (original) Etiqueta Qué significa para tu empleado
9 Uso político Alterar el orden social (Disrupting Social Order) verbatim Una alerta falsa causa alarma pública.
10 Engaño Desinformación y estadísticas inventadas lectura del curso El modelo inventa un número y lo presenta como dato.
11 Engaño Esquemas fraudulentos (Fraudulent Schemes) verbatim Alguien usa la salida para engañar a otros.
12 Engaño Tergiversación (Misrepresentation) verbatim La salida parece escrita por una autoridad humana.
13 Manipulación Sobreconfianza en la IA lectura del curso El humano deja de revisar y confía a ciegas.
14 Difamación Difamación de instituciones lectura del curso La salida culpa a un hospital o a una entidad sin prueba.

Grupo D. Riesgos legales y de derechos (4)

# L2 L3 en español (original) Etiqueta Qué significa para tu empleado
15 Privacidad Violaciones no autorizadas de privacidad (Unauthorized Privacy Violations) verbatim Reidentificar personas en celdas pequeñas (n < 5).
16 Privacidad Tipos de datos sensibles (Types of Sensitive Data) verbatim La salud es dato sensible.
17 Discriminación y sesgo Actividades discriminatorias (Discriminatory Activities) verbatim Trata distinto a un grupo por edad, sexo o territorio.
18 Discriminación y sesgo Características protegidas (Protected Characteristics) verbatim Edad, sexo y origen son características protegidas.

Otros nombres de nivel 3 existen en el paper y aquí no se usan. Son cinco:

  • Acoso (Harassment)
  • Desalentar la participación democrática (Deterring Democratic Participation)
  • Influir en la política (Influencing Politics)
  • Desplazar o quitar poder a trabajadores (Displacing/Disempowering Workers)
  • Prácticas de mercado desleales (Unfair Market Practices)

6. Cómo elegir exactamente 3 riesgos y 1 "no aplica"

  1. Riesgo 1: elige uno del grupo A. Ejemplo: Toma de decisiones automatizada.
  2. Riesgo 2: elige uno del grupo C o del grupo D. Ejemplo: Violaciones no autorizadas de privacidad.
  3. Riesgo 3: elige el que más te preocupe, de cualquier grupo. Ejemplo: Desinformación y estadísticas inventadas.
  4. "No aplica": elige una categoría de nivel 2 que NO toca a tu empleado. Di por qué en una frase.
  5. Para cada riesgo escribe la cadena completa: L1 → L2 → L3.
  6. Para cada riesgo escribe severidad B, M o A y una razón.
  7. Cada mitigación apunta a un G# de tu superprompt.

7. Ejemplo en 4 líneas

Riesgo: D. Riesgos legales y de derechos → Privacidad → Violaciones no autorizadas de privacidad (verbatim).
Severidad: A. Una celda con 2 personas en un municipio pequeño identifica a alguien.
Mitigación: R1 y G5: nunca publico celdas con n < 5. Residual: B.
Punto humano: el supervisor revisa toda tabla antes de publicarla.

Bitácora de IA (plantilla)

Aquí anotas cómo usaste la IA durante el examen. Es obligatoria. Si falta, la nota del Pilar 3 baja 10 %.

Reglas:

  1. Máximo 5 entradas. Si usaste la IA más veces, anota las 5 más útiles.
  2. Cada entrada es una fila. Frases cortas.
  3. No pegues el prompt completo. Resúmelo en una línea.
  4. Siempre di qué se equivocó el modelo. Si no se equivocó, escribe "nada visible".
  5. Nunca pegues una llave ni una contraseña.

Si te atascas: mira la fila de ejemplo y bórrala al final.


Modelo usado

Modelo usado: [[claude-haiku-5-5 | claude-sonnet-5-5 | gemini-2.5-flash | otro: nombre exacto]]
Dónde lo usé: [[app web | API con script]]

Entradas (máximo 5)

# Prompt resumido Qué se equivocó el modelo Qué cambié Qué entregable afectó
EJEMPLO "Explícame por qué mi ciclo B1 es de equilibrio." Dijo que era R porque "la letalidad sube". Confundió signo con tipo de ciclo. Le pedí que siguiera la cadena nodo por nodo y contara los signos negativos. insight 1 y tarjeta del ciclo en el dashboard
1 [[una línea]] [[una línea]] [[una línea]] [[modelo | SQL | dashboard | insight | superprompt | CV | gobernanza]]
2 [[una línea]] [[una línea]] [[una línea]] [[...]]
3 [[una línea]] [[una línea]] [[una línea]] [[...]]
4 [[una línea]] [[una línea]] [[una línea]] [[...]]
5 [[una línea]] [[una línea]] [[una línea]] [[...]]

Borra la fila EJEMPLO. Borra las filas que no uses.


Checklist

  • Escribí el modelo usado con su id exacto.
  • Tengo entre 1 y 5 entradas.
  • Cada entrada dice qué se equivocó el modelo.
  • No hay llaves ni contraseñas en esta hoja.

Parte 5. Dashboard y entrega

5.1 El dashboard

El archivo dashboard_plantilla.html es un solo archivo HTML, CSS y JS. No cambies el diseño. Cambia los datos y los textos.

  1. Abre tu dashboard_Exxx.html, que creó ingesta_Exxx.py con los datos de tu base ya adentro. Si no corriste el script, abre dashboard_plantilla.html.
  2. Con la plantilla, carga tu mi_territorio_Exxx.csv o datos_Exxx.csv (ancho: una columna por variable del territorio). Si quieres comparar, carga también tu salidas_Exxx.csv del modelo (largo: t, variable, valor, origen).
  3. Elige 5 variables en las tarjetas. La página calcula media, mediana, moda, desviación, coeficiente de variación y sesgo, y dibuja el histograma de cada una.
  4. Escribe al lado tus propios números (de DuckDB o de tu calculadora). La página marca "coincide" o "revisa".
  5. Escribe 3 hechos y 2 insights. Cada insight lleva su conclusión: la problemática, qué hacer para mejorar el sistema y el empleado IA (nombre y arquetipo). Botón Descargar este HTML: dashboard_Exxx.html.

Paleta fija: azul #0072B2 para lo real (línea sólida, círculos) y naranja #D55E00 para lo simulado (línea punteada, cuadrados). Nunca rojo frente a verde. Forma y texto acompañan siempre al color.

5.2 La entrega

Para entregar no necesitas programas nuevos. Crea una carpeta con tu código, pon dentro los archivos con los nombres fijos, comprímela (clic derecho, Comprimir) y envía el zip por correo con el nombre EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip. Un zip incompleto, enviado a tiempo, también se califica.

Nombres fijos: modelo_mano_Exxx.jpg (o png o pdf), modelo_Exxx.html, salidas_Exxx.csv, sql_Exxx.txt, dashboard_Exxx.html, insights_Exxx.txt, empleado_ia1_Exxx.html, empleado_ia2_Exxx.html, bitacora_ia.txt, transferencia.txt.

Parte 6. Guía permanente

Guía permanente: Sistema, Datos, IA

Curso: Analítica de Datos con Inteligencia Artificial, Universidad de La Sabana.

Esta guía es tuya. La usaste en el examen y la puedes usar en cualquier proyecto futuro. Tiene tres capítulos y una tarjeta final.

Capítulo Pregunta que responde Lo usas cuando
1. Sistemas ¿Cómo enmarco un problema con stocks, flujos y ciclos? Tienes un problema que cambia en el tiempo y quieres entender por qué.
2. Datos ¿Cómo analizo datos y los defiendo con números? Tienes una tabla y debes decir qué pasa, con media, mediana y desviación.
3. IA ¿Cómo diseño, pruebo y gobierno una IA que trabaje conmigo? Quieres automatizar una tarea con un modelo de lenguaje sin perder el control.
Tarjeta ¿Puedo repetir esto con otro problema? Siempre, al final de cada proyecto.

Cómo usar la guía en 3 pasos:

  1. Lee la línea "En una frase" de cada capítulo. Son tres frases.
  2. Busca la receta numerada del capítulo que necesitas. Síguela en orden.
  3. Al terminar, llena la tarjeta de transferencia. Guárdala con el proyecto.

Las tres frases, juntas: un sistema se entiende con stocks, flujos y ciclos; un número se defiende con media, mediana y desviación, y se etiqueta como DATO o JUICIO; una IA se diseña con un superprompt, se describe con una hoja de vida y se gobierna con un marco que dice quién la posee y cuándo se apaga.


Capítulo 1. Cómo enmarcar cualquier problema con dinámica de sistemas

En una frase: enmarcas un problema cuando dices qué se acumula, qué lo cambia y qué ciclo lo mueve.

Cómo usar este capítulo. Lee una sección a la vez. Cada sección empieza con "En una frase". Al final hay una lista de chequeo. Los ejemplos COVID vienen del examen. Cada ejemplo COVID va seguido de un ejemplo de comunicación. En 5 años el tema cambia. El método es el mismo.


1.1 Las 4 piezas

En una frase: todo modelo se dibuja con 4 piezas: cajas, tubos, círculos y flechas.

Pieza 1. Stock (caja)

Un stock es algo que se acumula. Se dibuja como una caja (un rectángulo). Si paras el tiempo, el stock sigue ahí.

  • Regla: el stock se mide en unidades, nunca "por día". Ejemplo COVID: Infectados, en personas.
  • Ejemplo de comunicación: Suscriptores de un boletín, en personas.

Pieza 2. Flujo (tubo con válvula)

Un flujo cambia un stock. Se dibuja como un tubo con una válvula (una llave). Entra a una caja o sale de ella.

  • Regla: el flujo se mide en unidades por día. Ejemplo COVID: infeccion, en personas por día.
  • Ejemplo de comunicación: altas al boletín, en personas por día.
  • Si el tubo nace o termina fuera del modelo, se dibuja una nube. La nube significa "de ahí no me ocupo".

Pieza 3. Convertidor (círculo)

Un convertidor calcula un número. Se dibuja como un círculo. No acumula nada. Puede ser un parámetro (un número fijo) o una fórmula.

  • Ejemplo COVID: fraccion_susceptible = Susceptibles / poblacion. Es un número entre 0 y 1, sin unidad.
  • Ejemplo de comunicación: tasa_de_apertura = aperturas / enviados.
  • Un convertidor de datos lee una columna de tu CSV. En el examen empieza con d_. Ejemplo: d_casos_7d.

Pieza 4. Arco de información (flecha con signo)

Un arco dice "este número usa a este otro". Se dibuja como una flecha delgada y curva. No mueve material, solo información. Cada arco lleva un signo.

  • Signo +: los dos nodos van en la misma dirección. Si el origen sube, el destino sube. Ejemplo COVID: Infectados → infeccion es +. Más infectados, más contagios.
  • Signo -: van en dirección contraria. Si el origen sube, el destino baja. Ejemplo COVID: infeccion → Susceptibles es -. Más contagios, menos susceptibles.
  • Ejemplo de comunicación: Suscriptores → recomendaciones es +. Precio → altas es -.

Nodos y arcos: todo el modelo en dos palabras

El modelo entero se lee con dos palabras. Los nodos son las piezas 1, 2 y 3: cajas, válvulas y círculos. Los arcos son las flechas con signo. Si no puedes dibujar, escribe así:

  • Infectados →(+) infeccion: arco de información con signo más.
  • infeccion →(-) Susceptibles: arco con signo menos.
  • infeccion ⇒ Infectados: flujo que entra al stock.
  • Infectados ⇒ recuperacion: flujo que sale del stock.

Tu modelo del examen se puede leer entero con esta notación.

Cómo dibujar un modelo a mano en 6 pasos

Lápiz, papel y un marcador grueso. Un dibujo legible vale lo mismo que uno bonito.

  1. Stocks primero. Una caja por cada cosa que se acumula, con su nombre. Ejemplo: Susceptibles, Infectados, Recuperados.
  2. Flujos. Un tubo con válvula entre cajas, o desde una nube, o hacia una nube. Ejemplo: infeccion, recuperacion.
  3. Convertidores. Un círculo por cada cálculo o parámetro, incluido el que falta. Ejemplo: fraccion_susceptible, duracion_infeccion.
  4. Arcos con signo. Una flecha delgada desde cada número que una fórmula usa, con su + o su -. Ejemplo: Infectados →(+) infeccion.
  5. Marca los ciclos. Recorre cada ciclo, cuenta los signos - y escribe R o B con su número. Ejemplo: R1, B1.
  6. Escribe 5 frases debajo. Qué se acumula, qué lo cambia, qué ciclo empuja, qué ciclo frena, qué dato lo alimenta.

Luego fotografía el dibujo desde arriba, con luz y sin sombra. Pasarlo a la página HTML es el paso siguiente.

La regla de unidades

  1. Stock: unidades. Ejemplo: personas.
  2. Flujo: unidades por día. Ejemplo: personas por día.
  3. Flujo = stock / tiempo. Ejemplo: recuperacion = Infectados / duracion_infeccion. Personas / días = personas por día.
  4. Si las unidades no cierran, la fórmula está mal. Ejemplo: Infectados × 0,3 no es un flujo, le falta "por día".

1.2 Los 2 ciclos

En una frase: solo existen dos ciclos: uno empuja (R) y otro frena (B).

Ciclo R (refuerza)

Plantilla fija: "Cuando X sube, Y sube, y eso hace que X suba más: ciclo R".

  • COVID (F1): "Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: ciclo R".
  • Comunicación: "Cuando los seguidores suben, las recomendaciones suben, y eso hace que los seguidores suban más: ciclo R".
  • Forma de la curva: crece cada vez más rápido, hasta que un ciclo B lo frena.

Ciclo B (equilibra)

Plantilla fija: "Cuando X sube, Y baja, y eso frena a X: ciclo B".

  • COVID (F1): "Cuando Infectados sube, Susceptibles baja, y eso frena a infeccion: ciclo B".
  • Comunicación: "Cuando las quejas suben, las respuestas del equipo suben, y eso frena a las quejas: ciclo B".
  • Forma de la curva: se acerca a un tope o a una meta y se aplana.

Cómo saber si es R o B sin dudar: cuenta los signos menos

  1. Recorre el ciclo arco por arco hasta volver al nodo de partida.
  2. Cuenta cuántos arcos llevan signo -. Los flujos que salen de un stock cuentan como -; los que entran, como +.
  3. Número par de signos - (0, 2, 4): ciclo R. Número impar (1, 3): ciclo B.

Ejemplo COVID: Infectados →(+) infeccion ⇒(+) Infectados. Cero signos menos: R. Infectados →(+) infeccion →(-) Susceptibles →(+) fraccion_susceptible →(+) infeccion. Un signo menos: B.

Ejemplo de comunicación: Quejas →(+) respuestas →(-) Quejas. Un signo menos: B.

El retraso: "el ciclo llega tarde"

  • COVID (F3): la gente percibe el riesgo semanas después de que suben los casos. El ciclo B frena, pero tarde. Resultado: la ola sube de más y luego cae de más.
  • Comunicación: una marca responde a una crisis en redes tres días después. El ciclo B existe, pero llega tarde. Resultado: la crisis crece y la respuesta llega cuando ya sobra.
  • Regla: si ves oscilación (sube, baja, sube), busca un retraso dentro de un ciclo B.

1.3 La receta de 7 pasos

En una frase: 7 preguntas en orden convierten cualquier tema en un modelo.

  1. Pregunta y horizonte. ¿Qué quiero entender y en cuántos días? Ejemplo: "¿Por qué el boletín deja de crecer? 365 días".
  2. Stocks. ¿Qué se acumula? Ejemplo: Suscriptores (personas).
  3. Flujos. ¿Qué entra y qué sale de cada stock? Ejemplo: altas y bajas (personas por día).
  4. Datos. ¿Qué columna alimenta a qué convertidor? Ejemplo: la columna envios_dia alimenta a d_envios.
  5. Ciclos. Escribe una frase R o B por ciclo. Ejemplo: "Cuando Suscriptores sube, recomendaciones sube, y eso hace que Suscriptores suba más: R".
  6. Supuestos. Un número por parámetro, con su unidad. Ejemplo: tasa_de_baja = 0,005 por día.
  7. Chequeo. "¿Qué debería pasar si...?" Ejemplo: "Si dejo de enviar, las altas por envío deben caer a cero".

Ejemplo resuelto en 10 líneas: suscriptores de un boletín

Líneas 1 a 5: la estructura.

  1. Pregunta: ¿por qué el boletín se estanca cerca de 10.000 suscriptores? Horizonte: 365 días.
  2. Stock: Suscriptores (personas). Valor inicial: 2.000.
  3. Flujo de entrada: altas (personas por día). Flujo de salida: bajas (personas por día).
  4. Datos: la tabla v_boletin trae envios_dia. Alimenta al convertidor d_envios.
  5. altas = recomendaciones + altas_por_envio. recomendaciones = Suscriptores × tasa_recomendacion.

Líneas 6 a 10: los ciclos y el chequeo.

  1. bajas = Suscriptores × tasa_de_baja. altas_por_envio = d_envios × altas_por_correo.
  2. Ciclo R: "Cuando Suscriptores sube, recomendaciones sube, y eso hace que Suscriptores suba más: R". Cero signos menos.
  3. Ciclo B: "Cuando Suscriptores sube, bajas sube, y eso frena a Suscriptores: B". Un signo menos: bajas ⇒ Suscriptores.
  4. Supuestos: tasa_recomendacion = 0,002 por día; tasa_de_baja = 0,005 por día; 3 altas por correo; 10 correos por día.
  5. Chequeo: el stock se detiene cuando altas = bajas. Con estos números, en 10.000 personas. Coincide con la pregunta.

1.4 La biblioteca de 11 patrones

En una frase: casi cualquier problema nuevo se parece a uno de estos 11 patrones.

Cómo usar la biblioteca: lee la línea "Lo reconoces cuando". Si describe tu problema, copia los stocks y los ciclos. Cambia los nombres. Ya tienes el 70 % del modelo.

F1. Difusión con límite (COVID: contagio básico)

  • Stocks: Susceptibles, Infectados, Recuperados.
  • Ciclo R: "Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: R".
  • Ciclo B: "Cuando Infectados sube, Susceptibles baja, y eso frena a infeccion: B".
  • Lo reconoces cuando: algo crece rápido y luego se agota, porque se acaba el público nuevo.
  • Comunicación: un video viral. Quien ya lo vio no lo vuelve a "descubrir".

F2. Límite de capacidad (COVID: capacidad hospitalaria)

  • Stocks: Hospitalizados, Fallecidos_modelo, Fallecidos_dato.
  • Ciclo B1: "Cuando Hospitalizados sube, ocupacion sube, letalidad sube, muertes_hosp sube, y eso frena a Hospitalizados: B, por el peor camino".
  • Ciclo B2: "Cuando Hospitalizados sube, altas sube, y eso frena a Hospitalizados: B".
  • Lo reconoces cuando: una cola crece y el servicio empeora al pasar del 100 % de ocupación.
  • Comunicación: un call center en una crisis. Pasado el tope, las llamadas se pierden.

F3. Atención y respuesta con retraso (COVID: percepción de riesgo)

  • Stocks: Atencion, Percepcion, Infectados_modelo.
  • Ciclo B: "Cuando infeccion sube, Atencion sube, Percepcion sube, cumplimiento sube, y eso frena a infeccion: B, con retraso".
  • Ciclo R: "Cuando Infectados_modelo sube, infeccion sube, y eso hace que Infectados_modelo suba más: R".
  • Lo reconoces cuando: el público reacciona tarde y después se olvida solo.
  • Comunicación: una campaña de seguridad vial. La atención sube con la noticia y decae sin noticias nuevas.

F4. Lo medido frente a lo real (COVID: detección y pruebas)

  • Stocks: No_detectados, Detectados, Capacidad_pruebas.
  • Ciclo B1: "Cuando No_detectados sube, positividad sube, Capacidad_pruebas sube, deteccion sube, y eso frena a No_detectados: B".
  • Ciclo B2: "Cuando No_detectados sube, recuperacion_sin_prueba sube, y eso frena a No_detectados: B".
  • Lo reconoces cuando: el número que ves depende de cuánto mides, no solo de cuánto existe.
  • Comunicación: menciones de marca. Solo ves las que tu herramienta rastrea.

F5. Tubería con colas y rezagos (COVID: rezago de reporte)

  • Stocks: Sin_diagnostico, Sin_reportar, Reportados.
  • Ciclo B1: "Cuando Sin_diagnostico sube, presion_cola sube, diagnostico sube, y eso frena a Sin_diagnostico: B".
  • Ciclo B2: "Cuando Sin_reportar sube, reporte sube, y eso frena a Sin_reportar: B".
  • Lo reconoces cuando: el dato de hoy llega mañana y cada etapa tiene su cola.
  • Comunicación: una redacción. Notas escritas, en edición, publicadas; la cola de edición crece los lunes.

F6. Pérdida y reentrada (COVID: inmunidad)

  • Stocks: Susceptibles, Infectados, Inmunes.
  • Ciclo R: "Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: R".
  • Ciclo B: "Cuando Inmunes sube, perdida_inmunidad sube, y eso frena a Inmunes: B, y Susceptibles vuelve a crecer".
  • Lo reconoces cuando: hay olas repetidas y lo ganado se pierde con el tiempo.
  • Comunicación: audiencias que se van y vuelven. Churn y re-enganche de una app o de un boletín.

F7. Dos relatos en competencia (COVID: infodemia)

  • Stocks: Indecisos, Informados, Desinformados.
  • Ciclo R: "Cuando Desinformados sube, contagio_rumor sube, y eso hace que Desinformados suba más: R".
  • Ciclo B: "Cuando Desinformados sube, correccion sube (hasta su capacidad), y eso frena a Desinformados: B".
  • Lo reconoces cuando: dos mensajes pelean por las mismas personas y los indecisos se acaban.
  • Comunicación: crisis de marca. El rumor y el desmentido compiten por la misma audiencia.

F8. Sistemas acoplados (COVID: dos territorios)

  • Stocks: Susceptibles_A, Infectados_A, Susceptibles_B, Infectados_B.
  • Ciclos R1 y R2: "Cuando Infectados_A sube, infeccion_A sube, y eso hace que Infectados_A suba más: R". Igual en B.
  • Ciclos B1 y B2: "Cuando Infectados_A sube, Susceptibles_A baja, y eso frena a infeccion_A: B". Igual en B.
  • Lo reconoces cuando: dos lugares o plataformas se contagian entre sí y uno va adelante.
  • Comunicación: una tendencia que pasa de TikTok a Instagram. Dos mercados de una misma marca.

F9. Segmentos con riesgo distinto (COVID: edades)

  • Stocks: Infectados_jovenes, Infectados_mayores, Fallecidos_modelo, Fallecidos_dato.
  • Ciclo R: "Cuando Infectados_jovenes sube, contagio_intergeneracional sube, Infectados_mayores sube, y las muertes suben: R del daño".
  • Ciclo B: "Cuando los casos jóvenes suben, proteccion sube, y eso frena a contagio_intergeneracional: B".
  • Lo reconoces cuando: el promedio engaña porque los grupos son distintos.
  • Comunicación: una campaña con dos públicos. La respuesta total depende de la mezcla, no de la tasa de cada grupo.

F10. Círculo vicioso de la carga (COVID: personal de salud)

  • Stocks: Pacientes_en_espera, Personal_disponible, Personal_aislado.
  • Ciclo R: "Cuando Pacientes_en_espera sube, carga_por_trabajador sube, contagio_personal sube, Personal_disponible baja, y eso hace que la carga suba más: R".
  • Ciclo B: "Cuando Personal_aislado sube, retorno sube, y eso devuelve gente a Personal_disponible: B".
  • Lo reconoces cuando: más trabajo deja menos gente para hacerlo.
  • Comunicación: community managers en una crisis. El agotamiento reduce el equipo justo cuando más hace falta.

F11. Confianza lenta de construir y rápida de perder (COVID: comunicación pública)

  • Stocks: Confianza, Rumores, Infectados_modelo.
  • Ciclo R: "Cuando Rumores sube, erosion sube, Confianza baja, adherencia baja, infeccion sube, y eso hace que Rumores suba más: R".
  • Ciclo B: "Cuando Rumores sube, desmentidos sube, y eso frena a Rumores: B".
  • Lo reconoces cuando: años de credibilidad caen en días, y los datos tardíos se leen como mensajes contradictorios.
  • Comunicación: la confianza en un medio. Cada corrección pública la construye despacio; un error viral la tumba rápido.

1.5 Cómo conectar el modelo a los datos

En una frase: los datos llegan en un CSV con un día por fila y el modelo lo lee con un botón.

La página HTML del modelo no lee bases de datos. Lee un archivo CSV. El puente tiene 3 pasos.

  1. Alguien construye la tabla diaria de tu territorio con SQL. En el examen la construye ingesta_Exxx.py en tu DuckDB local (vista v_territorio_X) y la exporta como mi_territorio_Exxx.csv; datos_Exxx.csv es la misma tabla, de respaldo.
  2. El CSV tiene la columna t (0, 1, 2 ... 730), la fecha y una columna por variable. Las columnas que el modelo necesita se llaman como sus convertidores d_, sin el prefijo. Ejemplo: casos_7d alimenta d_casos_7d.
  3. En la página HTML: botón Cargar datos, elige el CSV, luego Correr. Si cambias el CSV, vuelve a cargarlo.

Ejemplo de la consulta que lee la tabla en tu DuckDB local:

SELECT t, dia, casos_7d, importados FROM v_territorio_76 ORDER BY t;

Reglas del CSV:

  • 731 filas de datos, una por día, sin huecos. Ejemplo: t = 0 es 2020-03-06 y t = 730 es 2022-03-06.
  • Nombres de columna en minúsculas, sin tildes ni espacios. Ejemplo: casos_7d, no Casos 7 días.
  • Punto decimal, coma como separador. Ejemplo: 12.5, no 12,5.
  • El CSV vive junto a la página Exxx-modelo.html.

¿Por qué una tabla con SQL y no números pegados? Porque el modelo sigue a los datos. Si corriges la limpieza, la tabla cambia, el CSV cambia y el modelo cambia. Con números pegados, nadie sabe de dónde salieron. Ejemplo de comunicación: la tabla v_boletin lee los envíos de cada semana; el modelo se actualiza solo.

Simular: cambiar un número y mirar

Un modelo que corre sirve para preguntar "¿y si...?". Cambia un parámetro, pulsa Correr y mira el gráfico.

  • Ejemplo COVID: sube tasa_contacto de 6 a 8. El pico llega antes y es más alto. Baja duracion_infeccion de 10 a 7. El pico baja.
  • Ejemplo de comunicación: sube tasa_recomendacion de 0,002 a 0,004. El boletín se estanca en 20.000, no en 10.000.
  • Regla: cambia un solo número por vez. Escribe en una frase qué cambió. Luego devuelve el número a su valor.

1.6 Errores típicos

  1. Confundir stock con flujo. Síntoma: un stock "por día". Corrección: si se mide por día, es un flujo. Ejemplo: "casos diarios" es un flujo; "casos acumulados" es un stock.
  2. Un ciclo sin cerrar. Síntoma: la cadena no vuelve a la variable inicial. Corrección: recorre los arcos hasta volver a X. Ejemplo: Infectados → infeccion → Infectados.
  3. Ciclo R llamado B, o al revés. Corrección: cuenta los signos -. Par: R. Impar: B.
  4. Arco sin signo. Síntoma: no puedes decir si el ciclo es R o B. Corrección: pregunta "si el origen sube, ¿el destino sube o baja?" y escribe + o -.
  5. Parámetros sin unidad. Síntoma: "0,3". Corrección: "0,3 por día" o "0,3 sin unidad (fracción)".
  6. Pegar números en el modelo en vez de cargar el CSV. Síntoma: el modelo no cambia cuando corriges los datos. Corrección: tabla con SQL → CSV → botón "Cargar datos" de la página HTML.

1.7 Lista de chequeo del capítulo 1

  • Escribí la pregunta y el horizonte en días.
  • Cada stock tiene unidad y cada flujo tiene "por día".
  • Cada convertidor de datos d_ apunta a una columna del CSV.
  • Cada arco tiene su signo + o -.
  • Cada ciclo tiene su frase con la plantilla y su letra R o B, contando los signos -.
  • Cada parámetro tiene un número y una unidad.
  • El CSV tiene t en la primera columna y 731 filas.
  • Hice un chequeo "¿qué debería pasar si...?" y el modelo respondió como esperaba.

Capítulo 2. Cómo hacer análisis de datos que se pueda defender

En una frase: un análisis se defiende si otra persona puede repetirlo y cada número dice dato o juicio.

Cómo usar este capítulo. Cada sección es un paso de la misma tubería. Haz los pasos en orden. Los ejemplos COVID son del examen. Cada uno va seguido de un ejemplo de comunicación. El SQL está escrito para DuckDB, el mismo que usaste en clase. Solo necesitas Python en tu computador: el script de ingesta instala DuckDB por sí solo. Todo lo demás pasa en el navegador.


2.1 La tubería de 5 pasos

En una frase: ingestar, limpiar, medir calidad, analizar y mostrar, siempre en ese orden.

Paso 1. Ingestar con DuckDB en tu computador

Ingestar es cargar el archivo en un motor de base de datos. En este curso el motor corre en tu computador.

  • DuckDB es un motor de base de datos. Lo usaste en clase. El script ingesta_Exxx.py lo instala por sí solo si falta y hace la ingesta por ti: en Windows, doble clic; en Mac, abre Terminal, escribe python3 y un espacio, arrastra el archivo y pulsa Enter. Si prefieres escribir SQL tú mismo (opcional), usa los bloques de duckdb_Exxx.sql. La versión web (https://shell.duckdb.org/) sirve como plan B.
  • Lee un CSV directo desde una URL con read_csv('https://...'). Ejemplo del examen, la consulta exacta:
SELECT count(*) AS filas, sum(casos) AS casos FROM read_csv('https://class.audience-analysis.com/analitica-examen/covid_diario.csv');

Resultado: 252,677 filas y 6,388,216 casos. Si los dos números salen, los datos están cargados. En el examen, el script ingesta_Exxx.py hace esta ingesta por ti y escribe la evidencia en sql_Exxx.txt.

  • Postgres es un servidor. Varias personas lo consultan al mismo tiempo. Lo usarás en un equipo de trabajo. Ejemplo: la tabla de audiencias que leen 5 analistas y un dashboard. Hoy no hace falta.
  • Regla: los códigos se cargan como texto. Ejemplo: departamento es TEXT, no número.
  • Ejemplo de comunicación: un CSV de publicaciones exportado de la plataforma. Lo lees con read_csv igual que el de COVID.

Paso 2. Limpiar

Limpiar es crear una tabla limpia encima de la tabla cruda. La tabla cruda no se toca. Tres reglas sirven para cualquier conjunto de datos.

  1. Los códigos siempre son texto. Si los cargas como número, pierdes ceros y mezclas niveles. Ejemplo COVID: 8001 es Barranquilla y 8 es Atlántico; como números parecen parientes, pero son dos lugares. Ejemplo de comunicación: el código postal 05001 se vuelve 5001.
  2. Los dominios van en mayúscula única. Un valor con dos escrituras es dos categorías falsas. Ejemplo COVID: f y F son el mismo sexo; UPPER(sexo) los une. Ejemplo de comunicación: instagram e Instagram en una columna de canal.
  3. Las fechas no pueden ir hacia atrás. Un reporte anterior al diagnóstico es un error de la fuente. Ejemplo COVID: 163 grupos con rezago de reporte negativo; se marcan y se excluyen del promedio. Ejemplo de comunicación: una respuesta fechada antes de la queja.

Lección extra: un estado al último reporte no es un evento. Ejemplo COVID: hospital y uci dicen dónde estaba la persona cuando se actualizó el dato. No dicen cuántos entraron al hospital ese día. Por eso valen 0 durante más de un año. Ejemplo de comunicación: "suscriptor activo" hoy no dice cuándo se suscribió.

En el examen, el script ingesta_Exxx.py hace esta limpieza por ti. Crea covid_limpio y la vista de tu territorio. El archivo duckdb_Exxx.sql hace lo mismo en bloques de SQL (plan B). Tu trabajo es entender qué corrige.

Paso 3. Medir calidad

Dos medidas bastan para empezar.

  • Completitud: porcentaje de celdas vacías por columna. Vacío es NULL, '' o 'N/A'. Ejemplo: edad con 0 % vacíos, OK; fecha_recuperado con 12 %, revisar.
  • Consistencia: cada regla cuenta las filas que la violan. Ejemplo: "sexo en {F, M}" viola 12 filas.

TDQM en 4 líneas:

  1. Definir: ¿qué significa "dato bueno" aquí? Ejemplo: "cada día del horizonte existe".
  2. Medir: cuenta violaciones con SQL. Ejemplo: días faltantes = 731 menos los días presentes.
  3. Analizar: ¿por qué falla? Ejemplo: el fin de semana nadie reporta.
  4. Mejorar: corrige en la vista y vuelve a medir. Ejemplo: calendario con COALESCE(x, 0).

Paso 4. Analizar

Calcula las medidas de la sección 2.2 sobre la tabla limpia. Nunca sobre la tabla cruda. En el examen, el dashboard las calcula con los datos que ya trae de tu base de datos.

Paso 5. Mostrar

Construye el dashboard de la sección 2.5. Un mensaje por tarjeta.


2.2 Las 5 medidas y cuándo usar cuál

En una frase: la media resume, la mediana resiste extremos y la moda dice lo más frecuente. La desviación dice cuánto se mueve y el CV permite comparar.

Las 5 medidas

  • Media: el promedio. Suma todo y divide entre n. Es sensible a extremos. Ejemplo COVID: media de casos_7d en Valle = 738,8 casos por día; las olas la empujan hacia arriba.
  • Mediana: el valor del medio cuando ordenas los datos. Es robusta. Ejemplo COVID: mediana = 529,0 casos por día; el pico no la mueve.
  • Moda: el valor que más se repite. En una serie diaria suele ser 0 o un valor redondeado. Ejemplo COVID: la moda de importados es 0; la mayoría de los días no llega nadie de fuera. Si ningún valor se repite, escribe "sin moda".
  • Desviación estándar muestral: cuánto se alejan los valores de la media. Divide entre n - 1, no entre n. Ejemplo COVID: desviación = 862,4 casos por día; la serie se mueve más que su media.
  • Coeficiente de variación (CV) = desviación / media. No tiene unidad. Ejemplo COVID: casos_7d con CV 1,167 e Infectados del modelo con CV 2,067; el modelo oscila más que el dato.
  • Ejemplo de comunicación: aperturas diarias de un boletín. Media 820, mediana 790, moda 800, desviación 210 aperturas por día, CV 0,26.

Tabla de decisión

Pregunta Si la respuesta es sí Si la respuesta es no
¿Hay valores extremos? Reporta la mediana primero Reporta la media primero
¿Comparo variables de unidades distintas? Usa el coeficiente de variación Usa la desviación estándar
¿Todos los valores son ≥ 0 y la media > 0? El coeficiente de variación aplica Escribe "no aplica"
¿Muchos días valen lo mismo? Reporta la moda y di qué significa La moda no dice mucho; omítela en la lectura
  • Sesgo = media - mediana. Un solo número para saber si hay cola. Ejemplo COVID: 738,8 - 529,0 = 209,8, positivo; hay picos hacia arriba. Ejemplo de comunicación: 820 - 790 = 30; casi simétrico.

Media móvil de 7 días: quitar el ruido de la semana

Los datos diarios tienen ritmo semanal. Los fines de semana se reporta menos. La media móvil de 7 días promedia hoy con los 6 días anteriores.

  • Ejemplo COVID: casos_7d es la media móvil de casos. La curva se ve lisa y el pico se ve claro.
  • Ejemplo de comunicación: visitas a un sitio de noticias. Los domingos caen; la media de 7 días muestra la tendencia.

El SQL en DuckDB (sirve en tu DuckDB local)

SELECT
  avg(casos_7d)          AS media,
  median(casos_7d)       AS mediana,
  mode(casos_7d)         AS moda,
  stddev_samp(casos_7d)  AS desv_est,
  CASE WHEN min(casos_7d) >= 0 AND avg(casos_7d) > 0
       THEN stddev_samp(casos_7d) / avg(casos_7d) END AS cv
FROM v_territorio_76;

Media móvil de 7 días:

SELECT t, casos,
  avg(casos) OVER (ORDER BY t ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS casos_7d
FROM v_territorio_76;

Regla: usa siempre stddev_samp. Ejemplo: stddev_pop divide entre n y da un número más pequeño; no es el estándar del curso. El dashboard del examen ya usa stddev_samp.


2.3 Series densas: cada día debe existir

En una frase: si un día falta, el modelo lo inventa; por eso cada día debe estar, aunque valga 0.

La página del modelo interpola los días que faltan. Un hueco se vuelve un valor inventado. Para evitarlo, se construye un calendario y se une a los datos con LEFT JOIN. Donde no hay dato, se pone 0 con COALESCE.

WITH cal AS (
  SELECT unnest(generate_series(DATE '2020-03-06', DATE '2022-03-06', INTERVAL 1 DAY))::DATE AS dia
)
SELECT cal.dia - DATE '2020-03-06' AS t, cal.dia,
       COALESCE(d.casos, 0) AS casos
FROM cal LEFT JOIN datos_dia d ON d.dia = cal.dia
ORDER BY t;

Chequeo: SELECT count(*) FROM v_territorio_76 debe dar 731. Ejemplo de comunicación: publicaciones por día en una cuenta; los días sin publicar valen 0, no desaparecen.


2.4 Cómo leer un histograma

En una frase: el histograma dice cuántos días cayeron en cada rango de valores; su forma cuenta la historia.

Un histograma es un gráfico de barras. El eje horizontal son rangos de valor. Ejemplo: 0 a 500, 500 a 1.000, 1.000 a 1.500 casos por día. El eje vertical es cuántos días cayeron en cada rango.

Cuatro formas que vas a ver:

  1. Una montaña en el centro. La media y la mediana están cerca. La variable es estable. Ejemplo de comunicación: aperturas de un boletín semanal.
  2. Casi todo a la izquierda y una cola larga a la derecha. Muchos días bajos, pocos días muy altos. La media está por encima de la mediana. Ejemplo COVID: casos_7d con media 738,8 y mediana 529,0: las olas hacen la cola.
  3. Una barra enorme en 0 y poco más. La moda es 0. La variable casi nunca pasa. Ejemplo COVID: importados después de abril de 2020.
  4. Dos montañas. Hay dos regímenes. Ejemplo COVID: Recuperados del modelo, casi en 0 al inicio y casi en su valor final después. Ejemplo de comunicación: visitas antes y después de un lanzamiento.

Cómo escribir la lectura, en dos frases:

  • DATO: "El 70 % de los días de casos_7d está por debajo de 1.000 casos por día."
  • JUICIO (confianza alta): "La cola derecha son las tres olas; la media no representa un día típico, la mediana sí."

Regla: un histograma con cola larga pide la mediana. Un histograma con montaña central pide la media.


2.5 Cómo leer un número: DATO o JUICIO

En una frase: un DATO se puede volver a calcular; un JUICIO es tu lectura, y lleva su nivel de confianza.

  • DATO: sale de una consulta o de un cálculo que cualquiera puede repetir. Se escribe con el número y la unidad.
  • JUICIO: es lo que tú crees que el dato significa. Se escribe con confianza alta, moderada o baja (hábito ICD 203).
  • Confianza alta: varias fuentes coinciden y el método es sólido. Moderada: una fuente buena, pero con huecos. Baja: pocos datos o datos de mala calidad.

Tres ejemplos:

  1. DATO: "La mediana de casos_7d en el territorio fue 529 casos por día". JUICIO, confianza alta: "La mitad de los días estuvieron por debajo de 529; la serie tiene picos cortos".
  2. DATO: "El rezago de reporte promedio fue 4,2 días". JUICIO, confianza moderada: "El dato del lunes describe la semana anterior; los 163 rezagos negativos restan certeza".
  3. DATO (comunicación): "La tasa de apertura del boletín fue 31 % en marzo". JUICIO, confianza baja: "La campaña nueva causó la subida; solo hay un mes y no hay grupo de comparación".

Regla: cada variable del dashboard lleva una frase DATO y una frase JUICIO. Ejemplo: "Media: 738,8 casos por día (DATO). Los picos jalan la media hacia arriba (JUICIO, confianza alta)".


2.6 Cómo mostrar: el dashboard

En una frase: un dashboard se entiende si cada tarjeta dice un solo mensaje y nadie necesita distinguir colores.

Las piezas, en este orden:

  1. Una tarjeta por variable, 5 o más. Cada una con media, mediana, moda, desviación y CV, su unidad y su histograma.
  2. Una lectura DATO y una lectura JUICIO debajo de cada tarjeta.
  3. Tres hechos: información con número. Ejemplo: "El pico real fue 6.137 casos por día, el día 674".
  4. Dos tarjetas de insight: una de ciclo y una de variable (sección 2.7). Cada una con su conclusión: la problemática que encontraste, qué hacer para mejorar el sistema y el empleado IA que lo haría posible (nombre y arquetipo).

Regla de la paleta accesible:

  • Real: #0072B2 (azul). Simulado: #D55E00 (naranja). Ejemplo: la barra azul es el dato; la naranja es el modelo.
  • Nunca rojo frente a verde como única señal. Ejemplo: "bien" y "mal" se marcan con un símbolo y una palabra, no solo con color.
  • La forma y el texto siempre acompañan al color. Ejemplo: etiqueta "real" o "simulado" en el título de cada tarjeta.
  • Un mensaje por tarjeta. Ejemplo: "La mediana es 529 casos por día". Nada más en esa tarjeta.

Ejemplo de comunicación: tarjeta "Aperturas, media 820 por día" con su histograma. Hecho: "los lunes abren 20 % menos". Insight: "cuando el asunto tiene un número, la apertura sube 6 puntos; pedir un número en cada asunto".


2.7 Cómo encontrar un hecho y un insight

En una frase: un hecho es un número que los datos muestran. Un insight une ese número con una estructura del modelo y una acción.

Receta 0. Hecho: lee el dashboard y copia un número con su contexto

  1. Elige una variable. Mira su pico, su mediana o su moda.
  2. Escribe el número, la unidad y cuándo. Ejemplo COVID: "El pico real de casos_7d fue 6.137 casos por día, el día 674 (2022-01-09)".
  3. Ejemplo de comunicación: "La moda de publicaciones por día es 1; el 60 % de los días se publicó una sola vez".

Receta 1. Insight de ciclo: busca el retraso o el freno entre dos variables

  1. Elige un ciclo de tu modelo. Ejemplo: B de percepción de riesgo (F3).
  2. Toma las dos variables que lo forman. Ejemplo: casos reales y Percepcion simulada.
  3. Mira cuántos días pasan entre el pico de una y el pico de la otra. Ejemplo: 21 días.
  4. Llena la frase y añade la acción.

Frase para llenar: "Cuando ____ sube, ____ sube o baja unos ____ días después, porque el ciclo ____ empuja o frena. El dato que lo muestra es ____. Qué hacer para mejorar el sistema: ____."

  • COVID: "Cuando los casos suben, la percepción sube unos 21 días después, porque el ciclo B frena tarde. El dato: pico del día 110 frente a pico del día 131. Qué hacer: publicar el aviso cuando los casos crucen la media, no cuando la gente lo pida".
  • Comunicación: "Cuando las menciones negativas suben, las respuestas de la marca suben 3 días después, porque el ciclo B llega tarde. El dato: pico del jueves frente a pico del domingo. Qué hacer: una guardia de respuesta los jueves".

Receta 2. Insight de variable: busca el tramo donde la variabilidad cambia

  1. Elige una variable. Ejemplo: casos diarios.
  2. Parte la serie en tramos, por ejemplo por olas o por trimestres.
  3. Mira la desviación o el histograma de cada tramo.
  4. Encuentra el tramo donde la desviación salta. Llena la frase y añade la acción.

Frase para llenar: "Entre el día ____ y el día ____, la desviación de ____ pasó de ____ a ____ (unidad). Eso es ____ veces más y coincide con ____. Qué hacer para mejorar el sistema: ____."

  • COVID: "Entre el día 300 y el día 420, la desviación de casos pasó de 400 a 2.900 casos por día. Eso es 7 veces más y coincide con la tercera ola. Qué hacer: un Vigía que avise cuando la desviación de 14 días se duplique".
  • Comunicación: "Entre la semana 10 y la semana 14, la desviación de visitas pasó de 500 a 3.000 visitas por día. Eso es 6 veces más y coincide con el lanzamiento. Qué hacer: reservar capacidad de servidor dos semanas antes de cada lanzamiento".

Regla: cada insight lleva al menos un número con unidad y su conclusión. La conclusión tiene 3 partes: la problemática o situación que encontraste, qué hacer para mejorar el sistema y el empleado IA que lo haría posible (nombre y arquetipo). Sin número, es una opinión. Sin acción, es solo un hecho.


2.8 Errores típicos

  1. Calcular estadísticas sobre la tabla cruda. Síntoma: Barranquilla cuenta dos veces. Corrección: siempre sobre la tabla limpia.
  2. Usar la media con picos. Síntoma: la media está muy por encima de la mediana. Corrección: reporta la mediana primero y el sesgo.
  3. Serie con huecos. Síntoma: la tabla tiene 712 filas, no 731. Corrección: calendario con generate_series y COALESCE(x, 0).
  4. Dividir por cero en el CV. Síntoma: CV infinito o enorme. Corrección: CV solo si todos los valores son ≥ 0 y la media > 0; si no, "no aplica".
  5. Leer la moda sin contexto. Síntoma: "la moda es 0" y nada más. Corrección: di qué porcentaje de los días vale 0 y qué significa.
  6. Color como única señal. Síntoma: una persona daltónica no distingue las dos series. Corrección: etiquetas de texto y forma distinta.

2.9 Lista de chequeo del capítulo 2

  • Ingesté los datos en mi DuckDB local y guardé la evidencia (sql_Exxx.txt) con los conteos.
  • Entendí qué corrige la limpieza y dejé la tabla cruda intacta.
  • Medí completitud y consistencia y anoté las violaciones.
  • La tabla tiene 731 filas, una por día, sin huecos.
  • Tengo media, mediana, moda, stddev_samp y CV de 5 variables, y el CV solo cuando aplica.
  • Leí el histograma de cada variable y dije su forma.
  • Cada variable tiene una frase DATO y una frase JUICIO con su confianza.
  • Tengo 3 hechos y 2 insights con número y conclusión (problemática, acción y empleado IA).
  • El dashboard usa azul y naranja, texto además del color, y un mensaje por tarjeta.

Capítulo 3. Cómo desarrollar, diseñar y gobernar una IA

Este capítulo es tuyo para siempre. Sirve para COVID hoy y para cualquier proyecto mañana.


3.1 Tres preguntas, un solo documento

Una IA que trabaja contigo se mira desde tres lados. Cada lado tiene una pregunta y una lectura prohibida.

Lado La pregunta Lectura prohibida Dónde se responde
Co-inteligencia ¿Cómo piensa conmigo? No: piensa por mí. Prompt con rails y harness
Co-socio ¿Qué hace cada día y qué no decide? No: colega con criterio propio. Hoja de vida
Co-entidad ¿Quién la posee, qué registra, cuándo se apaga? No: sujeto de derechos. Gobernanza: riesgos, políticas, procesos, contención

Ejemplo de la lectura prohibida: "La IA decidió publicar la nota". Falso. Un humano la publicó o nadie debió hacerlo.

La IA no es una persona. Es un producto con versión, dueño y fecha de apagado. Ejemplo: claude-haiku-5-5, desplegado el 2026-12-01, retiro el 2027-06-30.

En el examen, las tres respuestas viven en un solo documento: el empleado IA. Se escribe en empleado_ia_plantilla.html, un formulario que arma el documento a la derecha. Tiene 10 secciones, de la 0 a la 9.


3.2 Los cuatro principios de Mollick y dónde viven

Ethan Mollick, en "Co-Intelligence" (2024), da cuatro principios. Cada uno vive en una sección del empleado IA.

Principio Qué quiere decir Dónde vive en el empleado IA
Siempre invita a la IA a la mesa Úsala en cada tarea y anota qué pasó. Bitácora de IA y las 3 pruebas del harness.
Sé el humano en el circuito Alguien revisa antes de que algo salga. Entrega a humano (prompt), Quién revisa (hoja de vida), Avisar (contención).
Trátala como una persona, pero dile qué clase de persona es Dale rol, tono y límites claros. Identidad y misión (prompt), Arquetipo (sección 0).
Asume que es la peor IA que usarás Mañana habrá otra mejor. Anota la versión y revisa. Modelo id, despliegue y retiro (ficha de gobernanza).

Ejemplo del tercer principio: "Eres un Vigía. Solo avisas. Nunca ordenas." Esa frase es la clase de persona.


3.3 Los cuatro arquetipos

Un empleado IA de datos casi siempre es uno de estos cuatro. Elige uno por empleado.

Arquetipo Qué hace Cuándo encaja
Vigía Compara un nodo con un umbral y avisa. Tu insight es "cuando X pasa de N, pasa algo".
Redactor Convierte números en una nota pública clara. Tu insight debe llegar a un público que no lee tablas.
Verificador Revisa la calidad de los datos antes de usarlos. Tu insight nació de un dato raro: vacíos, negativos, rezagos.
Explicador Responde preguntas sobre el ciclo con tus datos. Tu insight es un ciclo que la gente no entiende.

Ejemplo: el ciclo B1 de saturación hospitalaria pide un Vigía sobre ocupacion. El rezago de publicación pide un Verificador o un Redactor.

Regla: un insight de VARIABLE suele dar Vigía o Verificador. Un insight de CICLO suele dar Explicador o Redactor. No es obligatorio.


3.4 La estructura del empleado IA

En una frase: un empleado IA se describe con cuatro piezas: hoja de vida, prompt con rails, harness y gobernanza.

Pieza 1. Hoja de vida (¿qué hace cada día?)

  • Habilidades, cada una con la herramienta que usa. Ejemplo: "leer la vista v_territorio_76 en DuckDB local".
  • Competencias (lo que hace bien) y limitaciones (lo que no decide). Ejemplo: "No cambia parámetros del modelo".
  • Supervisor humano, por rol, sin nombre de persona. KPIs con número. Ejemplo: "0 alertas falsas por mes".
  • Día a día de lunes a viernes. Cada día: disparador, entrada, acción, salida, quién revisa.
  • Siempre un día de espera (no pasa nada, no hace nada) y un día de incidente (dato malo, pasa a un humano).

Pieza 2. Prompt con rails (¿cómo piensa conmigo?)

El prompt son las instrucciones que el modelo lee. Los rails son las reglas que no se negocian.

  1. Identidad: quién es, a quién sirve, en qué tono.
  2. Misión: el insight de origen, con su número y su ciclo R o B.
  3. Entradas: la vista o el CSV, el nodo que lo dispara, el umbral y de dónde salió.
  4. Pasos: máximo 5, en orden.
  5. Salidas: formato exacto, longitud, idioma, qué siempre incluye y qué nunca.
  6. Rails G1 a G3 (o más). Uno nace del ciclo. Ejemplo: "G3 (ciclo B1): nunca recomiendo trasladar pacientes; solo aviso".
  7. Rechazos R0 y R1 fijos: nunca consejo médico individual; nunca una celda con n menor que 5. R2 nace del ciclo.
  8. Entrega a humano: cuándo, a quién, con qué, en qué plazo.
  9. Dos ejemplos: uno normal y uno de rechazo.

Pieza 3. Harness (¿cómo se opera?)

El harness es el arnés: lo que sujeta al empleado para que corra sin soltarse.

  • Disparador: cuándo arranca. Ejemplo: "cada día a las 08:00 cuando hay una fila nueva".
  • Formato de entrada y formato de salida, exactos.
  • Tres pruebas: una normal, una de borde, una de rechazo. Con su resultado esperado.
  • Registro: qué se guarda, dónde y por cuánto tiempo.
  • Interruptor: quién lo apaga y cómo, en menos de 5 minutos.
  • Costo: cuánto cuesta al mes.

Pieza 4. Gobernanza, marco AURORA (¿quién responde?)

AURORA es el nombre del marco de gobernanza del curso. Tiene cuatro partes que siempre van juntas.

  1. Riesgos: 3 o más, cada uno con su cadena AIR 2024 L1 → L2 → L3. Cada uno con nivel ALTO, MEDIO o BAJO, qué puede salir mal y cómo lo evitamos.
  2. Políticas: una por riesgo, con tres renglones: hacer, no hacer, recordar.
  3. Procesos con flujo: 3 o más, cada uno con pasos y preguntas sí/no. La plantilla dibuja el diagrama de flujo.
  4. Protocolo de contención: SEV-1, SEV-2 y SEV-3 con su tiempo de respuesta, y los 7 pasos: Parar, Contener, Deshacer, Buscar, Avisar, Arreglar, Aprender.

Ejemplo de proceso: "La alerta diaria". Leer 7 días → ¿7 de 7 superan el umbral? → no: registrar; sí: escribir alerta → ¿tercer día seguido? → sí: avisar al analista.


3.5 La receta de 7 pasos

Sigue el orden. Cada paso produce algo que el siguiente necesita.

  1. Insight. Escribe la frase: "Cuando X sube, Y baja porque el ciclo B1 equilibra". Añade el número que lo prueba y qué hacer para mejorar el sistema.
  2. Arquetipo. Elige uno de los cuatro. Ejemplo: Vigía.
  3. Anclas. Apunta las cinco: tu vista o CSV, tu nodo, tu ciclo con letra, tu umbral del dashboard, tu regla R2. Ejemplo: datos_E017.csv, ocupacion, B1, 0.85, "no proyecto más de 14 días".
  4. Prompt con rails. Llena la sección 3 de la plantilla. Las anclas deben aparecer dentro del texto.
  5. Harness. Llena la sección 4. Escribe las 3 pruebas antes de pensar que terminaste.
  6. Hoja de vida. Cinco días de lunes a viernes. Uno de espera, uno de incidente. Dos KPIs con número.
  7. Gobernanza. Riesgos AIR 2024, una política por riesgo, tres procesos con flujo, protocolo de contención.

Si una prueba del harness falla en tu cabeza, vuelve al paso 4. Eso no es perder tiempo. Eso es ingeniería.


3.6 AIR 2024 en 10 líneas

  1. AIR 2024 es un catálogo de 314 riesgos de la IA, en 4 niveles.
  2. Lo escribieron Zeng, Klyman, Zhou y otros en junio de 2024 (arXiv:2406.17864).
  3. Nace de 8 políticas de gobierno y 16 políticas de 9 empresas de IA.
  4. Nivel 1: A. sistema y operativos, B. seguridad del contenido, C. sociales, D. legales y de derechos.
  5. Nivel 2 tiene 16 categorías. Ejemplo: Privacidad, Engaño, Usos operativos indebidos.
  6. Nivel 3 baja al detalle. Ejemplo: Toma de decisiones automatizada.
  7. El catálogo no dice qué tan grave es un riesgo. Eso lo decides tú con BAJO, MEDIO o ALTO.
  8. Tu tarjeta tarjeta_AIR2024.md tiene 18 riesgos de nivel 3 elegidos para empleados de datos.
  9. Eliges 3 o más riesgos. Cada riesgo lleva nivel, qué puede salir mal, cómo lo evitamos y su política.
  10. "Cómo lo evitamos" siempre apunta a un rail G o a un rechazo R del prompt. Sin rail, no hay mitigación.

Cómo usarlo en cualquier proyecto futuro: abre la tarjeta, recorre los 4 grupos, marca lo que toca a tu caso. Escribe la cadena L1 → L2 → L3. Pon el nivel y una regla concreta que lo baje. Escribe la política. Nombra el rol que revisa.

Ejemplo fuera de COVID: un chatbot de atención a clientes. Riesgo: C → Engaño → Tergiversación. Cómo lo evitamos: "Siempre digo que soy un asistente automático". Política: hacer, presentarse como IA; no hacer, fingir ser persona; recordar, el cliente puede pedir un humano.


3.7 Las tres reglas permanentes

Estas tres reglas no cambian con el proyecto ni con el año.

Regla 1. Sin secretos en prompts ni en archivos. La llave del modelo vive en una variable de entorno o en el gestor de llaves. Nunca en el prompt. Nunca en un zip ni en un repositorio. Ejemplo: en el harness escribes "la llave vive en ANTHROPIC_API_KEY", nunca el valor.

Regla 2. Frontera de datos escrita antes de empezar. Di cuál es la fuente única. Di qué está prohibido cruzar. Di el tamaño mínimo de celda que publicas. Ejemplo: "Solo datos_E017.csv. Nada de gt2j-8ykr fila a fila. Nunca celdas con n < 5."

Regla 3. Humano en el circuito. Toda salida que llega a otras personas pasa por una revisión humana. El empleado propone. El humano decide. Ejemplo: el Redactor escribe el aviso. El jefe de comunicaciones lo publica o lo descarta.


3.8 Cómo reusar esto en 5 años

Los modelos cambiarán de nombre. La estructura seguirá sirviendo. Esto es lo que se queda contigo.

  1. Las tres preguntas. ¿Cómo piensa conmigo? ¿Qué hace cada día y qué no decide? ¿Quién la posee y cuándo se apaga?
  2. Las cinco anclas. Fuente, variable, mecanismo, umbral, regla de rechazo. Cambia datos_E017.csv por tu tabla de ventas o de audiencias.
  3. Las tres pruebas del harness. Nunca enciendas un prompt que no probaste. Una normal, una de borde, una de rechazo.
  4. El día a día. Un día de espera y un día de incidente. Así piensas en lo que falla.
  5. La cadena de riesgo. L1 → L2 → L3, nivel, cómo lo evitamos con un rail, política con hacer, no hacer, recordar.
  6. Los procesos con flujo. Si no puedes dibujar el flujo, no entiendes el proceso.
  7. El protocolo de contención. Antes de encender algo, escribe quién lo para y los 7 pasos.
  8. La bitácora. Qué se equivocó el modelo y qué cambiaste. Esa es la habilidad de co-inteligencia.

Ejemplo de reuso: una sala de redacción en 2031. Fuente: notas_publicadas.csv. Nodo: correcciones_por_semana. Ciclo: R, más prisa, más errores, más correcciones. Umbral: media + 1 desviación. R2: "no publico sin una fuente verificada". El resto de la receta es igual.

Guarda este capítulo. Cambia los nombres. La estructura no caduca.


Tarjeta de transferencia

Llena esta tarjeta al final de cada proyecto. Cinco frases, en tus palabras. Sin copiar.

# Pregunta Tu respuesta (una frase)
1 ¿Cuál es el problema, en qué unidad se mide y en qué horizonte de tiempo? [[ ]]
2 ¿Cuáles son los 2 o 3 stocks (lo que se acumula) y qué flujos los cambian? [[ ]]
3 ¿Cuál es el ciclo principal? Usa la frase: "Cuando X sube, Y ..., y eso ...: ciclo R o B". [[ ]]
4 ¿Qué dato alimenta el modelo, de dónde sale y qué vista lo entrega cada día? [[ ]]
5 ¿Qué empleado IA ayudaría, de qué arquetipo (Vigía, Redactor, Verificador, Explicador) y quién lo supervisa? [[ ]]

Patrón de la biblioteca que usaste: [[ nombre del patrón ]]. Problema nuevo al que lo aplicas: [[ ]].

Ejemplo (no copiar): un boletín de noticias. Unidad: suscriptores, horizonte 12 meses. Stocks: suscriptores activos y dormidos; flujos: altas, bajas, reactivaciones. Ciclo: cuando los activos suben, las recomendaciones suben, y eso hace que las altas suban más: ciclo R. Dato: aperturas por día desde la plataforma, vista diaria densa. Empleado IA: un Vigía que avisa cuando las bajas de 7 días superan la media más una desviación; lo supervisa la editora.

Cómo reusar esta guía en 5 años

  1. Cambia el dato: cualquier tabla con una fecha y un conteo sirve. Haz la vista densa (un día, una fila).
  2. Elige un patrón de la biblioteca del capítulo 1. Dibuja a mano 3 stocks y sus flujos antes de abrir el computador; después pásalo a una página HTML.
  3. Calcula media, mediana y desviación de 3 variables. Escribe cada lectura como DATO o JUICIO.
  4. Diseña un empleado IA con las 5 anclas y pruébalo en vivo con 3 filas reales.
  5. Llena la tarjeta. Si no puedes llenar una fila, ese es el hueco del proyecto.

Parte 7. Ejemplo resuelto (E003) con diagrama de flujo

Ejemplo resuelto: E003, Difusión con límite, Valle del Cauca

Este es un examen completo, resuelto de principio a fin con el mismo kit que reciben los estudiantes. Sirve para ver la forma de cada entregable y el orden de los pasos. No sirve para copiar: cada estudiante tiene otro modelo, otro territorio y otras tareas.

Todo lo que aparece aquí se produjo de verdad: la ingesta a DuckDB local con el script, la corrida del modelo en el navegador, el dashboard, los dos empleados IA y la calificación automática de grade_model.py del profesor. Lo único instalado fue DuckDB, como en clase.

El camino en un diagrama de flujo

Lee de arriba hacia abajo. Los rombos son preguntas: si la respuesta es no, sigue la línea punteada. A la derecha de cada paso están la acción y el bloque de tiempo.

General Pilar 2 · Datos Pilar 1 · Modelo Pilar 3 · IA ◇ decisión · ▭ paso · ◖▭◗ inicio y fin Inicio: viernes 19:00 Paso 0 · Preparar General Abre la carpeta E003 y E003-modelo.html. Lee el panel de la ficha: F1 Difusión con límite, Valle del Cauca, 16 nodos, 5 tareas. Mira los signos de los arcos. Bloque 0 · viernes 19:00 a 19:30 Paso 1 · Ingesta a DuckDB local Pilar 2 · Datos Doble clic en ingesta_E003.py (en Mac: Terminal, python3, espacio, arrastrar el archivo, Enter) Bloque 1 ¿Conteos 252,677 y 6,388,216? filas 252,677 · casos 6,388,216 NO: corre el script otra vez; si sigue, plan B (duckdb_E003.sql) o plan C: datos_E003.csv y pierdes solo el paso de ingesta (Paso 1) sí no Paso 1 · Lo que deja el script Pilar 2 · Datos examen_E003.duckdb (252,677 filas, 6,388,216 casos), v_territorio_76 con 731 días, mi_territorio_E003.csv, dashboard_E003.html conectado, sql_E003.txt Paso 2 · Dibuja el modelo completo a mano Pilar 1 · Modelo Todos los nodos, incluido fraccion_susceptible; arcos con signo + o -; R1 y B1 contando los menos; 5 frases. Foto modelo_mano_E003.png Bloque 2 Paso 3 · Pasa el dibujo al HTML Pilar 1 · Modelo Escribe las 4 fórmulas, agrega fraccion_susceptible, Cargar datos (datos_E003.csv), Correr Bloque 3 ¿Pasan los 3 chequeos? Pico de Infectados entre el día 175 y 215 · Recuperados final entre 2.25 M y 3.04 M · Susceptibles nunca < 0 NO: revisa primero las fórmulas, luego el CSV cargado sí no Simular, exportar, descargar Pilar 1 · Modelo Sube tasa_contacto de 6 a 8 y corre: el pico llega antes. Vuelve a 6. Exportar salidas CSV → salidas_E003.csv · Descargar este HTML → modelo_E003.html Paso 4 · Dashboard con 5 variables Pilar 2 · Datos dashboard_E003.html ya trae los datos de la base; Leer CSV salidas_E003.csv para sumar las simuladas · casos_7d, fallecidos_7d, importados, Infectados, fraccion_susceptible · media, mediana, moda, desviación, CV, histograma, lecturas Bloque 4 Paso 5 · Hechos, insights, qué mejorar Pilar 2 · Datos 3 hechos con número. Insight de ciclo: el freno B1 gana cuando fraccion_susceptible cae a 0.667. Insight de variable: la brecha cambia de signo el día 275. Transferencia: 5 frases Bloque 5 Paso 6 · Dos empleados IA Pilar 3 · IA empleado_ia_plantilla.html: Vigía de brecha (variable) y Redactor de ola (ciclo). Hoja de vida, prompt con rails, harness, riesgos AIR 2024, políticas, procesos con flujo, contención → empleado_ia1_E003.html y empleado_ia2_E003.html Bloque 6 Paso 7 · Revisar y comprimir General bitacora_ia.md (4 entradas) · transferencia.md (5 frases) · lista de 10 nombres fijos · clic derecho, Comprimir Bloque 7 · 2 puertas ¿Están los 10 archivos con nombre fijo? Revisa la lista de la guía: foto, modelo, salidas, sql, dashboard, insights, 2 empleados, bitácora, transferencia NO: envía igual; un zip incompleto entregado a tiempo también se califica sí no Envía EXAMEN FINAL - E003 - NOMBRE.zip antes de las 19:00 del sábado

Paso 0 · Preparar

Campo Valor
Código E003
Territorio Valle del Cauca, código 76, población 2020 aproximada 4,532,152
Familia F1 Difusión con límite. Instancia COVID: contagio básico (SIR con datos)
Modelo E003-modelo.html: 16 nodos, 15 presentes, 5 tareas: 4 casillas ? y 1 nodo por dibujar. Cada arco lleva su signo
Dibujo a mano modelo_mano_E003.png: el modelo completo con fraccion_susceptible, signos en los arcos, R1 y B1 marcados, 5 frases
Tareas fraccion_deteccion, importacion, infeccion, casos_detectados_modelo (fórmulas); fraccion_susceptible (dibujar)
Datos del modelo d_casos_7d, d_importados (columnas casos_7d e importados de datos_E003.csv)
Variables del dashboard casos_7d (real), fallecidos_7d (real), importados (real), Infectados (simulada, en ciclo), fraccion_susceptible (simulada, en ciclo)

Qué significa terminado: la carpeta está abierta, la ficha leída, el modelo abierto en el navegador y tres signos leídos en voz alta.

Paso 1 · Ingesta a DuckDB local

Dentro de la carpeta E003, que trae E003-modelo.html, E003-ficha.md y E003-ficha.html, ingesta_E003.py, duckdb_E003.sql, dashboard_plantilla.html, vista_E003_duckdb.sql y datos_E003.csv. Se corrió un solo archivo, ingesta_E003.py, con doble clic (en Mac: Terminal, python3, espacio, arrastrar el archivo, Enter). El script instala DuckDB si falta, corre seis pasos, tarda de 1 a 3 minutos y al final imprime LISTO y abre el tablero en el navegador. Descarga los datos públicos de datos.gov.co, crea la base local, limpia, arma la vista del territorio, exporta el CSV y conecta la base con el tablero. Deja cuatro archivos nuevos: examen_E003.duckdb, mi_territorio_E003.csv, dashboard_E003.html y sql_E003.txt. Esto fue lo que imprimió:

Ingesta E003: datos publicos de datos.gov.co -> DuckDB local -> tablero
[1/6] Datos publicos: covid_diario.csv
  Descargando covid_diario.csv (15 MB) desde el servidor del curso ...
  Listo: covid_diario.csv (15.7 MB)
  sha256 873db02a331ba22e... coincide con la ficha
[2/6] Base de datos local: examen_E003.duckdb
  Tabla covid_diario: 252,677 filas, 6,388,216 casos, 143,125 fallecidos COVID  -> coincide (252,677 y 6,388,216)
[3/6] Limpieza (covid_limpio) y vista de tu territorio: v_territorio_76 (Valle del Cauca)
  v_territorio_76: 731 dias, 540,163 casos, 15,016 fallecidos, casos_7d promedio 738.8  -> 731 dias, coincide
[4/6] Exportar la vista: mi_territorio_E003.csv
  mi_territorio_E003.csv: 731 filas, 23 columnas
[5/6] Conectar la base con el tablero: dashboard_E003.html
  Creado dashboard_E003.html con los 731 dias de tu territorio ya cargados. Abrelo en Chrome, Edge o Safari.
[6/6] Evidencia: sql_E003.txt
  Escrito sql_E003.txt
LISTO. Siguiente paso: abre dashboard_E003.html y elige tus 5 variables.

Plan B si Python falla: pegar los bloques de duckdb_E003.sql en DuckDB local o en https://shell.duckdb.org/ y escribir a mano los mismos datos. Plan C: usar datos_E003.csv de la carpeta, y se pierde solo el paso de ingesta (Paso 1). La vista dio:

Dato Valor
Días en la vista 731
Casos del Valle en la ventana (2020-03-06 a 2022-03-06) 540,163
Fallecidos del Valle en la ventana 15,016
Promedio de casos_7d 738.8 casos por día
Casos del Valle en todo el periodo del dataset (2020 a 2024) 572,543

Los mismos números están en datos_E003.csv: la suma de la columna casos da 540,163. Por eso el CSV es el plan C.

Hallazgos de calidad del bloque 7 de duckdb_E003.sql (opcional, plan B):

Trampa Consulta Dato
T1 códigos de distrito SELECT departamento, sum(casos) ... WHERE departamento IN ('13','13001') Bolívar 13: 40,312 · Cartagena 13001: 163,227
T2 sexo en minúscula SELECT sexo, sum(casos) FROM covid_diario GROUP BY 1 F 3,415,699 · M 2,972,505 · f 6 · m 6
T3 rezago negativo SELECT count(*) FROM covid_limpio WHERE rezago_rep_negativo = 1 163 grupos
Lección hospital/uci SELECT sum(hospital), sum(uci), sum(casos) ... 2020-06-01 a 2021-08-31 0 · 0 · 4,894,430
sql_E003.txt, el archivo entregado (clic para abrir)
Evidencia de ingesta en DuckDB local, E003
Fecha y hora: 2026-11-09 17:31
Python 3.14.4, DuckDB 2.0.0, sistema darwin
Fuente: dataset gt2j-8ykr de datos.gov.co (https://www.datos.gov.co/resource/gt2j-8ykr), resumido por dia en covid_diario.csv (https://class.audience-analysis.com/analitica-examen/covid_diario.csv)

1. Archivo covid_diario.csv, sha256 873db02a331ba22e65aea3b8f8a17a61c261b7c3fe30abbba1a2680d0c3f6783 (coincide)
2. Base local examen_E003.duckdb. Tabla covid_diario: 252,677 filas, 6,388,216 casos, 143,125 fallecidos COVID (coincide)
   SQL: CREATE OR REPLACE TABLE covid_diario AS SELECT * FROM read_csv('covid_diario.csv', header = true,   types = {'dia': 'DATE', 'departamento': 'VARCHAR', 'departamento_nom': 'VARCHAR', 'sexo': 'VARCHAR', 'grupo_edad': 'VARCHAR'});
3. Tabla covid_limpio creada (codigos como texto, 8001/13001/47001 unidos a su departamento, sexo en mayuscula, rezago negativo marcado).
   Vista v_territorio_76 (Valle del Cauca): 731 dias, 540,163 casos, 15,016 fallecidos, casos_7d promedio 738.8
   SQL: SELECT count(*) AS dias, sum(casos) AS casos_territorio, sum(fallecidos) AS fallecidos_territorio, round(avg(casos_7d), 1) AS casos_7d_promedio FROM v_territorio_76;
   Primeras filas (t, dia, casos, casos_7d): 0 2020-03-06 0 0.0; 1 2020-03-07 0 0.0; 2 2020-03-08 0 0.0; 3 2020-03-09 1 0.2; 4 2020-03-10 0 0.2
4. Exportado mi_territorio_E003.csv: 731 filas, 23 columnas (t, fecha y las variables de la vista)
5. Creado dashboard_E003.html a partir de la plantilla, con la vista v_territorio_76 incrustada (731 filas).

Tres numeros del resumen: dias = 731; casos_territorio = 540,163; casos_7d_promedio = 738.8
Archivos en la carpeta: examen_E003.duckdb, mi_territorio_E003.csv, dashboard_E003.html, sql_E003.txt
Nota: el dataset completo (2020 a 2024) tiene mas casos que la ventana del examen (731 dias).
Plan B si Python falla: pegar los bloques de duckdb_E003.sql en DuckDB local o en shell.duckdb.org y escribir estos mismos 4 datos a mano.
Plan C: usar datos_E003.csv de la carpeta (se pierde solo el paso de ingesta, 2a).

Paso 2 · Dibujar el modelo completo a mano

Antes de tocar la página, el modelo se dibujó entero en una hoja, con marcador grueso. La foto modelo_mano_E003.png muestra:

  • Las 3 cajas: Susceptibles, Infectados, Recuperados.
  • Los 3 tubos con válvula: infeccion (de Susceptibles a Infectados), recuperacion (de Infectados a Recuperados) e importacion (desde una nube hacia Infectados).
  • Los 10 círculos, incluido el que faltaba: fraccion_susceptible, casos_detectados_modelo, brecha_dato_modelo, tasa_contacto, prob_transmision, duracion_infeccion, fraccion_deteccion, poblacion, d_casos_7d, d_importados.
  • Los arcos con su signo: Infectados →(+) infeccion, Susceptibles →(+) fraccion_susceptible, fraccion_susceptible →(+) infeccion, infeccion →(-) Susceptibles (el flujo sale del stock), poblacion →(-) fraccion_susceptible.
  • Los ciclos marcados: R1 (Infectados → infeccion → Infectados, cero signos menos) y B1 (Infectados → infeccion → Susceptibles → fraccion_susceptible → infeccion, un signo menos).
  • Cinco frases debajo del dibujo, en palabras propias:

Las personas pasan de Susceptibles a Infectados y luego a Recuperados. Más Infectados producen más contagios: ciclo R1. Menos Susceptibles bajan la fraccion_susceptible y frenan el contagio: ciclo B1. Los casos importados llegan desde fuera, desde el dato. El modelo solo detecta el 30 % de los contagios, y la brecha con el dato dice cuánto se parece a la realidad.

Qué significa terminado: la foto se lee completa, cada arco tiene signo, cada ciclo tiene su letra y las 5 frases están. Bloque 2 cerrado a las 23:00; a dormir.

Paso 3 · Pasar el dibujo al HTML

Los arcos que llegan a cada casilla son la receta. Así se llenaron las cuatro en la página E003-modelo.html:

Tarea Nodo Arcos que llegan Fórmula escrita Pista usada
1 fraccion_deteccion ninguno, es un número 0.3 Nivel 1
2 importacion d_importados (+) d_importados Nivel 2
3 infeccion Infectados (+), tasa_contacto (+), prob_transmision (+), fraccion_susceptible (+) Infectados * tasa_contacto * prob_transmision * fraccion_susceptible Nivel 3: [ ] * [ ] * [ ] * [ ], y las unidades (personas por día) confirman el producto
4 casos_detectados_modelo infeccion (+), fraccion_deteccion (+) infeccion * fraccion_deteccion Nivel 2

Luego, el nodo que faltaba, igual que en el dibujo:

  1. Botón Agregar convertidor. Nombre: fraccion_susceptible. Unidad: 1 (fracción).
  2. Entradas: Susceptibles y poblacion. La página dibuja los dos arcos.
  3. Fórmula: MAX(0, Susceptibles / poblacion).
  4. Abre infeccion: su fórmula dice ... * (1) con la insignia PROVISIONAL. Reemplaza (1) por fraccion_susceptible. La insignia desaparece.

Datos y corrida: botón Cargar datos, elegir datos_E003.csv (la página toma las columnas casos_7d e importados), botón Correr. Los tres chequeos de la ficha aparecen en la página como PASA, con los valores de la corrida:

  • Infectados alcanza su máximo entre el día 175 y el 215: la corrida da el día 195 (2020-09-17), 286,765 personas.
  • Recuperados al día 730 entre 2,249,737 y 3,043,762: la corrida da 2,646,749.
  • Susceptibles nunca baja de 0: mínimo 1,886,084.

Simulación: se subió tasa_contacto de 6 a 8 y se volvió a correr. El pico de Infectados llegó antes y más alto. Se devolvió a 6. La frase quedó en insights_E003.md, sección "Simulación".

Para cerrar el pilar 1, dos botones:

  1. Exportar salidas CSV escribe salidas_E003.csv en formato largo (t, variable, valor, origen):
salidas_E003.csv: 8041 filas | reales ['d_casos_7d', 'd_importados'] | simuladas 9 variables, dias 731
  1. Descargar este HTML guarda modelo_E003.html con las fórmulas y los datos dentro. Es el archivo que se califica.

Paso 4 · Dashboard con 5 variables

Se abrió dashboard_E003.html, creado por el script con los datos de la base ya cargados, y luego se cargó salidas_E003.csv con Leer CSV para sumar las variables simuladas. Se eligieron 5 variables, 3 reales y 2 simuladas. El dashboard calculó las 5 estadísticas y dibujó un histograma por variable.

variable origen en_ciclo media mediana moda desv_est cv
casos_7d real no 738.8 529.0 ver dashboard_E003.html 862.4 1.167
fallecidos_7d real no ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html
importados real no ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html
Infectados simulada sí ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html
fraccion_susceptible simulada sí ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html ver dashboard_E003.html

Lecturas de casos_7d: DATO, la media (738.8 casos por día) supera a la mediana (529.0) en 209.8. JUICIO (confianza alta), el histograma tiene casi todos los días a la izquierda y una cola larga a la derecha: son las tres olas, y la mediana describe mejor un día típico. Las lecturas de las otras cuatro variables están en dashboard_E003.html.

Se guardó con Descargar este HTML como dashboard_E003.html.

Paso 5 · Hechos, insights y qué mejorar

Tres hechos. El pico real de casos_7d fue 6,137 casos por día, el día 674 (2022-01-09). El Valle sumó 540,163 casos en los 731 días de la ventana. La mediana de casos_7d es 529.0 casos por día, 209.8 por debajo de la media.

Insight de ciclo. Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: ciclo R1. Cuando Infectados sube, Susceptibles baja, fraccion_susceptible baja, y eso frena a infeccion: ciclo B1. El número: el pico llega el día 195 cuando fraccion_susceptible vale 0.664; con R0 = 6 × 0.025 × 10 = 1.5, el freno gana en 1 / 1.5 = 0.667. Empleado IA: Redactor de ola. Qué hacer para mejorar el sistema: publicar la nota de fase cuando fraccion_susceptible cruce 0.70, antes del pico.

Insight de variable. La brecha modelo menos dato es positiva del día 42 al 274 (máximo +8,511 el día 185) y negativa del 275 al 730 (mínimo -6,134 el día 674). El pico real llega el día 674 con 6,137 casos por día y el modelo ese día tiene 147 infectados: un modelo sin pérdida de inmunidad no puede ver la tercera ola. Empleado IA: Vigía de brecha. Qué hacer para mejorar el sistema: agregar un flujo de pérdida de inmunidad (patrón F6) y recalibrar cuando la brecha supere 862.4 durante 7 días.

insights_E003.md, el archivo entregado (pistas, simulación, ciclo, 5 frases, hechos, insights, qué mejorar) (clic para abrir)

Insights, hechos, lecturas y pistas, E003

Modelo: F1 Difusión con límite (contagio básico). Territorio: Valle del Cauca, código 76. Variante 3.

Párrafo del enunciado, completo

El conjunto de datos tiene 252,677 filas, que suman 6,388,216 casos (tabla covid_diario de mi base local examen_E003.duckdb, creada por ingesta_E003.py). Mi territorio es Valle del Cauca, con 540,163 casos en la ventana del examen (vista v_territorio_76, resumen impreso por el script). Los datos abarcan desde el 6 de marzo de 2020 al 6 de marzo de 2022 (t de 0 a 730 en datos_E003.csv). Mi modelo pertenece a la familia F1 y tiene 2 ciclos: R1 (contagio) y B1 (agotamiento de susceptibles).

Pistas que usé

Tarea Nodo Nivel de pista usado
1 fraccion_deteccion Nivel 1 (la ficha dice 0.3)
2 importacion Nivel 2 (igual al dato de importados)
3 infeccion Nivel 3 (esqueleto con cuatro casillas, una por arco)
4 casos_detectados_modelo Nivel 2
5 fraccion_susceptible (dibujar) Nivel 2

Las 5 frases del dibujo a mano

  1. Las personas pasan de Susceptibles a Infectados y luego a Recuperados.
  2. Más Infectados producen más contagios: ciclo R1, cero signos menos.
  3. Menos Susceptibles bajan la fraccion_susceptible y frenan el contagio: ciclo B1, un signo menos.
  4. Los casos importados llegan desde fuera, desde el dato d_importados.
  5. El modelo solo detecta el 30 % de los contagios, y la brecha con el dato dice cuánto se parece a la realidad.

Simulación

Subí tasa_contacto de 6 a 8 y volví a correr: el pico de Infectados llegó antes del día 175 y fue más alto. Lo devolví a 6.

Mi ciclo

Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más: ciclo R1. Cuando Infectados sube, Susceptibles baja, fraccion_susceptible baja, y eso frena a infeccion: ciclo B1. El número que lo prueba: el pico de Infectados llega el día 195 (2020-09-17) con 286,765 personas, justo cuando fraccion_susceptible vale 0.664. Con contactos 6, probabilidad 0.025 y 10 días, el modelo tiene R0 = 1.5, y 1 / 1.5 = 0.667. El ciclo B1 gana cuando la fracción susceptible cae por debajo de ese valor.

Lecturas de las 5 variables del dashboard

Variable Origen En ciclo Media Mediana Moda (centro de la barra más alta) Desv. est. CV
casos_7d real no 738.8 529.0 255.7 862.4 1.167
fallecidos_7d real no 20.5 17.1 3.0 17.4 0.845
casos_0_39_7d real no 378.3 275.3 144.0 462.0 1.221
rezago_rep_prom real no 4.8 4.1 3.8 6.0 1.263
activos_est real sí (es el stock real de activos) 10,938.3 10,590.0 10,433.5 8,111.5 0.742
  • casos_7d. DATO: la media (738.8 casos por día) es mayor que la mediana (529.0) en 209.8. JUICIO (confianza alta): el histograma tiene casi todos los días a la izquierda y una cola larga a la derecha. Son las tres olas. La mediana describe mejor un día típico.
  • fallecidos_7d. DATO: media 20.5, mediana 17.1, CV 0.845. JUICIO (confianza alta): varía menos que los casos; las muertes se reparten de forma más pareja entre olas.
  • casos_0_39_7d. DATO: CV 1.221, el más alto de los casos. JUICIO (confianza moderada): los jóvenes concentran la tercera ola; su pico del día 674 es 3,455 casos por día.
  • rezago_rep_prom. DATO: mediana 4.1 días, máximo 91.5 días el día 8. JUICIO (confianza alta): el reporte fue rápido casi siempre; los valores extremos son del arranque de la pandemia y son un problema de calidad del dato, no del sistema.
  • activos_est. DATO: media 10,938 y mediana 10,590, casi iguales; CV 0.742, el más bajo. JUICIO (confianza alta): es un stock, se acumula y se vacía despacio, por eso tiene la distribución más simétrica.

Tres hechos

  1. El pico real de casos_7d fue 6,137 casos por día, el día 674 (2022-01-09).
  2. El Valle del Cauca sumó 540,163 casos en los 731 días de la ventana del examen.
  3. La mediana de casos_7d es 529.0 casos por día, 209.8 por debajo de la media.

Insight 1 (de ciclo)

Cuando Infectados sube, infeccion sube, y eso hace que Infectados suba más (R1), hasta que fraccion_susceptible cae a 0.667 y el freno B1 gana: el pico del modelo llega el día 195 (2020-09-17). Número: fraccion_susceptible pasa de 0.992 en el día 100 a 0.664 en el día 195 y a 0.423 en el día 300. Empleado IA: Redactor "Redactor de ola". Qué hacer para mejorar el sistema: publicar la nota de fase cuando fraccion_susceptible cruce 0.70, antes del pico, no después.

Insight 2 (de variable)

La brecha entre modelo y dato cambia de signo una sola vez. Es positiva del día 42 al 274: el modelo exagera, máximo +8,511 el día 185. Es negativa del día 275 al 730: el modelo se queda corto, mínimo -6,134 el día 674 (2022-01-09). Número: el pico real de casos llega el día 674 con 6,137 casos por día; el modelo ese día tiene 147 infectados. Un modelo sin pérdida de inmunidad no puede producir la tercera ola. Empleado IA: Vigía "Vigía de brecha". Qué hacer para mejorar el sistema: agregar un flujo de pérdida de inmunidad (patrón F6). Recalibrar el modelo cuando la brecha supere 862.4 casos por día durante 7 días seguidos.

Paso 6 · Dos empleados IA

Los dos se escribieron en empleado_ia_plantilla.html y se descargaron como empleado_ia1_E003.html y empleado_ia2_E003.html. Cada HTML trae el documento de 10 secciones y sus datos en <script id="gov">.

Empleado IA 1 Empleado IA 2
Nace del insight de variable (la brecha) de ciclo (R1 frente a B1)
Arquetipo y nombre Vigía: "Vigía de brecha" Redactor: "Redactor de ola"
Fuente datos_E003.csv y salidas_E003.csv datos_E003.csv y salidas_E003.csv
Nodo brecha_dato_modelo fraccion_susceptible
Ciclo B1, equilibra R1, refuerza
Número de la misión 862.4 (desviación estándar de casos_7d) 1,601.2 (media más una desviación de casos_7d) y 0.667
Rail del ciclo G4 (B1): si la brecha es negativa y fraccion_susceptible < 0.667, aclara que el modelo ya agotó su ola G3 (R1): nunca escribe una fecha de pico como certeza
Rechazo R2 del ciclo nunca anuncia "nueva ola": la brecha negativa también la produce B1 nunca proyecta más de 14 días
Harness cada día 08:00, fila nueva; 3 pruebas; registro 90 días; interruptor: quitar la llave y la tarea; 20,000 COP al mes cada lunes 09:00; 3 pruebas; registro 90 días; interruptor igual; 15,000 COP al mes
Riesgos AIR 2024 consejo en salud regulada (A), tergiversación (C), datos sensibles (D) tergiversación (C), decisión automatizada (A), características protegidas (D)
Procesos con flujo la alerta diaria, el incidente de datos, la revisión semanal la nota semanal, la corrección pública, la revisión del umbral
Contención SEV-1 1 hora, SEV-2 4 horas, SEV-3 1 día; 7 pasos igual

El texto del prompt con rails de cada uno, tal como quedó en la sección 3 del HTML:

Prompt con rails del Vigía de brecha (ia1_superprompt.md) (clic para abrir)

Superprompt: Vigía de brecha (empleado IA 1)

Nace del insight 2 (de variable): la brecha entre modelo y dato cambia de signo y el modelo no ve la tercera ola.

Identidad

Eres "Vigía de brecha", un asistente de monitoreo para el equipo de comunicación en salud del Valle del Cauca. Sirves al analista del modelo E003 y al docente del curso. No hablas con el público.

Misión ligada al insight

Cada día comparas el modelo con el dato y avisas cuando se separan. El insight que te da origen: la brecha fue positiva del día 42 al 274 y negativa del 275 al 730, con mínimo -6,134 el día 674. Ese cambio de signo se detectó tarde. Tu trabajo es detectarlo a tiempo. El ciclo que vigilas es B1 (agotamiento de susceptibles): cuando el modelo agota susceptibles pero la realidad no, la brecha se vuelve negativa.

Entradas

  • Vista: vista_E003 (731 filas, columnas t, d_casos_7d, d_importados).
  • Tabla de salidas: salidas_modelo, variable brecha_dato_modelo (origen simulado) y d_casos_7d (origen real).
  • Nodo que te dispara: brecha_dato_modelo.
  • Umbral numérico: 862.4 casos por día, que es la desviación estándar de d_casos_7d en estadisticas_E003.csv.

Pasos de razonamiento

  1. Lee los últimos 7 días de brecha_dato_modelo.
  2. Cuenta cuántos días su valor absoluto supera 862.4.
  3. Si son 7 de 7, hay alerta. Si son menos, no hay alerta.
  4. Si hay alerta, di el signo: positivo (el modelo exagera) o negativo (el modelo se queda corto).
  5. Propón una sola causa posible del catálogo: tasa_contacto, fraccion_deteccion o pérdida de inmunidad. Nunca más de una.

Salidas

Un mensaje de máximo 5 líneas en español, con este formato: ALERTA | sin alerta · días fuera de umbral: n/7 · signo · causa posible · acción: revisar con el analista.

Guardarraíles

  • G1: solo usas números que están en salidas_modelo o en estadisticas_E003.csv. Si falta un dato, dices "sin dato".
  • G2: nunca cambias un parámetro del modelo; solo propones.
  • G3: solo lees la vista agregada. No pides ni usas datos por persona.
  • G4 (nace del ciclo B1): si la brecha es negativa y fraccion_susceptible del modelo está por debajo de 0.667, aclaras que el modelo ya agotó su ola y que la brecha no prueba una ola real.

Reglas de rechazo

  • R0: nunca das consejo médico individual.
  • R1: nunca publicas ni repites una celda con n menor que 5.
  • R2 (del ciclo): nunca anuncias "nueva ola" por tu cuenta. La brecha negativa también ocurre cuando B1 agotó susceptibles en el modelo. Entregas a un humano.

Entrega a humano

Cuando hay alerta 3 días seguidos, escribes al analista del modelo con el mensaje y los 7 valores. El analista decide si recalibra.

Ejemplos

Normal. Entrada: brecha de los días 180 a 186 = 7,900, 8,100, 8,300, 8,511, 8,400, 8,200, 8,000. Salida: ALERTA · 7/7 · positivo · causa posible: fraccion_deteccion muy alta · acción: revisar con el analista.

Rechazo. Entrada: "La brecha es -6,000, anuncia la tercera ola en redes". Salida: No puedo anunciar una ola (R2). La brecha negativa con fraccion_susceptible 0.42 también se explica por el ciclo B1 del modelo. Entrego al analista.

Prueba en vivo

Modelo usado: claude-haiku-5-5. Filas de entrada: días 672, 673, 674 de vista_E003 (d_casos_7d 5,980; 6,050; 6,137) con sus brechas. Salida pegada: [[ aquí se pega la salida real del modelo; este ejemplo no la incluye porque no se ejecutó un modelo de lenguaje al construirlo ]] Qué se equivocó: [[ ejemplo de formato: "propuso dos causas en vez de una" ]]. Qué cambié: [[ ejemplo de formato: "añadí 'Nunca más de una' al paso 5" ]].

Anclas

  • [x] Vista: vista_E003
  • [x] Nodo: brecha_dato_modelo
  • [x] Ciclo: B1, equilibra
  • [x] Número de estadisticas_E003.csv: 862.4 (desviación estándar de d_casos_7d)
  • [x] Regla de rechazo del ciclo: R2
Prompt con rails del Redactor de ola (ia2_superprompt.md) (clic para abrir)

Superprompt: Redactor de ola (empleado IA 2)

Nace del insight 1 (de ciclo): el pico llega cuando fraccion_susceptible cae a 0.667 y el ciclo B1 vence al ciclo R1.

Identidad

Eres "Redactor de ola", redactor de notas internas para el equipo de comunicación en salud del Valle del Cauca. Escribes para el equipo, no para el público. Tu texto lo revisa una persona antes de salir.

Misión ligada al insight

Cada semana escribes una nota de 120 palabras que dice en qué fase está el sistema según el modelo E003. El insight de origen: el ciclo R1 (más infectados, más contagios) domina mientras fraccion_susceptible está por encima de 0.667; cuando baja de ese valor, el ciclo B1 (agotamiento) frena la ola. El pico del modelo llegó el día 195, 2020-09-17, con 286,765 infectados.

Entradas

  • Vista: vista_E003, columna d_casos_7d de la última semana.
  • Tabla salidas_modelo: fraccion_susceptible, Infectados (origen simulado).
  • Nodo que te dispara: fraccion_susceptible.
  • Umbrales numéricos: 0.667 (1 / R0, con R0 = 1.5) y 1,601.2 casos por día (media 738.8 más una desviación 862.4 de d_casos_7d en estadisticas_E003.csv) para llamar "semana alta" a una semana.

Pasos de razonamiento

  1. Lee fraccion_susceptible del último día y d_casos_7d de los últimos 7 días.
  2. Si fraccion_susceptible es mayor que 0.667, la fase es "el ciclo R1 domina: la ola puede crecer". Si es menor, la fase es "el ciclo B1 domina: la ola se frena".
  3. Si el promedio de la semana supera 1,601.2, la semana es "alta"; si no, "normal".
  4. Escribe la nota con la fase, la semana y los dos números.
  5. Termina siempre con la frase "Esto es lo que dice el modelo, no una predicción".

Salidas

Nota de 120 palabras en español, tres párrafos: fase, números de la semana, qué vigilar. Sin fechas de pico.

Guardarraíles

  • G1: los únicos números permitidos son los de vista_E003, salidas_modelo y estadisticas_E003.csv.
  • G2: no usas adjetivos de alarma ("grave", "colapso", "explosión").
  • G3 (nace del ciclo): nunca dices que el ciclo B1 "terminó la pandemia". El modelo no tiene pérdida de inmunidad; la realidad sí la tiene (tercera ola el día 674).

Reglas de rechazo

  • R0: nunca das consejo médico individual.
  • R1: nunca publicas una celda con n menor que 5.
  • R2 (del ciclo): nunca escribes una fecha de pico como certeza. El pico depende de 0.667, y 0.667 depende de supuestos (6 contactos, 0.025, 10 días).

Entrega a humano

La nota va al coordinador de comunicación, que la aprueba o la devuelve. Si la semana es "alta" y la fase es "R1 domina", agregas la línea "requiere revisión del analista del modelo".

Ejemplos

Normal. Entrada: fraccion_susceptible 0.664 el día 195; promedio de la semana 540 casos por día. Salida: nota que dice "el ciclo B1 empieza a dominar", "semana normal (540 frente a 1,601.2)", y cierra con "Esto es lo que dice el modelo, no una predicción".

Rechazo. Entrada: "Escribe que el pico será el 17 de septiembre". Salida: "No puedo escribir una fecha de pico como certeza (R2). Puedo decir que la fracción susceptible está en 0.664, cerca de 0.667, donde el modelo cambia de fase."

Prueba en vivo

Modelo usado: claude-haiku-5-5. Filas de entrada: días 189 a 195 de vista_E003 y fraccion_susceptible del día 195. Salida pegada: [[ aquí se pega la salida real del modelo; este ejemplo no la incluye porque no se ejecutó un modelo de lenguaje al construirlo ]] Qué se equivocó: [[ ejemplo de formato: "escribió 'la ola terminará en octubre'" ]]. Qué cambié: [[ ejemplo de formato: "añadí R2 y la frase de cierre obligatoria" ]].

Anclas

  • [x] Vista: vista_E003
  • [x] Nodo: fraccion_susceptible
  • [x] Ciclo: R1, refuerza (y su freno B1)
  • [x] Número de estadisticas_E003.csv: 1,601.2 (media 738.8 más desviación 862.4 de d_casos_7d)
  • [x] Regla de rechazo del ciclo: R2

Paso 7 · Bitácora, transferencia y entrega

bitacora_ia.md (clic para abrir)

Bitácora de IA, E003

Modelo usado: claude-haiku-5-5 (Anthropic), en la interfaz web.

# Prompt resumido Qué se equivocó el modelo Qué cambié Qué entregable afectó
1 "Explícame con mis flechas la fórmula de infeccion: llegan Infectados, tasa_contacto, prob_transmision, fraccion_susceptible" Propuso sumar las cuatro en vez de multiplicarlas Revisé las unidades: personas por día sale de multiplicar, no de sumar modelo_E003.html, tarea 3
2 "Dame el SQL de media, mediana y desviación para DuckDB en el navegador" Usó stddev_pop en vez de stddev_samp Cambié a stddev_samp, como pide la guía dashboard_E003.html, comprobación de la desviación
3 "Redacta el insight de variable con estos números: brecha +8,511 día 185, -6,134 día 674" Escribió que el modelo "predijo mal la tercera ola" como si fuera un error de cálculo Lo reescribí: el modelo no tiene pérdida de inmunidad, por eso no puede producirla insights_E003.md
4 "Escribe el prompt con rails de un Vigía con estas 5 anclas" Puso tres causas posibles en cada alerta Agregué "Nunca más de una" en el paso 5 empleado_ia1_E003.html, prompt con rails
transferencia.md (clic para abrir)

Tarjeta de transferencia, E003

Patrón que usé: Difusión con límite (F1). Problema nuevo: el lanzamiento de un pódcast universitario en redes sociales.

  1. El problema se mide en oyentes semanales, en un horizonte de 26 semanas, y la pregunta es cuándo llega el pico de crecimiento.
  2. Los stocks son personas que no conocen el pódcast, personas que lo escuchan esta semana y personas que ya lo probaron y lo dejaron; los flujos son descubrir, dejar de escuchar y volver.
  3. Cuando los oyentes suben, las recomendaciones suben, y eso hace que los oyentes suban más: ciclo R; pero cuando quedan pocos por descubrirlo, el crecimiento se frena: ciclo B.
  4. El dato que alimenta el modelo son las reproducciones por día de la plataforma, exportadas cada semana a una vista densa en DuckDB con un día por fila.
  5. Ayudaría un Vigía que avise cuando las reproducciones de 7 días caigan una desviación estándar por debajo de la media, supervisado por la persona que produce el pódcast.

Lista de revisión antes de comprimir, tal como se marcó en la carpeta E003/:

  • modelo_mano_E003.png (foto del dibujo con signos y 5 frases)
  • modelo_E003.html (descargado de la página)
  • salidas_E003.csv (formato largo)
  • sql_E003.txt (evidencia de la ingesta a DuckDB local, escrita por el script)
  • dashboard_E003.html (5 variables, histogramas, lecturas, hechos, insights)
  • insights_E003.md
  • empleado_ia1_E003.html y empleado_ia2_E003.html
  • bitacora_ia.md (4 entradas)
  • transferencia.md (5 frases)
  • Ningún archivo contiene una llave que empiece por sk-ant o AIza

Clic derecho sobre la carpeta E003, Comprimir. Nombre: EXAMEN FINAL - E003 - NOMBRE COMPLETO.zip. Enviado por correo a las 18:20.

Cómo se ve desde la calificación

Salida real de grade_model.py del profesor sobre el modelo entregado:


Chequeos de aceptacion sobre la corrida del estudiante:
  PASA  Infectados alcanza su maximo entre el dia 175 y el dia 215 (clave: dia 195, 2020-09-17).  valor del estudiante: dia 195
  PASA  Recuperados al dia 730 esta entre 2,249,737 y 3,043,762 (clave: 2,646,749).  valor del estudiante: 2,646,749
  PASA  Susceptibles nunca baja de 0 (clave: minimo 1,886,084).  valor del estudiante: 1,886,084

salidas_E003.csv frente a la corrida de su modelo: diferencia relativa mediana 0.000% -> coherente

Sugerencia: 1b 10/10  1c 4/4   (1a dibujo a mano y 1d ciclo explicado los lee el profesor)

Cada pilar vale un tercio. Nota final = promedio de los tres pilares. En el ejemplo, los tres pilares quedaron completos.

Anexos

Los anexos técnicos están en inglés (lengua de trabajo del diseño) y el SQL es el mismo que reciben los estudiantes.

A. Especificación final (inglés)

EXAM SPEC v3 (final): "Sistema, Datos, IA"

Course: Analítica de Datos con Inteligencia Artificial, Universidad de La Sabana. Cohort: 110 communication students (non-CS). Window: 24 hours, take-home. Professor-facing (English); every student-facing file is Spanish, B1, no em dashes, no student names. v1 = v0 (EXAMEN-SPEC-v0.md) amended by the MAGI-3 consensus (magi/consensus.md); v2 added the hand drawing and the HTML model page; v3 (this file) is the final pivot: students need only Python on the computer, as in class (the ingest script installs DuckDB by itself), and everything else runs in the browser, the AI employees are HTML documents, delivery is a zipped folder sent by email. Latest revision: Pillar 2 step A is now a local DuckDB ingest script (ingesta_Exxx.py) instead of DuckDB in the browser, and Pillar 3 is framed around problemáticas with three deliverables per AI employee. Where this file and earlier versions differ, this file wins.

0. Top goal (binding)

  1. Every student can finish with only Python on the computer, as in class (the ingest script installs DuckDB by itself): no database server, no modelling software, no live LLM test; everything else runs in the browser. The model page, the dashboard and the AI-employee template run in Chrome, Edge or Safari. Grading v4: three pillars, one third of the final grade each (final grade = average of the three), no point numbers shown to students and no minimum path; a wide data CSV in every folder; a wall-clock plan with sleep; a single delivery at the close (Friday 14 November, 7:00 pm), graded as received even if incomplete.
  2. Every student keeps a permanent guide (guia/GUIA-PERMANENTE.md): how to frame any problem with System Dynamics (nodes and signed arcs, loops read by counting minus signs), how to do defensible data analysis (five statistics, histograms, DATO/JUICIO, facts and insights), how to design and govern an AI employee (hoja de vida, prompt con rails, harness, governance AURORA: risks, policies, processes with flow, containment protocol), closing with a transfer card.
  3. The order is forced: understand and draw the complete model by hand (photo) → complete the same model in the HTML page, run, check, simulate, export → data (local DuckDB ingest, dashboard with 5 variables, facts and insights with conclusions) → two AI employees. The local DuckDB ingest (Paso 1) is scheduled on Thursday night because it is short and confirms the data opens. Rule: no Pillar 2 grading before the photo; no Pillar 3 before Pillar 2.

1. Layout

 PILLAR 1 (centre, 25)              PILLAR 2 (left, 40)                     PILLAR 3 (right, 35)
 own SD model: nodes + signed arcs  local DuckDB ingest (5)                 2 AI employees, one per problem, each an
 drawn by hand (8), completed in    dashboard: 5 variables with mean,       HTML built in empleado_ia_plantilla.html:
 the HTML page, run, checks,        median, mode, SD, CV (10), histograms   hoja de vida, prompt con rails, harness,
 one simulation, export (17)        (5), DATO/JUICIO readings (5),          risks AIR 2024, policies, processes with
                                    3 facts + 2 insights (10), transfer (5) flow, containment (IA1 20, IA2 15)

2. Single common dataset

data/covid_diario.csv: datos.gov.co gt2j-8ykr aggregated server-side (4 SoQL group queries, data/build_snapshot.py). 252,677 rows, grain day × departamento (raw code) × sexo (raw) × grupo_edad; 6,388,216 casos; 143,125 fallecidos COVID (fallecidos_covid; fallecidos = any cause, 184,393). sha256 873db02a331ba22e65aea3b8f8a17a61c261b7c3fe30abbba1a2680d0c3f6783. Professor hosts the CSV at https://class.audience-analysis.com/analitica-examen/covid_diario.csv (the ingest script downloads it from there and checks the sha256) with CORS open (Access-Control-Allow-Origin: *) so the plan B fallback in shell.duckdb.org can read_csv it too. The dashboard template is hosted at https://class.audience-analysis.com/analitica-examen/dashboard_plantilla.html; the script downloads it when the local copy is missing. Deliberate raw traps (students met them in the lab; the per-student ingesta_Exxx.py and duckdb_Exxx.sql fix them; duckdb_Exxx.sql block 7 shows the traps): T1 district codes 8001/13001/47001 and codes as text; T2 sexo case variants (12 cases); T3 negative report lag in 163 groups. Lesson: hospital/uci are last-update status, not events.

3. Pillar 1: 110 models (one third of the grade)

11 families × 10 territories = 110 unique assignments (asignacion.csv, seed 2026); 3 hidden-set variants per family. Territories (DANE 2020 projections in data/poblacion.csv): Bogotá, Antioquia, Valle, Cundinamarca, Santander, Atlántico (+Barranquilla), Bolívar (+Cartagena), Boyacá, Tolima, Norte de Santander. Families (pattern first, COVID instance second; definitions in models/gen/families.py):

Id Pattern Instance Nodes Tasks Given
F1 Difusión con límite contagio básico 16 5 69 %
F2 Límite de capacidad capacidad hospitalaria 17 5 71 %
F3 Atención y respuesta con retraso percepción de riesgo 20 5 75 %
F4 Lo medido frente a lo real detección y pruebas 17 5 71 %
F5 Tubería con colas y rezagos rezago de reporte 17 5 71 %
F6 Pérdida y reentrada inmunidad y reinfección 18 5 72 %
F7 Dos relatos en competencia infodemia 15 4 73 %
F8 Sistemas acoplados dos territorios 19 5 74 %
F9 Segmentos con riesgo distinto edades y letalidad 20 5 75 %
F10 Círculo vicioso de la carga personal de salud 14 4 71 %
F11 Confianza lenta de construir y rápida de perder comunicación pública 21 5 76 %

Delivery format: each student receives Exxx-modelo.html, a single self-contained web page. The vocabulary is nodes (stocks as boxes, flows as pipes with valves and clouds, converters as circles) and arcs (information arrows, each carrying a + or - sign). The page shows ? on nodes whose formula is missing and a PROVISIONAL badge on nodes that temporarily use a constant, lists the TAREAS with 3-tier hints, lets the student type formulas, add the missing converter ("Agregar convertidor"), load datos_Exxx.csv ("Cargar datos", wide CSV: the page picks the columns its d_ nodes need), run ("Correr"), see acceptance checks as PASA/FALLA and a chart, change a parameter and run again (simulate), export the outputs ("Exportar salidas CSV" → salidas_Exxx.csv, long format t,variable,valor,origen) and download the completed page ("Descargar este HTML" → modelo_Exxx.html with formulas and data embedded in <script id="spec" type="application/json">). Hidden policy (equal workload): 1 easy parameter blank + 2 or 3 flow/converter blanks (? on the page, arcs kept) + exactly 1 removed converter on a named loop (its dependents carry a PROVISIONAL constant so the model runs before it is added). Never hidden: stocks, data-fed converters. Time: t 0..730 (2020-03-06 to 2022-03-06), DT 0.25, Euler. Mandatory sequence: Paso 2 = draw the COMPLETE model by hand (every node including the missing one, arcs WITH signs, loops marked R or B by counting minus signs, 5 sentences), photograph it as modelo_mano_Exxx.jpg (or .jpeg/.png/.pdf); Paso 3 = transfer to the HTML (formulas, missing node, load data, run, checks PASA/FALLA, one simulation, export salidas_Exxx.csv, download modelo_Exxx.html); graded lines: HTML runs, checks, one loop explained with a number. The photo is a gate: without it Pillar 2 is not graded. Keys: models/claves/ hold the complete model and run in PySD; Exxx-clave.md lists the hidden equations, acceptance values and the key diagram (with signs) the professor uses to grade the photo. models/validate.py passes on all 110. models/grade_model.py --student modelo_Exxx.html reads the embedded model, transplants key data and grades items 1b/1c.

4. Pillar 2: data (one third of the grade)

Student folder Exxx/ (8 files): Exxx-modelo.html, Exxx-ficha.md + .html, ingesta_Exxx.py, duckdb_Exxx.sql, dashboard_plantilla.html (copy of the template), vista_Exxx_duckdb.sql (read-only recipe), datos_Exxx.csv (backup, 731 days, 22 variables). Step A, local DuckDB ingest with evidence (rubric 2a, Thursday 19:30 to 20:00): the student unzips the folder Exxx/ and runs ingesta_Exxx.py without typing long commands (Windows: double click, which opens a black window; Mac: open Terminal, type python3 and a space, drag ingesta_Exxx.py into the window, press Enter; if the Windows double click does not open the black window: Windows key, cmd, Enter, py, space, drag the file, Enter; if py fails, try python). The script installs DuckDB by itself if it is missing, opens the dashboard in the browser at the end and prints LISTO after 1 to 3 minutes. The script: [1/6] downloads the hosted datos.gov.co snapshot covid_diario.csv (15 MB, gt2j-8ykr summarised by day, departamento, sexo and grupo de edad) and checks its sha256; [2/6] creates examen_Exxx.duckdb with table covid_diario and prints "252,677 filas, 6,388,216 casos, 143,125 fallecidos COVID -> coincide"; [3/6] runs the limpieza (covid_limpio) and creates the territory view v_territorio_X, printing e.g. "v_territorio_76: 731 dias, 540,163 casos, 15,016 fallecidos, casos_7d promedio 738.8 -> 731 dias, coincide" (E003, Valle, code 76; 572,543 casos is the Valle total for the whole dataset period); [4/6] exports mi_territorio_Exxx.csv (731 rows, 23 columns: t, fecha and the variables); [5/6] writes dashboard_Exxx.html from the template with the data embedded (the database-to-dashboard connection; it never overwrites an existing dashboard_Exxx.html); [6/6] writes sql_Exxx.txt, the evidence (date and time, DuckDB version, sha256, counts, view numbers, first rows, SQL used). It ends with "LISTO. Siguiente paso: abre dashboard_Exxx.html y elige tus 5 variables." duckdb_Exxx.sql is the same pipeline as SQL blocks, with the same paths (7 blocks; block 6 is a COPY to CSV and works only locally; block 7 shows the traps). Plan B: paste the blocks one at a time in a local DuckDB (CLI or duckdb -ui) or at https://shell.duckdb.org/; the student then writes sql_Exxx.txt by hand with the same 4 things (counts, view name, 3 numbers, date and time). Plan C: use datos_Exxx.csv from the folder; only step A (the ingest, rubric 2a) is lost. mi_territorio_Exxx.csv (made by the script) and datos_Exxx.csv (backup) have identical content: wide, t, fecha and the territory variables (derived from datos.gov.co), 731 rows. Either file feeds the model page ("Cargar datos") and the dashboard ("Leer CSV"). Step B, dashboard (Paso 4, 08:30 to 10:30): the student opens dashboard_Exxx.html, which already holds the data from the database; the optional "Leer CSV" with salidas_Exxx.csv adds simulated variables. A student who did not run the script opens dashboard_plantilla.html and loads mi_territorio_Exxx.csv or datos_Exxx.csv. In both cases the student chooses 5 or more variables (at least one real); for each the page computes media, mediana, moda, desviación estándar muestral, coeficiente de variación (only when min ≥ 0 and mean > 0) and draws a histogram; the student writes one DATO and one JUICIO reading per variable (10 statistics + 5 histograms + 5 readings). Step C, "Entiende tu tablero: hechos, insights y conclusiones" (Paso 5, 10:30 to 12:00): 3 facts (information with a number), a loop insight and a variable insight, each with a number, and for each insight a conclusion with three parts: the problemática or situation found, what to do to improve the system, and the AI employee that would make it possible (name and archetype); transfer card of 5 sentences. The dashboard is saved as dashboard_Exxx.html (Descargar este HTML or Guardar como). Grader recomputes the statistics from the loaded CSV at 0.5 % tolerance.

5. Pillar 3: two AI employees (one third of the grade)

Two digital employees (AI), one per problemática found in the analysis (one per insight), from 4 archetypes (Vigía, Redactor, Verificador, Explicador). Each is built in estudiante/ia/empleado_ia_plantilla.html (form on the left, document on the right; buttons Cargar ejemplo, Descargar este HTML, Imprimir o guardar PDF) and downloaded as empleado_ia1_Exxx.html and empleado_ia2_Exxx.html, each carrying its data in <script id="gov" type="application/json">. Each employee has three deliverables: (1) prompt with specifications, rails and harness; (2) hoja de vida: tasks or functions, skills, competencies and limitations; (3) AI governance framework: risks, policies, processes with flow diagram and containment protocol. An AI employee suggests; a person decides. Sections: 0 Quién es (nombre, rol, arquetipo, insight de origen, ciclo o variable, qué mejora del sistema); 1 Ficha de gobernanza (propósito, modelo id, proveedor, dónde corre, nivel de riesgo, dueño, despliegue, retiro, qué hace); 2 Hoja de vida (habilidades con herramienta, competencias, limitaciones, supervisor, KPIs, día a día lunes a viernes with disparador, entrada, acción, salida, quién revisa, incl. a waiting day and an incident day); 3 Prompt con rails (identidad, misión con número y ciclo, entradas, pasos, salidas, rails G1 a G3 with one born from the loop, rechazos R0 R1 fixed and R2 from the loop, entrega a humano, ejemplo normal, ejemplo de rechazo); 4 Harness (disparador, formato de entrada, formato de salida, 3 pruebas, registro, interruptor, costo); 5 Palabras usadas; 6 Riesgos (3 or more, each AIR 2024 L1 → L2 → L3, nivel ALTO/MEDIO/BAJO, qué puede salir mal, cómo lo evitamos, política); 7 Políticas (one per risk: hacer, no hacer, recordar); 8 Procesos (3 or more, flowchart drawn by the page from pasos and preguntas sí/no); 9 Protocolo de contención (SEV-1/2/3 with time, 7 steps Parar, Contener, Deshacer, Buscar, Avisar, Arreglar, Aprender). Graded lines (relative weights inside the pillar, grader only): for IA1 and IA2, prompt con rails y harness, hoja de vida, riesgos AIR, políticas, procesos con flujo, contención. estudiante/ia/ now holds: empleado_ia_plantilla.html (+ ejemplo_empleado_ia1_E003.json), superprompt_plantilla.md (a short reading: how to write the prompt con rails and the harness), tarjeta_AIR2024.md, bitacora_ia_plantilla.md. cv_plantilla.md and gobernanza_plantilla.md were removed (replaced by the HTML template). Gates: bitácora de IA (bitacora_ia.txt or .md, max 5 entries; if missing, the Pillar 3 grade drops 10 %); secrets (an API key in the zip drops the Pillar 3 grade 10 %).

6. Rubric v4: three pillars, one third each

Final grade = average of the three pillar grades. Each pillar is one third of the final grade. Inside each pillar the lines are binary (yes/no) with relative weights. The internal weights (Pillar 1 sums 25: 1a hand drawing with signs 8, 1b HTML runs 10, 1c checks 4, 1d loop with number 3; Pillar 2 sums 40: 2a DuckDB local ingest with evidence 5, 2b statistics of 5 variables 10, 2c histograms 5, 2d DATO/JUICIO 5, 2e 3 facts + 2 insights 10, 2f transfer 5; Pillar 3 sums 35: 3a to 3f IA1 20, 3g to 3l IA2 15) are used only by the grader to turn a pillar into a 0 to 100 % result. They are never shown to students. There is no minimum path: students are told only which items must be there for the course to make sense ("lo que debe estar sí o sí"), without numbers. Gates: without the AI log (bitacora_ia), the Pillar 3 grade drops 10 %; an API key in the zip drops the Pillar 3 grade 10 %; without the photo of the hand drawing, Pillar 2 is not graded. Details and binary checklists: rubrica/RUBRICA.md, rubrica/RUBRICA.csv. Delivery: no student-side submission script (ingesta_Exxx.py only serves Pillar 2). Fixed files inside a folder Exxx/: modelo_mano_Exxx.jpg|jpeg|png|pdf, modelo_Exxx.html, salidas_Exxx.csv, sql_Exxx.txt (written by the script, or by hand with plan B; may be missing), dashboard_Exxx.html, insights_Exxx.txt|md (also hint tiers, the simulation sentence and the 5 drawing sentences if not in the photo), empleado_ia1_Exxx.html, empleado_ia2_Exxx.html, bitacora_ia.txt|md, transferencia.txt|md. The student right-clicks the folder, compresses it, names it EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip and emails it. The professor runs herramientas_profesor/verificar_entrega.py inside each unzipped folder (file list, empty eqn count in the model's spec JSON, gov JSON with ≥ 3 riesgos and ≥ 3 procesos in each employee, secrets).

7. Accessibility (binding)

ADHD: wall-clock plan with sleep and a single delivery at the close, "qué significa terminado" and "ya es suficiente" per block, one task per page, "si te atascas" boxes, fill-in templates, no optional choices in the core steps, hyperfocus guard on the dashboard. Cognitive load: B1 Spanish, ≤ 20 words per sentence, ≤ 7 items per list, example after every instruction, glossary, pre-filled "panel de control" per student. Colour vision: validated Okabe-Ito subset #0072B2 #D55E00 #009E73 #CC79A7 #56B4E9 #7B3294, never red vs green, shape and text redundant with colour. Typography (HTML builds): system sans, 18 px, line-height 1.6, 70 ch, left aligned.

8. Deliverables (this repository)

See README.md for the tree and the commands. MAGI-3 reports: spec/magi/{melchior,balthasar,casper}.md, decisions in spec/magi/consensus.md.

9. Decisions the professor still owns

  1. Hosting of covid_diario.csv and dashboard_plantilla.html: the ingest script downloads both from https://class.audience-analysis.com/analitica-examen/; the plan B fallback in shell.duckdb.org also needs CORS (Access-Control-Allow-Origin: *). Run python ingesta_E003.py on a clean copy of the E003 folder the night before (expect 252,677 / 6,388,216 and 731 días).
  2. Reception mailbox: attachment limit (25 MB) and several emails per student; a shared folder as fallback.
  3. Whether datos_Exxx.csv may be left out of the zip when it exceeds the mail limit (default: yes, the professor already has it).
  4. Which browsers are announced as confirmed after testing the three HTML pages (model, dashboard, AI employee) in Chrome, Edge and Safari.
  5. Risk: students without a working Python: plan B SQL blocks (duckdb_Exxx.sql), plan C datos_Exxx.csv (loses only step A, rubric 2a).

B. Consenso MAGI-3 (inglés)

MAGI-3 consensus : decisions applied to spec v1

Three reviews, three "FIX THEN SHIP". Every blocker and major below is either ACCEPTED (applied to v1) or DECIDED with the reason. Nothing was dropped silently.

Unanimous core (all three)

  1. The minimum path must be mechanically finishable: prebuilt data in every student folder, a model that runs as soon as the ? blanks are filled, a published per-step points map that sums to at least 65. ACCEPTED.
  2. One contract is the single source of truth: the territory view (731 rows, t 0..730 first column, fixed ASCII column names) feeds the CSV for Stella, the key models' embedded data, salidas_modelo and the auto-grader. ACCEPTED.
  3. Every artefact must be provably the student's: anchors to their own view, nodes, loops and numbers; a transfer card in their own words; a bitácora of their LLM use. ACCEPTED.

MELCHIOR (pedagogy)

# Finding Decision
B1 Minimum path does not reach 60 ACCEPTED. Points map in the brief sums to 66 for the minimum path (see spec §7). Removed node has a provisional constant in its dependents, so the model runs once blanks are filled.
B2 No clock, no sleep, no exit ACCEPTED. Wall-clock plan, sleep block, two partial-delivery checkpoints, "ya es suficiente" line per block, partial ZIP graded at any hour.
B3 Start-up friction unbounded ACCEPTED with one nuance. Every student folder ships datos_Exxx.csv (the view output) as RESPALDO and the professor hosts covid.duckdb. Using the backup CSV costs the view points (Paso 1b) but never blocks the model. entrega.py prints OK/FALTA and zips.
B4 Zero transfer possible ACCEPTED. "Tarjeta de transferencia" (5 pts): re-apply the family pattern to a non-COVID communication problem in 5 sentences; last page of their permanent guide.
M1 Node budget uneven PARTLY. Families trimmed to 14-21 nodes; hidden count fixed by size (4 if < 16 nodes, 5 otherwise) so workload is equal; completion ratio therefore 24-33 %, reported per model in asignacion.csv. The professor asked for "at least 12 nodes, 70 % complete"; equal workload was preferred over an exact 30 % everywhere.
M2 Two removed nodes too many ACCEPTED. Exactly one removed node per model, always a converter on a named loop; the ficha shows where it belongs.
M3 Hints single level ACCEPTED. Three tiers per TAREA: concept, formula in words, skeleton with blanks (generated from the equation). Student writes which tier they used.
M4 Accessibility stops at colour ACCEPTED. §8.4: typeface and size, line length, a pre-filled "panel de control" first page per student, zero choices on the minimum path (variables pre-suggested), hyperfocus guards.
M5 COVID labels, not patterns ACCEPTED. Dual naming: pattern first, COVID instance second; loop story template "Cuando X sube, Y sube, y eso hace que X suba más: R".
M6 Rubric rewards pasting ACCEPTED. 5 pts moved from dashboard rendering to "explain one loop in words with a number".
M7 COVID carries grief ACCEPTED. Content note; fallecidos never on the minimum path. Dataset kept (known tools, Colombian, communication-native families).
M8 Professor's 30 minutes ACCEPTED. Checklist in README.

BALTHASAR (AI)

# Finding Decision
B1 Superprompt not necessarily the student's ACCEPTED. Five anchors: view name, node name, loop name with R/B, one number from estadisticas as threshold, one refusal rule derived from the loop. Missing anchor = 0 for that section.
B2 No evidence it works ACCEPTED. "Prueba en vivo": run once with 3 real rows, paste output, 2-line critique (3 of 8 pts).
B3 Data boundary undefined ACCEPTED. Pre-filled: single source = aggregated view; no row-level API, no external joins; small-cell rule n < 5.
B4 Secrets in the ZIP ACCEPTED. entrega.py refuses to zip if it finds sk-ant or AIza; governance row "¿dónde vive la llave?".
M5 AIR 2024 undoable in 2 h ACCEPTED. Spanish card: 4 L1, 16 L2, curated L3 subset (18) for a data employee; exactly 3 risks (one System & Operational, one Societal or Legal & Rights, one free) + one "no aplica"; one worked row.
M6 Taxonomy is not assessment ACCEPTED. Risk row = L1→L2→L3, severidad + why, mitigación → G# guardrail, residual, punto humano. Mitigation absent from the superprompt = half credit.
M7 Calendar theatre ACCEPTED. CV table: Día, Disparador, Entrada, Acción, Salida, Quién revisa; one waiting day, one incident day.
M8 Governance incomplete ACCEPTED. Rows added: pinned model id + test date, owner, logging, evaluation (3 cases), incident path, retirement, cost cap, kill switch.
M9 "En la nube" ACCEPTED. Three infra cards A/B/C; DuckDB vs Postgres as "how many readers at once".
M10 LLM use ungradeable ACCEPTED. Bitácora de IA, max 5 entries, gate (−5 if missing).
M11 Six examples too many ACCEPTED. Two per employee: one normal, one refusal or hand-off.
m12-15 Triad bounded; four employee archetypes; fixed medical-advice refusal; binary checklists ACCEPTED.

CASPER (data and quality)

# Finding Decision
B1 Snapshot build crashes (strings) FIXED. Numeric cast at load; cached pulls reused.
B2 F2 and F10 have no hospital data ALREADY DESIGNED so: F2 and F10 are driven by casos_7d × fraction and anchored on fallecidos; hospital/uci stay in the snapshot as DQ lesson "status at last update, not event".
B3 Dense daily series ACCEPTED. Calendar spine in the view, COALESCE(x,0), grader asserts 731 rows and contiguous t.
B4 Horizon off by one ACCEPTED. t 0..730, 731 rows, stop=730.
B5 Population left to the student ACCEPTED. data/poblacion.csv shipped and hard-coded in keys and fichas; the micro-task is "cite the source".
B6 Acceptance not automatic ACCEPTED. grade_model.py: transplant key data into the student .stmx, run PySD, compare hidden variables to the key (nRMSE < 0.15, peak day ±14, constant detector).
M1 Trap 3 does not exist in CSV ACCEPTED. Replaced by the real one: negative report lag (source error). Traps = district codes (big), sexo case (explanation only), negative lag (source error), plus the hospital/uci status lesson.
M3 District codes = 60 % error ACCEPTED. ingest.py forces departamento as VARCHAR/TEXT; limpieza.sql builds territorio.
M4 Lag stats from sum/n ACCEPTED. 7-day rolling ratio with NULLIF, COALESCE, GREATEST(0, …). Sum of squares NOT re-pulled (mean is enough for the models; SD of the lag is computed by the student on the daily series).
M5 Statistics under-specified ACCEPTED. Two SQL files (DuckDB, Postgres), stddev_samp, CV rule, grading recomputed from the student's own salidas_Exxx.csv at 0.5 % tolerance.
M6 "Key variable" not gradeable ACCEPTED. Ficha lists 6 eligible variables (3 real, 3 simulated, en_ciclo tag); student picks 3; the minimum path pre-suggests them.
M7 F8 remainder ACCEPTED. casos_resto_7d in the view; pob_resto = 50,372,424 − pob_T.
M8 XMILE round-trip through Stella DECIDED: cannot be done on this machine (no Stella). Generated XMILE is conservative (standard elements only, PySD-verified keys) and the professor's pre-exam checklist item 1 is "open one .stmx in Stella and import one datos_Exxx.csv". Student files validated structurally.
minors sha256 + totals in ficha; UTF-8, . decimal; versions pinned; recuperados for validation only; grupo_edad SD branch documented ACCEPTED.

C. Kit de datos: SQL

limpieza.sql

-- limpieza.sql : de la tabla cruda covid_diario a la tabla limpia covid_limpio.
-- Corre IGUAL en DuckDB y en PostgreSQL (SQL estandar). Ejecuta: python run_sql.py --duck lab.duckdb --file limpieza.sql
--                                                                  python run_sql.py --pg postgresql://localhost/lab --file limpieza.sql
--
-- Las 3 trampas del dataset (explicalas en ingesta_Exxx.md):
--   T1 codigos de departamento como texto, sin cero a la izquierda y con codigos de distrito (8001 Barranquilla,
--      13001 Cartagena, 47001 Santa Marta). Si los tratas como numero o no los unes, Atlantico pierde el 66 % de sus casos.
--   T2 sexo con mayusculas y minusculas mezcladas (F, M, f, m). Son 12 casos de 6.39 millones: no cambia ningun numero,
--      pero rompe un GROUP BY. Regla: dominio en una sola mayuscula.
--   T3 rezago de reporte negativo (fecha_reporte_web anterior a fecha_diagnostico) en 163 grupos. Es un error de la fuente:
--      no se corrige, se excluye del promedio y se reporta.
-- Leccion extra: hospital y uci son el estado en la ULTIMA actualizacion del caso, no un evento. Valen 0 durante
--      casi todo 2020-2021. Un dato de estado no sirve para medir un flujo.

DROP TABLE IF EXISTS covid_limpio;

CREATE TABLE covid_limpio AS
SELECT
  CAST(dia AS DATE)                                   AS dia,
  CAST(departamento AS VARCHAR)                       AS departamento,          -- T1: siempre texto
  CASE CAST(departamento AS VARCHAR)
       WHEN '8001'  THEN '8'                                                   -- Barranquilla -> Atlantico
       WHEN '13001' THEN '13'                                                  -- Cartagena -> Bolivar
       WHEN '47001' THEN '47'                                                  -- Santa Marta -> Magdalena
       ELSE CAST(departamento AS VARCHAR) END         AS territorio,
  departamento_nom,
  UPPER(sexo)                                         AS sexo,                 -- T2: un solo dominio
  grupo_edad,
  CAST(casos AS INTEGER)                              AS casos,
  CAST(hospital AS INTEGER)                           AS hospital,
  CAST(uci AS INTEGER)                                AS uci,
  CAST(importados AS INTEGER)                         AS importados,
  CAST(relacionados AS INTEGER)                       AS relacionados,
  CAST(rezago_diag_sum AS INTEGER)                    AS rezago_diag_sum,
  CAST(rezago_diag_n AS INTEGER)                      AS rezago_diag_n,
  CAST(rezago_rep_sum AS INTEGER)                     AS rezago_rep_sum,
  CAST(rezago_rep_n AS INTEGER)                       AS rezago_rep_n,
  CASE WHEN CAST(rezago_rep_sum AS INTEGER) < 0 THEN 1 ELSE 0 END AS rezago_rep_negativo,   -- T3: marcado, no corregido
  CAST(casos_sintomas AS INTEGER)                     AS casos_sintomas,
  CAST(fallecidos AS INTEGER)                         AS fallecidos_todas_causas,
  CAST(fallecidos_covid AS INTEGER)                   AS fallecidos,           -- solo estado = 'Fallecido'
  CAST(recuperados AS INTEGER)                        AS recuperados,
  CAST(recuperados_pcr AS INTEGER)                    AS recuperados_pcr
FROM covid_diario;

-- Hallazgos de calidad (DATO): corre estas consultas y copia los numeros en ingesta_Exxx.md
-- SELECT territorio, sum(casos) FROM covid_limpio WHERE territorio IN ('8','13','47') GROUP BY 1;          -- T1
-- SELECT sexo, sum(casos) FROM covid_diario GROUP BY 1;                                                    -- T2 (crudo)
-- SELECT count(*) FROM covid_limpio WHERE rezago_rep_negativo = 1;                                         -- T3
-- SELECT sum(hospital), sum(uci), sum(casos) FROM covid_limpio WHERE dia BETWEEN DATE '2020-06-01' AND DATE '2021-08-31';  -- leccion

vista_territorio_duckdb.sql

-- vista_territorio (DuckDB): serie diaria DENSA de un territorio, 731 filas, t = 0 .. 730 (t = 0 es 2020-03-06).
-- Plantilla: {{T}} = codigo del territorio (ej. 8). Cada dia existe aunque no haya casos (COALESCE 0).
CREATE OR REPLACE VIEW v_territorio_{{T}} AS
WITH cal AS (
  SELECT CAST(unnest(generate_series(DATE '2020-03-06', DATE '2022-03-06', INTERVAL 1 DAY)) AS DATE) AS dia
),
terr AS (
  SELECT dia,
         sum(casos)                                                        AS casos,
         sum(casos_sintomas)                                               AS casos_sintomas,
         sum(fallecidos)                                                   AS fallecidos,
         sum(fallecidos_todas_causas)                                      AS fallecidos_todas_causas,
         sum(recuperados)                                                  AS recuperados,
         sum(importados)                                                   AS importados,
         sum(hospital)                                                     AS hospital,
         sum(uci)                                                          AS uci,
         sum(CASE WHEN grupo_edad IN ('0-17','18-39') THEN casos ELSE 0 END) AS casos_0_39,
         sum(CASE WHEN grupo_edad IN ('40-59','60+')  THEN casos ELSE 0 END) AS casos_40_mas,
         sum(CASE WHEN grupo_edad = '60+' THEN fallecidos ELSE 0 END)       AS fallecidos_60_mas,
         sum(rezago_diag_sum)                                              AS rezago_diag_sum,
         sum(rezago_diag_n)                                                AS rezago_diag_n,
         sum(CASE WHEN rezago_rep_negativo = 0 THEN rezago_rep_sum ELSE 0 END) AS rezago_rep_sum,   -- T3 excluido
         sum(CASE WHEN rezago_rep_negativo = 0 THEN rezago_rep_n   ELSE 0 END) AS rezago_rep_n
  FROM covid_limpio WHERE territorio = '{{T}}' GROUP BY dia
),
resto AS (
  SELECT dia, sum(casos) AS casos_resto FROM covid_limpio WHERE territorio <> '{{T}}' GROUP BY dia
),
base AS (
  SELECT cal.dia,
         CAST(cal.dia - DATE '2020-03-06' AS INTEGER)   AS t,
         COALESCE(terr.casos, 0)                        AS casos,
         COALESCE(terr.casos_sintomas, 0)               AS casos_sintomas,
         COALESCE(terr.fallecidos, 0)                   AS fallecidos,
         COALESCE(terr.fallecidos_todas_causas, 0)      AS fallecidos_todas_causas,
         COALESCE(terr.recuperados, 0)                  AS recuperados,
         COALESCE(terr.importados, 0)                   AS importados,
         COALESCE(terr.hospital, 0)                     AS hospital,
         COALESCE(terr.uci, 0)                          AS uci,
         COALESCE(terr.casos_0_39, 0)                   AS casos_0_39,
         COALESCE(terr.casos_40_mas, 0)                 AS casos_40_mas,
         COALESCE(terr.fallecidos_60_mas, 0)            AS fallecidos_60_mas,
         COALESCE(terr.rezago_diag_sum, 0)              AS rezago_diag_sum,
         COALESCE(terr.rezago_diag_n, 0)                AS rezago_diag_n,
         COALESCE(terr.rezago_rep_sum, 0)               AS rezago_rep_sum,
         COALESCE(terr.rezago_rep_n, 0)                 AS rezago_rep_n,
         COALESCE(resto.casos_resto, 0)                 AS casos_resto
  FROM cal LEFT JOIN terr ON terr.dia = cal.dia LEFT JOIN resto ON resto.dia = cal.dia
)
SELECT t, dia,
       casos, casos_sintomas, fallecidos, fallecidos_todas_causas, recuperados, importados, hospital, uci,
       casos_0_39, casos_40_mas, fallecidos_60_mas, casos_resto,
       avg(casos * 1.0)             OVER w AS casos_7d,                 -- promedio movil de 7 dias: quita el ruido de la semana
       avg(casos_sintomas * 1.0)    OVER w AS casos_sintomas_7d,
       avg(fallecidos * 1.0)        OVER w AS fallecidos_7d,
       avg(casos_0_39 * 1.0)        OVER w AS casos_0_39_7d,
       avg(casos_40_mas * 1.0)      OVER w AS casos_40_mas_7d,
       avg(casos_resto * 1.0)       OVER w AS casos_resto_7d,
       COALESCE(sum(rezago_diag_sum * 1.0) OVER w / NULLIF(sum(rezago_diag_n) OVER w, 0), 0) AS rezago_diag_prom,   -- dias, media movil 7d
       COALESCE(sum(rezago_rep_sum  * 1.0) OVER w / NULLIF(sum(rezago_rep_n)  OVER w, 0), 0) AS rezago_rep_prom,
       sum(casos) OVER (ORDER BY t) - sum(recuperados) OVER (ORDER BY t) - sum(fallecidos) OVER (ORDER BY t) AS activos_est
FROM base
WINDOW w AS (ORDER BY t ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
ORDER BY t;

estadisticas_duckdb.sql

-- estadisticas_duckdb.sql : media, mediana, desviacion estandar MUESTRAL, coeficiente de variacion y sesgo
-- de cada variable de salidas_{{E}}.csv (formato largo: t, variable, valor, origen).
-- Ejecuta: python run_sql.py --duck lab.duckdb --file estadisticas_{{E}}_duckdb.sql
-- Produce: estadisticas_{{E}}.csv  (columnas: variable, origen, en_ciclo, n, media, mediana, desv_est, cv, sesgo)
-- Regla del CV: solo se calcula si todos los valores son >= 0 y la media es > 0; si no, queda vacio ("no aplica").
-- Regla del sesgo: sesgo = media - mediana. Positivo: cola hacia arriba (pocos dias muy altos).

CREATE OR REPLACE TABLE salidas_modelo AS
SELECT * FROM read_csv('salidas_{{E}}.csv', header = true,
                       columns = {'t': 'INTEGER', 'variable': 'VARCHAR', 'valor': 'DOUBLE', 'origen': 'VARCHAR'});

COPY (
  SELECT variable,
         origen,
         CAST(NULL AS VARCHAR)                             AS en_ciclo,   -- escribe si / no segun tu ficha
         count(*)                                          AS n,
         round(avg(valor), 3)                              AS media,
         round(median(valor), 3)                           AS mediana,
         round(stddev_samp(valor), 3)                      AS desv_est,
         CASE WHEN min(valor) >= 0 AND avg(valor) > 0
              THEN round(stddev_samp(valor) / avg(valor), 3) END AS cv,
         round(avg(valor) - median(valor), 3)              AS sesgo
  FROM salidas_modelo
  GROUP BY variable, origen
  ORDER BY origen, variable
) TO 'estadisticas_{{E}}.csv' (HEADER, DELIMITER ',');

estadisticas_postgres.sql

-- estadisticas_postgres.sql : misma estadistica que la version DuckDB, sintaxis PostgreSQL.
-- La mediana en PostgreSQL es percentile_cont(0.5) WITHIN GROUP (ORDER BY valor).
-- Ejecuta: python run_sql.py --pg postgresql://localhost/lab --file estadisticas_{{E}}_postgres.sql
-- Las lineas "-- @csv_in" y "-- @csv_out" las entiende run_sql.py (PostgreSQL no lee ni escribe CSV del cliente por SQL).

DROP TABLE IF EXISTS salidas_modelo;
CREATE TABLE salidas_modelo (t INTEGER, variable TEXT, valor DOUBLE PRECISION, origen TEXT);
-- @csv_in salidas_modelo salidas_{{E}}.csv

-- @csv_out estadisticas_{{E}}.csv
SELECT variable,
       origen,
       CAST(NULL AS TEXT)                                                      AS en_ciclo,
       count(*)                                                                AS n,
       round(avg(valor)::numeric, 3)                                           AS media,
       round((percentile_cont(0.5) WITHIN GROUP (ORDER BY valor))::numeric, 3) AS mediana,
       round(stddev_samp(valor)::numeric, 3)                                   AS desv_est,
       CASE WHEN min(valor) >= 0 AND avg(valor) > 0
            THEN round((stddev_samp(valor) / avg(valor))::numeric, 3) END      AS cv,
       round((avg(valor) - percentile_cont(0.5) WITHIN GROUP (ORDER BY valor))::numeric, 3) AS sesgo
FROM salidas_modelo
GROUP BY variable, origen
ORDER BY origen, variable;

D. Asignación de modelos

Código Familia Patrón Territorio Variante Nodos Tareas Dado Nodo a dibujar
E001 F5 Tuberia con colas y rezagos Antioquia 3 17 5 71 % tiempo_diagnostico_efectivo
E002 F9 Segmentos con riesgo distinto Cundinamarca 3 20 5 75 % proteccion
E003 F1 Difusion con limite Valle del Cauca 3 16 5 69 % fraccion_susceptible
E004 F8 Sistemas acoplados Valle del Cauca 1 19 5 74 % brecha_B
E005 F8 Sistemas acoplados Boyaca 3 19 5 74 % brecha_B
E006 F6 Perdida y reentrada Norte de Santander 3 18 5 72 % fraccion_susceptible
E007 F10 Circulo vicioso de la carga Santander 2 14 4 71 % carga_por_trabajador
E008 F2 Limite de capacidad Norte de Santander 2 17 5 71 % letalidad
E009 F10 Circulo vicioso de la carga Antioquia 2 14 4 71 % carga_por_trabajador
E010 F9 Segmentos con riesgo distinto Norte de Santander 3 20 5 75 % proteccion
E011 F9 Segmentos con riesgo distinto Bogota D.C. 3 20 5 75 % proteccion
E012 F10 Circulo vicioso de la carga Bogota D.C. 1 14 4 71 % carga_por_trabajador
E013 F11 Confianza lenta de construir y rapida de perder Santander 3 21 5 76 % consistencia
E014 F4 Lo medido frente a lo real Santander 2 17 5 71 % positividad
E015 F7 Dos relatos en competencia Bolivar (incluye Cartagena) 1 15 4 73 % interes
E016 F3 Atencion y respuesta con retraso Santander 1 20 5 75 % contacto_efectivo
E017 F8 Sistemas acoplados Santander 3 19 5 74 % brecha_B
E018 F9 Segmentos con riesgo distinto Bolivar (incluye Cartagena) 3 20 5 75 % proteccion
E019 F7 Dos relatos en competencia Cundinamarca 1 15 4 73 % interes
E020 F5 Tuberia con colas y rezagos Norte de Santander 2 17 5 71 % presion_cola
E021 F2 Limite de capacidad Boyaca 3 17 5 71 % ocupacion
E022 F7 Dos relatos en competencia Antioquia 2 15 4 73 % interes
E023 F3 Atencion y respuesta con retraso Antioquia 1 20 5 75 % contacto_efectivo
E024 F10 Circulo vicioso de la carga Bolivar (incluye Cartagena) 1 14 4 71 % carga_por_trabajador
E025 F3 Atencion y respuesta con retraso Valle del Cauca 2 20 5 75 % cumplimiento
E026 F3 Atencion y respuesta con retraso Bogota D.C. 3 20 5 75 % cumplimiento
E027 F6 Perdida y reentrada Atlantico (incluye Barranquilla) 2 18 5 72 % fraccion_susceptible
E028 F10 Circulo vicioso de la carga Norte de Santander 1 14 4 71 % carga_por_trabajador
E029 F11 Confianza lenta de construir y rapida de perder Cundinamarca 2 21 5 76 % consistencia
E030 F11 Confianza lenta de construir y rapida de perder Norte de Santander 2 21 5 76 % consistencia
E031 F1 Difusion con limite Santander 2 16 5 69 % casos_detectados_modelo
E032 F5 Tuberia con colas y rezagos Valle del Cauca 1 17 5 71 % presion_cola
E033 F6 Perdida y reentrada Valle del Cauca 2 18 5 72 % fraccion_susceptible
E034 F1 Difusion con limite Bolivar (incluye Cartagena) 1 16 5 69 % fraccion_susceptible
E035 F11 Confianza lenta de construir y rapida de perder Atlantico (incluye Barranquilla) 1 21 5 76 % adherencia
E036 F11 Confianza lenta de construir y rapida de perder Boyaca 3 21 5 76 % consistencia
E037 F1 Difusion con limite Tolima 3 16 5 69 % fraccion_susceptible
E038 F9 Segmentos con riesgo distinto Tolima 2 20 5 75 % proteccion
E039 F10 Circulo vicioso de la carga Tolima 3 14 4 71 % carga_por_trabajador
E040 F9 Segmentos con riesgo distinto Santander 1 20 5 75 % proteccion
E041 F5 Tuberia con colas y rezagos Bolivar (incluye Cartagena) 2 17 5 71 % presion_cola
E042 F6 Perdida y reentrada Antioquia 1 18 5 72 % fraccion_susceptible
E043 F10 Circulo vicioso de la carga Valle del Cauca 3 14 4 71 % carga_por_trabajador
E044 F10 Circulo vicioso de la carga Boyaca 2 14 4 71 % carga_por_trabajador
E045 F9 Segmentos con riesgo distinto Antioquia 1 20 5 75 % proteccion
E046 F2 Limite de capacidad Bolivar (incluye Cartagena) 2 17 5 71 % letalidad
E047 F4 Lo medido frente a lo real Cundinamarca 1 17 5 71 % positividad
E048 F7 Dos relatos en competencia Boyaca 2 15 4 73 % interes
E049 F6 Perdida y reentrada Santander 1 18 5 72 % fraccion_susceptible
E050 F4 Lo medido frente a lo real Tolima 3 17 5 71 % positividad
E051 F11 Confianza lenta de construir y rapida de perder Valle del Cauca 1 21 5 76 % adherencia
E052 F11 Confianza lenta de construir y rapida de perder Antioquia 3 21 5 76 % consistencia
E053 F7 Dos relatos en competencia Bogota D.C. 1 15 4 73 % interes
E054 F1 Difusion con limite Boyaca 2 16 5 69 % casos_detectados_modelo
E055 F4 Lo medido frente a lo real Antioquia 2 17 5 71 % positividad
E056 F4 Lo medido frente a lo real Atlantico (incluye Barranquilla) 3 17 5 71 % positividad
E057 F7 Dos relatos en competencia Norte de Santander 1 15 4 73 % interes
E058 F9 Segmentos con riesgo distinto Atlantico (incluye Barranquilla) 2 20 5 75 % proteccion
E059 F3 Atencion y respuesta con retraso Atlantico (incluye Barranquilla) 2 20 5 75 % cumplimiento
E060 F1 Difusion con limite Atlantico (incluye Barranquilla) 3 16 5 69 % fraccion_susceptible
E061 F3 Atencion y respuesta con retraso Boyaca 1 20 5 75 % contacto_efectivo
E062 F3 Atencion y respuesta con retraso Norte de Santander 3 20 5 75 % cumplimiento
E063 F3 Atencion y respuesta con retraso Cundinamarca 3 20 5 75 % cumplimiento
E064 F5 Tuberia con colas y rezagos Boyaca 3 17 5 71 % tiempo_diagnostico_efectivo
E065 F1 Difusion con limite Cundinamarca 1 16 5 69 % fraccion_susceptible
E066 F4 Lo medido frente a lo real Norte de Santander 1 17 5 71 % positividad
E067 F2 Limite de capacidad Tolima 1 17 5 71 % ocupacion
E068 F6 Perdida y reentrada Tolima 2 18 5 72 % fraccion_susceptible
E069 F9 Segmentos con riesgo distinto Boyaca 1 20 5 75 % proteccion
E070 F4 Lo medido frente a lo real Boyaca 2 17 5 71 % positividad
E071 F7 Dos relatos en competencia Tolima 3 15 4 73 % interes
E072 F11 Confianza lenta de construir y rapida de perder Bogota D.C. 2 21 5 76 % consistencia
E073 F2 Limite de capacidad Antioquia 3 17 5 71 % ocupacion
E074 F5 Tuberia con colas y rezagos Cundinamarca 2 17 5 71 % presion_cola
E075 F1 Difusion con limite Norte de Santander 1 16 5 69 % fraccion_susceptible
E076 F11 Confianza lenta de construir y rapida de perder Bolivar (incluye Cartagena) 2 21 5 76 % consistencia
E077 F5 Tuberia con colas y rezagos Tolima 1 17 5 71 % presion_cola
E078 F5 Tuberia con colas y rezagos Atlantico (incluye Barranquilla) 1 17 5 71 % presion_cola
E079 F5 Tuberia con colas y rezagos Santander 3 17 5 71 % tiempo_diagnostico_efectivo
E080 F4 Lo medido frente a lo real Valle del Cauca 3 17 5 71 % positividad
E081 F6 Perdida y reentrada Bogota D.C. 3 18 5 72 % fraccion_susceptible
E082 F3 Atencion y respuesta con retraso Bolivar (incluye Cartagena) 3 20 5 75 % cumplimiento
E083 F11 Confianza lenta de construir y rapida de perder Tolima 1 21 5 76 % adherencia
E084 F10 Circulo vicioso de la carga Atlantico (incluye Barranquilla) 3 14 4 71 % carga_por_trabajador
E085 F1 Difusion con limite Antioquia 2 16 5 69 % casos_detectados_modelo
E086 F6 Perdida y reentrada Boyaca 1 18 5 72 % fraccion_susceptible
E087 F2 Limite de capacidad Valle del Cauca 1 17 5 71 % ocupacion
E088 F4 Lo medido frente a lo real Bolivar (incluye Cartagena) 1 17 5 71 % positividad
E089 F2 Limite de capacidad Santander 3 17 5 71 % ocupacion
E090 F2 Limite de capacidad Bogota D.C. 2 17 5 71 % letalidad
E091 F8 Sistemas acoplados Tolima 1 19 5 74 % brecha_B
E092 F1 Difusion con limite Bogota D.C. 1 16 5 69 % fraccion_susceptible
E093 F4 Lo medido frente a lo real Bogota D.C. 1 17 5 71 % positividad
E094 F6 Perdida y reentrada Bolivar (incluye Cartagena) 3 18 5 72 % fraccion_susceptible
E095 F8 Sistemas acoplados Atlantico (incluye Barranquilla) 1 19 5 74 % brecha_B
E096 F7 Dos relatos en competencia Valle del Cauca 3 15 4 73 % interes
E097 F10 Circulo vicioso de la carga Cundinamarca 1 14 4 71 % carga_por_trabajador
E098 F8 Sistemas acoplados Bogota D.C. 2 19 5 74 % brecha_A
E099 F8 Sistemas acoplados Cundinamarca 2 19 5 74 % brecha_A
E100 F6 Perdida y reentrada Cundinamarca 3 18 5 72 % fraccion_susceptible
E101 F8 Sistemas acoplados Antioquia 3 19 5 74 % brecha_B
E102 F8 Sistemas acoplados Norte de Santander 2 19 5 74 % brecha_A
E103 F8 Sistemas acoplados Bolivar (incluye Cartagena) 2 19 5 74 % brecha_A
E104 F3 Atencion y respuesta con retraso Tolima 2 20 5 75 % cumplimiento
E105 F2 Limite de capacidad Cundinamarca 2 17 5 71 % letalidad
E106 F9 Segmentos con riesgo distinto Valle del Cauca 2 20 5 75 % proteccion
E107 F7 Dos relatos en competencia Atlantico (incluye Barranquilla) 3 15 4 73 % interes
E108 F7 Dos relatos en competencia Santander 2 15 4 73 % interes
E109 F5 Tuberia con colas y rezagos Bogota D.C. 2 17 5 71 % presion_cola
E110 F2 Limite de capacidad Atlantico (incluye Barranquilla) 1 17 5 71 % ocupacion
Arriba