library(dtplyr)
library(dbplyr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:dbplyr':
##
## ident, sql
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggplot2)
library(knitr)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(NbClust)
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(purrr)
library(readr)
library(tidyr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ stringr 1.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ plotly::filter() masks dplyr::filter(), stats::filter()
## ✖ dplyr::ident() masks dbplyr::ident()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::sql() masks dbplyr::sql()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readr)
Estudiantes <- read_csv("C:/Users/34656/Downloads/Estudiantes.csv", show_col_types = FALSE)
Vamos a comprobar los posibles valores nulos de las diferentes variables y ver como tratar esos datos, en el caso de esta muestra, no hay ningún valor nulo.
sum(is.na(Estudiantes))
## [1] 0
Comprobamos todos que los datos están bien, extrayendo las cinco primeras filas.
head(Estudiantes)
## # A tibble: 6 × 20
## Timestamp Choose.your.gender Age What.is.your.course. Your.current.year.of…¹
## <chr> <chr> <dbl> <chr> <chr>
## 1 8/7/2020… Mujer 18 Engineering 1º año
## 2 8/7/2020… Hombre 21 Islamic education 2º año
## 3 8/7/2020… Hombre 19 BIT 1º año
## 4 8/7/2020… Mujer 22 Laws 3º año
## 5 8/7/2020… Hombre 23 Mathemathics 4º año
## 6 8/7/2020… Hombre 19 Engineering 2º año
## # ℹ abbreviated name: ¹Your.current.year.of.Study
## # ℹ 15 more variables: What.is.your.CGPA. <chr>, Marital.status <chr>,
## # Do.you.have.Depression. <chr>, Do.you.have.Anxiety. <chr>,
## # Do.you.have.Panic.attack. <chr>,
## # Did.you.seek.any.specialist.for.a.treatment. <chr>,
## # CGPA_grados_numerica <dbl>, año_curso <dbl>, Genero <dbl>, Depresion <dbl>,
## # Ansiedad <dbl>, AtaquePanico <dbl>, Estado_Civil <dbl>, …
Podemos observar una muestra desbalanceada, donde prima el genero femenino frente al masculino, es puede aportar que mayor incidencia en ciertos trastorno como ansiedad que tiene más incidencia en mujeres que en hombres.
data_genero <- count(Estudiantes, Choose.your.gender)
Estudiantes$Choose.your.gender <- recode_factor(Estudiantes$Choose.your.gender, Female = "Mujer", Male = "Hombre")
plot_ly(data_genero, values=~n, labels=~Choose.your.gender, type="pie")
Tenemos una edad donde mayoritariamente hay dos grandes grupos, aquellos que están iniciando una carrera y aquellos que la están finalizando o incluso están en estudios superiores de máster.
plot_ly(x = Estudiantes$Age, type = "histogram")
Mayoritariamente de la muestra esta en los tres primeros años de carrera con un porcentaje acumulado del 92% de la muestra.
data_genero <- count(Estudiantes, Your.current.year.of.Study)
Estudiantes$Your.current.year.of.Study <- recode_factor(Estudiantes$Your.current.year.of.Study,
"Year 1" = "1º año", "year 1" = "1º año",
"Year 2" = "2º año", "year 2" = "2º año",
"Year 3" = "3º año", "year 3" = "3º año",
"Year 4" = "4º año", "year 4" = "4º año")
plot_ly(data_genero, values=~n, labels=~Your.current.year.of.Study, type="pie")
La muestra tiene mayor frecuencia en calificaciones medias y altas.
data <- count(Estudiantes, CGPA_grados)
plot_ly(data, values=~n, labels=~CGPA_grados, type="pie")
La gran mayoría de la muestra es población soltera.
data <- count(Estudiantes, Marital.status)
Estudiantes$Marital.status <- recode_factor(Estudiantes$Marital.status, "No" = "Soltero", "Yes" = "Casado")
plot_ly(data, values=~n, labels=~Marital.status, type="pie")
La mayoría de la muestra no padece ningún síntoma depresivo.
data <- count(Estudiantes, Do.you.have.Depression.)
Estudiantes$Do.you.have.Depression. <- recode_factor(Estudiantes$Do.you.have.Depression.,
"No" = "No tiene depresión", "Yes" = "Tiene depresión")
plot_ly(data, values=~n, labels=~Do.you.have.Depression., type="pie")
La mayoría de la muestra no padece ningún síntoma de ansiedad.
data <- count(Estudiantes, Do.you.have.Anxiety.)
Estudiantes$Do.you.have.Anxiety. <- recode_factor(Estudiantes$Do.you.have.Anxiety., "No" = "No tiene ansiedad", "Yes" = "Tiene Ansiedad")
plot_ly(data, values=~n, labels=~Do.you.have.Anxiety., type="pie")
La mayoría de la muestra no padece ningún síntoma de trastorno del pánico.
data <- count(Estudiantes, Do.you.have.Panic.attack.)
Estudiantes$Do.you.have.Panic.attack. <- recode_factor(Estudiantes$Do.you.have.Panic.attack.,
"No" = "Comeme la polla", "Yes" = "Tiene ataques de panico")
plot_ly(data, values=~n, labels=~Do.you.have.Panic.attack., type="pie")
La mayoría de la muestra no ha buscado ayuda para su problema, esta no es muy superior a la muestra sin trastornos, por tanto hay una gran parte de la muestra con trastornos del animo que no ha buscado ayuda para tratarlos.
data <- count(Estudiantes, Did.you.seek.any.specialist.for.a.treatment.)
Estudiantes$Did.you.seek.any.specialist.for.a.treatment. <- recode_factor(Estudiantes$Did.you.seek.any.specialist.for.a.treatment., "No" = "No ha buscado ayuda", "Yes" = "Ha buscado ayuda")
plot_ly(data, values=~n, labels=~Did.you.seek.any.specialist.for.a.treatment., type="pie")
Vamos a proceder a ver si hay alguna relación entre las diferentes variables de estado de la muestra, como son el Genero, Años de estudios, las calificaciones que obtienen y el estado civil para observar si tienen o no relación con las variables objeto de estudio como son la Ansiedad, la depresión o los ataques de pánico.
A su vez también analizaremos las posibles relaciones entre las diferentes variables objeto del estudio.
Para el análisis de la relación entre variables, vamos a utilizar la prueba Chi-cuadrado que lo que mide es la relación de las frecuencias absolutas, para considerar que la fuerza de esa relación es significativa y aceptar la hipótesis de que existe una relación entre ellas, vamos a utilizar el valor P inferior a 0.05 o lo que es igual que aceptar la hipótesis de relación esta sujeto a un 5% de error como máximo.
Cuando no podamos usar Chi-cuadrado porque la muestra es muy pequeña y se incumpla el requisito de que mínimo un 20% de la muestra caiga en las diferentes celdas de la tabla de contingencia, vamos a usar el coeficiente de Fisher`s que lo que hace es calcular la probabilidad de azar de aceptar la hipótesis de relación entre las variables, haremos igual que con Chi-cuadrado y solo aceptaremos valores p inferiores al 0.05 o al 5% de error.
No hay relación significativa entre el genero y las diferentes variables de salud mental del estudio.
chisq.test(table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Depression.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Depression.)
## X-squared = 1.4409, df = 1, p-value = 0.23
chisq.test(table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Anxiety.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Anxiety.)
## X-squared = 0.12961, df = 1, p-value = 0.7188
chisq.test(table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Panic.attack.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Choose.your.gender, Estudiantes$Do.you.have.Panic.attack.)
## X-squared = 1.4409, df = 1, p-value = 0.23
No hay relación significativa entre el año de estudio en el que se encuentran y las diferentes variables de salud mental del estudio.
fisher.test(table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Depression.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Depression.)
## p-value = 0.495
## alternative hypothesis: two.sided
fisher.test(table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Anxiety.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Anxiety.)
## p-value = 0.9253
## alternative hypothesis: two.sided
fisher.test(table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Panic.attack.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$Your.current.year.of.Study, Estudiantes$Do.you.have.Panic.attack.)
## p-value = 0.495
## alternative hypothesis: two.sided
Hay relación entre el estado civil y la depresión, así como con los trastornos de pánico.
Vemos una relación muy fuerte entre el estado civil y la depresión con un probabilidad de que se deba al azar, muy pequeña.
chisq.test(table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Depression.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Depression.)
## X-squared = 32.504, df = 1, p-value = 1.19e-08
Lo que vemos en este diagrama de barras es que al haber una frecuencia de 0 entre personas casadas y sin depresión y un gran porcentaje de solteros sin depresión. Debemos tomar estos datos con cuidado porque como vimos en el análisis univariado, hay un porcentaje mayor al 80% de la muestra que es soltera.
data <- data.frame( table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Depression.))
data2 <- unite(data, condiciones, c(1:2), sep = " y ")
fig <- plot_ly(data2, x=~condiciones, y=~Freq, type = "bar")
fig <- fig %>% layout(xaxis = list(title = ""),
yaxis = list(title = "Count"))
fig
chisq.test(table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Anxiety.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Anxiety.)
## X-squared = 0.4126, df = 1, p-value = 0.5207
Vemos una relación muy fuerte entre el estado civil y ataques de pánico con un probabilidad de que se deba al azar, muy pequeña.
chisq.test(table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Panic.attack.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Panic.attack.)
## X-squared = 32.504, df = 1, p-value = 1.19e-08
Lo que vemos en este diagrama de barras es que al haber una frecuencia de 0 entre personas casadas y sin ataques de pánico y un gran porcentaje de solteros sin ataque de pánico. Debemos tomar estos datos con cuidado porque como vimos en el análisis univariado, hay un porcentaje mayor al 80% de la muestra que es soltera.
data <- data.frame(table(Estudiantes$Marital.status, Estudiantes$Do.you.have.Panic.attack.))
data2 <- unite(data, condiciones, c(1:2), sep = " ")
fig <- plot_ly(data2, x=~condiciones, y=~Freq, type = "bar")
fig <- fig %>% layout(xaxis = list(title = ""), yaxis = list(title = "Count"))
fig
No hay relación significativa entre el las calificaciones académicas y las diferentes variables de salud mental del estudio.
fisher.test(table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Depression.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Depression.)
## p-value = 0.1811
## alternative hypothesis: two.sided
fisher.test(table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Anxiety.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Anxiety.)
## p-value = 0.478
## alternative hypothesis: two.sided
fisher.test(table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Panic.attack.))
##
## Fisher's Exact Test for Count Data
##
## data: table(Estudiantes$CGPA_grados, Estudiantes$Do.you.have.Panic.attack.)
## p-value = 0.1811
## alternative hypothesis: two.sided
RELACIONES ENTRE LA SALUD MENTAL
Hay una relación entre todas las variables del estudio en lo referente a salud mental.
Vemos una relación muy fuerte entre el depresión y ansiedad con un probabilidad de que se deba al azar, muy pequeña.
chisq.test(table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Anxiety.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Anxiety.)
## X-squared = 6.4012, df = 1, p-value = 0.0114
Vemos que la relación lo que nos dice es que hay una probabilidad muy alta de si no tienes depresión no tengas ansiedad, no podemos sacar mas conclusiones observando el gráfico.
data <- data.frame( table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Anxiety.))
data2 <- unite(data, condiciones, c(1:2), sep = " y ")
fig <- plot_ly(data2, x=~condiciones, y=~Freq, type = "bar")
fig <- fig %>% layout(xaxis = list(title = ""),
yaxis = list(title = "Count"))
fig
Vemos una relación muy fuerte entre el depresión y ataques de pánico con un probabilidad de que se deba al azar, muy pequeña.
chisq.test(table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Panic.attack.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Panic.attack.)
## X-squared = 96.632, df = 1, p-value < 2.2e-16
Vemos que la relación lo que nos dice es que hay una probabilidad muy alta de si tienes depresión tengas ataques de pánico y a la inversa de si no tienes depresión de no tener ataques de pánico.
data <- data.frame( table(Estudiantes$Do.you.have.Depression., Estudiantes$Do.you.have.Panic.attack.))
data2 <- unite(data, condiciones, c(1:2), sep = " y ")
fig <- plot_ly(data2, x=~condiciones, y=~Freq, type = "bar")
fig <- fig %>% layout(xaxis = list(title = ""),
yaxis = list(title = "Count"))
fig
Vemos una relación muy fuerte entre el estado civil y ataques de pánico con un probabilidad de que se deba al azar, muy pequeña.
chisq.test(table(Estudiantes$Do.you.have.Anxiety., Estudiantes$Do.you.have.Panic.attack.))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(Estudiantes$Do.you.have.Anxiety., Estudiantes$Do.you.have.Panic.attack.)
## X-squared = 6.4012, df = 1, p-value = 0.0114
Vemos que la relación lo que nos dice es que hay una probabilidad muy alta de si no tienes ataques de pánico, tampoco tengas ansiedad.
data <- data.frame( table(Estudiantes$Do.you.have.Anxiety., Estudiantes$Do.you.have.Panic.attack.))
data2 <- unite(data, condiciones, c(1:2), sep = " y ")
fig <- plot_ly(data2, x=~condiciones, y=~Freq, type = "bar")
fig <- fig %>% layout(xaxis = list(title = ""),
yaxis = list(title = "Count"))
fig
El mapa de calor nos muestra que la mayoría de interacciones entre los diferentes sujetos es de relación débil, no vemos rojos intensos y gran parte del segmento del mapa están en una azul muy frió, aun así vamos a realizar un exploración de cuantos cluster se nos recomienda.
df <- data.frame(Estudiantes[,12:19],Estudiantes$Age)
m_distancia <- get_dist(df, method = "euclidean")
fviz_dist(m_distancia, gradient = list(low = "blue", mid = "white", high = "red"))
Se nos recomienda dos factores a través del método de la silueta. Que nos dice cuantos objetos ha diferentes entre si, es decir cuantos objetos cohesionados a encontrado.
fviz_nbclust(df,kmeans, method = "silhouette")
Sabiendo que son 2 lso clusters, calculo lso Kmeans, es decir las medias de distancia entre las diferentes elementos que componen los clusters con referencia a las variables, apra ver cual alejados estan lso puntos. Estos K-means nos muestra que salvo la Edad, la busquedad de ayuda y el año que curso, el rsto de medias de distancia son muy parecidas entre lso dos clusters. Esto quiere decir nos dara seguramente dos clusters de datos poco definidos.
k2 <- kmeans(df, centers = 2, nstart = 25)
k2
## K-means clustering with 2 clusters of sizes 63, 38
##
## Cluster means:
## CGPA_grados_numerica año_curso Genero Depresion Ansiedad AtaquePanico
## 1 3.365079 1.761905 0.7301587 0.3650794 0.3809524 0.3015873
## 2 3.500000 2.315789 0.7631579 0.3157895 0.2631579 0.3684211
## Estado_Civil Busquedad_ayuda Estudiantes.Age
## 1 0.1269841 0.04761905 18.69841
## 2 0.2105263 0.07894737 23.55263
##
## Clustering vector:
## [1] 1 1 1 2 2 1 2 1 1 1 1 2 1 1 1 2 2 2 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 1 1 1
## [38] 1 1 2 2 2 1 1 2 1 1 1 2 2 2 1 1 1 1 1 2 1 1 2 1 1 1 2 2 2 1 1 1 2 2 1 1 1
## [75] 2 2 2 1 1 1 2 2 1 1 2 1 1 1 2 2 2 1 1 1 2 1 1 1 1 2 1
##
## Within cluster sum of squares by cluster:
## [1] 192.2857 115.4737
## (between_SS / total_SS = 64.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
En el gráfico se puede observar que en efecto, los dos clusters están muy poco definidos.
fviz_cluster(k2, data=df)
Seleccionamos las variables donde vemos que realmente hay diferencias significativas en las medias, pues estas son las que dividen la muestra y van a realizar el agrupamiento de una forma mas eficiente.
Estas variables son: el estado Civil, Búsqueda de Ayuda y La edad de los estudiantes
Cluster means:
CGPA_grados_numérica Genero Depresion Ansiedad AtaquePanico Estado_Civil
1 3.500000 0.7631579 0.3157895 0.2631579 0.3684211 0.2105263
2 3.365079 0.7301587 0.3650794 0.3809524 0.3015873 0.1269841
Busquedad_ayuda año_curso Estudiantes.Age
1 0.07894737 2.763158 23.55263
2 0.04761905 2.396825 18.69841
Ahora podemos observar un mapa de calor mucho mas definido, con un bloque pequeño rojo intenso y uno azul, lo que muestra que muestra muy relacionada entre si y otra que no, que es justo lo que buscamos cuando haces este tipo de análisis multivariado exploratorio.
df_2 <- data.frame(Estudiantes$Age, Estudiantes$Estado_Civil,Estudiantes$Busquedad_ayuda)
m_distancia <- get_dist(df_2, method = "euclidean")
fviz_dist(m_distancia, gradient = list(low = "blue", mid = "white", high = "red"))
El método de la silueta nos recomienda usas dos clusters.
fviz_nbclust(df_2,kmeans, method = "silhouette")
Generación de K-means
Vemos que hay unas medias de media de distancia entre los dos cluster, mas o menos diferenciadas, lo que va a dar lugar a dos clister bien definidos.
k2_1 <- kmeans(df_2, centers = 2, nstart = 25)
k2_1
## K-means clustering with 2 clusters of sizes 38, 63
##
## Cluster means:
## Estudiantes.Age Estudiantes.Estado_Civil Estudiantes.Busquedad_ayuda
## 1 23.55263 0.2105263 0.07894737
## 2 18.69841 0.1269841 0.04761905
##
## Clustering vector:
## [1] 2 2 2 1 1 2 1 2 2 2 2 1 2 2 2 1 1 1 2 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 2 2 2
## [38] 2 2 1 1 1 2 2 1 2 2 2 1 1 1 2 2 2 2 2 1 2 2 1 2 2 2 1 1 1 2 2 2 1 1 2 2 2
## [75] 1 1 1 2 2 2 1 1 2 2 1 2 2 2 1 1 1 2 2 2 1 2 2 2 2 1 2
##
## Within cluster sum of squares by cluster:
## [1] 22.47368 55.11111
## (between_SS / total_SS = 87.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Representación gráfica de los dos clister
Tenemos dos clister, muy definidos como podemos observar, una vez que hemos reducido las variables agrupadoras de la muestra en tres.
fviz_cluster(k2_1, data=df_2)
Podemos extraer tres conclusiones principales de de este análisis exploratorio.
El estado civil de los individuos, afecta a su estado mental. Aquellos individuos casados tienen mayor relación con sintomaatologia depresiva y muestran ataques de pánico.
Las tres variables de salud mental están muy relacionadas entre si, es decir que hay una correlación entre la ansiedad y la depresión, la depresión y los ataques de pánico y la ansiedad y los ataques de pánico. Lo cual indica una alta comorbilidad sintomatologica entre estos tres pares de variables (ansiedad-ataques de pánico; ansiedad - depresión; depresión - ataques de pánico).
La muestra se dividen en dos grandes conjuntos, definidos por el estado civil, la edad y la búsqueda de ayuda.
Jóvenes Solteros que no buscan ayuda.
Adultos casados que buscan ayuda.
Esto nos permite en futuras investigaciones comprobar si la población universitaria se divide en estos dos factores en cuanto a salud mental y poder generar un modelo predictivo de la conducta en base a estas tres variables.
Estas conclusiones no son extrapolables a la sociedad mas halla de esta muestra, dado que por un lado el numero de datos no es representativo y por otro la distribución de las variables no sigue una normalidad o centralidad, teniendo diferentes variables que se podían haber controlado que puedan estar incidiendo en estos resultados, como lo son el genero, años de estudio, estado civil y la edad.
Por otro lado se recomienda utilizar test de screening para medir trastornos emocionales como la ansiedad y la depresión y no dejarlo en manos de la autopercepción de los individuos que participan en el estudio.