PREDICCIÓN DE LA DIABETES DE TIPO 2 MEDIANTE MÉTODOS DE CLASIFICACIÓN DE APRENDIZAJE AUTOMÁTICO

INTRODUCCIÓN

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.

IDENTIFICACIÓN DE VARIABLES

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" ...

PROCESO

Transformar a factor las variables “character”

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"

Unión de las variables ya transformadas

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"

Encontrar NA’S

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.

Análisis descriptivo

Fórmula y concepto

  • Media: Valor que se obtiene cuando se suman todos los datos de un análisis estadístico y se dividen por la cantidad total de datos. \[Media (X) = \sum_{i=1}^{n}x_{i}=x_{1}+x_{2}+x_{3}+...+x_{n}\]
  • Mediana:Valor medio cuando un conjunto de datos se ordena de menor a mayor. \[Mediana~par\longrightarrow Me(x) = x_{\frac{n+1}{2}}\] \[Mediana~impar \longrightarrow Me(x)= x_{\frac{n+1}{2}} + x_{\frac{n}{2}+1}\]
  • Desviación estándar: Medida de extensión o variabilidad en la estadística descriptiva. Se utiliza para calcular la variación o dispersión en la que los puntos de datos individuales difieren de la media.

\[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}\]

Interpretación de resultados

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
  • BMI: Se obtiene que el mínimo del índice de masa corporal de 15 \(kg/m^2\) por lo que el riesgo de padecer diabetes tipo 2, aún es bajo pero no descartable, ya que, se considera un mayor riesgo a las personas que tiene un BMI por encima de las 25 \(kg/m^2\) . Sin embargo, hay que tomar en cuenta que su mediana es de 24 \(kg/m^2\) y su media de 25.33 \(kg/m^2\).

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.

  • Sleep: Se obtiene que el mínimo es de 4 horas de sueño, lo cual es poco, ya que el sueño adecuado es de 7 horas o más para un adulto. Sin embardo su mediana es de 7 horas y su media de igual manera, por lo que, se acerca al rango adecuado. Aunque se verificó que el máximo de horas de sueño es de 11 horas.

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.

  • SoundSleep: Se obtuvo que el mínimo fue de 0 horas por lo que es una cifra alarmante, ya que, el porcentaje asignado al sueño profundo es del 20% sobre todas las horas que se ha dormido. Por lo que, al comparar con la variable Sleep, es decir, sueño, el dato es caótico ya que en cuestión de sueño las horas son altas, sin embargo, en sueño profundo son bajas. Por lo que, ciertas personas no tienen un buen descanso.

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.

  • Pregancies Se obtuvo que el mínimo de embarazos fue de 0 y el máximo de 4 embarazos. Es decir, que la variable “Pregancies” no es muy notable ya que no muchas mujeres, se encuentran en este estado.
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)

Diagrama de puntos

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.