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, 2019 · 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)
Image for post
Image for post

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")
Image for post
Image for post

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)
Image for post
Image for post

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)
Image for post
Image for post

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)
Image for post
Image for post
heatmap df_merged_left_2016
Image for post
Image for post

É, 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

healthdata, machine learning and design science.

fabiano filho.

Written by

healthdata, machine learning and design science.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store