Contexto del problema: Alta prevalencia de trastornos del sueño puede incrementar la demanda de servicios de salud (consultas, medicamentos, hospitalizaciones), afectando la eficiencia del sistema.

Audiencia objetivo: Directivos de instituciones de salud (gerentes, coordinadores clínicos, tomadores de decisiones).

Objetivo analítico: Identificar patrones entre hábitos de vida y trastornos del sueño para orientar decisiones preventivas.

Analítica Exploratoria de los Datos

Desde la perspectiva de la Gestión de Recursos Sanitarios, la base de datos Sleep Health and Lifestyle Dataset constituye una fuente valiosa para la exploración analítica de factores asociados al bienestar y la salud de las personas. La combinación de variables demográficas, ocupacionales, conductuales y clínicas permite identificar patrones de comportamiento, segmentar poblaciones según perfiles de riesgo y explorar posibles relaciones entre hábitos de vida y condiciones de salud. Asimismo, facilita la detección de grupos que podrían requerir intervenciones preventivas específicas, el análisis de diferencias entre ocupaciones o grupos etarios, y la generación de evidencia para apoyar la toma de decisiones orientadas a la promoción de la salud. Desde una perspectiva gerencial, esta información es útil para diseñar estrategias de prevención, optimización en la asignación de recursos en programas de bienestar y el fortalecimiento de modelos de atención centrados en la identificación temprana de factores que podrían afectar la calidad de vida y el desempeño de la población.

Exploración inicial y estructural

A continuación se presenta la estructura global de la base “The Sleep Health and Lifestyle” la cual contiene 400 filas y 13 columnas, que abarcan una amplia gama de variables relacionadas con el sueño y los hábitos diarios. Incluye detalles como sexo, edad, ocupación, duración del sueño, calidad del sueño, nivel de actividad física, niveles de estrés, categoría de IMC, presión arterial, frecuencia cardíaca, cantidad de pasos diarios y presencia o ausencia de trastornos del sueño:

# Instalar paquetes si no están instalados
#install.packages("readxl")
#install.packages("dplyr")
#install.packages("plotly")

# Cargar librerías
library(readxl)
library(dplyr)
library(plotly)

# Cargar base de datos
sleep_data <- read_excel("Sleep_health_and_lifestyle_dataset.xlsx")

# Visualizar las primeras filas
head(sleep_data)
# Ver estructura del dataset
#str(sleep_data)

# Ver nombres de las variables
#colnames(sleep_data)

# Convertir variables categóricas a factor
sleep_data$Gender <- as.factor(sleep_data$Gender)
sleep_data$Occupation <- as.factor(sleep_data$Occupation)
sleep_data$`BMI Category` <- as.factor(sleep_data$`BMI Category`)
sleep_data$`Sleep Disorder` <- as.factor(sleep_data$`Sleep Disorder`)

# Verificar estructura nuevamente
# str(sleep_data)

Exploración gráfica preliminar

Gráfico 1: Análisis variables numéricas

## 1.5. Detección de valores atípicos en variables numéricas

## 1.5. Detección de valores atípicos

# Seleccionar solo variables numéricas relevantes

datos_numericos <- sleep_data[-2]%>%
  select(where(is.numeric)) %>%
  select(-`Person ID`)   # eliminar identificador

# Definir panel de gráficos
par(mfrow = c(2,4))

# Generar boxplots

colores <- grDevices::hcl.colors(length(names(datos_numericos)), "Set2")

for(i in seq_along(datos_numericos)){
  
  boxplot(datos_numericos[[i]],
          main = names(datos_numericos)[i],
          col = colores[i])
}

El análisis preliminar de las variables numéricas muestra una población relativamente homogénea en términos de edad, duración y calidad del sueño, sin evidencia visual de valores atípicos extremos que puedan comprometer la calidad de los datos. Se observa que la mayoría de los individuos duermen entre 6 y 8 horas diarias y reportan niveles de calidad del sueño entre moderados y altos. Asimismo, los niveles de actividad física y el número de pasos diarios presentan una variabilidad considerable entre personas, lo que sugiere comportamientos diferenciados que podrían influir en los resultados de salud. Finalmente, los indicadores de presión arterial se concentran dentro de rangos relativamente estables, proporcionando un contexto adecuado para explorar posibles relaciones entre estilo de vida, calidad del sueño y presencia de trastornos del sueño en los análisis de asociación y modelamiento predictivo posteriores.

Gráfico 2: Duración del sueño por género

sleep_data <- sleep_data %>%
  mutate(Gender = factor(Gender,
                         levels = c(1,2),
                         labels = c("Male","Female")))
grafico2 <- plot_ly(
  data = sleep_data,
  x = ~Gender,
  y = ~`Sleep Duration`,
  type = "box",
  color = ~Gender
)

grafico2

Este gráfico permite explorar si existen diferencias preliminares en la duración del sueño entre hombres y mujeres. A simple vista, ambos grupos presentan medianas muy similares y rangos de variación amplios, lo que sugiere que la duración del sueño no parece estar fuertemente diferenciada por género en esta muestra. Desde una perspectiva de gestión de recursos sanitarios, este hallazgo orienta a considerar que otros factores, como el nivel de estrés, la actividad física o la presencia de trastornos del sueño, podrían tener una mayor capacidad explicativa sobre los patrones de descanso de la población analizada.

