1. Exploración Analítica de Datos (EDA)

1.1. Carga y preparación del conjunto de datos

# Cargar las librerías necesarias
library(readxl)
library(tidyverse)
library(janitor)
library(plotly)

# Cargar el archivo, limpiar nombres y convertir horas de sueño a números
datos_sueño <- read_excel("Sleep_health_and_lifestyle_dataset.xlsx") %>%
  clean_names() %>%
  mutate(sleep_duration = as.numeric(sleep_duration)) # Esta es la nueva línea de solución

# Mostrar las primeras 5 filas para verificar la carga
head(datos_sueño, 5)

1.2. Descripción y estructura de las variables

# Revisar la estructura general del dataframe (tabla de datos)
glimpse(datos_sueño)
## Rows: 374
## Columns: 13
## $ person_id               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ gender                  <chr> "Male", "Male", "Male", "Male", "Male", "Male"…
## $ age                     <dbl> 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29…
## $ occupation              <chr> "Software Engineer", "Doctor", "Doctor", "Sale…
## $ sleep_duration          <dbl> 6.1, 6.2, 6.2, 5.9, 5.9, 5.9, 6.3, 7.8, 7.8, 7…
## $ quality_of_sleep        <dbl> 6, 6, 6, 4, 4, 4, 6, 7, 7, 7, 6, 7, 6, 6, 6, 6…
## $ physical_activity_level <dbl> 42, 60, 60, 30, 30, 30, 40, 75, 75, 75, 30, 75…
## $ stress_level            <dbl> 6, 8, 8, 8, 8, 8, 7, 6, 6, 6, 8, 6, 8, 8, 8, 8…
## $ bmi_category            <chr> "Overweight", "Normal", "Normal", "Obese", "Ob…
## $ blood_pressure          <chr> "126/83", "125/80", "125/80", "140/90", "140/9…
## $ heart_rate              <dbl> 77, 75, 75, 85, 85, 85, 82, 70, 70, 70, 70, 70…
## $ daily_steps             <dbl> 4200, 10000, 10000, 3000, 3000, 3000, 3500, 80…
## $ sleep_disorder          <dbl> 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…

1.3. Exploración visual interactiva

Gráfico A: Duración del sueño según la ocupación

grafico_1 <- ggplot(datos_sueño, aes(x = reorder(occupation, sleep_duration), y = sleep_duration, fill = occupation)) +
  geom_boxplot() +
  coord_flip() +
  theme_minimal() +
  labs(title = "Distribución de la Duración del Sueño por Ocupación",
       x = "Ocupación",
       y = "Duración del Sueño (Horas)") +
  theme(legend.position = "none")

# Convertir a gráfico interactivo
ggplotly(grafico_1)

Gráfico B: Relación entre Nivel de Estrés y Calidad del Sueño

grafico_2 <- ggplot(datos_sueño, aes(x = as.factor(stress_level), y = quality_of_sleep, color = as.factor(stress_level))) +
  geom_jitter(width = 0.2, alpha = 0.7, size = 2) +
  theme_minimal() +
  labs(title = "Impacto del Estrés en la Calidad del Sueño",
       x = "Nivel de Estrés (Escala)",
       y = "Calidad del Sueño",
       color = "Nivel de Estrés")

ggplotly(grafico_2)

Gráfico C: Presencia de Trastornos del Sueño por Categoría de IMC

# Pre-procesar los datos para contar los casos
conteo_trastornos <- datos_sueño %>%
  mutate(sleep_disorder = ifelse(sleep_disorder == 1, "Con Trastorno", "Sin Trastorno")) %>%
  count(bmi_category, sleep_disorder)

grafico_3 <- ggplot(conteo_trastornos, aes(x = bmi_category, y = n, fill = sleep_disorder)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal() +
  labs(title = "Trastornos del Sueño según Categoría de IMC",
       x = "Categoría de IMC",
       y = "Número de Personas",
       fill = "Estado Clínico") +
  scale_fill_manual(values = c("Con Trastorno" = "#E07A5F", "Sin Trastorno" = "#81B29A"))

ggplotly(grafico_3)