Metodología de construcción del Ecosistema de Datos

Documento técnico que describe cómo se transforman las respuestas del instrumento del taller en el mapa 3D del ecosistema de datos institucionales.

Nota: el ecosistema 3D es una herramienta de visualización adaptada al taller «Gestión de datos institucionales», diseñado por el contratista profesional Francisco Millan del Departamento Administrativo de Desarrollo e Innovación.

1. Propósito y enfoque

El ecosistema 3D es una visualización viva del inventario de datos que los participantes del taller construyen al diligenciar el instrumento. Su objetivo es hacer tangible, en una sola vista, qué datos existen, quién los produce, quién los necesita y dónde están las oportunidades de cruce e integración.

Se adopta la metáfora de un sistema solar: la Capa Gold (el dato integrado y gobernado al que se aspira) ocupa el centro; los organismos orbitan como planetas con sus suborganismos (lunas), equipos (estaciones) y conjuntos de datos (satélites); las fuentes externas requeridas orbitan en el anillo más alejado. La metáfora no es decorativa: la distancia orbital codifica la jerarquía institucional y la cercanía al objetivo de integración.

Principio rector: el instrumento del taller es la única fuente de verdad. Cada nodo y cada arista del mapa se deriva de un campo concreto del formulario — nada se inventa en la visualización. Si un dato no aparece en el ecosistema, es porque no fue reportado en el instrumento.

La herramienta fue desarrollada como complemento analítico del taller diseñado por el contratista profesional Francisco Millan (Departamento Administrativo de Desarrollo e Innovación): la estructura del instrumento —sus tres fichas y sus campos— define por completo el modelo del grafo.

Dos decisiones de diseño garantizan la reproducibilidad del producto: (i) la construcción del grafo es una función pura del estado de la base de datos —los mismos registros producen siempre el mismo grafo— y (ii) todos los layouts son deterministas, sin inicializaciones aleatorias ni física de fuerzas, de modo que dos cargas del mismo estado producen mapas idénticos y comparables entre sesiones y entre productos (3D, SVG, GEXF).

2. Fuente de verdad: modelo relacional del instrumento

El grafo se construye por consulta directa al modelo relacional donde el wizard persiste cada respuesta. Las entidades que alimentan el grafo son:

TablaFichaCampos que usa el grafo
InscripcionIdentificación organismo (FK), suborganismo (FK), equipo_responsable, nombre_completo, correo. Una inscripción = un diligenciamiento del instrumento.
FuenteDatosF1 nombre, descripcion, decisiones_apoya, rol (Productor / Usuario / Ambos). N por inscripción.
VariableFuenteF1 nombre, es_identificador. Hasta 10 por fuente; constituyen el diccionario de variables que habilita el matching.
FuenteOrigenF1 nombre, organismo_productor. Orígenes externos declarados cuando el rol es Usuario o Ambos.
RetoAnalisisF2 nombre, analisis_propuesto. Uno por inscripción.
FuenteRequeridaF2 nombre, organismo. Hasta 3 por reto: fuentes que el equipo necesita y no tiene.
EvaluacionSeguridadF3 confidencialidad, integridad, disponibilidad (semáforo por dimensión) → criticidad calculada. Una por fuente.
Catálogo de referencia— Bases institucionales precargadas (catalogo_data): nombre, organismo, frecuencia, cobertura y lista de campos con marca cruzar que indica interoperabilidad conocida.
Trazabilidad: cada nodo del grafo referencia la llave primaria del registro que lo originó (org-<pk>, fte-<pk>, reto-<pk>…), lo que permite auditar cualquier elemento visual contra el instrumento.

3. Construcción del grafo: nodos

La función _construir_grafo_ecosistema() recorre el modelo relacional y emite ocho tipos de nodo. Cada tipo codifica atributos del instrumento que luego se exportan al GEXF y alimentan tooltips y panel de detalle:

NodoFicha / pasoCampo del instrumento que lo genera
Capa Gold — Nodo conceptual único: representa el objetivo del ejercicio (datos integrados, depurados y gobernados). No proviene de un campo; es el centro de referencia del mapa.
Base catálogo — Bases de datos institucionales del catálogo de referencia (capa de datos administrativos ya gobernados que sirven de insumo para los cruces).
Organismo Identificación Campo «Organismo» del paso de identificación. Su tamaño crece con el número de fuentes que reporta (num_fuentes).
Suborganismo Identificación Campo «Suborganismo / dependencia». Orbita su organismo como luna.
Equipo Identificación Campo «Equipo responsable». Cada inscripción genera un equipo; orbita su suborganismo o, si no hay, directamente el organismo.
Conjunto reportado F1 · fuente-general Cada registro del paso «F1 · La fuente de datos» (nombre + descripción). Su tamaño crece levemente con el número de variables caracterizadas. Lleva un anillo de criticidad con el semáforo calculado en «F3 · Valoración de los activos»: rojo = crítico, amarillo = decidir según escenarios, verde = información pública.
Reto de análisis F2 · reto-definición El reto de análisis formulado en la ficha F2. Orbita el equipo que lo propuso, en un anillo exterior al de sus conjuntos.
Fuente de información F1 · fuente-rol F2 · reto-fuentes Fuentes externas citadas pero no caracterizadas: los «orígenes» declarados en F1 (rol Usuario/Ambos) y las «fuentes requeridas» de F2. Orbitan el anillo exterior.

