1 INTRODUCCION

Al tratar este tema, se puede observar que, en la actualidad, el avance de la tecnología y el acceso a internet han generado cambios significativos en la forma que las personas se comunican e interactúan entre sí y desarrollan gran parte de sus actividades diarias, en sí las redes sociales se convirtieron en una herramienta esencial más utilizada a nivel mundial dónde está influye no sólo en ámbitos sociales y educativos sino también ha llegado a influir en los comportamientos, las emociones y la salud mental de las personas. Según Castells(1999) el desarrollo de las tecnologías de la información transformó profundamente la estructura social y las dinámicas de comunicación dentro de la sociedad moderna. Hoy en día al contar con gran cantidad de información sobre aplicaciones surge la necesidad de aplicar herramientas estadísticas y técnicas para llegar a analizar los datos que permitan comprender de una manera adecuada y más profunda cuáles son los patrones de uso y sus efectos sobre el bienestar de las personas.

El gran incremento de las redes sociales durante los últimos años ha llegado a transformar significativamente la manera en que se comunican y consumen información, tales aplicaciones como Instagram, Facebook ,Tik Tok, X y algunas otras mas que se han convertido en grandes herramientas para la sociedad tanto para la socialización, el entretenimiento y el trabajo. En el contexto actual, millones de personas alrededor del mundo utilizan estas plataformas, llegando a dedicar varias horas de su tiempo a compartir contenido e interactuar con otros usuarios, ya sea de otras regiones del país o incluso con personas cercanas siendo este un fenómeno tecnológico que ha generado un interés de estudio en diferentes áreas en este caso campo relacionados con la estadística, la psicología y un análisis del comportamiento humano.

Conforme el tiempo avanza, el uso de las redes sociales incrementa, siendo así, surge la necesidad de analizar algunos efectos que se suelen generar sobre la salud mental. En diversas investigaciones plantean que el uso excesivo del teléfono de igual manera las plataformas podrían estar relacionados con alteraciones emocionales del cuerpo humano como la ansiedad, el estrés, dificultades de concentración y problemas de autoestima, no obstante a ello, este impacto no siempre es negativo ya que las redes sociales han sido unas herramientas que facilitan la comunicación, el acceso a información útil tanto para trabajo, estudio y la construcción de comunidades, sabiendo esto es de gran importante estudiar los hábitos de uso cómo se relacionan con el bienestar mental

En el presente informe se emplea una base de datos denominada datos_uso_redes, un estudio llevado a cabo en los años 2022 al 2024, el cual contiene una amplia información relacionada con el hábito de el uso de las redes sociales y algunas variables asociadas a la salud mental, desde la base se realizó un proceso de selección de variables dependientes e independientes con el objetivo de construir un conjunto de datos adecuado para realizar un análisis estadístico, basándose en modelos de aprendizaje supervisado y modelos logit,con el cual se permitió trabajar con variables consideradas relevantes dentro de esta encuesta de estudio

Resulta importante mencionar que se tomó como variable dependiente llamada salud_mental, donde cada participante que realizó la encuesta tuvo una autoevaluación de su estado mental en una escala de 1 a 10 donde dicha variable fue transformada en una variable categórica teniendo dos posibles resultados “buena” y “mala” permitiéndo esta clasificación simplificar el análisis y así lograr tener una facilidad al construir los modelos y poder lograr identificar patrones asociados.

De igual manera se seleccionó cinco variables independientes que tuvieran una gran relación con el comportamiento, en estas variables incluyen la edad del usuario(), el número de plataformas utilizadas regularmente (), el promedio de horas diarias dedicadas al uso de las redes sociales (), la cantidad que la persona ingresa a las redes sociales durante el día () y así mismo la frecuencia en la que toma pausas voluntarias del uso de estas (), siendo estas variables las que permitan explorar relaciones entre los hábitos y la salud mental,por último este trabajo busca aplicar algunas técnicas de análisis y un aprendizaje supervisado con el propósito de identificar datos relevantes y patrones dentro del comportamiento de los usuarios en las redes sociales y así asociando la salud mental demostrando que a través del estudio se logra evidenciar con ayuda del análisis estadístico comprender el fenómeno de las redes

library(readr)
library(dplyr)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$salud_mental <- ifelse(base_filtrada$salud >= 7, "buena", "mala")
base_filtrada <- base_filtrada %>%
  select(-salud)
View(base_filtrada)

2 .METODOLOGIA

Para realizar el desarrollo de la metodología se llevó a cabo un estudio de análisis estadístico aplicando técnica de aprendizaje supervisado y un modelo logit, utilizando así una base de datos relacionada con el uso de las redes en la que se tuvo en cuenta la percepción de la salud mental de los usuarios, con base a esto se tuvo un concepto metodológico el cual se estructuró en diferentes etapas permitiendo realizar la recolección, depuración, transformación de alguna variable a formato binario y así logrando obtener un análisis de información para llegar a identificar patrones que puedan relacionarse entre las variables seleccionadas.

En primera instancia se trabajó con la base de datos denominada datos_uso_redes la cual proporciona información correspondiente a las variables asociadas y el comportamiento, tales como es el tiempo de uso de las redes,la frecuencia de ingresos a las plataformas,cantidad de aplicaciones utilizadas en un día y realización de pausas voluntarias que hace un usuario, siguiendo se realizó un filtrado de variables y una selección con el fin de conservar aquellas que se consideran relevantes para el análisis y la construcción del modelo.f

En el desarrollo de la primera etapa se utilizaron herramientas de programación en Rstudio y diversas librerías especializadas las cuales facilitaron la limpieza y organización de la información, asimismo se realizó el proceso de renombramiento de las variables para llegar a tener una mejor interpretación y manipulación dentro del desarrollo del trabajo, realizado esto se encontró una variable dependiente correspondiente a salud_mental, la cual es construida a partir de la autoevaluación que se les realizó a los participantes sobre su estado mental en una escala de 1 a 10,de igual manera esta variable fue categorizada en dos posibles clasificaciones como “buena” y “mala”, de igual manera se seleccionaron cinco variables independientes que estuvieran relación con el comportamiento de los usuarios como lo son la edad, número de plataformas utilizadas, promedio de horas diarias, número de ingresos y pausas voluntarias.

Finalmente, durante el desarrollo del análisis descriptivo e inferencial con ayuda de elaboración de tablas y gráficas, permitieron identificar cuáles fueron sus tendencias, distribuciones y las posibles relaciones que hay entre las variables, también se implementó el modelo de aprendizaje supervisado y modelo logit con el fin de analizar la probabilidad de pertenencia a las categorías de salud mental.

2.1 .METODOS UTILIZADOS

Al realizar el presente estudio se implementaron dos modelos de clasificación supervisada para poder analizar la relación entre los hábitos de uso de redes sociales y la percepción de la salud mental, los modelos utilizados fueron el knn y el modelo de regresión logit permitiendo clasificar a los usuarios dentro de las categorías de salud mental buenas y malas.

Siendo el modelo knn una técnica de aprendizaje supervisado que ayuda a aproximar observaciones en el logaritmo, clasifica un registro según la categoría predominante de los vecinos más cercanos, considerando las características de las variables independientes como lo son de nuestra base de datos, para llegar a la interpretación el modelo se realizó una división de la base de datos de conjuntos permitiendo evaluar diferentes valores de k para llegar a determinar un valor óptimo que proporciona una mayor precisión de clasificación.

Por otra parte se utilizó el modelo logit logística binaria, utilizando la variable dependientes salud mental la cual fue transformada como en una variable categórica como dos posibles resultados así permitiendo este modelo estimular la probabilidad de pertenencia a una categoría

Finalmente, ambos modelos fueron utilizados mediante diferentes métricas de evaluación, permitiendo la comparación y poder evaluar la capacidad de clasificación de cada técnica y determinar cuál método resulta más adecuada

2.2 .BASE DE DATOS

library(readr)
library(dplyr)
library(reactable)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$salud_mental <- ifelse(base_filtrada$salud >= 6, "buena", "mala")
base_filtrada <- base_filtrada %>%
  select(-salud)

reactable(
  base_filtrada,
  bordered = TRUE,
  striped = TRUE,
  highlight = TRUE,
  compact = FALSE,
  columns = list(
    Variable = colDef(
      style = list(fontWeight = "bold")
    ),
    Descripción = colDef(
      minWidth = 300
    )
  ),
  defaultColDef = colDef(
    headerStyle = list(
      background = "#2b6cb0",
      color = "white",
      fontWeight = "bold"
    ),
    style = list(
      padding = "12px",
      fontSize = "15px"
    ),
    align = "left"
  )
)

2.3 .DEFINICION DE LAS VARIABLES

variables_modelo <- data.frame(
  Variable = c("salud_mental", "edad", "plataformas_usadas", "promh_uso_redes", "num_ingreso_dia", "pausas_voluntaria"),
  Descripción = c(
    "El entrevistado por medio de una autoevaluación en base a su condición actual, responde de 1 a 10 en qué punto se encuentra",
    "Edad del entrevistado",
    "Cuantas plataformas de redes sociales utiliza regularmente",
    "Promedio de uso de redes sociales durante el dia ",
    "Cuantas veces el entrevistado ingresa a redes sociales al dia",
    "Si el entrevistado toma pausas de forma voluntaria de redes sociales "
  ),
  Tipo_Variable = c(
    "cualitativa (Outpt)",
    "Cuantitativa (Input)",
    "Cuantitativa (Input)",
    "Cuantitativa (Input)",
    "Cuantitativa (Input)",
    "cualitativa (Input)"
  ),
  Ejemplos_Notas = c(
    "buena/mala",
    "En años",
    "numerica",
    "horas" ,
    "numerica",
    "yes/no/occasionally"
  )
)

library(kableExtra)
tabla <- kable(variables_modelo, 
               format = "html",
               col.names = c("Variable", "Descripción", "Tipo de Variable", "Notas"),
               align = c('l', 'l', 'l', 'l'),
               caption = "Tabla de Variables del Modelo de aprendizaje supervisado") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    font_size = 14,
    position = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  column_spec(1, bold = TRUE, width = "3cm") %>%
  column_spec(2, width = "4cm") %>%  # Cambiado de 2:8 a columnas específicas
  column_spec(3, width = "3cm") %>%
  column_spec(4, width = "3.5cm") %>%
  footnote(
    general = "",
    general_title = "",
    footnote_as_chunk = TRUE
  )
tabla
Tabla de Variables del Modelo de aprendizaje supervisado
Variable Descripción Tipo de Variable Notas
salud_mental El entrevistado por medio de una autoevaluación en base a su condición actual, responde de 1 a 10 en qué punto se encuentra cualitativa (Outpt) buena/mala
edad Edad del entrevistado Cuantitativa (Input) En años
plataformas_usadas Cuantas plataformas de redes sociales utiliza regularmente Cuantitativa (Input) numerica
promh_uso_redes Promedio de uso de redes sociales durante el dia Cuantitativa (Input) horas
num_ingreso_dia Cuantas veces el entrevistado ingresa a redes sociales al dia Cuantitativa (Input) numerica
pausas_voluntaria Si el entrevistado toma pausas de forma voluntaria de redes sociales cualitativa (Input) yes/no/occasionally
  • salud_mental: Esta variable representa la percepción del estado de la salud mental del entrevistado. Se utiliza como variable de salida (output) en el modelo, ya que permite analizar la relación entre la salud mental y el uso frecuente de las redes sociales por parte de los participantes.Para ello, cada entrevistado calificó su estado en una escala de 1 a 10, donde valores menores o iguales a 6 indica malo y mayores que 6 indica buena salud mental.

  • edad: Esta variable corresponde a la edad del entrevistado. Se incorporó en el modelo debido a que se considera que puede influir tanto en la cantidad de horas dedicadas al uso de redes sociales como en el nivel de información y responsabilidad frente a la salud mental.

  • plataformas_usadas: Esta variable representa la cantidad de plataformas de redes sociales utilizadas por los entrevistados. Se incluyó en el modelo debido a que el uso de múltiples aplicaciones puede estar relacionado con un mayor tiempo de permanencia en entornos digitales.

  • promh_uso_redes: Esta variable indica el promedio de horas que los entrevistados dedican diariamente al uso de redes sociales. Se incluyó en el modelo debido a que permite medir la intensidad de uso de estas plataformas y analizar su posible relación con la percepción del estado de salud mental de los participantes.

  • num_ingreso_dia: Esta variable corresponde a la cantidad de veces que los participantes ingresan a las redes sociales durante el día. Se incluyó en el modelo debido a que permite analizar la frecuencia de interacción con estas plataformas y evaluar si existe una relación entre el número de ingresos y el tiempo total dedicado a su uso.

  • pausas_voluntaria:Esta variable representa si el entrevistado realiza pausas voluntarias en el uso de redes sociales. Se incluyó en el modelo debido a que este hábito puede reflejar el nivel de control frente al tiempo dedicado a estas plataformas, además, permite analizar si la implementación de pausas está relacionada con una menor exposición continua a las redes sociales y con una mejor percepción de la salud mental.

3 .ANALISIS DESCRIPTIVO

3.1 ESTADISTICAS DESCRIPTIVAS DE LAS VARIABLES PRINCIPALES

3.1.1 ESTADISTICAS DESCRIPTIVAS

library(readr)
library(dplyr)
library(kableExtra)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$salud_mental <- ifelse(base_filtrada$salud >= 6, "buena", "mala")
base_filtrada <- base_filtrada %>%
  select(-salud)

moda <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
tabla_edad <- base_filtrada %>%
  summarise(
    Variable = "edad",
    Desv_Estandar = sd(edad, na.rm = TRUE),
    Media = mean(edad, na.rm = TRUE),
    Mediana = median(edad, na.rm = TRUE),
    Moda = moda(edad),
    Minimo = min(edad, na.rm = TRUE),
    Maximo = max(edad, na.rm = TRUE)
  )  
tabla_plat <- base_filtrada %>%
  summarise(
    Variable = "plataformas_usadas",
    Desv_Estandar = sd(plataformas_usadas, na.rm = TRUE),
    Media = mean(plataformas_usadas, na.rm = TRUE),
    Mediana = median(plataformas_usadas, na.rm = TRUE),
    Moda = moda(plataformas_usadas),
    Minimo = min(plataformas_usadas, na.rm = TRUE),
    Maximo = max(plataformas_usadas, na.rm = TRUE)
  )  
tabla_promh <- base_filtrada %>%
  summarise(
    Variable = "promh_uso_redes",
    Desv_Estandar = sd(promh_uso_redes, na.rm = TRUE),
    Media = mean(promh_uso_redes, na.rm = TRUE),
    Mediana = median(promh_uso_redes, na.rm = TRUE),
    Moda = moda(promh_uso_redes),
    Minimo = min(promh_uso_redes, na.rm = TRUE),
    Maximo = max(promh_uso_redes, na.rm = TRUE)
  )  
