Análisis exploratorio de datos - Sleep Health and Lifestyle Dataset

Author

Eliana Fuentes y María Camila Vargas

Published

February 28, 2025

Introducción y contexto

El Sleep Health and Lifestyle Dataset es un conjunto de datos que abarca información detallada sobre la salud del sueño y los hábitos diarios de 400 individuos. Consta de 13 variables, que incluyen aspectos demográficos, métricas del sueño, actividad física, niveles de estrés y parámetros cardiovasculares.

Este dataset ofrece una oportunidad valiosa para analizar la relación entre el estilo de vida y la calidad del sueño, así como la presencia de trastornos del sueño.

Variables

Person ID: Un identificador único para cada individuo.

Gender: El género de la persona (Masculino/Femenino).

Age: La edad de la persona en años.

Occupation: La ocupación o profesión de la persona.

Sleep Duration (hours): El número de horas que la persona duerme al día.

Quality of Sleep (scale: 1-10): Una calificación subjetiva de la calidad del sueño, en una escala del 1 al 10.

Physical Activity Level (minutes/day): El número de minutos que la persona dedica a la actividad física diaria.

Stress Level (scale: 1-10): Una calificación subjetiva del nivel de estrés experimentado por la persona, en una escala del 1 al 10.

BMI Category: La categoría de IMC de la persona (por ejemplo, Bajo peso, Normal, Sobrepeso).

Blood Pressure (systolic/diastolic): La medición de la presión arterial de la persona, indicada como presión sistólica sobre presión diastólica.

Heart Rate (bpm): La frecuencia cardíaca en reposo de la persona en latidos por minuto.

Daily Steps: El número de pasos que la persona camina al día.

Sleep Disorder: La presencia o ausencia de un trastorno del sueño en la persona (Ninguno, Insomnio, Apnea del sueño).

Explorar los datos

# Visualizar las primeras filas de la base de datos
options(width = 200) # Ajusta el tamaño de la tabla
head(data_base)
# A tibble: 6 × 13
  `Person ID` Gender   Age Occupation           `Sleep Duration` `Quality of Sleep` `Physical Activity Level` `Stress Level` `BMI Category` `Blood Pressure` `Heart Rate` `Daily Steps` `Sleep Disorder`
        <dbl> <chr>  <dbl> <chr>                           <dbl>              <dbl>                     <dbl>          <dbl> <chr>          <chr>                   <dbl>         <dbl> <chr>           
1           1 Male      27 Software Engineer                 6.1                  6                        42              6 Overweight     126/83                     77          4200 None            
2           2 Male      28 Doctor                            6.2                  6                        60              8 Normal         125/80                     75         10000 None            
3           3 Male      28 Doctor                            6.2                  6                        60              8 Normal         125/80                     75         10000 None            
4           4 Male      28 Sales Representative              5.9                  4                        30              8 Obese          140/90                     85          3000 Sleep Apnea     
5           5 Male      28 Sales Representative              5.9                  4                        30              8 Obese          140/90                     85          3000 Sleep Apnea     
6           6 Male      28 Software Engineer                 5.9                  4                        30              8 Obese          140/90                     85          3000 Insomnia        

Gráficos de Variables Categóricas

# Definir variables categóricas
categorical_vars <- c("Gender", "BMI Category", "Sleep Disorder")

# Reestructurar datos sin `pivot_longer()`
data_long_cat <- melt(data_base, measure.vars = categorical_vars, variable.name = "Variable", value.name = "Valor")

# Gráfico de barras 
ggplot(data_long_cat, aes(x = Valor, fill = Valor)) +
  geom_bar(alpha = 0.8, color = "black") +
  facet_wrap(~ Variable, scales = "free") +
  labs(title = "Distribución de Variables Categóricas", x = "", y = "Frecuencia") +
  scale_fill_brewer(palette = "Set2") +  # Mejora la paleta de colores
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

