O texto a seguir, sobre análise de redes, foi publicado no meu blog aqui.

I — Introdução

Hoje, encerrando um ciclo, escrevo meu último texto do ano para o blog. Neste encerramento, busco aplicar análise de redes nos dados referente ao comércio internacional; para ser mais preciso, busco mapear as redes estabelecidas entre os Estados brasileiros exportadores com os países de destino (importadores). Nada além, de observar a relação dos vértices com o conjunto de ligações existente entre os vértices (arestas). Diga-se de passagem, vou deixar os códigos em R utilizados na análise no meu github, aqui

II — Dados

Os dados são do Ministério da Indústria, Comércio Exterior e Serviços

Estão disponíveis aqui

Base de dados detalhada por NCM: Arquivos CSV com separador ponto e vírgula (;) detalhado por ano, mês, código NCM, código da unidade estatística, código de país de destino/origem do produto, código da UF de origem/destino do produto, código da via de transporte, código da URF de embarque/desembarque, quantidade estatística, quilograma líquido, valor dólar FOB (US$)

Dados utilizados: de janeiro a novembro de 2020. Ou seja, a análise centra-se no ano de 2020.

III — Análise Exploratória

Antes de prosseguir e ir de encontro com meu objetivo, como de praxe, vou passar por uma rápida análise exploratória apenas para “mostrar” os dados. O dataset é relativamente pequeno (81 MB), com pouco mais de 1 milhão de linhas depois de importado, de qualquer modo vou utilizar os pacotes data.table, tidyverse e ggplot2 como manda a tradição — para importar, limpar, filtrar, organizar e visualizar. Vamos começar visualizando os dados das exportações brasileiras por Estado (agregado de janeiro a novembro de 2020) e depois visualizando desagregando mensalmente:

data_base<- fread("C:/Users/Piloto de Burrinha/Pictures/Curso IBPAD/Projetos/EXP_2020.csv")

paises <- read.csv("http://www.mdic.gov.br/balanca/bd/tabelas/PAIS.csv", sep = ";", encoding = "latin1")


# Limpando, organizando 

# Identificando os países de destino 

data_base<- na.omit(data_base)

data_base = merge(data_base, paises, by= c("CO_PAIS"))

data_base <- select(data_base, CO_MES, CO_PAIS, SG_UF_NCM, CO_PAIS_ISOA3, VL_FOB) 

data_base$CO_MES= factor(data_base$CO_MES,
  levels = c("1", "2","3", "4", "5", "6", "7", "8", "9", "10", "11"), 
   labels = c("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", 
     "Julho", "Agosto", "Setembro", "Outubro", "Novembro"))

sumarizando_export<-data_base %>%
  group_by(CO_PAIS_ISOA3, SG_UF_NCM, CO_MES)%>%
  summarise(Total_export := sum(VL_FOB)/10^9)%>%
  arrange(desc(Total_export))
## `summarise()` regrouping output by 'CO_PAIS_ISOA3', 'SG_UF_NCM' (override with `.groups` argument)
# Visualizando 

ggplot(sumarizando_export) +
  aes(x = SG_UF_NCM, y = Total_export) +
  geom_bar(stat="identity",fill='pink')+
  ylab("Em bilhões (US$)")+
  xlab("")+
  ggtitle("Exportações brasileiras por Estado - Janeiro a Novembro de 2020 - FOB (US$)")+
  xlim("SP", "MG","RJ","PA", "MT", "PR", "RS","GO","SC", 
       "BA", "MS", "ES", "MA","ND","CE","PE", "TO", "RO",
       "AM","PI", "AL", "AP","RN","RR", "DF", "PB", 
       "SE", "AC")+
  ylim(0, 40)+
  theme_bw()

# Janeiro, Fevereiro, Março

