Mapa do Brasil em Python

08/03/2022

Linguagem Python

Famosa por sua diversidade de aplicações, a liguagem Python pode ser encontrada em scripts para rotinas da administração de servidores, em sites/aplicativos web e também em ferramentas para análise de dados.

Para quem está chegando agora no mundo da programação, um prática para ambientação sobre a sintaxe e a semântica dos dados é o Curso em Python disponível no site https://www.w3schools.com/python/. Com conceitos da linguagem e uma plataforma interna para teste dos comandos, é uma ótima alternativa de aprendizagem.

Por que usar mapa em vez de outros tipos de gráfico?

A ideia central é o apelo visual. A familiaridade que todos têm de mapa, desde as séries iniciais da educação, podem tornar a informação mais acessível e, consequentemente, melhorar a mensagem que se deseja passar. De modo a ilustrar esse pressuposto, consideremos um conjunto de dados, relativos a indicadores obstétricos e socioeconômicos, disponível em: https://github.com/wesleyz/mapa_brasil_plotyly/blob/main/dados_brutos_com_latitudes_obstetricos_ibge.csv.

O conjunto de dados utilizado foi construído a partir de dados oriundos do Censo Nacional – edições de 2000 e 2010, coletadas no sítio do Atlas Brasil, e de dados do Sistema de Informação sobre Nascidos Vivos (SINASC).

Haja visto que são 27 unidades federativas e os registros levam em consideração dois anos observados, o número de registros é de 54. A seguir, a lista de variáveis, por grupo.

Variáveis obstétricas:

  • Nascimentos – Quantidade de nascimentos
  • Porc_prematuros – Percentual de prematuros
  • Porc_cesareas – Percentual de cesáreas
  • Porc_grav_multipla – Percentual de gravidez múltiplas
  • Porc_anomalias – Percentual de anomalias
  • Porc_nenhuma_consulta – Percentual de nenhuma consulta
  • Porc_consulta7mais – Percentual de mais de 7 consultas
  • Porc_feminino – Percentual do sexo feminino
  • Porc_raca_mae_branca – Percentual de mãe com raça branca
  • Porc_raca_mae_negra – Percentual de mãe com raça negra
  • Porc_peso_menor_2500 – Percentual de peso menor de 2.5Kg
  • Porc_apgar1_menor_7 – Percentual de APGAR1 < 7
  • Porc_apgar5_menor_7 – Percentual de APGAR5 < 7

Variáveis socioeconômicas:

  • GINI – Mede o grau de desigualdade existente na distribuição de indivíduos segundo a renda domiciliar per capita. Seu valor varia de 0, quando não há desigualdade (a renda domiciliar per capita de todos os indivíduos tem o mesmo valor), a 1, quando a desigualdade é máxima (apenas um indivíduo detém toda a renda). O universo de indivíduos é limitado àqueles que vivem em domicílios particulares permanentes.
  • T_DES – Percentual da população economicamente ativa (PEA) nessa faixa etária que estava desocupada, ou seja, que não estava ocupada na semana anterior à data do Censo mas havia procurado trabalho ao longo do mês anterior à data dessa pesquisa.
  • T_ANALF15M – Taxa de analfabetismo – 15 anos ou mais
  • PAREDE – Percentual de pessoas em domicílios com paredes inadequadas
  • T_AGUA – Percentual da população em domicílios com água encanada
  • T_BANAGUA – Percentual da população em domicílios com banheiro e água encanada
  • AGUA_ESGOTO – Razão entre as pessoas que vivem em domicílios cujo abastecimento de água não provém de rede geral e cujo esgotamento sanitário não é realizado por rede coletora de esgoto ou fossa séptica e a população total residente em domicílios particulares permanentes multiplicado por 100. São considerados apenas os domicílios particulares permanentes.
  • T_LIXO – Percentual da população em domicílios com coleta de lixo

Tomando como exemplo a variável Porc_cesareas, uma visualização comum, usando um gráfico em barras, ficaria da seguinte forma:

