Suponha que haja uma clínica hospitalar que tenha uma lista de quantos pacientes visitam o hospital todos os dias. Tenho dados de mais de 10 anos – mas os pacientes não visitam a clínica todos os dias. Para dar um exemplo, os dados ficam assim (em R):
library(dplyr)
set.seed(123)
start_date <- as.Date("2010-01-01")
end_date <- as.Date("2019-12-31")
all_dates <- seq.Date(start_date, end_date, by="day")
num_visits <- sample(1:length(all_dates), size = 3000, replace = FALSE)
visit_dates <- all_dates[num_visits]
num_patients <- sample(1:100, size = length(visit_dates), replace = TRUE)
clinic_data <- data.frame(date = visit_dates, num_patients = num_patients)
hospital_data <- clinic_data %>% arrange(date)
date num_patients
2010-01-01 90
2010-01-02 96
2010-01-04 65
2010-01-05 80
2010-01-06 15
2010-01-07 87
Quero tentar responder à seguinte pergunta: Em média - para um determinado mês, qual a percentagem de todos os pacientes desse mês que visitaram a clínica por dia $y$? Por exemplo, suponha que em algum mês eu saiba que 900 pessoas visitaram o hospital - quero saber que até o dia 19, que porcentagem (cumulativamente) dessas 900 provavelmente já visitaram o hospital ATÉ ENTÃO, com base nas tendências anteriores?
Tentei fazer isso identificando manualmente diferentes etapas lógicas:
library(ggplot2)
hospital_data$year <- as.numeric(format(as.Date(hospital_data$date), "%Y"))
hospital_data$month <- as.numeric(format(as.Date(hospital_data$date), "%m"))
hospital_data$day <- as.numeric(format(as.Date(hospital_data$date), "%d"))
hospital_data <- hospital_data[order(hospital_data$date), ]
yearly_totals <- aggregate(num_patients ~ year, data = hospital_data, FUN = sum)
names(yearly_totals)[2] <- "yearly_total"
hospital_data <- merge(hospital_data, yearly_totals, by = "year")
results <- by(hospital_data, hospital_data$year, function(df) {
df$cumulative_patients <- cumsum(df$num_patients)
df$cumulative_percentage <- df$cumulative_patients / df$yearly_total * 100
return(df)
})
results <- do.call(rbind, results)
avg_results <- aggregate(cumulative_percentage ~ day, data = results, FUN = mean, na.rm = TRUE)
avg_results <- avg_results[order(avg_results$day), ]
ggplot(avg_results, aes(x = day, y = cumulative_percentage)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks = seq(1, 31, by = 5)) +
scale_y_continuous(limits = c(0, 100)) +
labs(title = "Average Cumulative Percentage of Yearly Patients by Day",
x = "Day of Month",
y = "Average Cumulative Percentage of Patients") +
theme_minimal() +
theme(panel.grid.minor = element_blank())
Mas meu gráfico não está exibindo esta porcentagem cumulativa:
Alguém tem ideias de onde estou bagunçando isso?
EDITAR:
library(tidyverse)
result <- hospital_data %>%
mutate(month = floor_date(date, "month"),
day = day(date)) %>%
group_by(month) %>%
arrange(month, day) %>%
mutate(month_total = sum(num_patients),
cuml = cumsum(num_patients),
cuml_pct = cuml / month_total) %>%
ungroup() %>%
group_by(day) %>%
summarize(avg_cuml_pct = mean(cuml_pct, na.rm = TRUE)) %>%
arrange(day)
result <- result %>%
mutate(avg_cuml_pct = cummax(avg_cuml_pct))
ggplot(result, aes(day, avg_cuml_pct)) +
geom_line() +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
scale_x_continuous(breaks = seq(0, 31, by = 5)) +
labs(x = "Day of Month",
y = "Average Cumulative Percentage of Monthly Patients",
title = "Average Cumulative Patient Percentage by Day of Month") +
theme_minimal()
Talvez algo assim? Cada uma das linhas cinza claro representa a porcentagem cumulativa de pacientes em cada mês, por dia. A linha escura é uma média não ponderada dessas médias. Você pode querer uma média ponderada, mas não há muita diferença aqui, dados os muitos meses com escala semelhante.
Ou poderíamos fazer o mesmo de forma ponderada, mas observe que como alguns meses têm 31 dias, isso sugerirá que precisamos até o dia 31 de qualquer mês (mesmo aqueles com 28/29/30 dias) para chegar a 100%.