Pular para o conteúdo principal

Análise de redes sociais em Python

Hoje, as redes fazem parte do nosso dia a dia. Vamos aprender a visualizar e entender uma rede social em Python usando o NetworkX.
Atualizado 17 de set. de 2026  · 12 min lido

Explorar com IA

ChatGPTClaudePerplexity

Se você quer aprender sobre Análise de Redes, faça o curso Network Analysis in Python (Part 1) da DataCamp.

Redes estão em todo lugar: redes de estradas, a rede de amigos e seguidores nas redes sociais e a rede de colegas no escritório. Elas têm um papel importante no nosso dia a dia — desde espalhar informações úteis até influenciar eleições nacionais. A capacidade de analisar essas redes e tomar decisões com base nelas é uma habilidade essencial para qualquer analista de dados.

O foco deste tutorial é ensinar análise de redes sociais (SNA) usando Python e NetworkX, uma biblioteca Python para estudar a estrutura, a dinâmica e as funções de redes complexas. Este tutorial assume que você já conhece a sintaxe básica de Python; não é necessário conhecimento prévio de SNA.

Introdução

Vamos começar entendendo o que são redes sociais. Abaixo você vê uma rede de atores de Bollywood como nós (nodes). Eles estão conectados por linhas contínuas quando trabalharam juntos em pelo menos um filme.

bollywood actors

Perceba que Amitabh Bachchan e Abhishek Bachchan atuaram com todos os atores da rede, enquanto Akshay Kumar trabalhou apenas com os dois Bachchans. Interessante, né?

Isso também é uma rede social. Qualquer rede com conexões entre indivíduos, em que as conexões representam o relacionamento entre eles, é uma rede social. Analisar essas redes traz insights valiosos sobre as pessoas na rede, como quem influencia de verdade, quem é mais conectado, etc.

Cada rede é composta por:

  • Nós: Os indivíduos de quem estamos construindo a rede. No exemplo acima, os atores.
  • Arestas: As conexões entre os nós. Representam um relacionamento entre os nós da rede. No nosso exemplo, o relacionamento é terem trabalhado juntos.

Criando uma rede com o NetworkX

Existem vários tipos de redes. Vamos usar o NetworkX para criar e analisar esses diferentes tipos. Para começar, você precisa instalar o NetworkX. Você pode usar:

pip install networkx

ou, se estiver usando Anaconda:

conda install -c anaconda networkx

Isso instalará a versão mais recente do networkx. Os códigos deste tutorial foram executados com Python=3.5 e NetworkX=2.0.

Redes simétricas

A primeira rede de atores que criamos acima é uma rede simétrica, porque o relacionamento "trabalhar juntos em um filme" é simétrico. Se A está relacionado a B, B também está relacionado a A. Vamos criar no NetworkX a rede que vimos acima.

Usaremos o método Graph() para criar uma nova rede e add_edge() para adicionar uma aresta entre dois nós.

import networkx as nx
G_symmetric = nx.Graph()
G_symmetric.add_edge('Amitabh Bachchan','Abhishek Bachchan')
G_symmetric.add_edge('Amitabh Bachchan','Aamir Khan')
G_symmetric.add_edge('Amitabh Bachchan','Akshay Kumar')
G_symmetric.add_edge('Amitabh Bachchan','Dev Anand')
G_symmetric.add_edge('Abhishek Bachchan','Aamir Khan')
G_symmetric.add_edge('Abhishek Bachchan','Akshay Kumar')
G_symmetric.add_edge('Abhishek Bachchan','Dev Anand')
G_symmetric.add_edge('Dev Anand','Aamir Khan')

Agora vamos visualizar a rede que acabamos de construir usando nx.draw_networkx(G_symmetric).

visualized network

Domine suas habilidades em dados com o DataCamp

Mais de 10 milhões de pessoas aprendem Python, R, SQL e outras habilidades tecnológicas usando nossos cursos práticos elaborados por especialistas do setor.

Comece a Aprender
learner-on-couch@2x.jpg

Redes assimétricas

