1. Carga de datos

datos <- read_excel("analisis_app_bienestar_con_atipicos.xlsx")

2. Análisis Univariado

2.1 Resumen estadístico de variables numéricas

# Cargar paquetes si no lo has hecho
library(dplyr)
library(readxl)

# Leer el archivo (ajusta la ruta si es necesario)
datos <- read_excel("analisis_app_bienestar_con_atipicos.xlsx")

# Seleccionar solo variables numéricas (excepto ID si existe)
numericas <- datos %>%
  select(where(is.numeric)) %>%
  select(-ID)

# Calcular resumen personalizado
resumen_estadistico <- numericas %>%
  summarise_all(list(
    Mín = ~min(., na.rm = TRUE),
    Q1 = ~quantile(., 0.25, na.rm = TRUE),
    Mediana = ~median(., na.rm = TRUE),
    Media = ~mean(., na.rm = TRUE),
    Q3 = ~quantile(., 0.75, na.rm = TRUE),
    Máx = ~max(., na.rm = TRUE)
  )) %>%
  pivot_longer(cols = everything(),
               names_to = c("Variable", "Estadística"),
               names_sep = "_") %>%
  pivot_wider(names_from = Estadística, values_from = value) %>%
  select(Variable, Mín, Q1, Mediana, Media, Q3, Máx)

# Redondear
resumen_estadistico <- resumen_estadistico %>%
  mutate(across(where(is.numeric), ~ round(., 2)))

# Mostrar resultado
resumen_estadistico
## # A tibble: 6 × 7
##   Variable                             Mín    Q1 Mediana Media    Q3   Máx
##   <chr>                              <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl>
## 1 Edad                                18   27.2    36    35.8   45      55
## 2 Horas de uso semanal                 0.5  7.93    9.75 10.2   11      50
## 3 Sesiones semanales                   1    9      12    13.9   16.8    70
## 4 Duración promedio por sesión (min)   5.1 12.2    14    16.7   18     120
## 5 Nivel de satisfacción (1-10)         2    4       7     6.72   9      10
## 6 Nivel de estrés (1-10)               1    3       5     5.16   7      10

2.2 Sesgo y curtosis

# Cargar librería necesaria
library(moments)

# Seleccionar variables numéricas
numericas <- datos %>%
  select(where(is.numeric)) %>%
  select(-ID)

# Calcular sesgo y curtosis
sesgos <- sapply(numericas, skewness, na.rm = TRUE)
curtosis <- sapply(numericas, kurtosis, na.rm = TRUE)

# Crear tabla resumen
forma <- data.frame(
  Variable = names(numericas),
  Sesgo = round(sesgos, 2),
  Curtosis = round(curtosis, 2)
)

# Ver resultado
forma
##                                                              Variable Sesgo
## Edad                                                             Edad  0.07
## Horas de uso semanal                             Horas de uso semanal  4.20
## Sesiones semanales                                 Sesiones semanales  3.49
## Duración promedio por sesión (min) Duración promedio por sesión (min)  5.84
## Nivel de satisfacción (1-10)             Nivel de satisfacción (1-10) -0.08
## Nivel de estrés (1-10)                         Nivel de estrés (1-10)  0.23
##                                    Curtosis
## Edad                                   1.84
## Horas de uso semanal                  25.17
## Sesiones semanales                    17.61
## Duración promedio por sesión (min)    39.20
## Nivel de satisfacción (1-10)           1.77
## Nivel de estrés (1-10)                 1.84

2.3 Histogramas y densidades

# Cargar tidyverse si aún no lo has hecho
library(tidyverse)

# Seleccionar variables numéricas (excepto ID si aplica)
numericas <- datos %>%
  select(where(is.numeric)) %>%
  select(-ID)

# Pivotear para graficar todos los histogramas con densidad en facetas
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 por variable",
    x = NULL,
    y = "Densidad"
  ) +
  theme_minimal()

2.4 Boxplots

# Selección de variables numéricas sin ID
numericas <- datos %>%
  select(where(is.numeric)) %>%
  select(-ID)

# Pivotear para graficar todos los boxplots
numericas %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Variable, y = Valor)) +
  geom_boxplot(fill = "lightgreen", color = "black") +
  coord_flip() +
  labs(
    title = "Boxplots por variable numérica",
    x = NULL,
    y = NULL
  ) +
  theme_minimal()


3. Análisis de variables categóricas

# Seleccionar solo variables categóricas
categoricas <- datos %>%
  select(where(is.character), where(is.factor))

# Ver tabla de frecuencias de cada categórica
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

3.1 Grafico 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") +
  theme_minimal()

3.2 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")


4. Análisis por grupos de interés

Grupo A – Estudiantes

# Filtrar solo los registros donde la Ocupación sea "Estudiante"
grupo_a <- datos %>%
  filter(Ocupación == "Estudiante")

# Seleccionar solo las variables numéricas (sin ID si se desea omitir)
grupo_a_numericas <- grupo_a %>%
  select(where(is.numeric))

