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

Neste tutorial vamos explorar como começar a entender a descrição de casos do sis tema 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.online_data import SINAN, parquets_to_dataframe
import keplergl
import pandas as pd
import geopandas as gpd
%pylab inline
%pylab is deprecated, use %matplotlib inline and import the required libraries.
Populating the interactive namespace from numpy and matplotlib

Primeiro vamos começar pelo carregamento dos dados a partir do servidor do DataSUS. Como o dado está no formato Parquet, nós vamos utilizar a biblioteca pandas para visualizar os dados em um Dataframe:

[14]:
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 = parquets_to_dataframe(SINAN.download('Dengue', 2010))
[6]:
munrj = gpd.read_file('rj-municipalities.json')
munrj.plot();
/home/luabida/micromamba/envs/pysus/lib/python3.9/site-packages/geopandas/array.py:93: ShapelyDeprecationWarning: __len__ for multi-part geometries is deprecated and will be removed in Shapely 2.0. Check the length of the `geoms` property instead to get the  number of parts of a multi-part geometry.
  aout[:] = out
/home/luabida/micromamba/envs/pysus/lib/python3.9/site-packages/geopandas/plotting.py:33: ShapelyDeprecationWarning: Iteration over multi-part geometries is deprecated and will be removed in Shapely 2.0. Use the `geoms` property to access the constituent parts of a multi-part geometry.
  for poly in geom:
/home/luabida/micromamba/envs/pysus/lib/python3.9/site-packages/descartes/patch.py:62: ShapelyDeprecationWarning: The array interface is deprecated and will no longer work in Shapely 2.0. Convert the '.coords' to a numpy array instead.
  vertices = concatenate([
_images/Dengue_4_1.png
[26]:
casos.head()
[26]:
TP_NOT ID_AGRAVO SEM_NOT NU_ANO SG_UF_NOT ID_MUNICIP ID_REGIONA ID_UNIDADE DT_SIN_PRI SEM_PRI ... PLASMATICO EVIDENCIA PLAQ_MENOR CON_FHD COMPLICA HOSPITALIZ DT_INTERNA UF MUNICIPIO TP_SISTEMA
DT_NOTIFIC
2010-02-24 2 A90 201008 2010 35 351870 1349 2034573 2010-02-17 201007 ... 1
2010-02-25 2 A90 201008 2010 35 351870 1349 2034573 2010-02-24 201008 ... 1
2010-02-26 2 A90 201008 2010 35 351870 1349 2034573 2010-02-22 201008 ... 1
2010-02-25 2 A90 201008 2010 35 351870 1349 2034573 2010-02-25 201008 ... 1
2010-02-24 2 A90 201008 2010 35 351870 1349 2034573 2010-02-23 201008 ... 1

5 rows × 65 columns

Estes dados correspondem a todos os casos de dengue notificado 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.

[16]:
casos.DT_NOTIFIC = pd.to_datetime(casos.DT_NOTIFIC)
casos.DT_SIN_PRI = pd.to_datetime(casos.DT_SIN_PRI)

Para poder organizar os dados temporalmente, é útil indexar a tabela por alguma variável temporal

[17]:
casos = casos.set_index('DT_NOTIFIC')

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

[18]:
casos.ID_AGRAVO.resample('1W').count().plot(grid=True);
_images/Dengue_11_0.png

Suponhamos agora que desejamos visualizar em um mapa os casos que ocorreram, por exemplo entre janeiro e março de 2015

[21]:
map1 = keplergl.KeplerGl(height=600,)
map1
User Guide: https://docs.kepler.gl/docs/keplergl-jupyter
[27]:
# Animando os casos
for ano in [2015., 2016.]:
    for i in range(1,53):
        map1.add_data(casos[(casos.NU_ANO==ano)&(casos.SEM_PRI.apply(int)<=float(i))])#,name=f'semana {i} de {int(ano)}')
#         time.sleep(1)
[28]:
map1.add_data(munrj,name='Municipios')
[ ]: