1. Introducción y problemática

Los tiempos de espera en la atención ambulatoria constituyen un problema relevante en los servicios de salud, ya que afectan la oportunidad de la atención, la satisfacción del paciente y la eficiencia operativa. Demoras prolongadas pueden generar congestión, percepción negativa de la calidad y dificultades en la gestión de agendas médicas.

2. Planteamiento del problema y pregunta de investigación

En una población de pacientes que asisten a citas médicas ambulatorias, se observa variabilidad en el tiempo de espera una vez el paciente llega al servicio. Sin embargo, no se tiene claridad sobre el papel que desempeñan factores operativos de la programación de la cita, como el periodo del día y el día de la semana, en dicha variabilidad.

Pregunta de investigación:
¿Qué factores asociados a la programación de la cita (periodo del día y día de la semana) se relacionan con el tiempo de espera de los pacientes que asisten a su cita médica?

3. Librerías

appointments <- readRDS(“appointments.rds”) ## 4. Carga de datos y preparación

Nota: Este documento asume que ya tienes el objeto appointments cargado en el Environment.
Si no lo tienes, descomenta la línea read_csv() y ajusta el nombre/ruta del archivo.

## [1] 111488     20
##  [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"            "age_decade"           "weekday"             
## [19] "hour"                 "time_period"
## 'data.frame':    111488 obs. of  20 variables:
##  $ appointment_id      : int  138 146 21 233 90 180 197 191 135 130 ...
##  $ slot_id             : int  1 23 24 25 26 27 28 29 30 22 ...
##  $ scheduling_date     : Date, format: "2014-12-28" "2014-12-29" ...
##  $ appointment_date    : Date, format: "2015-01-01" "2015-01-01" ...
##  $ appointment_time    : chr  "8:00:00" "13:30:00" "13:45:00" "14:00:00" ...
##  $ scheduling_interval : int  4 3 15 1 6 2 2 2 4 4 ...
##  $ status              : Factor w/ 5 levels "attended","cancelled",..: 3 3 1 1 2 1 1 1 2 1 ...
##  $ check_in_time       : chr  "" "" "13:36:45" "13:59:32" ...
##  $ appointment_duration: num  NA NA 5.2 28.9 NA 7.7 4.2 27.1 NA 1.2 ...
##  $ start_time          : chr  "" "" "13:37:57" "14:00:40" ...
##  $ end_time            : chr  "" "" "13:43:09" "14:29:34" ...
##  $ waiting_time        : num  NA NA 1.2 1.1 NA 21.7 16.2 1 NA 8.5 ...
##  $ patient_id          : int  8285 5972 6472 5376 8028 4317 7638 7061 2475 4217 ...
##  $ sex                 : Factor w/ 2 levels "Female","Male": 2 2 2 1 2 1 2 2 1 1 ...
##  $ age                 : int  37 84 77 37 72 51 28 33 29 90 ...
##  $ age_group           : Factor w/ 16 levels "15-19","20-24",..: 5 14 13 5 12 8 3 4 3 16 ...
##  $ age_decade          : num  30 80 70 30 70 50 20 30 20 90 ...
##  $ weekday             : Factor w/ 5 levels "jueves","lunes",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ hour                : num  NA 13 13 14 14 14 14 15 15 13 ...
##  $ time_period         : Factor w/ 3 levels "morning","afternoon",..: 3 2 2 2 2 2 2 2 2 2 ...
## [1] 86032    20
## 
##   morning afternoon     other 
##     17184     51644     17204
## 
##    jueves     lunes    martes miércoles   viernes 
##     17179     17231     17155     17193     17274
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.60   12.60   33.50   44.09   64.60  297.30

5. Exploración analítica y estadísticas descriptivas

Se describe el comportamiento del tiempo de espera mediante medidas de tendencia central y dispersión robusta, complementadas con visualizaciones.

5.1 Medidas de tendencia central y dispersión (robustas)

##       n    media mediana IQR
## 1 86032 44.08651    33.5  52

5.2 Histograma del tiempo de espera

5.3 Boxplot del tiempo de espera (incluye outliers)

6. Detección de outliers (criterio de Tukey)

Se identifican valores extremos usando la regla 1.5 × IQR. Los outliers no se eliminan del modelado; se excluyen únicamente en una visualización para facilitar la lectura del comportamiento central.

##   outliers_n outliers_pct limite_inferior limite_superior
## 1       2538     2.950065           -65.4           142.6

