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
- 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.
- 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.
- 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
- Ruta de licencia de Stella: escritorio con Import Data, o pegar la serie en la función gráfica.
- PostgreSQL obligatorio o bonus (versión actual: DuckDB obligatorio, PostgreSQL bonus).
- URL donde se publica
covid_diario.csvy su sha256 (reemplazar los marcadores en el enunciado). - Probar un
Exxx-modelo.htmlen 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">).
- Lista las fórmulas vacías del modelo embebido. Si hay alguna, 1b línea 1 = no.
- 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. - Corre de t = 0 a t = 730, dt = 1, Euler. Si hay NaN, 1b línea 3 = no.
- Compara cada variable oculta con la clave: nRMSE < 0.15 = sí.
- Día del pico de la variable de chequeo: ±14 días respecto a la clave.
- Detector de constantes: si el nodo nuevo falta o sus vecinos siguen con la constante PROVISIONAL, 1b línea 2 = no.
- 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).
- Se abre
dashboard_Exxx.htmly se leen las 5 variables elegidas y sus 5 números. - Se recalculan media, mediana, moda,
stddev_sampy CV desdedatos_Exxx.csvosalidas_Exxx.csv, según el origen de cada variable. - Tolerancia: 0.5 % relativo. Para valores cuya media es 0, tolerancia absoluta 0.001.
- 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
- Herramienta que no abre o da error. Ejemplo: "la página no carga el CSV".
- Archivo que falta o nombre de archivo. Ejemplo: "¿insights_E042.txt o insights_E042.md? Los dos valen".
- Qué significa una instrucción de la guía. Ejemplo: "¿qué es la insignia PROVISIONAL?"
- Problemas para comprimir o enviar el zip.
- Nota de contenido, en privado.
Preguntas que no se responden
- La ecuación de un nodo. Respuesta fija: "usa la pista de nivel 3 de tu ficha".
- Si un insight está bien. Respuesta fija: "¿tiene un ciclo o una variable, un número y una acción? Entonces entrégalo".
- Qué variables elegir. Respuesta fija: "cinco que tengan números, al menos una real".
- Revisar un empleado IA antes de la entrega. Respuesta fija: "pulsa Cargar ejemplo y compara la forma".
- 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
- Si un estudiante escribe en privado por el tema de fallecidos, responde el mismo día, en la ventana más cercana.
- Ofrece cambio de familia a una sin
fallecidosen el mismo territorio: F1, F4, F5, F6, F7, F8, F10 o F11. - Entrega la nueva carpeta
Exxx/por el canal privado. El código del estudiante no cambia. - Si prefiere seguir, recuérdale que el Pilar 2 no exige la variable fallecidos.
- 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
- Que entiendes un modelo de Dinámica de Sistemas, lo dibujas y lo haces correr con datos reales.
- Que sabes ingestar datos reales en tu DuckDB local y conectarlos a un dashboard.
- Que sabes calcular media, mediana, moda, desviación y coeficiente de variación, y leer un histograma.
- Que sabes escribir 3 hechos y 2 insights con un número cada uno, y la conclusión de cada insight.
- 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
- El examen tiene tres pilares. Cada pilar vale un tercio de la nota. La nota final es el promedio de los tres.
- La entrega es única: sábado 14 de noviembre, 7:00 pm. Se califica lo que llegue antes de esa hora, aunque esté incompleto.
- 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.
- Primero entiendes el modelo y lo dibujas completo a mano, con signos en los arcos (Pasos 0 y 2).
- Después pasas el dibujo al HTML y lo haces correr (Paso 3).
- Solo con la foto del dibujo y el HTML corriendo pasas al análisis de datos (Pasos 4 y 5).
- 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
- Descomprime tu carpeta
Exxx/. Ejemplo:E042/. - Llena el Panel de control de esta guía con tu ficha.
- Abre
Exxx-modelo.htmlen el navegador. Debe mostrar el diagrama con casillas?. - Mira el modelo: nodos (cajas, válvulas, círculos) y arcos (flechas). Cada arco tiene un signo
+o-. - Lee el signo de 3 arcos en voz alta. Ejemplo: "Infectados a infeccion es
+: más infectados, más contagios." - Abre
datos_Exxx.csvcon doble clic. Mira sus columnas:t,fechay 21 variables. - 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
python3y un espacio. Arrastraingesta_Exxx.pya 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.htmlcon doble clic, pulsa Leer CSV y eligedatos_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:
- Todos los stocks como cajas. Ejemplo:
Susceptibles,Infectados,Recuperados. - Todos los flujos como tubos con válvula. Las nubes marcan lo que queda fuera.
- Todos los convertidores como círculos, incluido el nodo que falta. Ejemplo:
fraccion_susceptible. - Todos los arcos con su signo.
+si van en la misma dirección,-si van al revés. - Cada ciclo con su nombre y su letra. Cuenta los signos
-del ciclo: par es R, impar es B. - 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(odatos_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(odatos_Exxx.csv) de tu carpeta y prueba otro navegador. El dashboard sale sin datos: abredashboard_plantilla.htmly 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:
- Prompt con especificaciones, rieles (rails) y arnés (harness).
- Hoja de vida: tareas o funciones, habilidades, competencias y limitaciones.
- 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:
- El día a día tiene 5 días (lunes a viernes). Cada día: disparador, entrada, acción, salida, quién revisa.
- Incluye 1 día de espera (sin disparo) y 1 día de incidente (dato malo, pasa a un humano).
- Un rail G nace de tu ciclo. Ejemplo: "G3 (ciclo B1): nunca recomiendo trasladar pacientes; solo aviso."
- R0 y R1 son fijos: no da consejo médico individual; nunca publica una celda con n menor que 5.
- R2 nace de tu ciclo. Ejemplo: "No proyecto más de 14 días: el ciclo B1 cambia la letalidad."
- 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
- Abre tu carpeta
Exxx/. Revisa la lista de nombres fijos de la sección Entrega. Marca cada archivo. - Arregla solo lo que falte y sea rápido. Ejemplo: un archivo con nombre mal escrito.
- Revisa que ningún archivo tenga una llave de API. Ejemplo de llave: empieza con
sk-anto conAIza. - Comprime la carpeta. Windows: clic derecho, Enviar a, Carpeta comprimida. Mac: clic derecho, Comprimir.
- Cambia el nombre del zip a
EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip. - 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.csvydatos_Exxx.csv. El profesor ya los tiene; tu evidencia essql_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
- Crea una carpeta con tu código. Ejemplo:
E042. - Pon dentro los archivos con nombre fijo de las tablas de abajo.
- Clic derecho sobre la carpeta. Windows: Enviar a, Carpeta comprimida. Mac: Comprimir.
- Nombra el zip
EXAMEN FINAL - Exxx - NOMBRE COMPLETO.zip. Ejemplo:EXAMEN FINAL - E042 - NOMBRE COMPLETO.zip. - 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í
- Pedir que te explique un concepto. Ejemplo: "¿Qué es un ciclo de balance?"
- Pedir que corrija un error de SQL. Ejemplo: "Esta consulta da error en DuckDB, ¿por qué?"
- Pedir que revise tu redacción.
- Probar tu prompt con rails con 3 filas reales de
mi_territorio_Exxx.csv. - Anotar cada uso útil en la bitácora.
Qué no
- Pegar una llave de API en ningún archivo. Una llave en el zip baja 10 % la nota del Pilar 3.
- Entregar texto que no puedes explicar en voz alta.
- Copiar archivos de otra persona. Tu vista, tu nodo, tu ciclo y tu número hacen único tu trabajo.
- Pedir al modelo que lea
gt2j-8ykrfila a fila. Solo se usa la vista agregada. - 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)
- 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, escribepython3y 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, escribecmd, Enter; escribepyy un espacio, arrastra el archivo y pulsa Enter. El script instala DuckDB si falta, descarga covid_diario.csv, crea la baseexamen_E003.duckdb, comprueba 252,677 filas y 6,388,216 casos, crea tu vista con 731 dias, exportami_territorio_E003.csv, dejadashboard_E003.htmlconectado a esos datos, escribe la evidenciasql_E003.txty abre el tablero en tu navegador. Si prefieres escribir el SQL tu,duckdb_E003.sqltrae el mismo camino en bloques (DuckDB local o shell.duckdb.org). Si nada funciona,datos_E003.csvya viene en la carpeta con los mismos 731 dias y 21 columnas (pierdes solo el paso de ingesta). - Abre
mi_territorio_E003.csven el navegador o en una hoja de calculo para mirarlo. No lo edites ni lo guardes desde Excel (cambia los decimales). - Abre
E003-modelo.htmlen el navegador. Boton Cargar datos (CSV): eligemi_territorio_E003.csv(odatos_E003.csv, es igual). La pagina toma las columnas que necesita (casos_7d, importados) para los nodos de datos d_casos_7d, d_importados. - Boton Correr. Revisa los chequeos (PASA o FALLA) y la grafica.
- Boton Exportar salidas CSV: produce
salidas_E003.csven formato largo (t, variable, valor, origen). Boton Descargar este HTML: producemodelo_E003.htmlcon 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.
- El nombre de tu fuente. Ejemplo:
datos_E017.csv. - El nombre exacto de tu nodo. Ejemplo:
ocupacion. - Tu ciclo con letra. Ejemplo:
B1. - Un número de tu dashboard como umbral. Ejemplo:
0.85 = media 0.62 + 1 desviación 0.23. - 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
- Normal: una fila real donde el empleado debe hacer su trabajo normal.
- Borde: el valor justo en el umbral, o el primer día, o un día sin datos nuevos.
- 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
- Es un catálogo de 314 riesgos de la IA, ordenados en 4 niveles.
- Nivel 1 tiene 4 grupos grandes. Nivel 2 tiene 16 categorías.
- 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.
- También leyó 16 políticas de uso de 9 empresas que hacen modelos.
- 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)
- Riesgos de seguridad (Security Risks)
- Usos operativos indebidos (Operational Misuses)
B. Riesgos de seguridad del contenido (5)
- Violencia y extremismo (Violence & Extremism)
- Odio y toxicidad (Hate/Toxicity)
- Contenido sexual (Sexual Content)
- Daño a menores (Child Harm)
- Autolesión (Self-harm)
C. Riesgos sociales (5)
- Uso político (Political Usage)
- Daño económico (Economic Harm)
- Engaño (Deception)
- Manipulación (Manipulation)
- Difamación (Defamation)
D. Riesgos legales y de derechos (4)
- Derechos fundamentales (Fundamental Rights)
- Discriminación y sesgo (Discrimination/Bias)
- Privacidad (Privacy)
- 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"
- Riesgo 1: elige uno del grupo A. Ejemplo: Toma de decisiones automatizada.
- Riesgo 2: elige uno del grupo C o del grupo D. Ejemplo: Violaciones no autorizadas de privacidad.
- Riesgo 3: elige el que más te preocupe, de cualquier grupo. Ejemplo: Desinformación y estadísticas inventadas.
- "No aplica": elige una categoría de nivel 2 que NO toca a tu empleado. Di por qué en una frase.
- Para cada riesgo escribe la cadena completa: L1 → L2 → L3.
- Para cada riesgo escribe severidad B, M o A y una razón.
- 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:
- Máximo 5 entradas. Si usaste la IA más veces, anota las 5 más útiles.
- Cada entrada es una fila. Frases cortas.
- No pegues el prompt completo. Resúmelo en una línea.
- Siempre di qué se equivocó el modelo. Si no se equivocó, escribe "nada visible".
- 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.
- Abre tu
dashboard_Exxx.html, que creóingesta_Exxx.pycon los datos de tu base ya adentro. Si no corriste el script, abredashboard_plantilla.html. - Con la plantilla, carga tu
mi_territorio_Exxx.csvodatos_Exxx.csv(ancho: una columna por variable del territorio). Si quieres comparar, carga también tusalidas_Exxx.csvdel modelo (largo: t, variable, valor, origen). - 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.
- Escribe al lado tus propios números (de DuckDB o de tu calculadora). La página marca "coincide" o "revisa".
- 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:
- Lee la línea "En una frase" de cada capítulo. Son tres frases.
- Busca la receta numerada del capítulo que necesitas. Síguela en orden.
- 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.
- Stocks primero. Una caja por cada cosa que se acumula, con su nombre. Ejemplo: Susceptibles, Infectados, Recuperados.
- Flujos. Un tubo con válvula entre cajas, o desde una nube, o hacia una nube. Ejemplo: infeccion, recuperacion.
- Convertidores. Un círculo por cada cálculo o parámetro, incluido el que falta. Ejemplo: fraccion_susceptible, duracion_infeccion.
- Arcos con signo. Una flecha delgada desde cada número que una fórmula usa, con su
+o su-. Ejemplo: Infectados →(+) infeccion. - Marca los ciclos. Recorre cada ciclo, cuenta los signos
-y escribe R o B con su número. Ejemplo: R1, B1. - 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
- Stock: unidades. Ejemplo: personas.
- Flujo: unidades por día. Ejemplo: personas por día.
- Flujo = stock / tiempo. Ejemplo: recuperacion = Infectados / duracion_infeccion. Personas / días = personas por día.
- 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
- Recorre el ciclo arco por arco hasta volver al nodo de partida.
- Cuenta cuántos arcos llevan signo
-. Los flujos que salen de un stock cuentan como-; los que entran, como+. - 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.
- Pregunta y horizonte. ¿Qué quiero entender y en cuántos días? Ejemplo: "¿Por qué el boletín deja de crecer? 365 días".
- Stocks. ¿Qué se acumula? Ejemplo: Suscriptores (personas).
- Flujos. ¿Qué entra y qué sale de cada stock? Ejemplo: altas y bajas (personas por día).
- Datos. ¿Qué columna alimenta a qué convertidor? Ejemplo: la columna
envios_diaalimenta ad_envios. - Ciclos. Escribe una frase R o B por ciclo. Ejemplo: "Cuando Suscriptores sube, recomendaciones sube, y eso hace que Suscriptores suba más: R".
- Supuestos. Un número por parámetro, con su unidad. Ejemplo: tasa_de_baja = 0,005 por día.
- 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.
- Pregunta: ¿por qué el boletín se estanca cerca de 10.000 suscriptores? Horizonte: 365 días.
- Stock: Suscriptores (personas). Valor inicial: 2.000.
- Flujo de entrada: altas (personas por día). Flujo de salida: bajas (personas por día).
- Datos: la tabla
v_boletintraeenvios_dia. Alimenta al convertidord_envios. - altas = recomendaciones + altas_por_envio. recomendaciones = Suscriptores × tasa_recomendacion.
Líneas 6 a 10: los ciclos y el chequeo.
- bajas = Suscriptores × tasa_de_baja. altas_por_envio = d_envios × altas_por_correo.
- Ciclo R: "Cuando Suscriptores sube, recomendaciones sube, y eso hace que Suscriptores suba más: R". Cero signos menos.
- Ciclo B: "Cuando Suscriptores sube, bajas sube, y eso frena a Suscriptores: B". Un signo menos: bajas ⇒ Suscriptores.
- 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.
- 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.
- Alguien construye la tabla diaria de tu territorio con SQL. En el examen la construye
ingesta_Exxx.pyen tu DuckDB local (vistav_territorio_X) y la exporta comomi_territorio_Exxx.csv;datos_Exxx.csves la misma tabla, de respaldo. - 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 convertidoresd_, sin el prefijo. Ejemplo:casos_7dalimentad_casos_7d. - 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, noCasos 7 días. - Punto decimal, coma como separador. Ejemplo:
12.5, no12,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_contactode 6 a 8. El pico llega antes y es más alto. Bajaduracion_infeccionde 10 a 7. El pico baja. - Ejemplo de comunicación: sube
tasa_recomendacionde 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
- 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.
- 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.
- Ciclo R llamado B, o al revés. Corrección: cuenta los signos
-. Par: R. Impar: B. - 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-. - Parámetros sin unidad. Síntoma: "0,3". Corrección: "0,3 por día" o "0,3 sin unidad (fracción)".
- 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
ten 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.pylo instala por sí solo si falta y hace la ingesta por ti: en Windows, doble clic; en Mac, abre Terminal, escribepython3y un espacio, arrastra el archivo y pulsa Enter. Si prefieres escribir SQL tú mismo (opcional), usa los bloques deduckdb_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:
departamentoes TEXT, no número. - Ejemplo de comunicación: un CSV de publicaciones exportado de la plataforma. Lo lees con
read_csvigual 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.
- 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.
- Los dominios van en mayúscula única. Un valor con dos escrituras es dos categorías falsas. Ejemplo COVID:
fyFson el mismo sexo;UPPER(sexo)los une. Ejemplo de comunicación:instagrameInstagramen una columna de canal. - 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:
edadcon 0 % vacíos, OK;fecha_recuperadocon 12 %, revisar. - Consistencia: cada regla cuenta las filas que la violan. Ejemplo: "sexo en {F, M}" viola 12 filas.
TDQM en 4 líneas:
- Definir: ¿qué significa "dato bueno" aquí? Ejemplo: "cada día del horizonte existe".
- Medir: cuenta violaciones con SQL. Ejemplo: días faltantes = 731 menos los días presentes.
- Analizar: ¿por qué falla? Ejemplo: el fin de semana nadie reporta.
- 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
importadoses 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_7des 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:
- 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.
- 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_7dcon media 738,8 y mediana 529,0: las olas hacen la cola. - Una barra enorme en 0 y poco más. La moda es 0. La variable casi nunca pasa. Ejemplo COVID:
importadosdespués de abril de 2020. - Dos montañas. Hay dos regímenes. Ejemplo COVID:
Recuperadosdel 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:
- 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".
- 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".
- 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:
- Una tarjeta por variable, 5 o más. Cada una con media, mediana, moda, desviación y CV, su unidad y su histograma.
- Una lectura DATO y una lectura JUICIO debajo de cada tarjeta.
- Tres hechos: información con número. Ejemplo: "El pico real fue 6.137 casos por día, el día 674".
- 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
- Elige una variable. Mira su pico, su mediana o su moda.
- 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)".
- 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
- Elige un ciclo de tu modelo. Ejemplo: B de percepción de riesgo (F3).
- Toma las dos variables que lo forman. Ejemplo: casos reales y Percepcion simulada.
- Mira cuántos días pasan entre el pico de una y el pico de la otra. Ejemplo: 21 días.
- 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
- Elige una variable. Ejemplo: casos diarios.
- Parte la serie en tramos, por ejemplo por olas o por trimestres.
- Mira la desviación o el histograma de cada tramo.
- 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
- Calcular estadísticas sobre la tabla cruda. Síntoma: Barranquilla cuenta dos veces. Corrección: siempre sobre la tabla limpia.
- 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.
- Serie con huecos. Síntoma: la tabla tiene 712 filas, no 731. Corrección: calendario con
generate_seriesyCOALESCE(x, 0). - 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".
- 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.
- 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_sampy 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.
- Identidad: quién es, a quién sirve, en qué tono.
- Misión: el insight de origen, con su número y su ciclo R o B.
- Entradas: la vista o el CSV, el nodo que lo dispara, el umbral y de dónde salió.
- Pasos: máximo 5, en orden.
- Salidas: formato exacto, longitud, idioma, qué siempre incluye y qué nunca.
- Rails G1 a G3 (o más). Uno nace del ciclo. Ejemplo: "G3 (ciclo B1): nunca recomiendo trasladar pacientes; solo aviso".
- Rechazos R0 y R1 fijos: nunca consejo médico individual; nunca una celda con n menor que 5. R2 nace del ciclo.
- Entrega a humano: cuándo, a quién, con qué, en qué plazo.
- 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.
- 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.
- Políticas: una por riesgo, con tres renglones: hacer, no hacer, recordar.
- Procesos con flujo: 3 o más, cada uno con pasos y preguntas sí/no. La plantilla dibuja el diagrama de flujo.
- 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.
- 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.
- Arquetipo. Elige uno de los cuatro. Ejemplo: Vigía.
- 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". - Prompt con rails. Llena la sección 3 de la plantilla. Las anclas deben aparecer dentro del texto.
- Harness. Llena la sección 4. Escribe las 3 pruebas antes de pensar que terminaste.
- Hoja de vida. Cinco días de lunes a viernes. Uno de espera, uno de incidente. Dos KPIs con número.
- 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
- AIR 2024 es un catálogo de 314 riesgos de la IA, en 4 niveles.
- Lo escribieron Zeng, Klyman, Zhou y otros en junio de 2024 (arXiv:2406.17864).
- Nace de 8 políticas de gobierno y 16 políticas de 9 empresas de IA.
- Nivel 1: A. sistema y operativos, B. seguridad del contenido, C. sociales, D. legales y de derechos.
- Nivel 2 tiene 16 categorías. Ejemplo: Privacidad, Engaño, Usos operativos indebidos.
- Nivel 3 baja al detalle. Ejemplo: Toma de decisiones automatizada.
- El catálogo no dice qué tan grave es un riesgo. Eso lo decides tú con BAJO, MEDIO o ALTO.
- Tu tarjeta
tarjeta_AIR2024.mdtiene 18 riesgos de nivel 3 elegidos para empleados de datos. - Eliges 3 o más riesgos. Cada riesgo lleva nivel, qué puede salir mal, cómo lo evitamos y su política.
- "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.
- 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?
- Las cinco anclas. Fuente, variable, mecanismo, umbral, regla de rechazo. Cambia
datos_E017.csvpor tu tabla de ventas o de audiencias. - Las tres pruebas del harness. Nunca enciendas un prompt que no probaste. Una normal, una de borde, una de rechazo.
- El día a día. Un día de espera y un día de incidente. Así piensas en lo que falla.
- La cadena de riesgo. L1 → L2 → L3, nivel, cómo lo evitamos con un rail, política con hacer, no hacer, recordar.
- Los procesos con flujo. Si no puedes dibujar el flujo, no entiendes el proceso.
- El protocolo de contención. Antes de encender algo, escribe quién lo para y los 7 pasos.
- 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
- Cambia el dato: cualquier tabla con una fecha y un conteo sirve. Haz la vista densa (un día, una fila).
- 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.
- Calcula media, mediana y desviación de 3 variables. Escribe cada lectura como DATO o JUICIO.
- Diseña un empleado IA con las 5 anclas y pruébalo en vivo con 3 filas reales.
- 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.
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:
- Botón Agregar convertidor. Nombre:
fraccion_susceptible. Unidad: 1 (fracción). - Entradas:
Susceptiblesypoblacion. La página dibuja los dos arcos. - Fórmula:
MAX(0, Susceptibles / poblacion). - Abre
infeccion: su fórmula dice... * (1)con la insignia PROVISIONAL. Reemplaza(1)porfraccion_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:
- Exportar salidas CSV escribe
salidas_E003.csven formato largo (t, variable, valor, origen):
salidas_E003.csv: 8041 filas | reales ['d_casos_7d', 'd_importados'] | simuladas 9 variables, dias 731
- Descargar este HTML guarda
modelo_E003.htmlcon 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
- Las personas pasan de Susceptibles a Infectados y luego a Recuperados.
- Más Infectados producen más contagios: ciclo R1, cero signos menos.
- Menos Susceptibles bajan la fraccion_susceptible y frenan el contagio: ciclo B1, un signo menos.
- Los casos importados llegan desde fuera, desde el dato d_importados.
- 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
- El pico real de casos_7d fue 6,137 casos por día, el día 674 (2022-01-09).
- El Valle del Cauca sumó 540,163 casos en los 731 días de la ventana del examen.
- 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, columnast,d_casos_7d,d_importados). - Tabla de salidas:
salidas_modelo, variablebrecha_dato_modelo(origen simulado) yd_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_7denestadisticas_E003.csv.
Pasos de razonamiento
- Lee los últimos 7 días de
brecha_dato_modelo. - Cuenta cuántos días su valor absoluto supera 862.4.
- Si son 7 de 7, hay alerta. Si son menos, no hay alerta.
- Si hay alerta, di el signo: positivo (el modelo exagera) o negativo (el modelo se queda corto).
- 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_modeloo enestadisticas_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_susceptibledel 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, columnad_casos_7dde 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_7denestadisticas_E003.csv) para llamar "semana alta" a una semana.
Pasos de razonamiento
- Lee
fraccion_susceptibledel último día yd_casos_7dde los últimos 7 días. - Si
fraccion_susceptiblees 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". - Si el promedio de la semana supera 1,601.2, la semana es "alta"; si no, "normal".
- Escribe la nota con la fase, la semana y los dos números.
- 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_modeloyestadisticas_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.
- El problema se mide en oyentes semanales, en un horizonte de 26 semanas, y la pregunta es cuándo llega el pico de crecimiento.
- 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.
- 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.
- 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.
- 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.htmlyempleado_ia2_E003.html -
bitacora_ia.md(4 entradas) -
transferencia.md(5 frases) - Ningún archivo contiene una llave que empiece por
sk-antoAIza
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)
- 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.
- 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. - 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
- Hosting of
covid_diario.csvanddashboard_plantilla.html: the ingest script downloads both fromhttps://class.audience-analysis.com/analitica-examen/; the plan B fallback in shell.duckdb.org also needs CORS (Access-Control-Allow-Origin: *). Runpython ingesta_E003.pyon a clean copy of the E003 folder the night before (expect 252,677 / 6,388,216 and 731 días). - Reception mailbox: attachment limit (25 MB) and several emails per student; a shared folder as fallback.
- Whether
datos_Exxx.csvmay be left out of the zip when it exceeds the mail limit (default: yes, the professor already has it). - Which browsers are announced as confirmed after testing the three HTML pages (model, dashboard, AI employee) in Chrome, Edge and Safari.
- Risk: students without a working Python: plan B SQL blocks (
duckdb_Exxx.sql), plan Cdatos_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)
- 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. - One contract is the single source of truth: the territory view (731 rows,
t0..730 first column, fixed ASCII column names) feeds the CSV for Stella, the key models' embedded data,salidas_modeloand the auto-grader. ACCEPTED. - 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 |