13. Dataviz Code Session: Dados Multidimensionais#

13.1. Objetivos da DCS#

  • Aplicar técnicas de dataviz para plotagem e manipulação de representações visuais de dados multidimensionais.

  • Elaborar RV para dados do comércio exterior, enfatizando a influência do Brasil sobre uma amostra de países do continente americano.

13.2. Ferramentas utilizadas#

  • Módulos Python

    • pandas

    • matplotlib

    • seaborn

    • plotly

    • os

    • sys

13.3. Aplicação do modelo referencial#

import plotly.express as px
from plotly.offline import plot
from IPython.display import display, HTML

import pandas as pd, matplotlib.pyplot as plt, seaborn as sb
import os
import sys; sys.path.insert(1,'../dcs')
import dcs24

plt.style.use('../etc/gcpeixoto-datavis.mplstyle') # style sheet

13.3.1. Dados de entrada pré-processados#

  • Carregamento de dados

# carrega valores para ano y
y = 2020

# planilhas
# imp: importação; exp: exportação; cc: códigos de países/blocos; tgt_dir: diretório-fonte dos dados
imp, exp, cc, _, tgt_dir = dcs24.get_comex(y)

# remove entradas duplicadas de países
cc = cc.drop_duplicates()

# dados do PIB anualizado de países de interesse (Banco Mundial)
GDP = pd.read_csv('../data/gdp-world-2021.csv')
COMEX files successfuly loaded from: ../data/comex-2020

13.3.1.1. Processamento adicional#

  • Agrupamento por valor FOB

Nota: FOB (Free On Board) é o valor monetário em USD da mercadoria comercializada desconsiderando frete e seguro.

FOB_imp = imp.groupby('País de origem')['Valor Free On Board'].sum()
FOB_exp = exp.groupby('País de destino')['Valor Free On Board'].sum()
  • Filtragem por comércio bilateral com países das Américas

americas = cc[cc['Nome do bloco'].str.find('América') == 0]

fimp, fexp = {}, {}

for i in americas['Código do país'].values:    
    
    try:
        country = americas[americas['Código do país'] == i]['Nome do país'].values[0]               
        block = americas[americas['Código do país'] == i]['Nome do bloco'].values[0]               
        
        fimp[country] = (FOB_imp[i],block)
        fexp[country] = (FOB_exp[i],block)
    finally:
        continue


fob = []
block = []
for v in fimp.values():
    fobi, blocki = v
    fob.append(fobi)
    block.append(blocki)

fobe = []
for v in fexp.values():
    fobi,_ = v
    fobe.append(fobi)

FOB = pd.DataFrame({'País':fimp.keys(),'Bloco':block,'FOB importado (USD)':fob,'FOB exportado (USD)':fobe})
  • Mesclagem de FOB com dados do PIB

FOB_GDP = FOB.merge(GDP,how='inner',on='País') # países com mesma pronúncia em PT e EN
FOB_GDP_2020 = FOB_GDP[FOB_GDP.columns[[0,1,2,3,6]]]
  • Criação de séries auxiliares

# PIB brasileiro
FOB_GDP_2020['GDP 2020 Brazil'] = GDP[GDP['País'] == 'Brazil']['GDP 2020'].values[0]

# parâmetros
FOB_GDP_2020['FOB_exp/GDP'] = FOB_GDP_2020['FOB exportado (USD)']/FOB_GDP_2020['GDP 2020']*100 # lambda 1
FOB_GDP_2020['FOB_imp/GDP_bra'] = FOB_GDP_2020['FOB exportado (USD)']/FOB_GDP_2020['GDP 2020 Brazil']*100 # lambda 2

# valores em escala
scale = 1e9 # billion dollars
FOB_GDP_2020['FOB importado (USD) scaled'] = FOB_GDP_2020['FOB importado (USD)']/scale
FOB_GDP_2020['FOB exportado (USD) scaled'] = FOB_GDP_2020['FOB exportado (USD)']/scale
FOB_GDP_2020['GDP 2020 Brazil scaled'] = FOB_GDP_2020['GDP 2020 Brazil']/scale
FOB_GDP_2020['GDP 2020 scaled'] = FOB_GDP_2020['GDP 2020']/scale

