1 Exploración Analítica de Datos — EDA

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.

1.1 Preparación y reconocimiento de la base

1.1.1 Importación y limpieza

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
    )
  )

1.1.2 Estructura y datos faltantes

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.

1.2 Descripción de las variables

1.2.1 Significado de las columnas

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.

1.2.2 Vista inicial

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

1.3 Exploración mediante gráficos interactivos

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.

1.3.1 Gráfico 1: grupos con mayores estancias máximas

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.

1.3.2 Gráfico 2: pagos mínimos y máximos

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.

1.3.3 Gráfico 3: estancia máxima y cargo máximo

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.

1.4 Alcance de los hallazgos

1.4.1 Utilidad para la gestión

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.

2 Probabilidad y Estadística Aplicada

Tema reservado para una etapa posterior.