tabla_num_ingreso <- base_filtrada %>%
  summarise(
    Variable = "num_ingreso_dia",
    Desv_Estandar = sd(num_ingreso_dia, na.rm = TRUE),
    Media = mean(num_ingreso_dia, na.rm = TRUE),
    Mediana = median(num_ingreso_dia, na.rm = TRUE),
    Moda = moda(num_ingreso_dia),
    Minimo = min(num_ingreso_dia, na.rm = TRUE),
    Maximo = max(num_ingreso_dia, na.rm = TRUE)
  )  
tabla_final <- bind_rows(
  tabla_edad,
  tabla_plat,
  tabla_promh,
  tabla_num_ingreso
)
tabla_final %>%
  kbl(
    caption = "Estadisticas Descriptivas Variables",
    align = "c",
    format.args = list(big.mark = ".", decimal.mark = ",")
  ) %>%
 
   kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    font_size = 14,
    position = "center"
    ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  column_spec(5, bold = TRUE, width = "4.5cm") %>%
  column_spec(1:7, extra_css = "text-align: center;") %>%
  footnote(
    general = "Elaboracion propia con base en datos_uso_redes.csv",
    footnote_as_chunk = TRUE
  )
Estadisticas Descriptivas Variables
Variable Desv_Estandar Media Mediana Moda Minimo Maximo
edad 7,649775 26,98600 27,0 26,0 13,0 57
plataformas_usadas 1,431756 3,01000 3,0 5,0 1,0 5
promh_uso_redes 1,858501 2,99065 2,6 0,5 0,5 12
num_ingreso_dia 2,249985 5,02450 5,0 4,0 1,0 15
Note: Elaboracion propia con base en datos_uso_redes.csv

La tabla presenta las principales medidas descriptivas de las cuatro variables cuantitativas que se tienen: edad, plataformas usadas, promedio uso de redes y número de ingresos al día. Estas estadísticas nos permiten identificar tendencias centrales, dispersión y posibles comportamientos atípicos dentro del modelo.

Se puede observar que la edad de los encuestados presenta una media de 26,98, con una mediana de 27,0 y una moda de 26,0, esto indica que la mayoría de personas se concentran en edades cercanas a los 27 años, por lo tanto se sugiere que la distribución es aproximadamente simétrica y no presenta sesgos importantes. El valor mínimo de 13 años y el máximo de 25 revela que participaron tanto adolescentes como adultos, asimismo, la desviación estándar de 7,64 refiere una dispersión de las edades respecto al promedio, evidenciando que la población estudiada posee heterogeneidad generacional, lo que puede llevar a influir en los hábitos de consumo de las redes sociales.

En la variable de las plataformas usadas por los encuestados se puede observar una media de 3,0 que coincide con la mediana, lo que nos sugiere una estabilidad en la distribución, no obstante, la moda de 5 revela que una cantidad importante de encuestados utiliza el máximo número de plataformas consideradas en el estudio. La desviación estándar es considerablemente baja con un valor de 1,43, esto indica que los datos se encuentran concentrados cerca del promedio y que no existe una gran variabilidad entre los participantes, evidenciando una tendencia a la multiconectividad digital, donde los usuarios interactúan simultáneamente en diferentes redes sociales.

Se puede observar que el promedio de uso de redes de los encuestados presenta una mediana de 2,6 y moda de 0,5, esto nos indica que existe un grupo importante de encuestados con bajos niveles de uso de redes, sin embargo, existe otra parte que presenta valores significativamente altos. La media de 2,99 y la moda presentan una diferencia que nos sugiere una distribución asimétrica positiva, esto se refuerza con el valor máximo de 12 horas que está significativamente alejado de la media, además, la desviación estándar estándar de 1,86 muestra una dispersión moderada-alta revelando comportamientos heterogéneos en cuanto al tiempo de uso de redes sociales.

En la variable de número de ingresos al día presenta una media de 5,02, una mediana de 5 y una moda de 4, la cercanía entre estas nos indica una distribución equilibrada, sin embargo el valor mínimo de 1 y valor máximo de 15 ingresos diarios refiere participantes altamente activos, asimismo, la desviación estándar de 2,25 afirma una variabilidad moderada en la práctica de acceso a las redes, esto sugiere una frecuencia de interacción digital constante en la muestra analizada.

3.1.2 GRAFICO DE PASTEL VARIABLE CATEGORICA

library(ggplot2)
library(dplyr)

# Conteo de categorías
datos_pastel <- base_filtrada %>%
  count(salud_mental) %>%
  mutate(
    porcentaje = round(n/sum(n)*100,1),
    etiqueta = paste0(salud_mental, " ", porcentaje, "%")
  )

# Grafico de pastel
ggplot(datos_pastel, aes(x = "", y = n, fill = salud_mental)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = etiqueta),
            position = position_stack(vjust = 0.5),
            color = "white",
            size = 5) +
  labs(
    title = "Distribucion de la Salud Mental"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

En el gráfico de pastel se puede observar que el 55,7% de los entrevistados calificó su salud mental como buena, mientras que el 44,3% la calificó como mala. Esto nos demuestra que, aunque hay una mayoría que presenta una percepción positiva, existe una proporción considerable de participantes con una percepción negativa. Esto nos permite inferir que la salud mental representa un aspecto relevante dentro de la población analizada

3.1.3 GRAFICO DE BARRAS SALUD MENTAL

library(ggplot2)
library(plotly)

grafico_salud <- ggplot(base_filtrada,
                        aes(x = salud_mental,
                            fill = salud_mental)) +
  
  geom_bar() +
  
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    vjust = -0.3,
    size = 5
  ) +
  
  labs(
    title = "Distribucion de la Salud Mental",
    x = "Salud Mental",
    y = "Frecuencia"
  ) +
  
  scale_fill_manual(
    values = c("buena" = "steelblue",
               "mala" = "tomato")
  ) +
  
  theme_minimal() +
  
  theme(
    legend.position = "none",
    
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_salud)

La siguiente gráfica corresponde a la variable dependiente salud_mental la cual nos representa la distribución de esta variable, permitiendo observar cómo se encuentran clasificados los usuarios dentro de las categorías como son “buena” y “mala”, las cuales son construidas a partir de una variable original de autoevaluación del estado mental que es reportado por cada participante, se puede evidenciar la categoría “buen” con una frecuencia de 1114 usuarios y en la categoría “mala” con 886 registros aproximadamente indicando que dentro de la muestra existe un predominio de la cual las personas perciben que su salud mental está de manera favorable o óptima.

Aunque la frecuencia de buena es mayor, la diferencia entre estas no es extremadamente amplia, indicando que para el análisis estadístico y la construcción del modelo supervisado permite trabajar con una distribución equilibrada entre las categorías, reflejando así unos resultados considerables que pueden estar relacionada con diversos factores como lo son el comportamiento y los hábitos del uso de las redes.

3.1.4 HISTOGRAMA EDADES

library(ggplot2)
library(plotly)

grafico_hist <- ggplot(base_filtrada, aes(x = edad)) +
  geom_histogram(
    bins = 10,
    fill = "steelblue",
    color = "white"
  ) +
  labs(
    title = "Histograma de Edades",
    x = "Edad",
    y = "Frecuencia"
  ) +
  theme_minimal()

ggplotly(grafico_hist)

En el siguiente histograma de una de las variable independientes permite visualizar la distribución de los participantes según la edad correspondiente a cada uno de ellos, mostrando los diferentes rangos etarios, a partir de esta gráfica se muestra que hay una mayor distribución desde el rango de edad de 20 años hasta la edad de 35, evidenciando que la población estudiada corresponde principalmente entre a jóvenes y adultos, así representa que este rango es uno de los grupos con mayor interacción dentro de las plataformas de redes sociales.

El gráfico representa una disminución progresiva, conforme aumenta la edad disminuye la frecuencia en que el usuario utiliza estas redes ,así mismo se mira que existe una baja frecuencia siendo este una frecuencia menor en comparación con los grupos centrales de la distribución, con ayuda de este gráfico se evidencia un análisis radical que la edad puede influir directamente sobre los hábitos de uso digital y frecuencia, por esto es relevante estudiar grupos de edades los cuales representan diferentes comportamientos y observando si estos resultados pueden asociarse con la percepción de la salud mental

3.1.5 BOXPLOT PROMEDIO USO REDES

library(ggplot2)
library(plotly)

grafico_box <- ggplot(base_filtrada, aes(y = promh_uso_redes)) +
  geom_boxplot(
    fill = "tomato",
    color = "black"
  ) +
  labs(
    title = "Boxplot - Promedio de Uso de Redes",
    y = "Horas de uso"
  ) +
  theme_minimal()

ggplotly(grafico_box)

En la siguiente gráfica de caja corresponde al promedio de uso de redes sociales durante el día, el cual permite analizar el comportamiento de la variable promh_uso_redes, realizando un estudio relacionados con la dispersión de los datos mirando cuál es su concentración, sus valores extremos y tendencia central.

A partir de ella se observa que la mediana se encuentra muy cercana al 2.5 de horas de uso, igualmente el rango intercuartílico muestra que la mayoría de los datos se concentran en niveles moderados observándose un comportamiento estable para una parte de la población, no obstante a ello un aspecto relevante de la gráfica muestra la presencia de números superiores a siete horas diarias así alcanzando valores hasta de 12 o 12.5 horas, estos valores representan a algunos usuarios que cuentan con hábitos considerablemente intensos, lo cual está asociado como dependencia a las redes sociales.

De igual manera la dispersión observada evidencia que no todos los usuarios llegan a utilizar las redes de una misma manera, sino llegando a existir diferentes comportamientos y diferentes hábitos de la población siendo aspectos fundamentales para comprender los patrones presentes en la base de datos.

3.1.6 HISTOGRAMA INGRESOS DIARIOS

library(ggplot2)
library(plotly)

grafico_ingresos <- ggplot(
  base_filtrada,
  aes(x = num_ingreso_dia)
) +
  
  geom_histogram(
    bins = 12,
    fill = "darkorange",
    color = "white"
  ) +
  
  labs(
    title = "Histograma de Ingresos Diarios a Redes Sociales",
    x = "Numero de ingresos diarios",
    y = "Frecuencia"
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_ingresos)

El siguiente histograma corresponde al número de ingresos diarios por persona a las redes sociales permitiendo analizar la frecuencia en que los usuarios acceden a plataformas digitales durante un día, a partir de la gráfica se observa una mayor concentración de usuarios entre tres a ocho ingresos diarios reflejando una interacción constante con las redes sociales

Observando un poco la distribución presenta una disminución en frecuencia superiores, aunque se logra observar algunos casos de usuarios los cuales serían casos extremos de más de 10 veces que ingresan a una red social indicando valores que pueden representar comportamientos o hábitos no tan buenos para la salud mental, así mismo desde el punto estadístico la variable estudiada resulta importante, debido a que la cantidad de ingresos llega a asociarse a niveles de dependencia, ansiedad o necesidad de estar interactuando virtualmente llegando a tener una relación significativa entre la frecuencia de ingresos y la percepción de salud mental

3.1.7 DIAGRAMA DE BARRAS PAUSAS VOLUNTARIAS

library(ggplot2)
library(plotly)

grafico_pausas <- ggplot(
  base_filtrada,
  aes(
    x = pausas_voluntaria,
    fill = pausas_voluntaria
  )
) +
  
  geom_bar() +
  
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    vjust = -0.3,
    size = 5
  ) +
  
  labs(
    title = "Pausas Voluntarias en Redes Sociales",
    x = "Respuesta",
    y = "Frecuencia"
  ) +
  
  scale_fill_manual(
    values = c(
      "yes" = "steelblue",
      "no" = "tomato",
      "occasionally" = "darkorange"
    )
  ) +
  
  theme_minimal() +
  
  theme(
    legend.position = "none",
    
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_pausas)

En el presente análisis de una variable independiente como lo es pausas voluntarias en las redes sociales, permite observar cuál es la frecuencia con la que mayor los usuarios afirman realizar descansos voluntariamente al momento del uso de las redes sociales, evidenciando así que las categorías “occasionally” y “yes” presentan mayor frecuencia dentro de la muestra, mientras que la categoría “no” presenta una disminución ligeramente menor de los usuarios, los resultados indican que una parte importante es llegar a reconocer la necesidad de controlar el tiempo dedicado a estas plataformas, llegando a ser la pausa voluntaria un mecanismo de autocontrol y logrando así reducir el cansancio mental,pero desde el punto analítico la variable resulta de gran importancia, ya que esta podría presentar posibles efectos negativos sobre variable de la salud mental

3.1.8 DIAGRAMA DE BARRAS PLATAFORMAS USADAS

library(ggplot2)
library(plotly)

grafico_barras <- ggplot(base_filtrada,
                         aes(x = factor(plataformas_usadas))) +
  geom_bar(fill = "darkcyan") +
  labs(
    title = "Cantidad de Plataformas Usadas",
    x = "Numero de plataformas",
    y = "Frecuencia"
  ) +
  theme_minimal()

ggplotly(grafico_barras)

En el gráfico de barras se presenta la distribución de la cantidad de plataformas digitales utilizadas por los participantes del estudio. Se puede observar una frecuencia relativamente homogénea entre las diferentes categorías analizadas, lo que indica que no existe una alta concentración en un único número de plataformas.

La categoría con mayor frecuencia corresponde al uso de 5 plataformas, lo que indica que una gran parte de los participantes usa múltiples redes sociales simultáneamente, evidenciando un comportamiento de alta conectividad. Por otro lado, la categoría con menor frecuencia corresponde al uso de 4 plataformas, sin embargo, la diferencia respecto a las demás no es significativa.

4 .RELACIONES ENTRE VARIABLES

4.0.1 GRAFICA BOXPLOT PARA LAS VARIABLES NUMERICAS

library(tidyverse)
library(hrbrthemes)
library(viridis)
library(plotly)
library(ggplot2)
library(readr)
library(dplyr)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$salud_mental <- ifelse(base_filtrada$salud >= 6, "buena", "mala")
base_filtrada <- base_filtrada %>%
  select(-salud)

data <- base_filtrada %>%
  pivot_longer(
    cols      = c(edad,plataformas_usadas,promh_uso_redes,num_ingreso_dia),  
    names_to  = "Variable",    
    values_to = "Valor"        
  )

grafico <- ggplot(data, aes(x = Variable, y = Valor, fill = Variable)) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE) +
  theme_minimal(base_family = "sans") +
  theme(
    legend.position = "none",
    plot.title      = element_text(size = 13, face = "bold"),
    axis.text.x     = element_text(angle = 90, vjust = 0.5, hjust = 1)
  ) +
  labs(
    title = "Diagrama de Cajas - Variables Numericas",
    x     = "",
    y     = "Valor"
  )
ggplotly(grafico)

4.0.2 BOXPLOT COMPARATIVO HORAS USO Y SALUD MENTAL

library(ggplot2)
library(plotly)

grafico_box_salud <- ggplot(
  base_filtrada,
  aes(
    x = salud_mental,
    y = promh_uso_redes,
    fill = salud_mental
  )
) +
  
  geom_boxplot() +
  
  labs(
    title = "Relacion entre Horas de Uso y Salud Mental",
    x = "Salud Mental",
    y = "Promedio Horas de Uso de Redes"
  ) +
  
  scale_fill_manual(
    values = c(
      "buena" = "steelblue",
      "mala" = "tomato"
    )
  ) +
  
  theme_minimal() +
  
  theme(
    legend.position = "none",
    
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_box_salud)