6.1 Boxplot sin outliers (solo visualización)

7. Modelamiento estadístico

Para responder la pregunta de investigación se ajustan dos modelos de regresión lineal:

La comparación se realiza con , ANOVA entre modelos anidados, y validación predictiva sencilla (train/test) con RMSE y MAE.

8. Modelo 1: efecto del periodo del día

## # A tibble: 1 × 12
##   r.squared adj.r.squared sigma statistic p.value    df   logLik     AIC     BIC
##       <dbl>         <dbl> <dbl>     <dbl>   <dbl> <dbl>    <dbl>   <dbl>   <dbl>
## 1     0.127         0.127  38.1     6266.       0     2 -435265. 870539. 870576.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
## # A tibble: 3 × 5
##   term                 estimate std.error statistic   p.value
##   <chr>                   <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept)              34.5     0.291     119.  0        
## 2 time_periodafternoon     20.9     0.336      62.2 0        
## 3 time_periodother        -14.6     0.411     -35.5 4.34e-274

8.1 Gráfica soporte Modelo 1 (diferencia afternoon vs morning)

9. Modelo 2: efecto del periodo del día y día de la semana

## # A tibble: 1 × 12
##   r.squared adj.r.squared sigma statistic p.value    df   logLik     AIC     BIC
##       <dbl>         <dbl> <dbl>     <dbl>   <dbl> <dbl>    <dbl>   <dbl>   <dbl>
## 1     0.128         0.128  38.1     2102.       0     6 -435231. 870478. 870553.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
## # A tibble: 7 × 5
##   term                 estimate std.error statistic   p.value
##   <chr>                   <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept)            35.2       0.390    90.3   0        
## 2 time_periodafternoon   20.9       0.335    62.2   0        
## 3 time_periodother      -14.6       0.411   -35.5   3.06e-274
## 4 weekdaylunes            0.119     0.411     0.290 7.72e-  1
## 5 weekdaymartes          -0.442     0.411    -1.08  2.82e-  1
## 6 weekdaymiércoles       -0.464     0.411    -1.13  2.59e-  1
## 7 weekdayviernes         -2.82      0.410    -6.87  6.65e- 12

9.1 Gráfica soporte Modelo 2 (weekday) sin outliers para lectura

10. Validación, testeo y evaluación del desempeño

10.1 Comparación entre modelos (ANOVA)

## Analysis of Variance Table
## 
## Model 1: waiting_time ~ time_period
## Model 2: waiting_time ~ time_period + weekday
##   Res.Df       RSS Df Sum of Sq      F    Pr(>F)    
## 1  86029 124932525                                  
## 2  86025 124832991  4     99534 17.148 4.561e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación (para sustentación):
En bases de datos grandes, la incorporación de una variable adicional puede producir aumentos pequeños en R². Aun así, la prueba ANOVA evalúa si la variable adicional mejora significativamente el ajuste. Un p-valor pequeño respalda que el Modelo 2 es estadísticamente superior al Modelo 1.

10.2 Evaluación predictiva (train/test) con RMSE y MAE

## # A tibble: 2 × 3
##   modelo    RMSE   MAE
##   <chr>    <dbl> <dbl>
## 1 Modelo 1  38.0  28.9
## 2 Modelo 2  38.0  28.9

11. Gráfico dinámico: efectos predichos (Modelo 2)

El gráfico muestra valores predichos (estimaciones promedio del modelo) para cada combinación de time_period y weekday, lo cual permite explorar el efecto conjunto de ambas variables de forma interactiva.

12. Conclusiones y coherencia con la problemática

El análisis evidenció que el periodo del día se asocia de forma relevante con el tiempo de espera: la tarde concentra mayores tiempos de espera promedio frente a la mañana. La inclusión del día de la semana en el Modelo 2 refina el análisis e incorpora variación adicional (moderada pero consistente).

Aunque la mejora en R² puede ser pequeña —algo esperable en bases de datos grandes y con muchos determinantes no observados—, la prueba ANOVA demuestra que el Modelo 2 mejora significativamente el ajuste respecto al Modelo 1. Adicionalmente, la validación predictiva simple (train/test) permite contrastar desempeño mediante RMSE/MAE, apoyando la evaluación de la capacidad predictiva.

En conjunto, estos resultados aportan evidencia cuantitativa para comprender la problemática de tiempos de espera y respaldan la toma de decisiones operativas para mejorar la organización de agendas médicas.