A Teoria dos Grafos e a Análise de Redes Complexas para Sistemas de Recomendações: Um Guia Prático

A Teoria dos Grafos e a Análise de Redes Complexas para Sistemas de Recomendações: Um Guia Prático

A Teoria dos Grafos tem sido amplamente utilizada para analisar redes complexas, como redes sociais, sistemas de recomendação, e muito mais. Neste artigo, quero abordar como usar grafos para criar uma rede de recomendação de tecnologias para pessoas, com base em suas preferências e habilidades. A combinação de conceitos da Teoria dos Grafos com o banco de dados Neo4j e a linguagem Cypher facilita a construção e análise dessas redes.

Veja o Resultado Final desse estudo de Caso



Tecnologias Utilizadas:

  • Neo4j: Um banco de dados orientado a grafos que permite modelar e analisar redes complexas.
  • Cypher: A linguagem de consulta usada para manipular e consultar grafos no Neo4j.


Links Úteis:


Principais Conceitos de Medidas de Centralidade

Antes de partir para a implementação, é fundamental entender alguns conceitos importantes sobre grafos:

  • Centralidade de Grau (Degree Centrality): Mede o número de conexões que um nó tem. Quanto mais conexões, mais influente o nó pode ser.
  • Centralidade de Intermediação (Betweenness): Mede quantas vezes um nó aparece nas rotas mais curtas entre outros nós.
  • Centralidade de Proximidade (Closeness Centrality): Indica o quão perto um nó está dos outros nós.
  • PageRank: Algoritmo que mede a importância de um nó com base nas conexões que ele recebe.
  • Eigenvector Centrality: Algoritmo que mede a importância de um nó com base nas conexões que ele recebe e também considera a importância de outros nós.

Essas medidas nos ajudarão a analisar a importância das pessoas e tecnologias na nossa rede de recomendação.


Requisitos do Estudo

O objetivo é criar uma rede de recomendação de tecnologias para pessoas com base em suas preferências e habilidades. Os principais requisitos para esse estudo são:

  • Rede de pessoas com suas preferências e habilidades
  • Rede de tecnologias com seus impactos
  • Código em Cypher para criar e analisar a rede de recomendação


Passo a Passo para Criar uma Rede de Recomendação Usando Cypher

Abaixo está o passo a passo de como construir a rede de recomendação usando Cypher no Neo4j:


1. Criar Nós de Pessoas e Tecnologias

Usando a Linguagem Cypher no banco de dados Neo4j, vamos criar os nós para representar as pessoas e as tecnologias que elas dominam, além de atribuir o impacto de turnover para cada pessoa e vamos criar as arestas que ligam as pessoas as Tecnologias que elas dominam.

(:PESSOA) - [:DOMINA]->(:TECNOLOGIA)

// 1. Criar nós de Pessoas
MERGE (p1:Pessoa {nome: 'Miguel'}) SET p1.turnover = 'Alto'
MERGE (p2:Pessoa {nome: 'Arthur'}) SET p2.turnover = 'Crítico'
MERGE (p3:Pessoa {nome: 'Helena'}) SET p3.turnover = 'Médio'
MERGE (p4:Pessoa {nome: 'Alice'}) SET p4.turnover = 'Baixo'
MERGE (p5:Pessoa {nome: 'Heitor'}) SET p5.turnover = 'Médio'
MERGE (p6:Pessoa {nome: 'Laura'}) SET p6.turnover = 'Crítico'
MERGE (p7:Pessoa {nome: 'Davi'}) SET p7.turnover = 'Alto'
MERGE (p8:Pessoa {nome: 'Gabriel'}) SET p8.turnover = 'Médio'
MERGE (p9:Pessoa {nome: 'Valentina'}) SET p9.turnover = 'Alto'
MERGE (p10:Pessoa {nome: 'Matheus'}) SET p10.turnover = 'Médio'

// 2. Criar nós de Tecnologias (Itens)
MERGE (t1:Item {nome: 'Java'})
MERGE (t2:Item {nome: 'Python'})
MERGE (t3:Item {nome: 'JavaScript'})
MERGE (t4:Item {nome: 'SQL'})
MERGE (t5:Item {nome: 'Docker'})
MERGE (t6:Item {nome: 'AWS'})
MERGE (t7:Item {nome: 'Node.js'})
MERGE (t8:Item {nome: 'React'})
MERGE (t9:Item {nome: 'MongoDB'})
MERGE (t10:Item {nome: 'C++'})
MERGE (t11:Item {nome: 'Kubernetes'})
MERGE (t12:Item {nome: 'Go'})
MERGE (t13:Item {nome: 'Ruby'})
MERGE (t14:Item {nome: 'TensorFlow'})
MERGE (t15:Item {nome: 'Spark'})