# Mostrar resumen estadístico
summary(grupo_a_numericas)
##        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
# Filtrar solo estudiantes
estudiantes <- datos %>%
  filter(Ocupación == "Estudiante")

# Seleccionar variables categóricas de interés
categ_estudiantes <- estudiantes %>%
  select(Ciudad, Género, `Motivación principal`) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Categoría")

# Graficar en facetas
ggplot(categ_estudiantes, 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"
  ) +
  theme_minimal()

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

# Gráfico de dispersión con línea de regresión
ggplot(estudiantes, aes(x = `Nivel de estrés (1-10)`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "purple", size = 3, alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, color = "darkred", linewidth = 1) +
  labs(
    title = "Estrés Vs. Satisfacción - Estudiantes",
    x = "Estrés",
    y = "Satisfacción"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Filtrar Grupo A
grupo_a <- datos %>%
  filter(Ocupación == "Estudiante")

# Calcular coeficiente de Spearman
cor.test(grupo_a$`Nivel de estrés (1-10)`, grupo_a$`Nivel de satisfacción (1-10)`, method = "spearman")
## Warning in cor.test.default(grupo_a$`Nivel de estrés (1-10)`, grupo_a$`Nivel de
## satisfacción (1-10)`, : Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  grupo_a$`Nivel de estrés (1-10)` and grupo_a$`Nivel de satisfacción (1-10)`
## S = 90.262, p-value = 0.8607
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## -0.0745471
# Filtrar solo estudiantes
estudiantes <- datos %>%
  filter(Ocupación == "Estudiante")

# Tabla de contingencia
tabla_gc <- table(estudiantes$Género, estudiantes$`Contenido favorito`)
print(tabla_gc)
##                    
##                     Diario emocional Listas de tareas Música relajante
##   Femenino                         1                0                2
##   Masculino                        0                0                0
##   No binario                       1                0                0
##   Prefiere no decir                0                1                1
##                    
##                     Videos educativos
##   Femenino                          1
##   Masculino                         1
##   No binario                        0
##   Prefiere no decir                 0
# Gráfico de barras apiladas
ggplot(estudiantes, aes(x = `Contenido favorito`, fill = Género)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Género vs Contenido favorito – Estudiantes",
    x = "Contenido favorito",
    y = "Frecuencia"
  ) +
  theme_minimal()

Grupo B – Alto estrés

# Filtrar usuarios con nivel de estrés >= 8 (Grupo B)
grupo_b <- datos %>%
  filter(`Nivel de estrés (1-10)` >= 8)

# Seleccionar variables numéricas
grupo_b_numericas <- grupo_b %>%
  select(where(is.numeric))

# Resumen estadístico
summary(grupo_b_numericas)
##        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
# Filtrar usuarios con alto nivel de estrés (Grupo B)
grupo_b <- datos %>%
  filter(`Nivel de estrés (1-10)` >= 8)

# Seleccionar variables categóricas de interés
grupo_b_categoricas <- grupo_b %>%
  select(Ocupación, Ciudad, `Motivación principal`)

# Crear gráfico de barras
grupo_b_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 – Grupo B (Alto Estrés)",
    x = "",
    y = "Frecuencia"
  ) +
  theme_minimal()

# Filtrar Grupo B (estrés ≥ 8)
grupo_b <- datos %>%
  filter(`Nivel de estrés (1-10)` >= 8)

# Gráfico de barras: contenido favorito de usuarios con alto estrés
ggplot(grupo_b, aes(x = fct_infreq(`Contenido favorito`))) +
  geom_bar(fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Contenido favorito de usuarios con alto nivel de estrés",
    x = "Contenido favorito",
    y = "Frecuencia"
  ) +
  theme_minimal()

# Filtrar Grupo B (estrés ≥ 8)
grupo_b <- datos %>%
  filter(`Nivel de estrés (1-10)` >= 8)

# Tabla de contingencia
tabla_b <- table(grupo_b$Ocupación, grupo_b$`Motivación principal`)
print(tabla_b)
##                
##                 Ansiedad/Estrés Mejorar sueño Organización personal
##   Ama de casa                 1             1                     1
##   Estudiante                  1             1                     0
##   Independiente               1             0                     0
##   Profesional                 0             2                     1
##                
##                 Productividad
##   Ama de casa               0
##   Estudiante                0
##   Independiente             1
##   Profesional               2
# Gráfico de barras agrupadas
ggplot(grupo_b, aes(x = `Motivación principal`, fill = Ocupación)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Ocupación vs Motivación principal – Grupo B (Alto estrés)",
    x = "Motivación principal",
    y = "Frecuencia"
  ) +
  theme_minimal()

Grupo C – Alto uso

# Filtrar Grupo C: usuarios con más de 15 horas de uso semanal
grupo_c <- datos %>% filter(`Horas de uso semanal` > 12)

# Seleccionar variables numéricas
grupo_c_numericas <- grupo_c %>%
  select(where(is.numeric)) %>%
  select(-ID)

# Mostrar resumen estadístico
summary(grupo_c_numericas)
##       Edad       Horas de uso semanal Sesiones semanales
##  Min.   :25.00   Min.   :12.20        Min.   : 3.00     
##  1st Qu.:29.00   1st Qu.:12.50        1st Qu.:11.00     
##  Median :39.00   Median :13.10        Median :13.00     
##  Mean   :38.78   Mean   :18.52        Mean   :18.11     
##  3rd Qu.:51.00   3rd Qu.:14.40        3rd Qu.:17.00     
##  Max.   :54.00   Max.   :50.00        Max.   :70.00     
##  Duración promedio por sesión (min) Nivel de satisfacción (1-10)
##  Min.   :  8.90                     Min.   : 3                  
##  1st Qu.: 13.90                     1st Qu.: 4                  
##  Median : 15.90                     Median : 8                  
##  Mean   : 27.06                     Mean   : 7                  
##  3rd Qu.: 19.70                     3rd Qu.: 9                  
##  Max.   :120.00                     Max.   :10                  
##  Nivel de estrés (1-10)
##  Min.   : 2.000        
##  1st Qu.: 2.000        
##  Median : 3.000        
##  Mean   : 4.222        
##  3rd Qu.: 4.000        
##  Max.   :10.000
grupo_c <- datos %>%
  filter(`Horas de uso semanal` > 12)

# Seleccionar variables categóricas relevantes
grupo_c_categoricas <- grupo_c %>%
  select(Ocupación, Ciudad, `Contenido favorito`)

# Transformar y graficar
grupo_c_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 – Grupo C (Uso > 12 horas/semana)",
    x = "Categoría",
    y = "Frecuencia"
  ) +
  theme_minimal()