En la siguiente gráfica comparativa de cajas entre las variables promedio horas de uso de redes y la clasificación de la salud mental, se llega a analizar una de las relaciones importantes dentro del estudio buscando identificar si el tiempo dedicado a las plataformas influye sobre la percepción del bienestar o salud mental.

Partiendo de este, se logra observar los usuarios clasificados con salud mental buena y mala representando unas distribuciones relativamente similares en cuanto al promedio de horas de uso diario, asimismo se puede notar los que los usuarios que pertenecen a la categoría mala representan una distribución ligeramente mayor con una presencia de valores extremos asociados a altos niveles de uso, permitiendo así relacionarse con percepciones menos favorables a la salud mental, sin embargo la similitud entre estas indica que el promedio de horas de uso no explica completamente el comportamiento de la variable dependiente.

4.0.3 DIAGRAMA DE DISPERSION USO DE REDES Y INGRESOS DIARIOS

library(ggplot2)
library(plotly)

grafico_dispersion <- ggplot(
  base_filtrada,
  aes(
    x = promh_uso_redes,
    y = num_ingreso_dia
  )
) +
  
  geom_point(
    color = "purple",
    size = 3,
    alpha = 0.7
  ) +
  
  geom_smooth(
    method = "lm",
    se = FALSE,
    color = "red"
  ) +
  
  labs(
    title = "Relacion entre Uso de Redes e Ingresos Diarios",
    x = "Promedio de Horas de Uso de Redes",
    y = "Numero de Ingresos al Dia"
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_dispersion)

En la gráfica de dispersión la cual está la relacionada entre el número de ingresos al día y el promedio de horas de uso de redes,en la que existe una relación entre ambas variables cualitativas, observando que la mayor concentración de puntos se encuentra en usuarios con niveles moderados de horas de uso y frecuencia de ingreso, así logrando mostrar la línea roja de tendencia, la cual presenta una inclinación ligeramente negativa,indicando que no existe una relación lineal tan fuerte entre las variable, lo que significa que un mayor tiempo de permanencia no necesariamente implica mayor cantidad de ingresos en las plataformas, de igual manera la dispersión de estos datos puede evidenciar una gran variabilidad mostrando que existe diferentes maneras de poder consumir contenido digital y lograr interactuar con las plataformas

4.0.4 DIAGRAMA DE BARRAS AGRUPADAS PAUSAS VOLUNTARIAS Y SALUD MENTAL

library(ggplot2)
library(plotly)

grafico_agrupado <- ggplot(
  base_filtrada,
  aes(
    x = pausas_voluntaria,
    fill = salud_mental
  )
) +
  
  geom_bar(
    position = "dodge"
  ) +
  
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 4
  ) +
  
  labs(
    title = "Relacion entre Pausas Voluntarias y Salud Mental",
    x = "Pausas Voluntarias",
    y = "Frecuencia",
    fill = "Salud Mental"
  ) +
  
  scale_fill_manual(
    values = c(
      "buena" = "steelblue",
      "mala" = "tomato"
    )
  ) +
  
  theme_minimal() +
  
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold"
    )
  )

ggplotly(grafico_agrupado)

En el análisis mostrado a continuación de la relación entre las variables pausas voluntarias y la variable dependientes salud mental, permite analizar cómo se distribuyen las categorías buenas y mala según la frecuencia con la que los usuarios descansan del uso de estas redes sociales, entre esta la categoría buena se observa una predominancia, sin embargo se logra identificar una presencia considerable dentro de la la categoría mala al entrar un poco más analizar, se aprecia que los usuarios que respondieron sí y ocasionalmente presentan una mayor frecuencia de datos de salud mental en comparación a quienes respondieron no sugiriendo que el realizar pausas de tiempo no contribuye en el bienestar de salud mental

Siendo así la diferencia entre estas categorías no es extremadamente amplia, evidenciando que el bienestar emocional depende de múltiples variables y que los hábitos pueden analizarse de manera conjunta con otros factores

4.0.5 MATRIZ DE CORRELACIONES

library(ggplot2)
library(reshape2)
library(dplyr)

# variables nuericas
datos_cor <- base_filtrada %>%
  select(
    edad,
    plataformas_usadas,
    promh_uso_redes,
    num_ingreso_dia
  )

# matriz de correlacion
matriz_cor <- cor(datos_cor, use = "complete.obs")

cor_long <- melt(matriz_cor)

#heatmat
ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  
  # valores de las cajas
  geom_text(aes(label = round(value, 2)),
            color = "black",
            size = 4) +
  
  scale_fill_gradient2(
    low = "#4575b4",
    mid = "white",
    high = "red",
    midpoint = 0,
    limit = c(-1,1),
    name = "Corr"
  ) +
  
  theme_minimal() +
  
  labs(
    title = "Figura 9. Matriz de Correlaciones - Variables Numericas",
    x = "Variables",
    y = "Variables"
  ) +
  
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    ),
    
    plot.title = element_text(
      size = 16,
      face = "bold",
      color = "darkred"
    ),
    
    legend.title = element_text(face = "bold")
  )

La matriz de correlaciones permite evaluar la intensidad y dirección de las relaciones lineales entre las variables numéricas analizadas: edad, plataformas usadas, promedio de uso de redes y número de ingresos diarios.

En la correlación de Pearson toma valores entre -1 y 1, siendo los valores cercanos a 1 una relación positiva fuerte, valores cercanos a -1 una relación negativa fuerte y 0 una ausencia de la relación lineal significativa.

En la figura #x se puede observar que todas las correlaciones exceptuando la diagonal son sumamente cercanas a 0, lo que supone que las variables presentan una asociación lineal débil o inexistente. Interpretación por relaciones

Edad vs Plataformas usadas

Se puede evidenciar una correlación de -0,01, lo que quiere decir que no existe una relación lineal significativa entre la edad y el número de plataformas usadas, en otras palabras, dentro de la muestra analizada, personas de edades distintas utilizan cantidades de plataformas similares.

Edad vs promedio de uso de redes

La correlación de 0,03 positiva es extremadamente baja, por lo que no se evidencia una asociación lineal fuerte entre la edad y el promedio de uso de redes sociales, pese a que podría suponerse que las personas más jóvenes usan mayormente las redes sociales, los datos no muestran evidencia estadística de esta relación.

Edad vs número de ingresos diarios

El valor nulo muestra ausencia total de la relación lineal entre la edad y la frecuencia de ingreso diario a redes sociales, lo que indica que el comportamiento de acceso diario es similar entre distintos grupos etarios de la muestra.

Plataformas usadas vs promedio de uso

Se puede evidenciar una correlación positiva débil de 0,02, aun cuando se podría esperar que usar plataformas involucra mayor tiempo de uso, el cuadro muestra que la relación no es significativa.

Plataformas usadas vs ingresos diarios

La correlación de 0,02 positiva prácticamente inexistente entre el número de plataformas usadas y la frecuencia de ingreso diario, nos indica que usar más aplicaciones no implica necesariamente ingresar mayor cantidad de veces al día, puesto que sería posible que los participantes ingresen y se queden un tiempo alto en una misma plataforma.

Promedio de uso vs ingresos diarios

El valor de la correlación -0,02 negativa es extremadamente baja, denotando ausencia de relación lineal entre ambas variables, por lo tanto un mayor promedio de uso no necesariamente implica un mayor número de ingresos diarios.

Finalmente, la matriz de correlación evidencia que las variables analizadas presentan independencia lineal entre sí, asimismo, mostró coeficientes muy cercanos a cero, indicando ausencia de relaciones lineales significativas y sin asociaciones fuertes dentro de la muestra. Esto sugiere que los patrones de comportamiento digital presentan alta variabilidad individual, es decir podrían depender de factores externos o no incluidos en el estudio.


5 .MODELOS DE CLASIFICACION

5.1 MODELO KNN CON CLASS

library(class)
library(readr)
library(dplyr)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$salud_mental <- ifelse(base_filtrada$salud >= 7, "buena", "mala")
base_filtrada <- base_filtrada %>%
  select(-salud)

set.seed(28)
index_muestra <- sample(1:nrow(base_filtrada), nrow(base_filtrada))
index_entrena <- index_muestra[1:round(nrow(base_filtrada) * 0.75)]
index_test    <- index_muestra[(round(nrow(base_filtrada) * 0.75) + 1):length(index_muestra)]
train <- base_filtrada[index_entrena, ]
test  <- base_filtrada[index_test, ]
train <- na.omit(train)
test  <- na.omit(test)

vars_input   <- c("edad", "plataformas_usadas", "promh_uso_redes", "num_ingreso_dia")
train_input  <- train[, vars_input]
test_input   <- test[,  vars_input]
train_output <- train$salud_mental
test_output  <- test$salud_mental
train_scaled <- scale(train_input)
test_scaled  <- scale(test_input,
                      center = attr(train_scaled, "scaled:center"),
                      scale  = attr(train_scaled, "scaled:scale"))
k <- 1:60
resultado <- data.frame(k, precision = 0)

for(n in k){
  pred_temp              <- knn(train = train_scaled,
                                cl    = train_output,
                                test  = test_scaled,
                                k     = n)
  resultado$precision[n] <- mean(pred_temp == test_output)
}

resultado
##     k precision
## 1   1     0.570
## 2   2     0.524
## 3   3     0.572
## 4   4     0.586
## 5   5     0.594
## 6   6     0.592
## 7   7     0.598
## 8   8     0.596
## 9   9     0.596
## 10 10     0.600
## 11 11     0.618
## 12 12     0.624
## 13 13     0.628
## 14 14     0.624
## 15 15     0.608
## 16 16     0.618
## 17 17     0.618
## 18 18     0.618
## 19 19     0.620
## 20 20     0.618
## 21 21     0.614
## 22 22     0.620
## 23 23     0.628
## 24 24     0.638
## 25 25     0.630
## 26 26     0.628
## 27 27     0.630
## 28 28     0.630
## 29 29     0.626
## 30 30     0.628
## 31 31     0.632
## 32 32     0.630
## 33 33     0.638
## 34 34     0.636
## 35 35     0.638
## 36 36     0.638
## 37 37     0.642
## 38 38     0.638
## 39 39     0.642
## 40 40     0.642
## 41 41     0.642
## 42 42     0.644
## 43 43     0.640
## 44 44     0.636
## 45 45     0.636
## 46 46     0.638
## 47 47     0.638
## 48 48     0.638
## 49 49     0.638
## 50 50     0.642
## 51 51     0.640
## 52 52     0.642
## 53 53     0.644
## 54 54     0.644
## 55 55     0.646
## 56 56     0.642
## 57 57     0.644
## 58 58     0.644
## 59 59     0.644
## 60 60     0.644
k_optimo <- resultado$k[which.max(resultado$precision)]
cat("K óptimo:", k_optimo, "| Precisión:", round(max(resultado$precision), 4), "\n")
## K óptimo: 55 | Precisión: 0.646
pred_final <- knn(train = train_scaled,
                  cl    = train_output,
                  test  = test_scaled,
                  k     = k_optimo)

5.2 GRAFICO DE PRESICION CON CLASS

library(plotly)
library(scales)

grafico_precision <- plot_ly(resultado, x = ~k) %>%
  add_lines(
    y = ~precision,
    line = list(color = "#2b6cb0", width = 3, shape = "spline"),
    name = "Precisión",
    hovertemplate = "k = %{x}<br>Precisión = %{y:.3f}<extra></extra>"
  ) %>%
  add_markers(
    y = ~precision,
    marker = list(
      size = 8,
      color = ~precision,
      colorscale = list(c(0, 1), c("#90cdf4", "#2b6cb0")),
      line = list(color = "white", width = 1.5),
      opacity = 0.9,
      showscale = TRUE,
      colorbar = list(
        title = "Precisión",
        tickformat = ".0%",
        len = 0.5, y = 0.5, yanchor = "middle"
      )
    ),
    hoverinfo = "text",
    text = ~paste("<b>k =", k, "</b><br>",
                  "Precisión: ", scales::percent(precision, accuracy = 0.1), "<br>",
                  "Valor exacto: ", round(precision, 4)),
    showlegend = FALSE
  ) %>%
  add_segments(
    x = k_optimo, xend = k_optimo,
    y = 0, yend = max(resultado$precision),
    line = list(color = "#e53e3e", width = 2.5, dash = "dash"),
    name = paste("k óptimo =", k_optimo),
    hoverinfo = "none"
  ) %>%
  layout(
    title = list(
      text = "<b>Precisión del Modelo KNN según Número de Vecinos (k)</b>",
      font = list(size = 18, color = "#2b6cb0"),
      x = 0.05
    ),
    xaxis = list(
      title = list(text = "Número de Vecinos (k)", font = list(size = 13)),
      gridcolor = "#e2e8f0",
      range = c(min(resultado$k) - 0.5, max(resultado$k) + 0.5)
    ),
    yaxis = list(
      title = list(text = "Precisión", font = list(size = 13)),
      gridcolor = "#e2e8f0",
      tickformat = ".0%",
      range = c(min(resultado$precision) - 0.02, max(resultado$precision) + 0.02)
    ),
    plot_bgcolor  = "#f7fafc",
    paper_bgcolor = "white",
    margin = list(l = 80, r = 80, t = 100, b = 100),
    annotations = list(
      list(
        x = k_optimo,
        y = max(resultado$precision) - 0.015,
        text = paste("<b>k óptimo =", k_optimo, "</b>"),
        showarrow = FALSE,
        font = list(size = 13, color = "#2b6cb0"),
        bgcolor = "#bee3f8",
        bordercolor = "#2b6cb0",
        borderwidth = 2,
        borderpad = 8
      ),
      list(
        x = 0.02, y = 0.98,
        xref = "paper", yref = "paper",
        text = paste("<b>Máxima precisión:</b>",
                     scales::percent(max(resultado$precision), accuracy = 0.1), "<br>",
                     "<b>Mejor k:</b>", k_optimo, "<br>",
                     "<b>Rango evaluado:</b>", min(resultado$k), "-", max(resultado$k)),
        showarrow = FALSE,
        align = "left",
        font = list(size = 11, color = "#2d3748"),
        bgcolor = "rgba(255,255,255,0.8)",
        bordercolor = "#e2e8f0",
        borderwidth = 1,
        borderpad = 8
      ),
      list(
        x = 1, y = -0.15,
        xref = "paper", yref = "paper",
        text = "Fuente: Elaboración propia con base en datos_uso_redes.csv",
        showarrow = FALSE,
        xanchor = "right",
        font = list(size = 10, color = "#718096")
      )
    )
  ) %>%
  config(displayModeBar = TRUE, displaylogo = FALSE)

grafico_precision