Gráfico 3: Nivel de actividad física vs calidad del sueño

grafico3 <- plot_ly(
  data = sleep_data,
  x = ~`Physical Activity Level`,
  y = ~`Quality of Sleep`,
  type = "scatter",
  mode = "markers",
  color = ~Gender
)

grafico3

Esta nube de puntos muestra una tendencia general según la cual mayores niveles de actividad física suelen asociarse con mejores calificaciones de calidad del sueño, aunque la relación no es completamente lineal y existe variabilidad entre individuos. Este comportamiento sugiere la posible existencia de segmentos poblacionales con patrones diferenciados de bienestar y hábitos saludables. Para la gestión sanitaria, este tipo de relación es relevante porque permite identificar oportunidades de intervención mediante programas de promoción de actividad física que podrían contribuir indirectamente a mejorar la calidad del sueño y, en consecuencia, la salud general de la población.

Gráfico 4: Distribución de pasos diarios por categoría de IMC

sleep_data$`BMI Category` <- factor(
  sleep_data$`BMI Category`,
  levels = c(1, 2, 3, 4),
  labels = c("Underweight", "Normal", "Overweight", "Obese")
)

grafico4 <- plot_ly(
  data = sleep_data,
  x = ~`BMI Category`,
  y = ~`Daily Steps`,
  type = "box",
  color = ~`BMI Category`
)

grafico4

Este gráfico evidencia diferencias en la distribución de pasos diarios según la categoría de índice de masa corporal (IMC). Las categorías de bajo peso, peso normal y sobrepeso presentan niveles de actividad relativamente más altos y dispersos, mientras que la categoría de obesidad concentra valores considerablemente menores de pasos diarios. Desde una perspectiva analítica, este patrón sugiere una posible asociación entre el nivel de actividad física cotidiana y el estado nutricional de los individuos; en gestión de recursos sanitarios, esta información es útil para diseñar estrategias focalizadas de prevención y promoción de estilos de vida saludables dirigidas a grupos con mayor riesgo de sedentarismo y enfermedades crónicas asociadas.

Gráfico 5: Relación entre edad, duración del sueño y niveles de estrés

g3 <- plot_ly(
  data = sleep_data,
  x = ~Age,
  y = ~`Sleep Duration`,
  z = ~`Stress Level`,
  type = "scatter3d",
  mode = "markers"
)

g3

Este análisis tridimensional sugiere una relación inversa entre la duración del sueño y los niveles de estrés: los individuos que duermen más horas tienden a reportar menores niveles de estrés; mientras que, la edad no parece mostrar un patrón claramente diferenciador, aunque los grupos de mayor edad se concentran con mayor frecuencia en niveles de estrés moderados y bajos. Estos resultados indican que la calidad y cantidad del descanso podrían constituir factores más relevantes para la gestión del bienestar que la edad por sí sola.

Indicadores Descriptivos de la Población Analizada

Estos permiten caracterizar el comportamiento general de la población analizada antes de profundizar en modelos probabilísticos o predictivos. En términos generales, las variables asociadas con el sueño, la actividad física y el nivel de estrés presentan niveles de dispersión moderados, lo que sugiere la coexistencia de distintos perfiles de riesgo dentro de la población estudiada. Esta heterogeneidad resulta particularmente relevante para la gestión de recursos sanitarios, ya que indica que las necesidades de intervención podrían variar significativamente entre individuos. La comprensión de estas diferencias constituye un insumo fundamental para el diseño de estrategias de promoción de la salud, prevención de trastornos del sueño y focalización de programas de seguimiento clínico.

library(tidyr)

tabla_descriptiva <- sleep_data %>%
  select(
    Age,
    `Sleep Duration`,
    `Quality of Sleep`,
    `Physical Activity Level`,
    `Stress Level`,
    `Daily Steps`,
    `Blood Pressure (sistólica)`,
    `Blood Pressure (diastólica)`
  ) %>%
  summarise(
    across(
      everything(),
      list(
        Media = ~mean(.x, na.rm = TRUE),
        Mediana = ~median(.x, na.rm = TRUE),
        DE = ~sd(.x, na.rm = TRUE),
        Min = ~min(.x, na.rm = TRUE),
        Max = ~max(.x, na.rm = TRUE)
      )
    )
  ) %>%
  pivot_longer(
    everything(),
    names_to = c("Variable",".value"),
    names_sep = "_"
  )

tabla_descriptiva

Los indicadores descriptivos muestran que la población analizada corresponde principalmente a adultos de mediana edad, con una edad promedio de 42,2 años y una dispersión moderada entre los participantes. En términos de salud del sueño, la duración promedio fue de 7,1 horas diarias y la calidad promedio alcanzó 7,3 puntos sobre una escala de 10, lo que sugiere niveles aceptables de descanso en la mayoría de los individuos. No obstante, la amplitud observada en ambas variables evidencia la coexistencia de perfiles con hábitos de sueño potencialmente insuficientes que podrían requerir intervenciones específicas.