Interpretación

  1. Género (Gender) La distribución de género es equilibrada, con una cantidad similar de personas identificadas como Female (Mujer) y Male (Hombre). No parece haber sesgo de género en la muestra, ya que ambas categorías tienen casi la misma frecuencia.

  2. Categoría de IMC (BMI Category) La mayoría de las personas tienen un IMC normal, seguido por aquellas con sobrepeso (Overweight). Un menor porcentaje cae en la categoría de peso normal (Normal Weight) y obesidad (Obese). Esto sugiere que la muestra está compuesta en su mayoría por individuos con un IMC dentro de rangos normales o con cierto sobrepeso.

  3. Trastornos del Sueño (Sleep Disorder) La mayoría de los individuos no tienen trastorno del sueño (None). La segunda condición más común es insomnio (Insomnia), seguida de apnea del sueño (Sleep Apnea). Esto indica que, aunque la mayoría no tiene problemas de sueño, una parte significativa experimenta insomnio y una fracción menor sufre de apnea del sueño.

Conclusiones

– La muestra es equilibrada en cuanto al género.

– La mayoría tiene un IMC en rango normal o con tendencia al sobrepeso.

– Aunque la mayoría no presenta trastornos del sueño, hay una porción importante con insomnio.

Gráficos Variables numéricas

# 4. Análisis de variables numéricas significativas
numeric_vars <- c("Sleep Duration", "Quality of Sleep",
                  "Physical Activity Level", "Stress Level",
                  "Heart Rate", "Daily Steps")
# Reestructurar los datos sin pivot_longer()
data_long <- melt(data_base, measure.vars = numeric_vars, variable.name = "Variable", value.name = "Valor")

# Histogramas
ggplot(data_long, aes(x = Valor)) +
  geom_histogram(fill = "steelblue", color = "black", bins = 30, alpha = 0.7) +
  facet_wrap(~ Variable, scales = "free") +
  labs(title = "Histogramas de Variables Numéricas", x = "Valor", y = "Frecuencia") +
  theme_minimal()

Interpretaciones

  1. leep Duration: Distribución multimodal, con picos alrededor de 6.5, 7 y 8 horas. Datos dispersos sin una forma claramente normal.

  2. Quality of Sleep: Distribución discreta con valores frecuentes en 6, 7, 8 y 9. No hay valores intermedios entre estos puntos.

  3. Physical Activity Level: Distribución con valores específicos repetidos (posiblemente categorías predefinidas). Picos en 40, 60 y 80.

  4. Stress Level: Similar a la Calidad del Sueño, con valores discretos en 3, 4, 5, 6, 7 y 8. Picos en cada uno de estos valores.

  5. Heart Rate: Pico alrededor de 70 bpm. Algunos valores en el rango de 75-85 bpm. Sesgo hacia la derecha debido a valores más altos.

  6. Daily Steps: Distribución discreta con picos en ciertos valores como 6000, 8000 y 10000 pasos. No es una distribución continua, lo que indica valores predefinidos o hábitos consistentes.

# Boxplots
ggplot(data_long, aes(y = Valor)) +
  geom_boxplot(fill = "orange", alpha = 0.7) +
  facet_wrap(~ Variable, scales = "free") +
  labs(title = "Boxplots de Variables Numéricas", y = "Valor") +
  theme_minimal()

Interpretaciones

  1. Sleep Duration (Duración del Sueño): Mediana alrededor de 7 horas. Rango intercuartil entre 6 y 8 horas. No hay valores atípicos evidentes.

  2. Quality of Sleep (Calidad del Sueño): Mediana en torno a 7. Distribución similar a la duración del sueño. No hay valores atípicos.

  3. Physical Activity Level (Nivel de Actividad Física): Mediana alrededor de 60. Amplio rango de variabilidad (aproximadamente de 20 a 80). No hay valores atípicos.

  4. Stress Level (Nivel de Estrés): Mediana en torno a 5. Distribución relativamente simétrica. Sin valores atípicos.

  5. Heart Rate (Frecuencia Cardiaca): Mediana cercana a 70 bpm. Algunos valores atípicos por encima de 80 bpm. Rango intercuartil más estrecho comparado con otras variables.

  6. Daily Steps (Pasos Diarios): Mediana alrededor de 7000 pasos. Amplio rango de variabilidad (entre aproximadamente 3000 y 10000). No hay valores atípicos.

Relación entre variables

Duración del Sueño por Género

