La gestión eficiente de las agendas médicas requiere comprender el comportamiento de la demanda, los patrones de asistencia y los factores que afectan la utilización de los recursos sanitarios. Para ello se desarrolló un proceso progresivo de analítica de datos que incluyó exploración de información, aplicación de herramientas probabilísticas y estadísticas, y finalmente la construcción de un modelo predictivo orientado a apoyar la toma de decisiones en la gestión de citas médicas.
La gestión de citas médicas constituye uno de los procesos más relevantes para la eficiencia operativa de las instituciones de salud. La programación inadecuada, los tiempos prolongados de espera y la inasistencia de pacientes generan pérdida de productividad, subutilización de recursos y dificultades en el acceso oportuno a la atención.
Con el fin de comprender estos fenómenos se analizaron tres bases de datos institucionales que contienen información relacionada con pacientes, disponibilidad de agendas y comportamiento de las citas médicas. El análisis se desarrolló mediante un enfoque progresivo que incluyó exploración analítica de datos, aplicación de técnicas estadísticas y construcción de un modelo predictivo.
Desarrollar un modelo predictivo que permita identificar la probabilidad de asistencia a citas médicas, con el fin de optimizar la gestión de agendas y mejorar la utilización de los recursos sanitarios.
## appointment_id slot_id scheduling_date appointment_date
## Min. : 1 Min. : 1 Length :111488 Length :111488
## 1st Qu.: 27873 1st Qu.: 25910 N.unique : 3642 N.unique : 2604
## Median : 55745 Median : 51852 N.blank : 0 N.blank : 0
## Mean : 55745 Mean : 51854 Min.nchar: 10 Min.nchar: 10
## 3rd Qu.: 83616 3rd Qu.: 77796 Max.nchar: 10 Max.nchar: 10
## Max. :111488 Max. :104159
##
## appointment_time scheduling_interval status check_in_time
## Length :111488 Min. : 1.00 Length :111488 Length :111488
## N.unique : 40 1st Qu.: 2.00 N.unique : 5 N.unique : 33252
## N.blank : 0 Median : 5.00 N.blank : 0 N.blank : 25456
## Min.nchar: 8 Mean : 7.19 Min.nchar: 7 Min.nchar: 0
## Max.nchar: 8 3rd Qu.:10.00 Max.nchar: 14 Max.nchar: 8
## Max. :30.00
##
## appointment_duration start_time end_time waiting_time
## Min. : 0.00 Length :111488 Length :111488 Min. : 0.60
## 1st Qu.: 8.60 N.unique : 35985 N.unique : 36853 1st Qu.: 12.60
## Median :15.80 N.blank : 25456 N.blank : 25456 Median : 33.50
## Mean :17.48 Min.nchar: 0 Min.nchar: 0 Mean : 44.09
## 3rd Qu.:24.70 Max.nchar: 8 Max.nchar: 8 3rd Qu.: 64.60
## Max. :58.70 Max. :297.30
## NAs :25456 NAs :25456
## patient_id sex age age_group
## Min. : 1 Length :111488 Min. : 15.00 Length :111488
## 1st Qu.: 5702 N.unique : 2 1st Qu.: 40.00 N.unique : 16
## Median :11816 N.blank : 0 Median : 59.00 N.blank : 0
## Mean :13783 Min.nchar: 4 Mean : 57.21 Min.nchar: 3
## 3rd Qu.:20736 Max.nchar: 6 3rd Qu.: 74.00 Max.nchar: 5
## Max. :36697 Max. :100.00
##
## patient_id name sex dob
## Min. : 1 Length :36697 Length :36697 Length :36697
## 1st Qu.: 9175 N.unique :30989 N.unique : 2 N.unique :20201
## Median :18349 N.blank : 0 N.blank : 0 N.blank : 0
## Mean :18349 Min.nchar: 6 Min.nchar: 4 Min.nchar: 10
## 3rd Qu.:27523 Max.nchar: 28 Max.nchar: 6 Max.nchar: 10
## Max. :36697
## insurance
## Length :36697
## N.unique : 11
## N.blank : 0
## Min.nchar: 10
## Max.nchar: 19
##
## slot_id appointment_date appointment_time is_available
## Min. : 1 Length :104360 Length :104360 Length :104360
## 1st Qu.: 26091 N.unique : 2609 N.unique : 40 N.unique : 2
## Median : 52181 N.blank : 0 N.blank : 0 N.blank : 0
## Mean : 52181 Min.nchar: 10 Min.nchar: 8 Min.nchar: 4
## 3rd Qu.: 78270 Max.nchar: 10 Max.nchar: 8 Max.nchar: 5
## Max. :104360
La base de datos analizada contiene un total de 111.488 registros correspondientes a citas médicas para el análisis de variables relacionadas con la gestión de servicios de salud y la operatividad de agendas médicas. La estructura de los datos evidencia una alta disponibilidad de información operativa relacionada con programación de citas, tiempos de atención y características demográficas de los pacientes, constituyendo una base adecuada para el desarrollo de procesos de analítica aplicada.
Dentro de los hallazgos relevantes se identificó un promedio de 7.19 días entre la fecha de programación y la fecha de atención de la cita médica, con valores mínimos de 1 día y máximos de hasta 30 días, lo que permite evidenciar variabilidad en los tiempos de asignación de citas que afecta directamente la oportunidad de acceso a los servicios de salud ya que intervalos prolongados de programación podrían generar riesgo de inasistencia de pacientes y afectar la continuidad del proceso asistencial.
##
## attended cancelled did not attend scheduled unknown
## 86032 18254 6615 141 446
library(ggplot2)
ggplot(appointments,
aes(x = status,
fill = status)) +
geom_bar() +
labs(title = "Estado de las citas médicas",
x = "Estado",
y = "Frecuencia") +
theme_minimal()Del total de citas médicas se evidencia que 86.032 citas fueron atendidas mientras que 25.456 citas presentaron alguna novedad que culmino en citas no aprovechadas.
Aunque el número de pacientes que no asisten o cancelan sus citas es inferior a 30,000, este indicador requiere una revisión profunda. Las consultas no realizadas afectan directamente la eficiencia del sistema de salud, ya que representan un desaprovechamiento de recursos e impiden que otras personas con las mismas necesidades reciban atención oportuna
##
## attended cancelled did not attend scheduled unknown
## 77.17 16.37 5.93 0.13 0.40
El total de citas no aprovechadas asciende al 22.30% entre cancelaciones
e inasistencias. Esta es una proporción significativa que impacta
negativamente los costos del sistema y evidencia fallas tanto en el
agendamiento y confirmación de citas, como en las estrategias para
cubrir los espacios disponibles. Esto resulta crítico si se considera la
alta demanda y la necesidad de atención que afrontan muchas entidades de
salud
## [1] 17.47953
## [1] 17.48
La duración promedio de las consultas médicas fue de 17,48 minutos, con una mediana de 15,8 minutos y valores máximos cercanos a 58,7 minutos. Adicionalmente, se identificaron 25.456 registros con inconsistencias en el diligenciamiento de la información o ausencia de cierre adecuado de las consultas dentro del sistema.
El promedio de duración de las consultas registrado en la base de datos analizada es de 17.48 minutos. Este dato sustenta por qué en Colombia y en países como Chile, Perú, Suecia la regulación establece que las consultas médicas deben durar mínimo 20 minutos, siendo este el tiempo mínimo que un profesional de la salud requiere para realizar un abordaje integral y responsable. Sin embargo, las extensiones en el tiempo de consulta deben ser evaluadas de manera individualizada por las instituciones, identificando si están asociadas a factores como la edad, el género y otras variables asociadas a los pacientes. Así mismo, éste resultado permite caracterizar la utilización del tiempo asistencial y puede servir como referencia para evaluar la planeación de agendas, la productividad médica y la capacidad operativa institucional.
##
## Female Male
## 66086 45402
##
## Female Male
## 59.28 40.72
##
## 15-19 20-24 25-29 30-34 35-39 40-44 45-49 50-54 55-59 60-64 65-69 70-74 75-79
## 2390 3984 5939 7527 7342 6450 6152 7591 8955 9649 9133 9485 9844
## 80-84 85-89 90+
## 8140 5839 3068
##
## 15-19 20-24 25-29 30-34 35-39 40-44 45-49 50-54 55-59 60-64 65-69 70-74 75-79
## 2.14 3.57 5.33 6.75 6.59 5.79 5.52 6.81 8.03 8.65 8.19 8.51 8.83
## 80-84 85-89 90+
## 7.30 5.24 2.75
Se identifica un mayor porcentaje de población femenina que solicita acceso al servicios de citas médicas con respecto a la población masculina. Adicionalmente se presentaron 16 grupos etarios diferentes, que incluyen población desde los 15 años hasta mayores de 90 años, permitiendo segmentar la población según rangos de edad para futuros análisis epidemiológicos y de utilización de servicios.
##
## attended cancelled did not attend scheduled unknown
## Female 51096 10721 3900 83 286
## Male 34936 7533 2715 58 160
##
## attended cancelled did not attend scheduled unknown
## Female 45.83 9.62 3.50 0.07 0.26
## Male 31.34 6.76 2.44 0.05 0.14
library(ggplot2)
# Tabla de porcentajes
tabla_pct <- round(
prop.table(table(appointments$sex, appointments$status)) * 100,2)
# Convertir a data frame
datos_pct <- as.data.frame(tabla_pct)
colnames(datos_pct) <- c("Sexo", "Estado", "Porcentaje")
# Gráfico
ggplot(datos_pct,
aes(x = Estado,
y = Porcentaje,
fill = Sexo)) + geom_col(position = "dodge") +
geom_text(aes(label = paste0(Porcentaje, "%")),
position = position_dodge(width = 0.9),
vjust = -0.3,
size = 4) +
labs(
title = "Distribución porcentual de los estados de las citas por sexo",
x = "Estado de la cita",
y = "Porcentaje (%)",
fill = "Sexo" ) +
scale_fill_manual(
values = c(
"Female" = "#E69F00",
"Male" = "#0072B2")) + theme_minimal()## [1] "appointments" "datos_pct" "edad_tabla" "patients" "sexo_tabla"
## [6] "slots" "tabla_pct"
##
## False True
## 93234 11126
##
## False True
## 89.33883 10.66117
Del total de citas médicas disponibles cerca del 90% de los espacios disponibles ya se encontraban ocupados constituyendo un indicador relevante para evaluar la utilización de la capacidad instalada y la eficiencia operativa de la programación de citas.
La exploración inicial permitió identificar tres aspectos relevantes para la gestión de citas médicas: un porcentaje importante de cancelaciones e inasistencias, variabilidad en los tiempos de asignación de citas y características demográficas en la población que accede al servicio de citas médicas. Estos hallazgos justifican la aplicación de herramientas probabilísticas y estadísticas orientadas a comprender mejor el comportamiento de la demanda y apoyar la toma de decisiones basada en evidencia.
patients <- read.csv("patients.csv")
slots <- read.csv("slots.csv")
appointments <- read.csv("appointments.csv")Se seleccionó una muestra aleatoria de 1.000 pacientes para reducir el tamaño de la población evaluada, manteniendo una muestra representativa para el análisis de datos y variables y reduciendo el sesgo en los análisis. La selección aleatoria constituye un mecanismo fundamental para garantizar representatividad y minimizar sesgos en procesos de análisis y evaluación de servicios de salud.
set.seed(123)
muestra_pacientes <- sample(appointments$patient_id, size = 1000, replace = FALSE)
head(muestra_pacientes)## [1] 1067 15957 2866 7040 145 34196
##
## attended cancelled did not attend scheduled unknown
## 86032 18254 6615 141 446
##
## attended cancelled did not attend scheduled unknown
## 0.771670494 0.163730626 0.059333740 0.001264710 0.004000431
El análisis probabilístico evidenció que el 77,17% de las citas programadas culminan en atención efectiva. Sin embargo, el 22,30% restante corresponde a eventos que no generan atención, incluyendo cancelaciones (16,37%) e inasistencias (5,93%).
Desde la perspectiva de gestión sanitaria, este resultado representa una oportunidad de mejora significativa, ya que aproximadamente una de cada cinco citas programadas no se traduce en la utilización efectiva de los recursos asistenciales. Este comportamiento puede generar subutilización de agendas médicas, pérdida de productividad y retrasos en el acceso de otros pacientes a los servicios de salud. Por tanto, la reducción de cancelaciones e inasistencias constituye una oportunidad estratégica para mejorar la eficiencia operativa institucional
Estos hallazgos justifican la aplicación posterior de técnicas estadísticas y modelos predictivos orientados a identificar factores asociados a la inasistencia y apoyar la toma de decisiones basadas en datos.
## [1] 29.758301 3.976098 2.258870 14.255104 13.103767 25.343176
Se generaron 1.000 tiempos de espera simulados entre 0 y 60 minutos utilizando una distribución uniforme. Este ejercicio tiene como objetivo ilustrar escenarios hipotéticos en los cuales cualquier tiempo de espera dentro del intervalo establecido tiene la misma probabilidad de ocurrir.
Desde la perspectiva de la gestión sanitaria, este tipo de simulación permite comprender el comportamiento de variables aleatorias y constituye una herramienta útil para realizar análisis de escenarios cuando no se dispone de información histórica suficiente. Sin embargo, en la práctica los tiempos de espera de los pacientes suelen concentrarse alrededor de ciertos valores y rara vez presentan una distribución completamente uniforme.
Por esta razón, la simulación se utiliza principalmente con fines académicos y metodológicos para comprender los principios de la probabilidad aplicados a los procesos asistenciales y no permite generar conclusiones aplicables al presente análisis estadístico.
## asistencia
## 0 1
## 230 770
Se seleccionaron 1000 pacientes de forma aleatoria para determinar la probabilidad de solo dos resultados: asistencia o no asistencia a la cita basados en la probabilidad de asistencia del 77%, dando como resultado de la simulación se evidencia que, del total de la muestra seleccionada, 765 pacientes tiene probabilidad en asistir a la cita médica y 235 de no asistir.
Desde la perspectiva de gestión sanitaria, este ejercicio permite dimensionar el impacto operativo de las inasistencias sobre la utilización de agendas médicas. Si estos resultados se extrapolan a escenarios de alta demanda, una proporción cercana a una cuarta parte de las citas programadas podría quedar subutilizada, afectando la productividad institucional, el acceso oportuno de otros pacientes y la eficiencia en el uso de los recursos asistenciales.
Este hallazgo refuerza la necesidad de implementar estrategias de confirmación de citas, recordatorios automáticos y mecanismos de seguimiento a pacientes con antecedentes de inasistencia, con el fin de reducir pérdidas operativas y optimizar la capacidad instalada.
## [1] 0.1562935
Se calculó la probabilidad de observar cinco cancelaciones por día siendo el promedio histórico cuatro cancelaciones durante el mismo periodo, se identificó una probabilidad del 15,6% de que se presenten estos eventos; Esta información contribuye a la toma de decisiones administrativas que generen impacto en la reducción del porcentaje de inasistencia.
Aunque el ejemplo utiliza una simulación con un promedio de cuatro cancelaciones por día, los datos institucionales evidencian que las cancelaciones constituyen uno de los principales factores de pérdida de utilización efectiva de las agendas médicas, lo que justifica la implementación de mecanismos de monitoreo y predicción de estos eventos.
Se estimó la probabilidad acumulada de encontrar pacientes con edades iguales o inferiores a 65 años.
Los resultados mostraron que aproximadamente el 65,05% de los usuarios se encuentran por debajo de este umbral etario, mientras que el 34,95% corresponde a pacientes mayores de 65 años. Este hallazgo evidencia una participación significativa de población adulta mayor dentro de la demanda institucional.
Desde la perspectiva de gestión sanitaria, la elevada proporción de pacientes mayores puede generar una mayor necesidad de consultas de seguimiento, programas de manejo de enfermedades crónicas y utilización recurrente de servicios asistenciales.
edad_simulada <- rnorm(n = 1000, mean = mean(appointments$age), sd = sd(appointments$age))
head(edad_simulada)## [1] 62.92205 79.20301 66.16348 77.60664 46.59578 50.99973
## [1] 0.6505044
La caracterización demográfica obtenida mediante la distribución normal complementa los análisis previos de asistencia, cancelación e inasistencia, permitiendo comprender no solo el comportamiento operativo de las citas, sino también las características poblacionales que generan la demanda de servicios de salud. Esta información constituye un insumo fundamental para el diseño posterior del modelo predictivo y para la planificación estratégica de recursos sanitarios.
Se utilizó una distribución exponencial para modelar los tiempos transcurridos entre la llegada de pacientes consecutivos al servicio de consulta. Considerando un intervalo promedio de llegada de 15 minutos, se estimó una probabilidad del 73,64% de que un paciente llegue antes de transcurridos 20 minutos.
Este resultado indica que la mayoría de los pacientes tienden a presentarse en intervalos relativamente cortos, generando una demanda continua sobre la capacidad operativa del servicio.
## [1] 6.106837 11.526629 6.744469 39.388816 7.471025 8.278928
## [1] 0.7364029
Aunque la simulación considera un tiempo promedio de llegada de 15 minutos, los datos reales evidencian tiempos de espera significativamente mayores, con una media de 44,09 minutos. Esta diferencia sugiere la posible existencia de factores operativos adicionales, como retrasos en la atención, acumulación de pacientes o limitaciones en la capacidad instalada, que podrían estar afectando la eficiencia del proceso de asignación y atención de citas médicas.
Para la distribución normal de edades, se calculó la densidad asociada a una edad de 60 años. El resultado obtenido (0,0196) indica que dicha edad se encuentra dentro de una zona con una concentración importante de pacientes, consistente con la presencia significativa de población adulta y adulta mayor observada en el análisis demográfico.
## [1] 0.01960135
Este hallazgo resulta relevante porque los pacientes de mayor edad suelen requerir una utilización más frecuente de servicios médicos, seguimiento clínico y atención de enfermedades crónicas, factores que impactan directamente la planeación de agendas y la asignación de recursos asistenciales.
A continuación, se calculó la densidad correspondiente a un intervalo de 20 minutos entre eventos consecutivos utilizando una distribución exponencial con un tiempo promedio de llegada de 15 minutos. El valor obtenido (0,0176) representa la frecuencia relativa asociada a dicho intervalo dentro del comportamiento esperado de llegadas.
## [1] 0.01757314
Este resultado complementa el análisis de tiempos de llegada y permite comprender la distribución de los intervalos entre pacientes.
En conclusión, éstas dos funciones de densidad permitieron caracterizar la distribución de variables relevantes para la operación del servicio, como la edad de los pacientes y los tiempos entre eventos asistenciales. Estos análisis complementan los resultados obtenidos mediante las distribuciones probabilísticas estudiadas previamente y aportan elementos para comprender la dinámica de la demanda, optimizar la utilización de recursos sanitarios y fortalecer los procesos de toma de decisiones basados en datos.
En el siguiente gráfico presentamos un histograma con una distribución con forma normal que permite identificar como se concentran los valores y como las frecuencias de edades disminuyen hacia los extremos.
grafico_edad <- ggplot(data.frame(edad_simulada), aes(x = edad_simulada)) + geom_histogram(bins = 30, fill = "steelblue", color = "black") + labs(title = "Distribucion simulada de edades", x = "edad", y = "frecuencia")
grafico_edadLa simulación realizada evidencia una mayor concentración de pacientes en edades adultas y adultas mayores, particularmente entre los 40 y 80 años. Este comportamiento es consistente con los resultados obtenidos en la caracterización demográfica de la población atendida.
La visualización interactiva permitió explorar con mayor detalle la distribución de edades simuladas, facilitando la identificación de intervalos con mayor concentración de pacientes y la detección de valores extremos
Los resultados obtenidos sugieren que la edad constituye una variable relevante para caracterizar la población atendida y potencialmente explicar diferencias en el comportamiento de asistencia a las citas médicas. Por esta razón, la edad y los grupos etarios fueron considerados posteriormente dentro de las variables incluidas en el modelo predictivo de asistencia desarrollado en la siguiente fase del análisis.
## [1] 44.08651
## [1] 33.5
## [1] 40.78879
## [1] 1663.725
## [1] 0.6 297.3
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## 0.60 12.60 33.50 44.09 64.60 297.30 25456
Las medidas de tendencia central y dispersión permitieron caracterizar el comportamiento de los tiempos de espera de los pacientes dentro del proceso de atención.
El tiempo promedio de espera fue de 44,09 minutos, lo que indica que los usuarios permanecieron en espera cerca de tres cuartos de hora antes de ser atendidos. Sin embargo, la mediana fue de 33,5 minutos, evidenciando que el 50% de los pacientes esperó menos de este tiempo.
La diferencia entre la media y la mediana sugiere una distribución asimétrica hacia la derecha, ocasionada por la presencia de pacientes que experimentaron tiempos de espera considerablemente superiores al comportamiento habitual del servicio. Esta situación se confirma con la desviación estándar de 40,79 minutos y una varianza de 1.663,73, indicadores que reflejan una alta dispersión de los datos.
El análisis del rango mostró tiempos de espera entre 0,6 y 297,3 minutos. La amplitud observada evidencia la existencia de casos extremos que incrementan el promedio institucional y podrían afectar la percepción de oportunidad y calidad del servicio por parte de los usuarios.
Adicionalmente, se identificaron 25.456 registros sin información de tiempo de espera. La magnitud de estos datos faltantes limita parcialmente la capacidad de análisis y sugiere oportunidades de mejora en los procesos de captura y calidad de la información.
Los resultados evidencian una importante heterogeneidad en los tiempos de espera y sugieren la necesidad de fortalecer los mecanismos de monitoreo operativo, optimizar la programación de agendas y analizar las causas asociadas a los casos con mayores demoras. La reducción de la variabilidad en los tiempos de espera constituye una oportunidad para mejorar la eficiencia operativa, la satisfacción de los usuarios y la utilización de los recursos asistenciales.
##
## Welch Two Sample t-test
##
## data: age by sex
## t = -56.758, df = 101597, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Female and group Male is not equal to 0
## 95 percent confidence interval:
## -7.028949 -6.559701
## sample estimates:
## mean in group Female mean in group Male
## 54.43831 61.23263
Los resultados muestran diferencias significativas en la composición etaria de la población atendida según el sexo. Los hombres presentan una edad promedio de 61.23 años, mientras que las mujeres tienen una edad promedio de 54.44 años. Esta diferencia aproximadamente de 6.8 años fue estadísticamente significativa, lo que sugiere que la demanda de servicios de salud por parte de los hombres se concentra en grupos de mayor edad.
Este hallazgo sugiere patrones diferenciados de utilización de los servicios de salud entre hombres y mujeres. La mayor edad promedio observada en los hombres puede estar asociada a necesidades asistenciales distintas y a una mayor utilización de servicios relacionados con condiciones propias del envejecimiento poblacional.
La identificación de diferencias demográficas entre grupos poblacionales resulta relevante para la planificación de recursos, la organización de programas de promoción y prevención y el diseño de estrategias de atención adaptadas a las características de la población usuaria.
## Df Sum Sq Mean Sq F value Pr(>F)
## age_group 15 45070565 3004704 1442760 <2e-16 ***
## Residuals 111472 232152 2
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El análisis de varianza (ANOVA) evidenció diferencias estadísticamente significativas entre los grupos etarios definidos en la base de datos (p < 0,001). Este resultado confirma que la clasificación utilizada segmenta adecuadamente la población en categorías con características de edad claramente diferenciadas.
Aunque el resultado es esperado debido a que los grupos etarios fueron construidos a partir de la propia variable edad, el análisis permite validar la consistencia de la segmentación empleada en la caracterización demográfica de la población atendida.
La estratificación por grupos etarios constituye una herramienta útil para analizar patrones de utilización de servicios, identificar poblaciones con necesidades asistenciales específicas y orientar la planificación de programas de promoción, prevención y atención diferenciada según el ciclo de vida de los usuarios.
Adicionalmente, la variable grupo etario puede aportar valor en modelos analíticos posteriores al facilitar la identificación de comportamientos diferenciales asociados a la edad dentro de la población atendida.
En esta sección daremos respuesta a la siguiente pregunta
¿El sexo influye en la asistencia, cancelación o inasistencia de las citas?
##
## Pearson's Chi-squared test
##
## data: tabla_chi
## X-squared = 7.3475, df = 4, p-value = 0.1186
Los resultados no evidenciaron una asociación estadísticamente significativa entre ambas variables (p > 0,05), indicando que la distribución de asistencia, cancelación e inasistencia es similar entre hombres y mujeres.
este hallazgo sugiere que el sexo no constituye un factor relevante para explicar el desenlace operativo de las citas programadas.
La prueba permite identificar si existe asociación entre el sexo del paciente y el estado final de la cita.
##
## attended cancelled did not attend scheduled unknown
## Female 77.32 16.22 5.90 0.13 0.43
## Male 76.95 16.59 5.98 0.13 0.35
Aunque las mujeres representan una mayor proporción de la población atendida, los porcentajes de asistencia e inasistencia son similares entre ambos sexos.
A continuación se compara la proporción de asistencia entre hombres y mujeres
tabla_prop <- table(appointments$sex, appointments$status == "attended")
prop.test(x = tabla_prop[,2], n = rowSums(tabla_prop))##
## 2-sample test for equality of proportions with continuity correction
##
## data: tabla_prop[, 2] out of rowSums(tabla_prop)
## X-squared = 2.0621, df = 1, p-value = 0.151
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.001345945 0.008731601
## sample estimates:
## prop 1 prop 2
## 0.7731743 0.7694815
Se compara la proporción de asistencia entre hombres y mujeres.
Los resultados no evidenciaron diferencias estadísticamente significativas entre ambos grupos (p > 0,05).
La proporción de asistencia observada fue de 77,3% para las mujeres y 76,9% para los hombres. Aunque se identificó una diferencia numérica mínima, esta no fue suficiente para demostrar un comportamiento diferencial entre los grupos analizados.
En el siguiente diagrama de cajas se presenta la distribución de edades de la población atendida segun sexo
Se observa que los hombres presentan edades superiores a las observadas en las mujeres, resultado consistente con la prueba estadística previamente realizada. Adicionalmente, se identifican valores extremos en ambos grupos, correspondientes a pacientes de edades avanzadas, lo que refleja la diversidad demográfica de la población atendida.
A continuación presentamos un Diagrama de Cajas que representa los tiempos de espera distribuidos entre hombres y mujeres
## Warning: Removed 25456 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
En ambos grupos se observa una elevada dispersión de los tiempos de espera, así como la presencia de valores extremos que superan ampliamente los tiempos habituales de atención. Este comportamiento coincide con los resultados descriptivos previamente obtenidos, donde se identificó una alta variabilidad en la oportunidad del servicio.
La presencia de pacientes con tiempos de espera excepcionalmente altos constituye una oportunidad de mejora para la organización, dado que estos casos pueden afectar la percepción de calidad, la satisfacción de los usuarios y la eficiencia operativa del servicio.
La inasistencia a citas médicas constituye uno de los principales desafíos para la gestión eficiente de los recursos sanitarios, dado que genera subutilización de agendas, incremento de costos operativos y disminución de la oportunidad en la atención. Con el propósito de anticipar este comportamiento, se diseñaron y validaron modelos analíticos orientados a predecir la probabilidad de asistencia de los pacientes utilizando variables demográficas y operativas disponibles en la institución.
## Cargando paquete requerido: lattice
##
## Adjuntando el paquete: 'caret'
## The following object is masked from 'package:rsample':
##
## calibration
## The following object is masked from 'package:purrr':
##
## lift
##
## Adjuntando el paquete: 'yardstick'
## The following objects are masked from 'package:caret':
##
## precision, recall, sensitivity, specificity
## The following object is masked from 'package:readr':
##
## spec
## Rows: 111,488
## Columns: 16
## $ appointment_id <int> 138, 146, 21, 233, 90, 180, 197, 191, 135, 130, 1…
## $ slot_id <int> 1, 23, 24, 25, 26, 27, 28, 29, 30, 22, 31, 33, 34…
## $ scheduling_date <chr> "2014-12-28", "2014-12-29", "2014-12-17", "2014-1…
## $ appointment_date <chr> "2015-01-01", "2015-01-01", "2015-01-01", "2015-0…
## $ appointment_time <chr> "08:00:00", "13:30:00", "13:45:00", "14:00:00", "…
## $ scheduling_interval <int> 4, 3, 15, 1, 6, 2, 2, 2, 4, 4, 4, 1, 1, 7, 3, 2, …
## $ status <chr> "did not attend", "did not attend", "attended", "…
## $ check_in_time <chr> "", "", "13:36:45", "13:59:32", "", "14:08:53", "…
## $ appointment_duration <dbl> NA, NA, 5.2, 28.9, NA, 7.7, 4.2, 27.1, NA, 1.2, 7…
## $ start_time <chr> "", "", "13:37:57", "14:00:40", "", "14:30:38", "…
## $ end_time <chr> "", "", "13:43:09", "14:29:34", "", "14:38:20", "…
## $ waiting_time <dbl> NA, NA, 1.2, 1.1, NA, 21.7, 16.2, 1.0, NA, 8.5, 2…
## $ patient_id <int> 8285, 5972, 6472, 5376, 8028, 4317, 7638, 7061, 2…
## $ sex <chr> "Male", "Male", "Male", "Female", "Male", "Female…
## $ age <int> 37, 84, 77, 37, 72, 51, 28, 33, 29, 90, 66, 64, 3…
## $ age_group <chr> "35-39", "80-84", "75-79", "35-39", "70-74", "50-…
## [1] "appointment_id" "slot_id" "scheduling_date"
## [4] "appointment_date" "appointment_time" "scheduling_interval"
## [7] "status" "check_in_time" "appointment_duration"
## [10] "start_time" "end_time" "waiting_time"
## [13] "patient_id" "sex" "age"
## [16] "age_group"
## appointment_id slot_id scheduling_date
## "integer" "integer" "character"
## appointment_date appointment_time scheduling_interval
## "character" "character" "integer"
## status check_in_time appointment_duration
## "character" "character" "numeric"
## start_time end_time waiting_time
## "character" "character" "numeric"
## patient_id sex age
## "integer" "character" "integer"
## age_group
## "character"
## appointment_id slot_id scheduling_date appointment_date
## Min. : 1 Min. : 1 Length :111488 Length :111488
## 1st Qu.: 27873 1st Qu.: 25910 N.unique : 3642 N.unique : 2604
## Median : 55745 Median : 51852 N.blank : 0 N.blank : 0
## Mean : 55745 Mean : 51854 Min.nchar: 10 Min.nchar: 10
## 3rd Qu.: 83616 3rd Qu.: 77796 Max.nchar: 10 Max.nchar: 10
## Max. :111488 Max. :104159
##
## appointment_time scheduling_interval status check_in_time
## Length :111488 Min. : 1.00 Length :111488 Length :111488
## N.unique : 40 1st Qu.: 2.00 N.unique : 5 N.unique : 33252
## N.blank : 0 Median : 5.00 N.blank : 0 N.blank : 25456
## Min.nchar: 8 Mean : 7.19 Min.nchar: 7 Min.nchar: 0
## Max.nchar: 8 3rd Qu.:10.00 Max.nchar: 14 Max.nchar: 8
## Max. :30.00
##
## appointment_duration start_time end_time waiting_time
## Min. : 0.00 Length :111488 Length :111488 Min. : 0.60
## 1st Qu.: 8.60 N.unique : 35985 N.unique : 36853 1st Qu.: 12.60
## Median :15.80 N.blank : 25456 N.blank : 25456 Median : 33.50
## Mean :17.48 Min.nchar: 0 Min.nchar: 0 Mean : 44.09
## 3rd Qu.:24.70 Max.nchar: 8 Max.nchar: 8 3rd Qu.: 64.60
## Max. :58.70 Max. :297.30
## NAs :25456 NAs :25456
## patient_id sex age age_group
## Min. : 1 Length :111488 Min. : 15.00 Length :111488
## 1st Qu.: 5702 N.unique : 2 1st Qu.: 40.00 N.unique : 16
## Median :11816 N.blank : 0 Median : 59.00 N.blank : 0
## Mean :13783 Min.nchar: 4 Mean : 57.21 Min.nchar: 3
## 3rd Qu.:20736 Max.nchar: 6 3rd Qu.: 74.00 Max.nchar: 5
## Max. :36697 Max. :100.00
##
La exploración inicial de los datos permitió identificar la estructura de la base de datos, los tipos de variables disponibles y la presencia de información demográfica, operativa y temporal relacionada con el proceso de asignación y atención de citas médicas.
Se seleccionaron variables demográficas y operativas potencialmente asociadas al comportamiento de asistencia de los pacientes. La variable dependiente fue la asistencia efectiva a la cita, mientras que como variables predictoras se incluyeron la edad, sexo, grupo etario e intervalo de programación de la cita. Se eliminaron registros con datos faltantes para garantizar la calidad del análisis.
library(dplyr)
datos_modelo <- appointments %>%
mutate(
asistencia = ifelse(status == "attended", 1, 0)
) %>%
select(
asistencia,
age,
sex,
age_group,
scheduling_interval
) %>%
drop_na()
glimpse(datos_modelo)## Rows: 111,488
## Columns: 5
## $ asistencia <dbl> 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ age <int> 37, 84, 77, 37, 72, 51, 28, 33, 29, 90, 66, 64, 34…
## $ sex <chr> "Male", "Male", "Male", "Female", "Male", "Female"…
## $ age_group <chr> "35-39", "80-84", "75-79", "35-39", "70-74", "50-5…
## $ scheduling_interval <int> 4, 3, 15, 1, 6, 2, 2, 2, 4, 4, 4, 1, 1, 7, 3, 2, 5…
| Name | datos_modelo |
| Number of rows | 111488 |
| Number of columns | 5 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 3 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| sex | 0 | 1 | 4 | 6 | 0 | 2 | 0 |
| age_group | 0 | 1 | 3 | 5 | 0 | 16 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| asistencia | 0 | 1 | 0.77 | 0.42 | 0 | 1 | 1 | 1 | 1 | ▂▁▁▁▇ |
| age | 0 | 1 | 57.21 | 20.16 | 15 | 40 | 59 | 74 | 100 | ▅▆▇▇▂ |
| scheduling_interval | 0 | 1 | 7.19 | 6.15 | 1 | 2 | 5 | 10 | 30 | ▇▃▂▁▁ |
El conjunto final de datos estuvo conformado por variables demográficas y operativas consideradas relevantes para explicar el comportamiento de asistencia. La inclusión de estas variables se fundamentó en los análisis exploratorios previos, los cuales evidenciaron diferencias poblacionales según edad y sexo, así como patrones asociados a la utilización de las citas médicas.
library(rsample)
set.seed(123)
split <- initial_split(
datos_modelo,
prop = 0.75,
strata = asistencia
)
train_data <- training(split)
test_data <- testing(split)
dim(train_data)## [1] 83616 5
## [1] 27872 5
El conjunto de datos fue dividido en una muestra de entrenamiento (75%) y una muestra de prueba (25%). Esta estrategia permite entrenar los modelos utilizando una parte de la información y posteriormente evaluar su capacidad predictiva sobre datos no utilizados durante el proceso de ajuste, reduciendo el riesgo de sobreajuste.
modelo_logistico <- glm(
asistencia ~ age +
sex +
age_group +
scheduling_interval,
family = binomial,
data = train_data
)
summary(modelo_logistico)##
## Call:
## glm(formula = asistencia ~ age + sex + age_group + scheduling_interval,
## family = binomial, data = train_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.381053 0.114576 12.054 <2e-16 ***
## age -0.007056 0.005705 -1.237 0.2162
## sexMale -0.033777 0.017059 -1.980 0.0477 *
## age_group20-24 -0.077274 0.076081 -1.016 0.3098
## age_group25-29 0.045565 0.087269 0.522 0.6016
## age_group30-34 0.099205 0.106018 0.936 0.3494
## age_group35-39 0.135313 0.129728 1.043 0.2969
## age_group40-44 0.088555 0.155114 0.571 0.5681
## age_group45-49 0.123737 0.182049 0.680 0.4967
## age_group50-54 0.189394 0.208708 0.907 0.3642
## age_group55-59 0.222364 0.235264 0.945 0.3446
## age_group60-64 0.288874 0.262446 1.101 0.2710
## age_group65-69 0.332639 0.290409 1.145 0.2520
## age_group70-74 0.355138 0.318419 1.115 0.2647
## age_group75-79 0.419778 0.345894 1.214 0.2249
## age_group80-84 0.402175 0.373788 1.076 0.2820
## age_group85-89 0.480159 0.402470 1.193 0.2329
## age_group90+ 0.447185 0.433829 1.031 0.3026
## scheduling_interval 0.001390 0.001343 1.035 0.3005
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 89845 on 83615 degrees of freedom
## Residual deviance: 89824 on 83597 degrees of freedom
## AIC: 89862
##
## Number of Fisher Scoring iterations: 4
library(yardstick)
auc_logistico <- roc_auc_vec(
truth = factor(test_data$asistencia),
estimate = pred_logistico
)
auc_logistico## [1] 0.4995372
El modelo de regresión logística permitió estimar la probabilidad de asistencia a partir de características demográficas y operativas de los pacientes. El valor del AUC obtenido constituye una medida de la capacidad del modelo para discriminar entre pacientes que asistirán y aquellos que no asistirán a la cita. Valores cercanos a 1 indican un excelente desempeño predictivo.
library(rpart)
library(rpart.plot)
modelo_arbol <- rpart(
as.factor(asistencia) ~ age +
sex +
age_group +
scheduling_interval,
data = train_data,
method = "class"
)
rpart.plot(modelo_arbol)## n= 83616
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 83616 19092 1 (0.2283295 0.7716705) *
pred_arbol <- predict(
modelo_arbol,
newdata = test_data,
type = "prob"
)[,2]
auc_arbol <- roc_auc_vec(
truth = factor(test_data$asistencia),
estimate = pred_arbol
)
auc_arbol## [1] 0.5
El árbol de decisión facilita la identificación visual de reglas de clasificación asociadas a la asistencia de los pacientes. Además de su capacidad predictiva, este tipo de modelo presenta la ventaja de ser fácilmente interpretable para los responsables de la gestión institucional.
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Adjuntando el paquete: 'randomForest'
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
modelo_rf <- randomForest(
as.factor(asistencia) ~ age +
sex +
age_group +
scheduling_interval,
data = train_data
)
modelo_rf##
## Call:
## randomForest(formula = as.factor(asistencia) ~ age + sex + age_group + scheduling_interval, data = train_data)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 22.87%
## Confusion matrix:
## 0 1 class.error
## 0 21 19071 0.9989000629
## 1 56 64468 0.0008678941
pred_rf <- predict(
modelo_rf,
newdata = test_data,
type = "prob"
)[,2]
auc_rf <- roc_auc_vec(
truth = factor(test_data$asistencia),
estimate = pred_rf
)
auc_rf## [1] 0.4981946
El modelo de bosque aleatorio permite capturar relaciones complejas entre las variables y generalmente presenta una elevada capacidad predictiva. Adicionalmente, el análisis de importancia de variables facilita identificar los factores que contribuyen en mayor medida a explicar la asistencia de los pacientes.
comparacion <- data.frame(
Modelo = c(
"Regresión logística",
"Árbol de decisión",
"Bosque aleatorio"
),
AUC = c(
auc_logistico,
auc_arbol,
auc_rf
)
)
comparacionlibrary(ggplot2)
ggplot(comparacion,
aes(x = Modelo,
y = AUC,
fill = Modelo)) +
geom_col() +
ylim(0,1) +
labs(
title = "Comparación del desempeño predictivo",
y = "AUC"
) +
theme_minimal()Los tres modelos desarrollados presentaron desempeños predictivos limitados para identificar la inasistencia a citas médicas. El árbol de decisión obtuvo el mayor valor de AUC (0,50), seguido de la regresión logística (0,499) y el bosque aleatorio (0,498). Sin embargo, los valores observados son muy cercanos a 0,5, lo que indica una capacidad de discriminación prácticamente equivalente al azar.
Aunque el árbol de decisión presentó el mejor desempeño relativo entre los modelos evaluados, la diferencia respecto a los demás modelos fue mínima y no representa una mejora sustancial en la capacidad predictiva. Estos resultados sugieren que las variables disponibles en la base de datos (edad, sexo, grupo etario e intervalo de programación) no contienen suficiente información para explicar adecuadamente el comportamiento de asistencia de los pacientes.
Desde la perspectiva de la gestión sanitaria, los hallazgos evidencian la necesidad de fortalecer la captura de información operativa y clínica para mejorar el desempeño de futuros modelos predictivos. Variables como especialidad médica, horario de la cita, aseguradora, antecedentes de inasistencia, distancia geográfica al centro asistencial, mecanismos de recordatorio y condiciones socioeconómicas podrían incrementar significativamente la capacidad predictiva de los modelos.
A pesar de las limitaciones identificadas, el árbol de decisión fue seleccionado como el modelo de referencia debido a su mayor valor de AUC y a su facilidad de interpretación, característica que favorece la comprensión de las reglas de clasificación por parte de los responsables de la gestión institucional.
| Hallazgo | Implicación para la gestión |
|---|---|
| AUC cercano a 0,5 | Las variables actuales son insuficientes para predecir la inasistencia. |
| Bajo desempeño de todos los modelos | Se requiere incorporar nuevas fuentes de información. |
| Mejor desempeño relativo del árbol de decisión | Puede utilizarse como herramienta exploratoria inicial. |
| Alta proporción de inasistencias | Se recomienda implementar estrategias de confirmación y recordatorio de citas. |
Aunque el árbol de decisión presentó el mayor valor de AUC (0,50), la diferencia frente a los demás modelos fue mínima. En términos prácticos, ninguno de los modelos alcanzó un desempeño predictivo satisfactorio, dado que todos presentaron valores cercanos a 0,5. Estos resultados indican que las variables disponibles no permiten discriminar adecuadamente entre pacientes asistentes y no asistentes, por lo que se requieren nuevas fuentes de información para fortalecer futuros modelos predictivos.
Los resultados obtenidos evidencian que la utilización de modelos predictivos puede constituir una herramienta útil para fortalecer la gestión de agendas médicas y optimizar la utilización de los recursos sanitarios. La identificación temprana de pacientes con mayor probabilidad de inasistencia permitiría implementar estrategias de confirmación prioritaria, reasignación oportuna de citas y sobreagendamiento controlado, contribuyendo a reducir pérdidas de capacidad instalada y mejorar la oportunidad en la atención.
Adicionalmente, la incorporación de herramientas analíticas en los procesos institucionales favorece la toma de decisiones basada en evidencia y fortalece la eficiencia operativa de los servicios de salud.
El presente estudio presenta algunas limitaciones relacionadas principalmente con la disponibilidad de variables. La base de datos no incluye información clínica, socioeconómica ni variables operativas adicionales que podrían influir significativamente en el comportamiento de asistencia. Asimismo, no se dispone de antecedentes históricos individuales de inasistencia ni de información relacionada con mecanismos institucionales de confirmación de citas.