// 3. Criar as relações DOMINA entre Pessoas e Tecnologias
MERGE (p1)-[:DOMINA]->(t1) // Miguel -> Java
MERGE (p1)-[:DOMINA]->(t2) // Miguel -> Python
MERGE (p2)-[:DOMINA]->(t3) // Arthur -> JavaScript
MERGE (p2)-[:DOMINA]->(t4) // Arthur -> SQL
MERGE (p3)-[:DOMINA]->(t5) // Helena -> Docker
MERGE (p3)-[:DOMINA]->(t6) // Helena -> AWS
MERGE (p4)-[:DOMINA]->(t7) // Alice -> Node.js
MERGE (p4)-[:DOMINA]->(t8) // Alice -> React
MERGE (p5)-[:DOMINA]->(t9) // Heitor -> MongoDB
MERGE (p5)-[:DOMINA]->(t10) // Heitor -> C++
MERGE (p6)-[:DOMINA]->(t11) // Laura -> Kubernetes
MERGE (p6)-[:DOMINA]->(t12) // Laura -> Go
MERGE (p7)-[:DOMINA]->(t13) // Davi -> Ruby
MERGE (p7)-[:DOMINA]->(t14) // Davi -> TensorFlow
MERGE (p8)-[:DOMINA]->(t1) // Gabriel -> Java
MERGE (p8)-[:DOMINA]->(t15) // Gabriel -> Spark
MERGE (p9)-[:DOMINA]->(t9) // Valentina -> MongoDB
MERGE (p9)-[:DOMINA]->(t7) // Valentina -> Node.js
MERGE (p10)-[:DOMINA]->(t3) // Matheus -> JavaScript
MERGE (p10)-[:DOMINA]->(t10) // Matheus -> C++        


Em seu banco de dados Neo4j, copie e cole o código a acima para criar uma rede para estudos

Para ver a rede criada, basta executar o seguinte comando:

MATCH (A) RETURN A LIMIT 100        


Nossa Rede Primária - Pessoas dominam Tecnologias


2. Realizar Consultas na Rede

Após criar a rede, podemos fazer algumas consultas simples para obter insights.

Quem domina uma tecnologia específica?

MATCH (p:Pessoa)-[:DOMINA]->(t:Item {nome: 'Python'})
RETURN p.nome;        


Nesse caso, Apenas Miguel domina Pyhton


Quais tecnologias uma pessoa específica domina?

MATCH (p:Pessoa {nome: 'Miguel'})-[:DOMINA]->(t:Item)
RETURN t.nome;        



Miguel domina Python e Java

(Em breve pretendo postar um artigo falando dos comandos Básicos o Cypher)


3. Analisar a Centralidade com PageRank

O PageRank é um algoritmo originalmente desenvolvido por Larry Page e Sergey Brin, os fundadores do Google, para classificar páginas da web com base na sua relevância. Ele atribui uma pontuação a cada nó (ou página) de uma rede, levando em conta o número e a qualidade das conexões que recebe de outros nós. Quanto mais conexões de nós relevantes uma página recebe, maior é seu PageRank. Esse algoritmo é amplamente utilizado não apenas na web, mas em outras áreas como redes sociais, sistemas de recomendação, e até mesmo em citações acadêmicas.


Fonte:

Para medir a importância dos nós na rede, podemos usar o algoritmo PageRank. Aqui está o código em Cypher para calcular o PageRank:

CALL gds.graph.project(
  'grafoPessoaTecnologia',
  'Pessoa',
  {
    DOMINA: {
      type: 'DOMINA',
      orientation: 'UNDIRECTED'
    }
  }
);        

(Verifique se a GDS Library está instalada no seu banco Neo4j rodando o seguinte comando:CALL gds.version();

Para visualizar o PageRank de cada Nó, execute a seguinte consulta:

CALL gds.pageRank.stream('grafoPessoaTecnologia', {
  maxIterations: 20, dampingFactor: 0.85
})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).nome AS nome, score
ORDER BY score DESC;        

Resultado:


Note que o score está igual para todos, isso quer dizer que a Rede está bem Homegênea, ou seja, não há Nós com mais importância devido a baixa conexão que existe na rede


Todos as Pessoas tem o mesmo

Análises Mais Avançadas: Explorando a Rede

