No dia de hoje, a professora Clara solicitou que fosse realizada a classificação das unidades da intervenção do projeto CHARMING de acordo com os seguintes parâmetros:

  1. Número de pacientes com consultas médicas no período dividido pelo número de pacientes incluídos.
  2. número de pacientes com exame de HbA1c no período dividido pelo número de pacientes com Diabetes Mellitus.

O período escolhido foi o período do meio da intervenção, entre 1 de Junho de 2024 e 31 de Agosto de 2024.

A primeira coisa a ser feita é carregar as bibliotecas necessárias para tal análise.

Essa análise foi feita anteriormente, no entanto, não me atentei ao fato de que o objetivo não era o número total de atendimentos, mas sim, tão somente os atendimentos médicos.

Com isso, farei a análise novamente, dessa vez, me atentando a este fato.

library(tidyverse)
library(ggplot2)

Em seguida, vamos ler os dados.

Os dados de atendimentos realizados foram retirados do metabase, em específico, do arquivo “Replicação (15433)/sig_dados_clinicos/view_atendimentos”. Todos os dados foram acessados em 19/09/2024 no período da tarde.

read_csv("view_atendimentos_2024-09-19T15_03_11.31777-03_00.csv", 
         show_col_types = FALSE) -> atend

Podemos olhar para como foi registrada o momento da consulta nessa base de dados para que façamos a conversão de maneira a trabalhar com esses dados como datas. Utilizaremos o pacote lubridate do tidyverse para fazer essa conversão.

atend %>% select(consulta_data) %>% head(5)
## # A tibble: 5 × 1
##   consulta_data      
##   <chr>              
## 1 9 May, 2023, 00:00 
## 2 9 May, 2023, 00:00 
## 3 31 May, 2023, 00:00
## 4 2 Jun, 2023, 00:00 
## 5 2 Jun, 2023, 00:00

Possível perceber que o registro segue um padrão de “Dia Mês(Em abreviação), Ano, Horário”. Façamos a conversão com o lubridate.

atend %>% mutate(consulta_data = dmy_hm(consulta_data)) -> atend 

atend %>% select(consulta_data) %>% head(5)
## # A tibble: 5 × 1
##   consulta_data      
##   <dttm>             
## 1 2023-05-09 00:00:00
## 2 2023-05-09 00:00:00
## 3 2023-05-31 00:00:00
## 4 2023-06-02 00:00:00
## 5 2023-06-02 00:00:00

Agora, podemos filtrar somente para as observações vistas no período desejado. Além disso, podemos filtrar somente para as observações que correspondem a consultas realizadas por médicos.

atend %>% filter((consulta_data < ymd("2024-09-01")) &
                         (consulta_data > ymd("2024-05-31")) &
                         (profissional_funcao_medico == TRUE)) -> atend

atend %>% summarise(min = min(consulta_data),
                    max = max(consulta_data))
## # A tibble: 1 × 2
##   min                 max                
##   <dttm>              <dttm>             
## 1 2024-06-03 00:00:00 2024-08-30 00:00:00

Os dias 1 e 2 de Junho, bem como o dia 31 de agosto, caíram no fim de semana, por isso não houve consultas nestes dias. Com isso, temos as observações de todos os atendimentos realizados no período.

Agora, precisamos separar somente os atendimentos realizados nas unidades intervenção. Primeiro, vamos ler os dados que contém as unidades da intervenção.

read_csv("unidadesintervencao.csv", show_col_types = FALSE) -> unidades

unidades %>% pull(estabelecimento_descricao) %>% sort() -> alfa

atend %>% pull(estabelecimento_descricao) %>% unique() %>% sort() -> beta

identical(alfa,beta)
## [1] TRUE

Com o exposto acima, temos que os dados com que estamos lidando tratam somente das unidades da intervenção.

Com isso, conseguimos avaliar o número total de pacientes que foram atendidos, em pelo menos uma ocasião, por profissional médico, neste período.

atend %>% pull(paciente_id) %>% unique() %>% length()
## [1] 646

No período, foram atendidos 646 pacientes diferentes nas unidades intervenção.

Podemos avaliar os mesmos dados, mas, dessa vez, agrupando por Unidade Básica de Saúde