Respecto al estilo de vida, los participantes registraron en promedio 6.817 pasos diarios y cerca de 59 minutos de actividad física al día. Sin embargo, las desviaciones estándar relativamente elevadas indican una importante heterogeneidad en los comportamientos asociados con la actividad física, lo que podría traducirse en diferencias relevantes en los niveles de bienestar y riesgo para la salud. Desde una perspectiva de gestión sanitaria, este hallazgo sugiere la conveniencia de diseñar estrategias diferenciadas para grupos con distintos niveles de actividad.

Los niveles de estrés presentaron una mediana de 5 puntos y un promedio de 5,4 sobre una escala de 1 a 10, reflejando una presencia moderada de factores psicosociales que podrían influir sobre la calidad y duración del sueño. Por su parte, los indicadores de presión arterial mostraron valores promedio de 128,6 mmHg para la presión sistólica y 84,6 mmHg para la diastólica, concentrándose dentro de rangos relativamente homogéneos en comparación con otras variables del estudio.

En conjunto, los resultados describen una población con características generales compatibles con hábitos de sueño y actividad física moderadamente favorables, aunque con diferencias importantes entre individuos. Esta variabilidad constituye un elemento clave para los análisis posteriores, ya que sugiere la existencia de distintos perfiles de riesgo que pueden influir en la aparición de trastornos del sueño y, por tanto, en la demanda potencial de servicios de salud relacionados con su prevención, diagnóstico y tratamiento.

Una vez caracterizada la población y cuantificada la variabilidad de sus principales indicadores, el siguiente paso consiste en evaluar cómo esta incertidumbre puede afectar la ocurrencia de trastornos del sueño; para ello, se emplean modelos probabilísticos y técnicas de simulación que permiten estimar escenarios potenciales de demanda y riesgo.

Probabilidad Aplicada a los Trastornos del Sueño

Simulación de eventos y espacio muestral

La probabilidad permite modelar la ocurrencia de eventos aleatorios (situaciones que pueden ocurrir con diferentes resultados posibles). En el presente caso, por ejemplo, se puede modelar la ocurrencia de trastornos del sueño a diferentes niveles de actividad física.

Simulación de la Variable “Trastornos del Sueño”

Se realizaron 1.000 simulaciones independientes, cada una compuesta por una cohorte hipotética de 100 pacientes, utilizando la prevalencia observada de trastornos del sueño en la base de datos “The Sleep Health and Lifestyle” cuyo indicador clave es la proporción de pacientes clasificados como ’Sleep Disorder’equivalente al 41%, lo que representa el porcentaje esperado de casos en el escenario simulado. Este valor puede usarse como referencia inicial para dimensionar demanda potencial de tamizaje, educación en higiene del sueño o seguimiento clínico.

set.seed(123)

# Espacio muestral: presencia o ausencia de trastorno del sueño

eventos <- c("Sleep Disorder", "No Sleep Disorder")
p_real <- mean(sleep_data$`Sleep Disorder` == 1, na.rm = TRUE)

set.seed(123)

simulaciones <- replicate(
  1000,
  sum(sample(eventos,
             size = 100,
             replace = TRUE,
             prob = c(p_real, 1 - p_real)) == "Sleep Disorder")
) #sample() permite simular la selección aleatoria de eventos. Cuando no se define probabilidad, utiliza una distribución uniforme discreta (todos los eventos tienen la misma probabilidad).

summary(simulaciones)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    27.0    38.0    41.0    41.3    45.0    55.0
sd(simulaciones)
## [1] 4.886581

Los resultados muestran que el número esperado de pacientes con trastornos del sueño es aproximadamente 41 por cada 100 individuos (media = 41,3). Sin embargo, debido a la variabilidad inherente al proceso aleatorio, el número de casos puede fluctuar entre 27 y 55 pacientes; resaltando que, el 50% de las simulaciones produjo entre 38 y 45 casos, mientras que la desviación estándar de 4,89 indica que las variaciones alrededor del valor esperado suelen ser moderadas; lo cual es útil para la planificación de recursos, ya que permite anticipar escenarios de menor y mayor carga asistencial sin asumir que siempre se observará exactamente la misma proporción de casos. Esto es, si se atienden grupos de 100 pacientes con características similares a las observadas en la base de datos, lo más probable es que entre 38 y 45 de estos pacientes presenten trastornos del sueño, aunque ocasionalmente podrían observarse valores más bajos o más altos debido a la variabilidad natural de la población.

Estimación Operativa de la Demanda Potencial

Sabiendo que aproximadamente el 41% de los individuos presenta trastornos del sueño y conociendo su variabilidad esperada mediante simulación, se traduce estos hallazgos en información útil para la planificación de recursos sanitarios; es así que, desde una perspectiva gerencial, se calcula la magnitud potencial de la demanda asistencial.

prevalencia <- mean(sleep_data$`Sleep Disorder` == 1)

escenarios <- data.frame(
  Poblacion = c(100, 500, 1000, 5000),
  Casos_Esperados = round(c(100,500,1000,5000) * prevalencia)
)

escenarios

Extrapolando el comportamiento de que aproximadamente 41 de cada 100 personas presenten algún trastorno del sueño, esto quiere decir que, en poblaciones de mayor tamaño, podrían esperarse alrededor de 205 casos por cada 500 individuos, 410 casos por cada 1.000 individuos y más de 2.000 casos por cada 5.000 personas.

