Utilizando técnicas de redes complexas para analisar ciclos sociais do Facebook

Matheus Ricardo dos Santos
7 min readDec 15, 2020

Neste artigo será feita uma análise de uma rede ego do facebook juntamente com um tutorial de como modelar a rede para uma melhor visualização no Gephi.

Também foi gravado um vídeo contextualizando a anásile e explicando os resultados obtidos: https://www.loom.com/share/76b58ff145434fbc84895034adde6a9f

1. Dados Utilizados

Os dados utilizados foram extraídos por B. F. Maier e são referentes à sua rede não-direcionada de amigos do facebook. A base de dados encontra-se disponível no seguinte domínio: https://networks.skewed.de/net/facebook_friends.

A rede possui 362 nós e 1988 conexões (arestas).

Cada nó da rede é referente a um amigo adicionado em seu facebook e cada conexão é uma relação de amizade entre outros nós da rede. Os nós podem pertencer a diferentes contextos sociais, sendo os principais:

  • uni (universidade)
  • erasmus (programada de bolsas de mestrado na Europa)
  • school (escola)
  • choir (coro ou orquestra)
  • studienstiftung (Fundação Alemã de Bolsas de Estudo Acadêmico)
  • family (família)

2.Importando os dados no Gephi

Na maioria das vezes não é fácil visualizar a relação entre os nós da rede olhando apenas para os dados que a compõe. Por isso, precisamos utilizar alguma ferramenta capaz de diferenciar os tipos de cada nó e agrupá-los de acordo com suas caracteristicas. Com o Gephi podemos rapidamente resolver estes problemas.

O Gephi é uma ferramenta para a visualização e modelagem de redes complexas. Ele possui algoritmos já implementados para o tratamento das redes e suporta uma grande variedade de formatos de arquivos.

O primeiro passo é importar os arquivos csv. Para isso, basta acessar a aba Laboratório de dados > Importar planilha. Isto deve ser feito para os nós e para as conexões (arestas):

Após a importação da rede o resultado será algo similar à imagem abaixo. Para colorir os nós basta selecionar a aba partition, escolher o atributo context_0 e clicar em aplicar:

Agora que colorimos os nós, precisamos agrupá-los de acordo com as suas relações. Para isto, utilizaremos o algoritmos de Fruchterman Reingold. Após selecionar a opção, clique no botão executar até que os nós estejam agrupados de uma maneira agradável:

Por fim, é possível alterar o tamanho dos nós de acordo com o grau (número de conexões) e aumentar a largura das conexões através dos menus destacados abaixo.

Com estas alterações já podemos ter uma melhor noção de como a rede se organiza. É possível perceber que existem 6 grupos em destaque: uni, school, erasmus, family, studienstiftung e choir. Parte do grupo family parece estar isolado do resto da rede e os grupo choir e school parecem ser bastante densos.

Após a análise inicial, precisamos exportar os dados da rede para podermos extrair algumas métricas quantitativas. Para isso, basta exportar o projeto com a extenção graphml.

3.Extraindo métricas globais

Primeiramente vamos extrair as métricas globais da rede. Para extrair as métricas quantitativas utilizaremos a biblioteca networkx do python.

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
G = nx.Graph(nx.read_graphml('network.graphml'))

A primeira métrica a ser analisada é a densidade da rede. Ela diz respeito à razão da quantidade de conexões existentes com a quantidade de conexões possíveis:

nx.density(G) # 0.03042500114782449

Uma densidade de 0.03 significa que a cada 100 conexões possíveis 3 existem.

Outra métrica global importante é o average clustering da rede. Esta métrica mede a razão entre de triângulos existentes que contém o nó ego da rede sobre a quantidade de triangulos possíveis que também contém o nó ego. Como estamos falando de average isto significa que esta métrica é aplicada a cada nó da rede considerando-o um nó ego. O resultado é a média dos coeficientes de cluster de cada nó.

acc = nx.average_clustering(G) # 0.5812389693504316

Uma média de clustering de 0.58 indica que em geral os nós que compõem as redes ego de cada nós são bastante interligados entre si. Isto pode indicar que geralmente quando dois nós se conectam a um mesmo nó, a probabilidade desses dois nós se conectarem é grande (probabilidade de 58%).

Outra forma de visualizar estas métricas é comparando o coeficiente de clustering com o grau de cada nó.