Agora que temos uma rede de pessoas e tecnologias, podemos criar consultas para recomendar treinamentos. A seguir, vamos ver como identificar quem pode ser mentor em uma tecnologia e quem pode receber o treinamento.

Quem poderia ensinar uma tecnologia que outra pessoa ainda não domina?

MATCH (p1:Pessoa)-[:DOMINA]->(t:Item {nome: 'AWS'})
MATCH (p2:Pessoa {nome: 'Alice'})
WHERE NOT (p2)-[:DOMINA]->(t)
RETURN p1.nome as Treinador, p2.nome as Aluno;        

Nesse caso, queremos um Sugestão de Professor de AWS para a Alice.

A consulta retornou:

Importante: Nesse momento, devemos considerar que a Baixa conectividade dessa rede nos dará respostas que terão baixo impacto, mas isso mudará quando conectarmos outros Nós de Relacionamentos na Rede.

Quem tem o maior impacto de turnover na rede?

MATCH (p:Pessoa)
WHERE p.turnover = 'Crítico'
RETURN p.nome, p.turnover;        


Nesse caso, ele sugeriu as pessoas Arthur e Laura como maior Impacto de Turnover na rede.



Realizando os Treinamentos

Suponhamos que Alice recebeu o Treinamento de AWS de Laura, e agora ela também domina AWS juntamente com Alice

match (a:Pessoa{nome:'Alice'})
match (t:Item{nome:'AWS'})
create (a)-[:DOMINA->(t) return a        


Alice Domina 3 Skills (React, Node.js e AWS)

A Polivalência sobre AWS está maior, aumentando a segurança do processo que utilize essa HardSkill.


Agora vamos conectar outros Nós

Nossa Rede está assim:


MATCH (A) RETURN A

Vamos criar essas Relações de TRABALHA_COM


Alice <-> Elena <--> Valentina

Valentina <-> Heitor

Heitor <-> Matheus <-TRABALHA_COM-> Arthur <-> Laura

Davi <-> Matheus

Matheus <-> Miguel

// Conectar Alice, Helena e Valentina
MATCH (alice:Pessoa {nome: 'Alice'}), (helena:Pessoa {nome: 'Helena'})
MERGE (alice)-[:TRABALHA_COM]->(helena)
MERGE (helena)-[:TRABALHA_COM]->(alice);

MATCH (helena:Pessoa {nome: 'Helena'}), (valentina:Pessoa {nome: 'Valentina'})
MERGE (helena)-[:TRABALHA_COM]->(valentina)
MERGE (valentina)-[:TRABALHA_COM]->(helena);

// Conectar Valentina e Heitor
MATCH (valentina:Pessoa {nome: 'Valentina'}), (heitor:Pessoa {nome: 'Heitor'})
MERGE (valentina)-[:TRABALHA_COM]->(heitor)
MERGE (heitor)-[:TRABALHA_COM]->(valentina);

// Conectar Heitor, Matheus, Arthur e Laura
MATCH (heitor:Pessoa {nome: 'Heitor'}), (matheus:Pessoa {nome: 'Matheus'})
MERGE (heitor)-[:TRABALHA_COM]->(matheus)
MERGE (matheus)-[:TRABALHA_COM]->(heitor);

MATCH (matheus:Pessoa {nome: 'Matheus'}), (arthur:Pessoa {nome: 'Arthur'})
MERGE (matheus)-[:TRABALHA_COM]->(arthur)
MERGE (arthur)-[:TRABALHA_COM]->(matheus);

MATCH (arthur:Pessoa {nome: 'Arthur'}), (laura:Pessoa {nome: 'Laura'})
MERGE (arthur)-[:TRABALHA_COM]->(laura)
MERGE (laura)-[:TRABALHA_COM]->(arthur);

// Conectar Davi e Matheus
MATCH (davi:Pessoa {nome: 'Davi'}), (matheus:Pessoa {nome: 'Matheus'})
MERGE (davi)-[:TRABALHA_COM]->(matheus)
MERGE (matheus)-[:TRABALHA_COM]->(davi);

// Conectar Matheus e Miguel
MATCH (matheus:Pessoa {nome: 'Matheus'}), (miguel:Pessoa {nome: 'Miguel'})
MERGE (matheus)-[:TRABALHA_COM]->(miguel)
MERGE (miguel)-[:TRABALHA_COM]->(matheus);        

Note que agora a Rede está bem mais conectada




Refazendo as Sugestões

Ótimo! Agora que as conexões entre as pessoas foram estabelecidas, podemos passar para os próximos passos, como realizar análises de centralidade (Degree, Closeness, Betweenness, etc.) e entender a importância de cada nó na rede.



Próximos Passos: Análises de Centralidade

Vamos rodar algumas análises básicas para explorar como os nós (as pessoas) estão conectados e identificar quais são os mais centrais na rede.

Depois de garantir que a rede está conectada, você pode reprojetar o grafo e recalcular a Closeness Centrality

  1. Reprojetar o grafo:

CALL gds.graph.drop('grafoPessoaTecnologia', false); // Remover o grafo anterior
CALL gds.graph.project(
  'grafoPessoaTecnologia',
  'Pessoa',
  {
    DOMINA: {
      type: 'DOMINA',
      orientation: 'UNDIRECTED'
    },
    TRABALHA_COM: {
      type: 'TRABALHA_COM',
      orientation: 'UNDIRECTED'
    }
  }
);        

2. Recalcular a Closeness Centrality:

CALL gds.closeness.stream('grafoPessoaTecnologia')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).nome AS nome, score
ORDER BY score DESC;        