Escenarios Probabilísticos para la Planificación Sanitaria

Las distribuciones probabilísticas permiten modelar distintos escenarios relacionados con la salud del sueño y estimar comportamientos esperados bajo condiciones de incertidumbre; estas herramientas son útiles para anticipar demanda asistencial, identificar poblaciones de mayor riesgo y apoyar la planificación operativa.

Escenario 1: Variabilidad de la duración del sueño

A partir de la distribución normal se representa la variabilidad esperada en la duración del sueño de la población (variable continua que tiende a concentrarse alrededor de su media).

library(ggplot2)
library(plotly)
sleep_normal <- rnorm(200, mean = 7, sd = 1)

head(sleep_normal)
## [1] 7.259590 7.917511 6.277682 6.191716 6.858648 9.257013
g1 <- plot_ly(
  data = sleep_data,
  x = ~`Sleep Duration`,
  type = "histogram",
  nbinsx = 30
)

g1

En este gráfico se puede ver que, la mayor parte de los individuos presenta duraciones de sueño entre 6 y 8 horas, con una concentración alrededor de las 7 horas, reflejando un patrón de descanso relativamente homogéneo en la población analizada. Comprender esta variabilidad ayuda a identificar grupos que podrían estar por debajo de los niveles recomendados de descanso y, por tanto, en mayor riesgo de afectaciones en salud y productividad.

Escenario 2: Número esperado de episodios de alto estrés

A partir de la distribución de Poisson se modela el número de eventos que ocurren en un intervalo de tiempo, como episodios de estrés elevado.

eventos <- 0:10

prob_poisson <- dpois(eventos, lambda = 3)

knitr::kable(
  data.frame(eventos, prob_poisson)
)
eventos prob_poisson
0 0.0497871
1 0.1493612
2 0.2240418
3 0.2240418
4 0.1680314
5 0.1008188
6 0.0504094
7 0.0216040
8 0.0081015
9 0.0027005
10 0.0008102
# La distribución de Poisson se usa para conteos de eventos en intervalos de tiempo.

El modelo sugiere que, en promedio, podrían esperarse alrededor de tres episodios de alto estrés en el periodo analizado; estimación útil para diseñar programas de bienestar laboral y estrategias preventivas orientadas a reducir factores de riesgo asociados a trastornos del sueño y agotamiento.

Cuestionémonos

¿Los individuos con trastornos del sueño presentan mayores niveles de estrés?

Ver resultados de la prueba t
t.test(
  `Stress Level` ~ `Sleep Disorder`,
  data = sleep_data
)
## 
##  Welch Two Sample t-test
## 
## data:  Stress Level by Sleep Disorder
## t = -3.4439, df = 288.54, p-value = 0.0006583
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -1.0271127 -0.2800606
## sample estimates:
## mean in group 0 mean in group 1 
##        5.114155        5.767742
# Prueba t para comparación de medias. Evalúa si la diferencia entre medias de dos grupos es estadísticamente significativa.

# Interpretación
# p < 0.05: existen diferencias significativas en el nivel de estrés.
# p ≥ 0.05: no se observan diferencias estadísticamente significativas.

Se identificó una diferencia estadísticamente significativa en los niveles de estrés entre los individuos con y sin trastornos del sueño (p < 0.001). En promedio, las personas que presentan trastornos del sueño registran niveles de estrés más elevados (5,77) que aquellas que no presentan la condición (5,11). Este resultado sugiere que el estrés constituye un factor relevante asociado a la ocurrencia de alteraciones del sueño dentro de la población analizada.

¿La duración promedio del sueño cambia según la categoría de IMC?

Ver resultados del Anova
anova_model <- aov(
  `Sleep Duration` ~ `BMI Category`,
  data = sleep_data
)

summary(anova_model)
##                 Df Sum Sq Mean Sq F value   Pr(>F)    
## `BMI Category`   3  33.88  11.294   20.66 2.13e-12 ***
## Residuals      370 202.25   0.547                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Análisis de varianza (ANOVA)
# ANOVA compara medias entre tres o más grupos.
# Interpretación
# p < 0.05: al menos una categoría de IMC presenta una duración de sueño diferente.
# p ≥ 0.05: no se detectan diferencias significativas.

El análisis de varianza evidenció diferencias estadísticamente significativas en la duración promedio del sueño entre las distintas categorías de índice de masa corporal (p < 0.001). Este hallazgo indica que el patrón de descanso no es homogéneo entre los grupos de IMC, sugiriendo una posible interacción entre la condición nutricional y los hábitos de sueño de los individuos.

¿Existe asociación entre género y trastorno del sueño?

Ver resultados de la prueba Chi-cuadrado
tabla <- table(
  sleep_data$Gender,
  sleep_data$`Sleep Disorder`
)

chisq.test(tabla)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla
## X-squared = 29.405, df = 1, p-value = 5.874e-08
# Prueba Chi-cuadrado
# Evalúa si existe asociación entre dos variables categóricas. Relación entre género y trastorno del sueño.
# Interpretación
# p < 0.05: género y trastorno del sueño están asociados.
# p ≥ 0.05: no existe evidencia suficiente de asociación.