E se o relacionamento entre os nós for "filho de"? Nesse caso, o relacionamento deixa de ser simétrico. Se A é filho de B, B não é filho de A. Uma rede em que o relacionamento é assimétrico (A está relacionado a B, mas isso não significa necessariamente que B esteja relacionado a A) é chamada de rede assimétrica. Podemos construir uma rede assimétrica no NetworkX usando o método DiGraph, abreviação de Directional Graph (grafo direcional). Vamos criar um grafo assimétrico.

G_asymmetric = nx.DiGraph()
G_asymmetric.add_edge('A','B')
G_asymmetric.add_edge('A','D')
G_asymmetric.add_edge('C','A')
G_asymmetric.add_edge('D','E')

Agora vamos visualizar. Podemos usar a função draw_networkx() como antes. Porém, é possível que os nós não se separem bem e fiquem pouco visíveis no desenho. Para resolver isso, podemos forçar um layout, que posiciona os nós de forma a deixá-los mais distintos. Fazemos isso com a função spring_layout(), seguida de draw_networkx().

nx.spring_layout(G_asymmetric)
nx.draw_networkx(G_asymmetric)

Abaixo você vê a rede com e sem o comando de layout. A versão com o layout fica mais clara.

visualized network 2

Redes ponderadas

Até agora vimos redes sem pesos, mas também é possível ter redes com pesos. Por exemplo, se na rede inicial considerarmos o número de filmes feitos juntos como peso, teremos uma rede ponderada. Vamos recriar a rede dos atores, mas desta vez adicionando pesos: cada aresta terá um peso indicando quantos filmes eles fizeram juntos.

G_weighted = nx.Graph()
G_weighted.add_edge('Amitabh Bachchan','Abhishek Bachchan', weight=25)
G_weighted.add_edge('Amitabh Bachchan','Aaamir Khan', weight=8)
G_weighted.add_edge('Amitabh Bachchan','Akshay Kumar', weight=11)
G_weighted.add_edge('Amitabh Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Abhishek Bachchan','Aaamir Khan', weight=4)
G_weighted.add_edge('Abhishek Bachchan','Akshay Kumar',weight=7)
G_weighted.add_edge('Abhishek Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Dev Anand','Aaamir Khan',weight=1)
weighted network

A figura acima mostra a rede ponderada dos atores em um layout circular. A largura da aresta indica o peso entre dois nós.

Multigrafo

Podemos atribuir diferentes atributos às arestas. Por exemplo, podemos definir uma relação de vizinhança entre dois nós "A" e "B" usando o atributo relation. Se, dentro de uma rede, dois nós estiverem conectados por duas arestas diferentes (relações distintas), teremos um multigrafo. Podemos criar um multigrafo usando a classe MultiGraph.

