A continuación un análisis de diferentes bases de datos:
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.
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.
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.