# Filtrar Grupo C: usuarios con más de 12 horas de uso semanal
grupo_c <- datos %>% filter(`Horas de uso semanal` > 12)

# Gráfico: Horas de uso semanal vs Nivel de satisfacción
ggplot(grupo_c, aes(x = `Horas de uso semanal`, y = `Nivel de satisfacción (1-10)`)) +
  geom_point(color = "darkgreen", size = 3, alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, color = "orange", linewidth = 1) +
  labs(
    title = "Relación entre horas de uso semanal y satisfacción – Grupo C",
    x = "Horas de uso semanal",
    y = "Nivel de satisfacción (1-10)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Filtrar Grupo C
grupo_c <- datos %>% filter(`Horas de uso semanal` > 12)

# Calcular coeficiente de Spearman
cor.test(grupo_c$`Horas de uso semanal`, grupo_c$`Nivel de satisfacción (1-10)`, method = "spearman")
## Warning in cor.test.default(grupo_c$`Horas de uso semanal`, grupo_c$`Nivel de
## satisfacción (1-10)`, : Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  grupo_c$`Horas de uso semanal` and grupo_c$`Nivel de satisfacción (1-10)`
## S = 197.96, p-value = 0.05824
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## -0.6496676
# Filtrar Grupo C (uso > 12 horas semanales)
grupo_c <- datos %>% filter(`Horas de uso semanal` > 12)

# Tabla de contingencia
table(grupo_c$Género, grupo_c$`Frecuencia uso herramientas`)
##                    
##                     Alta Baja Media
##   Femenino             1    0     1
##   Masculino            0    2     0
##   No binario           3    0     0
##   Prefiere no decir    0    0     2
# Gráfico de barras
ggplot(grupo_c, aes(x = `Frecuencia uso herramientas`, fill = Género)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Frecuencia de uso de herramientas por género – Grupo C",
    x = "Frecuencia de uso",
    y = "Cantidad de usuarios"
  ) +
  theme_minimal()

Matriz de covarianza

# Seleccionar variables numéricas relevantes
vars <- c("Edad",
          "Horas de uso semanal",
          "Sesiones semanales",
          "Duración promedio por sesión (min)",
          "Nivel de satisfacción (1-10)",
          "Nivel de estrés (1-10)")

# Subconjunto con las variables
datos_numericos <- datos[vars]

# Asegurar que todas sean numéricas
datos_numericos <- as.data.frame(lapply(datos_numericos, as.numeric))

# Calcular matriz de covarianza
matriz_covarianza <- cov(datos_numericos, use = "complete.obs")

# Mostrar
print(matriz_covarianza)
##                                          Edad Horas.de.uso.semanal
## Edad                               109.930204            -1.658041
## Horas.de.uso.semanal                -1.658041            46.191004
## Sesiones.semanales                 -25.643673            38.197388
## Duración.promedio.por.sesión..min.  10.601429            29.933551
## Nivel.de.satisfacción..1.10.         4.263673            -3.323592
## Nivel.de.estrés..1.10.              -2.433469            -3.601388
##                                    Sesiones.semanales
## Edad                                        -25.64367
## Horas.de.uso.semanal                         38.19739
## Sesiones.semanales                          117.79633
## Duración.promedio.por.sesión..min.          -25.44306
## Nivel.de.satisfacción..1.10.                 -5.59102
## Nivel.de.estrés..1.10.                       -1.56898
##                                    Duración.promedio.por.sesión..min.
## Edad                                                        10.601429
## Horas.de.uso.semanal                                        29.933551
## Sesiones.semanales                                         -25.443061
## Duración.promedio.por.sesión..min.                         246.197245
## Nivel.de.satisfacción..1.10.                                -8.749388
## Nivel.de.estrés..1.10.                                      -6.105306
##                                    Nivel.de.satisfacción..1.10.
## Edad                                                  4.2636735
## Horas.de.uso.semanal                                 -3.3235918
## Sesiones.semanales                                   -5.5910204
## Duración.promedio.por.sesión..min.                   -8.7493878
## Nivel.de.satisfacción..1.10.                          5.3485714
## Nivel.de.estrés..1.10.                                0.2497959
##                                    Nivel.de.estrés..1.10.
## Edad                                           -2.4334694
## Horas.de.uso.semanal                           -3.6013878
## Sesiones.semanales                             -1.5689796
## Duración.promedio.por.sesión..min.             -6.1053061
## Nivel.de.satisfacción..1.10.                    0.2497959
## Nivel.de.estrés..1.10.                          7.6065306

Matriz de correlación

vars <- c("Edad",
          "Horas de uso semanal",
          "Sesiones semanales",
          "Duración promedio por sesión (min)",
          "Nivel de satisfacción (1-10)",
          "Nivel de estrés (1-10)")

datos_numericos <- datos[vars]

datos_numericos <- as.data.frame(lapply(datos_numericos, as.numeric))

matriz_correlacion <- cor(datos_numericos, use = "complete.obs")

print(matriz_correlacion)
##                                           Edad Horas.de.uso.semanal
## Edad                                1.00000000          -0.02326794
## Horas.de.uso.semanal               -0.02326794           1.00000000
## Sesiones.semanales                 -0.22534911           0.51783224
## Duración.promedio.por.sesión..min.  0.06444130           0.28069711
## Nivel.de.satisfacción..1.10.        0.17583548          -0.21145116
## Nivel.de.estrés..1.10.             -0.08415386          -0.19213119
##                                    Sesiones.semanales
## Edad                                       -0.2253491
## Horas.de.uso.semanal                        0.5178322
## Sesiones.semanales                          1.0000000
## Duración.promedio.por.sesión..min.         -0.1494039
## Nivel.de.satisfacción..1.10.               -0.2227441
## Nivel.de.estrés..1.10.                     -0.0524153
##                                    Duración.promedio.por.sesión..min.
## Edad                                                        0.0644413
## Horas.de.uso.semanal                                        0.2806971
## Sesiones.semanales                                         -0.1494039
## Duración.promedio.por.sesión..min.                          1.0000000
## Nivel.de.satisfacción..1.10.                               -0.2411111
## Nivel.de.estrés..1.10.                                     -0.1410823
##                                    Nivel.de.satisfacción..1.10.
## Edad                                                 0.17583548
## Horas.de.uso.semanal                                -0.21145116
## Sesiones.semanales                                  -0.22274415
## Duración.promedio.por.sesión..min.                  -0.24111108
## Nivel.de.satisfacción..1.10.                         1.00000000
## Nivel.de.estrés..1.10.                               0.03916275
##                                    Nivel.de.estrés..1.10.
## Edad                                          -0.08415386
## Horas.de.uso.semanal                          -0.19213119
## Sesiones.semanales                            -0.05241530
## Duración.promedio.por.sesión..min.            -0.14108230
## Nivel.de.satisfacción..1.10.                   0.03916275
## Nivel.de.estrés..1.10.                         1.00000000

Matriz de correlación

# Seleccionar variables numéricas
vars_numericas <- c("Edad",
                    "Horas de uso semanal",
                    "Sesiones semanales",
                    "Duración promedio por sesión (min)",
                    "Nivel de satisfacción (1-10)",
                    "Nivel de estrés (1-10)")

# Filtrar datos completos
datos_numericos <- na.omit(datos[, vars_numericas])

# Función personalizada para la diagonal con boxplot
my_diag_box <- function(data, mapping, ...) {
  ggplot(data = data, mapping = mapping) +
    geom_boxplot(fill = "skyblue", color = "black", ...)
}

# Crear matriz de gráficos con boxplot en la diagonal
ggpairs(datos_numericos,
        diag = list(continuous = my_diag_box),
        upper = list(continuous = wrap("cor", size = 4)),
        lower = list(continuous = wrap("points", alpha = 0.5, color = "palegreen4")))

Analisis - kernelS

# Variables numéricas que nos interesan
vars <- c("Edad",
          "Horas de uso semanal",
          "Sesiones semanales",
          "Duración promedio por sesión (min)",
          "Nivel de satisfacción (1-10)",
          "Nivel de estrés (1-10)")

# Convertir a numéricas por si acaso
datos[vars] <- lapply(datos[vars], as.numeric)

# Extraer la fila 15
registro15 <- datos[15, ]

# Estimar la densidad kernel univariada en cada valor
for (v in vars) {
  x <- datos[[v]]
  punto <- registro15[[v]]
  
  cat("\n--- Variable:", v, "---\n")
  
  # Kernel rectangular
  d_rect <- density(x, kernel = "rectangular")
  valor_rect <- approx(d_rect$x, d_rect$y, xout = punto)$y
  cat("Densidad (kernel rectangular):", valor_rect, "\n")
  
  # Kernel triangular
  d_tri <- density(x, kernel = "triangular")
  valor_tri <- approx(d_tri$x, d_tri$y, xout = punto)$y
  cat("Densidad (kernel triangular):", valor_tri, "\n")
  
  # Kernel gaussiano
  d_gauss <- density(x, kernel = "gaussian")
  valor_gauss <- approx(d_gauss$x, d_gauss$y, xout = punto)$y
  cat("Densidad (kernel gaussiano):", valor_gauss, "\n")
}
## 
## --- Variable: Edad ---
## Densidad (kernel rectangular): 0.02542061 
## Densidad (kernel triangular): 0.02798517 
## Densidad (kernel gaussiano): 0.02737473 
## 
## --- Variable: Horas de uso semanal ---
## Densidad (kernel rectangular): 0.1184507 
## Densidad (kernel triangular): 0.1307555 
## Densidad (kernel gaussiano): 0.1321494 
## 
## --- Variable: Sesiones semanales ---
## Densidad (kernel rectangular): 0.04830148 
## Densidad (kernel triangular): 0.04569737 
## Densidad (kernel gaussiano): 0.04558015 
## 
## --- Variable: Duración promedio por sesión (min) ---
## Densidad (kernel rectangular): 0.07323528 
## Densidad (kernel triangular): 0.08030916 
## Densidad (kernel gaussiano): 0.08074128 
## 
## --- Variable: Nivel de satisfacción (1-10) ---
## Densidad (kernel rectangular): 0.1152459 
## Densidad (kernel triangular): 0.1353894 
## Densidad (kernel gaussiano): 0.1315706 
## 
## --- Variable: Nivel de estrés (1-10) ---
## Densidad (kernel rectangular): 0.081121 
## Densidad (kernel triangular): 0.1035292 
## Densidad (kernel gaussiano): 0.1003958

Rostros de chernoff

vars <- c("Edad",
          "Horas de uso semanal",
          "Sesiones semanales",
          "Duración promedio por sesión (min)",
          "Nivel de satisfacción (1-10)",
          "Nivel de estrés (1-10)")

datos_numericos <- datos[vars]
datos_numericos <- as.data.frame(lapply(datos_numericos, as.numeric))

datos_numericos <- na.omit(datos_numericos)

faces(datos_numericos[1:9, ],
      face.type = 1,
      labels = paste("ID", 1:9),
      main = "Rostros de Chernoff")

## effect of variables:
##  modified item       Var                                 
##  "height of face   " "Edad"                              
##  "width of face    " "Horas.de.uso.semanal"              
##  "structure of face" "Sesiones.semanales"                
##  "height of mouth  " "Duración.promedio.por.sesión..min."
##  "width of mouth   " "Nivel.de.satisfacción..1.10."      
##  "smiling          " "Nivel.de.estrés..1.10."            
##  "height of eyes   " "Edad"                              
##  "width of eyes    " "Horas.de.uso.semanal"              
##  "height of hair   " "Sesiones.semanales"                
##  "width of hair   "  "Duración.promedio.por.sesión..min."
##  "style of hair   "  "Nivel.de.satisfacción..1.10."      
##  "height of nose  "  "Nivel.de.estrés..1.10."            
##  "width of nose   "  "Edad"                              
##  "width of ear    "  "Horas.de.uso.semanal"              
##  "height of ear   "  "Sesiones.semanales"

Prueba de bondad

# Convertir a numérico por seguridad
datos$`Horas de uso semanal` <- as.numeric(datos$`Horas de uso semanal`)

# Crear objeto auxiliar
x <- na.omit(datos$`Horas de uso semanal`)

# Ajustar parámetros de distribución normal
media_x <- mean(x)
desv_x <- sd(x)

# Ajustar parámetros de distribución gamma
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:patchwork':
## 
##     area
## The following object is masked from 'package:dplyr':
## 
##     select
ajuste_gamma <- fitdistr(x, "gamma")
shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]
scale <- 1 / rate

