Visualizacao de dados geograficos usando Python e mplleaflet
Em tempos como esses, em que vivemos uma pandemia generalizada, os dados são de grande importância para termos real noção da nossa situação e, como trata-se de uma situação global os dados geográficos são de fundamental importância para melhor planejarmos nossas ações.
Neste exemplo vamos usar python, matplotlib, pandas e o mplleaflet para apresentarmos dados sobre a situação do covid-19 no Brasil em um mapa interativo, os datasets utilizados serão disponibilizados ao final do artigo.
Oque é o mplleaflet
Mplleaflet é uma biblioteca do python que converte plots do matplotlib em mapas leaflet, escrito e mantido por Jacob Wasserman
(https://github.com/jwass), esta biblioteca nos permite apresentar mapas geográficos interativos em vários formatos de forma simples e pratica.
Inner Join
Uma cláusula join da SQL - correspondente a uma operação de junção em álgebra relacional - combina colunas de uma ou mais tabelas em um banco de dados relacional. Ela cria um conjunto que pode ser salvo como uma tabela ou usado da forma como está. Wikipédia
Plotando dados geográficos
Primeiro precisamos realizar a importação de todas as bibliotecas que iremos utilizar.
import matplotlib.pyplot as plt: Fazemos o import da biblioteca responsável por plotar os em nosso mapa.
import pandas as pd: Utilizamos o pandas para tratarmos os dados presentes no dataset.
import mplleaftlet as mll: Por ultimo realizamos o import da biblioteca responsável por nos fornecer os mapas interativos.
Usaremos dois datasets, um contendo todos os dados sobre o covid-19 no Brasil e outro com os dados geográficos que precisaremos para plotar as informações no lugar correto, ao final criaremos um único dataframe utilizando os dois para centralizar a informação. Antes, vamos analisar e formatar os dois dataframes para que se adequem melhor as nossas necessidades.
Primeiro, vamos importar e tratar o primeiro dataset.
covid_info = pd.read_csv('covid19_df.csv'): Utilizamos o método 'read_csv' do pandas para ler o dataset e carrega-lo em um dataframe.
covid_info.drop(['date', 'estimated_population_2019', 'confirmed_per_100k_inhabitants', 'death_rate'], axis=1, inplace=True): Depois que carregamos o dataframe precisamos limpar ele, retiramos as colunas que não são do nosso interesse para que elas não sejam passadas para nosso dataframe resultante, fazemos isso usando o método 'drop' do pandas, ele remove as colunas que passarmos a ele como parâmetro, nesse caso, estamos passando uma lista de colunas. O segundo parâmetro 'axis=1' e utilizado para definirmos que a exclusão vai acontecer baseada nas colunas, caso quiséssemos para as linhas, seria 'axis=0'. O terceiro parâmetro, 'inplace=True' substitui o dataframe resultante na própria variável que esta sendo trabalhada.
covid_info = covid_info[covid_info.is_last == True]: Se formos analisar o dataset, perceberemos que os dados de cada cidade formam uma serie temporal, representando a evolução das confirmações dentro de um período de tempo, contudo, para nosso objetivo queremos apenas o registro mais recentes. Observando de novo o dataset percebemos a coluna 'is_last' com valores que variam de True e False, sendo que o valor True é encontrado apenas nos registro mais atualizados, logo esta coluna e utilizado para indicar o ultimo registro para cada cidade. Fazemos então um filtro de seleção, substituímos o dataframe por um novo, contendo apenas os registros que tiverem valor True para a coluna 'is_last'.
covid_info.rename(columns={'city_ibge_code': 'codigo_ibge'}, inplace=True): Pra facilitar a compreensão de um processo que iremos realizar depois, renomeamos a coluna 'city_ibge_code' para 'codigo_inge', visto que vamos usar essa coluna para realizar um join entre nossos dois dataframes.
Agora com o dataset sobre covid-19 já carregado e formatado, podemos partir para trabalhar no sobre municípios.
cities_info = pd.read_csv('municipios.csv'): Carregamos o dataset em forma de dataframe em nossa aplicação.
cities_info.drop(['nome', 'codigo_uf', 'capital'], axis =1, inplace=True): Da mesma forma que fizemos com o dataframe sobre o covid-19, retiramos as colunas que não vamos precisar, para termos um resultado mais limpo.
Ao final deste processo, temos dois dataframes separados que dependem um do outro para serem utilizados em um mapa, visto que no dataset sobre covid-19 não tínhamos as coordenadas geográficas necessárias para localizarmos os pontos no mapa. Vamos então juntar os dois dataframes em um único, atrevés do processo de inner join, uma operação de junção de álgebra relacional para combinarmos as colunas dos nossos dois dataframes usando uma coluna de relacionamento. Lembra que renomeamos a coluna do dataframe sobre covid-19 de 'city_ibge_code' para 'codigo_ibge'? Então, esta e a coluna esta presente em ambos os conjuntos de dados, nos permitindo relacionar cada registro entre si.
![https://miro.medium.com/max/502/1*rDqwYOJvUjWLBozBIAfdAQ.png](https://miro.medium.com/max/502/1*rDqwYOJvUjWLBozBIAfdAQ.png)
Vamos ao código.
merged_df = pd.merge(left=covid_info, right=cities_info, left_on='codigo_ibge', right_on='codigo_ibge'): O método 'merge' é o responsável por realizar o processo de inner join. Primeiro definimos em que lado cada dataframe vai estar, neste caso a esquerda/left o dataframe sobre covid-19 e a direita/right o sobre cidades. Próximo passo é especificarmos qual coluna será utilizada no relacionamento para o join, como explicado antes, a coluna 'codigo_ibge' servirá para este propósito. O método vai resultar em um dataframe novo juntando todas as colunas de ambos os dataframes, lembrando que a coluna usada para o join não será duplicada.
merged_df = merged_df[merged_df.place_type == 'city']: Da mesma forma que fizemos antes, filtramos nosso dataframe para ficarmos apenas com os registros que representam cidades.
Com tudo carregado e formatado, precisamos apenas apresentar nosso mapa e os pontos em cada cidade. Para os pontos usaremos um gráfico do tipo espalhamento, impressos em um plano cartesiano representado pelas coordenadas, para mais explicações sobre, confira meu post sobre Visualizacao de dados com python e matplotlib. O código final deve ficar desta forma.
plt.scatter(merged_df['longitude'], merged_df['latitude'], marker='.'): Passamos os dados de longitude e latitude como coordenadas para nosso plano cartesiano.
mll.show(): Este método vai transformar o gráfico que estamos trabalhando com o matplotlib em um mapa interativo e, nos gerar uma pagina HTML. Essa pagina pode ser utilizada para apresentar o mapa em seus websites ou aplicativos. Bem como ser transformada em uma imagem.
O resultado esperado deve ser este:
![]() | |
Previa do mapa |
Como mencionado, usando esse método o arquivo do mapa será provido em formato .html e pode ser utilizado em seus sites ou aplicativos. A melhor parte disso é a facilidade para retrabalhar seus mapas com novos dados. Caso queira apenas mostrar o mapa em seu python notebook ou colab, pode-se utilizar o método 'display()'.
Conclusão
Analisando o mapa que criamos vemos claramente um foco extremamente alto dos casos de covid-19 no centro-oeste e sul do pais, tendência já esperada visto o turismo mais elevado em comparação com o resto do pais. De qualquer forma a habilidade de ser capaz de apresentar dados geográficos é muito importante para a profissões relacionadas a dados, principalmente ao trabalhar em relatórios que são diretamente ligados a logística, publico e etc. O mapa pode ser aprimorado mais ainda, adicionando diferentes intensidades em formato de cores para os pontos de acordo com o numero de casos confirmados ou fazendo cada ponto interativo, para apresentar informações detalhadas das cidades.
Fontes, documentações e links úteis
- Matplotlib: https://matplotlib.org/
- Pyplot: https://matplotlib.org/api/pyplot_api.html
- Python: https://www.python.org/
- Dataset COVID-19: https://brasil.io/dataset/covid19/caso/
- Dataset municípios brasileiros: https://github.com/kelvins/Municipios-Brasileiros
- Mplleaflet: https://github.com/jwass/mplleaflet
- Sobre o processo de JOIN: https://pt.wikipedia.org/wiki/Join_(SQL)
Comentários
Postar um comentário