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