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.
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:
| Tabla | Ficha | Campos que usa el grafo |
|---|---|---|
Inscripcion | Identificación | organismo (FK), suborganismo (FK),
equipo_responsable, nombre_completo, correo.
Una inscripción = un diligenciamiento del instrumento. |
FuenteDatos | F1 | nombre, descripcion, decisiones_apoya,
rol (Productor / Usuario / Ambos). N por inscripción. |
VariableFuente | F1 | nombre, es_identificador. Hasta 10 por fuente;
constituyen el diccionario de variables que habilita el matching. |
FuenteOrigen | F1 | nombre, organismo_productor. Orígenes externos
declarados cuando el rol es Usuario o Ambos. |
RetoAnalisis | F2 | nombre, analisis_propuesto. Uno por inscripción. |
FuenteRequerida | F2 | nombre, organismo. Hasta 3 por reto: fuentes que el
equipo necesita y no tiene. |
EvaluacionSeguridad | F3 | 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. |
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:
| Nodo | Ficha / paso | Campo 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):
| Tipo | Fórmula del radio |
|---|---|
| Capa Gold | 12 (fijo, el objeto mayor) |
| Base catálogo | 5 + min(8, num_campos / 30) |
| Organismo | 5 + min(8, num_fuentes × 1.5) |
| Suborganismo | 3.5 (fijo) |
| Equipo | 2.5 (fijo) |
| Conjunto | 2 + min(1, num_variables / 6) |
| Reto de análisis | 3 (fijo) |
| Fuente de información | 4 (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:
| Arista | Peso | Regla 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. |
5. Normalización y algoritmos de matching
Todo el matching textual usa dos normalizaciones deterministas:
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:
- Match exacto con catálogo: el nombre normalizado es clave del
índice de bases → arista
match_exacto(peso 3). - 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/maxde longitudes). Si además el organismo declarado coincide por subcadena con el organismo de la base, se promueve amatch_exacto; si no, quedamatch_aproximado(peso 1). - Mismo procedimiento contra los conjuntos ya caracterizados por otros equipos — detecta cuando un equipo «requiere» un dato que otro equipo ya tiene.
- 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:
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:
- Centro: Capa Gold en el origen (0,0,0), con una luz puntual dorada que la convierte en el «Sol» de la escena.
- 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í. - 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.
- 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))). - 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.
- 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:
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 |
|---|---|
| 0 | Capa Gold |
| 300 | Bases de catálogo |
| 640 | Organismos |
| 980 | Suborganismos (ordenados por ángulo del organismo) |
| 1320 | Equipos (ordenados por ángulo del suborganismo u organismo) |
| 1660 | Conjuntos y retos (ordenados por ángulo del equipo) |
| 2000 | Fuentes 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:
| Producto | Formato | Composició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. |
?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.