Introdução geral à análise de redes sociais usando o R
Silvio Salej Higgins
Professor
Wellington Santos Souza
Monitor
🕷️🕸️ Roteiro da Apresentação
🚀 Pacotes e Estruturas de Dados
Edgelist, Matriz de Adjacência e Grafo Simples
📊 Visualização e Análise Básica
Plotagem: Básica e Personalizada
Funções: Vértices, Arestas, Conexões e Vizinhança
🕸️ Propriedades e Descrição das estruturas relacionais
Análise de Propriedades da Rede
Subgrafos e Métricas de coesão e centralidade
🚀 Pacotes Necessários
Vamos começar instalando e carregando os pacotes que usaremos hoje.
# pacote para manipulação de dadosif(!require(tidyverse)) install.packages("tidyverse"); library(tidyverse)# pacote para manipulação de redes sociaisif(!require(tidygraph)) install.packages("tidygraph"); library(tidygraph)# pacote para visualização de redes sociaisif(!require(igraph)) install.packages("igraph"); library(igraph)# pacote para visualização de redes sociaisif(!require(ggraph)) install.packages("ggraph"); library(ggraph)# pacote para leitura de arquivos Excelif(!require(readxl)) install.packages("readxl"); library(readxl)# pacote para visualização de tabelasif(!require(knitr)) install.packages("knitr"); library(knitr)if(!require(kableExtra)) install.packages("kableExtra"); library(kableExtra)# pacote para visualização de redes sociaisif(!require(networkD3)) install.packages("networkD3"); library(networkD3)# pacote para estatísticas descritivasif(!require(summarytools)) install.packages("summarytools"); library(summarytools)
1️⃣ Edgelist (Lista de Arestas)
Uma rede social (ou grafo) pode ser criada de várias formas no R.
A maneira mais comum é definir uma edgelist, ou seja, uma tabela com duas colunas onde cada linha representa uma interação (aresta) entre dois nós (vértices).
De
Para
Nó A
Nó B
Nó A
Nó C
…
…
📥 Importando os Dados
📂 Arquivo Fonte
data for learning ucinet.xlsx: disponível na pasta de dados do UCINET
Famílias Florentinas do Século XV
Temos duas redes: uma de casamentos e outra de negócios.
📊 Estrutura dos Dados
🌐 A Rede (Estrutura das Conexões)
💼💍 Os Atributos (Tipos de Laços)
Mapeia quem se conecta com quem
Classifica a natureza de cada laço usando colunas binárias (1 para Sim, 0 para Não)
From → To
PADGM: Laços de Casamento
PADGB: Laços de Negócios
👀 Espiando os Dados
Importando os dados de uma edgelist que contém as conexões entre as famílias florentinas.
📂 definir o caminho do arquivo
📂 definir a aba do arquivo
# Carregar os dadosdf <-read_excel("~/UCINET data/data for learning ucinet.xlsx",sheet ="families again")
📝 Estrutura dos Dados
FROM
TO
PADGM
PADGB
ACCIAIUOLI
MEDICI
1
0
ALBIZZI
GINORI
1
0
ALBIZZI
GUADAGNI
1
0
ALBIZZI
MEDICI
1
0
BARBADORI
CASTELLANI
1
1
BARBADORI
MEDICI
1
1
BISCHERI
GUADAGNI
1
1
BISCHERI
PERUZZI
1
1
🧩 Criando o arquivo de Rede
Existe uma função no pacote igraph que facilita a criação de um grafo a partir de uma edgelist.
g <-graph_from_data_frame(d = df, directed =FALSE)
ggraph(g, layout ="kk") +# Usando o layout Kamada-Kawaygeom_edge_link() +# Adiciona as arestasgeom_node_point() +# Adiciona os nóstheme_void() +# Remove o fundolabs(title ="Rede das Famílias Florentinas")
2️⃣ Matriz de Adjacência
Uma rede social também pode ser representada por uma matriz de adjacência, onde cada célula indica a presença ou ausência de uma conexão entre dois nós.
A matriz de adjacência é uma tabela onde as linhas e colunas representam os nós, e os valores indicam se há uma conexão entre eles (1) ou não (0).
Nó A
Nó B
Nó C
Nó A
0
1
1
Nó B
1
0
0
Nó C
1
0
0
📥 Importando a Matriz
📂 Arquivo Fonte
PADGETT_PADGM.csv: criei esse arquivo a partir do Ucinet. - Abra o Ucinet e carregue a rede. Vá para Matrix Editor > File > Open > Selecione o arquivo > Salve As > .csv.
# Carregar a matriz de adjacênciamatriz_adj <-read.csv("~/UCINET data/PADGETT_PADGM.csv", sep =",",row.names ="id")# 📝 Estrutura da Matriz de Adjacênciahead(matriz_adj)[1:6]
🧩 Criando o Grafo a partir da Matriz de Adjacência
# Transformar DF em matrizmatriz_adj <-as.matrix(matriz_adj)# Criar o grafo a partir da matriz de adjacênciag_padgm <-graph.adjacency(matriz_adj,mode ="undirected",diag = F)
️🕷️ Visualizando a Rede
ggraph(g_padgm, layout ="fr") +# Usando o layout Fruchterman-Reingoldgeom_edge_link() +# Adiciona as arestasgeom_node_point() +# Adiciona os nóstheme_void() +# Remove o fundolabs(title ="Rede das Famílias Florentinas")
3️⃣ Criando um grafo rápido diretamente no R
# Criar um grafo simplesg_simple <-graph_from_literal( A -+ B, B -+ C, C +-+ D, D -+ A, E -+ A, H -+ G, A +-+ G )
Aqui será gerado 2 códigos R: (I) PajekSource, pasta de localização do arquivo (II) PajekR que você pode rodar diretamente no RStudio.
🎨 Personalizando a Visualização da rede de Casamentos
# Converter para tidygraph para filtrar os laços de casamentog_tidy <-as_tbl_graph(g)padgm <- g_tidy |>activate(edges) |>filter(PADGM ==1) # Filtrar arestas de casamentoG1 =ggraph(padgm, layout ="kk") +geom_edge_link(alpha =0.5, color ="red") +geom_node_point(color ="blue", alpha =0.7, size =3) +geom_node_text(aes(label = name), repel =TRUE, size =3) +theme_void() +labs(title ="Rede de Casamentos das Famílias Florentinas")
🕷️ Visualizando a Rede
🎨 Personalizando a Visualização da rede de Negócios
G2 = g_tidy |>activate(edges) |>filter(PADGB ==1) |># Filtrar arestas de Negóciosggraph(layout ="kk") +geom_edge_link(alpha =0.5, color ="red") +geom_node_point(color ="blue", alpha =0.7, size =3) +geom_node_text(aes(label = name), repel =TRUE, size =3) +theme_void() +# Remove o fundolabs(title ="Rede de Negócios das Famílias Florentinas")
🕷️ Visualizando a Rede
🕷️ Visualizando a Rede usando o plot
plot(g)
🎨 Personalizando a Visualização usando o plot
plot(g_padgm,vertex.label.cex =0.5, # Tamanho dos rótulosvertex.size =20, # Tamanho dos nósvertex.color ="lightblue", # Cor dos nósedge.color ="gray", # Cor das arestasmain ="Rede de Casamento das Famílias Florentinas")
🕷️ Visualizando a Rede
🎨 Personalizando a Visualização usando o plot layout
# Ajustando o layoutg_padgm |>plot(vertex.label =NA, # Rótulos dos nósvertex.label.cex =0.5, # Tamanho dos rótulosvertex.size =10, # Tamanho dos nósvertex.color ="lightblue", # Cor dos nósedge.color ="gray", # Cor das arestaslayout =layout_in_circle(g), # Layout ajustadomain ="Rede de Casamento das Famílias Florentinas") # Título do gráfico
G3=ggraph(g_padgm, layout ="fr") +geom_edge_link() +geom_node_point(aes(size =degree(g_padgm, mode ="all")), color ="blue") +geom_node_text(aes(label = name), repel =TRUE, size =3, color ="red") +theme_void() +labs(title ="Centralidade de Grau das Famílias Florentinas")+scale_size_continuous(range =c(1, 15)) +# Ajusta o tamanho dos nóstheme(legend.position ="none") # Remove a legenda
🕸️ Plotando a Centralidade de Grau
📊 Descrição das estruturas relacionais (Centralidade (2))
G7=ggraph(g_padgm, layout ="fr") +geom_edge_link() +geom_node_point(aes(size =power_centrality(g_padgm, exponent =0.5)), color ="blue") +geom_node_text(aes(label = name), repel =TRUE, size =3) +theme_void() +labs(title ="Prestígio de Proximidade das Famílias Florentinas")+scale_size_continuous(range =c(1, 10)) +# Ajusta o tamanho dos nóstheme(legend.position ="none") # Remove a legenda
🕸️ Plotando o Prestígio de Proximidade
📝 Tabela com as métricas
tab=data.frame(Métrica =c("Número de nós","Número de relacões","Número de componentes","Densidade","Distancia geodésica média","Diâmetro"),Valor =c(round(gorder(g_padgm),0),round(gsize(g_padgm),0),round(components(g_padgm)$no,2),round(edge_density(g_padgm),2),round(mean_distance(g_padgm),0),round(diameter(g_padgm),0))) |> kableExtra::kbl(caption ="Métricas da Rede") |> kableExtra::kable_classic(full_width = T, html_font ="Cambria")
🪟️ Visualizando a Tabela
Métricas da Rede
Métrica
Valor
Número de nós
16.00
Número de relacões
20.00
Número de componentes
2.00
Densidade
0.17
Distancia geodésica média
2.00
Diâmetro
5.00
📝 Estatísticas Descritivas das Métricas
nos <-as.data.frame(V(g_padgm))# Centralidade de graunos$grau <-degree(g_padgm)# grau de intermediaçãonos$intermediacao <-round(betweenness(g_padgm),2)# grau de proximidadenos$proximidade <-round(closeness(g_padgm, normalized =TRUE), 2)# Centralidade de autovetornos$autovetor <-eigen_centrality(g_padgm)$vector