En la primera gráfica del modelo knn representa un comportamiento conforme aumenta el número de vecinos k, observando así que para valores muy pequeños de k la precisión tiene algunas variaciones importantes iniciando alrededor del 57% y llegando incluso a una disminuir al 52% aproximadamente sin embargo conforme aumenta el número de vecinos incrementa la precisión y comienza a estandarizarse

El valor óptimo es k igual a 55 siendo este el de una precisión máxima cercana al 64.6%, indicando que el modelo logra un comportamiento estable cuando considera un número mayor de vecinos, además la gráfica muestra que después de los valores la curva entra en una etapa de estabilidad,siendo este el comportamiento sugiere que los datos presentan unos patrones relativamente similares entre sí

5.3 MATRIZ DE CONFUSION

library(kableExtra)
library(caret)
pred_final_adj  <- factor(pred_final,  levels = c("buena", "mala"))
test_output_adj <- factor(test_output, levels = c("buena", "mala"))

cm <- confusionMatrix(pred_final_adj, test_output_adj, positive = "buena")

matriz_conf <- as.data.frame(cm$table)

matriz_tabla <- matrix(
  c(matriz_conf$Freq[1], matriz_conf$Freq[2],
    matriz_conf$Freq[3], matriz_conf$Freq[4]),
  nrow = 2, byrow = TRUE,
  dimnames = list(
    "Predicción" = c("buena", "mala"),
    "Real"       = c("buena", "mala")
  )
)

as.table(matriz_tabla) %>%
  kbl(
    caption   = "Matriz de Confusión - Modelo KNN",
    align     = c("c", "c", "c"),
    col.names = c("Buena", "Mala")
  ) %>%
  kable_styling(
    bootstrap_options = "basic",
    full_width        = FALSE,
    font_size         = 14,
    position          = "center"
  ) %>%
  add_header_above(
    c(" " = 1, "Valor Real" = 2),
    bold       = TRUE,
    background = "#2b6cb0",
    color      = "white"
  ) %>%
  row_spec(0, background = "#1a365d", color = "white", bold = TRUE) %>%
  row_spec(1:2, background = "#ebf8ff") %>%
  column_spec(1, bold = TRUE, width = "3cm", background = "#bee3f8") %>%
  footnote(
    general           = "Los valores en la diagonal representan las clasificaciones correctas.",
    general_title     = "Nota:",
    footnote_as_chunk = TRUE
  )
Matriz de Confusión - Modelo KNN
Valor Real
Buena Mala
buena 1 177
mala 1 321
Nota: Los valores en la diagonal representan las clasificaciones correctas.

La matriz de confusión del modelo knn, es una herramienta fundamental para evaluar el desempeño real de la clasificación, observando que el modelo clasificado corresponde únicamente a un caso de salud mental buena y 321 casos de salud mental mala, donde también se representaron 177 casos como erróneos donde no se pudieron clasificar si fueron buenas o malas.

Siendo estos los resultados, el modelo presenta un fuerte sesgo hacia la categoría mala debido a que todos los resultados de las predicciones son asignadas a esta clase aunque este modelo diga que la mayoría de casos son negativos puede llegar a tener una enorme dificultad para reconocer casos positivos relacionados con la salud mental

5.4 METRICAS DE EVALUACION DEL MODELO KNN CLASS

metricas_knn <- data.frame(
  "Métrica" = c(
    "Exactitud (Accuracy)",
    "Intervalo de Confianza 95%",
    "Tasa de No Información",
    "Valor P [Exactitud > TNI]",
    "Kappa de Cohen",
    "Valor P Test de McNemar",
    "Sensibilidad (Recall)",
    "Especificidad",
    "Valor Predictivo Positivo (Precision)",
    "Valor Predictivo Negativo",
    "Prevalencia",
    "Tasa de Detección",
    "Prevalencia de Detección",
    "Exactitud Balanceada"
  ),
  "Descripción" = c(
    "Proporción total de predicciones correctas",
    "Intervalo de confianza para la exactitud",
    "Tasa al predecir siempre la clase mayoritaria",
    "Significancia estadística vs tasa base",
    "Acuerdo ajustado por azar entre observado y predicho",
    "Test de simetría entre clasificaciones erróneas",
    "Capacidad de detectar salud mental buena (VP / VP+FN)",
    "Capacidad de detectar salud mental mala (VN / VN+FP)",
    "Precisión para clase 'buena' (VP / VP+FP)",
    "Precisión para clase 'mala' (VN / VN+FN)",
    "Proporción real de salud mental buena",
    "Tasa de detección de salud buena (VP / total)",
    "Proporción predicha de salud buena (VP+FP / total)",
    "Promedio entre sensibilidad y especificidad"
  ),
  "Valor" = c(
    sprintf("%.4f", cm$overall["Accuracy"]),
    sprintf("(%.4f, %.4f)", cm$overall["AccuracyLower"], cm$overall["AccuracyUpper"]),
    sprintf("%.4f", cm$overall["AccuracyNull"]),
    sprintf("%.2e", cm$overall["AccuracyPValue"]),
    sprintf("%.4f", cm$overall["Kappa"]),
    sprintf("%.5f", cm$overall["McnemarPValue"]),
    sprintf("%.4f", cm$byClass["Sensitivity"]),
    sprintf("%.4f", cm$byClass["Specificity"]),
    sprintf("%.4f", cm$byClass["Pos Pred Value"]),
    sprintf("%.4f", cm$byClass["Neg Pred Value"]),
    sprintf("%.4f", cm$byClass["Prevalence"]),
    sprintf("%.4f", cm$byClass["Detection Rate"]),
    sprintf("%.4f", cm$byClass["Detection Prevalence"]),
    sprintf("%.4f", cm$byClass["Balanced Accuracy"])
  )
)