Deduplicación de equipos

Varias inscripciones pueden declarar el mismo equipo. Los nodos equipo se deduplican por la clave (nombre_normalizado, organismo): si dos inscripciones del mismo organismo escriben el mismo nombre de equipo (tras normalización), se fusionan en un solo nodo que acumula responsables, correos y fuentes de todas ellas. Esto evita duplicar actores institucionales por diferencias de digitación.

Tamaño de los nodos

El radio de cada nodo codifica magnitud según su tipo (función _tamano_nodo(), idéntica en el render 3D, el SVG y el GEXF):

TipoFórmula del radio
Capa Gold12 (fijo, el objeto mayor)
Base catálogo5 + min(8, num_campos / 30)
Organismo5 + min(8, num_fuentes × 1.5)
Suborganismo3.5 (fijo)
Equipo2.5 (fijo)
Conjunto2 + min(1, num_variables / 6)
Reto de análisis3 (fijo)
Fuente de información4 (fijo)

La saturación (min) evita que un organismo con muchas fuentes eclipse la escala: el tamaño es ordinal, no proporcional.

4. Construcción del grafo: aristas

Las conexiones se derivan de reglas explícitas sobre campos del instrumento. El grafo se exporta como no dirigido (defaultedgetype="undirected"), pero cada arista conserva su dirección semántica origen→destino y un peso (peso) que modula su grosor en Gephi:

AristaPesoRegla de construcción
Pertenencia 1 Equipo → cada conjunto que reportó, y organismo → equipo cuando el equipo no declaró suborganismo. Refleja la custodia operativa declarada en la identificación + F1.
Jerarquía 1 Organismo → suborganismo y suborganismo → equipo. La cadena institucional del paso de identificación.
Origen declarado 1 Conjunto → fuente externa, cuando en «F1 · Rol» el equipo declara que su fuente proviene de ese origen (rol Usuario o Ambos) y el nombre no resuelve a catálogo ni a otro conjunto.
Requerida externa 1 Reto → fuente externa, cuando en «F2 · Fuentes requeridas» se cita una fuente necesaria que no resuelve a catálogo ni a conjunto existente.
Match exacto 3 FuenteOrigen/FuenteRequerida → base de catálogo o conjunto, cuando el nombre normalizado coincide exactamente, o el match por subcadena se confirma con el organismo productor (ver §5).
Match aproximado 1 Igual que el anterior pero solo por subcadena de nombre, sin confirmación de organismo — evidencia más débil.
Variables compartidas n Conjunto ↔ conjunto cuando sus diccionarios de variables normalizados comparten ≥ 2 nombres. El peso es el número de variables comunes y la lista viaja como atributo de la arista.
Matching por variables 1 Conjunto → base de catálogo cuando al menos una variable normalizada del conjunto coincide (exacta o por subcadena ≥ 4 caracteres) con un campo del catálogo.
Cruce entre bases 1 Base ↔ base del catálogo para cada par que comparte un campo marcado cruzar en el catálogo de referencia — incluye los cruces con la capa Gold.
Lectura práctica: un conjunto «huérfano» (sin aristas de matching ni variables compartidas) indica una fuente caracterizada sin diccionario de variables o sin campos interoperables — una brecha concreta de gobierno del dato.

5. Normalización y algoritmos de matching

Todo el matching textual usa dos normalizaciones deterministas:

norm(s) = minúsculas · sin tildes (NFD, sin marcas Mn) · strip
norm_var(s) = norm(s) − prefijos {var_, cod_, num_, id_, nom_, desc_, codigo_, nombre_} − {_ , espacio, -}

norm se aplica a nombres de fuentes, organismos y equipos; norm_var a nombres de variable, eliminando además los prefijos convencionales de diccionario para que cod_dane y dane sean equivalentes.

Resolución de referencias (FuenteOrigen / FuenteRequerida)