FOB_GDP_2020
País Bloco FOB importado (USD) FOB exportado (USD) GDP 2020 GDP 2020 Brazil FOB_exp/GDP FOB_imp/GDP_bra FOB importado (USD) scaled FOB exportado (USD) scaled GDP 2020 Brazil scaled GDP 2020 scaled
0 Argentina América do Sul 7897095769 8488738068 3.855402e+11 1.448560e+12 2.201778 0.586012 7.897096e+00 8.488738 1448.559976 385.540225
1 Aruba América Central e Caribe 78 28908881 2.610039e+09 1.448560e+12 1.107603 0.001996 7.800000e-08 0.028909 1448.559976 2.610039
2 Barbados América Central e Caribe 846002 11622811 4.671800e+09 1.448560e+12 0.248787 0.000802 8.460020e-04 0.011623 1448.559976 4.671800
3 Belize América Central e Caribe 258802 6501915 2.080000e+09 1.448560e+12 0.312592 0.000449 2.588020e-04 0.006502 1448.559976 2.080000
4 Chile América do Sul 2895554015 3849842523 2.527272e+11 1.448560e+12 1.523319 0.265770 2.895554e+00 3.849843 1448.559976 252.727194
5 Costa Rica América Central e Caribe 42248151 244195942 6.215800e+10 1.448560e+12 0.392863 0.016858 4.224815e-02 0.244196 1448.559976 62.158002
6 Cuba América Central e Caribe 3052129 209301226 1.073520e+11 1.448560e+12 0.194967 0.014449 3.052129e-03 0.209301 1448.559976 107.352000
7 Dominica América Central e Caribe 14826 2742069 5.042148e+08 1.448560e+12 0.543830 0.000189 1.482600e-05 0.002742 1448.559976 0.504215
8 Guatemala América Central e Caribe 48547341 256070608 7.762549e+10 1.448560e+12 0.329880 0.017678 4.854734e-02 0.256071 1448.559976 77.625487
9 Haiti América Central e Caribe 1109619 57319552 1.450822e+10 1.448560e+12 0.395083 0.003957 1.109619e-03 0.057320 1448.559976 14.508218
10 Honduras América Central e Caribe 10774506 103274579 2.382784e+10 1.448560e+12 0.433420 0.007129 1.077451e-02 0.103275 1448.559976 23.827841
11 Jamaica América Central e Caribe 891715 206461408 1.381243e+10 1.448560e+12 1.494751 0.014253 8.917150e-04 0.206461 1448.559976 13.812425
12 Peru América do Sul 730269814 1659787430 2.017051e+11 1.448560e+12 0.822878 0.114582 7.302698e-01 1.659787 1448.559976 201.705056
13 El Salvador América Central e Caribe 5297154 85167449 2.456302e+10 1.448560e+12 0.346730 0.005879 5.297154e-03 0.085167 1448.559976 24.563020
14 Suriname América Central e Caribe 2608842 31376040 2.911807e+09 1.448560e+12 1.077545 0.002166 2.608842e-03 0.031376 1448.559976 2.911807

13.4. Mapeamento#

  • Criação de scatterplot primário para visualizar relação de importação/exportação;

  • Uso de plot 3D para relacionar dados com GDP ou continente;

    • Bubbleplots como forma reduzida;

13.5. Visualização#

13.5.1. Iterando em RVs primárias#

  • Vamos plotar o gráfico de dispersão \(\lambda_i(y)\) vs. \(\lambda_e(y)\) para o ano \(y\), em que:

    • \(p\): país parceiro do Brasil com balança comercial ativa;

    • \(\lambda_i\): razão entre FOB importado do país \(p\) pelo Brasil e o PIB brasileiro;

    • \(\lambda_e\): razão entre FOB exportado para o país \(p\) pelo Brasil e o PIB do país \(p\);

Interpretação: \(\lambda_i\) mostra o nível de dependência comercial do Brasil do país \(p\) em relação à riqueza doméstica, ao passo que \(\lambda_e\) mostra o nível de influência comercial do Brasil sobre o país \(p\) em relação à riqueza estrangeira (Nota: parâmetros não oficiais.).

  • Gráfico de dispersão de parâmetros

    • Exploração básica dos parâmetros

    • Plotagem simples

    • Linha de referência (importação)

    • Considerações preliminares

import plotly.express as px
from plotly.offline import plot
import numpy as np
import pandas as pd
from IPython.display import display, HTML

fig = px.scatter_3d(FOB_GDP_2020, 
                    x='FOB_imp/GDP_bra', 
                    y='FOB_exp/GDP', 
                    z='GDP 2020 scaled', 
                    size='GDP 2020 scaled', 
                    color='Bloco',
                    hover_data=['País','FOB importado (USD) scaled','FOB exportado (USD) scaled'])
fig.update_layout(margin=dict(l=50, r=50, t=50, b=50),
                  font=dict(size=10))