# Gráfico: Relación entre Duración del Sueño y Calidad del Sueño por Género (Boxplot)
ggplot(data_base, aes(x = Gender, y = Sleep.Duration, fill = Gender)) +
  geom_boxplot(alpha = 0.7, outlier.color = "red") +
  labs(title = "Duración del Sueño por Género", x = "Género", y = "Duración del Sueño (horas)") +
  theme_minimal()

  • Descripción: Este gráfico muestra la duración del sueño (en horas) para los géneros “Female” (Mujer) y “Male” (Hombre).

  • Análisis: Parece que las mujeres tienen una duración de sueño ligeramente mayor que los hombres. La distribución de la duración del sueño es similar entre ambos géneros, pero las mujeres alcanzan un máximo ligeramente más alto.

  • Conclusión: Las diferencias en la duración del sueño entre géneros pueden ser mínimas, pero es importante considerar factores adicionales como la calidad del sueño y los trastornos asociados.

Nivel de Actividad Física por Categoría de BMI

# Gráfico: Relación entre Actividad Física y Estrés por Categoría de BMI (Violin Plot)
ggplot(data_base, aes(x = BMI.Category, y = Physical.Activity.Level, fill = BMI.Category)) +
  geom_violin(alpha = 0.7, trim = FALSE) +
  labs(title = "Nivel de Actividad Física por Categoría de BMI", x = "Categoría de BMI", y = "Actividad Física (min/día)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Descripción: Este gráfico muestra el nivel de actividad física (en minutos por día) para diferentes categorías de BMI: “Normal”, “Normal Weight”, “Obese” y “Overweight”.

  • Análisis: Las personas con un BMI “Normal” tienden a tener un nivel de actividad física más alto. Las categorías “Obese” y “Overweight” muestran niveles de actividad física más bajos. La categoría “Normal Weight” tiene un nivel de actividad física intermedio.

  • Conclusión: Existe una correlación inversa entre el BMI y el nivel de actividad física: a mayor BMI, menor actividad física. Esto sugiere que el aumento de peso puede estar relacionado con un estilo de vida más sedentario.

Distribución de Trastornos del Sueño por Categoría de BMI

# Gráfico: Distribución de Trastornos del Sueño por Categoría de BMI
ggplot(data_base, aes(x = BMI.Category, fill = Sleep.Disorder)) +
  geom_bar(position = "fill") +
  labs(title = "Distribución de Trastornos del Sueño por Categoría de BMI",
       x = "Categoría de BMI", y = "Proporción") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Descripción: Este gráfico muestra la proporción de trastornos del sueño (“Insomnia”, “None”, “Sleep Apnea”) en diferentes categorías de BMI.

  • Análisis: La categoría “Obese” tiene una mayor proporción de trastornos del sueño, especialmente “Sleep Apnea”. La categoría “Normal” tiene una mayor proporción de personas sin trastornos del sueño (“None”). La categoría “Overweight” muestra una distribución intermedia, con una presencia significativa de “Insomnia”.

  • Conclusión: El BMI está relacionado con la presencia de trastornos del sueño, especialmente en personas con sobrepeso y obesidad. La apnea del sueño es más común en personas obesas, mientras que el insomnio es más frecuente en personas con sobrepeso.

Matriz de Correlación

# Matriz de correlación
numeric_vars <- c("Sleep.Duration", "Quality.of.Sleep",
                  "Physical.Activity.Level", "Stress.Level",
                  "Heart.Rate", "Daily.Steps")

# Calcular la matriz de correlación
corr_matrix <- cor(data_base[, numeric_vars], use = "complete.obs")

# Visualizar la matriz de correlación
ggcorrplot(corr_matrix, lab = TRUE, type = "lower", colors = c("blue", "white", "red"))

  • Descripción: Este gráfico muestra la correlación entre varias variables numéricas: “Heart.Rate”, “Stress.Level”, “Physical.Activity.Level”, “Quality.of.Sleep”, “Sleep.Duration”.

  • Análisis:

– Sleep.Duration tiene una correlación positiva fuerte con Quality.of.Sleep (0.88), lo que indica que una mayor duración del sueño está asociada con una mejor calidad del sueño.

– Stress.Level tiene una correlación negativa moderada con Quality.of.Sleep (-0.66), lo que sugiere que un mayor estrés está asociado con una peor calidad del sueño.

– Physical.Activity.Level tiene una correlación positiva débil con Quality.of.Sleep (0.19), lo que indica que la actividad física puede tener un impacto positivo en la calidad del sueño, aunque no muy fuerte.

– Heart.Rate no muestra una correlación significativa con otras variables.

  • Conclusión: La duración y la calidad del sueño están fuertemente relacionadas. El estrés es un factor importante que afecta negativamente la calidad del sueño. La actividad física puede tener un impacto positivo en la calidad del sueño, aunque no es el factor más determinante.

Conclusiones Generales

  1. Género y Sueño: Las mujeres tienden a dormir ligeramente más que los hombres, pero las diferencias no son muy significativas. Es importante investigar otros factores como la calidad del sueño y los trastornos asociados para entender mejor estas diferencias.

  2. BMI y Actividad Física: Las personas con un BMI más alto tienden a tener un nivel de actividad física más bajo. Esto sugiere que el aumento de peso puede estar relacionado con un estilo de vida más sedentario.

  3. BMI y Trastornos del Sueño: Las personas con sobrepeso y obesidad tienen una mayor prevalencia de trastornos del sueño, especialmente apnea del sueño e insomnio. Esto indica que el control del peso puede ser importante para prevenir estos trastornos.

  4. Correlaciones entre Variables: La duración y la calidad del sueño están fuertemente relacionadas. El estrés es un factor importante que afecta negativamente la calidad del sueño. La actividad física tiene un impacto positivo, aunque no muy fuerte, en la calidad del sueño.

Asociación entre Variables Categóricas (Chi-Cuadrado)

table_bmi_sleep <- table(data_base$BMI.Category, data_base$Sleep.Disorder)
chisq.test(table_bmi_sleep)

    Pearson's Chi-squared test

data:  table_bmi_sleep
X-squared = 246.97, df = 6, p-value < 2.2e-16

Análisis

Resultado:

– X-squared =246.97 (valor de la prueba muy alto).

– df=6 (grados de libertad).

– p<2.2e−16 (altamente significativo).

– Interpretación:

Este resultado indica que hay una relación significativa entre el índice de masa corporal (BMI) y la presencia de trastornos del sueño.

Un p<0.05 implica que la relación observada no es producto del azar.La obesidad y el sobrepeso han sido relacionados con problemas del sueño como la apnea del sueño y el insomnio. En este dataset, las personas con BMI más alto parecen tener una mayor incidencia de trastornos del sueño.

Resumen estadístico entre variables

[1] "Resumen estadístico por Género:"
Gender Avg_Sleep_Duration Median_Sleep_Duration SD_Sleep_Duration Min_Sleep_Duration Max_Sleep_Duration Avg_Quality_of_Sleep Median_Quality_of_Sleep SD_Quality_of_Sleep Min_Quality_of_Sleep Max_Quality_of_Sleep Avg_Physical_Activity Median_Physical_Activity SD_Physical_Activity Min_Physical_Activity Max_Physical_Activity Avg_Stress_Level Median_Stress_Level SD_Stress_Level Min_Stress_Level Max_Stress_Level
Female 7.229730 7.2 0.8794344 5.8 8.5 7.664865 8 1.2794819 4 9 59.14054 60 21.01764 30 90 4.675676 4 1.911835 3 8
Male 7.036508 7.2 0.6931968 5.9 8.1 6.968254 7 0.9994933 4 9 59.20106 60 20.70209 30 90 6.079365 6 1.300183 3 8
[1] "Resumen estadístico por Categoría de BMI:"
BMI.Category Avg_Sleep_Duration Median_Sleep_Duration SD_Sleep_Duration Min_Sleep_Duration Max_Sleep_Duration Avg_Quality_of_Sleep Median_Quality_of_Sleep SD_Quality_of_Sleep Min_Quality_of_Sleep Max_Quality_of_Sleep Avg_Physical_Activity Median_Physical_Activity SD_Physical_Activity Min_Physical_Activity Max_Physical_Activity Avg_Stress_Level Median_Stress_Level SD_Stress_Level Min_Stress_Level Max_Stress_Level
Normal 7.393846 7.5 0.7320801 6.0 8.5 7.661538 8 0.9461303 6 9 57.69231 60 21.89614 30 90 5.128205 5 1.605074 3 8
Normal Weight 7.333333 7.3 0.5850926 6.4 8.2 7.428571 8 1.3989792 5 9 60.33333 60 16.75808 35 90 5.190476 6 1.503963 3 7
Obese 6.960000 7.3 0.8834277 5.9 8.1 6.400000 7 1.8973666 4 9 55.00000 60 21.47350 30 85 5.700000 5 1.946507 3 8
Overweight 6.770270 6.5 0.7577679 5.8 8.2 6.898649 6 1.2548673 4 9 61.23649 45 19.83173 30 90 5.729730 7 1.957350 3 8

Distribución de Variables Categóricas

  • Género: La cantidad de hombres y mujeres en la muestra es muy similar.

  • Categoría de IMC: La mayoría de los individuos tienen un IMC normal, mientras que las categorías de “peso normal”, “obesidad” y “sobrepeso” tienen menos frecuencia.

  • Trastorno del Sueño: La mayoría de las personas no presentan trastornos del sueño. La segunda categoría más común es el insomnio, seguida de la apnea del sueño.

Estadísticas del Sueño por Género

  • Duración promedio del sueño: Las mujeres duermen en promedio 7.23 horas, mientras que los hombres 7.04 horas.

  • Calidad del sueño: Las mujeres tienen una calidad de sueño promedio de 7.66, mayor que la de los hombres (6.97).

  • Variabilidad: La desviación estándar es mayor en mujeres (0.87) que en hombres (0.69), lo que sugiere una mayor variabilidad en la duración del sueño de las mujeres.

  • Límites: El mínimo y máximo de sueño son similares en ambos géneros (~5.8-8.5 horas en mujeres, ~5.9-8.1 horas en hombres).

Estadísticas del Sueño por Categoría de IMC

  • Duración del sueño: El grupo con IMC normal tiene la mayor duración promedio de sueño (7.39 horas). Las personas con sobrepeso duermen menos (6.77 horas).

  • Calidad del sueño: La calidad del sueño disminuye con el aumento del IMC. El grupo con IMC normal tiene la mejor calidad de sueño (7.66), mientras que los obesos tienen la más baja (6.40).

  • Variabilidad: Las personas con obesidad tienen la mayor variabilidad en la duración del sueño (0.83), lo que indica diferencias individuales más grandes dentro de este grupo. Mínimos y máximos: -Los valores mínimos son más bajos en personas con sobrepeso y obesidad (~5.8-5.9 horas). -Los valores máximos son similares en todos los grupos (~8.1-8.5 horas).

Valores faltantes

# 2. Verificar y contar valores NA
na_count <- colSums(is.na(data_base))
print("Cantidad de valores NA por columna:")
[1] "Cantidad de valores NA por columna:"
print(na_count)
              Person.ID                  Gender                     Age              Occupation          Sleep.Duration        Quality.of.Sleep Physical.Activity.Level            Stress.Level 
                      0                       0                       0                       0                       0                       0                       0                       0 
           BMI.Category          Blood.Pressure              Heart.Rate             Daily.Steps          Sleep.Disorder 
                      0                       0                       0                       0                       0 

Análisis

No hay valores NA en ninguna columna, lo que indica que los datos están completos y no requieren imputación.

Normalidad

shapiro_results <- sapply(data_base[numeric_vars], function(x) shapiro.test(x)$p.value)
shapiro_results <- data.frame(Variable = names(shapiro_results), P_value = shapiro_results)
shapiro_results
                                       Variable      P_value
Sleep.Duration                   Sleep.Duration 1.267828e-11
Quality.of.Sleep               Quality.of.Sleep 1.881529e-15
Physical.Activity.Level Physical.Activity.Level 5.176356e-15
Stress.Level                       Stress.Level 1.112608e-15
Heart.Rate                           Heart.Rate 2.684952e-16
Daily.Steps                         Daily.Steps 1.653179e-11

Análisis

La prueba de Shapiro-Wilk se utiliza para evaluar si una muestra sigue una distribución normal.

Hipótesis:

  • Hipótesis nula (H_0): Los datos de la variable siguen una distribución normal.

  • Hipótesis alternativa (H_1): Los datos de la variable no siguen una distribución normal.

Interpretación de los Resultados

  • El p-valor obtenido para cada variable es extremadamente pequeño dado que:

  • Un p-valor menor que el nivel de significancia comúnmente usado (α =0.05 α=0.05) indica rechazo de la hipótesis nula.

  • En este caso, todas las variables tienen p-valores cercanos a 0, lo que significa que rechazamos la hipótesis nula para todas ellas.