atend %>% group_by(estabelecimento_descricao) %>%
        summarise(n = length(unique(paciente_id)),
                             cidade = unique(municipio_descricao)) -> num_pac_est

num_pac_est
## # A tibble: 18 × 3
##    estabelecimento_descricao                          n cidade       
##    <chr>                                          <int> <chr>        
##  1 CENTRO DE SAUDE DE CARLOS CHAGAS                  42 CARLOS CHAGAS
##  2 ESF PEDRO GUEDES ABRANTES                          3 MALACACHETA  
##  3 ESF SAUDE EM ACAO                                 19 POTE         
##  4 ESF SAUDE PLENA                                   56 POTE         
##  5 ESF VIDA SAUDAVEL                                 15 POTE         
##  6 POSTO DE SAUDE DE MAYRINK                         27 CARLOS CHAGAS
##  7 POSTO DE SAUDE MARAMBAINHA DE CARAI               59 CARAI        
##  8 POSTO DE SAUDE RIBEIRAO SANTANA DE CARAI          37 CARAI        
##  9 PSF ANTONIO CARLOS PEREIRA DE SOUZA              100 CARAI        
## 10 PSF DE JAGUARITIRA DE MALACACHETA                  1 MALACACHETA  
## 11 PSF DONA AGOSTINHA RAMALHO DE MALACACHETA         24 MALACACHETA  
## 12 PSF MARIA AUXILIADORA LOPES OLIVEIRA             111 CARAI        
## 13 PSF NELSON AARAO COUY DE MALACACHETA              13 MALACACHETA  
## 14 UNIDADE BASICA DE SAUDE ELVIRA MARTINS BARBOSA    39 NOVO CRUZEIRO
## 15 UNIDADE BASICA DE SAUDE GERALDO LAGO FIGUEIRO     30 NOVO CRUZEIRO
## 16 UNIDADE BASICA DE SAUDE JUA                       35 CARLOS CHAGAS
## 17 UNIDADE BASICA DE SAUDE SEBASTIANA SILVA PINTO    17 NOVO CRUZEIRO
## 18 UNIDADE BASICA DE SAUDE TEREZINHA NEIVA LAGES     18 NOVO CRUZEIRO

Agora, podemos obter os dados de todos os pacientes do projeto por unidade. Para isso, utilizaremos os dados encontrados no metabase em “Replicação (15433)/sig_dados_clinicos/view_pacientes_menos_descompensados”.

read_csv("view_pacientes_menos_descompensados_2024-09-19T17_01_07.990106-03_00.csv",
         show_col_types = FALSE) -> tds_pac

##É necessário filtrar a presença de uma unidade que não faz parte do grupo intervenção mas que figura como a descrição da unidade de um paciente

tds_pac %>% filter(!(estabelecimento_descricao == "POSTO DE SAUDE PONTO DO MARAMBAIA DE CARAI")) -> tds_pac

Agora, podemos obter o número total de pacientes por unidade do grupo intervenção.

tds_pac %>% select(estabelecimento_descricao, id_paciente) %>%
        group_by(estabelecimento_descricao) %>% 
        summarise(n_total = length(unique(id_paciente))) -> tds_pac1

tds_pac1
## # A tibble: 18 × 2
##    estabelecimento_descricao                      n_total
##    <chr>                                            <int>
##  1 CENTRO DE SAUDE DE CARLOS CHAGAS                   187
##  2 ESF PEDRO GUEDES ABRANTES                          128
##  3 ESF SAUDE EM ACAO                                  165
##  4 ESF SAUDE PLENA                                    138
##  5 ESF VIDA SAUDAVEL                                  154
##  6 POSTO DE SAUDE DE MAYRINK                          199
##  7 POSTO DE SAUDE MARAMBAINHA DE CARAI                174
##  8 POSTO DE SAUDE RIBEIRAO SANTANA DE CARAI           165
##  9 PSF ANTONIO CARLOS PEREIRA DE SOUZA                157
## 10 PSF DE JAGUARITIRA DE MALACACHETA                  165
## 11 PSF DONA AGOSTINHA RAMALHO DE MALACACHETA           98
## 12 PSF MARIA AUXILIADORA LOPES OLIVEIRA               148
## 13 PSF NELSON AARAO COUY DE MALACACHETA               147
## 14 UNIDADE BASICA DE SAUDE ELVIRA MARTINS BARBOSA     134
## 15 UNIDADE BASICA DE SAUDE GERALDO LAGO FIGUEIRO      138
## 16 UNIDADE BASICA DE SAUDE JUA                        151
## 17 UNIDADE BASICA DE SAUDE SEBASTIANA SILVA PINTO     152
## 18 UNIDADE BASICA DE SAUDE TEREZINHA NEIVA LAGES      144