# Gráfico
hist(x, freq = FALSE, ylab = "Densidad", xlab = "Horas de uso semanal",
     col = "whitesmoke", ylim = c(0, 0.07),
     main = "Distribución de frecuencias: Horas de uso semanal")

# Densidad empírica
lines(density(x), col = "#BF3EFF", lwd = 3)

# Curva normal teórica
curve(dnorm(x, mean = media_x, sd = desv_x), 
      col = "midnightblue", add = TRUE, lwd = 3)

# Curva gamma teórica
curve(dgamma(x, shape = shape, scale = scale), 
      col = "chocolate", add = TRUE, lwd = 3)

# Leyenda
legend("topright", col = c("#BF3EFF", "midnightblue", "chocolate"),
       legend = c("Densidad", "Normal teórica", "Gamma teórica"),
       lty = 1, lwd = 3)

x <- na.omit(as.numeric(datos$`Horas de uso semanal`))


ajuste_gamma <- fitdistr(x, densfun = "gamma")

shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]


ks.test(x, "pgamma", shape = shape, rate = rate)
## Warning in ks.test.default(x, "pgamma", shape = shape, rate = rate): ties
## should not be present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.18702, p-value = 0.06053
## alternative hypothesis: two-sided
# Asegurarse de que la variable esté como numérica
datos$`Sesiones semanales` <- as.numeric(datos$`Sesiones semanales`)

