Análise de óbitos nos municípios do estado de São Paulo

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.

In [271]:
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.

In [275]:
# 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)
Out[275]:
<matplotlib.axes._subplots.AxesSubplot at 0x7ff53d771cd0>

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.

In [276]:
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")
Out[276]:
Text(0.5, 1.0, '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.

In [278]:
# 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:

In [282]:
display(obitos_top)
display(populacao)
display(porcentagem)
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+
Município
SAO PAULO 76196 1964 111 130 621 969 990 1162 1438 1903 2531 3507 4964 6380 7310 7488 34693
GUARULHOS 7974 291 22 17 91 137 107 156 224 226 334 479 618 800 851 828 2791
CAMPINAS 7451 139 9 13 43 86 88 100 136 189 242 330 484 600 662 738 3590
SANTO ANDRE 5603 75 11 13 44 50 59 85 91 114 170 220 361 476 567 591 2657
SAO BERNARDO DO CAMPO 4720 116 12 9 30 53 50 76 92 141 175 239 329 432 483 507 1961
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+
SAO PAULO 11811516 779314 780721 694965 773543 893375 904379 997464 1019108 936105 823790 746487 669408 576947 450776 324402 440732
GUARULHOS 1338452 98001 96102 89434 101053 117596 112699 111619 109085 102349 92827 83197 69344 56126 41163 27383 30474
CAMPINAS 1167192 69421 70602 64910 71382 87251 93984 103783 103506 92481 80706 74954 68319 59669 46493 33648 46083
SANTO ANDRE 692207 40780 41413 38273 42195 49747 52748 57348 57513 53013 48926 46687 43954 37749 29928 21777 30156
SAO BERNARDO DO CAMPO 807917 50563 51141 47957 52215 62030 64139 68394 69064 64542 58177 53887 48700 40332 30774 21092 24910
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+
Município
SAO PAULO 0.006451 0.002520 0.000142 0.000187 0.000803 0.001085 0.001095 0.001165 0.001411 0.002033 0.003072 0.004698 0.007416 0.011058 0.016216 0.023082 0.078717
GUARULHOS 0.005958 0.002969 0.000229 0.000190 0.000901 0.001165 0.000949 0.001398 0.002053 0.002208 0.003598 0.005757 0.008912 0.014254 0.020674 0.030238 0.091586
CAMPINAS 0.006384 0.002002 0.000127 0.000200 0.000602 0.000986 0.000936 0.000964 0.001314 0.002044 0.002999 0.004403 0.007084 0.010055 0.014239 0.021933 0.077903
SANTO ANDRE 0.008094 0.001839 0.000266 0.000340 0.001043 0.001005 0.001119 0.001482 0.001582 0.002150 0.003475 0.004712 0.008213 0.012610 0.018945 0.027139 0.088109
SAO BERNARDO DO CAMPO 0.005842 0.002294 0.000235 0.000188 0.000575 0.000854 0.000780 0.001111 0.001332 0.002185 0.003008 0.004435 0.006756 0.010711 0.015695 0.024038 0.078723

Agora que temos a relação entre óbitos por população, podemos começar a fazer novas plotagens.

In [283]:
porcentagem.plot()
Out[283]:
<matplotlib.axes._subplots.AxesSubplot at 0x7ff53d47eeb0>

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:

In [248]:
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:

In [291]:
for i in range(len(porcentagem.columns)):
    print(porcentagem[porcentagem.columns[i]].sort_values(ascending = False)\
    .head(10), end='\n\n')
Município
SANTO ANDRE              0.008094
SAO PAULO                0.006451
CAMPINAS                 0.006384
GUARULHOS                0.005958
SAO BERNARDO DO CAMPO    0.005842
Name: total, dtype: float64

Município
GUARULHOS                0.002969
SAO PAULO                0.002520
SAO BERNARDO DO CAMPO    0.002294
CAMPINAS                 0.002002
SANTO ANDRE              0.001839
Name: 0-4, dtype: float64

Município
SANTO ANDRE              0.000266
SAO BERNARDO DO CAMPO    0.000235
GUARULHOS                0.000229
SAO PAULO                0.000142
CAMPINAS                 0.000127
Name: 5-9, dtype: float64

Município
SANTO ANDRE              0.000340
CAMPINAS                 0.000200
GUARULHOS                0.000190
SAO BERNARDO DO CAMPO    0.000188
SAO PAULO                0.000187
Name: 10-14, dtype: float64

Município
SANTO ANDRE              0.001043
GUARULHOS                0.000901
SAO PAULO                0.000803
CAMPINAS                 0.000602
SAO BERNARDO DO CAMPO    0.000575
Name: 15-19, dtype: float64

Município
GUARULHOS                0.001165
SAO PAULO                0.001085
SANTO ANDRE              0.001005
CAMPINAS                 0.000986
SAO BERNARDO DO CAMPO    0.000854
Name: 20-24, dtype: float64

Município
SANTO ANDRE              0.001119
SAO PAULO                0.001095
GUARULHOS                0.000949
CAMPINAS                 0.000936
SAO BERNARDO DO CAMPO    0.000780
Name: 25-29, dtype: float64

Município
SANTO ANDRE              0.001482
GUARULHOS                0.001398
SAO PAULO                0.001165
SAO BERNARDO DO CAMPO    0.001111
CAMPINAS                 0.000964
Name: 30-34, dtype: float64

Município
GUARULHOS                0.002053
SANTO ANDRE              0.001582
SAO PAULO                0.001411
SAO BERNARDO DO CAMPO    0.001332
CAMPINAS                 0.001314
Name: 35-39, dtype: float64

Município
GUARULHOS                0.002208
SAO BERNARDO DO CAMPO    0.002185
SANTO ANDRE              0.002150
CAMPINAS                 0.002044
SAO PAULO                0.002033
Name: 40-44, dtype: float64

Município
GUARULHOS                0.003598
SANTO ANDRE              0.003475
SAO PAULO                0.003072
SAO BERNARDO DO CAMPO    0.003008
CAMPINAS                 0.002999
Name: 45-49, dtype: float64

Município
GUARULHOS                0.005757
SANTO ANDRE              0.004712
SAO PAULO                0.004698
SAO BERNARDO DO CAMPO    0.004435
CAMPINAS                 0.004403
Name: 50-54, dtype: float64

Município
GUARULHOS                0.008912
SANTO ANDRE              0.008213
SAO PAULO                0.007416
CAMPINAS                 0.007084
SAO BERNARDO DO CAMPO    0.006756
Name: 55-59, dtype: float64

Município
GUARULHOS                0.014254
SANTO ANDRE              0.012610
SAO PAULO                0.011058
SAO BERNARDO DO CAMPO    0.010711
CAMPINAS                 0.010055
Name: 60-64, dtype: float64

Município
GUARULHOS                0.020674
SANTO ANDRE              0.018945
SAO PAULO                0.016216
SAO BERNARDO DO CAMPO    0.015695
CAMPINAS                 0.014239
Name: 65-69, dtype: float64

Município
GUARULHOS                0.030238
SANTO ANDRE              0.027139
SAO BERNARDO DO CAMPO    0.024038
SAO PAULO                0.023082
CAMPINAS                 0.021933
Name: 70-74, dtype: float64

Município
GUARULHOS                0.091586
SANTO ANDRE              0.088109
SAO BERNARDO DO CAMPO    0.078723
SAO PAULO                0.078717
CAMPINAS                 0.077903
Name: 75+, dtype: float64

Finalmente, vamos plotá-las:

In [290]:
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")
Out[290]:
Text(0.5, 1.0, '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.