sumarizando_export %>%
  filter(!(CO_MES %in% c("Setembro", "Outubro", "Julho", "Novembro", 
  "Agosto", "Julho", "Junho", "Abril", "Maio"))) %>%
  ggplot() +
  aes(x = SG_UF_NCM, weight = Total_export) +
  geom_bar(fill = "pink") +
  coord_flip() +
  theme_bw() +
  facet_wrap(vars(CO_MES))+
  ylab("Em bilhões (US$)")+
  xlab("")+
  xlim("SP", "MG","RJ","PA", "MT", "PR", "RS","GO","SC", 
       "BA", "MS", "ES", "MA","ND","CE","PE", "TO", "RO",
       "AM","PI", "AL", "AP","RN", "DF", "PB", 
       "RR", "SE", "AC")+
  ggtitle("Exportações brasileiras mensais por Estado - FOB (US$)")

# Abril, Maio, Junho

sumarizando_export %>%
  filter(!(CO_MES %in% c("Setembro", "Outubro", "Julho", "Novembro", 
     "Agosto", "Julho", "Janeiro", "Fevereiro", "Março"))) %>%
  ggplot() +
  aes(x = SG_UF_NCM, weight = Total_export) +
  geom_bar(fill = "pink") +
  coord_flip() +
  theme_bw() +
  facet_wrap(vars(CO_MES))+
  ylab("Em bilhões (US$)")+
  xlab("")+
  xlim("SP", "MG","RJ","PA", "MT", "PR", "RS","GO","SC", 
       "BA", "MS", "ES", "MA","ND","CE","PE", "TO", "RO",
       "AM","PI", "AL", "AP","RN", "DF", "PB", 
       "RR", "SE", "AC")+
  ylim(0, 4)

  ggtitle("Exportações brasileiras mensais por Estado - FOB (US$)")
## $title
## [1] "Exportações brasileiras mensais por Estado - FOB (US$)"
## 
## attr(,"class")
## [1] "labels"
# Julho, Agosto, Setembro

sumarizando_export %>%
  filter(!(CO_MES %in% c( "Outubro", "Novembro", "Abril",
   "Janeiro", "Fevereiro", "Março", "Maio", "Junho"))) %>%
  ggplot() +
  aes(x = SG_UF_NCM, weight = Total_export) +
  geom_bar(fill = "pink") +
  coord_flip() +
  theme_bw() +
  facet_wrap(vars(CO_MES))+
  ylab("Em bilhões (US$)")+
  xlab("")+
  xlim("SP", "MG","RJ","PA", "MT", "PR", "RS","GO","SC", 
       "BA", "MS", "ES", "MA","ND","CE","PE", "TO", "RO",
       "AM","PI", "AL", "AP","RN", "DF", "PB", 
       "RR", "SE", "AC")+
  ylim(0,4)+
  ggtitle("Exportações brasileiras mensais por Estado - FOB (US$)")

# Outubro, Novembro 

sumarizando_export %>%
  filter(!(CO_MES %in% c("Setembro", "Julho", "Junho", "Maio", "Abril",
     "Agosto", "Julho", "Janeiro", "Fevereiro", "Março"))) %>%
  ggplot() +
  aes(x = SG_UF_NCM, weight = Total_export) +
  geom_bar(fill = "pink") +
  coord_flip() +
  theme_bw() +
  facet_wrap(vars(CO_MES))+
  ylab("Em bilhões (US$)")+
  xlab("")+
  xlim("SP", "MG","RJ","PA", "MT", "PR", "RS","GO","SC", 
       "BA", "MS", "ES", "MA","ND","CE","PE", "TO", "RO",
       "AM","PI", "AL", "AP","RN", "DF", "PB", 
       "RR", "SE", "AC")+
  ggtitle("Exportações brasileiras mensais por Estado - FOB (US$)")

