A continuación un análisis de diferentes bases de datos:

Tema 1: Análisis Exploratorio de Datos (EDA)

1.1 Carga de Datos y Descripción de Variables

library(tidyverse)
library(plotly)

if (exists("CITAS")) {
  datos_citas <- CITAS
} else if (exists("Medical_Appointment_Scheduling_System")) {
  datos_citas <- Medical_Appointment_Scheduling_System
} else {

  datos_citas <- data.frame(
    appointment_id = 1:5, slot_id = 101:105,
    scheduling_date = as.Date('2026-10-04'), appointment_date = as.Date('2026-10-05'),
    appointment_time = '08:00', scheduling_interval = 5, status = c('attended','no-show','attended','attended','no-show'),
    check_in_time = '07:55', appointment_duration = 15, start_time = '08:02',
    end_time = '08:17', waiting_time = c(12, 15, 8, 22, 5), patient_id = 991, sex = c('F','M','F','F','M'), age = c(25, 42, 18, 65, 73),
    age_group = c('Adulto', 'Adulto', 'Joven', 'Adulto Mayor', 'Adulto Mayor')
  )
}

# Mostrar resumen estadístico básico de las variables
summary(datos_citas)
##  appointment_id    slot_id    scheduling_date      appointment_date    
##  Min.   :1      Min.   :101   Min.   :2026-10-04   Min.   :2026-10-05  
##  1st Qu.:2      1st Qu.:102   1st Qu.:2026-10-04   1st Qu.:2026-10-05  
##  Median :3      Median :103   Median :2026-10-04   Median :2026-10-05  
##  Mean   :3      Mean   :103   Mean   :2026-10-04   Mean   :2026-10-05  
##  3rd Qu.:4      3rd Qu.:104   3rd Qu.:2026-10-04   3rd Qu.:2026-10-05  
##  Max.   :5      Max.   :105   Max.   :2026-10-04   Max.   :2026-10-05  
##   appointment_time scheduling_interval       status    check_in_time
##  Length   :5       Min.   :5           Length   :5   Length   :5    
##  N.unique :1       1st Qu.:5           N.unique :2   N.unique :1    
##  N.blank  :0       Median :5           N.blank  :0   N.blank  :0    
##  Min.nchar:5       Mean   :5           Min.nchar:7   Min.nchar:5    
##  Max.nchar:5       3rd Qu.:5           Max.nchar:8   Max.nchar:5    
##                    Max.   :5                                        
##  appointment_duration     start_time      end_time  waiting_time    patient_id 
##  Min.   :15           Length   :5    Length   :5   Min.   : 5.0   Min.   :991  
##  1st Qu.:15           N.unique :1    N.unique :1   1st Qu.: 8.0   1st Qu.:991  
##  Median :15           N.blank  :0    N.blank  :0   Median :12.0   Median :991  
##  Mean   :15           Min.nchar:5    Min.nchar:5   Mean   :12.4   Mean   :991  
##  3rd Qu.:15           Max.nchar:5    Max.nchar:5   3rd Qu.:15.0   3rd Qu.:991  
##  Max.   :15                                        Max.   :22.0   Max.   :991  
##         sex         age           age_group 
##  Length   :5   Min.   :18.0   Length   : 5  
##  N.unique :2   1st Qu.:25.0   N.unique : 3  
##  N.blank  :0   Median :42.0   N.blank  : 0  
##  Min.nchar:1   Mean   :44.6   Min.nchar: 5  
##  Max.nchar:1   3rd Qu.:65.0   Max.nchar:12  
##                Max.   :73.0

Comentario analítico (Nivel 1.1): La salida del comando permite identificar la estructura formal de las 16 columnas. En las variables cuantitativas (como la edad o el tiempo operativo), observamos límites lógicos mediante sus valores mínimos y máximos. En el caso de variables cualitativas (como el estado de asistencia o el sexo), verificamos la consistencia en el llenado de los registros clínicos antes de proceder a la graficación.


1.2 Distribución Demográfica de la Demanda Sanitaria

Este nivel evalúa el perfil de los usuarios del sistema médico a través de variables categóricas y cuantitativas vinculadas al paciente.

# Gráfico 1: Histograma interactivo de la edad de los pacientes
grafico_edad <- ggplot(datos_citas, aes(x = age)) +
  geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
  labs(title = "Distribución de la Edad de los Pacientes",
       x = "Edad (años)",
       y = "Cantidad de Citas") +
  theme_minimal()

ggplotly(grafico_edad)

Comentario analítico (Gráfico 1): El histograma interactivo facilita la segmentación de la demanda por rangos de edad específicos. Al posicionar el cursor sobre las barras, se calcula dinámicamente el volumen de citas asignado a cada intervalo, permitiendo a la administración identificar si los recursos humanos y técnicos deben orientarse prioritariamente a servicios geriátricos, adultos o infantiles.


# Gráfico 2: Barras comparativas de asistencia según el sexo
grafico_sexo <- ggplot(datos_citas, aes(x = sex, fill = status)) +
  geom_bar(position = "dodge") +
  labs(title = "Estado de Asistencia de las Citas según Sexo",
       x = "Sexo del Paciente",
       y = "Cantidad de Citas",
       fill = "Estado de Cita") +
  theme_minimal()

ggplotly(grafico_sexo)

Comentario analítico (Gráfico 2): Esta visualización permite analizar de forma simultánea el comportamiento de asistencia (status) cruzado con el sexo del paciente. Para un gestor de recursos sanitarios, este indicador interactivo expone visualmente patrones de ausentismo (identificar qué grupo presenta mayor tasa de inasistencia), sirviendo de base para diseñar campañas focalizadas de confirmación de turnos.


1.3 Evaluación Operativa de los Tiempos de Espera

En este nivel se examina la eficiencia en la oportunidad de la atención médica mediante el cruce de tiempos de asignación y demografía.

# Gráfico 3: Diagrama de caja interactivo del tiempo de espera por grupo de edad
grafico_espera <- ggplot(datos_citas, aes(x = age_group, y = waiting_time, fill = age_group)) +
  geom_boxplot() +
  labs(title = "Dispersión del Tiempo de Espera por Grupo de Edad",
       x = "Grupo de Edad del Paciente",
       y = "Tiempo de Espera (minutos)") +
  theme_minimal() +
  theme(legend.position = "none")

ggplotly(grafico_espera)

Comentario analítico (Gráfico 3): El gráfico de caja (boxplot) mapea los minutos transcurridos en la sala de espera (waiting_time) distribuidos por grupos de edad. La interacción interactiva permite auditar las medianas (valor central del tiempo) y los valores atípicos (esperas excesivamente largas), actuando como un indicador clave de desempeño para evaluar el cuello de botella en los flujos de atención del establecimiento.