Nós podemos agora juntar ambos esses dados para criar somente uma base de dados.

by <- join_by(estabelecimento_descricao)
left_join(num_pac_est,tds_pac1,by) -> num_pac_est
num_pac_est
## # A tibble: 18 × 4
##    estabelecimento_descricao                          n cidade        n_total
##    <chr>                                          <int> <chr>           <int>
##  1 CENTRO DE SAUDE DE CARLOS CHAGAS                  42 CARLOS CHAGAS     187
##  2 ESF PEDRO GUEDES ABRANTES                          3 MALACACHETA       128
##  3 ESF SAUDE EM ACAO                                 19 POTE              165
##  4 ESF SAUDE PLENA                                   56 POTE              138
##  5 ESF VIDA SAUDAVEL                                 15 POTE              154
##  6 POSTO DE SAUDE DE MAYRINK                         27 CARLOS CHAGAS     199
##  7 POSTO DE SAUDE MARAMBAINHA DE CARAI               59 CARAI             174
##  8 POSTO DE SAUDE RIBEIRAO SANTANA DE CARAI          37 CARAI             165
##  9 PSF ANTONIO CARLOS PEREIRA DE SOUZA              100 CARAI             157
## 10 PSF DE JAGUARITIRA DE MALACACHETA                  1 MALACACHETA       165
## 11 PSF DONA AGOSTINHA RAMALHO DE MALACACHETA         24 MALACACHETA        98
## 12 PSF MARIA AUXILIADORA LOPES OLIVEIRA             111 CARAI             148
## 13 PSF NELSON AARAO COUY DE MALACACHETA              13 MALACACHETA       147
## 14 UNIDADE BASICA DE SAUDE ELVIRA MARTINS BARBOSA    39 NOVO CRUZEIRO     134
## 15 UNIDADE BASICA DE SAUDE GERALDO LAGO FIGUEIRO     30 NOVO CRUZEIRO     138
## 16 UNIDADE BASICA DE SAUDE JUA                       35 CARLOS CHAGAS     151
## 17 UNIDADE BASICA DE SAUDE SEBASTIANA SILVA PINTO    17 NOVO CRUZEIRO     152
## 18 UNIDADE BASICA DE SAUDE TEREZINHA NEIVA LAGES     18 NOVO CRUZEIRO     144

Agora, podemos gerar uma nova coluna que demonstra o percentual de pacientes atendidos.

num_pac_est %>% 
        mutate(porc = n/n_total, 
                       estabelecimento_descricao = 
                       as_factor(estabelecimento_descricao)) -> num_pac_est
