Redes en el comercio internacional

Aplicación de la teoría de redes a las relaciones comerciales entre países. Este post busca describir un dashboard de redes comerciales que cree y, al mismo tiempo, probar el funcionamiento de python en Rstudio.

Karina Bartolomé https://ar.linkedin.com/in/karinabartolome
01-20-2021

Introducción

Este post indica cómo se generaron los grafos del dashboard 🚢 Redes comerciales. Por otro lado, se busca generar un informe en donde variables de entorno interactuan entre lenguajes (R y Python) desde el IDE Rstudio.

📚 Librerías

library(dplyr)
library(gt)
library(ggplot2)
library(plotly)
import pandas as pd
from math import log, floor
import numpy as np
from pyvis.network import Network

📊 Datos

Los datos fueron obtenidos de tradestatistics1, un paquete que permite acceder a api.tradestatistics.io de forma sencilla. Se realiza la lectura del dataframe con R, para utilizar el paquete gt para visualizar las tablas.

Show code
df <- read.csv('data/df.csv')
df %>% 
  filter(reporter=='Argentina') %>% 
  head() %>% 
  gt() %>% 
  tab_header('Datos de comercio exterior, 2018')
Datos de comercio exterior, 2018
reporter partner section export_value_usd continent_reporter continent_partner
Argentina Afghanistan Animal Products 762411 Americas Asia
Argentina Afghanistan Vegetable Products 48145 Americas Asia
Argentina Afghanistan Animal and Vegetable Bi-Products 148453 Americas Asia
Argentina Afghanistan Unspecified 164137 Americas Asia
Argentina Angola Vegetable Products 10938605 Americas Africa
Argentina Angola Animal and Vegetable Bi-Products 4484919 Americas Africa

Por secciones se puede ver que el mayor valor de exportaciones se da en Machines ⚙️

Show code
(df %>% 
  group_by(section) %>% 
  summarise(exports = sum(export_value_usd)/1000000) %>% 
  ggplot(aes(x=reorder(section, exports), y=exports, fill=exports))+
  geom_col()+
  coord_flip()+
  theme_minimal()+
  scale_fill_gradient(low='#E36BF4',high='#5F96ED',)+
  labs(x='', y='Exportaciones (millones de dólares)', 
       title='Valor de las exportaciones por sección')+
   theme(legend.position='none')
 ) %>% 
  ggplotly() %>% 
  layout(
      xaxis = list(fixedrange = TRUE, showgrid = T), 
      yaxis = list(fixedrange = TRUE, showgrid = F)
    ) %>% 
  hide_legend()

Se utilizará una función definida como human_format para darle formato a los números de valores de exportaciones.

Show code
def human_format(number):
    if number!=0:
        units = ['', 'K', 'M', 'G', 'T', 'P']
        k = 1000.0
        magnitude = int(floor(log(number, k)))
        return '%.1f%s' % (number / k**magnitude, units[magnitude])
    else:
        return 0

⚡Redes comerciales

Utilizando python se obtiene una lista de las secciones (valores únicos). Notar que el df había sido importado con código R, y para llamarlo se utiliza r.df.

Show code
sections = list(pd.DataFrame({
  'section': r.df['section'].unique()}).sort_values('section').section)

Se filtra el df por un sector específico para generar la red de comercio de este sector.

Show code
dffilt = r.df[r.df.section=='Machines'].copy()

Se generan los vértices de los grafos:

Show code
vertices= (dffilt
  .groupby(['reporter','continent_reporter'], as_index=False)
  .export_value_usd
  .sum()
  .copy()
  )
vertices.columns = ['pais','continente','export_value_usd']

Se visualizan estos datos (generados con python) mediante código en R con gt. En este caso, para utilizar el pandas dataframe vertices con R se utiliza py$vertices.

Show code
py$vertices %>% head() %>% gt() %>% 
  tab_header('Vertices')
Vertices
pais continente export_value_usd
Afghanistan Asia 441904
Albania Europe 1907127
Algeria Africa 902838
American Samoa Oceania 1313000
Andorra Europe 2329914
Angola Africa 564364

