Preparación de la base

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

Estructura y descripción de la base de datos

Código 3 — Visualizar las primeras observaciones, estructura, dimension, nombre de variables.

head(appointments)
str(appointments)
## '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" ...
dim(appointments)
## [1] 111488     16
names(appointments)
##  [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"
)
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.

Revisión y organización de las variables

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.

faltantes <- colSums(is.na(appointments))

faltantes
##       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 + 1
## [1] 2
library(tidyverse)
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")
)
dim(appointments)
## [1] 111488     16
head(appointments)

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

grafico

El 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
appointments$appointment_date <- as.Date(
  appointments$appointment_date
)
class(appointments$appointment_date)
## [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"
  )
)

grafico

El 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

Una alternativa útil: explorar el estado por sexo

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

grafico

El 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