num_pac_est
## # A tibble: 18 × 5
##    estabelecimento_descricao                          n cidade   n_total    porc
##    <fct>                                          <int> <chr>      <int>   <dbl>
##  1 CENTRO DE SAUDE DE CARLOS CHAGAS                  42 CARLOS …     187 0.225  
##  2 ESF PEDRO GUEDES ABRANTES                          3 MALACAC…     128 0.0234 
##  3 ESF SAUDE EM ACAO                                 19 POTE         165 0.115  
##  4 ESF SAUDE PLENA                                   56 POTE         138 0.406  
##  5 ESF VIDA SAUDAVEL                                 15 POTE         154 0.0974 
##  6 POSTO DE SAUDE DE MAYRINK                         27 CARLOS …     199 0.136  
##  7 POSTO DE SAUDE MARAMBAINHA DE CARAI               59 CARAI        174 0.339  
##  8 POSTO DE SAUDE RIBEIRAO SANTANA DE CARAI          37 CARAI        165 0.224  
##  9 PSF ANTONIO CARLOS PEREIRA DE SOUZA              100 CARAI        157 0.637  
## 10 PSF DE JAGUARITIRA DE MALACACHETA                  1 MALACAC…     165 0.00606
## 11 PSF DONA AGOSTINHA RAMALHO DE MALACACHETA         24 MALACAC…      98 0.245  
## 12 PSF MARIA AUXILIADORA LOPES OLIVEIRA             111 CARAI        148 0.75   
## 13 PSF NELSON AARAO COUY DE MALACACHETA              13 MALACAC…     147 0.0884 
## 14 UNIDADE BASICA DE SAUDE ELVIRA MARTINS BARBOSA    39 NOVO CR…     134 0.291  
## 15 UNIDADE BASICA DE SAUDE GERALDO LAGO FIGUEIRO     30 NOVO CR…     138 0.217  
## 16 UNIDADE BASICA DE SAUDE JUA                       35 CARLOS …     151 0.232  
## 17 UNIDADE BASICA DE SAUDE SEBASTIANA SILVA PINTO    17 NOVO CR…     152 0.112  
## 18 UNIDADE BASICA DE SAUDE TEREZINHA NEIVA LAGES     18 NOVO CR…     144 0.125

Vamos reordenar os fatores, para que apareçam em ordem decrescente da porcentagem de pacientes atendidos no período.

num_pac_est %>% mutate(estabelecimento_descricao = 
                               reorder(estabelecimento_descricao,porc)) -> num_pac_est

Com isso, podemos criar os gráficos solicitados:

num_pac_est %>% ggplot(aes(y = estabelecimento_descricao, x = porc*100))+
        geom_col() + ylab(NULL) + xlab("Porcentagem de pacientes atendidos") +
        ggtitle("Porcentagem de pacientes atendidos por médico(a)",
                "No período de 01/06/2024 a 31/08/2024") + theme(plot.title = element_text(hjust = 1.5))

ggsave("PorcAtendidoTOTAL.png")
## Saving 7 x 5 in image

Podemos agora, fazer os gráficos separados por cidade.

v <- num_pac_est %>% pull(cidade) %>% unique()

for(i in v){
        file <- paste(i,"PorcAtendido.png",sep="_")
        num_pac_est %>% filter(cidade == i) %>%
                ggplot(aes(y = estabelecimento_descricao, x = porc*100))+
        geom_col() + ylab(NULL) + xlab("Porcentagem de pacientes atendidos") +
        ggtitle(paste("Porcentagem de pacientes atendidos\npor médico(a) nas UBS de",
                      str_to_title(i)),
                "No período de 01/06/2024 a 31/08/2024")->p
        print(p)
        ggsave(file)
}


Agora, podemos nos debruçar sobre a segunda pergunta: Número de pacientes com exame de HbA1c no período dividido pelo número de pacientes com Diabetes Mellitus.

## usando os dados da planilha "pacientes menos descompensados",
## filtramos somente para aqueles que são portadores de diabetes mellitus
## em seguida, alteramos as variáveis para deixá-las no formato adequado para
## a análise

tds_pac %>% filter(dm == TRUE) %>% 
        mutate(data_glicohemoglobina = dmy(data_glicohemoglobina),
               estabelecimento_descricao = 
                       as_factor(estabelecimento_descricao)) -> dm_pac

Avaliando a variável municipio_descricao nesta base de dados, me deparo com o seguinte:

dm_pac %>% mutate(municipio_descricao = as_factor(municipio_descricao)) %>% group_by(estabelecimento_descricao) %>% summarise(n = n_distinct(municipio_descricao)) %>% filter(n>1)
## # A tibble: 1 × 2
##   estabelecimento_descricao     n
##   <fct>                     <int>
## 1 ESF SAUDE EM ACAO             2

Existem duas cidades possíveis para a mesma UBS na base de dados. Como sabemos que a ESF SAUDE EM ACAO está em POTE, vamos avaliar a observação que está inadequada.

