Projeto-Perfil-Epidemiologico


Perfil epidemiológico dos beneficiários de planos de saúde atendidos em Hospitais do Estado da Bahia

por Antonildo Santos

Introdução

O objetivo desta análise é conhecer o perfil epidemiológico dos beneficiários de planos de saúde atendidos em hospitais do Estado da Bahia. Para realização deste trabalho utilizarei dados públicos disponibilizados pela ANS e DATASUS, ao final responderei as seguintes perguntas:

  • Quais as principais doenças dos beneficiários de planos de saúde da Bahia?
  • Quem utiliza mais os planos de saúde são os Homens ou as Mulheres?
  • Quais categorias de doenças atingem mais os Homens?
  • Quais categorias de doenças atingem mais as Mulheres?
  • Em que faixa etária os gastos são mais elevados?
  • Em que faixa etária realiza-se mais procedimentos?
  • Qual a previsão de gastos com a categoria de doença mais frequente na população de beneficiários de planos de saúde do Estado da Bahia?

Apresentação dos dados

D-TISS

O D-TISS é um painel disponibilizado pela Agência Nacional de Saúde Suplementar (ANS) para consultar dados recebidos através do TISS - Troca de Informação em Saúde Suplementar. Com e esta base é possível visualizar a quantidade e o valor médio praticado em procedimentos ambulatoriais (médicos, laboratórios, clínicas) e a quantidade dos procedimentos realizados em ambiente hospitalar dos estabelecimentos que prestam serviço às operadoras de planos de saúde. Atualmente, quase 3.000 procedimentos realizados na saúde suplementar estão disponíveis para consulta no D‐TISS. O período inicial dos dados compreende os meses de julho de 2015 a dezembro de 2016. Os dados disponibilizados correspondem a 901 operadoras, cujas informações de valores de eventos de atenção à saúde informados no TISS correspondem a 64,5% das despesas assistenciais do setor informadas no DIOPS no período.

A base de dados D-TISS utilizada está disponível em:

http://www.ans.gov.br/images/stories/Materiais_para_pesquisa/Perfil_setor/Dados_e_indicadores_do_setor/tiss/hospitalar/BA/TISS_Hospitalar_BA.zip

São 18 arquivos, cada um correspondendo a um mês.

CID-10

A CID-10 foi conceituada para padronizar e catalogar as doenças e problemas relacionados à saúde, tendo como referência a Nomenclatura Internacional de Doenças, estabelecida pela Organização Mundial de Saúde, que tem por objetivo criar uma codificação padrão para as doenças.

A CID 10 é formada por uma letra, seguida por três números.

O código formado permite a identificação de todas as doenças conhecidas, bem como de sintomas, queixas de pacientes, aspectos fisiológicos anormais, dentre outros.

A base de dados CID-10 utilizada está disponível em: http://www.datasus.gov.br/cid10/V2008/cid10.htm

São 4 arquivos, CID-10-CAPITULOS, CID-10-GRUPOS, CID-10-CATEGORIAS e CID-10-SUBCATEGORIAS.

Importando bibliotecas


In [1]:
import pandas as pd
from pandas import DataFrame
import numpy as np
import random
from datetime import datetime, timedelta
import time
import matplotlib.pyplot as plt
import matplotlib as mpl
from IPython.display import Image
from sklearn.metrics import mean_squared_error
import seaborn as sns   
from scipy.stats import boxcox
import warnings

# Import statsmodel
import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.arima_model import ARIMAResults
from math import sqrt
%matplotlib inline

Carga de dados

Para facilitar a análise será necessário juntar os 18 arquivos da base D-TISS en um único Dataframe


In [53]:
# Carregando a base de dados D-TISS
data1 = pd.read_csv('tb_TISS_BA_1507_H.csv', decimal=b',')
data2 = pd.read_csv('tb_TISS_BA_1508_H.csv', decimal=b',')
data3 = pd.read_csv('tb_TISS_BA_1509_H.csv', decimal=b',')
data4 = pd.read_csv('tb_TISS_BA_1510_H.csv', decimal=b',')
data5 = pd.read_csv('tb_TISS_BA_1511_H.csv', decimal=b',') 
data6 = pd.read_csv('tb_TISS_BA_1512_H.csv', decimal=b',')
data7 = pd.read_csv('tb_TISS_BA_1601_H.csv', decimal=b',')
data8 = pd.read_csv('tb_TISS_BA_1602_H.csv', decimal=b',')
data9 = pd.read_csv('tb_TISS_BA_1603_H.csv', decimal=b',')
data10 = pd.read_csv('tb_TISS_BA_1604_H.csv', decimal=b',')
data11 = pd.read_csv('tb_TISS_BA_1605_H.csv', decimal=b',')
data12 = pd.read_csv('tb_TISS_BA_1606_H.csv', decimal=b',')
data13 = pd.read_csv('tb_TISS_BA_1607_H.csv', decimal=b',')
data14 = pd.read_csv('tb_TISS_BA_1608_H.csv', decimal=b',')
data15 = pd.read_csv('tb_TISS_BA_1609_H.csv', decimal=b',')
data16 = pd.read_csv('tb_TISS_BA_1610_H.csv', decimal=b',')
data17 = pd.read_csv('tb_TISS_BA_1611_H.csv', decimal=b',')
data18 = pd.read_csv('tb_TISS_BA_1612_H.csv', decimal=b',')

#  Unindo os 18 arquivos da base D-TISS en um único Dataframe
d_tiss = pd.concat([data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12, data13, data14, data15, data16, data17, data18], ignore_index=True)

#Carregando a base de dados CID-10
cid_capitulo = pd.read_csv('CID-10-CAPITULOS.csv', sep=';', encoding='latin-1')
cid_grupo = pd.read_csv('CID-10-GRUPOS.csv', sep=';', encoding='latin-1')
cid_categoria = pd.read_csv('CID-10-CATEGORIAS.csv', sep=';', encoding='latin-1')
cid_subcategorias = pd.read_csv('CID-10-SUBCATEGORIAS.csv', sep=';', encoding='latin-1')

In [3]:
print('O Dataframe d_tiss possui ' + str(d_tiss.shape[0]) + ' linhas e ' + str(d_tiss.shape[1]) + ' colunas')


O Dataframe d_tiss possui 409551 linhas e 17 colunas

In [4]:
print('O Dataframe cid_capitulo possui ' + str(cid_capitulo.shape[0]) + ' linhas e ' + str(cid_capitulo.shape[1]) + ' colunas')


O Dataframe cid_capitulo possui 22 linhas e 6 colunas

In [5]:
print('O Dataframe cid_grupo possui ' + str(cid_grupo.shape[0]) + ' linhas e ' + str(cid_grupo.shape[1]) + ' colunas')


O Dataframe cid_grupo possui 275 linhas e 5 colunas

In [6]:
print('O Dataframe cid_categoria possui ' + str(cid_categoria.shape[0]) + ' linhas e ' + str(cid_categoria.shape[1]) + ' colunas')


O Dataframe cid_categoria possui 2045 linhas e 7 colunas

In [7]:
print('O Dataframe cid_subcategorias possui ' + str(cid_subcategorias.shape[0]) + ' linhas e ' + str(cid_subcategorias.shape[1]) + ' colunas')


O Dataframe cid_subcategorias possui 12451 linhas e 9 colunas

In [8]:
Image(url = 'Dicionario_de_variaveis_dtiss.png')


Out[8]:

In [9]:
Image(url = 'Dicionario-de-variaveis-cid-10.png')


Out[9]:

Análise Exploratória

Após unir os 18 arquivos da base de dados D-TISS, correspondente aos procedimentos realizados na saúde suplementar do beneficiários atendidos em Hospitais do Estado da Bahia, ficamos com um dataset com 409551 linhas e 17 colunas.


In [10]:
##### Visualizando as primeiras 10 linhas do dataframe d_tiss
d_tiss.head(10)


Out[10]:
ID_EVENTO IDENTIFICACAO_BENEFICIARIO IDADE_BENEFICIARIO CD_SEXO IDENTIFICACAO_OPERADORA PORTE_OPERADORA IDENTIFICACAO_PRESTADOR CD_MUNICIPIO_PRESTADOR UF_PRESTADOR COMPETENCIA_EVENTO CID_1 CID_2 CID_3 CID_4 CD_PROCEDIMENTO_TUSS QTD_PROCEDIMENTO VALOR_PROCEDIMENTO
0 481457792 CA35C957C68AA63C5B3FB1FE4E14955B 59 3 21060 G 7BB13323C04D168C4C49C79B775BAB7B 293330 BA 201507 R100 -2 -2 -2 4 2 68.86
1 615800527 ECC0ECCAEE82B594A8E3A73CCF268D89 38 3 2015 G 793E053F82F32E308AEAEE8327700D36 292740 BA 201507 -2 -2 -2 -2 1 3 201.26
2 615801444 04E17108FE2FEE7796E35E109F09E640 8 1 2015 G DE86E971D5DB308B57234D6948311F6B 292740 BA 201507 -2 -2 -2 -2 10102019 1 71.58
3 963706115 F2D8ECAF526A8486EE4264DE3535FCF4 6 3 3170 G E1B317387A9CD6DB408E55F3CEEEBADB 292740 BA 201507 C711 -2 -2 -2 1 2 70.43
4 615799637 77C52D36D61FC744 42 3 2015 G DE86E971D5DB308B57234D6948311F6B 292740 BA 201507 -2 -2 -2 -2 10102019 1 71.58
5 963810635 677592C57167436800858909319D1615 41 1 3170 G 2ADBF07DA1BF288F7178F9BDD644D287 291080 BA 201507 K802 -2 -2 -2 27 2 157.40
6 965057529 77C52D36D61FC744 20 1 3170 G FF710DAB905490C585AE0CA669A4D1DC 290570 BA 201507 I843 -2 -2 -2 31004270 3 1306.85
7 965088297 4FE0089A9C50A64BAB46A46E2F6D383F 65 3 3170 G 5BF7F7473345F3FB6CBE299FA923CBED 292740 BA 201507 H251 -2 -2 -2 30306027 2 2382.64
8 119426515 86A871CE7EFBFF1E1C5ECFB902FB60EC 50 1 1630 M 7BB13323C04D168C4C49C79B775BAB7B 293330 BA 201507 G560 -2 -2 -2 31403204 1 526.50
9 119429105 4B40F37020BF8F8F8F3A0263C40FCC2A 67 1 1630 M 6B3EC302EC53CFB17D49C22104C9D90A 293330 BA 201507 -2 -2 -2 -2 30914078 2 622.40

In [11]:
# Sumário dos dados
d_tiss.describe()


Out[11]:
ID_EVENTO IDADE_BENEFICIARIO CD_SEXO IDENTIFICACAO_OPERADORA CD_MUNICIPIO_PRESTADOR COMPETENCIA_EVENTO CD_PROCEDIMENTO_TUSS QTD_PROCEDIMENTO VALOR_PROCEDIMENTO
count 4.095510e+05 409551.000000 409551.000000 409551.00000 409551.000000 409551.000000 4.095510e+05 409551.000000 409551.000000
mean 6.683442e+08 41.256359 2.034968 2300.45923 292402.277724 201575.324008 1.415969e+07 7.898718 548.997847
std 3.094036e+08 23.546215 1.198455 2082.84515 722.819275 44.982071 1.323385e+07 31.138894 1049.154840
min 1.319261e+06 -1.000000 -1.000000 23.00000 290070.000000 201507.000000 1.000000e+00 1.000000 0.000000
25% 4.578335e+08 28.000000 1.000000 1550.00000 292740.000000 201511.000000 9.000000e+00 1.000000 80.845000
50% 7.788005e+08 39.000000 3.000000 2015.00000 292740.000000 201603.000000 1.010302e+07 2.000000 245.750000
75% 9.640112e+08 58.000000 3.000000 3170.00000 292740.000000 201607.000000 3.073110e+07 4.000000 648.960000
max 9.658329e+08 110.000000 3.000000 21060.00000 293330.000000 201612.000000 3.160234e+07 4290.000000 114794.620000

In [12]:
d_tiss.dtypes


Out[12]:
ID_EVENTO                       int64
IDENTIFICACAO_BENEFICIARIO     object
IDADE_BENEFICIARIO              int64
CD_SEXO                         int64
IDENTIFICACAO_OPERADORA         int64
PORTE_OPERADORA                object
IDENTIFICACAO_PRESTADOR        object
CD_MUNICIPIO_PRESTADOR          int64
UF_PRESTADOR                   object
COMPETENCIA_EVENTO              int64
CID_1                          object
CID_2                          object
CID_3                          object
CID_4                          object
CD_PROCEDIMENTO_TUSS            int64
QTD_PROCEDIMENTO                int64
VALOR_PROCEDIMENTO            float64
dtype: object

In [13]:
# Visualizando as primeiras 10 linhas do dataframe cid_capitulo
cid_capitulo.head(10)


Out[13]:
NUMCAP CATINIC CATFIM DESCRICAO DESCRABREV Unnamed: 5
0 1 A00 B99 Capítulo I - Algumas doenças infecciosas e par... I. Algumas doenças infecciosas e parasitárias NaN
1 2 C00 D48 Capítulo II - Neoplasias [tumores] II. Neoplasias (tumores) NaN
2 3 D50 D89 Capítulo III - Doenças do sangue e dos órgãos... III. Doenças sangue órgãos hemat e transt imun... NaN
3 4 E00 E90 Capítulo IV - Doenças endócrinas, nutricionais... IV. Doenças endócrinas nutricionais e metaból... NaN
4 5 F00 F99 Capítulo V - Transtornos mentais e comportamen... V. Transtornos mentais e comportamentais NaN
5 6 G00 G99 Capítulo VI - Doenças do sistema nervoso VI. Doenças do sistema nervoso NaN
6 7 H00 H59 Capítulo VII - Doenças do olho e anexos VII. Doenças do olho e anexos NaN
7 8 H60 H95 Capítulo VIII - Doenças do ouvido e da apófise... VIII.Doenças do ouvido e da apófise mastóide NaN
8 9 I00 I99 Capítulo IX - Doenças do aparelho circulatório IX. Doenças do aparelho circulatório NaN
9 10 J00 J99 Capítulo X - Doenças do aparelho respiratório X. Doenças do aparelho respiratório NaN

In [14]:
cid_capitulo.dtypes


Out[14]:
NUMCAP          int64
CATINIC        object
CATFIM         object
DESCRICAO      object
DESCRABREV     object
Unnamed: 5    float64
dtype: object

In [15]:
# Visualizando as primeiras 10 linhas do dataframe cid_categorias
cid_categoria.head(10)


Out[15]:
CAT CLASSIF DESCRICAO DESCRABREV REFER EXCLUIDOS Unnamed: 6
0 A00 NaN Cólera A00 Colera NaN NaN NaN
1 A01 NaN Febres tifóide e paratifóide A01 Febres tifoide e paratifoide NaN NaN NaN
2 A02 NaN Outras infecções por Salmonella A02 Outr infecc p/Salmonella NaN NaN NaN
3 A03 NaN Shiguelose A03 Shiguelose NaN NaN NaN
4 A04 NaN Outras infecções intestinais bacterianas A04 Outr infecc intestinais bacter NaN NaN NaN
5 A05 NaN Outras intoxicações alimentares bacterianas, n... A05 Outr intox alimentares bacter NCOP NaN NaN NaN
6 A06 NaN Amebíase A06 Amebiase NaN NaN NaN
7 A07 NaN Outras doenças intestinais por protozoários A07 Outr doenc intestinais p/protozoarios NaN NaN NaN
8 A08 NaN Infecções intestinais virais, outras e as não ... A08 Infecc intestinais virais outr e as NE NaN NaN NaN
9 A09 NaN Diarréia e gastroenterite de origem infecciosa... A09 Diarreia e gastroenterite orig infecc pr... NaN NaN NaN

In [16]:
cid_categoria.dtypes


Out[16]:
CAT            object
CLASSIF        object
DESCRICAO      object
DESCRABREV     object
REFER          object
EXCLUIDOS     float64
Unnamed: 6    float64
dtype: object

In [17]:
# Visualizando as primeiras 10 linhas do dataframe cid_subcategorias
cid_subcategorias.head(10)


Out[17]:
SUBCAT CLASSIF RESTRSEXO CAUSAOBITO DESCRICAO DESCRABREV REFER EXCLUIDOS Unnamed: 8
0 A000 NaN NaN NaN Cólera devida a Vibrio cholerae 01, biótipo ch... A00.0 Colera dev Vibrio cholerae 01 biot cholerae NaN NaN NaN
1 A001 NaN NaN NaN Cólera devida a Vibrio cholerae 01, biótipo El... A00.1 Colera dev Vibrio cholerae 01 biot El Tor NaN NaN NaN
2 A009 NaN NaN NaN Cólera não especificada A00.9 Colera NE NaN NaN NaN
3 A010 NaN NaN NaN Febre tifóide A01.0 Febre tifoide NaN NaN NaN
4 A011 NaN NaN NaN Febre paratifóide A A01.1 Febre paratifoide A NaN NaN NaN
5 A012 NaN NaN NaN Febre paratifóide B A01.2 Febre paratifoide B NaN NaN NaN
6 A013 NaN NaN NaN Febre paratifóide C A01.3 Febre paratifoide C NaN NaN NaN
7 A014 NaN NaN NaN Febre paratifóide não especificada A01.4 Febre paratifoide NE NaN NaN NaN
8 A020 NaN NaN NaN Enterite por salmonela A02.0 Enterite p/salmonela NaN NaN NaN
9 A021 NaN NaN NaN Septicemia por salmonela A02.1 Septicemia p/salmonela NaN NaN NaN

In [18]:
cid_subcategorias.dtypes


Out[18]:
SUBCAT         object
CLASSIF        object
RESTRSEXO      object
CAUSAOBITO     object
DESCRICAO      object
DESCRABREV     object
REFER          object
EXCLUIDOS      object
Unnamed: 8    float64
dtype: object

Limpeza e Transformação dos dados

Primeiramente eliminarei algumas colunas da base de dados D-TISS que não interessam para análise proposta. Começarei pelas colunas CID_2, CID_3, CID_4, pois trabalharei apenas com o CID primeiro diagnóstico ou diagnóstico principal. Eliminarei também as colunas IDENTIFICACAO_OPERADORA e IDENTIFICACAO_PRESTADOR, pois de acordo com o dicionário de variáveis D-TISS são informações criptografadas, depois as colunas PORTE_OPERADORA e UF_PRESTADOR.


In [54]:
# Criando um novo dataframe a partir do d_tiss
d_tiss_tratado = d_tiss.copy()

# Eliminando colunas que não serão utilizadas
d_tiss_tratado.drop(['CID_2', 'CID_3', 'CID_4', 'IDENTIFICACAO_OPERADORA', 'IDENTIFICACAO_PRESTADOR', 
               'PORTE_OPERADORA', 'UF_PRESTADOR'], axis = 1, inplace = True)

# Transformando a coluna CID_1 para o tipo str
d_tiss_tratado['CID_1'] = d_tiss_tratado['CID_1'].astype('str')

Como o objetivo principal da análise é conhecer o perfil epidemiológico dos beneficiários de planos de saúde do Estado da Bahia atendidos em hospitais, faz-se necessário eliminar os registros que não possui o CID diagnóstico principal.


In [71]:
# Eliminando os registros que não possui o CID Diagnostico principal
d_tiss_tratado = d_tiss_tratado[(d_tiss_tratado.CID_1 != '-1') & (d_tiss_tratado.CID_1 != '-2')]
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado.shape[0]) + ' linhas e ' + str(d_tiss_tratado.shape[1]) + ' colunas')


O Dataframe d_tiss_tratado possui 162131 linhas e 21 colunas

Após excluir os registros que não possui o CID de diagnóstico principal, restaram 162131 linhas e 10 colunas. Agora será necessário acrescentar outras colunas para ajudar no processo de análise e responder as perguntas. Começarei realizando uma série de operações cujo objetivo é unir informações para que seja possível identtificar a Classificação Estatística Internacional de Doenças e Problemas Relacionados com a Saúde de acordo com o Capítulo, Categoria e Subcategoria do CID primeiro diagnóstico ou diagnóstico principal.


In [56]:
# Função para localizar um caracter detro de uma string
def find(str1, ch):
    indice = 0
    while indice < len(str1):
        if str1[indice] == ch:
            return indice
        indice = indice + 1
    return -1

In [57]:
# Criando os dataframes cid_capit e cid_subcat
cid_capit  = cid_capitulo[['NUMCAP','DESCRICAO']].copy()
cid_categ  = cid_categoria[['CAT','DESCRICAO']].copy()
cid_subcat = cid_subcategorias[['SUBCAT','RESTRSEXO', 'DESCRICAO']].copy()

# Renomeando as colunas do dataframe cid_categ
cid_categ.columns = ['CID_CAT','CID_CATEGORIA']


# Renomeando as colunas do dataframe cid_capit
cid_capit.columns = ['CID_NUMCAP','CID_CAPITULO']

# Eliminado da descrição do capítulo a parte que faz referencia ao capítulo em si
cid_capit['CID_CAPITULO'] = cid_capit.apply(lambda row: ''.join(row['CID_CAPITULO'])[find(''.join(row['CID_CAPITULO']),'-')+2:len(''.join(row['CID_CAPITULO']))],axis=1) 

# Renomeando as colunas do dataframe cid_subcat
cid_subcat.columns = ['CID_SUBCAT','CID_RESTRSEX','CID_SUBCATEGORIA']

In [59]:
# Identificando em qual capítulo do CID o CID do diagnóstico principal pertence 
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 1 if (row['CID_1'][0:3].strip() >= 'A00') & (row['CID_1'][0:3].strip() <= 'B99') else '-1', axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 2 if (row['CID_1'][0:3].strip() >= 'C00') & (row['CID_1'][0:3].strip() <= 'D48') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 3 if (row['CID_1'][0:3].strip() >= 'D50') & (row['CID_1'][0:3].strip() <= 'D89') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 4 if (row['CID_1'][0:3].strip() >= 'E00') & (row['CID_1'][0:3].strip() <= 'E90') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 5 if (row['CID_1'][0:3].strip() >= 'F00') & (row['CID_1'][0:3].strip() <= 'F99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 6 if (row['CID_1'][0:3].strip() >= 'G00') & (row['CID_1'][0:3].strip() <= 'G99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 7 if (row['CID_1'][0:3].strip() >= 'H00') & (row['CID_1'][0:3].strip() <= 'H59') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 8 if (row['CID_1'][0:3].strip() >= 'H60') & (row['CID_1'][0:3].strip() <= 'H95') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 9 if (row['CID_1'][0:3].strip() >= 'I00') & (row['CID_1'][0:3].strip() <= 'I99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 10 if (row['CID_1'][0:3].strip() >= 'J00') & (row['CID_1'][0:3].strip() <= 'J99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 11 if (row['CID_1'][0:3].strip() >= 'K00') & (row['CID_1'][0:3].strip() <= 'K93') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 12 if (row['CID_1'][0:3].strip() >= 'L00') & (row['CID_1'][0:3].strip() <= 'L99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 13 if (row['CID_1'][0:3].strip() >= 'M00') & (row['CID_1'][0:3].strip() <= 'M99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 14 if (row['CID_1'][0:3].strip() >= 'N00') & (row['CID_1'][0:3].strip() <= 'N99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 15 if (row['CID_1'][0:3].strip() >= 'O00') & (row['CID_1'][0:3].strip() <= 'O99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 16 if (row['CID_1'][0:3].strip() >= 'P00') & (row['CID_1'][0:3].strip() <= 'P96') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 17 if (row['CID_1'][0:3].strip() >= 'Q00') & (row['CID_1'][0:3].strip() <= 'Q99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 18 if (row['CID_1'][0:3].strip() >= 'R00') & (row['CID_1'][0:3].strip() <= 'R99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 19 if (row['CID_1'][0:3].strip() >= 'S00') & (row['CID_1'][0:3].strip() <= 'T98') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 20 if (row['CID_1'][0:3].strip() >= 'V01') & (row['CID_1'][0:3].strip() <= 'Y98') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 21 if (row['CID_1'][0:3].strip() >= 'Z00') & (row['CID_1'][0:3].strip() <= 'Z99') else row['CID_NUMCAP'], axis=1)
d_tiss_tratado['CID_NUMCAP'] = d_tiss_tratado.apply(lambda row: 22 if (row['CID_1'][0:3].strip() >= 'U04') & (row['CID_1'][0:3].strip() <= 'U99') else row['CID_NUMCAP'], axis=1)

In [24]:
d_tiss_tratado2 = d_tiss_tratado.copy()

In [ ]:
d_tiss_tratado = d_tiss_tratado2.copy()

In [ ]:
d_tiss_tratado.dtypes

In [61]:
# Identificando em qual categoria do CID o CID subcategoria pertence  
d_tiss_tratado['CID_CAT'] = d_tiss_tratado.apply(lambda row: row['CID_1'][0:3], axis=1)

# Fazendo merge com os dataframes cid_capit, cid_categ, sid_subcateg
d_tiss_tratado = d_tiss_tratado.merge(cid_capit,  left_on='CID_NUMCAP', right_on='CID_NUMCAP', how='left')
d_tiss_tratado = d_tiss_tratado.merge(cid_categ,  left_on='CID_CAT', right_on='CID_CAT', how='left')
d_tiss_tratado = d_tiss_tratado.merge(cid_subcat,  left_on='CID_1', right_on='CID_SUBCAT', how='left')

Preenchendo dados faltantes


In [26]:
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado[(d_tiss_tratado.CD_SEXO == -1)].shape[0]) + 
      ' linhas que não possuem a informação de sexo do beneficiário informado')


O Dataframe d_tiss_tratado possui 11162 linhas que não possuem a informação de sexo do beneficiário informado

Após eliminar os registros que não possuíam o CID diagnostico principal restaram 162131 linhas, sendo que destas 11162 não possuem a informação do sexo do beneficiário. Alguns CIDs são restritos ao sexo do paciente, através desta informação é possível identificar o sexo de alguns beneficiários que não possui o registro desta informação. Usarei este recurso para preencher sexo de alguns pacientes que falta esta informação.


In [63]:
# Atualizando a coluna CD_SEXO dos registros faltantes de acordo com o campo RESTRSEXO correspondente ao CID diagnóstico principal
d_tiss_tratado['CD_SEXO'] = d_tiss_tratado.apply(lambda row: 1 if (row['CID_RESTRSEX'] == 'M') else row['CD_SEXO'], axis=1)
d_tiss_tratado['CD_SEXO'] = d_tiss_tratado.apply(lambda row: 3 if (row['CID_RESTRSEX'] == 'F') else row['CD_SEXO'], axis=1)

In [28]:
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado[(d_tiss_tratado.CD_SEXO == -1)].shape[0]) + ' linhas sem o sexo do beneficiário informado')


O Dataframe d_tiss_tratado possui 9517 linhas sem o sexo do beneficiário informado

Após preencher a coluna CD_SEXO de acordo com a coluna RESTRSEXO correspondente ao CID diagnóstico principal restaram 9517 sem a informação do sexo do beneficiário. Agora utilizarei uma outra abordagem para preencher o sexo do beneficiário dos 9517 registros que restaram através da maior frequência por CID diagnóstico principal.


In [29]:
# Alterando o valores faltantes da coluna CD_SEXO de -1 para NaN 
d_tiss_tratado['CD_SEXO'] = d_tiss_tratado.apply(lambda row: np.nan if (row['CD_SEXO'] == -1) else row['CD_SEXO'], axis=1)

# Criando um novo dataframe com a frequencia de sexo por CID 
frequencia_sexo = d_tiss_tratado.groupby(["CID_1","CD_SEXO"]).CD_SEXO.count().astype('int64').reset_index(name='FREQUENCIA_SEXO')

# Agrupando o sexo mais frequente por CID
frequencia_sexo = frequencia_sexo.groupby(["CD_SEXO","CID_1"]).FREQUENCIA_SEXO.max().astype('int64').reset_index(name='FREQUENCIA_SEXO')

# Eliminando a coluna FREQUENCIA_SEXO
frequencia_sexo.drop('FREQUENCIA_SEXO', axis = 1, inplace = True)

# Renomeando as coluna 
frequencia_sexo.columns = ['CD_SEXO_MAIS_FREQUENTE','CID_1']

# Fazendo merge com os dataframes frequencia_sexo e d_tiss_tratado
d_tiss_tratado = d_tiss_tratado.merge(frequencia_sexo,  left_on='CID_1', right_on='CID_1', how='left')

d_tiss_tratado['CD_SEXO'].fillna(d_tiss_tratado['CD_SEXO_MAIS_FREQUENTE'], inplace=True)
d_tiss_tratado['CD_SEXO'].fillna(-1, inplace=True)
d_tiss_tratado['CD_SEXO'] = d_tiss_tratado['CD_SEXO'].astype('int64')
d_tiss_tratado.drop('CD_SEXO_MAIS_FREQUENTE', axis = 1, inplace = True)

In [30]:
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado[(d_tiss_tratado.CD_SEXO == -1)].shape[0]) + ' linhas sem o sexo do beneficiário informado')


O Dataframe d_tiss_tratado possui 387 linhas sem o sexo do beneficiário informado

In [31]:
d_tiss_tratado.head()


Out[31]:
ID_EVENTO IDENTIFICACAO_BENEFICIARIO IDADE_BENEFICIARIO CD_SEXO CD_MUNICIPIO_PRESTADOR COMPETENCIA_EVENTO CID_1 CD_PROCEDIMENTO_TUSS QTD_PROCEDIMENTO VALOR_PROCEDIMENTO CID_NUMCAP CID_CAT CID_CAPITULO CID_CATEGORIA CID_SUBCAT CID_RESTRSEX CID_SUBCATEGORIA
0 481457792 CA35C957C68AA63C5B3FB1FE4E14955B 59 3 293330 201507 R100 4 2 68.86 18 R10 Sintomas, sinais e achados anormais de exames ... Dor abdominal e pélvica R100 NaN Abdome agudo
1 481457792 CA35C957C68AA63C5B3FB1FE4E14955B 59 3 293330 201507 R100 4 2 68.86 18 R10 Sintomas, sinais e achados anormais de exames ... Dor abdominal e pélvica R100 NaN Abdome agudo
2 963706115 F2D8ECAF526A8486EE4264DE3535FCF4 6 3 292740 201507 C711 1 2 70.43 2 C71 Neoplasias [tumores] Neoplasia maligna do encéfalo C711 NaN Neoplasia maligna do lobo frontal
3 963706115 F2D8ECAF526A8486EE4264DE3535FCF4 6 3 292740 201507 C711 1 2 70.43 2 C71 Neoplasias [tumores] Neoplasia maligna do encéfalo C711 NaN Neoplasia maligna do lobo frontal
4 963810635 677592C57167436800858909319D1615 41 1 291080 201507 K802 27 2 157.40 11 K80 Doenças do aparelho digestivo Colelitíase K802 NaN Calculose da vesícula biliar sem colecistite

In [66]:
# Separando em colunas sexo masculino e sexo feminino a partir da coluna CD_SEXO
d_tiss_tratado['FEMININO'] = d_tiss_tratado.apply(lambda row: 1 if (row['CD_SEXO'] == 3) else 0, axis=1)
d_tiss_tratado['MASCULINO'] = d_tiss_tratado.apply(lambda row: 1 if (row['CD_SEXO'] == 1) else 0, axis=1)

In [33]:
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado[(d_tiss_tratado.IDADE_BENEFICIARIO == -1)].shape[0]) + 
      ' linhas que não possuem a informação de idade do beneficiário informado')


O Dataframe d_tiss_tratado possui 19617 linhas que não possuem a informação de idade do beneficiário informado

Utilizarei como estratégia para preenchimento da idade dos beneficiários que não possuem esta informação a média das idades agrupadas por CID. Primeiramente irei criar um novo dataframe contendo o CID e a média de idade com base no dataframe d_tiss_tratado, depois farei um merge e por último farei um apply na idade dos beneficiários que estão sem essa informação.


In [68]:
# Criando um novo dataframe com a media de idade por CID 
media_idade = d_tiss_tratado.groupby(["CID_1"]).IDADE_BENEFICIARIO.mean().astype('int64').reset_index(name='MEDIA_IDADE')

# Fazendo um merge do dataframe media_idade com o dataframe d_tiss_tratado para acrescentar a coluna MEDIA_IDADE
d_tiss_tratado = d_tiss_tratado.merge(media_idade,  left_on='CID_1', right_on='CID_1', how='left')

# Atualizando a coluna IDADE_BENEFICIARIO de acordo com o campo MEDIA_IDADE por CID diagnóstico principal, apenas para os registros faltantes
d_tiss_tratado['IDADE_BENEFICIARIO'] = d_tiss_tratado.apply(lambda row: row['MEDIA_IDADE'] if (row['IDADE_BENEFICIARIO'] == -1) else row['IDADE_BENEFICIARIO'], axis=1)

In [35]:
print('O Dataframe d_tiss_tratado possui ' + str(d_tiss_tratado[(d_tiss_tratado.IDADE_BENEFICIARIO == -1)].shape[0]) + 
      ' linhas que não possuem a informação de idade do beneficiário informado')


O Dataframe d_tiss_tratado possui 409 linhas que não possuem a informação de idade do beneficiário informado

In [36]:
d_tiss_tratado.dtypes


Out[36]:
ID_EVENTO                       int64
IDENTIFICACAO_BENEFICIARIO     object
IDADE_BENEFICIARIO              int64
CD_SEXO                         int64
CD_MUNICIPIO_PRESTADOR          int64
COMPETENCIA_EVENTO              int64
CID_1                          object
CD_PROCEDIMENTO_TUSS            int64
QTD_PROCEDIMENTO                int64
VALOR_PROCEDIMENTO            float64
CID_NUMCAP                      int64
CID_CAT                        object
CID_CAPITULO                   object
CID_CATEGORIA                  object
CID_SUBCAT                     object
CID_RESTRSEX                   object
CID_SUBCATEGORIA               object
FEMININO                        int64
MASCULINO                       int64
MEDIA_IDADE                     int64
dtype: object

In [70]:
# Criando a faixa etária de acordo com a classificação do IBGE
bins = [0,4,9,14,19,24,29,34,39,44,49,54,59,64,69,74,79,84,89,94,99,200]
labels=['0 a 4 anos','5 a 9 anos','10 a 14 anos','15 a 19 anos','20 a 24 anos','25 a 29 anos','30 a 34 anos','35 a 39 anos','40 a 44 anos','45 a 49 anos','50 a 54 anos','55 a 59 anos','60 a 64 anos','65 a 69 anos','70 a 74 anos','75 a 79 anos','80 a 84 anos','85 a 89 anos','90 a 94 anos','95 a 99 anos','Mais de 100 anos']
#labels=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
d_tiss_tratado['FAIXA_ETARIA'] = pd.cut(d_tiss_tratado['IDADE_BENEFICIARIO'], bins=bins, labels=labels, include_lowest=True)

In [38]:
d_tiss_tratado.dtypes


Out[38]:
ID_EVENTO                        int64
IDENTIFICACAO_BENEFICIARIO      object
IDADE_BENEFICIARIO               int64
CD_SEXO                          int64
CD_MUNICIPIO_PRESTADOR           int64
COMPETENCIA_EVENTO               int64
CID_1                           object
CD_PROCEDIMENTO_TUSS             int64
QTD_PROCEDIMENTO                 int64
VALOR_PROCEDIMENTO             float64
CID_NUMCAP                       int64
CID_CAT                         object
CID_CAPITULO                    object
CID_CATEGORIA                   object
CID_SUBCAT                      object
CID_RESTRSEX                    object
CID_SUBCATEGORIA                object
FEMININO                         int64
MASCULINO                        int64
MEDIA_IDADE                      int64
FAIXA_ETARIA                  category
dtype: object

In [50]:
d_tiss_tratado.describe()


Out[50]:
ID_EVENTO IDADE_BENEFICIARIO CD_SEXO CD_MUNICIPIO_PRESTADOR COMPETENCIA_EVENTO CD_PROCEDIMENTO_TUSS QTD_PROCEDIMENTO VALOR_PROCEDIMENTO CID_NUMCAP FEMININO MASCULINO MEDIA_IDADE
count 2.870060e+05 287006.000000 287006.000000 287006.000000 287006.000000 2.870060e+05 287006.000000 287006.000000 287006.000000 287006.000000 287006.000000 287006.000000
mean 7.571487e+08 42.243072 2.125621 292343.563114 201573.938590 1.291640e+07 8.447635 470.399581 11.879421 0.564159 0.434493 39.352125
std 3.138440e+08 21.311291 0.997502 789.304744 45.771607 1.290509e+07 26.939113 805.734040 5.535306 0.495867 0.495691 13.683945
min 1.319261e+06 -1.000000 -1.000000 290070.000000 201507.000000 1.000000e+00 1.000000 0.000000 1.000000 0.000000 0.000000 -1.000000
25% 5.428393e+08 29.000000 1.000000 292530.000000 201511.000000 9.000000e+00 1.000000 68.625000 9.000000 0.000000 0.000000 30.000000
50% 9.639169e+08 39.000000 3.000000 292740.000000 201603.000000 1.010202e+07 2.000000 212.350000 13.000000 1.000000 0.000000 38.000000
75% 9.650840e+08 57.000000 3.000000 292740.000000 201608.000000 3.050112e+07 5.000000 571.710000 16.000000 1.000000 1.000000 49.000000
max 9.658329e+08 105.000000 3.000000 293330.000000 201612.000000 3.160222e+07 1826.000000 28672.000000 21.000000 1.000000 1.000000 100.000000

In [ ]:
# Salvando dataset tratado
d_tiss_tratado.to_csv('d_tiss_tratado.csv')

In [73]:
# Criando um dataframe para construir uma piramide etária
piramide_etaria = d_tiss_tratado.groupby("FAIXA_ETARIA")["FEMININO","MASCULINO","VALOR_PROCEDIMENTO"].sum().reset_index()
piramide_etaria["PERC_FEMININO"] = (piramide_etaria["FEMININO"] / (piramide_etaria["FEMININO"]+piramide_etaria["MASCULINO"])).astype('float64')
piramide_etaria["PERC_MASCULINO"] = (piramide_etaria["MASCULINO"] / (piramide_etaria["FEMININO"]+piramide_etaria["MASCULINO"])).astype('float64')
piramide_etaria["VALOR_FEMININO"] = round(piramide_etaria["VALOR_PROCEDIMENTO"] * piramide_etaria["PERC_FEMININO"],2)
piramide_etaria["VALOR_MASCULINO"] = round(piramide_etaria["VALOR_PROCEDIMENTO"] * piramide_etaria["PERC_MASCULINO"],2)
piramide_etaria["MASCULINO"] = piramide_etaria["MASCULINO"] * -1

In [42]:
piramide_etaria


Out[42]:
FAIXA_ETARIA FEMININO MASCULINO VALOR_PROCEDIMENTO PERC_FEMININO PERC_MASCULINO VALOR_FEMININO VALOR_MASCULINO
0 0 a 4 anos 6256 -8518 3648750.92 0.423447 0.576553 1545051.15 2103699.77
1 5 a 9 anos 2923 -4138 1848978.71 0.413964 0.586036 765410.67 1083568.04
2 10 a 14 anos 1949 -2752 1600638.46 0.414593 0.585407 663612.92 937025.54
3 15 a 19 anos 4396 -3723 3214897.70 0.541446 0.458554 1740693.47 1474204.23
4 20 a 24 anos 8915 -4681 5883829.57 0.655708 0.344292 3858071.54 2025758.03
5 25 a 29 anos 17543 -8992 11561585.71 0.661127 0.338873 7643674.32 3917911.39
6 30 a 34 anos 24254 -11424 16817899.37 0.679803 0.320197 11432853.06 5385046.31
7 35 a 39 anos 21868 -12764 17257029.44 0.631439 0.368561 10896763.68 6360265.76
8 40 a 44 anos 13742 -9728 11816802.52 0.585513 0.414487 6918896.47 4897906.05
9 45 a 49 anos 11037 -8952 9806900.69 0.552154 0.447846 5414916.35 4391984.34
10 50 a 54 anos 9985 -8406 9704779.29 0.542929 0.457071 5269002.30 4435776.99
11 55 a 59 anos 8419 -10116 9757620.01 0.454222 0.545778 4432123.17 5325496.84
12 60 a 64 anos 6528 -9114 8241587.45 0.417338 0.582662 3439527.10 4802060.35
13 65 a 69 anos 4649 -6836 6806594.60 0.404789 0.595211 2755233.63 4051360.97
14 70 a 74 anos 3802 -4687 4639608.53 0.447874 0.552126 2077958.73 2561649.80
15 75 a 79 anos 4605 -3619 4404313.54 0.559946 0.440054 2466179.94 1938133.60
16 80 a 84 anos 4867 -2683 3545075.43 0.644636 0.355364 2285282.40 1259793.03
17 85 a 89 anos 3371 -1820 2384178.36 0.649393 0.350607 1548269.17 835909.19
18 90 a 94 anos 2073 -1441 1428203.10 0.589926 0.410074 842534.16 585668.94
19 95 a 99 anos 651 -281 422902.44 0.698498 0.301502 295396.45 127505.99
20 Mais de 100 anos 64 -25 21294.20 0.719101 0.280899 15312.68 5981.52

In [192]:
piramide_etaria.dtypes


Out[192]:
FAIXA_ETARIA          category
FEMININO                 int64
MASCULINO                int64
VALOR_PROCEDIMENTO     float64
PERC_FEMININO          float64
PERC_MASCULINO         float64
VALOR_FEMININO         float64
VALOR_MASCULINO        float64
dtype: object

Visualização dos Dadas

Primeiramente irei construir uma Pirâmide Etária para conhecermos em quais faixa etária concentram-se os atendimentos. A Pirâmide Etária é um gráfico que permite analisar a distribuição da população por idade e sexo.


In [40]:
#Cores para serem usadas nos gráficos
colors = [['#0D47A1','#1565C0','#1976D2','#1E88E5','#2196F3'],
          ['#311B92','#512DA8','#673AB7','#9575CD','#B39DDB'],
          ['#1B5E20','#388E3C','#4CAF50','#81C784','#66BB6A'],
          ['#E65100','#EF6C00','#F57C00','#FB8C00','#FF9800'],
          ['#3E2723','#4E342E','#5D4037','#6D4C41','#795548'],
          ['#BF360C','#D84315','#E64A19','#F4511E','#FF5722'],
          ['#880E4F','#AD1457','#C2185B','#D81B60','#E91E63']
         ]

In [184]:
sns.set_style("white")

fig = plt.figure(figsize=(12,8))
plt.xlim(-16000, 16000)


bar_plot1 = sns.barplot(x="MASCULINO",y="FAIXA_ETARIA", 
                       order=['Mais de 100 anos','95 a 99 anos','90 a 94 anos','85 a 89 anos','80 a 84 anos','75 a 79 anos','70 a 74 anos','65 a 69 anos','60 a 64 anos','55 a 59 anos','50 a 54 anos','45 a 49 anos','40 a 44 anos','35 a 39 anos','30 a 34 anos','25 a 29 anos','20 a 24 anos','15 a 19 anos','10 a 14 anos','5 a 9 anos','0 a 4 anos'],
                       orient = 'h',color="blue", label="Homens",data = piramide_etaria)

for p in bar_plot1.axes.patches:
    b=p.get_bbox()
    bar_plot1.axes.annotate("{:.0f}".format(-b.x0), (-p.get_width() - 500, p.get_y() + 0.4), size=8, 
                                va='center', ha='right', bbox=dict(boxstyle='square', fc = 'w')) 

plt.legend(loc='upper left')

bar_plot2 = sns.barplot(x="FEMININO",y="FAIXA_ETARIA", 
                       order=['Mais de 100 anos','95 a 99 anos','90 a 94 anos','85 a 89 anos','80 a 84 anos','75 a 79 anos','70 a 74 anos','65 a 69 anos','60 a 64 anos','55 a 59 anos','50 a 54 anos','45 a 49 anos','40 a 44 anos','35 a 39 anos','30 a 34 anos','25 a 29 anos','20 a 24 anos','15 a 19 anos','10 a 14 anos','5 a 9 anos','0 a 4 anos'],
                       orient = 'h', color="red", label="Mulheres",data = piramide_etaria) 
for p in bar_plot2.axes.patches:
    b=p.get_bbox()
    if b.x1 > 0:
        bar_plot2.axes.annotate("{:.0f}".format(b.x1), (p.get_x() + p.get_width() + 500, p.get_y() + 0.4), size=8, 
                                va='center', ha='left', bbox=dict(boxstyle='square', fc = 'w')) 
plt.legend(loc='best')   

# Ocultar eixo x      
#bar_plot1.axes.get_xaxis().set_visible(False)
#bar_plot2.axes.get_xaxis().set_visible(False)



#bar_plot2.set(xlabel="Atendimentos", ylabel="Faixa Etária", title = "Piramide Etária")

bar_plot1.set(xlabel="Atendimentos", ylabel="Faixa Etária", title = "Piramide Etária")
sns.despine(left=True)
plt.show()


Através do gráfico acima podemos observar que é na população feminina entre 30 e 39 anos que registra-se o maior volume de atendimentos. Considerando toda população em estudo podemos concluir que as mulheres são as que mais utilizam plano o de saúde.


In [ ]:

Perfil Epidemiológico

Com base na Classificação Internacional de Doenças vamos avaliar a distribuição de atendimentos por classificação de doenças para identificar-mos quais as principais doenças dos beneficiários de plano de saude da Bahia.


In [79]:
# Grafico - Volume de atendimentos por capitulo
ax = d_tiss_tratado.groupby('CID_CAPITULO')['ID_EVENTO'].count().sort_values().plot(kind='barh', color=random.choice(colors), figsize=(10,10))
sns.despine(left=True)
for p in ax.patches:
    b=p.get_bbox()
    ax.annotate("{:.0f}".format(b.x1 + b.x0), (p.get_x() + p.get_width() + 1, p.get_y() - 0.05))
    
plt.title('ATENDIMENTOS REALIZADOS POR CAPÍTULO \n Total: ' + str(d_tiss_tratado['ID_EVENTO'].count()) + ' Atendimentos')
plt.ylabel('CAPITULOS')
plt.xlabel('QUANTIDADE DE ATENDIMENTOS', )
plt.show()


Através do gráfico acima podemos perceber que os três principais Capítulos são: Doenças do aparelho geniturinário é o Capítulo que possui maior incidência diagnóstica na população, em seguida vem Sintomas, sinais e achados anormais de exames clínicos e de laboratório, não classificados em outra parte e depois doenças do aparelho circulatório.

Sintomas, sinais e achados anormais de exames clínicos e de laboratório, não classificados em outra parte

Sinais e sintomas que conduzam de forma razoavelmente precisa a um dado diagnóstico estão classificados em categorias de outros capítulos desta classificação. De modo geral, as categorias deste capítulo incluem aqueles sintomas e afecções menos bem definidas que, sem que tenha havido o necessário estudo do caso para se estabelecer um diagnóstico final, podem conduzir com igual possibilidade a duas ou mais doenças diferentes ou a dois ou mais aparelhos do corpo. Praticamente todas as categorias deste capítulo se poderiam designar como “não especificado de outra forma”, “etiologia desconhecida” ou “transitório”. O Índice Alfabético deve ser consultado para se determinar quais sintomas e sinais devem ser alocados aqui e quais a outros capítulos. As subcategorias residuais .8 são fornecidas para outros sintomas relevantes que não possam ser classificados em outras partes da classificação. As afecções e sinais ou sintomas incluídos nas categorias R00-R99 consistem de: a) casos para os quais não se possa chegar a um diagnóstico mais preciso, mesmo depois que todos os fatos que digam respeito ao caso tenham sido investigados; b) sinais ou sintomas existentes no momento da primeira consulta que se mostrem de caráter transitório e cujas causas não possam ser determinadas; c) diagnósticos provisórios atribuídos a um paciente que não retorne a consulta para aprofundamento da investigação do diagnóstico ou para assistência; d) casos encaminhados a outros locais para investigação ou tratamento antes que o diagnóstico fosse feito; e) casos para os quais não foi possível estabelecer um diagnóstico mais preciso por qualquer outra razão; f) alguns sintomas para os quais se fornece informação complementar e que representam por si só importantes problemas na assistência médica.

Fonte: http://www.datasus.gov.br/cid10/V2008/WebHelp/r00_r99.htm

Conforme consta na definição acima as categorias deste capítulo incluem diagnósticos menos precisos, de carater provisório ou trasitórios, etc. Por isso irei deixa-lo de fora das demais análises que demonstrarei sobre o perfil epidemiológico.


In [80]:
#  Grafico - Volume de atendimentos por capitulo - Sexo masculino, excuindo-se o capítulo XVIII
ax = d_tiss_tratado[(d_tiss_tratado.CD_SEXO == 1) & (d_tiss_tratado.CID_NUMCAP != 18)].groupby('CID_CAPITULO')['ID_EVENTO'].count().sort_values().plot(kind='barh', color=random.choice(colors), figsize=(10,10))
sns.despine(left=True)
for p in ax.patches:
    b=p.get_bbox()
    ax.annotate("{:.0f}".format(b.x1 + b.x0), (p.get_x() + p.get_width() + 1, p.get_y() - 0.05))
    
plt.title('ATENDIMENTOS REALIZATDOS POR CAPÍTULO \n Total: ' + str(d_tiss_tratado[(d_tiss_tratado.CD_SEXO == 1)]['ID_EVENTO'].count()) + ' Atendimentos')
plt.ylabel('CAPÍTULOS')
plt.xlabel('QUANTIDADE DE ATENDIMENTOS - SEXO MASCULINO', )
plt.show()


Quando olhamos separadamente por sexo, as três principais classificações de doenças que mais ocorrem para os homens são: Doenças do aparelho circulatório, Doenças do aparelho geniturinário e Doenças do aparelho respiratório.


In [129]:
#  Grafico - Volume de atendimentos por capitulo - Sexo feminino, excuindo-se o capítulo XVIII
ax = d_tiss_tratado[(d_tiss_tratado.CD_SEXO == 3) & (d_tiss_tratado.CID_NUMCAP != 18)].groupby('CID_CAPITULO')['ID_EVENTO'].count().sort_values().plot(kind='barh', color=random.choice(colors), figsize=(10,10))
sns.despine(left=True)
for p in ax.patches:
    b=p.get_bbox()
    ax.annotate("{:.0f}".format(b.x1 + b.x0), (p.get_x() + p.get_width() + 1, p.get_y() - 0.05))
    
plt.title('ATENDIMENTOS REALIZADOS POR CAPÍTULO \n Total: ' + str(d_tiss_tratado[(d_tiss_tratado.CD_SEXO == 3)]['ID_EVENTO'].count()) + ' Atendimentos')
plt.ylabel('CAPÍTULOS')
plt.xlabel('QUANTIDADE DE ATENDIMENTOS - SEXO FEMININO', )
plt.show()


Já para as mulheres temos Gravidez, parto e puerpério, em seguida vem as Doenças do aparelho geniturinário e depois Doenças do aparelho circulatório.


In [130]:
# As 10 principais Categorias de Doenças do aparelho geniturinário
ax = d_tiss_tratado[(d_tiss_tratado.CID_NUMCAP == 14)].groupby('CID_CATEGORIA')['MASCULINO','FEMININO'].sum().sort_values(by=['MASCULINO','FEMININO'], ascending=False).iloc[:10].plot(kind='barh', color=random.choice(colors), figsize=(10,10))
sns.despine(left=True)
ax.invert_yaxis()

for p in ax.patches:
    b=p.get_bbox()
    ax.annotate("{:.0f}".format(b.x1 + b.x0), (p.get_x() + p.get_width() + 1, p.get_y() + 0.2))
    
plt.title('DOENÇAS DO APARELHO GENITURINÁRIO \n 10 Principais Categorias')
plt.ylabel('CATEGORIA')
plt.xlabel('QUANTIDADE DE ATENDIMENTOS', )
plt.show()


Já na classificação Doenças do aparelho genituário a Calculose do rim e do ureter se destaca como a categoria de doença mais frequente, sendo que dentre os casos diagnosticados, 59% ocorreram em Homens e 41% em Mulheres.


In [82]:
# As 10 principais Cateorias de Doenças do aparelho circulatório
ax = d_tiss_tratado[(d_tiss_tratado.CID_NUMCAP == 9)].groupby('CID_CATEGORIA')['FEMININO','MASCULINO'].sum().sort_values(by=['FEMININO','MASCULINO'], ascending=False).iloc[:10].plot(kind='barh', color=random.choice(colors), figsize=(10,10))
sns.despine(left=True)
ax.invert_yaxis()

for p in ax.patches:
    b=p.get_bbox()
    ax.annotate("{:.0f}".format(b.x1 + b.x0), (p.get_x() + p.get_width() + 1, p.get_y() + 0.2))
    
plt.title('DOENÇAS DO APARELHO CIRCULATÓRIO \n 10 Principais Categorias')
plt.ylabel('CATEGORIA')
plt.xlabel('QUANTIDADE DE ATENDIMENTOS', )
plt.show()