Código 1 — Cargar paquetes
Este bloque puede ir al inicio del R Markdown.
# Instalar los paquetes solamente si no están instalados
# install.packages("tidyverse")
# install.packages("plotly")
# install.packages("DT")
library(tidyverse)
library(plotly)
library(DT)Código 2 — Importar el archivo CSV
Como el archivo tiene las filas entre comillas, utilizamos una lectura sencilla que permite conservar correctamente las 16 columnas.
# Leer el archivo línea por línea
datos <- readLines("Appointments.csv", encoding = "UTF-8")
# Eliminar las comillas que rodean cada fila
datos <- gsub('^"|"$', '', datos)
# Convertir las líneas en una tabla
appointments <- read.csv(
text = datos,
header = TRUE,
stringsAsFactors = FALSE,
na.strings = c("", "NA")
)
# Revisar las dimensiones
dim(appointments)## [1] 111488 16
Código 3 — Visualizar las primeras observaciones, estructura, dimension, nombre de variables.
## 'data.frame': 111488 obs. of 16 variables:
## $ appointment_id : int 138 146 21 233 90 180 197 191 135 130 ...
## $ slot_id : int 1 23 24 25 26 27 28 29 30 22 ...
## $ scheduling_date : chr "2014-12-28" "2014-12-29" "2014-12-17" "2014-12-31" ...
## $ appointment_date : chr "2015-01-01" "2015-01-01" "2015-01-01" "2015-01-01" ...
## $ appointment_time : chr "08:00:00" "13:30:00" "13:45:00" "14:00:00" ...
## $ scheduling_interval : int 4 3 15 1 6 2 2 2 4 4 ...
## $ status : chr "did not attend" "did not attend" "attended" "attended" ...
## $ check_in_time : chr NA NA "13:36:45" "13:59:32" ...
## $ appointment_duration: num NA NA 5.2 28.9 NA 7.7 4.2 27.1 NA 1.2 ...
## $ start_time : chr NA NA "13:37:57" "14:00:40" ...
## $ end_time : chr NA NA "13:43:09" "14:29:34" ...
## $ waiting_time : num NA NA 1.2 1.1 NA 21.7 16.2 1 NA 8.5 ...
## $ patient_id : int 8285 5972 6472 5376 8028 4317 7638 7061 2475 4217 ...
## $ sex : chr "Male" "Male" "Male" "Female" ...
## $ age : int 37 84 77 37 72 51 28 33 29 90 ...
## $ age_group : chr "35-39" "80-84" "75-79" "35-39" ...
## [1] 111488 16
## [1] "appointment_id" "slot_id" "scheduling_date"
## [4] "appointment_date" "appointment_time" "scheduling_interval"
## [7] "status" "check_in_time" "appointment_duration"
## [10] "start_time" "end_time" "waiting_time"
## [13] "patient_id" "sex" "age"
## [16] "age_group"
Código 7 — Tabla básica de descripción de variables
Para un primer R Markdown es útil construir una tabla que explique qué representa cada campo.
descripcion_variables <- data.frame(
Variable = names(appointments),
Descripcion = c(
"Identificador de la cita",
"Identificador del espacio disponible",
"Fecha en que se programó la cita",
"Fecha asignada para la cita",
"Hora asignada para la cita",
"Intervalo entre la programación y la cita",
"Estado final de la cita",
"Hora de llegada del paciente",
"Duración de la atención",
"Hora de inicio de la atención",
"Hora de finalización de la atención",
"Tiempo de espera del paciente",
"Identificador del paciente",
"Sexo registrado",
"Edad del paciente",
"Grupo de edad"
)
)
knitr::kable(
descripcion_variables,
caption = "Descripción de las variables de la base Appointments"
)| Variable | Descripcion |
|---|---|
| appointment_id | Identificador de la cita |
| slot_id | Identificador del espacio disponible |
| scheduling_date | Fecha en que se programó la cita |
| appointment_date | Fecha asignada para la cita |
| appointment_time | Hora asignada para la cita |
| scheduling_interval | Intervalo entre la programación y la cita |
| status | Estado final de la cita |
| check_in_time | Hora de llegada del paciente |
| appointment_duration | Duración de la atención |
| start_time | Hora de inicio de la atención |
| end_time | Hora de finalización de la atención |
| waiting_time | Tiempo de espera del paciente |
| patient_id | Identificador del paciente |
| sex | Sexo registrado |
| age | Edad del paciente |
| age_group | Grupo de edad |
La base de datos contiene información relacionada con la programación, atención y estado de las citas. Las variables incluyen identificadores, fechas y horas, características de los pacientes y variables relacionadas con el proceso de atención. Para el EDA se revisará inicialmente la estructura y organización de estas variables antes de realizar la exploración gráfica.
Aquí todavía estamos haciendo EDA. La finalidad es conocer cómo están organizados los datos y detectar problemas básicos de calidad, sin entrar todavía en análisis estadístico.
Código 8 — Convertir fechas
appointments$scheduling_date <- as.Date(
appointments$scheduling_date
)
appointments$appointment_date <- as.Date(
appointments$appointment_date
)Código 9 — Convertir variables numéricas
appointments$scheduling_interval <- as.numeric(
appointments$scheduling_interval
)
appointments$appointment_duration <- as.numeric(
appointments$appointment_duration
)
appointments$waiting_time <- as.numeric(
appointments$waiting_time
)
appointments$age <- as.numeric(
appointments$age
)Código 10 — Convertir variables categóricas
appointments$status <- as.factor(appointments$status)
appointments$sex <- as.factor(appointments$sex)
appointments$age_group <- as.factor(appointments$age_group)Código 11 — Revisar datos faltantes
Los datos faltantes (valores que no están registrados) son importantes en una exploración inicial.
## appointment_id slot_id scheduling_date
## 0 0 0
## appointment_date appointment_time scheduling_interval
## 0 0 0
## status check_in_time appointment_duration
## 0 25456 25456
## start_time end_time waiting_time
## 25456 25456 25456
## patient_id sex age
## 0 0 0
## age_group
## 0
La revisión inicial permite identificar que algunas variables relacionadas con la atención, como la duración de la cita y el tiempo de espera, pueden presentar valores faltantes. Esto debe tenerse en cuenta durante la exploración de la información, ya que no todas las citas necesariamente tienen registrada información correspondiente a una atención efectiva.
##Exploración gráfica de los datos
Aquí podemos incorporar los tres gráficos interactivos básicos solicitados.
Gráfico 1 — Estado de las citas
Primero exploramos la variable status, que permite observar cómo se distribuyen las citas según su estado registrado.
## [1] 2
grafico_status <- appointments %>%
count(status)
plot_ly(
grafico_status,
x = ~status,
y = ~n,
type = "bar"
) %>%
layout(
title = "Estado de las citas",
xaxis = list(title = "Estado"),
yaxis = list(title = "Número de citas")
)datos <- readLines("Appointments.csv", encoding = "UTF-8")
datos <- gsub('^"|"$', '', datos)
appointments <- read.csv(
text = datos,
header = TRUE,
stringsAsFactors = FALSE,
na.strings = c("", "NA")
)## [1] 111488 16
codigo 12
grafico_status <- appointments %>%
count(status)
grafico <- plotly::plot_ly(
grafico_status,
x = ~status,
y = ~n,
type = "bar"
)
grafico <- plotly::layout(
grafico,
title = "Estado de las citas",
xaxis = list(title = "Estado"),
yaxis = list(title = "Número de citas")
)
graficoEl gráfico permite explorar visualmente los diferentes estados registrados para las citas. Se observa una mayor presencia de citas con estado attended, mientras que también aparecen registros correspondientes a cancelaciones y citas a las que el paciente no asistió. La categoría unknown y los registros scheduled tienen una presencia considerablemente menor.
Gráfico 2 — Distribución de pacientes por grupo de edad
Utilizamos age_group, evitando por ahora realizar medidas estadísticas sobre la edad.
Código 13
grafico_edad <- appointments %>%
count(age_group)
grafico <- plotly::plot_ly(
grafico_edad,
x = ~age_group,
y = ~n,
type = "bar"
)
grafico <- plotly::layout(
grafico,
title = "Citas según grupo de edad",
xaxis = list(title = "Grupo de edad"),
yaxis = list(title = "Número de citas")
)
grafico## [1] "Date"
codigo 14 evolución de las citas en el tiempo.
citas_tiempo <- appointments %>%
mutate(
mes = format(appointment_date, "%Y-%m")
) %>%
count(mes)
grafico <- plotly::plot_ly(
citas_tiempo,
x = ~mes,
y = ~n,
type = "scatter",
mode = "lines+markers"
)
grafico <- plotly::layout(
grafico,
title = "Evolución temporal de las citas",
xaxis = list(
title = "Mes de la cita",
tickangle = 45
),
yaxis = list(
title = "Número de citas"
)
)
graficoEl gráfico permite explorar visualmente la evolución de las citas a lo largo del periodo disponible en la base. Se pueden identificar cambios en la cantidad de citas registradas entre los diferentes meses, lo que permite reconocer patrones temporales que posteriormente podrían ser estudiados con mayor profundidad
Aunque el requisito mínimo son tres gráficos, este cuarto gráfico puede ser interesante para un estudiante de Gerencia de Servicios de Salud, porque permite explorar conjuntamente dos variables de la base sin entrar todavía en inferencia estadística.
Código 15 — Estado de la cita según sexo
Este será un gráfico adicional de exploración, todavía dentro del EDA. Permite observar conjuntamente sex y status.
grafico_sexo <- appointments %>%
count(sex, status)
grafico <- plotly::plot_ly(
grafico_sexo,
x = ~status,
y = ~n,
color = ~sex,
type = "bar"
)
grafico <- plotly::layout(
grafico,
title = "Estado de las citas según sexo",
barmode = "group",
xaxis = list(
title = "Estado de la cita"
),
yaxis = list(
title = "Número de citas"
)
)
graficoEl gráfico permite explorar visualmente la distribución de los diferentes estados de las citas según el sexo registrado. Se pueden observar diferencias en la cantidad de registros entre ambos grupos para los distintos estados de las citas