SAMU em 2015 — Uma análise Parte I

Peço perdão se você achar meus vícios de escrita neste texto, ele é um pouco informal.

A primeira parte deste post se refere ao objetivo deste projeto que estou escrevendo o código e rodando desde Janeiro.

Eu estou tentando melhorar minha formulação de perguntas. Não desoluções. Ainda não sou bom nem na primeira quanto mais na segunda. Mas melhorei minha forma de escrever, pelo que parece.

O que é?

Os dados que analisei (estou analisando) são referentes as chamadas de socorro do ano de 2015 feitas pelo SAMU. Foram 70.011 chamadas. Isto só para o SAMU.

Ele se encontra no link e é dividido em 5 datasets “viaturas”,”bairros”,”distritos”, “especialidades”, “remocoes” e “solicitacoes”.

Mas a variável que será foco do trabalho é desistência, preenchida a posteriori, é uma variável que posso utilizar algoritmos de aprendizagem de máquina para avaliar seus resultados, o problema será binário, ou seja: Desistiu ou não desistiu.

Análise Exploratória

Basicamente, uma análise exploratória é entender como as variáveis se relacionam, quais insights são possíveis explorar.

Ao separar o dataset por sexo, já temos algum (que diz nada) resultado:

A desistência entre homens e mulheres é insignificante, os primeiros desistem 14,5% das vezes e as segundas, 13,3% das vezes.

A partir do sexo, decidi brincar com a idade e sai fazendo algumas divisões, por exemplo, como se comportam os idosos? E pensei em como fazer uma segmentação correta. Foi legal achar que existe uma definição na lei para idoso:

No Brasil, considera-se idoso quem tiver atingido os 60 ou mais anos de idade, homem ou mulher, nacional ou estrangeiro, urbano ou rural, trabalhador da iniciativa privada, de serviço público, livre ou recluso, exercendo atividades ou aposentado, incluindo o pensionista e qualquer que seja a sua condição social (Martinez, 2005, pg. 20).

Fonte: http://boilerdo.blogspot.com.br/2013/04/quem-pode-ser-considerado-idoso-nos.html

Outra fonte: http://www.planalto.gov.br/ccivil_03/leis/l8842.htm

Os idosos correspondem à 25% das chamadas com 17,802 exemplos, aqui a disparidade entre os sexos aumenta:

[Gráfico dos idosos separados por sexo]

Transformando os dados (E continuando a Análise)

Existe uma coluna chamada “solicitacao_data”, ai pensei em quais perguntas eu poderia responder, aqui vai a primeira:

Qual o pior dia e hora para chamar o SAMU?

Como ele é uma data, a primeira coisa que tive de transformar, foi criar uma coluna que dado uma data, retorna o dia da semana. O resultado foi a distribuição abaixo:

E como fiz para descobrir o dia que há mais demora?

Foi esse código #suave #sqn que calculei a quantidade de minutos que cada chamada demorou, ainda acho que eu devo olhar os outliers para melhorar minha análise:

teste para calcular o tempo de espera -> chegada ao hospital
tempo_1 = solicitacoes_2015[“data_acionamento”][0]
tempo_2 = solicitacoes_2015[“data_chegada”][0]
fmt = “%Y-%m-%d %H:%M” #REGEX
tempo_1_parsed = datetime.datetime.strptime(tempo_1,fmt)
tempo_2_parsed = datetime.datetime.strptime(tempo_2,fmt)
tp1_ts = time.mktime(tempo_1_parsed.timetuple())
tp2_ts = time.mktime(tempo_2_parsed.timetuple())
print(tempo_1)
print(tempo_2)
#print(tp2_ts)
#print(tp1_ts)
print (str(int(tp2_ts-tp1_ts) / 60) + “ minutos “)
index = 0
tempo_de_transporte = []
for data_acionamento in solicitacoes_2015[“data_acionamento”]:
 if type(data_acionamento) is not float: #nan is considered to be a float type
 data_acionamento_parser = datetime.datetime.strptime(data_acionamento, fmt)
 data_acionamento_ts = time.mktime(data_acionamento_parser.timetuple())
 if type(solicitacoes_2015[“data_chegada”].iloc[index]) is not float:
 data_chegada_parser = datetime.datetime.strptime(solicitacoes_2015[“data_chegada”].iloc[index], fmt)
 data_chegada_ts = time.mktime(data_chegada_parser.timetuple())
 #print(data_acionamento_parser)
 #print(data_chegada_parser)
 tempo_de_transporte_instancia = int(data_chegada_ts — data_acionamento_ts)/ 60
 tempo_de_transporte.append(tempo_de_transporte_instancia)
 print(str(tempo_de_transporte_instancia) + “ minutos”)
 else:
 tempo_de_transporte.append(9999) #Significando Missing
 else:
 tempo_de_transporte.append(9999) #Significando Missing
 index += 1

Para conseguir realizar algo com esses dados, tive de utilizar a função GroupBy, e como o próprio nome diz, ele forma grupos a partir dos valores distintos de uma coluna.

#agrupando por dia da semana, quais deles possui a maior quantidade de desistências?
solicitacoes_2015_por_dia = solicitacoes_2015.groupby(“solicitacao_diadasemana”)
for dia, solicitacoes in solicitacoes_2015_por_dia:
 print(“No dia “ + dia +”\n”)
 qtd_desistencias = solicitacoes[solicitacoes[“motivodescarte_descricao”] == “DESISTENCIA DA SOLICITAÇÃO”].shape[0]
 print(str(qtd_desistencias) + “ Desistências”)
 print(str(qtd_desistencias/solicitacoes.shape[0]) + “% de desistências sobre todas as chamadas”)
 print(“\n”)

Eu não consegui descobrir a hora ainda mas o SAMU demora muito mais na Sexta-feira (Adeus #baladinhatop :/).

#DICA 1

Se possível não na sexta.

Existem várias razões para isso, ainda não cruzei com nenhum estudo sobre Recife mas acho ok assumir que o trânsito implica em um grande fator, dado que sexta-feira tá todo mundo na #baladinhaTOP, talvez seja interessante cruzar os hospitais mais lentos e a sua localização. (Alguém conhece algum Dataset de trânsito do Recife?)

Quais os dias que há mais chamadas no SAMU?

Em ordem decrescente, os dias em que houveram mais chamadas do SAMU foram Domingo, sábado e segunda.

No domingo, a demora do SAMU foi em média 38 minutos no Domingo (excluindo as chamadas que foram marcadas como “9999” de tempo de espera) mas ainda contém as chamadas descartadas. Segue o snippet para conseguir os dados:

for dia, solicitacoes in solicitacoes_2015_por_dia:
 print(“No dia “ + dia +”\n”)
 qtd_tempo_gasto = solicitacoes[solicitacoes[“tempo_de_transporte_minutos”] != 9999][“tempo_de_transporte_minutos”].sum()
 print(str(qtd_tempo_gasto) + “ total no dia durante 2015”)
 print(str(qtd_tempo_gasto/solicitacoes.shape[0]) + “ de minutos em média”)
 print(“\n”)

Algo relativamente tranquilo de ser feito, essa transformações trouxeram várias coisas interessantes, como por exemplo, nossa próxima pergunta:

Quais dias há maiores desistências?

E novamente, o campeão foi o Domingo, com 1800 desistências, em torno de 16,7% de todas as chamadas no domingo. Isso quer dizer que o SAMU tem uma margem de QUASE 17% SEM APROVEITAMENTO. Imagine, por exemplo, possíveis causas: Alguém socorreu, o paciente foi atendido por um particular(as pessoas desesperadas podem chamar os dois.) e o trote.

P.S.: Trote é crime e ainda tem homo sapiens que o faz.

Na seção “Quanto custa” do texto você pode perceber que uma equipe e equipamentos do SAMU custam 30R$ MIL!(só para contratar e montar uma ambulância), imagina quanto custa deslocar esse povo todo para uma chamada inútil.

#DICA 2

STAY CALM. E análise a situação, se for possível, se alguém for lhe socorrer, NÃO CHAME O SAMU.

Quais as maiores causas de chamadas?

Entre todos os pacientes que são socorridos, segue o Top 5 de chamadas do SAMU:

CAUSAS EXTERNAS            10378
NEUROLOGICA                 2962
CARDIOLOGICA                2383
INFECÇÃO                    2219
RESPIRATORIA                1960

Eu não sei (ainda) o que significa causas externas. Neurologia, em minha cabeça (ainda não entrevistei ninguém do SAMU para saber sobre), deve ser por traumas cranianos e impactos provenientes de acidentes de trânsito. O mesmo para a CARDIOLOGIA, sim, um monte de gente sofre de infartos, principalmente idosos, como eu pude comprovar ao segmentar os dados entre os idosos.

Fazendo a segmentação dos dados a partir do sexo, o Top 5 se modifica:

Masculino:

CAUSAS EXTERNAS            1024
INFECÇÃO                    753
CARDIOLOGICA                735
NEUROLOGICA                 732
RESPIRATORIA                683

Feminino:

CAUSAS EXTERNAS            807
INFECÇÃO                   605
CARDIOLOGICA               595
RESPIRATORIA               532
NEUROLOGICA                523

E os Bairros?

Existe uma parte do datasets que é “bairros_2015.csv”, que descreve em detalhes os dados da coluna “bairrosaude_descricao”. Fui plotar para saber qual o bairro onde há mais chamadas:

E para entender o porque, fui dar uma olhada na configuração do IBGE do bairro do CENTRO, é discrepante a quantidade de chamadas comparada à outros bairros, porém no link do IBGE sobre Recife, não existe nenhum bairro chamado “Centro”, ainda tenho de procurar a informação sobre quais “bairros” o CENTRO acopla dentro dele.

Ainda acho que essa variável vai ser de grande valor para o modelo que irei criar.

Para a Parte II

Na segunda parte vou mostrar como as transformações no dataset e a implementação de alguns modelos para predizer a variável “desistência”. Métricas como correlação, e como criar uma curva ROC (dado que o problema é binário).

Espero que você tenha gostado do post e segue meus links nas redes sociais:

Canal debugasse: https://www.youtube.com/channel/UCey2da8VAlR–glrFCIggmA

Github: https://github.com/fbormann

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s