Isso mostra que Matheus é quem em o Maior Closeness Centrality.


INSIGHTs

O fato de Matheus ter a maior Closeness Centrality significa que ele está posicionado de forma central na rede e pode alcançar os outros nós (pessoas) com menos "passos" do que qualquer outra pessoa. Ele está, de certa forma, no "coração" da rede, com proximidade a muitos outros nós, facilitando a propagação de informações ou conexões.

O que o resultado da Closeness Centrality indica:

  1. Matheus é o mais próximo de outras pessoas na rede. Isso significa que ele pode acessar rapidamente diferentes partes da rede, o que pode ser útil em cenários como comunicação, distribuição de tarefas ou colaboração.
  2. Influência na propagação: Em redes como essa, pessoas com alta Closeness Centrality tendem a ser bons facilitadores de comunicação, já que estão perto de muitos outros nós. No contexto de trabalho, Matheus seria uma pessoa-chave para conectar diferentes grupos de pessoas.


Isso adicionará uma nova propriedade chamada closenessScore aos nós da rede.

CALL gds.closeness.write('grafoPessoaTecnologia', {
  writeProperty: 'closenessScore'
})
YIELD nodePropertiesWritten;        

Mais Peguntas

1. Quem pode ensinar uma tecnologia que outra pessoa não domina?

MATCH (p1:Pessoa)-[:DOMINA]->(t:Item)
MATCH (p2:Pessoa)
WHERE NOT (p2)-[:DOMINA]->(t) AND id(p1) <> id(p2)
RETURN p1.nome AS Mentor, p2.nome AS Aprendiz, t.nome AS Tecnologia;        

2. Quais tecnologias uma pessoa domina e poderiam ser ensinadas para outra?

MATCH (p1:Pessoa)-[:DOMINA]->(t:Item)
MATCH (p2:Pessoa)
WHERE NOT (p2)-[:DOMINA]->(t) AND id(p1) <> id(p2)
RETURN p1.nome AS Mentor, t.nome AS Tecnologia, COLLECT(p2.nome) AS Possíveis_Aprendizes;        


3. Quem poderia ser recomendado para aprender uma nova tecnologia?

Essa consulta identifica pessoas que não dominam uma tecnologia e, portanto, são candidatas a aprender.

MATCH (p:Pessoa)
MATCH (t:Item)
WHERE NOT (p)-[:DOMINA]->(t)
RETURN p.nome AS Pessoa, t.nome AS Tecnologia_Para_Aprender
ORDER BY p.nome;        


4. Quais pessoas poderiam colaborar em uma nova tecnologia com base nas conexões atuais?

Essa consulta encontra pessoas que estão conectadas (por exemplo, que trabalham juntas) e que poderiam colaborar em uma nova tecnologia que ambas ainda não dominam.

MATCH (p1:Pessoa)-[:TRABALHA_COM]-(p2:Pessoa)
MATCH (t:Item)
WHERE NOT (p1)-[:DOMINA]->(t) AND NOT (p2)-[:DOMINA]->(t)
RETURN p1.nome AS Colaborador1, p2.nome AS Colaborador2, t.nome AS Tecnologia_Recomendada
ORDER BY Colaborador1, Colaborador2;        


5. Quem poderia ser recomendado para assumir responsabilidades críticas com base na centralidade?

Essa consulta usa Betweenness Centrality para encontrar quem conecta mais partes da rede e, portanto, poderia assumir responsabilidades de liderança ou comunicação entre grupos.