Conhecendo a siglas, é fácil localizar o estado que se deseja verificar o índice. Contudo, comparado a visualização em mapa, fica nítida quão amigável a informação se torna.

Notadamente, o gráfico em mapa, com a mesma informação, tem um apelo informativo significativamente maior.

Bonito o mapa fica, mas como faz?

O Python tem uma biblioteca que facilita essa operação, chamada {dash}. Um exemplo pronto no formato jupyter-notebook está disponível em: https://github.com/wesleyz/mapa_brasil_plotyly/blob/main/OOBr_Tutorial_Gera%C3%A7%C3%A3o_de_Mapa_dos_Estados_Brasileiros_em_Python.ipynb.

Em linhas gerais, para este exemplo, o que se deve fazer para gerar o mapa é ter um conjunto de dados com os valores por estados brasileiros. Depois disso, vamos aos passos:

1) Importar as bibliotecas necessárias e carregamento das informações do mapa

import pandas as pd from urllib.request import urlopen import plotly print(plotly.version) import plotly as plty import plotly.express as px import json from urllib.request import urlopen

with urlopen(‘https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/brazil-states.geojson’) as response: Brazil = json.load(response) # Javascrip object notation

state_id_map = {} for feature in Brazil [‘features’]: feature[‘id’] = feature[‘properties’][‘name’] state_id_map[feature[‘properties’][‘sigla’]] = feature[‘id’]

dados = pd.read_csv(“dados_escalados_com_latitudes_obstetricos_ibge.csv”, sep=’;’).drop(‘UF.1’, axis=1) dados.head()

Caso não tenha as bibliotecas de geração de mapa instalado, basta rodar:

!pip install plotly –quiet !pip install -U plotly –quiet

2) Funções de impressão no mapa

Rodando este exemplo no ambiente do Google Colaboratory, é possível rodar a chamada abaixo, apresentando um formulário em javascript:

Definição da variável padrão

feat = ‘Porc_cesareas’

Estilo de mapa disponíveis

estil_map = [‘aggrnyl’, ‘agsunset’, ‘algae’, ‘amp’, ‘armyrose’, ‘balance’, ‘blackbody’, ‘bluered’, ‘blues’, ‘blugrn’, ‘bluyl’, ‘brbg’, ‘brwnyl’, ‘bugn’, ‘bupu’, ‘burg’, ‘burgyl’, ‘cividis’, ‘curl’, ‘darkmint’, ‘deep’, ‘delta’, ‘dense’, ‘earth’, ‘edge’, ‘electric’, ‘emrld’, ‘fall’, ‘geyser’, ‘gnbu’, ‘gray’, ‘greens’, ‘greys’, ‘haline’, ‘hot’, ‘hsv’, ‘ice’, ‘icefire’, ‘inferno’, ‘jet’, ‘magenta’, ‘magma’, ‘matter’, ‘mint’, ‘mrybm’, ‘mygbm’, ‘oranges’, ‘orrd’, ‘oryel’, ‘oxy’, ‘peach’, ‘phase’, ‘picnic’, ‘pinkyl’, ‘piyg’, ‘plasma’, ‘plotly3’, ‘portland’, ‘prgn’, ‘pubu’, ‘pubugn’, ‘puor’, ‘purd’, ‘purp’, ‘purples’, ‘purpor’, ‘rainbow’, ‘rdbu’, ‘rdgy’, ‘rdpu’, ‘rdylbu’, ‘rdylgn’, ‘redor’, ‘reds’, ‘solar’, ‘spectral’, ‘speed’, ‘sunset’, ‘sunsetdark’, ‘teal’, ‘tealgrn’, ‘tealrose’, ‘tempo’, ‘temps’, ‘thermal’, ‘tropic’, ‘turbid’, ‘turbo’, ‘twilight’, ‘viridis’, ‘ylgn’, ‘ylgnbu’, ‘ylorbr’, ‘ylorrd’]

Função para impressão do mapa

