El EDA consiste en revisar la organización de los datos y explorar sus características mediante tablas y gráficos. En esta etapa se formulan preguntas para orientar análisis posteriores.
El archivo original contiene notas y varias tablas. Se selecciona la tabla general de 451 grupos diagnósticos, evitando mezclarla con las secciones por aseguradora.
datos <- readr::read_csv(
"2022-msdrg.csv",
col_types = readr::cols(.default = readr::col_character())
)
datos_analisis <- datos |>
select(-index) |>
janitor::remove_empty("cols") |>
janitor::row_to_names(row_number = 17) |>
janitor::clean_names() |>
slice(1:451) |>
janitor::remove_empty("cols") |>
mutate(
across(
c(min_los, max_los,
min_of_gross_charges, max_of_gross_charges,
min_of_payment, max_of_payment),
as.numeric
)
)
Se revisa el tamaño de la tabla, el tipo de cada variable y las celdas sin información.
dim(datos_analisis)
## [1] 451 8
str(datos_analisis)
## tibble [451 × 8] (S3: tbl_df/tbl/data.frame)
## $ ms_drg_v38 : chr [1:451] "1" "2" "3" "4" ...
## $ ms_drg_v38_description: chr [1:451] "HEART TRANSPLANT OR IMPLANT OF HEART ASSIST SYSTEM WITH MCC" "HEART TRANSPLANT OR IMPLANT OF HEART ASSIST SYSTEM WITHOUT MCC" "ECMO OR TRACHEOSTOMY WITH MV >96 HOURS OR PRINCIPAL DIAGNOSIS EXCEPT FACE, MOUTH AND NECK WITH MAJOR O.R. PROCEDURES" "TRACHEOSTOMY WITH MV >96 HOURS OR PRINCIPAL DIAGNOSIS EXCEPT FACE, MOUTH AND NECK WITHOUT MAJOR O.R. PROCEDURES" ...
## $ min_los : num [1:451] 16 15 1 25 30 23 2 1 1 1 ...
## $ max_los : num [1:451] 16 15 90 210 30 32 17 32 21 9 ...
## $ min_of_gross_charges : num [1:451] 652673 434229 129150 361120 357201 ...
## $ max_of_gross_charges : num [1:451] 652673 434229 2660946 2769066 357201 ...
## $ min_of_payment : num [1:451] 70096 50776 4381 69452 29371 ...
## $ max_of_payment : num [1:451] 714571 494400 2213907 2303863 297191 ...
colSums(is.na(datos_analisis))
## ms_drg_v38 ms_drg_v38_description min_los
## 0 0 0
## max_los min_of_gross_charges max_of_gross_charges
## 0 0 0
## min_of_payment max_of_payment
## 0 0
Cada fila representa un grupo diagnóstico MS-DRG (categoría que agrupa hospitalizaciones con características clínicas relacionadas), no un paciente individual. El código se conserva como texto porque identifica una categoría.
| Variable | Tipo | Significado |
|---|---|---|
ms_drg_v38 |
Texto | Código del grupo diagnóstico. |
ms_drg_v38_description |
Texto | Descripción del grupo diagnóstico. |
min_los |
Numérica | Menor estancia registrada en el grupo, en días. |
max_los |
Numérica | Mayor estancia registrada en el grupo, en días. |
min_of_gross_charges |
Numérica | Menor cargo registrado en el grupo. |
max_of_gross_charges |
Numérica | Mayor cargo registrado en el grupo. |
min_of_payment |
Numérica | Menor importe de pago permitido registrado. |
max_of_payment |
Numérica | Mayor importe de pago permitido registrado. |
Los cargos son importes facturados y no equivalen a costos de atención. Los pagos permitidos incluyen la responsabilidad del paciente y de la aseguradora; no representan necesariamente dinero recaudado.
knitr::kable(head(datos_analisis), digits = 2)
| ms_drg_v38 | ms_drg_v38_description | min_los | max_los | min_of_gross_charges | max_of_gross_charges | min_of_payment | max_of_payment |
|---|---|---|---|---|---|---|---|
| 1 | HEART TRANSPLANT OR IMPLANT OF HEART ASSIST SYSTEM WITH MCC | 16 | 16 | 652672.6 | 652672.6 | 70096.00 | 714571.5 |
| 2 | HEART TRANSPLANT OR IMPLANT OF HEART ASSIST SYSTEM WITHOUT MCC | 15 | 15 | 434228.9 | 434228.9 | 50776.00 | 494400.3 |
| 3 | ECMO OR TRACHEOSTOMY WITH MV >96 HOURS OR PRINCIPAL DIAGNOSIS EXCEPT FACE, MOUTH AND NECK WITH MAJOR O.R. PROCEDURES | 1 | 90 | 129150.0 | 2660946.0 | 4381.00 | 2213907.1 |
| 4 | TRACHEOSTOMY WITH MV >96 HOURS OR PRINCIPAL DIAGNOSIS EXCEPT FACE, MOUTH AND NECK WITHOUT MAJOR O.R. PROCEDURES | 25 | 210 | 361120.4 | 2769066.3 | 69452.01 | 2303863.1 |
| 11 | TRACHEOSTOMY FOR FACE, MOUTH AND NECK DIAGNOSES OR LARYNGECTOMY WITH MCC | 30 | 30 | 357200.7 | 357200.7 | 29371.02 | 297191.0 |
| 20 | INTRACRANIAL VASCULAR PROCEDURES WITH PRINCIPAL DIAGNOSIS HEMORRHAGE WITH MCC | 23 | 32 | 489069.5 | 725255.1 | 47853.53 | 603412.2 |
Los gráficos permiten consultar valores al pasar el cursor sobre los elementos. En los gráficos de dispersión también es posible ampliar una zona.
mayores_estancias <- datos_analisis |>
arrange(desc(max_los)) |>
slice_head(n = 10)
plot_ly(
mayores_estancias,
x = ~max_los,
y = ~reorder(ms_drg_v38, max_los),
type = "bar",
orientation = "h",
text = ~ms_drg_v38_description,
hovertemplate = paste(
"Grupo: %{y}<br>%{text}<br>",
"Estancia máxima: %{x} días<extra></extra>"
)
) |>
layout(
title = "Diez grupos con mayores estancias máximas",
xaxis = list(title = "Estancia máxima (días)"),
yaxis = list(title = "Código MS-DRG")
)
El grupo 4 registra el máximo más alto, con 210 días, seguido por los grupos 329 y 790. Estos valores permiten seleccionar categorías para revisar hospitalizaciones prolongadas. No indican cuánto dura habitualmente una hospitalización ni cuántos pacientes tuvieron esa duración.
plot_ly(
datos_analisis,
x = ~min_of_payment,
y = ~max_of_payment,
type = "scatter",
mode = "markers",
text = ~paste(
"Grupo:", ms_drg_v38,
"<br>", ms_drg_v38_description
),
hovertemplate = paste(
"%{text}<br>Pago mínimo: %{x}<br>",
"Pago máximo: %{y}<extra></extra>"
)
) |>
layout(
title = "Exploración de pagos mínimos y máximos",
xaxis = list(title = "Pago mínimo"),
yaxis = list(title = "Pago máximo")
)
Cada punto corresponde a un grupo diagnóstico. Se observan grupos con pagos máximos especialmente elevados, incluso cuando sus pagos mínimos son relativamente bajos. Esto orienta preguntas sobre las diferencias entre episodios y pagadores, pero no demuestra pérdidas ni rentabilidad.
plot_ly(
datos_analisis,
x = ~max_los,
y = ~max_of_gross_charges,
type = "scatter",
mode = "markers",
text = ~paste(
"Grupo:", ms_drg_v38,
"<br>", ms_drg_v38_description
),
hovertemplate = paste(
"%{text}<br>Estancia máxima: %{x} días<br>",
"Cargo máximo: %{y}<extra></extra>"
)
) |>
layout(
title = "Exploración de estancias y cargos máximos",
xaxis = list(title = "Estancia máxima (días)"),
yaxis = list(title = "Cargo máximo")
)
Visualmente, los grupos con estancias máximas más prolongadas tienden a presentar cargos máximos mayores. Esta observación plantea una pregunta para futuros análisis; no demuestra que una variable cause la otra. Los dos máximos pueden corresponder a pacientes distintos.
La exploración permite identificar grupos para revisar sus hospitalizaciones, facturación y condiciones de pago. No permite medir capacidad instalada, cantidades de recursos utilizados, costos ni ingresos totales. Los grupos destacados deben investigarse con registros por hospitalización antes de tomar decisiones sobre reducción de estancias o asignación de recursos.
Tema reservado para una etapa posterior.