G = nx.MultiGraph()
G.add_edge('A','B',relation ='neighbor')
G.add_edge('A','B',relation='friend)
G.add_edge('B','C', relation='neighbor')
G.add_edge('D','C',relation='friend')

Esse código constrói um grafo com duas arestas entre A e B. Podemos verificar as conexões usando G.edges(). A saída seria:

MultiEdgeDataView([('A', 'B', {'relation': 'neighbor'}), ('A', 'B', {'relation': 'friend'}), ('B', 'C', {'relation': 'neighbor'}), ('B', 'D', {'relation': 'neighbor'}), ('C', 'D', {'relation': 'friend'})])

Conectividade da rede

Agora que a rede está criada, dá para saber mais sobre um nó específico? Sim! Vamos explorar algumas métricas.

Grau

O grau de um nó define quantas conexões ele tem. O NetworkX possui a função degree, que podemos usar para determinar o grau de um nó na rede.

nx.degree(G_symmetric, 'Dev Anand`)

Isso retornará 3, já que Dev Anand trabalhou com apenas três atores nessa rede.

Coeficiente de agrupamento

Observa-se que pessoas que compartilham conexões em uma rede social tendem a formar associações. Em outras palavras, há uma tendência de formação de clusters. Podemos determinar os coeficientes locais de agrupamento de um nó, que são a fração de pares de amigos (conexões) desse nó que também estão conectados entre si. Para isso, usamos a função nx.clustering(Graph, Node).

Na rede simétrica dos atores, você verá que Dev Anand tem coeficiente local de agrupamento igual a 1 e Abhishek Bachchan tem aproximadamente 0,67.

O coeficiente médio de agrupamento (soma de todos os coeficientes locais dividida pelo número de nós) para essa rede simétrica é 0,867. Podemos obtê-lo com:

nx.average_clustering(G_symmetric)

Distância

Também podemos determinar o caminho mais curto entre dois nós e seu comprimento no NetworkX usando as funções nx.shortest_path(Graph, Node1, Node2) e nx.shortest_path_length(Graph, Node1, Node2), respectivamente.

Executando

nx.shortest_path(G_symmetric, 'Dev Anand', 'Akshay Kumar')

Retorna

['Dev Anand', 'Amitabh Bachchan', 'Akshay Kumar']

Podemos encontrar a distância de um nó até todos os outros na rede usando a busca em largura (BFS), partindo desse nó. O NetworkX oferece a função bfs_tree para isso. Se você executar T = nx.bfs_tree(G_symmetric, 'Dev Anand') e desenhar essa árvore, verá como alcançar os demais nós da rede a partir de Dev Anand.

nodes

Excentricidade

A excentricidade de um nó A é definida como a maior distância entre A e todos os outros nós. Podemos calculá-la com a função nx.eccentricity(). Na rede simétrica dos atores, Dev Anand tem excentricidade 2 e Abhishek Bachchan tem excentricidade 1 (ele está conectado a todos).

Influenciadores na rede

Acima vimos algumas medidas de distância na rede, úteis para entender como a informação se espalha. Agora vamos aprender a identificar os nós (indivíduos) mais importantes na rede. Esses parâmetros são as medidas de centralidade.

Lembra daquela pessoa super popular do colégio ou do craque do time da escola? Eram pessoas com poder de transformar sua experiência escolar em céu ou inferno. O que dava a elas esse poder? As medidas de centralidade ajudam a identificar popularidade, quem é mais querido e os grandes influenciadores dentro da rede.

Centralidade de grau

As pessoas mais populares geralmente têm mais amigos. A centralidade de grau mede quantas conexões um nó tem na rede. Parte da premissa de que nós importantes têm muitas conexões. O NetworkX possui a função degree_centrality() para calcular a centralidade de grau de todos os nós de uma rede.

Centralidade de autovetor

Não é só a quantidade de conexões que importa, mas também com quem você se conecta. Em algumas cidades, quando alguém é parado por uma infração de trânsito, a primeira frase é: "Você sabe com quem está falando?".

A centralidade de autovetor mede exatamente isso: um nó é importante se está conectado a outros nós importantes. Podemos usar a função eigenvector_centrality() do NetworkX para calcular a centralidade de autovetor de todos os nós.

O algoritmo PageRank do Google é uma variação do algoritmo de centralidade de autovetor.

Centralidade de intermediação

A centralidade de intermediação mede controle. Ela representa a frequência com que um nó aparece nos caminhos geodésicos (caminhos mais curtos) que conectam pares de nós. Em outras palavras, quantas vezes um nó aparece nos menores caminhos entre outros dois nós. Nós com alta centralidade de intermediação exercem papel relevante no fluxo de comunicação/informação na rede. Esses nós podem ter controle estratégico e influenciar os demais. Um indivíduo nessa posição pode impactar o grupo ao reter ou distorcer informações em trânsito.

O NetworkX possui a função betweenness_centrality() para medi-la na rede. Ela permite escolher se os valores serão normalizados, se os pesos serão considerados no cálculo e se os pontos finais serão incluídos na contagem de caminhos mais curtos.

Juntando tudo

Vamos usar dados do Facebook. Para nossa análise aqui, usaremos o conjunto Facebook combined ego networks, que contém a rede agregada da lista de amigos de dez indivíduos. Você pode baixar o arquivo facebook_combined.txt no site da Stanford University.

Você também pode obter seus próprios dados do Facebook/Twitter usando as APIs dessas plataformas. Fique de olho no próximo tutorial, no qual vamos aprender a usar as APIs do Facebook e do Twitter para coletar dados e aplicar o que vimos aqui para analisá-los.

Vamos ler o arquivo e construir o grafo:

G_fb = nx.read_edgelist("facebook_combined.txt", create_using = nx.Graph(), nodetype=int)

A rede tem 4.039 nós conectados por 88.234 arestas. É grande mesmo! Você obtém essas informações com a função info().

[In]: print(nx.info(G_fb))


[Out]: Name:
       Type: Graph
       Number of nodes: 4039
       Number of edges: 88234
       Average degree:  43.6910

Abaixo você vê a rede:

network

Também podemos visualizar a rede variando a cor do nó conforme o grau e o tamanho do nó conforme a centralidade de intermediação. O código é:

pos = nx.spring_layout(G_fb)
betCent = nx.betweenness_centrality(G_fb, normalized=True, endpoints=True)
node_color = [20000.0 * G_fb.degree(v) for v in G_fb]
node_size =  [v * 10000 for v in betCent.values()]
plt.figure(figsize=(20,20))
nx.draw_networkx(G_fb, pos=pos, with_labels=False,
                 node_color=node_color,
                 node_size=node_size )
plt.axis('off')

O grafo resultante fica assim:

resulting graph

Você também pode descobrir os rótulos dos nós com maior centralidade de intermediação usando:

sorted(betCent, key=betCent.get, reverse=True)[:5]

A tabela abaixo lista os cinco rótulos de nós com maiores medidas de centralidade.

Centralidade de grau Centralidade de autovetor Centralidade de intermediação
107 1912 107
1684 2266 1684
1912 2206 3437
3437 2233 1912
0 2464 1085

Percebemos que alguns nós aparecem tanto na centralidade de grau (medida de conectividade) quanto na centralidade de intermediação (controle do fluxo de informação). É natural que nós mais conectados também apareçam nos menores caminhos entre outros nós. O nó 1912 é importante, pois se destaca nas três medidas de centralidade consideradas.

Referências

  • Os dados dos atores foram obtidos no site da IMDB
  • O melhor lugar para saber mais sobre o NetworkX e suas funções é a documentação

Se você quer aprender mais sobre análise de redes sociais em Python, faça o curso Analyzing Social Media Data in Python da DataCamp.

Tópicos
Python
Data Analysis

Saiba mais sobre Python e análise de dados

Curso

Analisando dados de mídias sociais em Python

4 h
24.4K
Neste curso, você vai aprender a coletar dados do Twitter e analisar textos, redes e origem geográfica do Twitter.
Ver detalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

Tutorial

21 ferramentas essenciais do Python

Aprenda sobre as ferramentas Python essenciais para o desenvolvimento de software, raspagem e desenvolvimento da Web, análise e visualização de dados e aprendizado de máquina.
Abid Ali Awan's photo

Abid Ali Awan

6 min

GNN

Tutorial

Uma introdução abrangente às redes neurais de grafos (GNNs)

Saiba tudo sobre Graph Neural Networks, inclusive o que são GNNs, os diferentes tipos de redes neurais de grafos e para que são usadas. Além disso, saiba como criar uma Graph Neural Network com o Pytorch.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Tutorial

Funções em Python: como chamar e escrever funções

Descubra como escrever funções em Python reutilizáveis e eficientes. Domine parâmetros, instruções de retorno e temas avançados como funções lambda. Organize melhor seu código com main() e outras boas práticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

Perfilamento do Pandas (ydata-profiling) em Python: Um guia para iniciantes

Saiba como usar a biblioteca ydata-profiling em Python para gerar relatórios detalhados para conjuntos de dados com muitos recursos.
Satyam Tripathi's photo

Satyam Tripathi

9 min

Tutorial

Tutorial de análise de sentimentos com NLTK para iniciantes

Tutorial de análise de sentimentos com NLTK (Natural Language Toolkit) em Python. Aprenda a criar e desenvolver análises de sentimentos usando Python. Siga etapas específicas para realizar a mineração e análise de textos e fazer o processamento de linguagem natural.
Moez Ali's photo

Moez Ali

13 min

Tutorial

Introdução ao t-SNE

Aprenda a visualizar dados de alta dimensão em um espaço de baixa dimensão usando uma técnica de redução de dimensionalidade não linear.
Abid Ali Awan's photo

Abid Ali Awan

14 min

Ver MaisVer Mais