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 ("40-49", "50-59", "60 or older", "less than 40")
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 ("Male", "Female")
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 JunkFood

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 BPLevel

diabetes2$UriationFreq <- factor(diabetes2$UriationFreq)
levels(diabetes2$UriationFreq) <- c("not much","quite often")
class(diabetes2$UriationFreq)
## [1] "factor"

Cambiamos a factor BPLevel

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"

Encontrar NA’S

which(is.na(diabetes2))
## integer(0)
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"

Análisis descriptivo y visual de las variables.

Descripción de las variables

Fómulas de la media, mediana. Interpretación de percentiles. Realizaremos una descripcion básica y visualización de datos

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

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~n~es~impar\longrightarrow Me(x) = x_{\frac{n+1}{2}}\] \[Mediana~es~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

  • BMI: Se obtuvo que el mínimo del índice de masa corporal fue de 15 libras por lo que el riesgo de padecer diabetes tipo 2, aún es bajo, pero no descartable, ya que, se considera con un mayor riesgo a las personas que tiene un peso por encima de las 25 libras. Sin embargo, hay que tomar en cuenta que su mediana fue de 24 libras y su media fue de 25.33 libras, estos valores son altos, por lo que se infirió que la población es propensa a ser diabética. Además esto, se pudo corroborar con su máximo ya que este valor es demasiado alto con un peso de 42 libras.

Además, al considerar su 1er cuartil y 3er cuartil se nota un cambio considerable ya que pasa de 21 libras a 28 libras, por lo que se observó que aumentó considerablemente su riesgo de contener diabetes tipo 2 es, ya que el peso se encontró al límite.

  • Sleep: Se obtuvo que el mínimo fue de 4 horas de sueño, por lo que para un adulto es muy poco, ya que el sueño adecuado es de 7 horas o más. Sin embardo su mediana fue de 7 horas y su media fue de aproximadamente de 7 horas igualmente, por lo que, la población en cuestión de sueño se acerca al rango adecuado. Aunque se verificó que el máximo de horas de sueño fue de 11, por lo que es valor muy alto, por lo que la falta de sueño no es un problema para esta población.

Además, al considerar su 1er cuartil y 3er cuartil no se nota un cambio drástico ya que pasa de 6 horas a 8 horas, lo cual se encuentra de igual manera en un buen rango de sueño. 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
library(ggplot2)
grafico_1 = ggplot(diabetes2,aes(x=Gender))+
  geom_bar(stat="count", width=0.7, fill="skyblue")+
  theme_minimal()
grafico_2 = ggplot(diabetes2,aes(x=Age))+
  geom_bar(stat="count", width=0.7, fill="orange")+
  theme_minimal()
grafico_3 = ggplot(diabetes2,aes(x=PhysicallyActive))+
  geom_bar(stat="count", width=0.7, fill="green")+
  theme_minimal()
grafico_4 =ggplot(diabetes2,aes(x=JunkFood))+
  geom_bar(stat="count", width=0.7, fill="pink")+
  theme_minimal()
print(grafico_1)

print(grafico_2)

print(grafico_3)

print(grafico_4)

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.