global_degree_clustering = np.asarray([[G.degree(node), nx.clustering(G, node)] for node in G])degree = global_degree_clustering[:, 0]
clustering = global_degree_clustering[:, 1]
plt.scatter(degree, clustering)
plt.xlabel("degree")
plt.ylabel("clustering")
plt.show()
plt.hist(degree)
plt.xlabel("Degree")
plt.ylabel("Frequency")
plt.show()
plt.hist(clustering)
plt.xlabel("Clustering")
plt.ylabel("Frequency")
plt.show()
Gráficos 1: Scatter plot do coeficiente de clustering por grau
Gráfico 2: Histograma do grau de cada nó
Gráfico 3: Histograma do coeficiente de clustering de cada nó

Com base nos gráficos gerados acima podemos fazer algumas análises:

  • Gráfico 1: podemos perceber que quanto maior o grau de um nó menor é o seu coeficiente de clustering. Isto significa que a probabilidade de nós que se conectam com nós estrela (alto grau) estarem também conectados é baixa. Enquanto nós que são menos “famosos” (menor grau) possuem uma alta taxa de conexão entre os nós que se conectam a eles.
  • Gráfico 2: a grande maioria dos nós possui grau entre 0 e 10.
  • Gráfico 3: a maioria dos nós possui coeficiente de clustering acima de 0.5. No entanto, existe uma grande quantidade de nós com coeficiente ente 0 e 0.1. Isto nos mostra que a maioria dos nós ou tem um coeficiente muito alto ou muito baixo.

4.Extraindo métricas por contexto

Também é possivel extrair as métricas acima referentes a cada subrede formada pelos diferentes contextos.

O código abaixo extrai o grau e o clustering médio de cada subrede:

def get_metric_by_class(class_name, graph):
result = []
for node in graph:
if graph.nodes[node]['context_0'] == class_name:
result.append([graph.degree(node), nx.clustering(graph, node)])
np_result = np.asarray(result)
degree_mean = np_result[:, 0].mean()
clustering_mean = np_result[:, 1].mean()
return [degree_mean, clustering_mean]

Plotando os resultados:

Podemos perceber que os resultados obtidos na analise anterior se repetem para os contextos de family e erasmus: redes com grau médio baixo possuem um coeficiente de clustering médio alto. No entanto, este padrão não se repete para o contexto de choir que possui um grau médio alto e um coeficiente de clustering alto.

Também podemos criar algumas métricas com base em suposições que surgem ao longo da análise da rede. Por fim, vamos verifica para cada subrede o quanto que elas se conectam com nós de outros contextos (de outras subredes). Para isso, vamos calcular a razão entre o número de conexões de uma subrede sobre as coneções desta mesma rede com alguma outra de diferente contexto.

def outer_edges_percentage(class_name, graph):
n_edges = 0
n_outer = 0
for n1, n2 in graph.edges:
node1_context = graph.nodes[n1]['context_0']
node2_context = graph.nodes[n2]['context_0']
if node1_context == class_name or node2_context == class_name:
n_edges+=1
if (node1_context != node2_context):
n_outer+=1
print(n_edges, n_outer, class_name)
return n_outer / n_edges

Com base na imagem acima, podemos concluir que as redes mais mais isoladas são as de contexto school e choir. Já a rede uni é a que mais se conecta com outros nós.

Outro ponto interessante para ressaltar é que a subrede de contexto family aparentemente, com base na imagem gerada pelo Gephi, não apresentava conexão com outros nós de outros contexto. No entanto, ela possui uma subrede totalmente isolada e outra que se conecta com nós de outros contextos. Provavelmente elas representam parentes de diferentes famílias (parentes maternos e paternos que não necessariamente se conhecem).

Conclusão

Neste artigo foram abordadas técnicas visuais para modelagem e estilização de redes juntamente com a aplicação de métricas importantes para a compreenção da formação e da identificação de padrões. Tais técnicas foram utilizadas como uma poderosa ferramenta para compreender o cliclo de relações sóciais de um individio. No entanto, é imporante ressaltar que seu campo de atuação é muito mais amplo do que apenas redes sociais.

Referências

B. F. Maier and D. Brockmann, “Cover time for random walks on arbitrary complex networks.” Phys. Rev. E 96, 042307 (2017)

--

--