Utilizaremos os dados de óbitos no estado de São Paulo separados por município e faixa de idade quinquenal.
Abaixo, realizaremos a importação do conjunto de dados em formato pickle, e o compatibilizaremos para o uso com a biblioteca pandas (como, p. ex., retirar as pontuações de milhar dos dados). Por conta do segundo conjunto de dados (dados populacionais dos municípios) agrupar as faixas acima dos 75 anos de idade como uma só, da mesma forma aglutinaremos as taxas 75-79 com a 80+ no conjunto primário.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Lê o arquivo, reformata o nome da coluna e a determina como índice, e excluímos o total do estado e os desconhecidos
# para que não entrem na nossa conta
obitos = pd.read_pickle('/data/datasets/projetos/obitosSP.pickle')
obitos = obitos.rename(columns={'municipio': 'Município'})
obitos = obitos.set_index('Município')
obitos.drop('ESTADO DE SÃO PAULO', axis = 0, inplace = True)
obitos.drop('Município Ignorado', axis = 0, inplace = True)
# Retiramos as marcas de milhares e os hífens no lugar dos zeros, e aí transformamos os dados para inteiros
for i in range(1, len(obitos.columns) - 1):
obitos[obitos.columns[i]] = obitos[obitos.columns[i]].str.replace('.', '').replace(' - ', 0).astype('int')
# O próximo conjunto de dados aglutina os dados acima de 75 anos, então fazemos aqui também
obitos['75+'] = obitos['75-79'] + obitos['80+']
obitos.drop(['75-79', '80+'], axis = 1, inplace = True)
No gráfico abaixo estão sendo exibidos os dez principais municípios com óbitos no estado, sendo o líder (São Paulo) nove vezes maior que o segundo colocado (Guarulhos). Isso parece alarmante, mas devemos relacionar essa taxa de óbitos com a população de cada município.
# Vamos plotar em barras horizontais os 10 maiores no número total de óbitos
obitos.total.sort_values(ascending = False).head(10).plot.barh(
title = 'Municípios com mais óbitos no estado de São Paulo em 2019', fontsize = 10)
Vamos também visualizar as faixas etárias mais vulneráveis. Percebe-se que ainda não há como tirar alguma conclusão, parece que São Paulo é uma zona de guerra em comparação aos outros municípios.
fig, axes = plt.subplots(nrows=2, ncols=3, figsize = (20, 10))
# Novamente plotamos em barras horizontais levando em consideração as idades mais vulneráveis
obitos['total'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,0]).set_title("Total")
obitos['0-4'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,1]).set_title("Até 4 anos de idade")
obitos['5-9'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,2]).set_title("De 5 a 9 anos de idade")
obitos['65-69'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,0]).set_title("De 65 a 69 anos de idade")
obitos['70-74'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,1]).set_title("De 70 a 74 anos de idade")
obitos['75+'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,2]).set_title("Acima dos 75 anos de idade")
Agora, vamos unir os dados de óbitos com os dados de população para os cinco principais municípios, São Paulo, Guarulhos, Campinas, Santo André e São Bernardo do Campo.
# Fazendo na marra porque o SEADE me retorna um belo arquivo de 0 bytes quando eu peço para baixar no produtos.seade.gov.br/produtos/projpop
populacao = pd.DataFrame(np.array([[11811516,779314,780721,694965,773543,893375,904379,997464,1019108,936105,823790,746487,669408,576947,450776,324402,440732],
[ 1338452, 98001, 96102, 89434,101053,117596,112699,111619, 109085,102349, 92827, 83197, 69344, 56126, 41163, 27383, 30474],
[ 1167192, 69421, 70602, 64910, 71382, 87251, 93984,103783, 103506, 92481, 80706, 74954, 68319, 59669, 46493, 33648, 46083],
[ 692207, 40780, 41413, 38273, 42195, 49747, 52748, 57348, 57513, 53013, 48926, 46687, 43954, 37749, 29928, 21777, 30156],
[ 807917, 50563, 51141, 47957, 52215, 62030, 64139, 68394, 69064, 64542, 58177, 53887, 48700, 40332, 30774, 21092, 24910]]),
index = ['SAO PAULO', 'GUARULHOS', 'CAMPINAS', 'SANTO ANDRE', 'SAO BERNARDO DO CAMPO'],
columns = ['total', '0-4', '5-9', '10-14', '15-19', '20-24', '25-29', '30-34', '35-39', '40-44', '45-49', '50-54', '55-59', '60-64', '65-69', '70-74', '75+'])
# Agora que temos os dados populacionais para os 5 principais municípios, vamos selecionar apenas os 5 líderes em óbitos
obitos_top = obitos.sort_values(ascending = False, by = "total").head(5)
# E, por último, fazemos a relação:
porcentagem = obitos_top / populacao
Vamos conferir como ficaram os conjuntos de dados:
display(obitos_top)
display(populacao)
display(porcentagem)
Agora que temos a relação entre óbitos por população, podemos começar a fazer novas plotagens.
porcentagem.plot()
As linhas estão sendo exibidas em ordem decrescente, o que significa que a mortalidade infantil não se aproxima dos óbitos da população mais idosa. Vamos então comparar o gráfico que apenas relacionava os óbitos com um novo que leve em conta o tamanho populacional:
fig, ax = plt.subplots(ncols = 2, figsize = (20, 5))
sns.barplot(data = obitos_top.filter(['total']).T, ax = ax[0], orient = "h", ci = None, order =
['SAO BERNARDO DO CAMPO', 'SANTO ANDRE', 'CAMPINAS', 'GUARULHOS', 'SAO PAULO'])\
.set_title('Líderes de óbitos em 2019', fontsize = 20)
sns.barplot(data = porcentagem.filter(['total']).T, ax = ax[1], orient = "h", ci = None, order =
['SAO BERNARDO DO CAMPO', 'GUARULHOS', 'CAMPINAS', 'SAO PAULO', 'SANTO ANDRE'])\
.set_title('Líderes em óbito por habitante em 2019', fontsize = 20)
sns.set_context("notebook", font_scale = 0.8)
É percebível agora que a taxa de São Paulo está muito mais próxima dos outros municípios do que aparentava-se antes. E Santo André, que antes ocupava a quarta posição, agora é o campeão de óbitos por habitante, excedendo razoavelmente São Paulo, que vem em segundo lugar.
Agora vamos fazer o mesmo que fizemos ao visualizar as faixas mais vulneráveis, mas vendo antes uma pré-visualização crua dos dados para selecionarmos as faixas etárias que mais chamem a atenção:
for i in range(len(porcentagem.columns)):
print(porcentagem[porcentagem.columns[i]].sort_values(ascending = False)\
.head(10), end='\n\n')
Finalmente, vamos plotá-las:
fig, axes = plt.subplots(nrows=4, ncols=3, figsize = (20, 20))
porcentagem['total'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,0]).set_title("Total")
porcentagem['0-4'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,1]).set_title("Até 4 anos de idade")
porcentagem['5-9'].sort_values(ascending = False).head(10).plot.barh(ax = axes[0,2]).set_title("De 5 a 9 anos de idade")
porcentagem['10-14'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,0]).set_title("De 10 a 14 anos de idade")
porcentagem['15-19'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,1]).set_title("De 15 a 19 anos de idade")
porcentagem['20-24'].sort_values(ascending = False).head(10).plot.barh(ax = axes[1,2]).set_title("De 20 a 24 anos de idade")
porcentagem['35-39'].sort_values(ascending = False).head(10).plot.barh(ax = axes[2,0]).set_title("De 35 a 39 anos de idade")
porcentagem['55-59'].sort_values(ascending = False).head(10).plot.barh(ax = axes[2,1]).set_title("De 55 a 60 anos de idade")
porcentagem['60-64'].sort_values(ascending = False).head(10).plot.barh(ax = axes[2,2]).set_title("De 60 a 64 anos de idade")
porcentagem['65-69'].sort_values(ascending = False).head(10).plot.barh(ax = axes[3,0]).set_title("De 65 a 69 anos de idade")
porcentagem['70-74'].sort_values(ascending = False).head(10).plot.barh(ax = axes[3,1]).set_title("De 70 a 74 anos de idade")
porcentagem['75+'].sort_values(ascending = False).head(10).plot.barh(ax = axes[3,2]).set_title("Acima dos 75 anos de idade")
Vemos que Guarulhos lidera a taxa de óbito por habitante para a população mais idosa, e alcança o primeiro lugar já a partir dos 35 anos de idade, com uma diferença significativa com Santo André. Agora, o caso de Santo André é interessante. Enquanto que o município está em quinto lugar em relação aos óbitos de recém-nascidos a crianças de quatro anos de idade, ele salta para o primeiro lugar na quinquena seguinte, e tem uma explosão de óbitos entre pré-adolescentes.