# Eliminar NAs
x <- na.omit(datos$`Sesiones semanales`)

# Estimar parámetros normales
media_x <- mean(x)
desv_x <- sd(x)

# Estimar parámetros gamma
library(MASS)
ajuste_gamma <- fitdistr(x, densfun = "gamma")
shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]
scale <- 1 / rate

# Graficar histograma + curvas
hist(x, freq = FALSE, ylab = "Densidad", xlab = "Sesiones semanales",
     col = "whitesmoke", ylim = c(0, 0.06),
     main = "Distribución de frecuencias: Sesiones semanales")

# Densidad empírica
lines(density(x), col = "#BF3EFF", lwd = 3)

# Curva normal teórica
curve(dnorm(x, mean = media_x, sd = desv_x), 
      col = "midnightblue", add = TRUE, lwd = 3)

# Curva gamma teórica
curve(dgamma(x, shape = shape, scale = scale), 
      col = "chocolate", add = TRUE, lwd = 3)

# Leyenda
legend("topright", col = c("#BF3EFF", "midnightblue", "chocolate"),
       legend = c("Densidad", "Normal teórica", "Gamma teórica"),
       lty = 1, lwd = 3)

x <- na.omit(as.numeric(datos$`Sesiones semanales`))

ajuste_gamma <- fitdistr(x, densfun = "gamma")
shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]