CALL gds.betweenness.stream('grafoPessoaTecnologia')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).nome AS Pessoa, score
ORDER BY score DESC;        


Nesse Caso, Matheus e Heitor poderiam assumir papel de Lideres técnicos baseando na conectividade e centralidade.

Essas são algumas das consultas que você pode usar para obter recomendações a partir da sua rede. Elas podem ser úteis para descobrir quem pode ensinar, aprender, colaborar ou liderar em diferentes contextos, além de fornecer insights sobre a estrutura da rede e as conexões entre pessoas e tecnologias.


Conclusão

A análise de redes complexas e o uso de grafos, como vimos neste estudo, pode proporcionar uma visão poderosa sobre as interações entre pessoas e tecnologias, permitindo que identifiquemos padrões ocultos e façamos recomendações assertivas. Desde a identificação de mentores até a recomendação de quem pode aprender novas tecnologias, essas metodologias transformam o modo como tomamos decisões. O uso de Neo4j e a linguagem Cypher nos permitem visualizar e explorar redes de uma maneira visual e interativa, facilitando a análise e otimizando a colaboração entre indivíduos.

Além do uso em sistemas de recomendação e otimização de equipes técnicas, essa metodologia pode ser aplicada em diversas outras áreas de uma empresa, como:

Casos de Uso em Outras Áreas de uma Empresa

1. Recursos Humanos (RH)

- Caso de uso: Gestão de Talentos e Sucessão – Utilizando a análise de redes, o RH pode identificar colaboradores com alta centralidade, ou seja, aqueles que são os melhores conectores dentro da empresa, facilitando a comunicação entre departamentos. Isso pode ajudar a planejar sucessões ou identificar líderes emergentes.

2. Finanças

- Caso de uso: Otimização de Pagamentos e Fluxo de Caixa – Com a análise de redes financeiras, é possível visualizar as interdependências entre fornecedores, clientes e parceiros, ajudando a prever gargalos no fluxo de caixa e otimizar o momento de pagamentos e recebimentos com base nas conexões financeiras críticas.


3. Controladoria

- Caso de uso: Mapeamento de Custos – A análise de redes pode ser usada para entender as relações entre centros de custo e as despesas associadas. Isso permite que a controladoria visualize as interdependências financeiras dentro da empresa e entre diferentes áreas, facilitando a alocação mais eficiente dos recursos.

4. Logística

- Caso de uso: Otimização de Rotas e Cadeia de Suprimentos – Aplicando grafos, é possível visualizar a cadeia de suprimentos e identificar gargalos ou ineficiências nas rotas de entrega, melhorando a distribuição de produtos e reduzindo custos de transporte. A análise de centralidade também pode ajudar a identificar os pontos críticos na logística.


5. Jurídico

- Caso de uso: Análise de Contratos e Relacionamentos – No setor jurídico, a análise de redes pode mapear as interações entre cláusulas contratuais, clientes, e fornecedores, ajudando a identificar pontos críticos ou interdependências que podem representar riscos legais. Isso pode ser aplicado na análise de contratos complexos.


Esses são apenas alguns exemplos de como a análise de redes complexas pode ser aplicada em diversas áreas de uma organização. A possibilidade de visualizar, analisar e interagir com as redes permite que decisões sejam tomadas com mais precisão e segurança, otimizando processos em várias frentes.

Obrigado por ler até o final!

Se você gostou deste artigo, deixe um comentário compartilhando suas ideias ou onde você acredita que essas técnicas poderiam ser aplicadas em sua área de trabalho. Estou curioso para saber onde você enxerga o maior potencial dessa metodologia.


Murilo Vinicius Teles

Business Intelligence Analyst | Developer | WEB Developer | Full Stack | PHP | SQL | MySQL | JavaScript | NodeJs | React | CSS | BI | ScriptCase

3 m

Parabéns Régis, muito Bom!! Esse artigo será de muita importancia para várias pessoas da área de Dados.

Camila Mattos

Tech Lead | Data Engineer | Cloud | Python | Powerbi | AWS | Pyspark | Data Analyst | Glue

3 m

Muito bom Régis!! Tive algumas ideias para aplicar aqui 🙂 obrigada por compartilhar 😉

Jader Lima

Data Engineer | Azure | Azure Databricks | Azure Data Factory | Azure Data Lake | Azure SQL | Databricks | PySpark | Apache Spark | Python

3 m

Preciso estudar grafos, seus artigo será um ótimo ponto de referência, obrigado Reginaldo Miguel !

Entre para ver ou adicionar um comentário

Outras pessoas também visualizaram

Conferir tópicos