metricas_knn %>%
  kbl(
    caption   = "Métricas de Evaluación del Modelo KNN",
    align     = c("l", "l", "c"),
    col.names = c("Métrica", "Descripción", "Valor")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 14,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  row_spec(1:nrow(metricas_knn), background = "#ebf8ff") %>%
  column_spec(1, bold = TRUE, width = "3.5cm") %>%
  column_spec(2, width = "6cm") %>%
  column_spec(3, width = "2.5cm") %>%
  footnote(
    general           = "VP = Verdadero Positivo, VN = Verdadero Negativo, FP = Falso Positivo, FN = Falso Negativo",
    general_title     = "Leyenda:",
    footnote_as_chunk = TRUE
  )
Métricas de Evaluación del Modelo KNN
Métrica Descripción Valor
Exactitud (Accuracy) Proporción total de predicciones correctas 0.6440
Intervalo de Confianza 95% Intervalo de confianza para la exactitud (0.6003, 0.6860)
Tasa de No Información Tasa al predecir siempre la clase mayoritaria 0.6440
Valor P [Exactitud > TNI] Significancia estadística vs tasa base 5.20e-01
Kappa de Cohen Acuerdo ajustado por azar entre observado y predicho 0.0032
Valor P Test de McNemar Test de simetría entre clasificaciones erróneas 0.00000
Sensibilidad (Recall) Capacidad de detectar salud mental buena (VP / VP+FN) 0.0056
Especificidad Capacidad de detectar salud mental mala (VN / VN+FP) 0.9969
Valor Predictivo Positivo (Precision) Precisión para clase ‘buena’ (VP / VP+FP) 0.5000
Valor Predictivo Negativo Precisión para clase ‘mala’ (VN / VN+FN) 0.6446
Prevalencia Proporción real de salud mental buena 0.3560
Tasa de Detección Tasa de detección de salud buena (VP / total) 0.0020
Prevalencia de Detección Proporción predicha de salud buena (VP+FP / total) 0.0040
Exactitud Balanceada Promedio entre sensibilidad y especificidad 0.5013
Leyenda: VP = Verdadero Positivo, VN = Verdadero Negativo, FP = Falso Positivo, FN = Falso Negativo

En la siguiente tabla de métricas de evaluación del modelo knn, muestra una exactitud del modelo de 64.4% indicando que este podría interpretarse como un resultado aceptable, sin embargo al lograr observar las otras métricas el modelo aparecen importantes limitaciones

Al analizar la sensibilidad tuvo un valor extremadamente bajo de 0.0056 indicando que el modelo no logra detectar correctamente el caso de salud mental como buena por otro lado la especificidad alcanzó un valor muy alto de 0.9969 indicando que es perfectamente como categoría mala

Otro punto a analizar fue el valor p con su valor de 0.52 indicando que el modelo no mejora significativamente frente a la clasificación en términos generales sino que el modelo tiene dificultades importantes para clasificar equilibradamente las categorías de salud mental

5.5 MODELO KNN CON CARET

library(readr)
library(dplyr)
library(caret)
library(pROC)
datos_uso_redes <- read_csv("datos_uso_redes.csv")
base1 <- datos_uso_redes[, c( "self_reported_mental_health_score" , "age" ,"platforms_used_count" , "daily_usage_hours", "sessions_per_day" , "takes_social_media_breaks")]
base_filtrada <- base1 %>%
  rename(
    salud = self_reported_mental_health_score,
    edad = age,
    plataformas_usadas = platforms_used_count,
    promh_uso_redes = daily_usage_hours,
    num_ingreso_dia = sessions_per_day,
    pausas_voluntaria = takes_social_media_breaks
  )
base_filtrada$pausas_voluntaria <- as.numeric(factor(base_filtrada$pausas_voluntaria))
base_filtrada$salud_mental <- factor(
  ifelse(base_filtrada$salud >= 7, "buena", "mala"),
  levels = c("buena", "mala")
)

base_filtrada <- base_filtrada %>% select(-salud)

set.seed(28)
index_muestra <- sample(1:nrow(base_filtrada), nrow(base_filtrada))
index_entrena <- index_muestra[1:round(nrow(base_filtrada) * 0.75)]
index_test    <- index_muestra[(round(nrow(base_filtrada) * 0.75) + 1):length(index_muestra)]

train <- base_filtrada[index_entrena, ]
test  <- base_filtrada[index_test, ]

train <- na.omit(train)
test  <- na.omit(test)

ctrl_knn <- trainControl(
  method          = "cv",
  number          = 5,
  classProbs      = TRUE,
  summaryFunction = twoClassSummary
)

knn_modelo <- train(
  salud_mental ~ .,
  data       = train,
  method     = "knn",
  trControl  = ctrl_knn,
  preProcess = c("center", "scale"),
  tuneLength = 200,
  metric     = "ROC"
)

pred_clase_knn <- predict(knn_modelo, newdata = test)
pred_prob_knn  <- predict(knn_modelo, newdata = test, type = "prob")
pred_clase_adj  <- factor(pred_clase_knn, levels = c("buena", "mala"))
test_output_adj <- factor(test$salud_mental, levels = c("buena", "mala"))

knn_modelo
## k-Nearest Neighbors 
## 
## 1500 samples
##    5 predictor
##    2 classes: 'buena', 'mala' 
## 
## Pre-processing: centered (5), scaled (5) 
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 1200, 1200, 1200, 1200, 1200 
## Resampling results across tuning parameters:
## 
##   k    ROC        Sens         Spec     
##     5  0.5207548  0.224242424  0.7960199
##     7  0.5065330  0.183838384  0.8199005
##     9  0.5081914  0.149494949  0.8626866
##    11  0.5136690  0.141414141  0.8915423
##    13  0.5143173  0.117171717  0.9064677
##    15  0.5191115  0.111111111  0.9134328
##    17  0.5218202  0.076767677  0.9303483
##    19  0.5217549  0.076767677  0.9502488
##    21  0.5275893  0.062626263  0.9542289
##    23  0.5250214  0.062626263  0.9611940
##    25  0.5207347  0.056565657  0.9691542
##    27  0.5248404  0.048484848  0.9691542
##    29  0.5236293  0.050505051  0.9791045
##    31  0.5238856  0.050505051  0.9830846
##    33  0.5214734  0.044444444  0.9890547
##    35  0.5183527  0.034343434  0.9900498
##    37  0.5147796  0.028282828  0.9870647
##    39  0.5130911  0.020202020  0.9880597
##    41  0.5139957  0.020202020  0.9920398
##    43  0.5128650  0.020202020  0.9920398
##    45  0.5166290  0.018181818  0.9910448
##    47  0.5193527  0.014141414  0.9920398
##    49  0.5147143  0.010101010  0.9950249
##    51  0.5100457  0.010101010  0.9940299
##    53  0.5105784  0.008080808  0.9960199
##    55  0.5105483  0.004040404  0.9990050
##    57  0.5088547  0.004040404  1.0000000
##    59  0.5082969  0.002020202  1.0000000
##    61  0.5044374  0.004040404  1.0000000
##    63  0.5052415  0.004040404  1.0000000
##    65  0.5077240  0.000000000  1.0000000
##    67  0.5060506  0.000000000  1.0000000
##    69  0.5001357  0.000000000  1.0000000
##    71  0.5026031  0.000000000  1.0000000
##    73  0.5062867  0.000000000  1.0000000
##    75  0.5108448  0.000000000  1.0000000
##    77  0.5126589  0.000000000  1.0000000
##    79  0.5121664  0.000000000  1.0000000
##    81  0.5111111  0.000000000  1.0000000
##    83  0.5085884  0.000000000  1.0000000
##    85  0.5106488  0.000000000  1.0000000
##    87  0.5057641  0.000000000  1.0000000
##    89  0.5049399  0.000000000  1.0000000
##    91  0.5024825  0.000000000  1.0000000
##    93  0.5030002  0.000000000  1.0000000
##    95  0.5008543  0.000000000  1.0000000
##    97  0.5029047  0.000000000  1.0000000
##    99  0.5001658  0.000000000  1.0000000
##   101  0.4986281  0.000000000  1.0000000
##   103  0.4931052  0.000000000  1.0000000
##   105  0.4919091  0.000000000  1.0000000
##   107  0.4914518  0.000000000  1.0000000
##   109  0.4904216  0.000000000  1.0000000
##   111  0.4938489  0.000000000  1.0000000
##   113  0.4953163  0.000000000  1.0000000
##   115  0.4977336  0.000000000  1.0000000
##   117  0.4994472  0.000000000  1.0000000
##   119  0.4978843  0.000000000  1.0000000
##   121  0.4960300  0.000000000  1.0000000
##   123  0.4945826  0.000000000  1.0000000
##   125  0.4924770  0.000000000  1.0000000
##   127  0.4896628  0.000000000  1.0000000
##   129  0.4881652  0.000000000  1.0000000
##   131  0.4904417  0.000000000  1.0000000
##   133  0.4900246  0.000000000  1.0000000
##   135  0.4881351  0.000000000  1.0000000
##   137  0.4879692  0.000000000  1.0000000
##   139  0.4866928  0.000000000  1.0000000
##   141  0.4873109  0.000000000  1.0000000
##   143  0.4837429  0.000000000  1.0000000
##   145  0.4853862  0.000000000  1.0000000
##   147  0.4847279  0.000000000  1.0000000
##   149  0.4866576  0.000000000  1.0000000
##   151  0.4864767  0.000000000  1.0000000
##   153  0.4892758  0.000000000  1.0000000
##   155  0.4851952  0.000000000  1.0000000
##   157  0.4800945  0.000000000  1.0000000
##   159  0.4792201  0.000000000  1.0000000
##   161  0.4789889  0.000000000  1.0000000
##   163  0.4822906  0.000000000  1.0000000
##   165  0.4817529  0.000000000  1.0000000
##   167  0.4839037  0.000000000  1.0000000
##   169  0.4830544  0.000000000  1.0000000
##   171  0.4839841  0.000000000  1.0000000
##   173  0.4831851  0.000000000  1.0000000
##   175  0.4842806  0.000000000  1.0000000
##   177  0.4851199  0.000000000  1.0000000
##   179  0.4861350  0.000000000  1.0000000
##   181  0.4874918  0.000000000  1.0000000
##   183  0.4858184  0.000000000  1.0000000
##   185  0.4881552  0.000000000  1.0000000
##   187  0.4861249  0.000000000  1.0000000
##   189  0.4851751  0.000000000  1.0000000
##   191  0.4849641  0.000000000  1.0000000
##   193  0.4866224  0.000000000  1.0000000
##   195  0.4882909  0.000000000  1.0000000
##   197  0.4881049  0.000000000  1.0000000
##   199  0.4865169  0.000000000  1.0000000
##   201  0.4853158  0.000000000  1.0000000
##   203  0.4861903  0.000000000  1.0000000
##   205  0.4847932  0.000000000  1.0000000
##   207  0.4831198  0.000000000  1.0000000
##   209  0.4827479  0.000000000  1.0000000
##   211  0.4857832  0.000000000  1.0000000
##   213  0.4837178  0.000000000  1.0000000
##   215  0.4809337  0.000000000  1.0000000
##   217  0.4832203  0.000000000  1.0000000
##   219  0.4824011  0.000000000  1.0000000
##   221  0.4774763  0.000000000  1.0000000
##   223  0.4771144  0.000000000  1.0000000
##   225  0.4753907  0.000000000  1.0000000
##   227  0.4765064  0.000000000  1.0000000
##   229  0.4748530  0.000000000  1.0000000
##   231  0.4745766  0.000000000  1.0000000
##   233  0.4745967  0.000000000  1.0000000
##   235  0.4769938  0.000000000  1.0000000
##   237  0.4755616  0.000000000  1.0000000
##   239  0.4767727  0.000000000  1.0000000
##   241  0.4773104  0.000000000  1.0000000
##   243  0.4791196  0.000000000  1.0000000
##   245  0.4784864  0.000000000  1.0000000
##   247  0.4772903  0.000000000  1.0000000
##   249  0.4759134  0.000000000  1.0000000
##   251  0.4786070  0.000000000  1.0000000
##   253  0.4815267  0.000000000  1.0000000
##   255  0.4810292  0.000000000  1.0000000
##   257  0.4780994  0.000000000  1.0000000
##   259  0.4790542  0.000000000  1.0000000
##   261  0.4771496  0.000000000  1.0000000
##   263  0.4775315  0.000000000  1.0000000
##   265  0.4796573  0.000000000  1.0000000
##   267  0.4800392  0.000000000  1.0000000
##   269  0.4790844  0.000000000  1.0000000
##   271  0.4802201  0.000000000  1.0000000
##   273  0.4776019  0.000000000  1.0000000
##   275  0.4766571  0.000000000  1.0000000
##   277  0.4780240  0.000000000  1.0000000
##   279  0.4782200  0.000000000  1.0000000
##   281  0.4786773  0.000000000  1.0000000
##   283  0.4783959  0.000000000  1.0000000
##   285  0.4772149  0.000000000  1.0000000
##   287  0.4777175  0.000000000  1.0000000
##   289  0.4805066  0.000000000  1.0000000
##   291  0.4807327  0.000000000  1.0000000
##   293  0.4828182  0.000000000  1.0000000
##   295  0.4848937  0.000000000  1.0000000
##   297  0.4838384  0.000000000  1.0000000
##   299  0.4842555  0.000000000  1.0000000
##   301  0.4853510  0.000000000  1.0000000
##   303  0.4863159  0.000000000  1.0000000
##   305  0.4860898  0.000000000  1.0000000
##   307  0.4839791  0.000000000  1.0000000
##   309  0.4864013  0.000000000  1.0000000
##   311  0.4871149  0.000000000  1.0000000
##   313  0.4876024  0.000000000  1.0000000
##   315  0.4877180  0.000000000  1.0000000
##   317  0.4904769  0.000000000  1.0000000
##   319  0.4890899  0.000000000  1.0000000
##   321  0.4879290  0.000000000  1.0000000
##   323  0.4906277  0.000000000  1.0000000
##   325  0.4913111  0.000000000  1.0000000
##   327  0.4917885  0.000000000  1.0000000
##   329  0.4938439  0.000000000  1.0000000
##   331  0.4907332  0.000000000  1.0000000
##   333  0.4906880  0.000000000  1.0000000
##   335  0.4927584  0.000000000  1.0000000
##   337  0.4944369  0.000000000  1.0000000
##   339  0.4924619  0.000000000  1.0000000
##   341  0.4917936  0.000000000  1.0000000
##   343  0.4934972  0.000000000  1.0000000
##   345  0.4948691  0.000000000  1.0000000
##   347  0.4934720  0.000000000  1.0000000
##   349  0.4934871  0.000000000  1.0000000
##   351  0.4922006  0.000000000  1.0000000
##   353  0.4911704  0.000000000  1.0000000
##   355  0.4904317  0.000000000  1.0000000
##   357  0.4894065  0.000000000  1.0000000
##   359  0.4909041  0.000000000  1.0000000
##   361  0.4934821  0.000000000  1.0000000
##   363  0.4922358  0.000000000  1.0000000
##   365  0.4921755  0.000000000  1.0000000
##   367  0.4906729  0.000000000  1.0000000
##   369  0.4910297  0.000000000  1.0000000
##   371  0.4917785  0.000000000  1.0000000
##   373  0.4921705  0.000000000  1.0000000
##   375  0.4919192  0.000000000  1.0000000
##   377  0.4892809  0.000000000  1.0000000
##   379  0.4884316  0.000000000  1.0000000
##   381  0.4894216  0.000000000  1.0000000
##   383  0.4881602  0.000000000  1.0000000
##   385  0.4872808  0.000000000  1.0000000
##   387  0.4884416  0.000000000  1.0000000
##   389  0.4865722  0.000000000  1.0000000
##   391  0.4870144  0.000000000  1.0000000
##   393  0.4852957  0.000000000  1.0000000
##   395  0.4901603  0.000000000  1.0000000
##   397  0.4915071  0.000000000  1.0000000
##   399  0.4914820  0.000000000  1.0000000
##   401  0.4934670  0.000000000  1.0000000
##   403  0.4946078  0.000000000  1.0000000
## 
## ROC was used to select the optimal model using the largest value.
## The final value used for the model was k = 21.

5.6 GRAFICA ROC KNN CARET

library(plotly)
grafico_ROC <- plot_ly(knn_modelo$results, x = ~k) %>%
  add_lines(
    y = ~ROC,
    line = list(color = "#2b6cb0", width = 3, shape = "spline"),
    name = "AUC (ROC)",
    hovertemplate = "k = %{x}<br>AUC = %{y:.3f}<extra></extra>"
  ) %>%
  add_markers(
    y = ~ROC,
    marker = list(
      size = 8,
      color = ~ROC,
      colorscale = list(c(0, 1), c("#90cdf4", "#2b6cb0")),
      line = list(color = "white", width = 1.5),
      opacity = 0.9,
      showscale = TRUE,
      colorbar = list(
        title = "AUC (ROC)",
        tickformat = ".3f",
        len = 0.5, y = 0.5, yanchor = "middle"
      )
    ),
    hoverinfo = "text",
    text = ~paste("<b>k =", k, "</b><br>",
                  "AUC: ", round(ROC, 4)),
    showlegend = FALSE
  ) %>%
  add_segments(
    x = knn_modelo$bestTune$k, xend = knn_modelo$bestTune$k,
    y = 0, yend = max(knn_modelo$results$ROC),
    line = list(color = "#e53e3e", width = 2.5, dash = "dash"),
    name = paste("k óptimo =", knn_modelo$bestTune$k),
    hoverinfo = "none"
  ) %>%
  layout(
    title = list(
      text = "<b>AUC del Modelo KNN según Número de Vecinos (k)</b>",
      font = list(size = 18, color = "#2b6cb0"),
      x = 0.05
    ),
    xaxis = list(
      title = list(text = "Número de Vecinos (k)", font = list(size = 13)),
      gridcolor = "#e2e8f0",
      tickangle = 45,
      dtick = 10,
      range = c(min(knn_modelo$results$k) - 0.5, max(knn_modelo$results$k) + 0.5)
    ),
    yaxis = list(
      title = list(text = "Área bajo la curva (ROC)", font = list(size = 13)),
      gridcolor = "#e2e8f0",
      range = c(min(knn_modelo$results$ROC) - 0.02, max(knn_modelo$results$ROC) + 0.02)
    ),
    plot_bgcolor  = "#f7fafc",
    paper_bgcolor = "white",
    margin = list(l = 80, r = 80, t = 100, b = 100),
    hoverlabel = list(bgcolor = "white", bordercolor = "#2b6cb0"),
    annotations = list(
      list(
        x = knn_modelo$bestTune$k,
        y = max(knn_modelo$results$ROC) - 0.015,
        text = paste("<b>k óptimo =", knn_modelo$bestTune$k, "</b>"),
        showarrow = FALSE,
        font = list(size = 13, color = "white"),
        bgcolor = "#2b6cb0",
        bordercolor = "#1a365d",
        borderwidth = 2,
        borderpad = 8,
        opacity = 0.9
      ),
      list(
        x = 0.02, y = 0.98,
        xref = "paper", yref = "paper",
        text = paste("<b>Máximo AUC:</b>", round(max(knn_modelo$results$ROC), 4), "<br>",
                     "<b>Mejor k:</b>", knn_modelo$bestTune$k, "<br>",
                     "<b>Rango evaluado:</b>", min(knn_modelo$results$k), "-", max(knn_modelo$results$k)),
        showarrow = FALSE,
        align = "left",
        font = list(size = 11, color = "#2d3748"),
        bgcolor = "rgba(255,255,255,0.8)",
        bordercolor = "#e2e8f0",
        borderwidth = 1,
        borderpad = 8
      ),
      list(
        x = 0.5, y = 0.99,
        xref = "paper", yref = "paper",
        text = "El valor óptimo de k maximiza el área bajo la curva ROC en validación cruzada (5-fold)",
        showarrow = FALSE,
        font = list(size = 11, color = "#2b6cb0")
      ),
      list(
        x = 1, y = -0.15,
        xref = "paper", yref = "paper",
        text = "Fuente: Elaboración propia con base en datos_uso_redes.csv",
        showarrow = FALSE,
        xanchor = "right",
        font = list(size = 10, color = "#718096")
      )
    )
  ) %>%
  config(
    displayModeBar = TRUE,
    modeBarButtonsToRemove = c("pan2d", "lasso2d", "select2d"),
    displaylogo = FALSE
  )

grafico_ROC

5.7 METRICAS DE EVALUACION KNN CARET

library(kableExtra)

cm_caret <- confusionMatrix(pred_clase_adj, test_output_adj, positive = "buena")

acc          <- round(cm_caret$overall["Accuracy"], 4)
acc_ci       <- paste0("(", round(cm_caret$overall[["AccuracyLower"]], 4), ", ",
                       round(cm_caret$overall[["AccuracyUpper"]], 4), ")")
no_info_rate <- round(as.numeric(cm_caret$overall[[3]]), 4)
kappa        <- round(cm_caret$overall["Kappa"], 4)
mcnemar      <- formatC(as.numeric(cm_caret$overall["McnemarPValue"]), format = "e", digits = 2)

metricas_tabla <- data.frame(
  Métrica = c(
    "Accuracy (Exactitud)",
    "95% CI (Intervalo de Confianza)",
    "No Information Rate",
    "P-Value [Acc > NIR]",
    "Kappa",
    "Mcnemar's Test P-Value",
    "Sensitivity",
    "Specificity",
    "Pos Pred Value",
    "Neg Pred Value",
    "Prevalence",
    "Detection Rate",
    "Detection Prevalence",
    "Balanced Accuracy"
  ),
  Valor = c(
    acc,
    acc_ci,
    no_info_rate,
    formatC(as.numeric(cm_caret$overall["AccuracyPValue"]), format = "e", digits = 2),
    kappa,
    mcnemar,
    round(cm_caret$byClass["Sensitivity"], 4),
    round(cm_caret$byClass["Specificity"], 4),
    round(cm_caret$byClass["Pos Pred Value"], 4),
    round(cm_caret$byClass["Neg Pred Value"], 4),
    round(cm_caret$byClass["Prevalence"], 4),
    round(cm_caret$byClass["Detection Rate"], 4),
    round(cm_caret$byClass["Detection Prevalence"], 4),
    round(cm_caret$byClass["Balanced Accuracy"], 4)
  ),
  Interpretación = c(
    paste0("El modelo clasifica correctamente el ", round(acc*100, 1), "% de los casos de salud mental."),
    "Rango donde se ubica el verdadero desempeño del modelo con 95% de confianza.",
    paste0("Un modelo trivial que predice siempre 'buena' tendría un acierto del ", round(no_info_rate*100, 1), "%."),
    "Evalúa si la precisión del modelo es significativamente mejor que el azar.",
    paste0("Kappa de ", kappa, " indica el nivel de acuerdo entre predicciones y valores reales corregido por azar."),
    "Evalúa si el modelo se equivoca de forma simétrica entre ambas clases.",
    paste0("El modelo identifica correctamente el ", round(cm_caret$byClass["Sensitivity"]*100, 1), "% de los casos de salud mental buena."),
    paste0("Detecta correctamente el ", round(cm_caret$byClass["Specificity"]*100, 1), "% de los casos de salud mental mala."),
    "Cuando predice 'buena', esta es la proporción de aciertos.",
    "Cuando predice 'mala', esta es la proporción de aciertos.",
    "Proporción real de casos con salud mental buena en el conjunto de prueba.",
    "Proporción de casos de salud buena detectados correctamente del total.",
    "Proporción de casos predichos como 'buena' del total.",
    "Promedio entre sensibilidad y especificidad como medida de desempeño global."
  )
)

color_valor <- function(x) {
  val <- suppressWarnings(as.numeric(x))
  ifelse(is.na(val), "",
    ifelse(val > 0.7, "color: #27ae60; font-weight: bold;",
    ifelse(val > 0.6, "color: #2e86c1; font-weight: bold;",
    ifelse(val > 0.5, "color: #f39c12;",
                      "color: #c0392b;"))))
}

colores_valor <- sapply(metricas_tabla$Valor, color_valor)

metricas_tabla %>%
  kbl(
    caption   = "Métricas de Evaluación - Modelo KNN (caret)",
    align     = c("l", "c", "l"),
    col.names = c("Métrica", "Valor", "Interpretación"),
    escape    = FALSE
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 13,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  row_spec(1:14, background = "#fafafa") %>%
  row_spec(c(1, 7, 8, 14), background = "#ebf8ff") %>%
  column_spec(1, bold = TRUE, width = "3.5cm") %>%
  column_spec(2, width = "2.5cm",
              color = sapply(metricas_tabla$Valor, function(x) {
                val <- suppressWarnings(as.numeric(x))
                ifelse(is.na(val), "black",
                ifelse(val > 0.7, "#27ae60",
                ifelse(val > 0.6, "#2e86c1",
                ifelse(val > 0.5, "#f39c12", "#c0392b"))))
              }),
              bold = sapply(metricas_tabla$Valor, function(x) {
                val <- suppressWarnings(as.numeric(x))
                !is.na(val) & val > 0.6
              })
  ) %>%
  column_spec(3, width = "10cm") %>%
  footnote(
    general       = "Elaboración propia con base en datos_uso_redes.csv. Colores: 🟢 Alto (>0.7) 🔵 Medio-Alto (>0.6) 🟠 Moderado (>0.5) 🔴 Bajo (≤0.5)",
    general_title = "Nota:",
    footnote_as_chunk = TRUE
  )
Métricas de Evaluación - Modelo KNN (caret)
Métrica Valor Interpretación
Accuracy (Exactitud) 0.624 El modelo clasifica correctamente el 62.4% de los casos de salud mental.
95% CI (Intervalo de Confianza) (0.5799, 0.6666) Rango donde se ubica el verdadero desempeño del modelo con 95% de confianza.
No Information Rate 0.5799 Un modelo trivial que predice siempre ‘buena’ tendría un acierto del 58%.
P-Value [Acc > NIR] 8.37e-01 Evalúa si la precisión del modelo es significativamente mejor que el azar.
Kappa -0.0135 Kappa de -0.0135 indica el nivel de acuerdo entre predicciones y valores reales corregido por azar.
Mcnemar’s Test P-Value 3.32e-28 Evalúa si el modelo se equivoca de forma simétrica entre ambas clases.
Sensitivity 0.0449 El modelo identifica correctamente el 4.5% de los casos de salud mental buena.
Specificity 0.9441 Detecta correctamente el 94.4% de los casos de salud mental mala.
Pos Pred Value 0.3077 Cuando predice ‘buena’, esta es la proporción de aciertos.
Neg Pred Value 0.6414 Cuando predice ‘mala’, esta es la proporción de aciertos.
Prevalence 0.356 Proporción real de casos con salud mental buena en el conjunto de prueba.
Detection Rate 0.016 Proporción de casos de salud buena detectados correctamente del total.
Detection Prevalence 0.052 Proporción de casos predichos como ‘buena’ del total.
Balanced Accuracy 0.4945 Promedio entre sensibilidad y especificidad como medida de desempeño global.
Nota: Elaboración propia con base en datos_uso_redes.csv. Colores: 🟢 Alto (>0.7) 🔵 Medio-Alto (>0.6) 🟠 Moderado (>0.5) 🔴 Bajo (≤0.5)

La tabla de las principales métricas de evaluación, muestra resultados que evidencian un desempeño limitado en la clasificación de los casos de salud mental. Pese a que la exactitud alcanzó un 62,4%, que indica que el modelo clasifica aproximadamente seis de cada diez observaciones, esta no representa una mejora significativa frente al modelo base (No Information Rate), del mismo modo, el coeficiente Kappa cercano a cero revela ausencia de concordancia real entre las predicciones y los resultados observados.

Además, la sensibilidad sumamente baja muestra que el modelo posee dificultades importantes para identificar correctamente los casos positivos, mientras que la alta especificidad evidencia tendencia hacia la clasificación de la clase negativa. Las métricas sugieren que el modelo requiere mejoras metodológicas para lograr una capacidad predictiva más equilibrada y confiable.

5.8 MODELO LOGIT

library(pROC)
train_logit <- train %>%
  mutate(salud_num = as.numeric(salud_mental == "buena"))

test_logit <- test %>%
  mutate(salud_num = as.numeric(salud_mental == "buena"))

train_logit <- train_logit[complete.cases(train_logit$salud_num), ]
test_logit  <- test_logit[complete.cases(test_logit$salud_num), ]

fit_logit <- glm(salud_num ~ edad + plataformas_usadas + promh_uso_redes + 
                              num_ingreso_dia + pausas_voluntaria,
                 data   = train_logit,
                 family = binomial())
summary(fit_logit)
## 
## Call:
## glm(formula = salud_num ~ edad + plataformas_usadas + promh_uso_redes + 
##     num_ingreso_dia + pausas_voluntaria, family = binomial(), 
##     data = train_logit)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)  
## (Intercept)        -0.6396932  0.3107176  -2.059   0.0395 *
## edad                0.0063630  0.0071556   0.889   0.3739  
## plataformas_usadas -0.0509984  0.0384403  -1.327   0.1846  
## promh_uso_redes    -0.0025299  0.0294506  -0.086   0.9315  
## num_ingreso_dia    -0.0007452  0.0249653  -0.030   0.9762  
## pausas_voluntaria  -0.0386285  0.0679719  -0.568   0.5698  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1902.5  on 1499  degrees of freedom
## Residual deviance: 1899.6  on 1494  degrees of freedom
## AIC: 1911.6
## 
## Number of Fisher Scoring iterations: 4
p_hat <- predict(fit_logit, newdata = test_logit, type = "response")
roc_logit <- roc(response  = test_logit$salud_mental,
                 predictor = p_hat,
                 levels    = c("mala", "buena"),
                 quiet    = TRUE)

thr    <- coords(roc_logit, x = "best", best.method = "youden", ret = "threshold")
umbral <- as.numeric(thr)
pred_clase_logit <- factor(ifelse(p_hat >= umbral, "buena", "mala"),
                           levels = c("buena", "mala"))
test_output_logit <- factor(test_logit$salud_mental, levels = c("buena", "mala"))

5.9 RESULTADOS DEL MODELO DE REGRESION LOGISTICA

library(kableExtra)
library(broom)
tabla_logit <- broom::tidy(fit_logit) %>%
  rename(
    Variable         = term,
    Coeficiente      = estimate,
    `Error Estándar` = std.error,
    `Estadístico z`  = statistic,
    `Valor p`        = p.value
  ) %>%
  mutate(
    Significancia = case_when(
      `Valor p` < 0.001 ~ "***",
      `Valor p` < 0.01  ~ "**",
      `Valor p` < 0.05  ~ "*",
      `Valor p` < 0.1   ~ ".",
      TRUE ~ ""
    ),
    `OR (e^β)`      = round(exp(Coeficiente), 3),
    Coeficiente     = round(Coeficiente, 6),
    `Error Estándar`= round(`Error Estándar`, 6),
    `Estadístico z` = round(`Estadístico z`, 6),
    `Valor p` = case_when(
      is.na(`Valor p`)  ~ "1",
      `Valor p` < 2e-16 ~ "<2e-16",
      TRUE ~ formatC(`Valor p`, format = "e", digits = 3)
    )
  )

tabla_logit %>%
  kbl(
    caption   = "Resultados del Modelo de Regresión Logística (Logit)",
    align     = c("l", "r", "r", "r", "r", "c", "r"),
    col.names = c("Variable", "Coeficiente", "Error Estándar",
                  "Estadístico z", "Valor p", "Signif.", "OR (e^β)")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 13,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  row_spec(1:nrow(tabla_logit),
           background = ifelse(
             seq_len(nrow(tabla_logit)) %% 2 == 0, "#fafafa", "#ebf8ff"
           )) %>%
  column_spec(1, bold = TRUE, width = "3cm") %>%
  column_spec(2:7, width = "2cm") %>%
  row_spec(
    which(tabla_logit$Significancia %in% c("*", "**", "***")),
    background = "#bee3f8"
  ) %>%
  footnote(
    general       = "Elaboración propia con base en datos_uso_redes.csv.
                     OR (e^β) indica el cambio multiplicativo en la probabilidad de salud mental buena
                     por unidad de cambio en cada variable. Significancia: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1",
    general_title = "Nota:",
    footnote_as_chunk = TRUE
  )
Resultados del Modelo de Regresión Logística (Logit)
Variable Coeficiente Error Estándar Estadístico z Valor p Signif. OR (e^β)
(Intercept) -0.639693 0.310718 -2.058761 3.952e-02
0.527
edad 0.006363 0.007156 0.889236 3.739e-01 1.006
plataformas_usadas -0.050998 0.038440 -1.326690 1.846e-01 0.950
promh_uso_redes -0.002530 0.029451 -0.085904 9.315e-01 0.997
num_ingreso_dia -0.000745 0.024965 -0.029851 9.762e-01 0.999
pausas_voluntaria -0.038628 0.067972 -0.568301 5.698e-01 0.962
Nota: Elaboración propia con base en datos_uso_redes.csv.
OR (e^β) indica el cambio multiplicativo en la probabilidad de salud mental buena
por unidad de cambio en cada variable. Significancia: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1

La tabla de los resultados del modelo de regresión logística (Logit) muestran que ninguna de las variables explicativas presenta relación estadísticamente significativa con la variable respuesta, puesto que todos los valores p asociados a las variables independientes son superiores al nivel de significancia convencional de 0,05. Adicionalmente, los OR (Odds Ratios) obtenidos fueron cercanos a 1, lo que indica efectos bastante débiles de las variables explicativas sobre la variable respuesta, por ende, el modelo evidencia una capacidad reducida para explicar los comportamientos de la salud mental a partir de las variables analizadas en el estudio, estos resultados sugieren que podrían existir otros factores no considerados que influyan de manera significativa en la salud mental de los participantes.

5.10 CURVA ROC DEL MODELO LOGIT

roc_data_logit <- data.frame(
  FalsosPositivos = 1 - roc_logit$specificities,
  Sensibilidad    = roc_logit$sensitivities
) %>%
  arrange(FalsosPositivos)

auc_logit <- round(auc(roc_logit), 3)

punto_optimo_idx <- which.min(abs(roc_logit$thresholds - umbral))
punto_optimo_x   <- 1 - roc_logit$specificities[punto_optimo_idx]
punto_optimo_y   <- roc_logit$sensitivities[punto_optimo_idx]

Curva_ROC_Logit_interactiva <- plot_ly(roc_data_logit,
                                       type = 'scatter',
                                       mode = 'lines') %>%
  add_trace(x = ~FalsosPositivos,
            y = ~Sensibilidad,
            fill      = 'tozeroy',
            fillcolor = 'rgba(250,219,216,0.6)',
            line      = list(color = '#c0392b', width = 3),
            name      = 'Curva ROC',
            hoverinfo = 'text',
            text = ~paste('1-Especificidad:', round(FalsosPositivos, 3),
                          '<br>Sensibilidad:', round(Sensibilidad, 3))) %>%

  add_trace(x    = c(0, 1),
            y    = c(0, 1),
            type = 'scatter',
            mode = 'lines',
            line = list(color = 'grey60', dash = 'dash', width = 1.5),
            name = 'Línea de referencia',
            hoverinfo = 'none') %>%

  add_trace(x    = punto_optimo_x,
            y    = punto_optimo_y,
            type = 'scatter',
            mode = 'markers',
            marker    = list(color = '#922b21', size = 10,
                             line = list(color = 'white', width = 2)),
            name      = 'Umbral óptimo',
            hoverinfo = 'text',
            text = paste('Umbral óptimo:',    round(umbral, 3),
                         '<br>1-Especificidad:', round(punto_optimo_x, 3),
                         '<br>Sensibilidad:',    round(punto_optimo_y, 3))) %>%

  layout(
    title = list(
      text = paste("<b>Curva ROC del Modelo Logit</b><br>",
                   "<sup>Evaluación del desempeño del modelo de regresion logistica</sup>"),
      x    = 0.05,
      font = list(size = 18, color = '#922b21')
    ),
    xaxis = list(
      title      = "<b>1 - Especificidad (Tasa de Falsos Positivos)</b>",
      range      = c(0, 1),
      zeroline   = FALSE,
      gridcolor  = '#ecf0f1',
      tickvals   = seq(0, 1, 0.2),
      ticktext   = seq(0, 1, 0.2)
    ),
    yaxis = list(
      title      = "<b>Sensibilidad (Tasa de Verdaderos Positivos)</b>",
      range      = c(0, 1),
      zeroline   = FALSE,
      gridcolor  = '#ecf0f1',
      tickvals   = seq(0, 1, 0.2),
      ticktext   = seq(0, 1, 0.2)
    ),
    showlegend = TRUE,
    legend = list(
      x        = 0.65,
      y        = 0.15,
      bgcolor  = 'rgba(255,255,255,0.8)',
      bordercolor = '#bdc3c7'
    ),
    annotations = list(
      list(
        x         = 0.65,
        y         = 0.25,
        text      = paste("<b>AUC =", auc_logit, "</b>"),
        showarrow = FALSE,
        font      = list(size = 16, color = '#922b21'),
        bgcolor     = 'rgba(255,255,255,0.8)',
        bordercolor = '#c0392b',
        borderwidth = 1,
        borderpad   = 4
      )
    ),
    plot_bgcolor  = 'rgba(248,249,250,0.8)',
    paper_bgcolor = 'white',
    margin        = list(l = 80, r = 50, t = 100, b = 80)
  ) %>%
  add_annotations(
    x         = 0.65,
    y         = 0.20,
    text      = paste("<b>Umbral óptimo =", round(umbral, 3), "</b>"),
    showarrow = FALSE,
    font        = list(size = 14, color = '#922b21'),
    bgcolor     = 'rgba(255,255,255,0.8)',
    bordercolor = '#c0392b',
    borderwidth = 1,
    borderpad   = 4
  )

Curva_ROC_Logit_interactiva

En la curva ROC (Receiver Operating Characteristics) se puede observar que está muy cercana a la línea diagonal de referencia, lo que indica que el comportamiento de un clasificador aleatorio, el modelo posee una capacidad limitada para distinguir correctamente entre las categorías de salud mental analizadas, en efecto el área bajo la curva AUC = 0,515 confirma este comportamiento, ya que refleja que el modelo tiene desempeño sustancialmente equivalente al azar, mientras que valores cercanos a 1 representan modelos con alta capacidad predictiva. Asimismo, el gráfico muestra un umbral óptimo de 0,33, correspondiente al punto donde se busca un equilibrio entre sensibilidad y especificidad, aun así, utilizando este punto de corte el desempeño general del modelo continúa siendo limitado, debido a la baja separación entre clases.

5.11 UMBRAL CUTOFF

library(tidyr)
performa <- function(cutoff, prob, ref, postarget, negtarget) {
  predict <- factor(ifelse(prob >= cutoff, postarget, negtarget),
                    levels = c(postarget, negtarget))

  if (length(unique(predict)) < 2) return(rep(NA, 4))

  conf <- caret::confusionMatrix(predict, ref, positive = postarget)

  acc  <- conf$overall["Accuracy"]
  rec  <- conf$byClass["Sensitivity"]
  prec <- conf$byClass["Precision"]
  spec <- conf$byClass["Specificity"]

  return(c(recall = rec, accuracy = acc, precision = prec, specificity = spec))
}

co     <- seq(0.01, 0.80, length = 100)
result <- t(sapply(co, performa,
                   prob      = p_hat,
                   ref       = test_logit$salud_mental,
                   postarget = "buena",
                   negtarget = "mala"))

result <- as.data.frame(result)
colnames(result) <- c("Recall", "Accuracy", "Precision", "Specificity")

result <- result %>%
  mutate(Cutoff = co) %>%
  pivot_longer(cols      = c(Recall, Accuracy, Precision, Specificity),
               names_to  = "Métrica",
               values_to = "Valor")

grafico_umbral_logit <- plot_ly() %>%
  add_trace(
    data      = result,
    x         = ~Cutoff,
    y         = ~Valor,
    color     = ~Métrica,
    colors    = c(
      "Recall"      = "#c0392b",
      "Accuracy"    = "#2980b9",
      "Precision"   = "#27ae60",
      "Specificity" = "#f39c12"
    ),
    type      = 'scatter',
    mode      = 'lines',
    line      = list(width = 3),
    hoverinfo = 'text',
    text = ~paste(
      'Métrica:', Métrica,
      '<br>Umbral:', round(Cutoff, 3),
      '<br>Valor:',  round(Valor,  3)
    )
  ) %>%
  add_segments(
    x         = umbral, xend = umbral,
    y         = 0,      yend = 1,
    line      = list(color = '#922b21', dash = 'dash', width = 2),
    name      = 'Umbral óptimo',
    showlegend = FALSE
  ) %>%
  add_annotations(
    x           = umbral,
    y           = 0.95,
    text        = paste0("Umbral óptimo = ", round(umbral, 3)),
    showarrow   = FALSE,
    bgcolor     = '#922b21',
    bordercolor = '#922b21',
    font        = list(color = 'white', size = 12),
    xref        = 'x',
    yref        = 'y'
  ) %>%
  layout(
    title = list(
      text = paste("<b> Desempeño del Modelo Logit según el Umbral (Cutoff)</b><br>"),
      x    = 0.05,
      font = list(size = 18, color = '#922b21')
    ),
    xaxis = list(
      title    = "<b>Umbral de decisión (Cutoff)</b>",
      range    = c(0, 0.8),
      dtick    = 0.1,
      zeroline = FALSE,
      gridcolor = '#ecf0f1'
    ),
    yaxis = list(
      title    = "<b>Valor de la métrica</b>",
      range    = c(0, 1),
      dtick    = 0.1,
      zeroline = FALSE,
      gridcolor = '#ecf0f1'
    ),
    hoverlabel = list(
      bgcolor = 'white',
      font    = list(size = 12, color = 'black')
    ),
    legend = list(
      orientation = 'h',
      x           = 0.5,
      y           = -0.2,
      xanchor     = 'center'
    ),
    annotations = list(
      list(
        x         = 0,
        y         = -0.4,
        text      = "Nota: Elaboración propia con base en datos_uso_redes.csv",
        showarrow = FALSE,
        xref      = 'paper',
        yref      = 'paper',
        font      = list(size = 10, color = 'gray')
      )
    ),
    plot_bgcolor  = 'rgba(248,249,250,0.8)',
    paper_bgcolor = 'white',
    margin        = list(t = 100, b = 120, l = 80, r = 80)
  )

grafico_umbral_logit

En el gráfico de desempeño del modelo Logit según el umbral de decisión muestra el comportamiento de las métricas de evaluación frente a distintos valores de cutoff. El umbral óptimo identificado fue de 0,33, que corresponde al mejor equilibrio entre sensibilidad y especificidad. A medida que aumenta el Cutoff la especificidad presenta una tendencia creciente y logra alcanzar valores cercanos a 1 en los umbrales más elevados, lo que indica que el modelo clasifica adecuadamente la mayoría de los casos negativos bajo criterios de decisión más estrictos. La métrica de accuracy muestra un incremento gradual conforme aumenta el valor del Cutoff, alcanzando valores cercanos a 0,65, lo que muestra que el porcentaje total de clasificaciones correctas mejora ligeramente en ciertos rangos, sin embargo, este incremento no necesariamente representa un buen desempeño global debido a las demás métricas

Mientras que en la precisión presenta fluctuaciones importantes a lo largo de valores distintos del cutoff, reflejando cierta inestabilidad en la precisión de las predicciones positivas realizadas por el modelo. De la misma manera, en la sensibilidad se puede evidenciar una disminución pronunciada a medida que aumenta el Cutoff, lo que significa que el modelo pierde capacidad para identificar correctamente los casos positivos, aumentando la probabilidad de falsos negativos en umbrales más altos.

5.12 MATRIZ DE CONFUSION LOGIT

cm_logit <- confusionMatrix(pred_clase_logit, test_logit$salud_mental, positive = "buena")

matriz_conf_logit <- matrix(
  c(cm_logit$table[1], cm_logit$table[2],
    cm_logit$table[3], cm_logit$table[4]),
  nrow = 2, byrow = TRUE,
  dimnames = list(
    "Predicción" = c("buena", "mala"),
    "Referencia" = c("buena", "mala"))
)

matriz_conf_logit %>%
  kbl(
    caption   = "Tabla 8. Matriz de Confusión del Modelo Logit (con umbral óptimo)",
    align     = c("c", "c", "c"),
    col.names = c("Buena", "Mala")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 14,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  column_spec(1, bold = TRUE, width = "3cm") %>%
  add_header_above(c(" " = 1, "Referencia" = 2),
                   bold = TRUE, background = "#2b6cb0", color = "white") %>%
  footnote(
    general           = "La matriz presenta las predicciones frente a los valores reales para la clase positiva 'buena' (salud mental buena).",
    general_title     = "Nota:",
    footnote_as_chunk = TRUE
  )
Tabla 8. Matriz de Confusión del Modelo Logit (con umbral óptimo)
Referencia
Buena Mala
buena 77 101
mala 157 165
Nota: La matriz presenta las predicciones frente a los valores reales para la clase positiva ‘buena’ (salud mental buena).

Esta tabla muestra cómo el modelo logit clasifica los casos de salud mental en las categorías (buena y mala). Las filas muestran las predicciones correctas : 77 casos de salud mental buena y 165 casos de salud mental fueron identificados correctamente. los demás valores corresponden a errores de clasificación.

Su importancia se debe a que ayuda a entender de manera directa que tan bien funciona el modelo y en qué tipo de casos se equivoca más.

5.13 METRICAS DE EVALUACION

acc        <- round(cm_logit$overall["Accuracy"], 4)
acc_ci     <- paste0("(", round(cm_logit$overall[["AccuracyLower"]], 4), ", ",
                     round(cm_logit$overall[["AccuracyUpper"]], 4), ")")
no_info_rate <- round(as.numeric(cm_logit$overall[[3]]), 4)
p_value_acc  <- "<2.2e-16"
kappa        <- round(cm_logit$overall["Kappa"], 4)
mcnemar      <- formatC(as.numeric(cm_logit$overall["McnemarPValue"]), format = "e", digits = 2)

metricas_logit <- data.frame(
  Métrica = c(
    "Accuracy (Exactitud)",
    "95% CI (Intervalo de Confianza)",
    "No Information Rate",
    "P-Value [Acc > NIR]",
    "Kappa",
    "Mcnemar's Test P-Value",
    "Sensitivity",
    "Specificity",
    "Pos Pred Value",
    "Neg Pred Value",
    "Prevalence",
    "Detection Rate",
    "Detection Prevalence",
    "Balanced Accuracy"
  ),
  Valor = c(
    acc,
    acc_ci,
    no_info_rate,
    p_value_acc,
    kappa,
    mcnemar,
    round(cm_logit$byClass["Sensitivity"], 4),
    round(cm_logit$byClass["Specificity"], 4),
    round(cm_logit$byClass["Pos Pred Value"], 4),
    round(cm_logit$byClass["Neg Pred Value"], 4),
    round(cm_logit$byClass["Prevalence"], 4),
    round(cm_logit$byClass["Detection Rate"], 4),
    round(cm_logit$byClass["Detection Prevalence"], 4),
    round(cm_logit$byClass["Balanced Accuracy"], 4)
  ),
  Interpretación = c(
    "Proporción total de clasificaciones correctas realizadas por el modelo Logit.",
    "Margen de incertidumbre del 95% sobre la precisión estimada del modelo.",
    "Exactitud esperada si el modelo predijera siempre la clase mayoritaria.",
    "Evalúa si la exactitud del modelo es significativamente mejor que el azar.",
    "Grado de concordancia entre predicciones y valores reales, ajustado por azar.",
    "Evalúa si existe sesgo en los errores entre clases 'buena' y 'mala'.",
    "Proporción de casos 'buena' correctamente identificados (sensibilidad).",
    "Proporción de casos 'mala' correctamente identificados (especificidad).",
    "Probabilidad de que una predicción 'buena' sea correcta (precisión positiva).",
    "Probabilidad de que una predicción 'mala' sea correcta (precisión negativa).",
    "Frecuencia real de la clase 'buena' en los datos de prueba.",
    "Porcentaje de 'buena' correctamente detectados entre todos los casos.",
    "Frecuencia con la que el modelo predice 'buena' en el total de observaciones.",
    "Promedio entre sensibilidad y especificidad, mide desempeño global balanceado."
  )
)

metricas_logit %>%
  kbl(
    caption   = "Tabla 9. Métricas de Evaluación del Modelo Logit (con umbral óptimo)",
    align     = c("l", "c", "l"),
    col.names = c("Métrica", "Valor", "Interpretación")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 13,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  column_spec(1, bold = TRUE, width = "3.5cm") %>%
  column_spec(2, width = "2.5cm") %>%
  column_spec(3, width = "10cm") %>%
  footnote(
    general           = "Elaboración propia con base en datos_uso_redes.csv.",
    general_title     = "Nota:",
    footnote_as_chunk = TRUE
  )
Tabla 9. Métricas de Evaluación del Modelo Logit (con umbral óptimo)
Métrica Valor Interpretación
Accuracy (Exactitud) 0.484 Proporción total de clasificaciones correctas realizadas por el modelo Logit.
95% CI (Intervalo de Confianza) (0.4394, 0.5288) Margen de incertidumbre del 95% sobre la precisión estimada del modelo.
No Information Rate 0.4394 Exactitud esperada si el modelo predijera siempre la clase mayoritaria.
P-Value [Acc > NIR] <2.2e-16 Evalúa si la exactitud del modelo es significativamente mejor que el azar.
Kappa -0.0514 Grado de concordancia entre predicciones y valores reales, ajustado por azar.
Mcnemar’s Test P-Value 6.17e-04 Evalúa si existe sesgo en los errores entre clases ‘buena’ y ‘mala’.
Sensitivity 0.4326 Proporción de casos ‘buena’ correctamente identificados (sensibilidad).
Specificity 0.5124 Proporción de casos ‘mala’ correctamente identificados (especificidad).
Pos Pred Value 0.3291 Probabilidad de que una predicción ‘buena’ sea correcta (precisión positiva).
Neg Pred Value 0.6203 Probabilidad de que una predicción ‘mala’ sea correcta (precisión negativa).
Prevalence 0.356 Frecuencia real de la clase ‘buena’ en los datos de prueba.
Detection Rate 0.154 Porcentaje de ‘buena’ correctamente detectados entre todos los casos.
Detection Prevalence 0.468 Frecuencia con la que el modelo predice ‘buena’ en el total de observaciones.
Balanced Accuracy 0.4725 Promedio entre sensibilidad y especificidad, mide desempeño global balanceado.
Nota: Elaboración propia con base en datos_uso_redes.csv.

Esta tabla resume el desempeño del modelo Logit mediante diferentes indicadores estadísticos. Accuracy (0.484): indica que el modelo acierta aproximadamente el 48.4% de las veces. Sensitivity (0.4326): muestra la capacidad del modelo para detectar correctamente los casos de salud mental “buena”.

Specificity (0.5124): mide qué tan bien identifica los casos de salud mental “mala”.

Precisión o Valor Predictivo Positivo (0.3291): refleja la probabilidad de que una predicción positiva sea correcta. Balanced Accuracy (0.4725): evalúa el rendimiento general equilibrando sensibilidad y especificidad.

Kappa (-0.0514): indica una baja concordancia entre las predicciones y los valores reales.

AUC cercano a 0.5: sugiere que el modelo tiene poca capacidad de discriminación.

6 .COMPARACION DE MODELOS

6.1 COMPARACION DE MODELOS KNN Y LOGITC

library(pROC)

roc_knn <- roc(response  = test$salud_mental,
               predictor = as.numeric(pred_prob_knn$buena),
               levels    = c("mala", "buena"),
               direction = "<")

cm_caret <- confusionMatrix(pred_clase_adj, test_output_adj, positive = "buena")
cm_logit <- confusionMatrix(pred_clase_logit, test_output_logit, positive = "buena")

comparacion_integral <- data.frame(
  Metrica = c(
    "Accuracy (Exactitud)",
    "Sensitivity (Sensibilidad)",
    "Specificity (Especificidad)",
    "Precision (Valor Predictivo Positivo)",
    "Balanced Accuracy",
    "AUC (Área bajo la curva ROC)",
    "Casos correctamente clasificados - Buena",
    "Casos correctamente clasificados - Mala"
  ),
  `Modelo KNN` = c(
    round(cm_caret$overall["Accuracy"], 4),
    round(cm_caret$byClass["Sensitivity"], 4),
    round(cm_caret$byClass["Specificity"], 4),
    round(cm_caret$byClass["Pos Pred Value"], 4),
    round(cm_caret$byClass["Balanced Accuracy"], 4),
    round(auc(roc_knn), 4),
    cm_caret$table[1, 1],
    cm_caret$table[2, 2]
  ),
  `Modelo Logit` = c(
    round(cm_logit$overall["Accuracy"], 4),
    round(cm_logit$byClass["Sensitivity"], 4),
    round(cm_logit$byClass["Specificity"], 4),
    round(cm_logit$byClass["Pos Pred Value"], 4),
    round(cm_logit$byClass["Balanced Accuracy"], 4),
    round(auc(roc_logit), 4),
    cm_logit$table[1, 1],
    cm_logit$table[2, 2]
  )
)

comparacion_integral %>%
  kbl(
    caption   = "Comparación integral del desempeño entre los modelos KNN y Logit",
    align     = c("l", "c", "c"),
    col.names = c("Métrica", "KNN", "Logit")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = FALSE,
    font_size         = 13,
    position          = "center"
  ) %>%
  row_spec(0, background = "#2b6cb0", color = "white", bold = TRUE) %>%
  row_spec(6, extra_css = "border-bottom: 2px solid #2b6cb0;") %>%
  column_spec(1, bold = TRUE, width = "5cm") %>%
  column_spec(2:3, width = "3cm") %>%
  footnote(
    general           = "Elaboración propia con base en datos_uso_redes.csv.",
    general_title     = "Nota:",
    footnote_as_chunk = TRUE
  )
Comparación integral del desempeño entre los modelos KNN y Logit
Métrica KNN Logit
Accuracy (Exactitud) 0.6240 0.4840
Sensitivity (Sensibilidad) 0.0449 0.4326
Specificity (Especificidad) 0.9441 0.5124
Precision (Valor Predictivo Positivo) 0.3077 0.3291
Balanced Accuracy 0.4945 0.4725
AUC (Área bajo la curva ROC) 0.5192 0.5152
Casos correctamente clasificados - Buena 8.0000 77.0000
Casos correctamente clasificados - Mala 304.0000 165.0000
Nota: Elaboración propia con base en datos_uso_redes.csv.

La comparación muestra que ninguno de los dos modelos presenta un desempeño altamente satisfactorio, ya que ambos tienen valores bajos de AUC y balanced accuracy.

Sin embargo ,existen diferencias importantes : el modelo KNN presenta mayor exactitud y especificidad, lo que significa que es mejor evitando clasificaciones incorrectas de los casos negativos.

El modelo Logit tiene una sensibilidad más alta, por lo que detecta una mayor cantidad de casos positivos.

Podemos observar que cada modelo tiene fortalezas distintas. KNN ofrece resultados más estables en términos generales, mientras que Logit resulta más útil cuando el interés principal es identificar posibles casos positivos.

La tabla permite seleccionar el modelo más adecuado dependiendo del objetivo del análisis y demuestra que no basta con observar una sola métrica para evaluar un modelo predictivo.

6.2 CURVAS ROC COMPARADAS

roc_knn_df <- data.frame(
  FPR    = 1 - roc_knn$specificities,
  TPR    = roc_knn$sensitivities,
  Modelo = "KNN"
)

roc_logit_df <- data.frame(
  FPR    = 1 - roc_logit$specificities,
  TPR    = roc_logit$sensitivities,
  Modelo = "Logit"
)

auc_knn   <- round(auc(roc_knn), 3)
auc_logit <- round(auc(roc_logit), 3)

roc_comparada <- plot_ly() %>%
  add_trace(
    x = c(0, 1), y = c(0, 1),
    type = 'scatter', mode = 'lines',
    line = list(dash = 'dash', color = '#b0b0b0', width = 1),
    name = 'Línea referencia',
    showlegend = FALSE
  ) %>%
  add_trace(
    data      = roc_knn_df,
    x         = ~FPR, y = ~TPR,
    type      = 'scatter', mode = 'lines',
    line      = list(color = '#2980b9', width = 3),
    name      = 'KNN',
    hoverinfo = 'text',
    text      = ~paste('KNN<br>1-Especificidad:', round(FPR, 3),
                       '<br>Sensibilidad:', round(TPR, 3))
  ) %>%
  add_trace(
    data      = roc_logit_df,
    x         = ~FPR, y = ~TPR,
    type      = 'scatter', mode = 'lines',
    line      = list(color = '#c0392b', width = 3),
    name      = 'Logit',
    hoverinfo = 'text',
    text      = ~paste('Logit<br>1-Especificidad:', round(FPR, 3),
                       '<br>Sensibilidad:', round(TPR, 3))
  ) %>%
  layout(
    title = list(
      text = paste("<b>Curvas ROC comparadas — KNN vs Logit</b><br>",
                   "<sup>Evaluación del desempeño predictivo de ambos modelos</sup>"),
      x    = 0.05,
      font = list(size = 18, color = '#2c3e50')
    ),
    xaxis = list(
      title     = "<b>1 - Especificidad (Tasa de Falsos Positivos)</b>",
      range     = c(0, 1),
      zeroline  = FALSE,
      gridcolor = '#ecf0f1'
    ),
    yaxis = list(
      title     = "<b>Sensibilidad (Tasa de Verdaderos Positivos)</b>",
      range     = c(0, 1),
      zeroline  = FALSE,
      gridcolor = '#ecf0f1'
    ),
    annotations = list(
      list(
        x = 0.7, y = 0.20,
        text      = paste("<b>AUC KNN =", auc_knn, "</b>"),
        showarrow = FALSE,
        font        = list(color = '#2980b9', size = 14),
        bgcolor     = 'rgba(255,255,255,0.8)',
        bordercolor = '#2980b9',
        borderwidth = 1,
        borderpad   = 4
      ),
      list(
        x = 0.7, y = 0.10,
        text      = paste("<b>AUC Logit =", auc_logit, "</b>"),
        showarrow = FALSE,
        font        = list(color = '#c0392b', size = 14),
        bgcolor     = 'rgba(255,255,255,0.8)',
        bordercolor = '#c0392b',
        borderwidth = 1,
        borderpad   = 4
      ),
      list(
        x         = 0, y = -0.20,
        text      = "Nota: Elaboración propia con base en datos_uso_redes.csv",
        showarrow = FALSE,
        xref      = 'paper', yref = 'paper',
        font      = list(size = 10, color = 'gray')
      )
    ),
    legend = list(
      orientation = 'h',
      x           = 0.5, y = -0.1,
      xanchor     = 'center'
    ),
    plot_bgcolor  = 'rgba(248,249,250,0.8)',
    paper_bgcolor = 'white',
    margin        = list(t = 100, b = 120, l = 80, r = 80)
  )

roc_comparada

La gráfica ROC muestra que las curvas de ambos modelos se encuentran muy cerca de la línea diagonal, lo cual significa que su capacidad de clasificación es similar a la de una predicción aleatoria.

Los valores de AUC KNN(0.519) y AUC Logit(0.515) indican que ninguno de los modelos logra diferenciar de manera eficiente entre los casos de salud mental buena y mala.Esto es importante porque permite evaluar visualmente la capacidad discriminativa de los modelo.

6.3 COMPARACION METRICAS KNN Y LOGIT

metricas_comparacion <- data.frame(
  Métrica = rep(c("Accuracy", "Sensibilidad", "Especificidad",
                  "Precisión", "Balanced Accuracy"), each = 2),
  Modelo  = rep(c("KNN", "Logit"), times = 5),
  Valor   = c(
    cm_caret$overall["Accuracy"],
    cm_logit$overall["Accuracy"],
    cm_caret$byClass["Sensitivity"],
    cm_logit$byClass["Sensitivity"],
    cm_caret$byClass["Specificity"],
    cm_logit$byClass["Specificity"],
    cm_caret$byClass["Pos Pred Value"],
    cm_logit$byClass["Pos Pred Value"],
    cm_caret$byClass["Balanced Accuracy"],
    cm_logit$byClass["Balanced Accuracy"]
  )
)

grafica_comparacion <- plot_ly(
  data   = metricas_comparacion,
  x      = ~Métrica,
  y      = ~Valor,
  color  = ~Modelo,
  colors = c("KNN" = "#2980b9", "Logit" = "#c0392b"),
  type   = "bar"
) %>%
  layout(
    title = list(
      text = paste("<b>Comparación de métricas — KNN vs Logit</b><br>",
                   "<sup>Salud mental buena como clase positiva</sup>"),
      x    = 0.05,
      font = list(size = 18, color = '#2c3e50')
    ),
    xaxis = list(
      title     = "",
      gridcolor = '#ecf0f1'
    ),
    yaxis = list(
      title     = "<b>Valor</b>",
      range     = c(0, 1),
      dtick     = 0.1,
      gridcolor = '#ecf0f1'
    ),
    barmode = "group",
    legend  = list(
      orientation = 'h',
      x           = 0.5, y = -0.2,
      xanchor     = 'center'
    ),
    annotations = list(
      list(
        text      = "Nota: Elaboración propia con base en datos_uso_redes.csv",
        x         = 0, y = -0.3,
        xref      = 'paper', yref = 'paper',
        showarrow = FALSE,
        font      = list(size = 10, color = 'gray')
      )
    ),
    plot_bgcolor  = 'rgba(248,249,250,0.8)',
    paper_bgcolor = 'white',
    margin        = list(t = 100, b = 120, l = 80, r = 80)
  )

grafica_comparacion

La gráfica evidencia que el rendimiento de los modelos cambia dependiendo de las métrica analizada.

KNN sobresale en accuracy y especificidad, mostrando un mejor desempeño general para clasificar correctamente los casos negativos. Logit destaca en sensibilidad, lo que significa que detecta más casos positivos.

Ambos modelos presentan balanced accuracy bajos indicando un rendimiento global limitado.

La gráfica nos ayuda a observar que no existe un modelo claramente superior en todos los aspectos.Más bien , cada uno responde mejor a necesidades distintas dentro del análisis predictivo. Es imṕortante ya que nos ayuda a comparar visualmente las fortalezas y debilidades de cada modelo, ayuda a justificar cuál podría ser mas adecuado segun sus caracteristicas.

7 .CONCLUSIONES

El presente estudio tuvo como objetivo analizar la relación entre el uso de las redes sociale y el estado de salud mental de los participantes mediante la ejecución y evaluación de modelos de clasificación supervisada, para ello, se utilizaron variables relacionadas con habidos digitales comunes, como la edad, cantidad de plataformas utilizadas, el promedio de uso de redes sociales, número de ingresos diarios y la realización de pausas voluntarias. Los resultados obtenidos permitieron evaluar el comportamiento descriptivo de los datos obtenidos y la capacidad predictiva de los modelos empleados.

A partir del análisis descriptivo realizado en las tablas y gráficas, se logró identificar que la población estudiada presenta un uso frecuente y variado de redes sociales,especialmente en jóvenes y adultos entre los 20 y 35 años.Asimismo, se observó una tendencia hacia la multiconectividad digital ya que una gran parte de los usuarios utiliza varias plataformas simultáneamente y realiza múltiples ingresos diarios.

Aunque la mayoría de los usuarios percibió su salud mental como “buena”, también se evidencia una proporción considerable de usuarios con percepción negativa , mostrando que la salud mental representa un aspecto importante dentro de la población analizada.

Las gráficas permiten identificar diferentes patrones de comportamientos. los histogramas y diagramas de caja mostraron que existen usuarios con hábitos moderados de uso y otros con niveles considerablemente altos , alcanzando hasta 12 horas diarias en redes sociales.Estos valores extremos pueden asociarse con posibles comportamientos de dependencia digital o uso excesivo de plataformas.De igual manera, las gráficas comparativas evidenciaron que los usuarios con percepción negativa de salud mental tienden a presentar ligeramente mayores niveles de uso, aunque las diferencias entre categorías no fueron suficientemente amplias para establecer relaciones concluyentes.

Evidenciado por el elevado número de plataformas utilizadas y la frecuencia diaria de acceso, sin embargo, la matriz de correlación mostró coeficientes muy cercanos a cero entre las variables analizadas, lo que nos sugiere relaciones lineales débiles y prácticamente inexistentes entre estas variables. Esto nos muestra que el objeto de estudio posee una naturaleza compleja donde intervienen factores externos no incluidos en el modelo.

Esto permite concluir que variables como la edad, la cantidad de plataformas utilizadas , el promedio de uso y el número de ingresos diarios no explican por sí solos el comportamiento de la salud mental.Por tanto, el fenómeno estudiado presenta una naturaleza compleja donde intervienen otros factores externos no considerados dentro del modelo.

Respecto al desempeño de los modelos predictivos, tanto KNN como Logit presentaron limitaciones importantes. El modelo KNN mostró una mayor exactitud y especificidad, logrando clasificar adecuadamente los casos negativos; sin embargo, presentó una sensibilidad extremadamente baja, lo que significa que tuvo dificultades para identificar correctamente los casos positivos relacionados con buena salud mental. Por otro lado, el modelo Logit presentó una sensibilidad ligeramente superior, permitiendo detectar más casos positivos, aunque su desempeño general continuó siendo limitado.

La selección de variables usadas en el estudio respondió a criterios practicos y teoricos relacionados con el comportamiento digital, la edad fue incluida debido a que distintos grupos etarios presentan hábitos de consumo digital diferenciados, la cantidad de plataformas utilizadas y el promedio de uso de redes sociales fueron considerada porque presentan indicadores clave para la interacción digital, el número de ingreso diario permitió medir la frecuencia de conexión y dependencia de las plataformas y las pausas voluntarias fueron incluidas para tomar un posible indicador de autocontrol digital y autorregulación del tiempo de uso. Aunque las variables presentan fundamento, dentro del análisis los resultados muestran que por sí solas no contienen suficiente señal predictiva para explicar adecuadamente el estado de salud mental de los participantes.

Las curvas ROC y los valores de AUC obtenidos en ambos modelos estuvieron muy cercanos a 0.5, indicando que la capacidad predictiva de los modelos fue similar a una clasificación aleatoria. Además, en el modelo Logit ninguna de las variables explicativas presentó significancia estadística, sugiriendo que los hábitos digitales analizados poseen una influencia limitada sobre la percepción de salud mental dentro de esta muestra.

El bajo desempeño observado en los diferentes análisis puede explicarse por diferentes factores; en primer lugar, las variables seleccionadas representan únicamente una parte limitada del comportamiento digital de los individuos y no abarcan situaciones psicológicas, emocionales, sociales, laborales o contextuales que influyen directamente en la salud mental. Variables como estrés académico o laboral, calidad de sueño, autoestima, ansiedad o experiencias personales podrían tener una influencia mucho más significativa sobre la variable objetivo.

Asimismo, el comportamiento en redes sociales no siempre sigue relaciones lineales simples, se comprende que es posible que existan patrones o interacciones complejas que no pueden ser capturadas adecuadamente por modelos tradicionales de la regresión logística, incluso, variables según parece relevantes como el tiempo de uso o la cantidad de plataformas usadas pueden afectar de manera distinta en cada persona según su contexto.

Finalmente, este estudio permitió comprender la importancia de aplicar herramientas estadísticas y modelos predictivos para analizar fenómenos sociales actuales. Aunque los resultados obtenidos no mostraron modelos altamente precisos, sí permitieron identificar tendencias, limitaciones y posibles líneas de investigación futuras, aportando una visión más amplia sobre el impacto del uso de redes sociales en la salud mental.

8 .REFERENCIAS

  • Castells, M. (2001). La galaxia Internet: Reflexiones sobre Internet, empresa y sociedad. Plaza & Janés.

  • https://www.kaggle.com/datasets/hamnamunir/social-media-user-behavior-dataset/data

  • Walpole, R. E., Myers, R. H., Myers, S. L., & Ye, K. (2012). Probabilidad y estadística para ingeniería y ciencias (9.ª ed.). Pearson.

  • Posit Team. (2024). RStudio: Integrated development environment for R. Posit Official Website

  • Paredes, D. (2024). Aprendizaje supervisado. https://bookdown.org/dparedesi/data-science-con-r/aprendizaje-supervisado.html

  • Cunningham, P., & Delany, S. J. (2020). k-Nearest Neighbour Classifiers: 2nd Edition (with Python examples). ACM Computing Surveys, 54(6). arXiv:2004.04523.

  • Montgomery, D. C., Peck, E. A., & Vining, G. G. (2012). Introduction to Linear Regression Analysis (5ª ed.). John Wiley & Sons. ISBN: 978-0-470-54281-1.