Medicamentos da Prefeitura do Recife

Logo 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

Pacotes Utilizados no Projeto e suas Funções
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

Medicamentos Distrito 1 Dia 1 (6 Primeiras Linhas)
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
Distritos Sanitários (6 Primeiras Linhas)
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
Tabela criada auxiliar: unidades_bairros (6 Primeiras Linhas)
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
Tabela criada auxiliar: lat_lon (6 Primeiras Linhas)
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)
Tabela final (12 Primeiras Linhas de 40116)
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

Descricao da Tabela final
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