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:
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