Análisis Univariado de Variables Numéricas

library(tidyverse)
library(moments)  # para skewness y kurtosis

library(readxl)  # Si estás leyendo un archivo .xlsx

datos <- read_excel("analisis_app_bienestar_con_atipicos.xlsx")

1. Resumen Estadístico

numericas <- datos %>%
  select(where(is.numeric)) %>%
  select(-ID)
summary(numericas)
##       Edad       Horas de uso semanal Sesiones semanales
##  Min.   :18.00   Min.   : 0.500       Min.   : 1.00     
##  1st Qu.:27.25   1st Qu.: 7.925       1st Qu.: 9.00     
##  Median :36.00   Median : 9.750       Median :12.00     
##  Mean   :35.78   Mean   :10.196       Mean   :13.86     
##  3rd Qu.:45.00   3rd Qu.:11.000       3rd Qu.:16.75     
##  Max.   :55.00   Max.   :50.000       Max.   :70.00     
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   :  5.10                     Min.   : 2.00               
##  1st Qu.: 12.25                     1st Qu.: 4.00               
##  Median : 14.00                     Median : 7.00               
##  Mean   : 16.67                     Mean   : 6.72               
##  3rd Qu.: 18.00                     3rd Qu.: 9.00               
##  Max.   :120.00                     Max.   :10.00               
##  Nivel de estrés (1-10)
##  Min.   : 1.00         
##  1st Qu.: 3.00         
##  Median : 5.00         
##  Mean   : 5.16         
##  3rd Qu.: 7.00         
##  Max.   :10.00

2. Sesgo y Curtosis

sk <- sapply(numericas, skewness, na.rm = TRUE)
kt <- sapply(numericas, kurtosis, na.rm = TRUE)
forma <- data.frame(Sesgo = sk, Curtosis = kt)
forma
##                                          Sesgo  Curtosis
## Edad                                0.06994668  1.842531
## Horas de uso semanal                4.19970119 25.172020
## Sesiones semanales                  3.48593747 17.607808
## Duración promedio por sesión (min)  5.84283600 39.202242
## Nivel de satisfacción (1-10)       -0.08458916  1.765692
## Nivel de estrés (1-10)              0.22688999  1.835927

3. Histogramas con Curvas de Densidad

numericas %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Valor)) +
  geom_histogram(aes(y = after_stat(density)), bins = 20, fill = "lightblue", color = "black") +
  geom_density(color = "red", linewidth = 1) +
  facet_wrap(~Variable, scales = "free") +
  labs(title = "Histogramas con curvas de densidad", x = "", y = "Densidad")

Boxplots para Detección de Outliers

numericas %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Variable, y = Valor)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Boxplots por variable", x = "", y = "") +
  coord_flip()

Dispersión: Estrés vs Satisfacción

