Estágio em Ciência de Dados na saúde com Python

O que eu busquei fazer para o primeiro dia de estágio em Data Science na Secretaria Municipal de Saúde de Vitória-ES

fabiano filho.
Apr 24 · 4 min read

Sou da área da saúde, especificamente estudante de medicina, ao entrar no estágio em ciência de dados, senti a necessidade de revisar do Python (pandas) ao Data Science para não chegar despreparado no primeiro dia de estágio…

O que precisei para me sentir preparado?

[ ] dispor dos bancos de dados já disponibilizados publicamente (SINASC, SIM, SIH, SIA…)

[ ] estar apto a fazer a descrição e o perfil dos dados.

[ ] ter em mão as bibliotecas de visualização a fim de dispor da melhor forma os dados para os profissionais que não fazem análise de dados

[ ] ter noção dos conceitos para manusear o banco de dados: converter extensões de bancos de dados (convert: CSV — DBC — DBF), fazer: concatenação (concat), integração, intersecção e migração de dados (outer, inner, left), filtrar e excluir variáveis (drop).

[ ] começar desde já registrar e guardar anotações de problemas que você vê com os dados desde o começo.

[ ] testar algo de correlações e visualização.

Como me preparei?

  • os dados públicos de saúde são, em suma, referentes a formulários preenchidos em ocorrências e organizados em Sistemas de Informações: Nascidos vivos (SINASC), Mortalidade (SIM), Agravos (SINAN), Hospitalar (SIH), Ambulatorial (SIA), Pré-Natal (SISPRENATAL).
  1. importar a biblioteca do pandas;
import pandas as pd

2. ler o banco de dados (dataframe) em formato de CSV (comma separated values) — vamos usar o SINASC e o SIM de exemplo;

df_sinasc_es_2016 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vSkaN1Ye-7puUZMT3J_yuJisowxrmsU3BAsvyfI3ZxD_mKPJ_4fjfnUS9_JH83fAocKWjyRquGMJxde/pub?output=csv')df_sim_es_2016 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vR_MH3HjwGWD0icAnZ3LVxxKUIxYNgAE3R-m-P61g0T2iXE9bs3hjeItGKTJqIUslIOAFN7TrE2ghGM/pub?output=csv')

3. fazer a descrição dos dados, colunas e variáveis;

# para ter a variância dos valores no banco de dados
df_sinasc_es_2016.describe()# colunas do SINASC
df_sinasc_es_2016.columns# colunas do SIM
df_sim_es_2016.columns# colunas de intersecção no SIM e no SINASC
columns_intersection = df_sinasc_es_2016.columns.intersection(df_sim_es_2016.columns)columns_intersection

4. perfil dos dados

import pandas_profiling # perfil do SINASC 2016
pandas_profiling.ProfileReport(df_sinasc_es_2016)# perfil do SIM 2016
pandas_profiling.ProfileReport(df_sim_es_2016)

5. pode ser feita a concatenação dos dados nos últimos anos — agrupamento dos dados que compartilham das mesmas colunas (p.ex. dos últimos 5 anos).

df_sinasc_es_1 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vQm3T1J0pWoiG-JofcT-K4gvs1KBeKuCqYIxp2ZSvUjbdkzXFCrBd3pxFUqHvRqmg3iIunrxVTYIZRI/pub?gid=2016691083&single=true&output=csv')df_sinasc_es_2 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vQIyzKl_u0t_YN_stW1Nr4VHWw0XY5zdXhqi15RitMcNPQpDZdU5apVR5aOQmbVYu284B4wNJUMonXU/pub?gid=1338898032&single=true&output=csv')df_sinasc_es_3 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vTIPBsiEtG3heF7zGO6HRkVae9PAO_yJI8SVtw2YncAb1JByCTIsFid0rruA7c4Pq8TDCbI3j6LQjMc/pub?gid=580169372&single=true&output=csv')df_sinasc_es_4 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vROjHq3_oX3W_j6GEVjNBoKdnoUJgE5HGIfyrWnB8mgXikfc15O08SvOVXqmuxfyZmp-lMM3ETsPvkZ/pub?gid=535577998&single=true&output=csv')df_sinasc_es_5 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vRsmVmV6LY0nRKPr6MeqbNmH70iM20lPQdAmq0wNHJCRTxEGBzdM3cxgF6Ovd_mplD4RJ1EtCXBTAd6/pub?gid=1590264663&single=true&output=csv')df_sinasc_es = pd.concat([df_sinasc_es_1, df_sinasc_es_2, df_sinasc_es_3, df_sinasc_es_4, df_sinasc_es_5])df_sim_es_1 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vR_MH3HjwGWD0icAnZ3LVxxKUIxYNgAE3R-m-P61g0T2iXE9bs3hjeItGKTJqIUslIOAFN7TrE2ghGM/pub?gid=1574877476&single=true&output=csv')df_sim_es_2 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vSQAjV9c7HSRNciS8zQZFtlffe-X0V8Wcc5EAM9wqhVGPHnI3IpAaliYwadmK4nHiKPz9GbXn_-xNNC/pub?gid=817434201&single=true&output=csv')df_sim_es_3 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vRGEAcKThbNaB9Kfp2vdoWZIMjUaVLwDF0Cf9_534xkV2iDWv4SZACgDBG7CnhzjXd_dCvwvadINdL1/pub?gid=1932938775&single=true&output=csv')df_sim_es_4 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vRf-ecv5pdc0k2GR3SBdoCeZtRM6SPjSyQDFVwlUmzd8YsPVWPwZvx3ZnM8y_B5kBcFH-QxYIyTuYzr/pub?gid=1342589125&single=true&output=csv')df_sim_es_5 = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vS9XW4Hxc0QwEENpDDXLIBgDkyaTz89AXhgYYDcw7lHhBRjnLyQ2Y7B77fMV2LVmivKhSABYr-2fcFx/pub?gid=508819616&single=true&output=csv')df_sim_es = pd.concat([df_sim_es_1, df_sim_es_2, df_sim_es_3, df_sim_es_4, df_sim_es_5])

