Medicamentos da Prefeitura do Recife
Introdução
Declaração do Problema
Esse projeto usa dados abertos da prefeitura do recife, voltando-se para realizar observações sobre os dados acessíveis sobre medicamentos, com o objetivo de resolver o problema da falta de medicamentos entorno das unidades de saúde da Prefeitura do Recife. O projeto tem o objetivo de trazer informações relevantes sobre o assunto para que iniciativas de gestão possam ser tomadas caso seja necessário.
Abordagem Proposta
Neste trabalho são usados Datasets públicos, as tabelas “medicamentos” é dividida por distrito (8 distritos) e é atualizada diariamente, ficando disponível temporariamente (tabelas usadas estão salvas no drive do projeto). Tabelas auxiliares serão usadas como “distritos_sanitários” também disponibilizadas para relacionamento com “medicamentos” dando mais informações, e outras tabelas criadas manualmente serão usadas para fazer as observações necessárias para resolver o problema abordado, mostrando a distribuição e variação do uso de medicamentos para analisar possíveis erros de distribuição.
Técnica Adotada
Com base nos dados formados, serão feitas análises com base na quantidade e na variação diárias de quantidade de medicamentos distribuídos por bairro, distrito sanitário e unidades de saúde da Prefeitura do Recife. Com isso, tendo como objetivo trazer possíveis indicadores de falta e excesso de medicamentos, e comparações entre bairros, distritos e regiões indicando onde poderia ocorrer alguma nova distribuição diferente.
Benefícios para os Potenciais Clientes
Desse modo, esse trabalho traz informações relevantes para gestão desses recursos para a Prefeitura na área da saúde, e beneficia o cidadão no geral otimizando o acesso a saúde ao possívelmente diminuir casos de falta de medicamentos.
Pacotes e dados Requeridos
| Pacote | Utilidade |
|---|---|
| stringr | tratamento e limpeza de dados nas colunas das tabelas e comparações usando operações em strings |
| dplyr | Agrupamento, sumarização e outras operações |
| DT | Tabelas interativas como as com barras de busca e filtragens de dados |
| ggplot2 | Gráficos para facilitar visualização de algumas informações |
| leaflet | mapas interativos como por exemplo o do mapa de medicamentos em maior e menor número por cada bairro |
| knitr | Relatórios dinâmicos em markdown baseado em código |
| kableExtra | Formatação de tabelas usando funções adicionais |
| tidyr | Funções para reorganizar e arrumar dados |
| readr | Leitura de arquivos |
| tidyverse | Funções auxiliares gerais para manipulação de dados |
Fonte Original dos Dados
Os documentos medicamentos_distrito01.csv, medicamentos_distrito02.csv,…,medicamentos_distrito08.csv de cada um dos dias utilizados foram baixados em http://dados.recife.pe.gov.br/dataset/medicamentos (a data de cada download está no drive do projeto logo abaixo), e a tabela distritos sanitários em http://dados.recife.pe.gov.br/dataset/distritos-sanitarios usada somente para criar as tabelas auxiliares. Os documentos auxiliares desenvolvidos manualmente (não disponibilizados diretamente pelos dados abertos da Prefeitura do Recife http://dados.recife.pe.gov.br“), os documentos de dias de medicamentos não mais disponíveis pelos dados abertos e utilizados no projeto estão disponíveis no drive: https://drive.google.com/drive/folders/1Y-zQZFnvFZx-5ZuWqd4QRJW2bAqScU4I?usp=sharing.
Explicação Detalhada dos Dados da Fonte
O conjunto original no documento de distritos sanitários tinha o propósito de relacionar cada bairro com um distrito sanitário, tendo 3 colunas sendo essas bairro, distrito_sanitario, descricao_distrito - essa coluna não foi juntada diretamente, dela foi gerada tabelas auxiliares que se juntaram a tabela de medicamentos. Já os documentos medicamentos eram divididos em 8 (atualizados diariamente) tabelas documentos cada um para um distrito, trazendo informações sobre cada medicamento e sua quantidade em uma unidade de saúde, possuindo 9 colunas: distrito (é o distro sanitário), unidade (nome da unidade de saúde), classe (utilidade terapêutica), apresentação (formato do medicamento ex: tubo, ampola), tipo_produto (sempre medicamento), codigo_produto, produto (nome), cadum (numero no catálogo), quantidade.
Etapas de Importação e Limpeza de Dados
Os dados vinheram com diversos problemas: as quantidades de medicamentos vinheram com dados negativos que foram atribuídos como sendo 0; alguns nomes de unidades não existiam mais atualmente com o mesmo nome então outra tabela foi criada usando scripts externos que se encontra dentro do drive do projeto e buscas manuais na internet corrigindo os nomes das unidades e achando o bairro respectivo, criando uma nova tabela de unidade e bairro relacionado para ser incorporado a tabela para facilitar futuras análises; outra tabela usando scripts externos foi usado relacionando cada bairro a uma latitude e longitude para facilitar análises; Apesar dos erros de digitação e pequenas diferenças como simbolos na coluna “produto” de medicamentos, não houve a correção inicial (mas criação de outra coluna “produto_limpo” com tentativa de criar tipos únicos de nome de “produto”) porque não se mostrou relevante até certo ponto. Além disso, é adicionado cada quantidade dia de medicamentos de cada dia como uma coluna dia, ex: dia1, dia2, dia3, … diaN (atualmente 9 dias), não havendo mais a coluna quantidade. E vale lembrar que os dados de quantidade vinheram sendo reconhecidos como strings, sendo posteriormente convertidos em numérico.
Não foi colocado uma coluna com cada quantidade referente a quantidade de para cada dia de um medicamento respectivo a uma coluna dia, porque o número de linhas ficaria muito extenso
Etapas
Importação e Limpeza de Dados
| distrito | unidade | classe | apresentacao | tipo_produto | codigo_produto | produto | cadum | quantidade |
|---|---|---|---|---|---|---|---|---|
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | AGENTE ALCALINIZANTE | AMP | MEDICAMENTOS | 10028 | BICARBONATO DE SODIO 10% SOLUCAO INJETAVEL - 10ML | 30004 | 0,0 |
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | AGENTE ANTIRESSORTIVO | COMPR | MEDICAMENTOS | 10651 | ALENDRONATO DE SODIO 70MG | 30068 | 609,0 |
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | AGENTE URICOSÚRICO | COMPR | MEDICAMENTOS | 10669 | ALOPURINOL 300MG | 30069 | 3540,0 |
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | AINE | AMP | MEDICAMENTOS | 10057 | CETOPROFENO 50MG/ML SOLUCAO INJETAVEL - 2ML | 30048 | 2,0 |
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | AINE/ ANTICOAGULANTE | COMPR | MEDICAMENTOS | 10003 | ACIDO ACETILSALICILICO 100MG | 30064 | 12395,0 |
| 1 | Us 101 Policlinica Prof Waldemar de Oliveira | ANALGÉSICO/ ANTIPIRÉTICO | AMP | MEDICAMENTOS | 10111 | DIPIRONA 500MG/ML SOLUCAO INJETAVEL - 2ML | 30099 | 4,0 |
| bairro | distrito_sanitario | descricao_distrito |
|---|---|---|
| Boa Vista | 1 | DS I |
| Cabanga | 1 | DS I |
| Coelhos | 1 | DS I |
| Ilha do Leite | 1 | DS I |
| Ilha Joana Bezerra | 1 | DS I |
| Paissandu | 1 | DS I |
| unidade | bairro |
|---|---|
| Us 101 Policlinica Prof Waldemar de Oliveira | Santo Amaro |
| Us 123 CS Prof Cesar Montezuma | Recife |
| Us 131 Distrito Sanitario I Recife | Boa Vista |
| Us 143 Laboratorio Municipal do Recife | Espinheiro |
| US 156 SAMU SERVICO DE ATENDIMENTO MEDICO DE URGENCIA | Boa Vista |
| Us 160 Policlinica Gouveia de Barros | Boa Vista |
| bairro | latitude | longitude |
|---|---|---|
| Santo Amaro | -8.050118 | -34.87531 |
| Alto do Mandu | -8.061464 | -34.91872 |
| Boa Vista | -8.059418 | -34.89593 |
| Espinheiro | -8.041133 | -34.89298 |
| Santo Antônio | -8.069533 | -34.87708 |
| Ilha Joana Bezerra | -8.072415 | -34.89952 |
Exibição do Conjunto de Dados Final
ler_e_combinar_dia <- function(dia) {
lista_distritos <- list()
for (i in 1:8) {
arquivo <- paste0("dia", dia, "/medicamentos_distrito", sprintf("%02d", i), ".csv")
df <- read_delim(file = arquivo, delim = ",", col_types = cols())
df <- df %>%
mutate(produto = str_replace_all(produto, "[*'\"]", "")) # limpando alguns caracteres indesejados
problemas <- problems(df)
if (nrow(problemas) > 0) {
warning(paste("Problemas de parsing encontrados em:", arquivo))
print(problemas)
}
df <- df %>%
mutate(quantidade = as.numeric(str_replace(quantidade, ",", "."))) %>% # Substituir vírgula por ponto
replace_na(list(quantidade = 0)) # Substituir valores NA por 0
df <- df %>%
mutate(dia = paste0("dia", dia))
lista_distritos[[i]] <- df
}
dados_dia <- bind_rows(lista_distritos)
return(dados_dia)
}
todos_dias <- list()
for (dia in 1:9) {
dados_dia <- ler_e_combinar_dia(dia)
todos_dias[[dia]] <- dados_dia
}
dados_completos <- bind_rows(todos_dias)
dados_pivotados <- dados_completos %>%
pivot_wider(names_from = dia, values_from = quantidade, values_fill = list(quantidade = 0))
unidades_bairros <- read_csv(file = "unidades_bairros.csv")
lat_lon <- read_csv(file = "bairro_lat_lon.csv")
unidades_bairros <- unidades_bairros %>%
mutate(unidade = str_trim(unidade)) %>%
mutate(unidade = str_to_upper(unidade)) %>%
mutate(bairro = str_to_lower(str_trim(bairro))) # tratando erros com as strings
lat_lon <- lat_lon %>%
mutate(bairro = str_to_lower(str_trim(bairro))) # tratando erros com as strings
dados_pivotados <- dados_pivotados %>%
mutate(unidade = str_trim(unidade)) %>%
mutate(unidade = str_to_upper(unidade)) # tratando erros com as strings
unidades_bairros <- left_join(unidades_bairros, lat_lon, by = "bairro")
medicamentos_com_bairro <- left_join(dados_pivotados, unidades_bairros, by = "unidade")
medicamentos_com_bairro <- medicamentos_com_bairro %>%
mutate(produto_limpo = str_to_lower(str_replace_all(produto, "[^[:alnum:]]", ""))) # tratando erros com as strings
kable(head(medicamentos_com_bairro, 12), caption = "Tabela final (12 Primeiras Linhas de 40116)", align = 'c', format = 'html') %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE,
position = "center",
font_size = 12)| distrito | unidade | classe | apresentacao | tipo_produto | codigo_produto | produto | cadum | dia1 | dia2 | dia3 | dia4 | dia5 | dia6 | dia7 | dia8 | dia9 | bairro | latitude | longitude | produto_limpo |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | AGENTE ALCALINIZANTE | AMP | MEDICAMENTOS | 10028 | BICARBONATO DE SODIO 10% SOLUCAO INJETAVEL - 10ML | 30004 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | santo amaro | -8.050118 | -34.87531 | bicarbonatodesodio10solucaoinjetavel10ml |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | AGENTE ANTIRESSORTIVO | COMPR | MEDICAMENTOS | 10651 | ALENDRONATO DE SODIO 70MG | 30068 | 609 | 609 | 609 | 609 | 609 | 609 | 609 | 609 | 609 | santo amaro | -8.050118 | -34.87531 | alendronatodesodio70mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | AGENTE URICOSÚRICO | COMPR | MEDICAMENTOS | 10669 | ALOPURINOL 300MG | 30069 | 3540 | 3540 | 3540 | 3540 | 3540 | 3540 | 3540 | 3540 | 3540 | santo amaro | -8.050118 | -34.87531 | alopurinol300mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | AINE | AMP | MEDICAMENTOS | 10057 | CETOPROFENO 50MG/ML SOLUCAO INJETAVEL - 2ML | 30048 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | santo amaro | -8.050118 | -34.87531 | cetoprofeno50mgmlsolucaoinjetavel2ml |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | AINE/ ANTICOAGULANTE | COMPR | MEDICAMENTOS | 10003 | ACIDO ACETILSALICILICO 100MG | 30064 | 12395 | 12395 | 12395 | 12395 | 12395 | 12395 | 12395 | 12395 | 12395 | santo amaro | -8.050118 | -34.87531 | acidoacetilsalicilico100mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | AMP | MEDICAMENTOS | 10111 | DIPIRONA 500MG/ML SOLUCAO INJETAVEL - 2ML | 30099 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | santo amaro | -8.050118 | -34.87531 | dipirona500mgmlsolucaoinjetavel2ml |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | COMPR | MEDICAMENTOS | 10110 | DIPIRONA 500MG | 30219 | 8050 | 8050 | 8050 | 8050 | 8050 | 8050 | 8050 | 8050 | 8050 | santo amaro | -8.050118 | -34.87531 | dipirona500mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | COMPR | MEDICAMENTOS | 10608 | IBUPROFENO 600MG | 30119 | 1750 | 1750 | 1750 | 1750 | 1750 | 1750 | 1750 | 1750 | 1750 | santo amaro | -8.050118 | -34.87531 | ibuprofeno600mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | COMPR | MEDICAMENTOS | 10673 | PARACETAMOL 500MG | 30138 | 1200 | 1200 | 1200 | 1200 | 1200 | 1200 | 1200 | 1200 | 1200 | santo amaro | -8.050118 | -34.87531 | paracetamol500mg |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | FRASCO | MEDICAMENTOS | 10109 | DIPIRONA 500MG/ML SOLUCAO ORAL - 10ML | 30175 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 | santo amaro | -8.050118 | -34.87531 | dipirona500mgmlsolucaooral10ml |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | FRASCO | MEDICAMENTOS | 10245 | PARACETAMOL 200MG/ML SOLUCAO ORAL - 15ML | 30139 | 27 | 27 | 27 | 27 | 27 | 27 | 27 | 27 | 27 | santo amaro | -8.050118 | -34.87531 | paracetamol200mgmlsolucaooral15ml |
| 1 | US 101 POLICLINICA PROF WALDEMAR DE OLIVEIRA | ANALGÉSICO/ ANTIPIRÉTICO | FRASCO | MEDICAMENTOS | 10827 | IBUPROFENO 50MG/ML SUSPENSAO ORAL - 30ML | 41434 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | santo amaro | -8.050118 | -34.87531 | ibuprofeno50mgmlsuspensaooral30ml |
Resumo das Variáveis de Interesse
| Coluna | Descricao | Interesse |
|---|---|---|
| distrito | O distrito sanitario | X |
| unidade | Nome da unidade de saude | X |
| classe | Utilidade terapeutica do medicamento, ex: Analgesico, Anti-diabetico | X |
| apresentacao | Formato presente do medicamento, ex: tubo, ampola, etc | |
| tipo_produto | Como estamos na tabela de medicamentos o tipo do produto sempre sendo medicamentos | |
| codigo_produto | Codigo do produto no sistema | |
| produto | Nome junto com quantia de cada unidade de um produto | X |
| cadum | Numero no catalogo de registro | |
| dia1 | quantidade do produto em 1 dia: 22/08 | X |
| dia2 | quantidade do produto em 1 dia: 23/08 | X |
| dia3 | quantidade do produto em 1 dia: 29/08 | X |
| dia4 | quantidade do produto em 1 dia: 30/08 | X |
| dia5 | quantidade do produto em 1 dia: 02/09 | X |
| dia6 | quantidade do produto em 1 dia: 04/09 | X |
| dia7 | quantidade do produto em 1 dia: 09/09 | X |
| dia8 | quantidade do produto em 1 dia: 10/09 | X |
| dia9 | quantidade do produto em 1 dia: 11/09 | X |
| bairro | Bairro da unidade de saude | X |
| latitude | Latitude do bairro | X |
| longitude | Longitude do bairro | X |
| produto_limpo | Nome do produto com algumas correcoes para facilitar analises | X |
Análise Exploratória dos Dados
Verificação inicial de dados discrepantes
- Esses dados buscam verificar os medicamentos em maior número e os em
menor número, analisando as médias diárias.
- mais numerosos (coluna produtos)
- menos numerosos
Medicamentos mais numerosos
Medicamentos zerados
Proporção de quantidade e maior variação de Medicamentos
- Esses dados buscam verificar a variação de medicamentos
(medicamentos mais recorrentemente usados), baseando-se na variação da
quantidade de medicamentos ao longo dos dias
- 20 classes (utilidade terapêutica) de medicamentos mais variados (diferença entre maior e menor quantidade para cada classe)
- 20 classes (utilidade terapêutica) de medicamentos mais variados (desvio padrão)
- 20 produtos (utilidade terapêutica) de medicamentos mais variados (diferença entre maior e menor quantidade para cada classe)
- 20 produtos de medicamentos mais variados (desvio padrão)
- Proporção dos 10 produtos mais presentes
Maior variação por classe (desvio padrão)
Por produto (desvio padrão)
Proporção dos medicamentos mais usados
Distribuição de medicamentos por mapa
- Mapeamento por bairro de medicamentos mais presentes e mais ausentes por bairro, verificando a aproximação de cada bairro, poderia se ter uma noção sobre possíveis novas alocações de medicamentos
Montando dados
# carregando dados por bairros usando a coluna produto_limpo que é produto padronizada - letras minusculas e sem alguns simbolos
medicamentos_corrigidos <- medicamentos_com_bairro %>%
mutate(across(starts_with("dia"), ~ ifelse(. < 0, 0, .)))
media_medicamentos_bairro <- medicamentos_corrigidos %>%
group_by(bairro, produto_limpo) %>%
summarise(media_quantidade = mean(c(dia1, dia2, dia3, dia4, dia5, dia6,dia7,dia8,dia9), na.rm = TRUE), .groups = 'drop')
# medicamento mais em falta (média mínima) e mais presente (média máxima) por bairro - m falta e Excesso
medicamentos_bairro_summary <- media_medicamentos_bairro %>%
group_by(bairro) %>%
summarise(
medicamento_mais_em_falta = produto_limpo[which.min(media_quantidade)],
medicamento_mais_presente = produto_limpo[which.max(media_quantidade)],
media_falta = min(media_quantidade),
media_presenca = max(media_quantidade),
.groups = 'drop'
)
dados_mapas <- medicamentos_bairro_summary %>%
left_join(medicamentos_corrigidos %>%
select(bairro, latitude, longitude) %>%
distinct(), by = "bairro") %>%
mutate(
latitude = as.numeric(as.character(latitude)),
longitude = as.numeric(as.character(longitude))
)Mapa de medicameentos por bairro: mais númerosos por bairro e faltantes
Indicador de medicamentos mais presentes e faltantes
- Verificando medicamentos em maior número e menor por localidade
- disitrito sanitário
- bairro
- unidade de saúde
Por Distrito Sanitário
Por Bairro
Por Unidade de saúde
Conclusões
Declaração do Problema
Tendo em vista a identificação da distribuição e possíveis problemas em relação a configuralção da gestão de medicamentos pela Prefeitura do Recife, essas análises tem como objetivo observar os padrões de distribuição e identificar possíveis lacunas ou excessos na oferta de medicamentos, para que medidas possam ser implementadas pela gestão pública.
Metodologia Utilizada
A metodologia utilizada envolveu a análise exploratória de dados de medicamentos fornecidos pela Prefeitura do Recife, observando comparações entre distritos sanitários, bairros e unidade de saúde, além do uso de dados mais recentes atualizados todo dia útil. Os dados foram agrupados e comparados por distritos, bairros e unidades de saúde, utilizando cálculos de médias para avaliar a quantidade de medicamentos disponíveis ao longo de seis dias. Foram geradas tabelas e gráficos para identificar números discrepantes, seja de medicamentos ou de sua distribuição pela cidade. Essa abordagem permitiu uma visão geral da alocação de medicamentos, evidenciando tanto uma suposta estratégia da gestão de medicamentos quanto as áreas que necessitam de possíveis melhorias.
Principais Insights da Análise
- Os dados que mais importando do estudo foram o proporção da variação diária de medicamentos, e outras informações contendo variações diárias - Isso traz uma noção que tenta se aproximar da realidade das maiores demandas cotidianas - As tabelas de distribuição de medicamentos mais presentes (maior quantidade) e mais faltantes (menor quantidade) por distrito, nairro e unidades nos traz uma visão maior sobre a estratégia atual da gestão para distribuição dos medicamentos
Implicações para Clientes
- Com base nos dados fornecidos, é possível ter uma visão inicial sobre a distribuição de medicamentos por parte da Prefeitura do Recife - Ao realizar mais análises, com maior rigor na área de ciência de dados e medicina, pode-se tirar dados efetivos sobre a demanda suprida pela gestão de recursos atuais e seus possíveis problemas
Limitações e Melhorias Futuras
- Dividir tabela produto para 2 tabelas com o nome e concentração/composição quando aplicável, isso para fazer medições som tabelas da área de medicina sobre quantidade necessária de cada medicamento que atenda a um número de doenças e/ou problemas de saúde genéricos. - Com base nisso refinar os indicadores de medicamentos em excesso e faltantes - Achar algum parâmetro para normalizar buscando um ideal de quantidade de medicamentos - Correlacionar a falta de cada medicamento com alguma tabela da área da medicina - buscando prováveis enfermidades correlacionadas a um excesso ou escassez de medicamento - Usar maior amostra de dias para fazer análises