ggplot(datos, aes(x = `Nivel de estrés (1-10)`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "darkblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Estrés vs Satisfacción", x = "Estrés", y = "Satisfacción")
## `geom_smooth()` using formula = 'y ~ x'

Análisis de Variables Categóricas

library(tidyverse)

Tablas de frecuencia

categoricas <- datos %>%
  select(where(is.character), where(is.factor))

lapply(categoricas, table)
## $Género
## 
##          Femenino         Masculino        No binario Prefiere no decir 
##                14                12                11                13 
## 
## $Ocupación
## 
##   Ama de casa   Desempleado    Estudiante Independiente   Profesional 
##             7             9             8            10            16 
## 
## $Ciudad
## 
## Barranquilla       Bogotá         Cali    Cartagena     Medellín 
##           11           10           11            7           11 
## 
## $`Frecuencia uso herramientas`
## 
##  Alta  Baja Media 
##    21    15    14 
## 
## $`Motivación principal`
## 
##       Ansiedad/Estrés         Mejorar sueño Organización personal 
##                    10                    14                     9 
##                  Otro         Productividad 
##                     7                    10 
## 
## $`Contenido favorito`
## 
##  Diario emocional  Listas de tareas Meditación guiada  Música relajante 
##                 5                11                 9                12 
## Videos educativos 
##                13

Gráficos de barras

categoricas %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  ggplot(aes(x = fct_infreq(Categoría), fill = Variable)) +
  geom_bar(show.legend = FALSE) +
  facet_wrap(~Variable, scales = "free") +
  coord_flip() +
  labs(title = "Distribución de variables categóricas", x = "", y = "Frecuencia")

Diagramas circulares

categoricas %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  count(Variable, Categoría) %>%
  group_by(Variable) %>%
  mutate(pct = n / sum(n)) %>%
  ggplot(aes(x = "", y = pct, fill = Categoría)) +
  geom_col(width = 1) +
  coord_polar("y") +
  facet_wrap(~Variable) +
  theme_void() +
  labs(title = "Diagramas circulares de variables categóricas")

Tablas cruzadas - Posiblemente no usar

# Ocupación vs Motivación principal
table(datos$Ocupación, datos$`Motivación principal`)
##                
##                 Ansiedad/Estrés Mejorar sueño Organización personal Otro
##   Ama de casa                 1             3                     2    0
##   Desempleado                 2             2                     2    1
##   Estudiante                  3             2                     2    1
##   Independiente               1             4                     2    2
##   Profesional                 3             3                     1    3
##                
##                 Productividad
##   Ama de casa               1
##   Desempleado               2
##   Estudiante                0
##   Independiente             1
##   Profesional               6

Análisis Multivariado - Esto se usara para el analisis de grupos

library(tidyverse)
library(GGally)  # para matriz de correlación visual

Diagramas de dispersión

ggplot(datos, aes(x = `Nivel de estrés (1-10)`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "darkblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Estrés vs Satisfacción", x = "Estrés", y = "Satisfacción")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(datos, aes(x = `Horas de uso semanal`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "darkgreen") +
  geom_smooth(method = "lm", se = FALSE, color = "orange") +
  labs(title = "Horas de uso vs Satisfacción", x = "Horas de uso", y = "Satisfacción")
## `geom_smooth()` using formula = 'y ~ x'

Tablas de contingencia (categóricas)

# Género vs Contenido favorito
table(datos$Género, datos$`Contenido favorito`)
##                    
##                     Diario emocional Listas de tareas Meditación guiada
##   Femenino                         3                3                 2
##   Masculino                        0                2                 5
##   No binario                       2                2                 1
##   Prefiere no decir                0                4                 1
##                    
##                     Música relajante Videos educativos
##   Femenino                         4                 2
##   Masculino                        2                 3
##   No binario                       2                 4
##   Prefiere no decir                4                 4
# Ocupación vs Frecuencia uso herramientas
table(datos$Ocupación, datos$`Frecuencia uso herramientas`)
##                
##                 Alta Baja Media
##   Ama de casa      2    0     5
##   Desempleado      2    5     2
##   Estudiante       5    2     1
##   Independiente    5    2     3
##   Profesional      7    6     3

Análisis Especial: Grupo A - Estudiantes

library(tidyverse)

Filtrar estudiantes

estudiantes <- datos %>%
  filter(Ocupación == "Estudiante")

Resumen estadístico para estudiantes (variables numéricas)

estudiantes %>%
  select(where(is.numeric)) %>%
  summary()
##        ID              Edad       Horas de uso semanal Sesiones semanales
##  Min.   :227197   Min.   :19.00   Min.   : 5.60        Min.   : 8.00     
##  1st Qu.:396184   1st Qu.:22.50   1st Qu.: 7.45        1st Qu.:10.50     
##  Median :728923   Median :28.00   Median : 9.25        Median :13.50     
##  Mean   :607064   Mean   :29.75   Mean   : 8.95        Mean   :13.75     
##  3rd Qu.:785765   3rd Qu.:34.00   3rd Qu.:10.93        3rd Qu.:17.25     
##  Max.   :845700   Max.   :47.00   Max.   :11.00        Max.   :20.00     
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   : 5.10                      Min.   : 4.000              
##  1st Qu.:10.10                      1st Qu.: 4.750              
##  Median :14.40                      Median : 6.500              
##  Mean   :14.04                      Mean   : 6.375              
##  3rd Qu.:17.43                      3rd Qu.: 7.250              
##  Max.   :24.30                      Max.   :10.000              
##  Nivel de estrés (1-10)
##  Min.   : 3.000        
##  1st Qu.: 4.500        
##  Median : 5.000        
##  Mean   : 5.625        
##  3rd Qu.: 6.500        
##  Max.   :10.000

Distribución de género, ciudad y motivación

estudiantes %>%
  select(Género, Ciudad, `Motivación principal`) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  ggplot(aes(x = fct_infreq(Categoría), fill = Variable)) +
  geom_bar(show.legend = FALSE) +
  facet_wrap(~Variable, scales = "free") +
  coord_flip() +
  labs(title = "Distribución de variables categóricas - Estudiantes", x = "", y = "Frecuencia")

Nivel de satisfacción vs estrés (solo estudiantes)

ggplot(estudiantes, aes(x = `Nivel de estrés (1-10)`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "purple") +
  geom_smooth(method = "lm", se = FALSE, color = "darkred") +
  labs(title = "Estrés vs Satisfacción - Estudiantes", x = "Estrés", y = "Satisfacción")
## `geom_smooth()` using formula = 'y ~ x'

Análisis Especial: Grupo B - Usuarios con Alto Nivel de Estrés (≥ 8)

library(tidyverse)

Filtrar usuarios con alto estrés

alto_estres <- datos %>%
  filter(`Nivel de estrés (1-10)` >= 8)

Resumen estadístico de variables numéricas

alto_estres %>%
  select(where(is.numeric)) %>%
  summary()
##        ID              Edad       Horas de uso semanal Sesiones semanales
##  Min.   :128893   Min.   :22.00   Min.   : 2.000       Min.   : 7.0      
##  1st Qu.:244890   1st Qu.:29.00   1st Qu.: 8.325       1st Qu.:11.5      
##  Median :726937   Median :31.50   Median :10.350       Median :15.0      
##  Mean   :578691   Mean   :33.83   Mean   : 9.500       Mean   :16.5      
##  3rd Qu.:812510   3rd Qu.:37.25   3rd Qu.:11.025       3rd Qu.:15.5      
##  Max.   :956881   Max.   :54.00   Max.   :14.400       Max.   :50.0      
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   : 5.40                      Min.   : 2.00               
##  1st Qu.:13.72                      1st Qu.: 4.00               
##  Median :15.10                      Median : 6.00               
##  Mean   :15.27                      Mean   : 6.25               
##  3rd Qu.:17.10                      3rd Qu.: 8.25               
##  Max.   :22.70                      Max.   :10.00               
##  Nivel de estrés (1-10)
##  Min.   : 8.000        
##  1st Qu.: 8.000        
##  Median : 9.000        
##  Mean   : 8.917        
##  3rd Qu.:10.000        
##  Max.   :10.000

Distribución de ocupación, ciudad y motivación

alto_estres %>%
  select(Ocupación, Ciudad, `Motivación principal`) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  ggplot(aes(x = fct_infreq(Categoría), fill = Variable)) +
  geom_bar(show.legend = FALSE) +
  facet_wrap(~Variable, scales = "free") +
  coord_flip() +
  labs(title = "Distribución de variables categóricas - Alto Estrés", x = "", y = "Frecuencia")

Contenido favorito de usuarios con alto estrés

alto_estres %>%
  count(`Contenido favorito`) %>%
  ggplot(aes(x = reorder(`Contenido favorito`, n), y = n)) +
  geom_col(fill = "salmon") +
  coord_flip() +
  labs(title = "Contenido favorito - Usuarios con alto estrés", x = "Contenido", y = "Cantidad")

Análisis Especial: Grupo C - Usuarios con Alto Uso de la App (> 15 horas/semana)

library(tidyverse)

Filtrar usuarios con alto uso

alto_uso <- datos %>%
  filter(`Horas de uso semanal` > 15)

Resumen estadístico de variables numéricas

alto_uso %>%
  select(where(is.numeric)) %>%
  summary()
##        ID              Edad      Horas de uso semanal Sesiones semanales
##  Min.   :274430   Min.   :25.0   Min.   :25.00        Min.   : 3.00     
##  1st Qu.:321202   1st Qu.:28.5   1st Qu.:31.25        1st Qu.:19.75     
##  Median :367974   Median :32.0   Median :37.50        Median :36.50     
##  Mean   :367974   Mean   :32.0   Mean   :37.50        Mean   :36.50     
##  3rd Qu.:414745   3rd Qu.:35.5   3rd Qu.:43.75        3rd Qu.:53.25     
##  Max.   :461517   Max.   :39.0   Max.   :50.00        Max.   :70.00     
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   : 14.30                     Min.   :3.00                
##  1st Qu.: 40.73                     1st Qu.:3.25                
##  Median : 67.15                     Median :3.50                
##  Mean   : 67.15                     Mean   :3.50                
##  3rd Qu.: 93.58                     3rd Qu.:3.75                
##  Max.   :120.00                     Max.   :4.00                
##  Nivel de estrés (1-10)
##  Min.   :2             
##  1st Qu.:2             
##  Median :2             
##  Mean   :2             
##  3rd Qu.:2             
##  Max.   :2

Distribución de ocupación, ciudad y contenido favorito

alto_uso %>%
  select(Ocupación, Ciudad, `Contenido favorito`) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  ggplot(aes(x = fct_infreq(Categoría), fill = Variable)) +
  geom_bar(show.legend = FALSE) +
  facet_wrap(~Variable, scales = "free") +
  coord_flip() +
  labs(title = "Distribución de variables categóricas - Alto Uso", x = "", y = "Frecuencia")

Horas de uso Vs Nivel de satisfaccion

ggplot(datos, aes(x = `Horas de uso semanal`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "darkgreen") +
  geom_smooth(method = "lm", se = FALSE, color = "orange") +
  labs(title = "Horas de uso vs Satisfacción", x = "Horas de uso", y = "Satisfacción")
## `geom_smooth()` using formula = 'y ~ x'

Análisis Especial: Grupo D - Usuarios cuya motivación principal es “Mejorar sueño”

library(tidyverse)

Filtrar usuarios que buscan mejorar el sueño

sueno <- datos %>%
  filter(`Motivación principal` == "Mejorar sueño")

Resumen estadístico de variables numéricas

sueno %>%
  select(where(is.numeric)) %>%
  summary()
##        ID              Edad       Horas de uso semanal Sesiones semanales
##  Min.   :114112   Min.   :25.00   Min.   : 2.100       Min.   : 5.00     
##  1st Qu.:211929   1st Qu.:29.50   1st Qu.: 7.475       1st Qu.: 9.00     
##  Median :549274   Median :36.00   Median : 8.600       Median :12.00     
##  Mean   :495432   Mean   :36.71   Mean   : 8.950       Mean   :12.14     
##  3rd Qu.:718014   3rd Qu.:44.00   3rd Qu.:10.675       3rd Qu.:16.50     
##  Max.   :999413   Max.   :52.00   Max.   :14.400       Max.   :18.00     
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   : 7.90                      Min.   :2.000               
##  1st Qu.:12.00                      1st Qu.:6.000               
##  Median :15.20                      Median :6.500               
##  Mean   :14.97                      Mean   :6.286               
##  3rd Qu.:18.00                      3rd Qu.:7.000               
##  Max.   :21.80                      Max.   :9.000               
##  Nivel de estrés (1-10)
##  Min.   : 1.000        
##  1st Qu.: 3.000        
##  Median : 4.500        
##  Mean   : 5.214        
##  3rd Qu.: 7.750        
##  Max.   :10.000

Distribución de género, ciudad y contenido favorito

sueno %>%
  select(Género, Ciudad, `Contenido favorito`) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría") %>%
  ggplot(aes(x = fct_infreq(Categoría), fill = Variable)) +
  geom_bar(show.legend = FALSE) +
  facet_wrap(~Variable, scales = "free") +
  coord_flip() +
  labs(title = "Distribución de variables categóricas - Grupo D (Mejorar sueño)", x = "", y = "Frecuencia")

Comparación de satisfacción promedio con el resto

otros <- datos %>%
  filter(`Motivación principal` != "Mejorar sueño")

mean(sueno$`Nivel de satisfacción (1-10)`, na.rm = TRUE)
## [1] 6.285714
mean(otros$`Nivel de satisfacción (1-10)`, na.rm = TRUE)
## [1] 6.888889
# Cargar tidyverse si aún no lo has hecho
library(tidyverse)

# Filtrar usuarios cuyo objetivo es "Mejorar sueño"
grupo_sueno <- datos %>%
  filter(`Motivación principal` == "Mejorar sueño")

# Crear gráfico de barras del nivel de satisfacción
grupo_sueno %>%
  count(`Nivel de satisfacción (1-10)`) %>%
  ggplot(aes(x = factor(`Nivel de satisfacción (1-10)`), y = n)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Nivel de satisfacción - Usuarios que buscan mejorar el sueño",
    x = "Nivel de satisfacción (1-10)",
    y = "Cantidad de usuarios"
  ) +
  theme_minimal()