Apenas os Top 10 primeiros exportadores (São Paulo, Minas Gerais, Rio de Janeiro, Pará, Mato Grosso, Paraná, Rio Grande do Sul, Goiás, Santa Catarina e Bahia) controlaram mais de 88% de participação nas exportações brasileiras. Sendo que apenas o Estado de São Paulo exportou, de janeiro a novembro de 2020, o equivalente a mais de 38 bilhões (US$), com isso, conseguindo fica com pouco mais de 20% de participação nas exportações. Aliás, conseguindo ficar em primeira posição nas exportações de janeiro a novembro (diferente de outros Estados que oscilaram de posição ao longo dos meses, por exemplo, observe nos meses de Julho, Agosto e Setembro com as oscilações entre Pará e Rio de Janeiro). Diga-se de passagem, a pequena parcela de NDs nos gráficos representam “Município Não Declarado” para os Estados. Feito essas primeiras visualizações, a seguir vou filtrar os Top 10 principais destinos das exportações brasileiras, segue o gráfico:

# Principais importadores do Brasil 

origem_importacao<-data_base %>% 
  group_by(CO_PAIS)%>%
  summarise(Total_export := sum(VL_FOB)/10^9)%>%
  arrange(desc(Total_export))
## `summarise()` ungrouping output (override with `.groups` argument)
origem_importacao <- left_join(origem_importacao, paises %>%
select(CO_PAIS, NO_PAIS), by = c("CO_PAIS" = "CO_PAIS"))%>%
  mutate(US_billions = round(origem_importacao$Total_export,
                             digits = 2))

# Os 10 principais destinos das exportações
mais_10<- dplyr::slice(origem_importacao, 1:10)


# Visualizar os 10 mais 

ggplot(mais_10) +
  aes(x = NO_PAIS, weight = US_billions) +
  geom_bar(fill = "pink") +
  coord_flip() +
  theme_bw()+
  ylab("Em bilhões (US$)")+
  xlab("")+
  xlim("China", "Estados Unidos", "Argentina", 
       "Países Baixos (Holanda)", "Espanha", "Japão", "Canadá",
       "Alemanha", "Chile", "México")+
  ggtitle("Top 10 Destinos das exportações brasileiras (2020, até novembro)")

Como esperado, seguindo a tendência de anos anteriores, apenas a China demandou mais de 30% das exportações brasileiras — equivalente a 63,2 bilhões (US$). A seguir, passo propriamente para o início do meu objetivo: observar as interações entre os Estados exportadores com seus respectivos destinos.

IV — Análise de Redes: métricas de centralidade

As redes ou grafos representam conjuntos de itens por vértices relacionados entre si, sendo as respectivas ligações estabelecidas entre os vértices chamadas de arestas. Na caso do dataset que estou analisando, busco, como já mencionado exaustivamente, observar a interação entre os Estados exportadores com seus respectivos importadores — e, por fim, observar algumas métricas básicas de centralidade. Para isso vou utilizar redes direcionadas, dado o sentido de orientação entre as arestas do dataset de exportadores para importadores (destino das exportações dos Estados). Utilizando o pacote igraph, com o formato edgelist, no qual cada linha representa um relacionamento de rede, aplico a análise de redes[1].

Aqui vou fazer o caminho inverso, vou calcular e interpretar algumas métricas de centralidade de redes antes de visualizar as redes. No cálculo das métrica serão utilizados todos os dados, totalizando 268 vértice. Não obstante, para a visualização será utilizado somente de 1% a 3% dos vértices que possuem maior grau de interação. Isso será feito, pois colocando todas as interações a rede ficaria poluída ao ponto de prejudicar sua visualização; e, em segundo, a distribuição de frequência do número de interações é muito discrepante, isto é, enquanto alguns Estados mantiveram muitas interações (por exemplo, São Paulo com Argentina), outros mantiveram poucas interações com seus respectivos destinos. Dificultando, assim, a visualização dos vértices. Dito isso, a seguir, passo para a exposição de algumas métricas que serão utilizada em sequência.

Há, na literatura de análise de redes e grafos, diversas métricas descritivas e de centralidade (Newmann, 2010). Aqui, vou aplicar duas das mais básicas: densidade e degree (in e out). A densidade representa:

“ […] a proporção de arestas existente na rede em relação a todas as arestas possíveis entre os vértices. Sendo uma proporção, esta quantidade varia entre 0 e 1, sendo que quanto mais próxima de 1 mais densa é rede” [2]

Matematicamente, a densidade pode ser dada da seguinte forma:

\[ D = \frac{2E}{N(N-1)} \]

Sendo \(E\) representando a quantidade de arestas e \(N\) o número de vértices.

O grau (degree) é uma métrica de centralidade bem simples, pois representa a quantidade de ligações que um vértice possui com outros dentro de uma rede. Desta forma consegue-se localizar os elementos mais influentes em uma rede. A centralidade traduz também a ideia de poder. Assim, quanto mais central o indivíduo, maior influência e poder terá na sua rede segundo Laranjeira & Cavique (2014, p. 5, apud Gama, 2012).

Como bem lembra Higgins & Ribeiro (2018), com redes direcionadas o grau nodal passar a ter duas medidas diferentes: in degree e out degree. Sendo que a primeira, in degree, representa o grau de entrada de quantas interações estabelece com o vértice i; enquanto, a segunda, out degree, representa o grau de saída de quantas interações o vértice i estabelece com os outros vértices ou nós.

V- Resultados das métricas de centralidade

Até o momento, apenas com a rápida análise exploratória e sem precisar entender nada de análise de redes, fica no mínimo implícito a influência que o Estado de São Paulo tem nas interações com o mercado externo. Bem, vamos ver se de fato isso ocorreu, ou melhor, como isso ocorreu.

# Análise de Rede

data_base$CO_MES = NULL 
data_base$CO_PAIS = NULL

# Excluindo redundância, agregando
new_base<-  data_base%>% 
  ungroup() %>% 
  count(SG_UF_NCM, CO_PAIS_ISOA3, sort = TRUE)

rede<- graph_from_data_frame(new_base, directed = T)


Vértices<-gorder(rede) # Vértices 
Densidade<-edge_density(rede)*100 # Densidade 

Direcionamento<-igraph::is.directed(rede) # Direcionamento 

tabela<- data.frame(Vértices, Densidade, Direcionamento)

Os resultado da primeira métrica pode ser observado a seguir. Observe que a densidade retornou aproximadamente 4,79. Indicando uma rede pouco densa, já que a densidade indica a relação entre a quantidade de arestas que uma rede possui e o total de ligações possíveis (considerando a sua quantidade total de vértices da rede). Em outras palavras: de todas as arestas que poderiam existir, considerando o número de vértices da rede, de fato apenas 4,79% existem na rede.

kable(tabela, caption = "Métricas da rede de comércio")
Métricas da rede de comércio
Vértices Densidade Direcionamento
268 4.787858 TRUE

Essa baixa densidade já era esperada, dado que há 28 Estados (incluindo os NDs) interagindo de forma direcionada com os seus respectivos destinos, não obstante, como já mencionado, alguns Estados mantiveram poucas interações. Sendo que, diminuindo o número de ligações, de arestas, os Estados não mantêm ligações entre si (de Estado brasileiro para Estado brasileiro). São considerado somente as interações dos Estados brasileiros com seus destinos no exterior. Explicado isso, passo para a próxima métrica: degree out e degree in.

# Métricas Básicas 

metricas <- data.frame(degree(rede, mode = "out"),
                      degree(rede, mode = "in", normalized = TRUE))
                      

colnames(metricas) <- c("Degree out",
                        "Degree in")
                       

kable(metricas[1:28, ], caption = "Métricas de Centralidade")
Métricas de Centralidade
Degree out Degree in
SP 227 0
PR 207 0
RS 219 0
SC 207 0
MG 182 0
RJ 185 0
ES 168 0
MA 82 0
PA 139 0
RR 18 0
BA 153 0
AL 88 0
CE 146 0
GO 170 0
PE 129 0
AM 103 0
AP 51 0
MS 149 0
MT 151 0
AC 40 0
RN 84 0
RO 98 0
DF 95 0
TO 77 0
PB 82 0
PI 54 0
SE 62 0
ND 60 0

