Adriana del Rocío Rentería Andino
El presente trabajo expone el tema de predicción de diabetes de tipo 2 mediante métodos de clasificación de aprendizaje automático, que se puede definir como el anuncio de un hecho a futuro a partir del historial de datos de los pacienes y la aplicación de algoritmos, con la finalidad de dar solución y prevenir la enfermedad.
La diabetes mellitus tipo 2 (DM2) es una enfermedad crónica que se caracteriza por niveles elevados de azúcar en la sangre. Además, es una de las enfermedades crónicas más comunes en el mundo, con una prevalencia estimada de 463 millones de personas en 2020.
Para analizar esta problemáica es necesario mencionar sus causas. Una de ellas es el factor genético, por lo que las personas con antecedentes familiares de DM2 tienen un mayor riesgo de desarrollar la enfermedad.Los factores ambientales tambíen inciden, ya que aumentan el riesgo de DM2, estas son: sobrepeso y obesidad, inactividad física, edad, historial familiar de diabetes, etinia y algunas afecciones médicas.
La investigación de esta problemática social se realizó por el interés de predecir la DM2 con la ayuda de la aplicación de los métodos de aprendizaje automático, ya que tiene el potencial de mejorar el diagnóstico temprano de la enfermedad y, por lo tanto, de prevenir complicaciones graves.
Por otro lado, profundizar el tema como interés académico es esencial para el entendimiento de la aplicación de los métodos de clasificación en temas de la salud. Ya que, como estudiante es importante la práctica e interpretación adecuada para la toma de decisiones.
diabetes2 <- read.csv("C:/Users/CHRIS LLIGUIN/Downloads/DATA-20231130/diabetes2.txt", sep=";")
View(diabetes2)
str(diabetes2)
## 'data.frame': 906 obs. of 18 variables:
## $ Age : chr "less than 40" "less than 40" "60 or older" "less than 40" ...
## $ Gender : chr "Male" "Male" "Female" "Male" ...
## $ Family_Diabetes : chr "yes" "yes" "yes" "yes" ...
## $ highBP : chr "no" "no" "no" "no" ...
## $ PhysicallyActive: chr "one hr or more" "one hr or more" "none" "more than half an hr" ...
## $ BMI : int 22 22 26 19 23 26 26 23 22 38 ...
## $ Smoking : chr "no" "no" "no" "yes" ...
## $ Alcohol : chr "no" "no" "no" "yes" ...
## $ Sleep : int 8 8 7 7 7 8 8 7 6 8 ...
## $ SoundSleep : int 6 6 7 5 6 7 3 7 2 6 ...
## $ RegularMedicine : chr "no" "no" "no" "no" ...
## $ JunkFood : chr "often" "often" "occasionally" "occasionally" ...
## $ Stress : chr "not at all" "not at all" "sometimes" "not at all" ...
## $ BPLevel : chr "normal" "normal" "normal" "normal" ...
## $ Pregancies : int 0 0 3 0 0 0 0 1 0 0 ...
## $ Pdiabetes : chr "0" "0" "0" "0" ...
## $ UriationFreq : chr "not much" "not much" "not much" "not much" ...
## $ Diabetic : chr "no" "no" "no" "no" ...
Age : Edad. Variable de tipo cualitativa, nominal con rangos de edad: “40-49”, “50-59”, “60 or older”(60 o más), “less than 40”(menos de 40).
Gender: Género del individuo en estudio con dos niveles : Male (Masculino) y Female(Femenino).
Family_Diabetes: Antecedentes familiares de diabetes con dos niveles “yes” y “no”. Este constituye uno de los factores de riesgo en padecer diabetes tipo 2.
highBP: Diagnóstico de hipertensión arterial alta. Variable con dos niveles:“yes”(Sí) y “No”. Es decir, contiene presión arterial alta o no contiene.
PhysicallyActive: Actividad física, si la persona corre, camina entre otros. Variable con 2 niveles “yes” y “no”.
BMI: Índice de masa corporal, es un cálculo simple que utiliza la altura y el peso de una persona. La mayoría de los adultos con un BMI-IMC por encima de 25 tienen sobrepeso y un mayor riesgo de desarrollar diabetes tipo 2 Variable de tipo entero. \[IMC = kg/m^2\]Una persona con un IMC de 18.5 a 24.9 está en el rango peso normal o saludable. Una persona con un IMC de 25 a 29.9 se clasifica como persona con sobrepeso. Una persona con un IMC de 30 a 39.9 se clasifica como persona con obesidad.Una persona con un IMC de 40 o más se clasifica como persona con obesidad severa.
Smoking: Tabaquismo. Variable con dos niveles, “Yes”(Sí) y “No”. Es decir, si la persona fuma o no consume.
Alcohol: Consumo de alcohol. Variable de tipo caracter con dos características, “Yes”(Sí) y “No”. Es decir, si la persona consume alcohol o no consume.
Sleep: Horas de sueño. Las horas adecuadas de sueño es de 7 por noche o más. Variable de tipo entero.
Sound Sleep: Horas de sueño profundo. El porcentaje asignado al sueño profundo es del 20% sobre todas las horas que hemos dormido. Variable de tipo entero.
RegularMedicine: Si la persona toma regularmente medicamentos. Variable con dos niveles “yes” y “no”.
JunkFood: Comida basura o chatarra. Variable que dicta la frecuencia del consumo de la comida chatarra, contiene 4 niveles: “often”(frecuentemente), “occasionally”(casionalmente), “always”(siempre), “very often”(muy a menudo).
Stress: Estrés. Puede hacer que sea más difícil de controlar la diabetes porque puede desequilibrar la rutina diaria y puede resultar en un deterioro del cuerpo. Contiene 4 niveles “not at all”(“en absoluto),”sometimes”(a veces), “very often”(muy a menudo), “always”(siempre).
BPLevel: Diagnóstico de hipertensión arterial. La presión arterial normal es de 120/80 milímetros de mercurio o inferior, si presenta más a esa cantidad, se dicta que contiene hipertensión alta(Hipertensión). Si es menor a inferior a 90/60 mm Hg se dicta que la presión es baja. Contiene 3 niveles. Normal, Low(baja) y High(alta).
Pregancies: Número de embarazos. Variable tipo cuantitativo.
Pdiabetes: La diabetes gestacional es un tipo de diabetes que puede aparecer durante el embarazo en las mujeres que no tengan ya diabetes. Con 2 niveles 0 (No) y 1 (Sí)
UriationFreq Frecuencia urinaria. Variale con 2 nivles: “not much”(no mucho),“quite often”(bastante a menudo).
Diabético: Diabético.Si la persona es diabética o no, contiene 2 niveles: “yes” y “no”.
clases <- sapply(diabetes2, class)
clases
## Age Gender Family_Diabetes highBP
## "character" "character" "character" "character"
## PhysicallyActive BMI Smoking Alcohol
## "character" "integer" "character" "character"
## Sleep SoundSleep RegularMedicine JunkFood
## "integer" "integer" "character" "character"
## Stress BPLevel Pregancies Pdiabetes
## "character" "character" "integer" "character"
## UriationFreq Diabetic
## "character" "character"
Cambiamos a factor a edad
diabetes2$Age= factor (diabetes2$Age)
levels(diabetes2$Age) = c ("less than 40","40-49", "50-59", "60 or older")
class(diabetes2$Age)
## [1] "factor"
Cambiamos a factor a genero
diabetes2$Gender= factor (diabetes2$Gender)
levels(diabetes2$Gender) = c ("Male", "Female")
class(diabetes2$Gender)
## [1] "factor"
Cambiamos a factor family_Diabetes
diabetes2$Family_Diabetes= factor (diabetes2$Family_Diabetes)
levels(diabetes2$Family_Diabetes) = c ("Male", "Female")
class(diabetes2$Family_Diabetes)
## [1] "factor"
Cambiamos a factor HighBP
diabetes2$highBP= factor (diabetes2$highBP)
levels(diabetes2$highBP) = c ("yes", "no")
class(diabetes2$highBP)
## [1] "factor"
Cambiamos a factor PhysicallyActive
diabetes2$PhysicallyActive = factor (diabetes2$highBP)
levels(diabetes2$PhysicallyActive) = c ("one hr or more", "none","
more than half an hr", "more than half an hr", "less than half an hr")
class(diabetes2$PhysicallyActive)
## [1] "factor"
Cambiamos a factor Smoking
diabetes2$Smoking= factor (diabetes2$Smoking)
levels(diabetes2$Smoking) = c ("yes", "no")
class(diabetes2$Smoking)
## [1] "factor"
Cambiamos a factor Alcohol
diabetes2$Alcohol= factor (diabetes2$Alcohol)
levels(diabetes2$Alcohol) = c ("yes", "no")
class(diabetes2$Alcohol)
## [1] "factor"
Cambiamos a factor RegularMedicine
diabetes2$RegularMedicine = factor (diabetes2$RegularMedicine )
levels(diabetes2$RegularMedicine ) = c ("yes", "no")
class(diabetes2$RegularMedicine )
## [1] "factor"
Cambiamos a factor JunkFood
diabetes2$JunkFood = factor (diabetes2$JunkFood )
levels(diabetes2$JunkFood ) = c ("often", "occasionally", "always", "very often")
class(diabetes2$JunkFood )
## [1] "factor"
Cambiamos a factor Stress
diabetes2$Stress = factor (diabetes2$Stress )
levels(diabetes2$Stress ) = c ("not at all", "sometimes", "very often", "always")
class(diabetes2$Stress )
## [1] "factor"
Cambiamos a factor BPLevel
diabetes2$BPLevel <- factor(diabetes2$BPLevel)
levels(diabetes2$BPLevel) <- c("high"," low", "normal")
class(diabetes2$BPLevel)
## [1] "factor"
Cambiamos a factor UriationFreq
diabetes2$UriationFreq <- factor(diabetes2$UriationFreq)
levels(diabetes2$UriationFreq) <- c("not much","quite often")
class(diabetes2$UriationFreq)
## [1] "factor"
Cambiamos a factor Pdiabetes
diabetes2$Pdiabetes <- factor(diabetes2$Pdiabetes)
levels(diabetes2$Pdiabetes) <- c("0","1")
class(diabetes2$Pdiabetes)
## [1] "factor"
Cambiamos a factor Diabetic
diabetes2$Diabetic <- factor(diabetes2$Diabetic)
levels(diabetes2$Diabetic) <- c("no","yes")
class(diabetes2$Diabetic)
## [1] "factor"
Classes <- sapply(diabetes2, class)
for (i in 1:ncol(diabetes2))
if(Classes [i]== "integer")
diabetes2[[i]]= as.numeric(diabetes2[[i]])
Classes = sapply(diabetes2, class)
Classes
## Age Gender Family_Diabetes highBP
## "factor" "factor" "factor" "factor"
## PhysicallyActive BMI Smoking Alcohol
## "factor" "numeric" "factor" "factor"
## Sleep SoundSleep RegularMedicine JunkFood
## "numeric" "numeric" "factor" "factor"
## Stress BPLevel Pregancies Pdiabetes
## "factor" "factor" "numeric" "factor"
## UriationFreq Diabetic
## "factor" "factor"
which(is.na(diabetes2))
## integer(0)
Se obtuvo que no hay datos perdidos o faltantes en la base de datos “diabetes2”. # Análisis descriptivo y visual de las variables.
\[Desviación ~ estándar \longrightarrow \sigma = \sqrt( \frac{\sum_{i=1}^{n} = (x_{i}- \bar{x})^2}{n})\] Cuartiles: Dividen a la distribución en cuatro partes iguales (tres divisiones). Q1,Q2,Q3, correspondientes a 25%, 50%,75%. PERCENTILES, cuando dividen a la distribución en 100 partes (99 divisiones). \[Cuartiles ~ \longrightarrow Q_k= \frac{k*N}{4}\]
summary(diabetes2[, clases == "integer"])
## BMI Sleep SoundSleep Pregancies
## Min. :15.00 Min. : 4.000 Min. : 0.000 Min. :0.0000
## 1st Qu.:21.00 1st Qu.: 6.000 1st Qu.: 4.000 1st Qu.:0.0000
## Median :24.00 Median : 7.000 Median : 6.000 Median :0.0000
## Mean :25.33 Mean : 6.976 Mean : 5.609 Mean :0.3819
## 3rd Qu.:28.00 3rd Qu.: 8.000 3rd Qu.: 7.000 3rd Qu.:0.0000
## Max. :42.00 Max. :11.000 Max. :11.000 Max. :4.0000
apply(diabetes2[,clases == "integer"], 2, sd)
## BMI Sleep SoundSleep Pregancies
## 5.1399922 1.3042497 1.8435140 0.9090479
Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio, es de 21\(kg/m^2\) y el 75% que representa el 3er cuartil de 28 \(kg/m^2\), con una desviación estándar de 5.1399922.
Considerando estos valores se infiere que la población es propensa a ser diabética.
Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio constituye 6 horas de sueño, mientras que, el 3er cuartil que representa el 75% es de 8 horas.
Por lo que, el sueño no parece un factor que influya mucho para la obtención de diabetes tipo 2.
Pero, al ya comprobar la mediana de SoundSleep fue de 6 horas y su media fue de aproximadamente 6 horas. Por lo que la población intermedia tiene una buena hora de sueño. Esto se puede corroborar con la hora máxima, ya que esta fue de 11 horas de sueño, por lo que es muy bueno, puesto que, al comparar con la variable Sleep con su máximo de 11 horas es bueno porque contuvo la misma cantidad con sueño profundo.
library(ggplot2)
grafico_1 = ggplot(diabetes2,aes(x=Gender))+
geom_bar(stat="count", width=0.7, fill="skyblue")+
theme_minimal()
print(grafico_1)
INTERRETACIÓN Se obtuvo que en la variable “Gender”, el
género que más predomina en el conteo final es el masculino, con más de
500 individuos.
grafico_2 = ggplot(diabetes2,aes(x=Age))+
geom_bar(stat="count", width=0.7, fill="orange")+
theme_minimal()
print(grafico_2)
INTERPRETACIÓN Se obtuvo en la variable “Age”, que la
mayor cantidad de personas en el historial de datos se encuentraron en
el rango “less than 40”(menores de 40), por lo cual la población
mayoritaria se encuentra en una edad joven, con respecto a los otros
rangos de edad. Además se obtuvo que el 2do rango con mayor población es
de 50-59 de edad, por lo que, se infirió que la mayoría de personas no
se encuentra en la 3ra edad. Sin embargo, en la gráfica se visualizó que
el rango 40-49 y 60 or older(más de 60) se aproximan en cantidades.
grafico_3 = ggplot(diabetes2,aes(x=PhysicallyActive))+
geom_bar(stat="count", width=0.7, fill="green")+
theme_minimal()
print(grafico_3)
grafico_4 =ggplot(diabetes2,aes(x=JunkFood))+
geom_bar(stat="count", width=0.7, fill="pink")+
theme_minimal()
print(grafico_4)
Relacion entre las variables. Ayuda a la predicción aportan a diagnostivo de diabetes
library(ggplot2)
qplot(BMI, Sleep, data = diabetes2, colour = Diabetic)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
INTERPRETACIÓN: Se obtiene que mientras más BMI con repecto al sueño, más probabilidad de ser diabético es la persona. Puesto que, a partir del 20 \(kg/m^2\) BMI y el sueño bajo desde 4, más personas son propensas a ser diabéticos. Sin embargo, se visualiza que no hay muchas personas diabéticas.
qplot(BMI, Age, data = diabetes2, colour = Diabetic)
INTERPRETACIÓN Se infiere que mientras menos edad y menos BMI se tiene menor probabilidad de ser diabético, por lo que, el rango de edad de más de 60 es más propensa a contraer diabetes tipo 2. Además, el rango con menos probabilidad de que ocurra la enfermedad son los menores de 40 años.
library(ggplot2)
qplot(BMI, JunkFood, data = diabetes2, colour = Diabetic)
INTERPRETACIÓN Se infiere que mientras más BMI y consumo de comida chatarra, mayor es el riesgo de padecer diabetes tipo 2. Ya que se observa
library(ggplot2)
qplot(BMI, BPLevel, data = diabetes2, colour = Diabetic)
Se obtiene que tiene mayor relación cuando el BMI es alto y el nivel de hipertención es alto. Es decir mientras más BMI y mayor presión arterial más propenso es la persona en ser diabética.