Se encontró una asociación estadísticamente significativa entre el género y la presencia de trastornos del sueño (p < 0.001). Este resultado indica que la distribución de los trastornos del sueño no es independiente del género, por lo que esta variable podría contribuir a la segmentación de grupos de riesgo dentro de estrategias de prevención y monitoreo.

Resultados preliminares

El análisis exploratorio mostró que los individuos con mayores niveles de estrés tienden a reportar una menor duración y calidad del sueño. Asimismo, se observaron diferencias en los niveles de actividad física y en los patrones de descanso entre los grupos con y sin trastornos del sueño.

Estas asociaciones sugieren que los trastornos del sueño no dependen de un único factor, sino que responden a una combinación de variables relacionadas con hábitos de vida, bienestar percibido y condiciones fisiológicas.

Los análisis inferenciales realizados evidencian que variables relacionadas con el estrés, la condición corporal y el género presentan asociaciones significativas con los trastornos del sueño. Estos hallazgos respaldan la pertinencia de incorporar dichas variables en el modelo predictivo desarrollado posteriormente, ya que aportan evidencia estadística de su potencial capacidad explicativa sobre el fenómeno analizado.

Desde la perspectiva de la gestión de recursos sanitarios, estos hallazgos permiten identificar segmentos poblacionales susceptibles de beneficiarse de programas de promoción de hábitos saludables, manejo del estrés y monitoreo preventivo. La identificación temprana de estos factores puede contribuir a reducir la carga asistencial asociada a problemas de sueño y a mejorar la calidad de vida de la población intervenida.

Modelo Analítico

Contexto y objetivos del modelo

En la gestión de recursos sanitarios, los trastornos del sueño pueden generar mayor demanda de consultas médicas, medicamentos y atención especializada. Identificar tempranamente factores asociados a estos trastornos permite diseñar intervenciones preventivas en programas de salud pública.

El objetivo del modelo analítico es estimar la probabilidad de presencia de trastornos del sueño a partir de variables relacionadas con hábitos de vida y condiciones fisiológicas, tales como duración del sueño, niveles de estrés, actividad física y frecuencia cardíaca.

Exploración y selección de variables

Examinar la estructura de los datos
library(tidyverse)
library(skimr)
library(dplyr)
library(tidyr)
library(rsample)
library(caret)
library(broom)
library(yardstick)
library(plotly)
datos <- readxl::read_excel("Sleep_health_and_lifestyle_dataset.xlsx")
glimpse(datos)
## Rows: 374
## Columns: 13
## $ `Person ID`                   <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1…
## $ Gender                        <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ Age                           <dbl> 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, …
## $ Occupation                    <dbl> 1, 2, 2, 3, 3, 1, 4, 2, 2, 2, 2, 2, 2, 2…
## $ `Sleep Duration`              <dbl> 6.1, 6.2, 6.2, 5.9, 5.9, 5.9, 6.3, 7.8, …
## $ `Quality of Sleep`            <dbl> 6, 6, 6, 4, 4, 4, 6, 7, 7, 7, 6, 7, 6, 6…
## $ `Physical Activity Level`     <dbl> 42, 60, 60, 30, 30, 30, 40, 75, 75, 75, …
## $ `Stress Level`                <dbl> 6, 8, 8, 8, 8, 8, 7, 6, 6, 6, 8, 6, 8, 8…
## $ `BMI Category`                <dbl> 3, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2…
## $ `Blood Pressure (sistólica)`  <dbl> 126, 125, 125, 140, 140, 140, 140, 120, …
## $ `Blood Pressure (diastólica)` <dbl> 83, 80, 80, 90, 90, 90, 90, 80, 80, 80, …
## $ `Daily Steps`                 <dbl> 4200, 10000, 10000, 3000, 3000, 3000, 35…
## $ `Sleep Disorder`              <dbl> 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0…
skimr::skim(datos)
Data summary
Name datos
Number of rows 374
Number of columns 13
_______________________
Column type frequency:
numeric 13
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Person ID 0 1 187.50 108.11 1.0 94.25 187.5 280.75 374.0 ▇▇▇▇▇
Gender 0 1 1.49 0.50 1.0 1.00 1.0 2.00 2.0 ▇▁▁▁▇
Age 0 1 42.18 8.67 27.0 35.25 43.0 50.00 59.0 ▆▆▇▃▅
Occupation 0 1 5.61 2.56 1.0 4.00 5.0 7.00 11.0 ▆▇▇▃▂
Sleep Duration 0 1 7.13 0.80 5.8 6.40 7.2 7.80 8.5 ▇▆▇▇▆
Quality of Sleep 0 1 7.31 1.20 4.0 6.00 7.0 8.00 9.0 ▁▇▆▇▅
Physical Activity Level 0 1 59.17 20.83 30.0 45.00 60.0 75.00 90.0 ▇▇▇▇▇
Stress Level 0 1 5.39 1.77 3.0 4.00 5.0 7.00 8.0 ▇▃▂▃▃
BMI Category 0 1 2.39 0.64 1.0 2.00 2.0 3.00 4.0 ▁▇▁▆▁
Blood Pressure (sistólica) 0 1 128.55 7.75 115.0 125.00 130.0 135.00 142.0 ▆▅▇▂▅
Blood Pressure (diastólica) 0 1 84.65 6.16 75.0 80.00 85.0 90.00 95.0 ▃▇▇▂▅
Daily Steps 0 1 6816.84 1617.92 3000.0 5600.00 7000.0 8000.00 10000.0 ▁▅▇▆▂
Sleep Disorder 0 1 0.41 0.49 0.0 0.00 0.0 1.00 1.0 ▇▁▁▁▆
datos_modelo <- datos %>%
  select(
    Age,
    `Sleep Duration`,
    `Quality of Sleep`,
    `Physical Activity Level`,
    `Stress Level`,
    `Daily Steps`,
    `Sleep Disorder`
  ) %>%
  drop_na()

