Nota de integridad científica. Este es un ejercicio académico elaborado con datos sintéticos, generados íntegramente en R. No representa a un hospital real, no corresponde a una base del Ministerio de Salud ni permite inferir resultados de pacientes reales. Los umbrales de trabajo son supuestos gerenciales pedagógicos, no estándares clínicos obligatorios. El análisis es descriptivo, asociativo y de escenarios; no identifica efectos causales.
Este informe plantea un problema de decisión: ¿cómo priorizar intervenciones para contener la congestión de urgencias, cuando la demanda, la ocupación y los tiempos de espera aumentan de forma simultánea? El valor del estudio no reside únicamente en presentar indicadores, sino en reconstruir una cadena de inferencia verificable que vincula problema, datos, métricas, hipótesis, pruebas y acciones.
El trabajo se organiza siguiendo A³
(Atención–Análisis–Acción), combina el ciclo
pregunta–dato–indicador–evidencia–decisión, describe la
unidad de observación y la calidad de información, explora
heterogeneidad temporal, incorpora asociaciones estadísticas, verifica
sensibilidad a umbrales y contrasta un escenario ilustrativo de
reducción de demoras. La salida complementaria en
flexdashboard permite exploración de la evidencia con
indicadores y gráficos interactivos.
# 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))Hallazgos descriptivos del experimento: a partir de 11.400 llegadas simuladas distribuidas en 360 franjas de seis horas, el tiempo medio de espera ponderado fue 53,0 minutos y la ocupación media ponderada fue 84,7 %. La tasa acumulada simulada de abandono fue 3,95 %. El máximo promedio diario de espera ocurrió el 21/02/2026, con 75,6 minutos. Las cifras constituyen resultados del experimento computacional, no estimaciones de la situación real del sector salud.
Lectura directiva: los promedios generales no muestran, por sí solos, dónde actuar. Para asignar recursos deben complementarse con el análisis por franja, la intensidad de los picos y la duración de los periodos críticos. La recomendación preliminar es implementar primero medición operacional confiable y luego realizar una prueba piloto de redistribución de capacidad con evaluación antes–después y grupo comparable, si es viable.
La congestión en urgencias puede entenderse como un desajuste dinámico entre flujo de llegadas, capacidad de clasificación y valoración, disponibilidad de espacios y tiempos de salida de pacientes. Una política basada en la media del trimestre puede ocultar saturaciones puntuales: una operación que parece adecuada en promedio puede fallar sistemáticamente en ciertas franjas. El costo gerencial potencial incluye reprogramaciones, insatisfacción, deserción y presión laboral; tales impactos no se cuantifican aquí porque no se dispone de variables clínicas ni financieras.
Pregunta central: ¿cuáles franjas y episodios concentran mayor riesgo operativo y qué intervención proporcional, medible y reversible debería priorizar la gerencia de una IPS de alta complejidad?
Unidad de decisión: programación operativa semanal de personal y coordinación de flujos; el ejercicio no recomienda modificar triage clínico o priorización médica sin evaluación especializada.
| Perfil destinatario | Pregunta que debe resolver | Evidencia que necesita | Decisión plausible |
|---|---|---|---|
| Gerencia general | ¿Dónde priorizar inversión de gestión? | Magnitud, recurrencia, incertidumbre | Autorizar piloto delimitado |
| Dirección médica / urgencias | ¿Cuándo se deteriora la oportunidad? | Picos por día/franja y cargas | Revisar secuencia de atención |
| Calidad y seguridad del paciente | ¿Qué riesgos requieren seguimiento? | Umbrales, abandono, consistencia | Diseñar alertas con validación clínica |
| Talento humano y operaciones | ¿La asignación acompaña la demanda? | Curva horaria y variabilidad | Probar redistribución de turnos |
| Analítica y planeación | ¿Cuánto es tendencia y cuánto ruido? | Diccionario, trazabilidad, incertidumbre | Institucionalizar monitoreo |
Atención: delimitar el problema, los grupos afectados y la decisión específica; evitar gráficos sin pregunta. Análisis: elegir unidades de observación, construir medidas, desagregar patrones, evaluar supuestos e incertidumbre. Acción: traducir resultados a decisiones verificables, asignando responsables, indicadores, horizonte y criterios de suspensión.
Se plantea un mecanismo hipotético: mayor variabilidad de llegadas, sumada a rigidez en la distribución de capacidad, se asocia con mayor ocupación y espera; las demoras pueden estar asociadas con más abandono. Si se adapta la capacidad operativa a los patrones documentados y se monitorean resultados, podrían reducirse las demoras. Es una hipótesis de intervención, no un efecto demostrado por estos datos.
Objetivo general: construir evidencia cuantitativa reproducible que apoye la priorización de intervenciones de gestión de urgencias.
Objetivos específicos: caracterizar demanda por tiempo y franja; detectar variaciones y valores extremos; estimar la asociación entre demanda y espera; explorar sensibilidad ante distintos umbrales; y proponer un protocolo de evaluación de la intervención.
Estudio observacional simulado, de corte longitudinal descriptivo, con 90 días y cuatro franjas por día. No existe muestreo de pacientes: cada registro es un agregado por franja. Las pruebas y sus intervalos reflejan únicamente la variabilidad generada por el mecanismo sintético y no son generalizables a ninguna IPS. No se usa identificación personal.
El conjunto sintético incluye un incremento extraordinario programado para el 15–21 de febrero con fines pedagógicos. Conocer este mecanismo de generación facilita verificar si la técnica gráfica y la lectura analítica identifican el fenómeno esperado; en datos reales el origen de un pico requeriría verificación documental.
| Variable | Escala y unidad | Regla de cálculo | Riesgo interpretativo |
|---|---|---|---|
| Fecha y franja | día, bloque de 6 h | Identificación temporal | No es hora individual de cada ingreso |
| Llegadas | conteo/franja | Simulación Poisson | No equivale a severidad clínica |
| Ocupación | porcentaje/franja | Índice simulado | Puede exceder 100 %; capacidad tensionada |
| Espera | minutos/franja | Media sintética | No es mediana ni percentil individual |
| Abandono | pacientes/franja | Conteo simulado | No mide causalidad del retiro |
| Atención 60 min | porcentaje/franja | Probabilidad modelada | No acredita oportunidad clínica observada |
| Choque | indicador binario | Fechas definidas antes del análisis | Es un evento diseñado en los datos |
Denominadores: las tasas agregadas de abandono se calculan como la suma de abandonos dividida entre la suma de llegadas, multiplicada por 100. Los promedios globales de espera y ocupación se ponderan por llegadas; por tanto representan el promedio por volumen atendido en cada franja, no una medición continua ni a nivel individual. Un registro con cero llegadas, si ocurriera, requeriría una regla explícita de agregación.
control <- data.frame(
Prueba=c("Registros", "Duplicados fecha-franja", "Celdas vacías", "Llegadas negativas",
"Abandonos mayores que llegadas", "Días completos (4 franjas)"),
Resultado=c(nrow(datos), sum(duplicated(datos[c("fecha","franja")])),
sum(is.na(datos)),sum(datos$llegadas<0),
sum(datos$abandono>datos$llegadas),
sum(as.integer(table(datos$fecha))==4)),
Criterio=c("360 para 90 días", "0", "0", "0", "0", "90"))
knitr::kable(control,caption="Controles básicos de integridad y cobertura")| Prueba | Resultado | Criterio |
|---|---|---|
| Registros | 360 | 360 para 90 días |
| Duplicados fecha-franja | 0 | 0 |
| Celdas vacías | 0 | 0 |
| Llegadas negativas | 0 | 0 |
| Abandonos mayores que llegadas | 0 | 0 |
| Días completos (4 franjas) | 90 | 90 |
Se recomienda, para una futura base institucional, incorporar auditoría de: sellos temporales, duplicidad de episodios, definición única de llegada y valoración, consistencia entre egresos/ingresos y reglas de anonimización. Un dato técnicamente válido puede seguir siendo clínicamente inapropiado para evaluar desempeño si la métrica carece de ajuste por complejidad o triage.
Cada visualización cumple una función. geom_line()
muestra trayectorias temporales; geom_col() compara valores
agregados por franja; geom_boxplot() documenta dispersión y
asimetría; geom_point() examina asociaciones;
annotate() enfatiza episodios críticos;
ggrepel::geom_text_repel() evita solapamientos de
etiquetas. theme_minimal() y
scale_fill_brewer() reducen interferencias y facilitan
lectura estratégica.
El análisis distingue volumen, nivel y frecuencia: no confundir la tasa de abandono con el número de abandonos ni la ocupación promedio con el porcentaje de franjas que superan cierto umbral.
max_llegadas <- diario %>% slice_max(llegadas,n=1,with_ties=FALSE)
p_demanda <- ggplot(diario,aes(fecha,llegadas))+
annotate("rect",xmin=as.Date("2026-02-15"),xmax=as.Date("2026-02-21"),
ymin=-Inf,ymax=Inf,fill="#F9D8C9",alpha=.35)+
geom_line(color=col_azul,linewidth=.65)+
geom_smooth(method="loess",se=FALSE,color=col_rojo,linewidth=.9)+
geom_point(data=max_llegadas,color=col_rojo,size=2.4)+
ggrepel::geom_text_repel(data=max_llegadas,
aes(label=paste("Máximo:",llegadas,"llegadas")),size=3.3,max.overlaps=8)+
annotate("text",x=as.Date("2026-02-18"),y=Inf,label="Evento simulado",vjust=1.5,size=3.3)+
labs(title="Demanda diaria: nivel, variación y episodio atípico",
subtitle="Banda sombreada: evento de alta presión incorporado en la simulación",
x=NULL,y="Llegadas por día")+tema
p_demandaFigura 1. Llegadas diarias simuladas y máximo observado
¿Qué evidencia? El máximo diario alcanzó 177 llegadas el 16/02/2026; la curva evidencia variaciones diarias y un periodo de tensión definido deliberadamente. ¿Por qué importa? La dotación fija puede ser menos efectiva ante variabilidad sistemática; un máximo aislado no justifica de inmediato expansión permanente. ¿Qué acción sugiere? Verificar recurrencia con históricos reales y dimensionar un esquema flexible para periodos de mayor presión.
p_franja <- datos %>% group_by(franja) %>% summarise(media=mean(llegadas),.groups="drop") %>%
ggplot(aes(franja,media,fill=franja))+
geom_col(width=.65,show.legend=FALSE)+
geom_text(aes(label=fmt(media)),vjust=-.3,size=3.7)+
scale_fill_brewer(palette="Blues")+
scale_y_continuous(expand=expansion(mult=c(0,.15)))+
labs(title="La demanda no se distribuye uniformemente durante el día",
x=NULL,y="Llegadas promedio por franja de 6 horas")+tema
p_franjaFigura 2. Comparación de demanda media por franja de atención
¿Qué evidencia? La franja de mayor volumen medio es 12:00-17:59, considerando llegadas acumuladas en franjas de igual duración. ¿Por qué importa? La distribución promedio puede revelar oportunidades de programar recursos de manera asimétrica. ¿Qué acción sugiere? Contrastar esta curva con nómina efectiva, tiempos de entrega de turno y mix de triage, antes de rediseñar jornadas.
p_box <- ggplot(datos,aes(franja,espera_min,fill=franja))+
geom_boxplot(alpha=.8,show.legend=FALSE,outlier.colour=col_rojo)+
scale_fill_brewer(palette="Set2")+
geom_hline(yintercept=params$umbral_espera,linetype="dashed",color=col_rojo)+
annotate("text",x=1.5,y=params$umbral_espera+4,label="Referencia analítica: 60 min",
color=col_rojo,size=3.2)+
labs(title="Variabilidad de la espera entre franjas",
subtitle="Cada punto subyacente es un promedio por franja, no un paciente",
x=NULL,y="Espera media por franja (min)")+tema
p_boxFigura 3. Variabilidad de la espera promedio por franja
¿Qué evidencia? Hay dispersión interfranja y dentro de cada franja; la mediana y los valores extremos son diferentes de un promedio trimestral único. ¿Por qué importa? Medidas que reducen la media podrían dejar intactas las esperas más altas. ¿Qué acción sugiere? Complementar un sistema real con percentiles individuales P50, P90 y P95, que no pueden estimarse legítimamente con estos datos agregados.
p_ocup <- ggplot(diario,aes(fecha,ocupacion))+
geom_line(color=col_azul,linewidth=.8)+
geom_hline(yintercept=params$umbral_ocupacion,linetype="dashed",color=col_rojo)+
annotate("label",x=as.Date("2026-01-20"),y=params$umbral_ocupacion+3,
label="Umbral analítico 90 %",color=col_rojo,size=3)+
labs(title="Ocupación observada en la simulación",
subtitle="El umbral es gerencial e ilustrativo; requiere validación institucional",
x=NULL,y="Ocupación ponderada (%)")+tema
p_ocupFigura 4. Serie de ocupación media diaria ponderada
¿Qué evidencia? 17,8 % de las franjas supera el umbral exploratorio de 90 %. ¿Por qué importa? La frecuencia de episodios sobre umbral captura persistencia de presión y complementa el promedio ponderado. ¿Qué acción sugiere? Acordar con urgencias y calidad umbrales por tipología de servicio, definir responsables de alertas y auditar la capacidad disponible.
modelo <- lm(espera_min ~ llegadas, data=datos)
coef_pend <- unname(coef(modelo)["llegadas"])
r2 <- summary(modelo)$r.squared
p_disp <- ggplot(datos,aes(llegadas,espera_min))+
geom_point(aes(color=franja),alpha=.5,size=1.8)+
geom_smooth(method="lm",se=TRUE,color=col_rojo,fill="#E8C6C0")+
scale_color_brewer(palette="Dark2")+
labs(title="Mayor demanda se asocia con mayor espera en los datos generados",
subtitle="Regresión lineal descriptiva; no constituye identificación causal",
x="Llegadas por franja",y="Espera media por franja (min)",color="Franja")+tema
p_dispFigura 5. Asociación bivariada entre demanda y espera
knitr::kable(data.frame(Indicador=c("Pendiente (min por llegada adicional)","R² descriptivo",
"Observaciones (franjas)"),Valor=c(fmt(coef_pend,2),fmt(r2,3),nrow(datos))),
caption="Resumen del modelo lineal exploratorio")| Indicador | Valor |
|---|---|
| Pendiente (min por llegada adicional) | 1,15 |
| R² descriptivo | 0,688 |
| Observaciones (franjas) | 360 |
¿Qué evidencia? Una llegada adicional por franja se asocia, dentro del modelo bivariado sintético, con 1,15 minutos adicionales de espera media; 68,8 % de la variación se ajusta linealmente a la demanda. ¿Por qué importa? Permite reconocer covariación operacional, pero ocupación, franja y el propio mecanismo simulado también intervienen. ¿Qué acción sugiere? Nunca interpretar la pendiente como el beneficio causal de evitar una llegada; contrastar el patrón con modelos ajustados y, preferiblemente, con un piloto evaluado.
modelo_ajustado <- lm(espera_min ~ llegadas + ocupacion_pct + franja + fin_semana,
data=datos)
tabla_modelos <- data.frame(
Modelo=c("Bivariado","Ajustado por ocupación, franja y fin de semana"),
Pendiente_llegadas=c(coef(modelo)["llegadas"],coef(modelo_ajustado)["llegadas"]),
R2=c(summary(modelo)$r.squared,summary(modelo_ajustado)$r.squared))
knitr::kable(tabla_modelos,digits=3,caption="Análisis de especificaciones alternativas")| Modelo | Pendiente_llegadas | R2 |
|---|---|---|
| Bivariado | 1.148 | 0.688 |
| Ajustado por ocupación, franja y fin de semana | 1.074 | 0.705 |
El modelo ajustado introduce controles observados; no resuelve confusión no medida, dependencia temporal ni simultaneidad. La comparación de coeficientes no representa evaluación de impacto. El diseño de los datos incluye intencionalmente una relación entre carga, ocupación y espera; la detección de esa relación valida el procedimiento computacional, no una teoría clínica.
¿Qué evidencia? Al pasar el cursor se consultan días
y volúmenes puntuales, y el zoom permite examinar variaciones en
ventanas cortas sin cambiar la escala del análisis de origen.
¿Por qué importa? Una dirección puede corroborar fechas
anómalas antes de asignar explicaciones. ¿Qué acción
sugiere? Asociar eventos destacados a bitácoras administrativas
y de operación, sin atribuir causas por inspección visual aislada. La
conversión con plotly::ggplotly() conserva el gráfico base
de ggplot2 y facilita exploración autónoma.
umbrales <- c(85,90,95,100)
sensibilidad <- data.frame(
Umbral_porcentaje=umbrales,
Franjas_superan= vapply(umbrales,function(u)sum(datos$ocupacion_pct>u),numeric(1)),
Porcentaje_de_franjas=vapply(umbrales,function(u)100*mean(datos$ocupacion_pct>u),numeric(1)))
knitr::kable(sensibilidad,digits=1,caption="Cambios en clasificación de presión según umbral")| Umbral_porcentaje | Franjas_superan | Porcentaje_de_franjas |
|---|---|---|
| 85 | 142 | 39.4 |
| 90 | 64 | 17.8 |
| 95 | 18 | 5.0 |
| 100 | 2 | 0.6 |
Interpretación: variar la referencia entre 85 % y 100 % modifica cuántos episodios se clasificarían como críticos. Los umbrales son supuestos para probar robustez de la decisión, no estándares normativos ni límites clínicos. Para el uso institucional debería documentarse quién define el límite, con qué evidencia y qué respuesta se activa al superarlo.
# Bootstrap descriptivo de días completos (conserva las cuatro franjas de cada día).
set.seed(params$semilla+5)
B <- 1000
medias_boot <- replicate(B,{
d <- diario[sample.int(nrow(diario),replace=TRUE),]
weighted.mean(d$espera,d$llegadas)
})
ic_boot <- quantile(medias_boot,c(.025,.975))
knitr::kable(data.frame(Estadistico=c("Media ponderada","Percentil 2,5 %","Percentil 97,5 %"),
Minutos=round(c(espera_global,ic_boot),2)),caption="Intervalo bootstrap ilustrativo")| Estadistico | Minutos | |
|---|---|---|
| Media ponderada | 52.99 | |
| 2.5% | Percentil 2,5 % | 51.48 |
| 97.5% | Percentil 97,5 % | 54.59 |
El intervalo de 51,5 a 54,6 minutos expresa variabilidad al remuestrear días de la población sintética simulada. No equivale a un intervalo de confianza válido para una institución real. Tampoco corrige correlación serial compleja: para datos longitudinales institucionales se estudiaría un bootstrap por bloques o modelos de serie de tiempo.
tabla_evento <- datos %>% group_by(choque) %>% summarise(
Franjas=n(), Llegadas_medias=mean(llegadas),
Espera_media=weighted.mean(espera_min,llegadas),
Ocupacion_media=weighted.mean(ocupacion_pct,llegadas),.groups="drop") %>%
mutate(Periodo=ifelse(choque,"Evento sintético","Resto del periodo")) %>%
select(Periodo,everything(),-choque)
knitr::kable(tabla_evento,digits=1,caption="Contraste contextual no experimental")| Periodo | Franjas | Llegadas_medias | Espera_media | Ocupacion_media |
|---|---|---|---|---|
| Resto del periodo | 332 | 30.9 | 51.5 | 84.0 |
| Evento sintético | 28 | 40.6 | 66.5 | 91.5 |
¿Qué evidencia? El evento diseñado exhibe un cambio simultáneo en carga y presión. ¿Por qué importa? Ayuda a distinguir condiciones habituales de episodios que ameritarían planes de contingencia. ¿Qué acción sugiere? Construir un registro fechado de contingencias reales (brotes, cierres de servicios, incapacidades, fallos de sistemas) y verificar si coinciden temporalmente con las alertas. La comparación de grupos no estima un efecto causal.
indicadores <- data.frame(
KPI=c("Llegadas acumuladas","Espera media ponderada (min)",
"Ocupación media ponderada (%)","Tasa de abandono (%)",
"Franjas > umbral de ocupación (%)"),
Valor=c(fmt(n_ingresos,0),fmt(espera_global),fmt(ocup_global),
fmt(tasa_aband_global,2),fmt(frac_ocupacion_alta)))
knitr::kable(indicadores,caption="Indicadores operativos para la decisión")| KPI | Valor |
|---|---|
| Llegadas acumuladas | 11.400 |
| Espera media ponderada (min) | 53,0 |
| Ocupación media ponderada (%) | 84,7 |
| Tasa de abandono (%) | 3,95 |
| Franjas > umbral de ocupación (%) | 17,8 |
En el archivo anexo Anexo_Dashboard_Flexdashboard.Rmd se
encuentran flexdashboard::valueBox() y
flexdashboard::gauge() con visualizaciones responsivas, que
cumplen el requerimiento tecnológico. Aquí los indicadores quedan
contextualizados por preguntas, definiciones y restricciones de uso.
Supuesto explícito: una intervención hipotética reduce en 15 % el componente de espera en franjas cuya ocupación supera 90 %, sin cambiar volumen ni severidad. Es una sensibilidad aritmética, no una predicción validada.
escenario <- datos %>% mutate(
espera_escenario=ifelse(ocupacion_pct>params$umbral_ocupacion,
espera_min*(1-params$efecto_escenario),espera_min))
actual <- weighted.mean(escenario$espera_min,escenario$llegadas)
hipotetico <- weighted.mean(escenario$espera_escenario,escenario$llegadas)
resultado <- data.frame(
Escenario=c("Línea base simulada","Escenario supuesto de mejora"),
Espera_media_min=c(actual,hipotetico))
knitr::kable(resultado,digits=2,caption="Efecto aritmético de un supuesto de mejora focalizada")| Escenario | Espera_media_min |
|---|---|
| Línea base simulada | 52.99 |
| Escenario supuesto de mejora | 50.64 |
Bajo el supuesto, la diferencia es de 2,35 minutos en la media ponderada, equivalente a 4,43 %. Esto no significa que implementar una estrategia real vaya a lograr tal beneficio. Para estimarlo habría que especificar recursos adicionales, mecanismo, riesgos de desplazamiento, seguridad clínica y un diseño de evaluación adecuado.
| Criterio | Pregunta operativa | Evidencia mínima requerida | Riesgo si se omite |
|---|---|---|---|
| Magnitud | ¿Cuántas llegadas y cuánto tiempo se concentra? | Volumen y espera por franja | Atender solo casos visualmente llamativos |
| Persistencia | ¿Cuántos días se repite el problema? | Frecuencia y duración de alertas | Sobrerreaccionar a un solo pico |
| Seguridad | ¿Se compromete un proceso clínico crítico? | Triage, eventos adversos, revisión médica | Optimizar tiempos a costa de calidad |
| Factibilidad | ¿Hay recursos y coordinación disponibles? | Turnos, costos, camas, acuerdos | Recomendar medidas no implementables |
| Evaluabilidad | ¿Se puede medir su resultado? | Línea base y comparación válida | No distinguir mejora de variación natural |
Decisión: autorizar un piloto de ocho semanas de redistribución operativa en las franjas con mayor presión solo después de confirmar los patrones en registros institucionales y revisar seguridad clínica. No se propone ampliar indiscriminadamente la planta.
Responsables: Dirección de Urgencias (líder), Operaciones, Talento Humano y Calidad (validación). Ruta: dos semanas de línea base; una semana de diseño de turnos y verificación jurídica/laboral; cuatro semanas de piloto; una semana de análisis y decisión. Indicadores: mediana y P90 de espera a nivel paciente, porcentaje de valoración oportuna según triage y definición clínica, abandonos por 100 llegadas, incidentes de seguridad y horas-persona adicionales. Criterio de escalamiento: mejora sostenida sin deterioro de seguridad, costos ni equidad por nivel de triage. Criterio de suspensión: incremento relevante de incidentes o deterioro de oportunidad de casos prioritarios.
Decisión: institucionalizar un protocolo de captura, validación y revisión semanal de flujos operativos, con alertas escalonadas y responsables definidos.
Responsables: Planeación/Analítica (diseño de datos), Sistemas (integración), Calidad (validación de indicadores) y Urgencias (respuesta). Horizonte: 30 días para diccionario de datos y reglas, 30 días adicionales para tablero y pruebas de consistencia, 30 días para evaluación y ajustes. Indicadores: integridad de campos obligatorios, latencia de actualización, duplicidad de episodios, porcentaje de alertas atendidas y tiempo de respuesta a anomalías. Criterio de éxito: trazabilidad y capacidad de actuar sobre alertas verificadas; no medir únicamente el número de visualizaciones publicadas.
La eficacia de un piloto no se evalúa comparando únicamente dos promedios antes–después. Es preferible construir una línea base temporal suficiente; definir intervención y resultados antes del despliegue; incluir, cuando sea viable, servicios o periodos de comparación; revisar estacionalidad, severidad, turnos y choques exógenos; documentar costos; y analizar eventos adversos. Un enfoque de diferencias en diferencias requeriría defender tendencias paralelas y un grupo comparable; un diseño de serie de tiempo interrumpida exigiría suficientes observaciones antes y después. Ninguna de estas técnicas se estima como causal en el presente trabajo.
| Producto | Dueño | Plazo indicativo | Evidencia de cumplimiento | Regla de decisión |
|---|---|---|---|---|
| Línea base confiable y segmentada | Analítica + Urgencias | Semanas 1–2 | Base validada y ficha técnica | Validar continuidad del piloto |
| Piloto de turnos y flujos | Urgencias + TH | Semanas 3–7 | Registros de cambios y seguimiento | Escalar/corregir/suspender |
| Evaluación operacional y clínica | Calidad + Planeación | Semana 8 | Informe de resultados y riesgos | Adopción condicionada |
| Diccionario y reglas de alerta | Sistemas + Analítica | Primer mes | Protocolos versionados | Habilitar operación de monitoreo |
| Comité de revisión de indicadores | Gerencia + Calidad | Mensual | Acta con decisiones y responsables | Ajuste de umbrales/recursos |
La semilla establecida en YAML es 20261023. El código genera todos
los datos desde cero, por lo que no depende de rutas locales ni archivos
externos. Para replicar, instalar las librerías indicadas, abrir el
.Rmd y seleccionar Knit → Knit to HTML. El
dashboard adicional se genera por separado con
flexdashboard.
## [1] "R version 4.6.1 (2026-06-24 ucrt)"
## Semilla: 20261023
## Filas de datos sintéticos: 360
## Paquetes requeridos: ggplot2, dplyr, tidyr, lubridate, scales, RColorBrewer, ggrepel, plotly, knitr, flexdashboard, DT
El hallazgo metodológico central es que una métrica aislada no es una decisión. La lectura integral exige comprender variabilidad, composición del volumen, frecuencia de situaciones críticas, incertidumbre, limitaciones y costos de respuesta. En el ejercicio simulado, el análisis segmentado revela dónde merece la pena investigar la congestión y cómo transformar observaciones en hipótesis de intervención. El reporte se detiene deliberadamente antes de afirmar que redistribuir recursos causa una reducción determinada en los tiempos de espera.
Para una institución real, la secuencia recomendada es: (i) construir una base auditada y ajustada por necesidad clínica; (ii) formular una intervención operacional viable; (iii) medir resultados e impactos no deseados; y (iv) decidir continuidad sobre evidencia y no sobre impresiones visuales. El anexo interactivo es un mecanismo complementario de comunicación, no el sustituto de esta metodología.
Nota bibliográfica: las referencias explican herramientas y enfoques. Los resultados numéricos corresponden exclusivamente al proceso sintético implementado aquí.