Michel Nascimento - 06/06/2020

Objetivo deste tutorial

Demonstrar de forma simples e rápida o processo de criação de mapas em python. Como exemplo prático, são utilizados dados sobre casos confirmados da COVID-19 no Brasil.

O que é preciso?

Apenas acesso à Internet ou ter o python instalado na máquina.

Neste último caso, basta escolher a IDE de prefência, Jupyter, PyCharm, Spyder, etc…

Se não possui e não quer instalar o python, basta acesssar o Google Colabs e continuar o tutorial!

Preparando o ambiente de trabalho

A primeira atividade é importar as ferramentas necessárias para poder trabalhar com o mapa.

# Para manipular dataframes
import pandas as pd
# Fazer alguns cálculos
import numpy as np
# Tratar o mapa
import folium
# Manipular arquivos json
import json

Em caso de estar utilizando o python e não ter alguns dos pacotes descritos, basta instalá-los através do instalador pip:

python3 -m pip install folium

python -m pip install pandas

Ou caso use o conda:

conda install -c conda-forge folium

Gerando o mapa base

Para gerar o mapa do pacote folium, basta executar o código abaixo e pronto! Uma base para o mapa já é renderizada.

mapa = folium.Map()

mapa_base

Acontece que para o objetivo do tutorial, a análise dos dados se dá especificamente no Brasil, para isso, deve-se customizar um pouco o mapa…

mapa = folium.Map(
    # centralização do mapa no Brasil
    location = [-14.2350, -51.9253],
    # zoom
    zoom_start = 4
)

mapa_brasil

E tem-se então uma base adequada para explorar os dados!

E os dados?

Para a analise, serão utilizados os dados fornecidos pelo brasil.io, que devem ser salvos em um dataframe usando o pandas.

df = pd.read_csv('https://brasil.io/dataset/covid19/caso?format=csv')

# visualizando alguns dados
df.head(5)
date state city place_type confirmed deaths is_last estimated_population_2019 city_ibge_code confirmed_per_100k_inhabitants death_rate
0 2020-04-12 MG Abaeté city 1 0.0 True 23237.0 3100203.0 4.30348 NaN
1 2020-04-12 MG Alfenas city 1 0.0 True 79996.0 3101607.0 1.25006 NaN
2 2020-04-12 MG Alpercata city 1 0.0 True 7424.0 3101805.0 13.46983 NaN
3 2020-04-12 MG Araguari city 7 0.0 True 117267.0 3103504.0 5.96928 NaN
4 2020-04-12 MG Arcos city 4 0.0 True 40092.0 3104205.0 9.97705 NaN

Como se vê, esses dados vêm separados por cidades e estados, já que a intenção é visualizar no mapa apenas os casos confirmados nos estados, a tabela é filtrada para se ter apenas as informações necessárias.

# filtrando a tabela, separando casos confirmados por estado
df_por_estados = df.loc[df.place_type == 'state', ['state', 'confirmed','is_last']]
# considerando apenas as últimas medições de cada estado
df_por_estados = df_por_estados.loc[df.is_last == True, ['state', 'confirmed']]
df_por_estados.head(5)
state confirmed
100 MG 806
106 AC 72
112 AL 48
131 AM 1049
135 AP 193

Como separar as regiões?

Neste exemplo, o mapa do Brasil deve estar separado visualmente pelas fronteiras de seus estados.

Primeiramente busca-se um json, este é um arquivo que contem dados sobre as linhas fronteiriças que separam os espaços dentro do mapa. Um exemplo pode ser encontrado aqui br_states, após o download desse arquivo deve-se adicioná-lo na mesma pasta em que o código está sendo executado.

A mesma coisa pode ser feita com os municípios, caso houvesse a intenção de se analisar algum estado apenas, bastaria utilizar um json previamente separado por municípios.

Os dados estão disponíveis na api do IBGE, basta usar o código do município aqui: malha IBGE.

# criando um objeto com os geo dados
dados_geo = json.load(open("br_states.json"))

Agora há um objeto para delineamento dos estados no mapa, é hora de usá-lo!

mapa = folium.Map([-14.2350, -51.9253], zoom_start=4)

folium.Choropleth(
    geo_data=dados_geo,
    # paleta de cores
    fill_color='YlGnBu',
    fill_opacity=0.3,
    line_weight=2,
    data = df_por_estados,
    columns = ['state', 'confirmed'],
    key_on = 'feature.id',
).add_to(mapa)

<folium.features.Choropleth at 0x24c7c5c1d68>

mapa_estados

Como pode-se perceber, os estados estão separados, porém as cores da legenda não parecem muito bem distribuídas, para resolver isso, utiliza-se uma técnica de normalização simples e comum, a escala logarítmica.

# normalizando os valores de casos confirmados
df_por_estados['confirmed'] = np.log(df_por_estados['confirmed'])

# Imprimindo novamente o mapa
mapaFim = folium.Map([-14.2350, -51.9253], zoom_start=4)

folium.Choropleth(
    geo_data=dados_geo,
    # utilizando outra paleta de cores
    fill_color='PuRd',
    fill_opacity=0.9,
    line_weight=2,
    data = df_por_estados,
    columns = ['state', 'confirmed'],
    key_on = 'feature.id',
    legend_name = "Casos em escala logarítmica"
).add_to(mapaFim)

<folium.features.Choropleth at 0x24c16fdd860>

mapa estados customizados

Agora o mapa apresenta uma boa divisão, também foram alteradas a opacidade e a paleta de cores.

Customização

A capacidade de customização de mapas com essa biblioteca é enorme, pode-se adicionar interatividade, animações, marcas, etc… O intuito do tutorial é trazer apenas uma forma simples e rápida de se iniciar no processo de renderização de mapas. Tem muita coisa legal aqui: Folium.

c.q.d

Fim