Uso e integridad de información. Este documento es una demostración académica basada exclusivamente en datos sintéticos. Ni las cifras ni los episodios describen una IPS real. Los umbrales utilizados son supuestos de gestión que deben validarse clínicamente; no constituyen normas obligatorias. Las asociaciones y los escenarios no demuestran causalidad.
Autorizar un piloto operativo de seis semanas, condicionado a verificar primero los datos institucionales, para adaptar la capacidad de atención a los períodos de mayor demanda de urgencias. La decisión no consiste en ampliar permanentemente la planta ni modificar los criterios clínicos de priorización: consiste en medir los cuellos de botella y ensayar una reorganización reversible de turnos y flujo, con supervisión de seguridad del paciente.
En el experimento reproducible de 90 días, la atención se observa en cuatro franjas diarias. El análisis permite contrastar la variación de la demanda, la ocupación simulada, los tiempos medios de espera y la proporción de personas que abandonan antes de completar la atención. El análisis recomienda no administrar el servicio únicamente con promedios trimestrales: se requieren métricas desagregadas por franja, seguimiento de episodios críticos y un esquema de evaluación antes de escalar inversiones.
# Una observación equivale a una franja de seis horas de un día.
fechas <- seq(as.Date("2026-01-01"),as.Date("2026-03-31"),by="day")
franjas <- c("00:00-05:59","06:00-11:59","12:00-17:59","18:00-23:59")
datos <- tidyr::expand_grid(fecha=fechas,franja=factor(franjas,levels=franjas)) %>%
mutate(t=as.integer(fecha-min(fecha))+1,
id_franja=as.integer(franja),
fin_semana=lubridate::wday(fecha,week_start=1)>=6,
choque=fecha>=as.Date("2026-02-15") & fecha<=as.Date("2026-02-21"),
demanda_esperada=pmax(4,23+c(-11,5,13,7)[id_franja]+4*fin_semana+
10*choque+2*sin(t/8)+0.07*t),
llegadas=rpois(n(),lambda=demanda_esperada),
ocupacion_pct=round(pmax(57,pmin(108,72+0.32*llegadas+4*choque+
3*(id_franja==3)+rnorm(n(),0,5))),1),
espera_min=round(pmax(8,12+1.12*llegadas+
1.5*pmax(ocupacion_pct-90,0)+rnorm(n(),0,8)),1),
abandono=rbinom(n(),size=llegadas,
prob=plogis(-4.5+0.023*espera_min)),
hospitalizaciones=rbinom(n(),size=llegadas,prob=0.23),
atencion_60_pct=round(100*plogis(3.6-0.046*espera_min),1),
mes=format(fecha,"%Y-%m")) %>%
select(fecha,mes,franja,fin_semana,choque,llegadas,ocupacion_pct,
espera_min,abandono,hospitalizaciones,atencion_60_pct)
stopifnot(nrow(datos)==length(fechas)*4, !anyNA(datos),
all(datos$llegadas>=0),all(datos$abandono<=datos$llegadas),
all(datos$hospitalizaciones<=datos$llegadas))Interpretación para decisión. Una media favorable puede coexistir con momentos críticos de saturación. La gestión debe concentrarse en la variabilidad temporal y en la capacidad de respuesta, no en la cifra promedio aislada. Los resultados muestran características del simulador, no evidencia observada en instituciones colombianas.
| Decisión gerencial | Evidencia necesaria | Condición de aprobación |
|---|---|---|
| Mejorar captura de datos | Definiciones y trazabilidad de sellos de tiempo | Validación por Calidad y Sistemas |
| Reasignar capacidad por franja | Persistencia del pico en datos reales | Piloto temporal sin comprometer seguridad |
| Escalar recursos o infraestructura | Beneficio medido y presupuesto incremental | Evaluación y análisis costo-efectividad local |
La congestión de urgencias se presenta cuando la demanda y la duración del flujo asistencial presionan los recursos disponibles. La organización debe resolver simultáneamente oportunidad, seguridad, experiencia y productividad. La audiencia del informe es: Gerencia General, Dirección Médica, Coordinación de Urgencias, Oficina de Calidad, Talento Humano, Planeación y comité institucional de desempeño.
Pregunta decisoria: ¿en qué períodos se concentra la presión sobre urgencias y qué mejora de proceso conviene probar primero, con criterios explícitos para mantenerla o suspenderla?
| Fase | Pregunta de dirección | Producto verificable |
|---|---|---|
| Atención | ¿Cuál es el problema que requiere decisión? | Alcance, audiencia, riesgos y criterios |
| Análisis | ¿Dónde, cuándo y con qué intensidad ocurre? | Métricas, visualizaciones, pruebas de robustez |
| Acción | ¿Qué podemos cambiar y cómo sabremos si funcionó? | Piloto, responsables, seguimiento y evaluación |
El ejercicio es un análisis descriptivo y asociativo de una serie sintética longitudinal de 90 días (enero-marzo de 2026). La unidad de análisis es el agregado de seis horas, no el paciente. Se generan llegadas, ocupación, espera, abandonos y hospitalizaciones con una semilla fija. Se introduce deliberadamente un episodio de presión entre el 15 y el 21 de febrero para comprobar si los métodos detectan un evento atípico. Las conclusiones no pueden extrapolarse a datos asistenciales reales.
Definiciones operativas:
Estrategia de validación: revisar unidades, duplicados fecha-franja, datos faltantes y coherencia entre conteos y tasas. En un ejercicio institucional posterior se requerirían estratificación por triage y complejidad, datos de dotación y egresos, y control de calidad de marcas temporales.
| Chequeo | Resultado |
|---|---|
| Registros generados | 360 |
| Duplicados fecha-franja | 0 |
| Datos faltantes | 0 |
| Abandonos mayores que llegadas | 0 |
| Días con cuatro franjas | 90 |
p_franjas <- ggplot(franja_resumen,aes(x=franja,y=llegadas,fill=franja)) +
geom_col(width=.7,show.legend=FALSE) +
geom_text(aes(label=scales::comma(llegadas,big.mark=".",decimal.mark=",")),
vjust=-.4,size=3.7) +
scale_fill_manual(values=c("#A7D8DE","#63C5DA","#00A6A6","#0B3C5D")) +
scale_y_continuous(expand=expansion(mult=c(0,.12))) +
labs(title="Volumen acumulado de llegadas por franja",subtitle="Trimestre simulado · conteos sin ajuste por horas (franjas iguales)",
x="Franja de seis horas",y="Llegadas simuladas",caption="Fuente: simulación reproducible") + tema
p_franjasHallazgo contundente. Las llegadas no se distribuyen uniformemente entre franjas. La de mayor volumen es 12:00-17:59, con 3.649 llegadas simuladas. ¿Por qué importa? Un esquema de recursos idéntico en todos los turnos podría no responder a esta asimetría. ¿Qué decisión sugiere? Revisar la correspondencia entre dotación efectiva, llegadas, tiempos de atención y complejidad durante cada franja, antes de asignar personal adicional.
critico <- diario[which.max(diario$espera),]
p_tendencia <- ggplot(diario,aes(fecha,espera)) +
geom_line(color=turquesa,linewidth=.9) +
geom_hline(yintercept=params$umbral_espera,linetype="dashed",color=coral, linewidth=.8) +
annotate("rect",xmin=as.Date("2026-02-15"),xmax=as.Date("2026-02-21"),
ymin=-Inf,ymax=Inf,fill=dorado,alpha=.12) +
geom_point(data=critico,color=coral,size=3.2) +
ggrepel::geom_text_repel(data=critico,aes(label=paste0("Pico: ",round(espera)," min")),
size=3.6,seed=12,max.overlaps=Inf) +
labs(title="Tiempo medio de espera: evolución y episodios de presión",
subtitle="Banda sombreada: evento extraordinario incluido intencionalmente en la simulación",
x="Fecha",y="Espera media ponderada (min)",caption="Línea discontinua: umbral exploratorio, no estándar clínico") + tema
p_tendenciaHallazgo contundente. El máximo de la espera media diaria se observó el 21/02/2026, con 75,6 minutos. La visualización permite identificar episodios y no solamente el valor promedio. ¿Por qué importa? La persistencia de picos puede incrementar la presión de servicio y exige distinguir aumentos estacionales, faltantes operativos o congestión en egresos. ¿Qué decisión sugiere? Desencadenar revisión operacional de turnos y procesos cada vez que se observe una desviación repetida, no a partir de una única observación.
p_relacion <- ggplot(datos,aes(x=ocupacion_pct,y=espera_min,color=franja)) +
geom_point(alpha=.55,size=1.7) +
geom_smooth(method="lm",se=FALSE,linewidth=.7) +
scale_color_manual(values=c("#6C7A89","#00A6A6","#D9A441","#E85D3F")) +
labs(title="Ocupación y espera por franja: patrón de asociación",
subtitle="Los puntos representan franjas, no pacientes; la asociación no demuestra causalidad",
x="Ocupación simulada (%)",y="Espera simulada (min)",color="Franja") + tema
p_relacionHallazgo contundente. La nube de puntos permite evaluar la covariación entre presión y demora. ¿Por qué importa? La ocupación podría ser un indicador de alerta temprana, pero también refleja diferencias de demanda y del mecanismo utilizado para simular las variables. ¿Qué decisión sugiere? En datos reales, construir una alerta operativa complementada con volumen, mezcla de triage, dotación y capacidad de egresos; no usar la regresión presentada como base para asignar responsabilidades.
| Franja | Llegadas | Espera media (min) | Ocupación media (%) | Abandono (%) |
|---|---|---|---|---|
| 00:00-05:59 | 1545 | 34.3 | 78.2 | 2.27 |
| 06:00-11:59 | 2958 | 51.5 | 83.1 | 3.48 |
| 12:00-17:59 | 3649 | 61.9 | 89.2 | 5.02 |
| 18:00-23:59 | 3248 | 53.3 | 84.2 | 3.97 |
Esta tabla ofrece al comité un punto de partida para identificar prioridades, pero debe complementarse con intervalos de incertidumbre, severidad clínica y costo marginal de las acciones. Una tasa elevada no equivale automáticamente a un resultado atribuible a la dotación de personal.
modelo <- lm(espera_min ~ llegadas + ocupacion_pct + franja + fin_semana,
data=datos)
coef <- summary(modelo)$coefficients
r2 <- summary(modelo)$r.squared
knitr::kable(data.frame(Variable=rownames(coef),Estimacion=round(coef[,1],3),
Error_Estandar=round(coef[,2],3),Valor_p=signif(coef[,4],3)),row.names=FALSE,
caption="Modelo lineal explicativo exploratorio")| Variable | Estimacion | Error_Estandar | Valor_p |
|---|---|---|---|
| (Intercept) | -7.173 | 6.105 | 0.24100 |
| llegadas | 1.074 | 0.077 | 0.00000 |
| ocupacion_pct | 0.276 | 0.084 | 0.00105 |
| franja06:00-11:59 | -0.293 | 1.661 | 0.86000 |
| franja12:00-17:59 | -0.383 | 2.060 | 0.85300 |
| franja18:00-23:59 | -2.305 | 1.821 | 0.20600 |
| fin_semanaTRUE | -1.553 | 1.010 | 0.12500 |
El modelo tiene un \(R^2\) observado de 0,705 dentro de los datos sintéticos. No tiene interpretación causal ni validez predictiva externa: los tiempos fueron generados, en parte, a partir de las llegadas y la ocupación, de modo que parte de la asociación fue incorporada al propio diseño de simulación. Su contribución didáctica es demostrar cómo contrastar variables simultáneamente e interpretar magnitudes y limitaciones.
sensibilidad <- data.frame(Umbral=c(85,90,95,100)) %>%
mutate(`Franjas que superan umbral (%)`=vapply(Umbral,
function(u) round(100*mean(datos$ocupacion_pct>u),1),numeric(1)))
knitr::kable(sensibilidad,caption="Variación del porcentaje de alertas según el umbral")| Umbral | Franjas que superan umbral (%) |
|---|---|
| 85 | 39.4 |
| 90 | 17.8 |
| 95 | 5.0 |
| 100 | 0.6 |
Lectura para gerencia: el volumen de alertas depende de la definición del umbral. Un límite demasiado bajo puede generar fatiga de alarmas; uno demasiado alto puede impedir una reacción oportuna. La institución debe aprobar umbrales en conjunto con equipos clínicos y operativos, con base en evidencia y capacidad de respuesta.
escenarios <- data.frame(
Escenario=c("Situación base sintética","Reducción hipotética del 10 %",
"Reducción hipotética del 15 %","Reducción hipotética del 20 %"),
`Espera media esperada (min)`=round(espera_global*c(1,.90,.85,.80),1),
check.names=FALSE)
knitr::kable(escenarios,caption="Escenarios aritméticos: no son pronósticos ni estimaciones de impacto")| Escenario | Espera media esperada (min) |
|---|---|
| Situación base sintética | 53.0 |
| Reducción hipotética del 10 % | 47.7 |
| Reducción hipotética del 15 % | 45.0 |
| Reducción hipotética del 20 % | 42.4 |
Qué permite decidir: el escenario ilustra posibles metas de gestión y abre la conversación sobre costo, viabilidad y efecto operacional. Qué no permite afirmar: no prueba que una redistribución de turnos produzca una reducción de 10 %, 15 % o 20 %; esos porcentajes se introducen como supuestos exógenos. La aprobación de una expansión requiere evidencia real del piloto y presupuesto detallado.
El gráfico siguiente permite que el comité contraste visualmente la curva temporal mediante tooltips, zoom y paneo. Se conserva como instrumento de exploración, no como sustituto del análisis escrito. Para detectar tendencias debe revisarse con cautela la agregación por día, pues reduce la variabilidad de las franjas.
¿Qué evidencia? Cuándo aparecen picos y cuánto duran. ¿Por qué importa? Hace auditable la selección de episodios que merecen explicación. ¿Qué decisión sugiere? Solicitar un análisis de causas que integre admisiones, salidas, demanda y personal disponible para cada episodio detectado.
Primer acto: la demanda crece por momentos, no de
forma uniforme.
Segundo acto: cuando la capacidad
no acompaña ese crecimiento, la espera se dispara.
Tercer
acto: la organización reacciona tarde si solo mira promedios
mensuales.
Desenlace propuesto: gobernar por
franjas críticas, con datos confiables, pilotos controlados y reglas
explícitas de decisión.
Acción: implementar durante seis semanas un ajuste acotado y reversible de distribución de personal, tiempos de clasificación y flujo operativo en la franja de mayor presión que confirmen los datos reales. Antes de intervenir, establecer dos semanas de línea base, verificar cobertura clínica y definir controles de seguridad del paciente.
Responsable: Dirección Médica y Coordinación de Urgencias, con Talento Humano y Calidad.
Indicadores de seguimiento: espera media y percentiles observados, abandono, eventos de seguridad, volumen por triage, pacientes en espera y horas efectivas de dotación. Regla de decisión: mantener o escalar solo si hay una mejora sostenida sin deteriorar indicadores de seguridad ni trasladar congestión a otra franja.
Acción: disponer un conjunto único de definiciones y tablero de seguimiento operativo con revisión semanal, trazabilidad y alertas validadas. Implementar capacitación para captura de datos, documentación del diccionario y verificación de inconsistencias entre fuentes.
Responsable: Planeación, Sistemas de Información y Calidad; valida el Comité de Gestión y Desempeño.
Indicadores: completitud y oportunidad de carga, consistencia de marcas temporales, porcentaje de alertas atendidas, cierre de acciones y evolución de los indicadores asistenciales.
| Horizonte | Entregable | Responsable | Criterio de éxito |
|---|---|---|---|
| Semanas 1-2 | Auditoría de datos y línea base | Sistemas + Calidad | Métricas trazables y validadas |
| Semanas 3-4 | Diseño y despliegue controlado del piloto | Urgencias + Talento Humano | Cobertura clínica y protocolo aprobados |
| Semanas 5-8 | Seguimiento semanal y ajustes | Coordinación de Urgencias | No deterioro de seguridad; tendencias documentadas |
| Semanas 9-10 | Evaluación del piloto y costos | Planeación + Calidad | Informe antes-después, limitaciones y costos |
| Semana 11 | Decisión de continuar, corregir o detener | Gerencia | Acta con decisión sustentada |
| Riesgo | Consecuencia | Mitigación propuesta |
|---|---|---|
| Datos incompletos o definiciones inconsistentes | Falsas alarmas y decisiones equivocadas | Validación previa y auditoría de fuentes |
| Redistribuir personal sin análisis de complejidad | Riesgo asistencial | Aprobar cambios con Dirección Médica y Calidad |
| Confundir correlación con causalidad | Inversión basada en inferencias incorrectas | Piloto y evaluación controlada cuando sea viable |
| Desplazar congestión a otra franja | Mejora aparente, no sistémica | Medir todas las franjas y el recorrido del paciente |
| Sostener una intervención sin presupuesto | Riesgo financiero y operativo | Estimar costo marginal y beneficios verificados |
La principal contribución gerencial del informe no es una cifra aislada, sino una secuencia de decisión trazable: comprender la presión por franja; verificar si los picos son persistentes; explorar sus asociaciones y posibles explicaciones; probar acciones de bajo riesgo; medir sus resultados y decidir posteriormente sobre recursos permanentes.
Se solicita al comité: (i) aprobar la validación de datos y diseño del piloto; (ii) designar responsables y establecer reporte semanal; (iii) exigir que cualquier expansión posterior esté soportada en resultados reales, controles de seguridad y estimación financiera. El ejercicio cumple una función ilustrativa de metodología reproducible y no sustituye el diagnóstico de una institución concreta.
Reproducción: abrir este .Rmd en
RStudio, instalar los paquetes y utilizar Knit para
obtener HTML. El documento fija set.seed(params$semilla);
los umbrales son configurables en params del YAML. Para
reproducir el anexo de flexdashboard, abrir el archivo
complementario incluido en el paquete y compilarlo también.
Limitaciones relevantes: las variables son sintéticas, no se dispone de datos individuales ni de acuidad del triage, no hay dimensión económica real, no se identifican efectos causales, el evento excepcional fue definido artificialmente y los umbrales son meramente ilustrativos. Por tanto, las prioridades simuladas no justifican por sí mismas decisiones clínicas, contractuales o presupuestales reales.
Paquetes y funciones clave: ggplot2 usa
geometrías geom_col(), geom_line() y
geom_point(); estilos theme_minimal() y
paletas scale_fill_brewer(); el pico se destaca con
annotate() y ggrepel::geom_text_repel().
plotly::ggplotly() habilita exploración. Los agregados se
construyen en dplyr con promedios ponderados
calculados antes de sumar el denominador, para evitar el error
de longitud detectado previamente.
Referencias metodológicas para ampliación: documentación oficial de ggplot2 (https://ggplot2.tidyverse.org/), plotly para ggplot2 (https://plotly.com/ggplot2/) y flexdashboard (https://rstudio.github.io/flexdashboard/).
## **R y entorno de ejecución:** R version 4.6.1 (2026-06-24 ucrt). **Semilla:** 20261023. **Fecha de compilación:** 2026-10-23.