Se generan los vértices faltantes (a pesar de no haber exportado es necesario definirlos para que luego tomen el color del continente al que pertenecen).

Show code
vertices2=dffilt.loc[~dffilt.partner.isin(vertices.pais.unique()),
                     ['partner','continent_partner']]
vertices2['export_value_usd']=0
vertices2.columns = ['pais','continente','export_value_usd']
vertices = pd.concat([vertices,vertices2],axis=0)

Se asignan colores por continente:

Show code
vertices['color'] = np.select([vertices.continente == 'Asia', 
                               vertices.continente == 'Africa', 
                               vertices.continente == 'Americas',
                               vertices.continente == 'Europe',
                               vertices.continente == 'Oceania'],
                               ['#FB8455','#E36BF4','#62D5F0','#5F96ED','#18AE95'],
                               default='other')

Se utiliza la función human_format para mejorar el formato de las exportaciones.

Show code
vertices['label']=[human_format(i) for i in vertices.export_value_usd]

Se filtra por una cantidad menor de datos para que la visualización renderize más rápido:

Show code
dffilt = (dffilt
  .sort_values('export_value_usd',ascending=False)
  .head(200)
  .reset_index(drop=True)
  .copy()
  )

Layout de los grafos:

Show code
network = Network(
  bgcolor="white",
  font_color="black",
  notebook=False,
  directed=True, 
  height="750px", 
  width="100%"
  )
network.set_options("""
var options = {
  "nodes": {
    "borderWidth": 0,
    "borderWidthSelected": 4,
    "fixed": {
      "x": false,
      "y": false
    },
    "font": {
      "size": 13,
      "strokeWidth": 3
      
    },
    "shape": "dot"
  },
  "edges": {
       "color": {"inherit": true},
       "smooth": {"type": "horizontal", 
                  "type": "continuous",
                  "forceDirection": "none", 
                  "roundness": 0},
       "arrows": {"to": {"enabled": true}},
       "arrowStrikethrough": false,
       "selectionWidth": 7
  },
  "interaction": {
    "dragNodes": true,
    "hideEdgesOnDrag": false
  },
  "physics": {
       "enabled": true,
       "barnesHut": {"gravitationalConstant": -40000, "springLength": 100,
                     "springConstant": 0.01},
       "minVelocity": 0.75,
       "maxVelocity": 50
 }
}
""")  

En este momento se asignan los datos a la red (network) generada anteriormente.

Show code
edge_data = zip(dffilt['reporter'], dffilt['partner'], dffilt['export_value_usd'])
for e in edge_data:
    src = e[0]
    dst = e[1]
    w = e[2]
    network.add_node(src, src, title=src)
    network.add_node(dst, dst, title=dst)
    network.add_edge(src, dst, value=w)
for node in network.nodes:
    if node['id'] in list(vertices['pais']):
        node['value']=int(vertices.loc[vertices.pais==node['id'],'export_value_usd'].values[0])
        node['title']=node['title']+"<br>Export: "+str(vertices.loc[vertices.pais==node['id'],'label'].values[0])
        node['color']=str(vertices.loc[vertices.pais==node['id'],'color'].values[0])

El grafo se almacena como html:

Show code
network.show("grafo.html")

La siguiente visualización es una de las visualizaciones incluidas en Redes comerciales. En este caso, para Machines, la sección con mayor valor de exportaciones en USD en 2018.

Show code
htmltools::includeHTML("grafo.html")


  1. tradestatistic package on CRAN↩︎

References

Citation

For attribution, please cite this work as

Bartolomé (2021, Jan. 20). Karina Bartolome: Redes en el comercio internacional. Retrieved from https://karbartolome-blog.netlify.app/posts/RedesComerciales/

BibTeX citation

@misc{bartolomé2021redes,
  author = {Bartolomé, Karina},
  title = {Karina Bartolome: Redes en el comercio internacional},
  url = {https://karbartolome-blog.netlify.app/posts/RedesComerciales/},
  year = {2021}
}