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.
# ÚNICA FUENTE DE DATOS PARA AMBOS DOCUMENTOS.
# Simulación demostrativa (NO registros hospitalarios reales).
set.seed(20261023)
# 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))Magnitud del escenario: 11.400 llegadas en 360 franjas; 53,0 minutos de espera media ponderada; 84,7 % de ocupación media ponderada; 3,95 % de abandono acumulado; 17,8 % de franjas con ocupación superior a 90 %.
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 |
El propósito no es producir más gráficos: es identificar cuándo actuar, qué intervención probar y cómo medir si realmente funcionó.
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 |
El ejemplo de referencia comienza por una exploración de datos (EDA). Aquí conservamos esa lógica, pero la aplicamos a cuatro franjas por día durante 90 días. El dataset se genera de manera reproducible en la sección anterior; por tanto, no requiere archivos de Excel externos. Primero se audita su tamaño, tipos, rangos y consistencia, antes de formular juicios sobre desempeño.
audit <- data.frame(
Indicador=c("Observaciones", "Variables", "Duplicados fecha-franja", "Celdas faltantes", "Registros con espera negativa", "Abandonos superiores a llegadas"),
Valor=c(nrow(datos),ncol(datos),sum(duplicated(datos[c("fecha","franja")])),sum(is.na(datos)),sum(datos$espera_min<0),sum(datos$abandono>datos$llegadas))
)
knitr::kable(audit,caption="Calidad y trazabilidad de la información sintética")| Indicador | Valor |
|---|---|
| Observaciones | 360 |
| Variables | 11 |
| Duplicados fecha-franja | 0 |
| Celdas faltantes | 0 |
| Registros con espera negativa | 0 |
| Abandonos superiores a llegadas | 0 |
Interpretación. La auditoría establece si los resultados posteriores están respaldados por datos completos y coherentes. Decisión: para su aplicación real, Calidad y Sistemas deben aprobar un diccionario de variables y un procedimiento de conciliación entre triage, admisiones y egresos.
estadisticos <- data.frame(
Variable=c("Llegadas por franja","Espera por franja (min)","Ocupación (%)"),
Media=c(mean(datos$llegadas),mean(datos$espera_min),mean(datos$ocupacion_pct)),
Mediana=c(median(datos$llegadas),median(datos$espera_min),median(datos$ocupacion_pct)),
P90=c(unname(quantile(datos$llegadas,.90)),unname(quantile(datos$espera_min,.90)),unname(quantile(datos$ocupacion_pct,.90))),
Maximo=c(max(datos$llegadas),max(datos$espera_min),max(datos$ocupacion_pct))
)
knitr::kable(transform(estadisticos, Media=round(Media,1), Mediana=round(Mediana,1), P90=round(P90,1), Maximo=round(Maximo,1)),caption="Medidas de tendencia central y cola de la distribución")| Variable | Media | Mediana | P90 | Maximo |
|---|---|---|---|---|
| Llegadas por franja | 31.7 | 33.0 | 44.0 | 59.0 |
| Espera por franja (min) | 48.6 | 48.7 | 67.5 | 100.5 |
| Ocupación (%) | 83.1 | 82.6 | 92.6 | 103.0 |
ggplot(datos,aes(x=franja,y=espera_min,fill=franja)) +
geom_boxplot(alpha=.85,outlier.color=rojo,show.legend=FALSE) +
scale_fill_brewer(palette="Set2") +
labs(title="Los promedios ocultan jornadas con demoras extremas",subtitle="Distribución de la espera por franja: mediana, dispersión y episodios atípicos",x="Franja horaria",y="Espera (minutos)") + temaEvidencia: la distancia entre la mediana, el percentil 90 y el máximo caracteriza la exposición a episodios extremos. Relevancia: los usuarios no viven un promedio trimestral, sino una espera concreta. Acción: hacer seguimiento a mediana y percentil 90 junto al promedio; estudiar por separado observaciones atípicas mediante revisión operativa, no eliminarlas sin justificación.
q <- quantile(datos$espera_min,c(.25,.75)); li <- q[1]-1.5*IQR(datos$espera_min); ls <- q[2]+1.5*IQR(datos$espera_min)
atipicos <- datos %>% filter(espera_min<li | espera_min>ls)
knitr::kable(data.frame(Metodo="Rango intercuartílico (1,5 × IQR)",Umbral_superior=round(ls,1),Eventos_detectados=nrow(atipicos)),caption="Tamizaje de valores extremos")| Metodo | Umbral_superior | Eventos_detectados | |
|---|---|---|---|
| 75% | Rango intercuartílico (1,5 × IQR) | 90.8 | 2 |
Los atípicos no se excluyen del análisis: podrían reflejar congestión relevante. En instituciones reales debe diferenciarse entre error de captura y evento clínicamente significativo.
El material de referencia introduce distribuciones de Poisson, binomial y normal. En este caso, la distribución de Poisson es una herramienta didáctica para conteos de llegadas por franja; la binomial ilustra abandonos entre personas que llegan. Ningún modelo constituye por sí mismo validación empírica de estas distribuciones en un hospital real.
lambda <- mean(datos$llegadas)
k <- 0:max(datos$llegadas)
prob <- dpois(k,lambda)
ggplot(data.frame(llegadas=k,probabilidad=prob),aes(llegadas,probabilidad)) +
geom_col(fill=verde,width=.85) +
labs(title="Distribución de Poisson: escenario de referencia para llegadas",subtitle=paste0("Parámetro estimado con media global sintética: λ = ",round(lambda,1)),x="Llegadas por franja",y="Probabilidad teórica") + temaLa llegada de pacientes presenta diferencias por franja, por lo que una Poisson homogénea es deliberadamente simplificada. Un modelo que ignore estas diferencias puede subestimar la variación y los picos.
probabilidades <- data.frame(
Indicador=c("Probabilidad de ocupación > 90 %","Probabilidad de espera > 60 min","Probabilidad conjunta de ambas alertas"),
Probabilidad=c(mean(datos$ocupacion_pct>90),mean(datos$espera_min>60),mean(datos$ocupacion_pct>90 & datos$espera_min>60))
)
probabilidades$Porcentaje <- round(100*probabilidades$Probabilidad,1)
knitr::kable(probabilidades[c("Indicador","Porcentaje")],caption="Frecuencia relativa en el escenario sintético")| Indicador | Porcentaje |
|---|---|
| Probabilidad de ocupación > 90 % | 17.8 |
| Probabilidad de espera > 60 min | 23.3 |
| Probabilidad conjunta de ambas alertas | 11.9 |
Implicación gerencial: la probabilidad empírica de alerta mide frecuencia, no severidad del daño. Una institución deberá priorizar alertas según riesgos clínicos, capacidad de respuesta y consecuencias de fallar.
Como las observaciones por franja pueden estar asociadas dentro de cada día, se remuestrean días completos para preservar la dependencia intradía. El intervalo describe la incertidumbre de remuestreo dentro de este simulador, no la de una población hospitalaria colombiana.
set.seed(params$semilla + 2)
ids <- split(seq_len(nrow(datos)),datos$fecha)
B <- 600
boot <- replicate(B,{
elegidos <- sample(seq_along(ids),length(ids),replace=TRUE)
ind <- unlist(ids[elegidos],use.names=FALSE)
weighted.mean(datos$espera_min[ind],datos$llegadas[ind])
})
ic <- unname(quantile(boot,c(.025,.975)))
knitr::kable(data.frame(Estimacion=round(espera_global,2),LI_95=round(ic[1],2),LS_95=round(ic[2],2)),caption="Intervalo percentil bootstrap, remuestreo por día")| Estimacion | LI_95 | LS_95 |
|---|---|---|
| 52.99 | 51.57 | 54.58 |
ajuste_aov <- aov(espera_min ~ franja,data=datos)
tabla_aov <- as.data.frame(summary(ajuste_aov)[[1]])
knitr::kable(data.frame(Fuente=rownames(tabla_aov),round(tabla_aov,4)),caption="ANOVA exploratorio entre franjas")| Fuente | Df | Sum.Sq | Mean.Sq | F.value | Pr..F. | |
|---|---|---|---|---|---|---|
| franja | franja | 3 | 37027.16 | 12342.3869 | 95.5669 | 0 |
| Residuals | Residuals | 356 | 45977.11 | 129.1492 | NA | NA |
La prueba ANOVA permite ilustrar diferencias entre grupos; sin embargo, los supuestos de independencia y homocedasticidad pueden ser cuestionables para franjas de un mismo día. Por ello no debe tratarse el valor p como prueba suficiente de una prioridad gerencial, ni como inferencia sobre IPS reales. Para evaluación formal deben considerarse modelos con dependencia temporal y análisis de resultados ajustados por triage.
¿Hasta qué punto las llegadas, la ocupación y la franja ayudan a predecir la espera de una franja posterior? Se utiliza regresión lineal como línea base, entendiendo que, en el simulador, algunas variables están vinculadas por diseño.
En vez de dividir aleatoriamente, se entrenará con los primeros días y se reservarán los últimos para evaluar el modelo, reduciendo la filtración temporal.
corte <- sort(unique(datos$fecha))[63]
train <- datos %>% filter(fecha<=corte)
test <- datos %>% filter(fecha>corte)
modelo_predictivo <- lm(espera_min ~ llegadas + ocupacion_pct + franja + fin_semana,data=train)
test$prediccion <- predict(modelo_predictivo,newdata=test)
mae <- mean(abs(test$espera_min-test$prediccion))
rmse <- sqrt(mean((test$espera_min-test$prediccion)^2))
knitr::kable(data.frame(Metrica=c("Días entrenamiento","Días prueba","MAE (min)","RMSE (min)"),Valor=c(length(unique(train$fecha)),length(unique(test$fecha)),round(mae,2),round(rmse,2))),caption="Evaluación temporal fuera de muestra")| Metrica | Valor |
|---|---|
| Días entrenamiento | 63.00 |
| Días prueba | 27.00 |
| MAE (min) | 7.43 |
| RMSE (min) | 9.20 |
ggplot(test,aes(x=espera_min,y=prediccion,color=franja)) +
geom_point(alpha=.7,size=2) +
geom_abline(slope=1,intercept=0,linetype="dashed",color=rojo) +
scale_color_brewer(palette="Dark2") +
labs(title="Qué tan cerca están las predicciones de las esperas observadas",subtitle="La diagonal marca predicción perfecta; datos simulados de la ventana de prueba",x="Espera simulada (min)",y="Espera pronosticada (min)") + temaInterpretación: MAE y RMSE expresan el error en minutos. La diferencia entre ellos informa el peso de errores grandes. Este ejercicio sirve para mostrar evaluación fuera de muestra, no para justificar implementación clínica ni afirmar capacidad predictiva externa. Antes de operar en producción se requerirían datos reales, validación temporal repetida, variables de triage y pruebas de seguridad.
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_brewer(palette="YlGnBu") +
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_franjas¿Qué evidencia? 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=azul,linewidth=.65) +
geom_hline(yintercept=params$umbral_espera,linetype="dashed",color=rojo) +
annotate("rect",xmin=as.Date("2026-02-15"),xmax=as.Date("2026-02-21"),
ymin=-Inf,ymax=Inf,fill=rojo,alpha=.07) +
geom_point(data=critico,color=rojo,size=3) +
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_tendencia¿Qué evidencia? 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_brewer(palette="Set2") +
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_relacion¿Qué evidencia? 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.
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. Ambos
documentos utilizan datos_compartidos.R para garantizar
cifras idénticas.
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-24.