Rede de conselheiros CVM Código no GitHub

Quem divide conselho com quem

Grafo dos conselheiros e diretores das companhias abertas brasileiras, montado com os Formulários de Referência públicos da CVM de 2021 a 2025. Mede quanto da rede passa por poucas pessoas e estima quais ligações tendem a surgir.

Tela Explorer do app: centenas de conselheiros desenhados como pontos coloridos por comunidade, os maiores com o nome ao lado, e filtros de busca, ano, setor e mínimo de conexões no alto.
Explorer em Sigma.js (WebGL): os 500 conselheiros de maior PageRank. O tamanho do ponto é o PageRank e a cor, a comunidade.

Do formulário ao grafo

Na carga de 2021 a 2025 entraram 12.788 pessoas, 2.561 companhias do cadastro da CVM e 349.232 pares de pessoas que dividem um conselho ou uma diretoria.

Lê o que as companhias declaram

O ETL baixa os arquivos do Formulário de Referência no portal de dados abertos da CVM, lê os CSVs, que mudam de colunas e de encoding de um ano para outro, e padroniza os cargos. Como os dados não trazem CPF, cada pessoa é identificada pelo nome normalizado junto com a data de nascimento.

Guarda tudo no Neo4j

Pessoas, companhias e setores viram nós, e cada cargo vira uma aresta com o órgão, a data de eleição e o ano. Quem senta no mesmo órgão ganha uma ligação direta, com peso, e as métricas rodam sobre essa projeção.

Perfil de um membro no app: PageRank, betweenness, degree, eigenvector, closeness e k-core em blocos, e ao lado a lista das companhias em que a pessoa tem cargo.
Perfil de um membro: as centralidades calculadas e as companhias em que ele tem cargo.

Quanto poder se concentra

As centralidades rodam no NetworKit, em C++ paralelo: grau, intermediação, proximidade, autovetor e PageRank para cada pessoa, mais k-core e coeficiente de agrupamento. O Louvain separou a rede em 143 comunidades, com modularidade de 0,79.

Com as 349 mil arestas, o cálculo inteiro levou 54 segundos numa máquina de 16 threads. O resultado volta para o Neo4j e alimenta o painel.

Dashboard do app: totais de membros, empresas, conexões e comunidades, o ranking dos mais conectados por PageRank e o quadro de concentração de poder com Gini, HHI, índice de interlocking e densidade.
Dashboard: ranking por PageRank e os índices de concentração da rede.

O que mais é medido

Quais ligações tendem a surgir

O Node2Vec gera um vetor de 128 dimensões por pessoa, com 80 caminhadas de 20 passos. Um Random Forest combina esses vetores, pelo produto de Hadamard, com Jaccard, Adamic-Adar, preferential attachment e resource allocation.

O corte é temporal: treina com a rede até 2023 e testa nas ligações novas. Cada heurística sozinha também é medida, como linha de base para o modelo.

A lista de membros ordena por PageRank ou intermediação e leva ao perfil de cada um.

Tela Membros do app: tabela com nome, cargo, PageRank, betweenness e comunidade de cada conselheiro, ordenada por PageRank.
Membros: a tabela ordenada por PageRank, com cargo e comunidade.

Como é feito

API
Python 3.12, FastAPI assíncrono, Pydantic
Banco de grafo
Neo4j 5 no Docker
Métricas
NetworKit em C++ paralelo, NetworkX, python-louvain e SciPy
Modelo
Node2Vec e Random Forest do scikit-learn
Interface
Next.js 16, TypeScript, Tailwind v4, TanStack Query, Sigma.js e graphology
Dados
Formulário de Referência no portal de dados abertos da CVM, com atualização mensal pelo GitHub Actions
docker compose up -d
cd backend
python scripts/run_etl.py --years 2021 2022 2023 2024 2025
python scripts/compute_metrics.py
python scripts/train_model.py

Sem CPF, homônimos com a mesma data de nascimento viram uma pessoa só. O Explorer desenha no máximo 500 nós, escolhidos por PageRank.