ks.test(x, "pgamma", shape = shape, rate = rate)
## Warning in ks.test.default(x, "pgamma", shape = shape, rate = rate): ties
## should not be present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.16247, p-value = 0.1427
## alternative hypothesis: two-sided
# Asegurar que sea numérica
datos$`Nivel de satisfacción (1-10)` <- as.numeric(datos$`Nivel de satisfacción (1-10)`)

# Eliminar NAs
x <- na.omit(datos$`Nivel de satisfacción (1-10)`)

# Estimar parámetros normales
media_x <- mean(x)
desv_x <- sd(x)

# Estimar parámetros gamma
library(MASS)
ajuste_gamma <- fitdistr(x, densfun = "gamma")
## Warning in densfun(x, parm[1], parm[2], ...): NaNs produced
shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]
scale <- 1 / rate

# Graficar
hist(x, freq = FALSE, ylab = "Densidad", xlab = "Nivel de satisfacción (1-10)",
     col = "whitesmoke", ylim = c(0, 0.3),
     main = "Distribución de frecuencias: Nivel de satisfacción")

# Densidad empírica
lines(density(x), col = "#BF3EFF", lwd = 3)

# Curva normal
curve(dnorm(x, mean = media_x, sd = desv_x), 
      col = "midnightblue", add = TRUE, lwd = 3)

# Curva gamma
curve(dgamma(x, shape = shape, scale = scale), 
      col = "chocolate", add = TRUE, lwd = 3)

# Leyenda
legend("topright", col = c("#BF3EFF", "midnightblue", "chocolate"),
       legend = c("Densidad", "Normal teórica", "Gamma teórica"),
       lty = 1, lwd = 3)

x <- na.omit(as.numeric(datos$`Nivel de satisfacción (1-10)`))

media_x <- mean(x)
desv_x <- sd(x)

ks.test(x, "pnorm", mean = media_x, sd = desv_x)
## Warning in ks.test.default(x, "pnorm", mean = media_x, sd = desv_x): ties
## should not be present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.16023, p-value = 0.1534
## alternative hypothesis: two-sided
# Instalar librería si no la tienes
# install.packages("fitdistrplus")

# Cargar librería
library(fitdistrplus)
## Loading required package: survival
# 1: Femenino (14), 2: Masculino (12), 3: No binario (11), 4: Prefiere no decir (13)
x <- c(rep(1,14), rep(2,12), rep(3,11), rep(4,13))

media <- mean(x)
desv <- sd(x)

ajuste_gamma <- fitdist(x, "gamma", method = "mme")
forma <- ajuste_gamma$estimate["shape"]
tasa <- ajuste_gamma$estimate["rate"]

hist(x, freq=FALSE, ylab="Densidad", col="whitesmoke", ylim=c(0,0.5),
     main="Distribución de frecuencias de Género", xlab="Categorías codificadas")

lines(density(x), col="#BF3EFF", lwd=3)

curve(dnorm(x, mean=media, sd=desv), from=0.5, to=4.5, col="midnightblue", add=TRUE, lwd=3)

curve(dgamma(x, shape=forma, rate=tasa), from=0.5, to=4.5, col="chocolate", add=TRUE, lwd=3)

