On Regulatory Simplification

Sobre Simplificación Regulatoria

Análisis de Grafos
Graph Analysis
Autor/a

Martin Olmos

Fecha de publicación

24 de julio de 2024

En el último Internet Day, organizado por la Cámara Argentina de Internet (CABASE) los pasados 17 y 18 de mayo, uno de los temas que se discutió fue sobre simplificación regulatoria. Cómo podemos acercarnos a esta cuestión desde el análisis de datos? Una forma es a través del análisis de grafos.

De acuerdo al Ente Nacional de Comunicaciones (ENACOM), existen 357 normas fundamentales que regulan al sector de las TIC en Argentina. Por otro lado, Infoleg, el sistema de información normativa y documental de la República Argentina, publica en formato abierto datos sobre la totalidad de las normas vigentes en el país en tres conjuntos de datos: una base de normas, una base de normas modificadas y una base de normas modificatorias (aquí normas modificatorias y modificadas son consideradas en sentido amplio, es decir, incluyen normas complementarias, reglamentarias, etc.).

Pero qué tiene que ver esto con la teoría de grafos? Un grafo es una estructura de datos consistente en un conjunto de nodos y un conjunto de aristas que los conectan. Estas aristas pueden ser dirigidas (aquellas donde la relación va en un sentido pero no en el otro) o no dirigidas (aquellas donde la relación va en ambos sentidos). En el caso de las normas, podemos pensar en un grafo donde los nodos son las normas y las aristas son las relaciones entre ellas.

En primer lugar, voy a leer los datos y cargarlos en una base de datos Neo4j, que es una base de datos de grafos.

Código
import pandas as pd
from neo4j import GraphDatabase
import os

normas_fundamentales_tic = pd.read_csv("normas_fundamentales_tic.csv")
normas_modificatorias_tic = pd.read_csv("normas_modificatorias_tic.csv")

# Configurar la conexión a Neo4j
uri = "bolt://localhost:7687"  # Ajusta según la configuración de tu Neo4j
username = os.getenv("NEO4J_USER")
password = os.getenv("NEO4J_PASS")

driver = GraphDatabase.driver(uri, auth=(username, password))

def create_nodes_and_relationships(tx, normas_fundamentales_tic, normas_modificatorias_tic):
    # Crear nodos para normas fundamentales
    for index, row in normas_fundamentales_tic.iterrows():
        tx.run("MERGE (n:Norma {id: $id, titulo: $titulo, grupo: $grupo, link: $link, notas: $notas, tipo: 'fundamental', boletin_oficial: $boletin_oficial})",
               id=row['id_norma'], titulo=row['norma'], grupo=row['grupo'], link=row['link'], notas=row['notas'], boletin_oficial=row['boletin_oficial'])
    
    # Crear relaciones "modifica a" o "es modificada por"
    for index, row in normas_modificatorias_tic.iterrows():
        tx.run("""
        MATCH (a:Norma {id: $id_modificatoria}), (b:Norma {id: $id_modificada})
        MERGE (a)-[:MODIFICA_A]->(b)
        """, id_modificatoria=row['id_norma_modificatoria'], id_modificada=row['id_norma_modificada'])

# Ejecutar la función en una sesión
with driver.session() as session:
    session.execute_write(create_nodes_and_relationships, normas_fundamentales_tic, normas_modificatorias_tic)

driver.close()

Veamos ahora cómo se ve el grafo.

La Figura 1 muestra el grafo de las normas fundamentales y modificatorias del sector TIC en Argentina. La Figura 2 es un zoom de una parte del grafo para poder visualizar mejor las relaciones entre las normas.

Pero qué podemos hacer con este grafo? Qué preguntas interesantes podemos responder?

Figura 1: Grafo de normas fundamentales y modificatorias
Figura 2: Zoom al grafo de normas fundamentales y modificatorias

Una pregunta interesante podría ser: cuáles son las 10 normas fundamentales que más fueron modificadas o complementadas por otras normas?

Nota

Neo4j utiliza un lenguaje de consultas que se llama Cypher. La pregunta anterior se puede responder con la consulta de Cypher que se muestra a continuación.

MATCH (n:Norma)-[:MODIFICA_A]->(m)
RETURN m.titulo, COUNT(n) AS num_modificaciones
ORDER BY num_modificaciones DESC
LIMIT 10
Figura 3: Tabla de normas fundamentales que más fueron modificadas o complementadas

Aquí el ranking lo encabezan el Decreto 764/2000, la Ley Argentina Digital, el Decreto 267/2015 que, entre otras cosas, creó el ENACOM, y la Ley de Servicios de Comunicación Audiovisual.