La fase de exploración y selección de variables muestra que la base de datos está compuesta por 374 registros y 13 variables, sin valores faltantes, lo que garantiza una alta calidad de la información para el análisis. Las variables incluyen características demográficas (edad, género, ocupación), hábitos relacionados con el sueño (duración y calidad del sueño), indicadores de estilo de vida (actividad física y pasos diarios) y variables fisiológicas (niveles de estrés, presión arterial e IMC). Los estadísticos descriptivos evidencian variabilidad suficiente entre los individuos, aspecto favorable para la construcción de modelos predictivos. Asimismo, la variable objetivo “Sleep Disorder” presenta una distribución binaria, adecuada para desarrollar un modelo de clasificación orientado a estimar la probabilidad de presencia de trastornos del sueño a partir de factores asociados al comportamiento y estado de salud de las personas.

División de datos (entrenamiento y prueba)

Para analizar la base de datos se divide el conjunto en dos subgrupos, 75% para entrenamiento y 25% para validación.

set.seed(123)

split <- initial_split(datos_modelo, prop = 0.75)

train_data <- training(split)
test_data <- testing(split)

Ajuste del modelo analítico

Corremos una primera versión de un modelo (una regresión logística binaria) con un nivel de significancia del 5%, la variable objetivo es la presencia de trastornos del sueño (Sleep Disorder) explicada a partir de la edad, la duración del sueño, la calidad del sueño, el nivel de actividad física, el nivel de estrés y la cantidad de pasos diarios. En general, el modelo muestra un buen ajuste y evidencia que todas las variables incluidas tienen una asociación estadísticamente significativa con la probabilidad de presentar un trastorno del sueño, excepto la variable Sleep Duration la cual no es significativa.

Ver el modelo 1
modelo_logistico <- glm(
  `Sleep Disorder` ~ Age +
  `Sleep Duration` +
  `Quality of Sleep` +
  `Physical Activity Level` +
  `Stress Level` +
  `Daily Steps`,
  data = train_data,
  family = "binomial"
)

summary(modelo_logistico)
## 
## Call:
## glm(formula = `Sleep Disorder` ~ Age + `Sleep Duration` + `Quality of Sleep` + 
##     `Physical Activity Level` + `Stress Level` + `Daily Steps`, 
##     family = "binomial", data = train_data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               19.6955946  4.8550614   4.057 4.98e-05 ***
## Age                        0.3240213  0.0391148   8.284  < 2e-16 ***
## `Sleep Duration`          -1.4678260  0.7869264  -1.865 0.062144 .  
## `Quality of Sleep`        -2.4384106  0.6825084  -3.573 0.000353 ***
## `Physical Activity Level`  0.0861209  0.0203385   4.234 2.29e-05 ***
## `Stress Level`            -0.8311179  0.3036410  -2.737 0.006197 ** 
## `Daily Steps`             -0.0009907  0.0002954  -3.354 0.000797 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 379.19  on 279  degrees of freedom
## Residual deviance: 146.74  on 273  degrees of freedom
## AIC: 160.74
## 
## Number of Fisher Scoring iterations: 6

Se estima una segunda versión del modelo con un nivel de significancia del 5%, eliminando la variable Sleep Duration, en el cual todas las variables explicativas (edad, duración del sueño, calidad del sueño, nivel de actividad física, nivel de estrés y cantidad de pasos diarios) son significativas y explican en conjunto una gran parte de la variabilidad de la variable dependiente. En este momento, debe tenerse claro sí el objetivo principal es la predicción o la explicación. De ser la predicción me quedo con este modelo (AIC=162.14).

Ver el modelo 2
modelo_logistico <- glm(
  `Sleep Disorder` ~ Age +
  `Quality of Sleep` +
  `Physical Activity Level` +
  `Stress Level` +
  `Daily Steps`,
  data = train_data,
  family = "binomial"
)

summary(modelo_logistico)
## 
## Call:
## glm(formula = `Sleep Disorder` ~ Age + `Quality of Sleep` + `Physical Activity Level` + 
##     `Stress Level` + `Daily Steps`, family = "binomial", data = train_data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               16.9286201  4.3835905   3.862 0.000113 ***
## Age                        0.3297190  0.0390294   8.448  < 2e-16 ***
## `Quality of Sleep`        -3.4898901  0.4759837  -7.332 2.27e-13 ***
## `Physical Activity Level`  0.0813459  0.0194207   4.189 2.81e-05 ***
## `Stress Level`            -0.9324043  0.2928029  -3.184 0.001450 ** 
## `Daily Steps`             -0.0009081  0.0002832  -3.207 0.001341 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 379.19  on 279  degrees of freedom
## Residual deviance: 150.14  on 274  degrees of freedom
## AIC: 162.14
## 
## Number of Fisher Scoring iterations: 6