legend("topright", col=c("#BF3EFF", "midnightblue", "chocolate"),
       legend=c("Densidad", "Normal teórica", "Gamma teórica"), lty=1, lwd=3)

x <- c(rep(1, 14), rep(2, 12), rep(3, 11), rep(4, 13))  # Codificación de género

media_x <- mean(x)
desv_x <- sd(x)

ks.test(x, "pnorm", mean = media_x, sd = desv_x)
## Warning in ks.test.default(x, "pnorm", mean = media_x, sd = desv_x): ties
## should not be present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.17508, p-value = 0.09327
## alternative hypothesis: two-sided
frecuencias <- c(21, 15, 14)  # Alta, Baja, Media
categorias <- c(1, 2, 3)      # Codificación numérica
x <- rep(categorias, frecuencias)  # Vector con los datos repetidos según frecuencia

media_x <- mean(x)
desv_x <- sd(x)
ajuste_gamma <- MASS::fitdistr(x, densfun = "gamma")
shape <- ajuste_gamma$estimate["shape"]
rate <- ajuste_gamma$estimate["rate"]
scale <- 1 / rate

hist(x, freq = FALSE, ylab = "Densidad", col = "whitesmoke",
     ylim = c(0, 0.6), main = "Distribución de frecuencias de Frecuencia de uso de herramientas",
     xlab = "Categorías codificadas (1=Alta, 2=Baja, 3=Media)")

lines(density(x), col = "#BF3EFF", lwd = 3)  # Densidad empírica
curve(dnorm(x, mean = media_x, sd = desv_x), from = 0.5, to = 3.5, col = "midnightblue", add = TRUE, lwd = 3)
curve(dgamma(x, shape = shape, scale = scale), from = 0.5, to = 3.5, col = "chocolate", add = TRUE, lwd = 3)

legend("topright",
       col = c("#BF3EFF", "midnightblue", "chocolate"),
       legend = c("Densidad", "Normal teórica", "Gamma teórica"),
       lty = 1, lwd = 3)

frecuencias <- c(21, 15, 14)

codigos <- c(1, 2, 3)

x_cat <- rep(codigos, frecuencias)

set.seed(123)  # Para reproducibilidad
x <- jitter(x_cat, amount = 0.2)

ks.test(x, "pnorm", mean = mean(x), sd = sd(x))
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.22153, p-value = 0.01232
## alternative hypothesis: two-sided

Prueba de hipotesis

# Filtrar grupo de estudiantes y convertir la variable a numérica
estudiantes <- datos[datos$Ocupación == "Estudiante", ]
x <- as.numeric(trimws(estudiantes$`Nivel de satisfacción (1-10)`))
x <- na.omit(x)