def imprime_mapa_by_features_plus(dados, feat, cluster, ano, estilo, animacao): #feat = “Nascimentos” if cluster != “”: dados_to_plot = dados.query(‘Cluster ==’ + str(cluster)) else: dados_to_plot = dados if ano != “”: dados_to_plot = dados_to_plot.query(‘Ano ==’ + str(ano)) if animacao == ‘Cluster’: dados_to_plot = dados_to_plot.sort_values(by=’Cluster’) else: dados_to_plot = dados_to_plot.sort_values(by=’Ano’)
if dados_to_plot.shape[0]>0: fig = px.choropleth( dados_to_plot, #soybean database locations = ‘Estado’, #define the limits on the map/geography geojson = Brazil, #shape information color = feat, #defining the color of the scale through the database color_continuous_scale=estilo, hover_name = ‘Estado’, #the information in the box hover_data =[feat,”Longitude”,”Latitude”], #title = “OOBr – Dados Socioeconômicos & Obstétricos – Cluster: ” + str(cluster) + ” – Ano ” + str(ano) , #title of the map title = “OOBr – Dados Socioeconômicos & Obstétricos – Valores Escalados ~N(0,1)”, #title of the map animation_frame = animacao #creating the application based on the year ) fig.update_geos(fitbounds = “locations”, visible = True)
fig.show()

A função imprime_mapa_by_features_plus( ) recebe os argumentos dados, variável, cluster, ano e tipo de animação. Com elas, renderizar-se as informações com a class dash plotly.

#@title Imprime Mapa

ano = “” #@param [“”, “2000”, “2010”] variavel = “Porc_cesareas” #@param [“Nascimentos”, “Porc_prematuros”, “Porc_cesareas”, “Porc_grav_multipla”, “Porc_anomalias”, “Porc_nenhuma_consulta”, “Porc_consulta7mais”, “Porc_feminino”, “Porc_raca_mae_branca”, “Porc_raca_mae_negra”, “Porc_peso_menor_2500”, “Porc_apgar1_menor_7”, “Porc_apgar5_menor_7”, “GINI”, “T_DES”, “T_ANALF15M”, “PAREDE”, “T_AGUA”, “T_BANAGUA”, “AGUA_ESGOTO”, “T_LIXO”, “CLUSTER”] cluster = “” #@param [“”, “0”, “1”, “2”, “3”, “4”, “5”] animacao = “Ano” #@param [“Ano”, “Cluster”] estilo = “solar” #@param [“aggrnyl”, “agsunset”, “algae”, “amp”, “armyrose”, “balance”, “blackbody”, “bluered”, “blues”, “blugrn”, “bluyl”, “brbg”, “brwnyl”, “bugn”, “bupu”, “burg”, “burgyl”, “cividis”, “curl”, “darkmint”, “deep”, “delta”, “dense”, “earth”, “edge”, “electric”, “emrld”, “fall”, “geyser”, “gnbu”, “gray”, “greens”, “greys”, “haline”, “hot”, “hsv”, “ice”, “icefire”, “inferno”, “jet”, “magenta”, “magma”, “matter”, “mint”, “mrybm”, “mygbm”, “oranges”, “orrd”, “oryel”, “oxy”, “peach”, “phase”, “picnic”, “pinkyl”, “piyg”, “plasma”, “plotly3”, “portland”, “prgn”, “pubu”, “pubugn”, “puor”, “purd”, “purp”, “purples”, “purpor”, “rainbow”, “rdbu”, “rdgy”, “rdpu”, “rdylbu”, “rdylgn”, “redor”, “reds”, “solar”, “spectral”, “speed”, “sunset”, “sunsetdark”, “teal”, “tealgrn”, “tealrose”, “tempo”, “temps”, “thermal”, “tropic”, “turbid”, “turbo”, “twilight”, “viridis”, “ylgn”, “ylgnbu”, “ylorbr”, “ylorrd”]

#@markdown — imprime_mapa_by_features_plus(dados,variavel, cluster,ano, estilo, animacao )

E voelá:

Tem sugestões, comentários e/ou dúvidas? Fale conosco em observatorioobstetricobr@gmail ou nas nossas redes, Twitter ou Instagram.