Pero si por el contrario, el objetivo principal es la explicación, entonces este modelo tiene inconvenientes con la variable Stress Level, dado que, su relación con los desordenes del sueño es inversa (negativa) lo cual clínicamente no es tan cierto, por tanto, debo seguir ajustando el modelo. Teniendo claro que, generalmente esto se presenta cuando exite un problema de colinealidad o multicolinealidad. Para ello, se corre una primera prueba, la cual confirma que, tanto la variable Stress Level (VIF=5.28) y la variable Quality of Sleep (VIF=7.03) empiezan a ser preocupantes en cuanto al problema de multicolinealidad.

Ver la prueba de VIF
library(car)
vif(modelo_logistico)
##                       Age        `Quality of Sleep` `Physical Activity Level` 
##                  2.148349                  7.028028                  4.003203 
##            `Stress Level`             `Daily Steps` 
##                  5.280436                  3.688631

Ahora se analiza por separado la variable Sleep Disorder en función de la variable Stress Level para verificar el signo de la relación; en el cual se obtiene como resultado que es positivo, esto es, a mayor nivel de estrés, mayor probabilidad de padecer un trastorno del sueño, lo cual es clínicamente respaldado, contrario al modelo anterior.

Ver el modelo simplificado de Sleep Disorder ~ Stress Level
glm(`Sleep Disorder` ~ `Stress Level`,
    family = "binomial",
    data = train_data)
## 
## Call:  glm(formula = `Sleep Disorder` ~ `Stress Level`, family = "binomial", 
##     data = train_data)
## 
## Coefficients:
##    (Intercept)  `Stress Level`  
##        -1.3145          0.1781  
## 
## Degrees of Freedom: 279 Total (i.e. Null);  278 Residual
## Null Deviance:       379.2 
## Residual Deviance: 372.7     AIC: 376.7

Para ver cuales podrían ser las dos o más variables las cuales están altamente correlacionadas, y por ende, las causantes del problema de multicolinealidad, entonces calculamos una matriz de correlación entre éstas.

library(corrplot)

cor_mat <- cor(train_data[, c("Stress Level",
                              "Quality of Sleep",
                              "Physical Activity Level",
                              "Daily Steps",
                              "Age")])

corrplot(cor_mat)

Como se observa en la matriz de correlación, la variable Stress Level se encuentra altamente correlacionada con la variable Quality of Sleep; por tanto, se estiman los siguientes dos modelos, cada uno eliminando una de las variables en cuestión.

Ver el modelo 3
modelo3 <- glm(`Sleep Disorder` ~ Age +
                                  `Physical Activity Level` +
                                  `Stress Level` +
                                  `Daily Steps`,
               family = binomial,
               data = train_data)

summary(modelo3)
## 
## Call:
## glm(formula = `Sleep Disorder` ~ Age + `Physical Activity Level` + 
##     `Stress Level` + `Daily Steps`, family = binomial, data = train_data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               -1.248e+01  1.650e+00  -7.564 3.90e-14 ***
## Age                        2.379e-01  2.857e-02   8.326  < 2e-16 ***
## `Physical Activity Level`  4.460e-02  1.418e-02   3.146  0.00165 ** 
## `Stress Level`             9.312e-01  1.289e-01   7.227 4.94e-13 ***
## `Daily Steps`             -8.653e-04  2.181e-04  -3.967 7.27e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 379.19  on 279  degrees of freedom
## Residual deviance: 236.41  on 275  degrees of freedom
## AIC: 246.41
## 
## Number of Fisher Scoring iterations: 5
Ver el modelo 4
modelo4 <- glm(`Sleep Disorder` ~ Age +
                                  `Physical Activity Level` +
                                  `Quality of Sleep` +
                                  `Daily Steps`,
               family = binomial,
               data = train_data)

summary(modelo4)
## 
## Call:
## glm(formula = `Sleep Disorder` ~ Age + `Physical Activity Level` + 
##     `Quality of Sleep` + `Daily Steps`, family = binomial, data = train_data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                4.2424692  1.6609713   2.554 0.010643 *  
## Age                        0.3506848  0.0412572   8.500  < 2e-16 ***
## `Physical Activity Level`  0.0750268  0.0184760   4.061 4.89e-05 ***
## `Quality of Sleep`        -2.3883667  0.2975364  -8.027 9.98e-16 ***
## `Daily Steps`             -0.0010214  0.0002936  -3.479 0.000503 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 379.19  on 279  degrees of freedom
## Residual deviance: 161.96  on 275  degrees of freedom
## AIC: 171.96
## 
## Number of Fisher Scoring iterations: 6

