¿Qué tan llenos están los hospitales públicos?
Cada mes, cada hospital público declara cuántos días cama tuvo ocupados y disponibles, en cada tipo de cama. Son 166 mil registros desde 2014 en un solo archivo que casi nadie abre.
FastAPI · SQLite · APScheduler · REM-20 MINSAL · :8027
- Estado
- En vivo · se actualiza solo
- Fuente de datos
- REM-20, Ministerio de Salud · datos.gob.cl
- Stack
- FastAPI · SQLite · APScheduler
- Cadencia
- Chequeo semanal del origen (miércoles)
- Cobertura
- 166.315 registros · 208 hospitales · 29 áreas · ene-2014 a jun-2026
- Infraestructura
- Raspberry Pi · $0 cloud
El problema
"El hospital está colapsado" es una frase que aparece cada invierno sin un número detrás. Resulta que el número existe: el REM-20 obliga a cada establecimiento público a declarar, mes a mes y por tipo de cama, cuántos días cama tuvo ocupados y disponibles, cuántos pacientes egresaron, cuántos fallecieron y cuántos días estuvieron internados. Es un CSV de 26 MB con 166 mil filas que se publica hace más de una década y que prácticamente no se mira. Quise convertirlo en algo que se pueda leer de un vistazo, sin perder por el camino las trampas que tiene.
Qué construí
Un monitor con doce años y medio de ocupación hospitalaria, abierto por hospital, tipo de cama, región y mes.
- check_circle Índices comparables —ocupación, estancia media, mortalidad hospitalaria y egresos— recalculados desde los contadores crudos, con una serie mensual continua desde enero de 2014.
- check_circle El corte por tipo de cama, que es el que importa: una cama básica al 95 % es gestión, una UCI al 95 % es un sistema al límite. Las 29 áreas funcionales del REM-20 quedan agrupadas en nueve familias comparables entre hospitales.
- check_circle El territorio encima: el REM-20 solo trae el Servicio de Salud, que es una división administrativa. La comuna, la región y el nivel de complejidad salen de cruzarlo con el catálogo de Establecimientos de Salud.
- check_circle Una sección de calidad de la fuente, mes por mes: cuántos hospitales reportaron, cuántas filas quedaron fuera del índice y cuántas venían partidas y se sumaron.
- check_circle Corre 24/7 sobre una Raspberry Pi, con $0 de costo cloud. Apache hace de proxy hacia el servicio interno; la ingesta revisa el origen sola cada semana y demora 14 segundos.
Cómo funciona
La ingesta baja dos CSV de datos.gob.cl —el REM-20 y el catálogo de establecimientos— y los
deja en un SQLite. La URL de descarga lleva la fecha de publicación
(…rem20_20260725.csv) y cambia cada vez que MINSAL
republica, así que se resuelve siempre con package_show
en vez de clavarla: mientras escribía esto, el archivo se actualizó y el monitor lo tomó solo.
El REM-20 es un archivo único, no una serie de archivos mensuales, así que cada corrida
recarga todo — son 14 segundos en la Pi.
Decisiones técnicas
Nunca promediar porcentajes
El archivo ya trae calculados el índice ocupacional, la estancia media y la letalidad de cada fila, y cuadran: verifiqué las 166.318 filas y hay cero discrepancias. Aun así no los uso. Son índices por fila, y el promedio de porcentajes no es el porcentaje del conjunto: haría pesar lo mismo a una UCI de seis camas que a un servicio de sesenta. Cada número del monitor suma primero los numeradores y denominadores crudos y divide después.
Las glosas no son estables; los códigos sí
El mismo Servicio de Salud aparece con dos nombres según el año —Arica y Arica y Parinacota, Iquique y Tarapacá, Valdivia y Los Ríos—, 88 hospitales cambian de puntuación a mitad de la serie ("Hospital Dr Juan Noé" pasa a "Hospital Dr. Juan Noé") y dos áreas funcionales pierden una preposición. Agrupar por texto parte cada uno de esos en dos entidades distintas y corta las series por la mitad. Todo se agrupa por código, y la glosa se toma de un catálogo propio.
Tres celdas vienen partidas en dos filas
La clave natural —mes, hospital, área— viene repetida en tres casos: el Hospital de Teno en junio y diciembre de 2014, y el de Laja en junio de 2020. No son copias: traen valores distintos y complementarios. Como los seis campos son contadores aditivos, se suman, y la fila queda marcada para poder auditarla desde el propio dashboard.
Un hospital que no manda su REM no es un hospital que cerró
El último año siempre viene parcial —el corte actual llega a junio de 2026— y si se grafica el año completo diciembre se desploma a cero. Los meses con reporte muy por debajo de lo habitual para su propio año se marcan y salen de las series comparables, en vez de dibujar una caída que no existe. Lo mismo con las 3.143 filas que declaran cero camas disponibles: entran a la base, pero no al índice.
La fuente la llama "letalidad", y está mal
El REM-20 nombra LETALIDAD a la columna de fallecidos sobre egresos. El término es incorrecto y lo cambié: letalidad exige que el denominador sean casos de una enfermedad determinada, y aquí el denominador son todos los egresos de un tipo de cama. Es mortalidad hospitalaria bruta. Peor aún si se lee por área: el propio diccionario dice que un traslado a otra área del mismo hospital no constituye egreso, y en cama crítica los traslados doblan a los egresos —145.359 contra 72.470 en 2025—. La mayoría de los pacientes sale de la UCI hacia otra cama del mismo hospital, y si fallece allí el fallecimiento suma en esa área. El indicador dice dónde ocurrió el egreso, no dónde estuvo el paciente grave.
Un hospital que falta tiene que decirlo
El mes más reciente siempre trae rezagados: en junio de 2026 faltan cuatro hospitales que sí reportaron en mayo, entre ellos el Roberto del Río. La versión anterior simplemente no los mostraba, y quien buscaba su hospital no podía distinguir "no reportó este mes" de "no existe". Ahora aparecen igual en la tabla, marcados, sin cifras y con la fecha de su último reporte — y un aviso arriba los nombra. No entran en ningún total.
Sobre 100 % no es un error
Hay 1.877 filas donde se ocuparon más camas de las declaradas como disponibles: camas supernumerarias, pasillo, reconversión. La tentación es truncar al 100 % para que el gráfico se vea prolijo, pero justamente esa es la señal que interesa. Se muestran como vienen.
Qué encontré
- monitor_heart La cama crítica no volvió a lo de antes de 2020, pero no como uno esperaría. En 2020 su ocupación bajó —se habilitaron camas más rápido de lo que se llenaban—; lo que subió y se quedó fue el flujo: los egresos de cama crítica pasaron de 41.268 en 2019 a 72.470 en 2025, un 76 % más, mientras la estadía media caía de 20,9 a 16,7 días.
- child_care La caída de la natalidad se ve desde la cama: los egresos de obstetricia pasaron de 216.789 en 2014 a 149.533 en 2025, un 31 % menos. Obstetricia y pediatría son hoy las camas más vacías del sistema, en torno al 65 % de ocupación.
- hotel Las camas sociosanitarias promediaron 149,5 días de estada en 2025, al 96,6 % de ocupación. Son personas que ya no necesitan hospital pero no tienen dónde ir: el dato de salud midiendo un problema que no es de salud.
- psychology Salud mental es la cama más llena del sistema: 91,8 % de ocupación con 23,4 días de estada promedio, por encima incluso de la cama crítica adulto.
- stacked_line_chart La presión escala con la complejidad: en junio de 2026 los hospitales de alta complejidad estaban al 87,0 %, los de mediana al 78,6 % y los de baja al 72,0 %.
Qué es real y qué es parcial
Es un prototipo, no una estadística oficial, y conviene ser preciso.
- verified Real: los 166.315 registros son los que publica MINSAL, sin recortes. El cruce que le pone comuna y coordenadas a cada hospital empalma 208 de 208.
- schedule Parcial: solo hospitales públicos del Sistema Nacional de Servicios de Salud. El sistema privado, las clínicas y los establecimientos de las FF.AA. no están en el REM-20, así que esto no dice nada sobre la capacidad total del país. Tampoco cubre urgencias, consultas ni pabellón: es hospitalización, cama y egreso.
- warning Lo que este dato NO permite: rankear hospitales por calidad. La mortalidad que muestra el monitor no está ajustada por gravedad ni por edad, y un hospital que recibe los casos más graves de su región tendrá mortalidad más alta haciendo bien su trabajo. Está publicada porque es parte de la fuente, con la advertencia al lado.
- build Lo que agregué yo: las nueve familias de cama (Crítico adulto, Neonatología, Obstetricia…) son agrupación mía sobre las 29 áreas funcionales, no una categoría oficial de MINSAL. Está declarado en el propio dashboard.
- visibility A la vista: el dashboard termina con la ficha de calidad de los 150 meses, y el aviso de que 8 de los 208 establecimientos figuran hoy como cerrados en el catálogo de MINSAL —su historial se conserva— y que 5 no tienen coordenadas.
¿Y el hospital de tu comuna?
El monitor corre ahora mismo sobre la Pi y se actualiza solo.