Análise exploratória de casos de Zika notificado pelo SUS

Neste tutorial vamos explorar como começar a entender a descrição de casos do sistema de notificação de agravos do SUS, o SINAN. Estes dados são bastante ricos e a documentação sobre o significado de cada uma das variáveis pode ser encontrada aqui.

[1]:
from pysus.ftp.databases.sinan import SINAN

sinan = SINAN().load()

Primeiro vamos começar pelo carregamento dos dados a partir do site do InfoDengue. Como o dado está no formato parquet, nós vamos utilizar a biblioteca pandas para carregar os dados em um Dataframe.

[4]:
cols = [
    'ID_AGRAVO', 'DT_NOTIFIC', 'SEM_NOT', 'NU_ANO', 'ID_MUNICIP',
    'DT_SIN_PRI', 'SEM_PRI', 'NU_IDADE_N', 'CS_SEXO', 'CS_GESTANT',
    'latitude', 'longitude',
    'NM_DISEASE'
]
casos = sinan.download(sinan.get_files('ZIKA', 2016)).to_dataframe()
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 4.14M/4.14M [00:00<00:00, 3.47GB/s]

Vejamos os nomes da variáveis

[5]:
casos.columns
[5]:
Index(['TP_NOT', 'ID_AGRAVO', 'CS_SUSPEIT', 'DT_NOTIFIC', 'SEM_NOT', 'NU_ANO',
       'SG_UF_NOT', 'ID_MUNICIP', 'ID_REGIONA', 'DT_SIN_PRI', 'SEM_PRI',
       'NU_IDADE_N', 'CS_SEXO', 'CS_GESTANT', 'CS_RACA', 'CS_ESCOL_N', 'SG_UF',
       'ID_MN_RESI', 'ID_RG_RESI', 'ID_PAIS', 'NDUPLIC_N', 'IN_VINCULA',
       'DT_INVEST', 'ID_OCUPA_N', 'CLASSI_FIN', 'CRITERIO', 'TPAUTOCTO',
       'COUFINF', 'COPAISINF', 'COMUNINF', 'DOENCA_TRA', 'EVOLUCAO',
       'DT_OBITO', 'DT_ENCERRA', 'CS_FLXRET', 'FLXRECEBI', 'TP_SISTEMA',
       'TPUNINOT'],
      dtype='object')
[6]:
casos = casos[casos.ID_AGRAVO=='A928']
casos.head()
[6]:
TP_NOT ID_AGRAVO CS_SUSPEIT DT_NOTIFIC SEM_NOT NU_ANO SG_UF_NOT ID_MUNICIP ID_REGIONA DT_SIN_PRI ... COPAISINF COMUNINF DOENCA_TRA EVOLUCAO DT_OBITO DT_ENCERRA CS_FLXRET FLXRECEBI TP_SISTEMA TPUNINOT
0 2 A928 2016-01-26 201604 2016 33 330490 2016-01-19 ... 0 1 20160331 0 2 1
1 2 A928 2016-01-26 201604 2016 33 330490 2016-01-20 ... 0 20160331 0 2 1
2 2 A928 2016-01-26 201604 2016 33 330490 2016-01-18 ... 0 9 1 20160326 0 2 1
3 2 A928 2016-01-26 201604 2016 33 330490 2016-01-19 ... 0 9 1 20160331 0 2 1
4 2 A928 2016-01-26 201604 2016 33 330490 2016-01-19 ... 0 9 1 20160331 0 2 1

5 rows × 38 columns

Estes dados correspondem a todos os casos de Zika notificados ao SUS durante um período. Neste caso de 2015 a 2016. Para podermos tratar adequadamente estes dados para fins de visualização ou análise precisamos corrigir os tipos das colunas. Por exemplo vamos converter as datas.

[5]:
import pandas as pd
casos['DT_INDEX'] = pd.to_datetime(casos.DT_NOTIFIC)

Para poder organizar os dados temporalmente, é útil indexar a tabela por alguma variável temporal. Vamos usar a data de notifiacão de cada caso como índice

[6]:
casos = casos.set_index('DT_INDEX')

Agora podemos plotar o número de casos por semana de dengue na cidade do Rio de Janeiro.

[7]:
casos.ID_AGRAVO.resample('1W').count().plot()
[7]:
<Axes: xlabel='DT_INDEX'>
../_images/tutorials_Zika_12_1.png

Suponhamos agora que desejamos visualizar em um mapa os casos que ocorreram, por exemplo entre janeiro e agosto de 2016.