plot(fig, show_link=False,filename=os.path.join(tgt_dir,'comex-example.html'))
display(HTML(os.path.join(tgt_dir,'comex-example.html')))
fig, ax = plt.subplots(figsize=(6,4),constrained_layout=True)
ax.plot(FOB_GDP_2020['FOB_imp/GDP_bra'],FOB_GDP_2020['FOB_exp/GDP'],'o');
ax.plot(FOB_GDP_2020['FOB_imp/GDP_bra'],FOB_GDP_2020['FOB_imp/GDP_bra'],'--g');
../_images/24-dcs-multidimensional_22_0.png
  • Visualização 3D: parâmetros x PIB

    • Problemas com plotagem 3D

      • Oclusão: elementos gráficos escondidos por overlap

      • Identificação: posição do elemento gráfico em relação ao eixo

    • Exploração de propriedades do plotly

fig = px.scatter_3d(FOB_GDP_2020, 
                    x='FOB_imp/GDP_bra', 
                    y='FOB_exp/GDP', 
                    z='GDP 2020 scaled', 
                    size='GDP 2020 scaled', 
                    color='Bloco',
                    hover_data=['País','FOB importado (USD) scaled','FOB exportado (USD) scaled'])
fig.update_layout(margin=dict(l=50, r=50, t=50, b=50),
                  font=dict(size=10))
plot(fig, show_link=False,filename=os.path.join(tgt_dir,'comex-example.html'))
display(HTML(os.path.join(tgt_dir,'comex-example.html')))
  • Scatterplot + país (cor)

    • Adicionando cor para identificar país

    • Paleta de cor adequada?

fig, ax = plt.subplots(figsize=(6,4),constrained_layout=True)
f = sb.scatterplot(data=FOB_GDP_2020.sort_values('País'),x='FOB_imp/GDP_bra', y='FOB_exp/GDP', 
                   hue='País', palette='Oranges',
                   legend='brief', ax=ax)
ax.legend(loc='upper right', bbox_to_anchor=(1, 1.6),ncol=4)
ax.set_axisbelow(True) # below grid lines
../_images/24-dcs-multidimensional_26_0.png
  • Scatterplot + PIB (tamanho)

    • Redução de dimensionalidade associando PIB com tamanho

    • Formação do bubbleplot

    • Estudo:

      • size, sizes

      • bbox_to_anchor

      • set_axis_below

    • Problemas?

min_gdp = min(FOB_GDP_2020['GDP 2020 scaled'])
max_gdp = max(FOB_GDP_2020['GDP 2020 scaled'])

fig, ax = plt.subplots(figsize=(6,4),constrained_layout=True)
f = sb.scatterplot(data=FOB_GDP_2020.sort_values('País'),x='FOB_imp/GDP_bra', y='FOB_exp/GDP', 
                   size='GDP 2020 scaled', palette='Oranges', sizes = (min_gdp,max_gdp),
                   legend='brief', ax=ax)
ax.set_axisbelow(True) # below grid lines

plt.legend(loc='upper right', bbox_to_anchor=(1, 1.2),ncol=4);
../_images/24-dcs-multidimensional_28_0.png

13.6. RV finalística#

  • Bubbleplot

    • Associação de cor a país, tamanho a PIB

    • Melhoria da estétitca

fig, ax = plt.subplots(figsize=(6,4),constrained_layout=True)

# bubble plot
f1 = sb.scatterplot(data=FOB_GDP_2020,x='FOB_imp/GDP_bra', y='FOB_exp/GDP', 
                   hue='País', alpha=1.0, 
                   size='GDP 2020 scaled', sizes = (min_gdp/2,max_gdp/2),
                   palette='Oranges',
                   legend='brief', 
                   ax=ax)

# line plot
f2 = sb.lineplot(data=FOB_GDP_2020,x='FOB_imp/GDP_bra', y='FOB_imp/GDP_bra', 
                color='black',linestyle='--',alpha=0.5, linewidth=1.0, 
                ax=ax)

# decoração
ax.set_axisbelow(True) # below grid lines
ax.axis('tight')

ax.annotate('Limiar de equilíbrio',xy=(0.3,0.35),color='black',alpha=0.5, rotation=12)
ax.legend(loc='upper right', bbox_to_anchor=(1.5, 1.0),ncol=1, fontsize=8)

ax.set_xlabel('$\lambda_i$')
ax.set_ylabel('$\lambda_e$')

fig.suptitle('Influência: Brasil > Países (Ano 2020)')
ax.set_title('(GDP em bilhões USD)',fontsize=8);
../_images/24-dcs-multidimensional_31_0.png