6. fazer integração dos bancos de dados por uma variável em comum (poderia agrupar os últimos 5 anos, por exemplo, mas dei preferência para fazer anualmente como no tópico 2 e comparar com a Taxa de Mortalidade).

# migrar dados do SIM para SINASC = "left", usando "NUMERODN"
df_merged_left_2016 = pd.merge(df_sinasc_es_2016, df_sim_es_2016, how='left', on = 'NUMERODN')
df_merged_left_2016.describe()# intersecção entre SINASC E SIM = "inner", usando "NUMERODN"
df_merged_inner_2016 = pd.merge(df_sinasc_es_2016, df_sim_es_2016, how='inner', on = 'NUMERODN')
df_merged_inner_2016.describe()# integração entre SINASC e SIM = "outer", usando "NUMERODN"
df_merged_outer_2016 = pd.merge(df_sinasc_es_2016, df_sim_es_2016, how='outer', on = 'NUMERODN', indicator=True)df_merged_outer_2016.describe()
df_merged_left_2016.descrive()# renomear coluna "_merge" -> "simsim" = contém no SINASC e no SIM
df_merged_outer_2016.rename(index=str, columns={"_merge": "simsim"})# verificar colunas da integração
col = df_merged_outer_2016.columns.tolist()print(col)

7. visualização dos dados (com Seaborn e Matplotlib)

# importar as bibliotecas de visualização
import seaborn as sns 
import matplotlib.pyplot as plt

ex.1. visualizar a coluna de integração _merge

# visualizar a partir da coluna de _merge, left_only =SINASC, right_only = SIM, _merge = SINASC que faleceu no ano (SINASC e SIM)
y = df_merged_outer_2016._merge
ax = sns.countplot(y,label="Count")

ex.2 APGAR1 (escore de vitalidade do recém-nascido no primeiro minuto de vida, o qual varia numericamente de 0–10).

# visualizar o APGAR1
plt.figure(figsize=(10,10))
sns.boxplot(y="APGAR1", x="_merge", data=df_merged_outer_2016)
plt.xticks(rotation=90)

8. filtrar/excluir elementos da análise, criando outra variável droped — p. ex., na visualização obtivemos muitos outliers (variáveis discrepantes) no APGAR1, que vão além do escore de 10 pontos.

# limpeza dos outliers de APGAR
df_merged_outer_droped_2016 = df_merged_outer_2016.drop(df_merged_outer_2016[df_merged_outer_2016["APGAR1"]>10].index)
df_merged_outer_droped_2016[df_merged_outer_droped_2016["APGAR1"]>10]# visualizar a limpeza dos outliers
plt.figure(figsize=(10,10))
sns.boxplot(y="APGAR1", x="_merge",  data=df_merged_outer_droped_2016)
plt.xticks(rotation=90)

9. fazer um primeiro teste de correlações

df_merged_left_2016.corr(method = 'spearman')

10. fazer a visualização em mapa de calor (heatmap) das correlações…

Por que não?!

# correlation map 
f,ax = plt.subplots(figsize=(18, 18))
sns.heatmap(df_merged_left_2016.corr(), annot=True, linewidths=.5, fmt= '.1f',ax=ax)
heatmap df_merged_left_2016

É, ainda tem muito trabalho a ser feito na limpeza das variáveis, podendo usar o profiling para guiá-la, mas vou deixar para as próximas semanas!!

Lembrete!!

  • ideias, problemas e oportunidades.
  • importante se perguntar qual a melhor forma de resolver aquele problema?
  • criar um repositório de bibliotecas que precisa aprender para aplicar.

fabiano filho.

Written by

beginner data scientist in healthcare!