Cada fuente citada se resuelve en cascada, en este orden:

  1. Match exacto con catálogo: el nombre normalizado es clave del índice de bases → arista match_exacto (peso 3).
  2. Subcadena con catálogo: un nombre contiene al otro, con mínimo 4 caracteres normalizados en ambos lados (descarta siglas y vacíos). Si hay varios candidatos se elige el de mayor proporción de solape (min/max de longitudes). Si además el organismo declarado coincide por subcadena con el organismo de la base, se promueve a match_exacto; si no, queda match_aproximado (peso 1).
  3. Mismo procedimiento contra los conjuntos ya caracterizados por otros equipos — detecta cuando un equipo «requiere» un dato que otro equipo ya tiene.
  4. Sin resolución: se crea (o reutiliza, por nombre normalizado) un nodo fuente de información externa y se emite origen_externo / requerida_externa.

Matching de variables

Para cada conjunto se construye el conjunto de variables normalizadas y se compara contra el índice de campos del catálogo: coincidencia exacta, o subcadena en cualquier dirección con mínimo 4 caracteres (umbral que descarta siglas ruidosas). Cada base alcanzada genera una arista matching_variable. Entre conjuntos, la arista variables_compartidas exige intersección ≥ 2 para no reportar coincidencias anecdóticas.

6. Semáforo de criticidad (F3)

La ficha F3 clasifica cada fuente en tres dimensiones —confidencialidad, integridad y disponibilidad— con el semáforo del instrumento (verde / amarillo / rojo). La criticidad del conjunto es el peor valor de las tres dimensiones:

criticidad = rojo  si alguna dimensión es roja
              amarillo si alguna es amarilla
              verde  si las tres son verdes

Se calcula en EvaluacionSeguridad.save() al guardar la ficha y se visualiza como un anillo alrededor del nodo conjunto en el 3D (rojo #e53e3e / amarillo #f6ad55 / verde #38a169), independiente del color de relleno del nodo. Una fuente sin F3 diligenciada no lleva anillo.

7. Layout 3D: sistema solar jerárquico

El layout es determinista y jerárquico (no usa física ni force-directed), para que el mapa sea estable entre recargas y comparable entre equipos. Se calcula de adentro hacia afuera, propagando la huella de cada sub-sistema:

  1. Centro: Capa Gold en el origen (0,0,0), con una luz puntual dorada que la convierte en el «Sol» de la escena.
  2. Anillo 1 — Catálogo: bases de referencia en el plano y=0, con radio max(60, radioOrbita(12, 13, n, 8)) que libra el Sol y separa las bases entre sí.
  3. Anillos 2-4 — Organismos: los organismos se clasifican en tres anillos concéntricos según el tamaño de su sub-sistema completo (pocos / intermedios / muchos suborganismos). Los sistemas más grandes orbitan más lejos para no traslaparse. Cada anillo ocupa una terraza de altura distinta (y = 0, +22, +44), lo que separa visualmente los tres grupos.
  4. Sub-órbitas: suborganismos orbitan su organismo (radioOrbita(radio_org, huella_sub, n, 10)); equipos orbitan su suborganismo —o el organismo si no hay— (radioOrbita(3.5, huella_eq, n, 8)); conjuntos orbitan su equipo (radioOrbita(2.5, 3, n, 4)); retos orbitan en un anillo exterior al de los conjuntos del mismo equipo (max(anillo_conjuntos + 7, radioOrbita(2.5, 3, n, 4))).
  5. Niveles de altura por componente: dentro de cada sistema, los conjuntos orbitan ligeramente por debajo del plano de su equipo (−3) y los retos por encima (+8), de modo que datos y preguntas analíticas se distinguen por elevación.
  6. Anillo exterior: fuentes de información externas a y = −15, bajo el plano institucional. Su ángulo no es uniforme: cada fuente se ubica en el ángulo promedio de los conjuntos/retos que la referencian (atan2 de la media de posiciones), con un desplazamiento de 0.12 rad por cada fuente previa en el mismo ángulo (±0.15 rad) para evitar solapes. Lo «externo» queda literalmente fuera del disco institucional y angularmente cerca de quien lo necesita.

Radio de cada órbita

Cada radio se calcula de abajo hacia arriba con la huella (footprint) completa de cada hijo — su esfera más todo su sub-sistema — para garantizar que nada se traslape:

radio_orbita = radio_padre + huella_hijo + separación
si n ≥ 2 hermanos: radio ≥ (huella_hijo + separación) / sin(π / n)

La segunda condición asegura que la circunferencia quepa para todos los hermanos sin que sus huellas se toquen. Las órbitas se dibujan como nubes de partículas (500 puntos por anillo, coloreadas por nivel) en lugar de líneas, y la cámara, la niebla, la malla de referencia y el fondo estelar se reescalan automáticamente a la extensión real resultante (radioExt + 80).

8. Layout 2D: anillos concéntricos (SVG y GEXF)

Para los productos estáticos se usa _layout_anillos(), una proyección 2D de la misma metáfora: cada tipo de nodo ocupa un anillo concéntrico y los hijos se ordenan angularmente cerca del ángulo de su padre:

Anillo (radio base)Contenido
0Capa Gold
300Bases de catálogo
640Organismos
980Suborganismos (ordenados por ángulo del organismo)
1320Equipos (ordenados por ángulo del suborganismo u organismo)
1660Conjuntos y retos (ordenados por ángulo del equipo)
2000Fuentes de información externas

Si un anillo no cabe, su radio crece automáticamente para garantizar un arco mínimo de ~26 px por nodo: radio_efectivo = max(radio_base, n × 26 / 2π). El resultado es un dendrograma radial: la distancia al centro codifica la capa semántica y el ángulo agrupa las familias institucionales.

En el SVG cada nodo lleva una etiqueta radial rotada siguiendo el anillo (invertida 180° en la mitad izquierda para leerse hacia afuera), guías punteadas que hacen visible la estructura de anillos, tooltips nativos (<title>) y leyenda. Las mismas coordenadas se embeben en el GEXF como viz:position, de modo que Gephi abre el grafo con exactamente este layout.

9. Productos del grafo: cómo se componen

Todos los productos se derivan de una única construcción del grafo (_construir_grafo_ecosistema()): mismos nodos, mismas aristas, mismos colores y tamaños por tipo, y el mismo filtro solo_relacionados. Lo que cambia entre productos es el formato de salida y el layout:

ProductoFormatoComposición
Ecosistema 3D
/ecosistema/
Interactivo (Three.js) Consume /api/ecosistema/ cada 30 segundos (los registros nuevos aparecen sin recargar). Layout orbital jerárquico determinista descrito en la sección 7: cada nodo es una esfera 3D que orbita su padre, con anillos de criticidad en los conjuntos, etiquetas flotantes, filtros por tipo de nodo/arista, búsqueda y modo 2D.
Mapa de grafos
/ecosistema/gexf/
GEXF 1.3 (Gephi / Gephi Lite) El grafo serializado con atributos por nodo (tipo, descripción, métricas) y por arista (tipo, peso), colores y tamaños en el namespace viz:. Cada nodo lleva viz:position con el layout concéntrico calculado en el servidor: Gephi abre el grafo ya dispuesto, idéntico al SVG.
Mapa renderizado
/ecosistema/svg/
Imagen SVG (imprimible a PDF) Render server-side con anillos concéntricos por tipo de nodo (Gold al centro → catálogo → organismos → suborganismos → equipos → conjuntos/retos → fuentes externas), hijos agrupados cerca del ángulo del padre, guías de anillos, etiquetas radiales en todos los nodos, tooltips (<title>) y leyenda. Usa exactamente las mismas posiciones que el GEXF.
Exports tabulares
/dashboard/exportar*/
CSV y Excel (.xlsx) No son grafos: una fila por fuente caracterizada con todas las respuestas del instrumento (F1 + F2 + F3), para análisis tabular complementario.
Filtro «solo relacionados»: disponible en los tres productos del grafo (toggle en el 3D, parámetro ?solo_relacionados=true en GEXF y SVG). Elimina organismos, suborganismos, equipos y conjuntos sin ninguna arista de relación, para concentrar la lectura en la parte del ecosistema que ya interactúa.

10. Limitaciones y calidad del dato

  • Dependencia del diccionario de variables: las aristas de matching y variables compartidas solo existen si los equipos diligencian variables en F1. Una fuente sin variables es invisible para el análisis de interoperabilidad — el grafo la muestra, pero aislada.
  • Matching textual, no semántico: la resolución de referencias es por normalización y subcadena; no hay desambiguación semántica ni distancia de edición. «Registro civil» y «Registraduría» no se relacionan aunque se refieran a lo mismo, y una subcadena afortunada puede generar un match aproximado espurio (mitigado por el umbral de 4 caracteres y la confirmación por organismo).
  • Estados parciales legítimos: una inscripción con F2 pero sin F1 aparece como equipo con reto y sin conjuntos; una fuente sin F3 no lleva anillo de criticidad. Son estados del instrumento, no errores del grafo.
  • Geometría ≠ afinidad: la posición angular dentro de cada órbita es uniforme (o por ángulo del padre); no codifica afinidad semántica. La lectura de cercanía la aportan las aristas, no la distancia euclidiana entre nodos.
  • Ecosistema declarado: el mapa muestra lo que los equipos reportaron. La veracidad, completitud y actualidad dependen del diligenciamiento del instrumento; la herramienta no verifica las fuentes contra sistemas reales.
  • Escala: con muchas fuentes por equipo el anillo de conjuntos crece (la fórmula de órbita lo garantiza sin solapes), pero la lectura fina requiere zoom — el SVG y Gephi son los productos recomendados para inspección detallada.