dm_pac %>% filter(estabelecimento_descricao == "ESF SAUDE EM ACAO" & !(municipio_descricao == "POTE"))
## # A tibble: 1 × 25
##   id_paciente nome               cns data_nascimento estabelecimento_descricao
##         <dbl> <chr>            <dbl> <chr>           <fct>                    
## 1     3714844 TESTE CHARMING 2.56e14 19 Jan, 1960    ESF SAUDE EM ACAO        
## # ℹ 20 more variables: municipio_descricao <chr>, data_consulta <chr>,
## #   pas1 <dbl>, pad1 <dbl>, pas2 <dbl>, pad2 <dbl>, media_pas <dbl>,
## #   media_pad <dbl>, glico_hemoglobina <dbl>, data_glicohemoglobina <date>,
## #   `data_glico > 15-11-2023` <chr>, `pas 140-159` <chr>, `pad 90-109` <chr>,
## #   `glicoH > 7% e <8,9%` <chr>, `glicoH > 8% e <8,9%` <chr>, dm <lgl>,
## #   has <lgl>, ultima_data_agendamento <chr>, informado <chr>,
## #   cargo_profissional <chr>

Trata-se de observação de teste, que excluiremos.

dm_pac %>% filter(!(id_paciente == 3714844)) -> dm_pac

Prosseguindo:

## agrupamos as observações por unidade básica de saúde e somamos o número de
## observações para obtermos o número de pacientes portadores de DM em
## cada UBS

dm_pac %>% group_by(estabelecimento_descricao) %>%
        summarise(n_total = length(unique(id_paciente)),
                  cidade = first(municipio_descricao)) -> dm_pac_est

## filtramos as observações pela data em que houve coleta de glicohemoglobina
## levando em consideração somente o período de interesse.
## Novamente, somamos todas as observações únicas para avaliar quantos
## pacientes tiveram sua hemoglobina glicada avaliada no período

dm_pac %>% filter(between(data_glicohemoglobina,
                          ymd("2024-06-01"),
                          ymd("2024-08-31"))) %>% 
        group_by(estabelecimento_descricao) %>% 
        summarise(n = length(unique(id_paciente))) -> glico_est

## juntamos as duas observações, usando as unidades básicas de saúde como a chave
## para a junção

left_join(dm_pac_est, glico_est,by) -> dm_pac_est

## substituímos NA por 0, visto que onde houver NA nessa tabela significa que 
## não foi coletada glicohemoglobina

dm_pac_est %>% mutate(across(everything(), ~ replace_na(.x, 0))) %>%
        
## em seguida, criamos a variável porc para salvar a porcentagem de pacientes
## diabéticos que tiveram sua hemoglobina glicada aferida no período
        
        mutate(porc = n/n_total*100) %>%
        
## agora reordenamos os fatores de `estabelecimento_descricao` de acordo com
## os valores de porc
        mutate(estabelecimento_descricao = 
                       reorder(estabelecimento_descricao, porc)) -> dm_pac_est

Com isso, podemos fazer o gráfico com a porcentagem de pacientes que tiveram sua glicohemoglobina aferida no período em cada uma das unidades básica de saúde.

dm_pac_est %>% ggplot(aes(y = estabelecimento_descricao, x = porc))+
        geom_col() + ylab(NULL) + xlab("Porcentagem de pacientes diabéticos\nque tiveram sua HBA1c aferida") +
        ggtitle("Porcentagem de pacientes diabéticos que tiveram sua HBA1c aferida",
                "No período de 01/06/2024 a 31/08/2024") + theme(plot.title = element_text(hjust = 1.5))

ggsave("PorcGlicoTOTAL.png")
## Saving 7 x 5 in image

Agora, podemos salvar um gráfico para cada cidade.

for(i in v){
        file <- paste(i,"PorcGlico.png",sep="_")
        dm_pac_est %>% filter(cidade == i) %>%
                ggplot(aes(y = estabelecimento_descricao, x = porc))+
        geom_col() + ylab(NULL) + xlab("Porcentagem de pacientes diabéticos\nque tiveram sua HBA1c aferida") +
        ggtitle(paste0("Porcentagem de pacientes diabéticos que\ntiveram sua HBA1c aferida nas UBS de\n",
                      str_to_title(i)),
                "No período de 01/06/2024 a 31/08/2024")->p
        print(p)
        ggsave(file)
}
## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image

## Saving 7 x 5 in image