# Ver cantidad de datos
length(x)
## [1] 8
# Prueba t de una muestra (media hipotética = 7)
t.test(x, mu = 7, alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  x
## t = -0.8557, df = 7, p-value = 0.4205
## alternative hypothesis: true mean is not equal to 7
## 95 percent confidence interval:
##  4.647882 8.102118
## sample estimates:
## mean of x 
##     6.375
estudiantes <- datos[datos$Ocupación == "Estudiante", ]
x <- as.numeric(trimws(estudiantes$`Nivel de satisfacción (1-10)`))
x <- na.omit(x)

profesionales <- datos[datos$Ocupación == "Profesional", ]
y <- as.numeric(trimws(profesionales$`Nivel de satisfacción (1-10)`))
y <- na.omit(y)

length(x)  # estudiantes
## [1] 8
length(y)  # profesionales
## [1] 16
t.test(x, y, alternative = "two.sided", var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  x and y
## t = 0.063641, df = 17.537, p-value = 0.95
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.004671  2.129671
## sample estimates:
## mean of x mean of y 
##    6.3750    6.3125
estudiantes <- datos[datos$Ocupación == "Estudiante", ]

x <- as.numeric(trimws(estudiantes$`Nivel de satisfacción (1-10)`))
x <- na.omit(x)

satisfechos <- sum(x >= 7)
n <- length(x)

prop.test(satisfechos, n, p = 0.5, alternative = "greater", correct = FALSE)
## Warning in prop.test(satisfechos, n, p = 0.5, alternative = "greater", correct
## = FALSE): Chi-squared approximation may be incorrect
## 
##  1-sample proportions test without continuity correction
## 
## data:  satisfechos out of n, null probability 0.5
## X-squared = 0, df = 1, p-value = 0.5
## alternative hypothesis: true p is greater than 0.5
## 95 percent confidence interval:
##  0.2486419 1.0000000
## sample estimates:
##   p 
## 0.5
# Convertir a numérico la variable de interés (por si hay problemas con formato)
x <- as.numeric(trimws(grupo_b$`Nivel de satisfacción (1-10)`))
x <- na.omit(x)

# Ver número de observaciones y la varianza muestral
length(x)
## [1] 12
var(x)
## [1] 6.931818
# Prueba de hipótesis para una varianza
# H0: varianza = 2
# H1: varianza ≠ 2
n <- length(x)
s2 <- var(x)
var_hipotetica <- 2

# Estadístico de prueba
estadistico <- (n - 1) * s2 / var_hipotetica

# p-valor bilateral
p_valor <- 2 * min(pchisq(estadistico, df = n - 1), 1 - pchisq(estadistico, df = n - 1))

# Intervalo de confianza para la varianza (95%)
LI <- (n - 1) * s2 / qchisq(0.975, df = n - 1)
LS <- (n - 1) * s2 / qchisq(0.025, df = n - 1)

# Resultados
cat("Estadístico de prueba: ", estadistico, "\n")
## Estadístico de prueba:  38.125
cat("p-valor: ", p_valor, "\n")
## p-valor:  0.0001490506
cat("Intervalo de confianza 95% para la varianza: [", LI, ", ", LS, "]\n")
## Intervalo de confianza 95% para la varianza: [ 3.478551 ,  19.98297 ]
grupo_b <- subset(datos, `Nivel de estrés (1-10)` >= 8)

grupo_b <- na.omit(grupo_b[, c("Horas de uso semanal", "Duración promedio por sesión (min)")])

resultado <- var.test(grupo_b$`Horas de uso semanal`,
                      grupo_b$`Duración promedio por sesión (min)`)

print(resultado)
## 
##  F test to compare two variances
## 
## data:  grupo_b$`Horas de uso semanal` and grupo_b$`Duración promedio por sesión (min)`
## F = 0.56399, num df = 11, denom df = 11, p-value = 0.3563
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.16236 1.95913
## sample estimates:
## ratio of variances 
##          0.5639897
grupo_b <- subset(datos, `Nivel de estrés (1-10)` >= 8)

grupo_b$Frecuencia_binaria <- ifelse(grupo_b$`Frecuencia uso herramientas` == "Alta", "Alta", "No Alta")

grupo_b_genero <- subset(grupo_b, Género %in% c("Masculino", "Femenino"))

tabla <- table(grupo_b_genero$Género, grupo_b_genero$Frecuencia_binaria)
print(tabla)
##            
##             Alta No Alta
##   Femenino     1       1
##   Masculino    0       3
# Femenino: 1 éxito (Alta), 2 casos en total
# Masculino: 0 éxitos (Alta), 3 casos en total

x <- c(1, 0)    # número de éxitos (Alta)
n <- c(2, 3)    # número de observaciones por grupo

resultado <- prop.test(x = x, n = n, alternative = "two.sided", correct = FALSE)
## Warning in prop.test(x = x, n = n, alternative = "two.sided", correct = FALSE):
## Chi-squared approximation may be incorrect
print(resultado)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  x out of n
## X-squared = 1.875, df = 1, p-value = 0.1709
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.1929519  1.0000000
## sample estimates:
## prop 1 prop 2 
##    0.5    0.0
grupo_c <- subset(datos, `Horas de uso semanal` >= 10)

grupo_c_pareado <- na.omit(grupo_c[, c("Nivel de satisfacción (1-10)", "Nivel de estrés (1-10)")])

satisfaccion <- grupo_c_pareado$`Nivel de satisfacción (1-10)`
estres <- grupo_c_pareado$`Nivel de estrés (1-10)`

resultado <- t.test(satisfaccion, estres, paired = TRUE, alternative = "two.sided")

print(resultado)
## 
##  Paired t-test
## 
## data:  satisfaccion and estres
## t = 2.5389, df = 22, p-value = 0.01871
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  0.3663022 3.6336978
## sample estimates:
## mean difference 
##               2

Regresion lineal

# Y: Nivel de satisfacción
# X: Nivel de estrés, Horas de uso semanal, Duración promedio por sesión
modelo_datos <- na.omit(datos[, c("Nivel de satisfacción (1-10)", 
                                  "Nivel de estrés (1-10)",
                                  "Horas de uso semanal", 
                                  "Duración promedio por sesión (min)")])

# Ajustar el modelo de regresión lineal
modelo <- lm(`Nivel de satisfacción (1-10)` ~ 
               `Nivel de estrés (1-10)` + 
               `Horas de uso semanal` + 
               `Duración promedio por sesión (min)`, 
             data = modelo_datos)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = `Nivel de satisfacción (1-10)` ~ `Nivel de estrés (1-10)` + 
##     `Horas de uso semanal` + `Duración promedio por sesión (min)`, 
##     data = modelo_datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6970 -2.0724 -0.0024  2.0863  3.4602 
## 
## Coefficients:
##                                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                           7.84659    0.97182   8.074  2.3e-10 ***
## `Nivel de estrés (1-10)`             -0.01639    0.12130  -0.135    0.893    
## `Horas de uso semanal`               -0.05421    0.05077  -1.068    0.291    
## `Duración promedio por sesión (min)` -0.02935    0.02180  -1.346    0.185    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.288 on 46 degrees of freedom
## Multiple R-squared:  0.08094,    Adjusted R-squared:  0.021 
## F-statistic:  1.35 on 3 and 46 DF,  p-value: 0.2698