Los resultados de la regresión logística (modelo 2 con AIC de 171.96 mejor que el modelo 1 con AIC de 246.41) indican que las variables edad, calidad del sueño, nivel de actividad física y cantidad de pasos diarios presentan una relación significativa con la presencia de trastornos del sueño (p < 0.01 en todos los casos). La edad y la actividad física muestran coeficientes positivos, sugiriendo que, manteniendo constantes las demás variables, incrementos en estas variables se asocian con una mayor probabilidad de presentar un trastorno del sueño. Por otro lado, la calidad del sueño y los pasos diarios presentan coeficientes negativos, indicando una disminución en la probabilidad estimada del trastorno conforme aumentan sus valores.

Interpretación de los coeficientes del modelo

En regresión logística los coeficientes están en escala log-odds.Luego el Odds Ratio (OR) de la Edad se calcula así: OR=EXP(β)=1.42

Interpretación:Por cada año adicional de edad, las odds de presentar un trastorno del sueño aumentan aproximadamente un 42%, manteniendo constantes las demás variables.

El Odds Ratio (OR) del nivel de activiad física se calcula así: OR=EXP(β)=1.078

Interpretación: Un aumento de una unidad en el nivel de actividad física incrementa las odds de trastorno del sueño en aproximadamente un 7.8%.

El Odds Ratio (OR) de la calidad del sueño se calcula así: OR=EXP(β)=0.092

Interpretación: Cada unidad adicional en la calidad del sueño reduce las odds de padecer un trastorno del sueño aproximadamente un 90.8%.

El Odds Ratio (OR) de la cantidad de pasos diarios se calcula así: OR=EXP(β*1000)=0.36

Interpretación: Un incremento de 1000 pasos diarios se asocia con una reducción aproximada del 64% en las odds de trastorno del sueño (Esta interpretación suele ser mucho más útil que hacerlo por un solo paso).

Diagnóstico preliminar del modelo explicativo

diagnostico <- augment(modelo4)

ggplot(diagnostico, aes(.fitted, .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(
    title = "Diagnóstico de residuos del modelo",
    x = "Valores estimados",
    y = "Residuos"
  )

# Un detalle importante: en modelos logísticos no se espera una nube aleatoria como en regresión lineal. La aparición de estas dos curvas o bandas es normal debido a que la variable respuesta es binaria (0/1).

Este gráfico de residuos no muestra una dispersión completamente aleatoria alrededor de cero, sino dos bandas características de la regresión logística. No se observan patrones que sugieran una falta grave de ajuste, aunque existen algunas observaciones con residuos relativamente altos (|residuo| > 2) que podrían revisarse como posibles casos influyentes. En conjunto, el diagnóstico preliminar indica un ajuste razonable del modelo.

Evaluación del desempeño del modelo

pred_prob <- predict(modelo4,
                     newdata = test_data,
                     type = "response")
test_data$`Sleep Disorder` <- as.factor(test_data$`Sleep Disorder`)

Con el fin de evaluar la calidad y capacidad predictiva del modelo logístico seleccionado, se realizaron diferentes pruebas de diagnóstico. En particular, se analizaron los residuos estudentizados para verificar la adecuación del ajuste, la matriz de confusión para evaluar el desempeño en la clasificación de los casos y el área bajo la curva ROC (AUC) para medir la capacidad discriminativa global del modelo.

Residuos estudentizados

res_est <- rstudent(modelo4)

summary(res_est)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -2.95517 -0.52970 -0.12262 -0.01643  0.38154  3.30651
plot(res_est,
     ylab = "Residuos estudentizados",
     xlab = "Observación")

abline(h = c(-2, 2), lty = 2, col = "red")

En la tabla se observa un mínimo de −2.96, un máximo de 3.31 y una media = −0.016, esta última muy cerca de 0, lo cual es deseable. En el gráfico se evidencia que la mayoría de los residuos se concentran entre aproximadamente −1 y 1. Los puntos aparecen dispersos alrededor de 0 sin una tendencia clara creciente o decreciente. Esto es, No hay evidencia visual de un problema grave de especificación del modelo.

Matriz de confusión

prob <- predict(modelo4,
                type = "response")

pred <- ifelse(prob > 0.5, 1, 0)

table(
  Real = train_data$`Sleep Disorder`,
  Predicho = pred
)
##     Predicho
## Real   0   1
##    0 154  11
##    1  12 103

Interpretación:

154 casos fueron correctamente clasificados como “sin trastorno” (verdaderos negativos). 103 casos fueron correctamente clasificados como “con trastorno” (verdaderos positivos). Solo 23 errores (11 + 12) de un total de 280 observaciones.

La matriz de confusión muestra que el modelo clasifica correctamente la gran mayoría de los casos, con pocos falsos positivos y falsos negativos.

Cálculo de AUC

auc_modelo <- roc_auc_vec(
  truth = factor(test_data$`Sleep Disorder`,
                 levels = c(1,0)),
  estimate = pred_prob
)

auc_modelo
## [1] 0.9111111
#El AUC (Área Bajo la Curva ROC) mide la capacidad del modelo para distinguir entre personas con y sin trastorno del sueño.

#0.5 → sin capacidad discriminativa (azar).
#0.7–0.8 → aceptable.
#0.8–0.9 → buena.
#0.9 → excelente.

El modelo presenta una capacidad discriminativa excelente, siendo capaz de diferenciar correctamente entre individuos con y sin trastorno del sueño en aproximadamente el 91% de las comparaciones posibles.