Ao lado, podemos observar as métricas de graus. Aqui, como esperado, São Paulo apresentou o maior quantidade de ligações que um vértice possui com outros dentro da rede. São Paulo representa o maior grau de saída , isto é, de quantas interações o vértice estabelece com os outros vértices ou nós. Enquanto, por sua vez, todos os Estados possuem zero de grau de entrada, isto é, de arestas retornando para os Estados. Como mencionado anteriormente, o dataset considera apenas as saída das exportações dos Estados para seus destinos, então, já era esperado retornar zero como entrada. Seria diferente caso o dataset contemplasse os dados tanto de exportações quantos de importações dos Estados (entrada e saída). Feito isso, passamos para as visualizações. Começando com os vértices que possuem maior interação:

# Reduzindo a rede 

lim_inf <- quantile(new_base$n, prob = 0.99)
rede_reduzida <- new_base %>% filter(n > lim_inf)

# Rede
rede_reduzida<- graph_from_data_frame(rede_reduzida, directed = T)

plot(rede_reduzida, vertex.size = 20,
     vertex.color = "pink",
     edge.arrow.size=0.5,
     edge.width = 0.9, 
     edge.color = "gray",
     edge.lty = "dotted", 
     main="Estados brasileiros e o comércio Internacional", 
     sub="Com 1% dos vértices que possuem maior interação")

Isolando apenas São Paulo:

# Subgráfico 

grafo_sub <- subgraph.edges(rede_reduzida, 
                            E(rede_reduzida)[inc(c("SP"))])

plot(grafo_sub, vertex.color="pink",
     vertex.size=20, 
     main="Redes: Estado de São Paulo e o Comércio Externo", 
     sub="1% de interações",  edge.label.size=0.1)

A seguir pode-se observar o número de interação entre São Paulo e seus respectivos destinos (os números nas linhas de ligação representam o número de interações). Observe que, para minha surpresa e provavelmente para a sua, São Paulo manteve mais interações com a Argentina, por exemplo, que com a China:

plot(grafo_sub, 
     vertex.color="pink",
     vertez.size = 20, 
     edge.label.cex = 0.6,
     edge.arrow.size = 0.5,
     edge.label = E(rede_reduzida)$n, 
     main="Redes: com o número de interações", 
     sub="Com 1% dos vértices que possuem maior interação")

À guisa de conclusão, vamos aumentar para 2% e 3%, isto é, pegando os vértices que possuem 2% e 3% interações:

### Interações de 1% a 4% 

lim_inf <- quantile(new_base$n, prob = 0.98)
lim_inf <- quantile(new_base$n, prob = 0.97)

rede98 <- new_base %>% filter(n > lim_inf)
rede97 <- new_base %>% filter(n > lim_inf)

rede98<- graph_from_data_frame(rede98, directed = T)
rede97<- graph_from_data_frame(rede97, directed = T)

par(mfrow=c(1,1))

plot(rede98, vertex.size = 20,
     vertex.color = "pink",
     edge.arrow.size=0.5,
     edge.width = 0.9, 
     edge.color = "gray",
     edge.lty = "dotted", 
     main="", 
     sub="Com 2% dos vértices")

plot(rede97, vertex.size = 20,
     vertex.color = "pink",
     edge.arrow.size=0.5,
     edge.width = 0.9, 
     edge.color = "gray",
     edge.lty = "dotted", 
     main="", 
     sub="Com 3% dos vértices")

Notas

1

2

Referência Bibliográfica

Higgins, S.; Ribeiro, A. Análise de redes em Ciências Sociais. Brasília: ENAP, 2018.

Laranjeira, P.; Cavique, L. Métricas de Centralidade em Redes Sociais. Revista de Ciência da Computação, nº 9, 2014.

Newmann, M. Networks. Oxford University Press, 2010.