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/OneDrive - ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO/Escritorio/Trabajo individual/diabetes2.txt", sep=";")
head(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. Variable de tipo cualitativa nominal con 2 niveles: Male (Masculino) y Female(Femenino).

  • Family_Diabetes: Antecedentes familiares de diabetes. Variable de tipo cualitativa nominal con dos niveles “yes”(sí) y “no”. Este constituye uno de los factores de riesgo en padecer diabetes tipo 2.

  • highBP: Diagnóstico de hipertensión arterial alta. Variable cualitativa nominal, con dos niveles:“yes”(sí) y “no”. Es decir, contiene presión arterial alta o no contiene.

  • PhysicallyActive: -Actividad física. Frecuencia del paciente para correr, caminar entre otros. Variable cualitativa nominal, con 5 niveles: “one hr or more”(una hora o más), “none”(ninguno),”
    more than half an hr”(más de media hora), “more than half an hr”(más de media hora), “less than half an hr”(menos de media hora).

  • BMI: Índice de masa corporal. Variable cuantitativa discreta. 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 cualitativa nominal con dos niveles, “yes”(Sí) y “no”. Es decir, si la persona fuma o no consume.

  • Alcohol: Consumo de alcohol. Variable cualitativa nominal con dos niveles, “yes”(sí) y “no”. Es decir, si la persona consume alcohol o no consume.

  • Sleep: Horas de sueño.Variable cuantitativa discreta. 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. Variable cuantitativa discreta. 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 cualitativa nominal con dos niveles “yes” y “no”.

  • JunkFood: Comida basura o chatarra. Variable cualitativa nominal 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. Variable cualitativa nominal que 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. Variable cualitativa nominal que contiene 3 niveles. Normal, Low(baja) y High(alta).

  • Pregancies: Número de embarazos. Variable cuantitativa discreta.

  • Pdiabetes: La diabetes gestacional es un tipo de diabetes que puede aparecer durante el embarazo en las mujeres que no tengan ya diabetes. Variable cualitativa nominal con 2 niveles 0 (No) y 1 (Sí)

  • UriationFreq Frecuencia urinaria. Variable cualitativa nominal con 2 nivles: “not much”(no mucho),“quite often”(bastante a menudo).

  • Diabético: Diabético.Si la persona es diabética o no. Variable cualitativa nominal contiene 2 niveles: “yes” y “no”.

Transformar a factor las variables “character”

Se transforman las variables tipo cualitativas nominal a factor, lo cual nos ayuda a diferenciar los diferentes niveles.

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"
  1. Cambiamos a factor la variable “Age”
diabetes2$Age= factor (diabetes2$Age)
levels(diabetes2$Age) = c ("less than 40","40-49", "50-59", "60 or older")
class(diabetes2$Age)
## [1] "factor"
  1. Cambiamos a factor la variable “Gender”
diabetes2$Gender= factor (diabetes2$Gender)
levels(diabetes2$Gender) = c ("Male", "Female")
class(diabetes2$Gender)
## [1] "factor"
  1. Cambiamos a factor la variable “family_Diabetes”
diabetes2$Family_Diabetes= factor (diabetes2$Family_Diabetes)
levels(diabetes2$Family_Diabetes) = c ("no", "yes")
class(diabetes2$Family_Diabetes)
## [1] "factor"
  1. Cambiamos a factor la variable “HighBP”
diabetes2$highBP= factor (diabetes2$highBP)
levels(diabetes2$highBP) = c ("no", "yes")
class(diabetes2$highBP)
## [1] "factor"
  1. Cambiamos a factor la variable “PhysicallyActive”
diabetes2$PhysicallyActive <- factor(diabetes2$PhysicallyActive)
levels(diabetes2$PhysicallyActive) <- c("  
one hr or more","none","    
more than half an hr"," 
less than half an hr","none")
class(diabetes2$PhysicallyActive)
## [1] "factor"
  1. Cambiamos a factor la variable “Smoking”
diabetes2$Smoking= factor (diabetes2$Smoking)
levels(diabetes2$Smoking) = c ("no", "yes")
class(diabetes2$Smoking)
## [1] "factor"
  1. Cambiamos a factor la variable “Alcohol”
diabetes2$Alcohol= factor (diabetes2$Alcohol)
levels(diabetes2$Alcohol) = c ("no", "yes")
class(diabetes2$Alcohol)
## [1] "factor"
  1. Cambiamos a factor la variable “RegularMedicine”
diabetes2$RegularMedicine = factor (diabetes2$RegularMedicine )
levels(diabetes2$RegularMedicine ) = c ("no", "yes")
class(diabetes2$RegularMedicine )
## [1] "factor"
  1. Cambiamos a factor la variable “JunkFood”
diabetes2$JunkFood = factor (diabetes2$JunkFood )
levels(diabetes2$JunkFood ) = c ("often", "occasionally", "very often", "always")
class(diabetes2$JunkFood )
## [1] "factor"
  1. Cambiamos a factor la variable “Stress”
diabetes2$Stress  = factor (diabetes2$Stress  )
levels(diabetes2$Stress  ) = c ("always", "not at all", "sometimes", "very often")
class(diabetes2$Stress )
## [1] "factor"
  1. Cambiamos a factor la variable “BPLevel”
diabetes2$BPLevel <- factor(diabetes2$BPLevel)
levels(diabetes2$BPLevel) <- c("high", "normal","   low")
class(diabetes2$BPLevel)
## [1] "factor"
  1. Cambiamos a factor la variable “UriationFreq”
diabetes2$UriationFreq <- factor(diabetes2$UriationFreq)
levels(diabetes2$UriationFreq) <- c("quite often","not much")
class(diabetes2$UriationFreq)
## [1] "factor"
  1. Cambiamos a factor la variable “Pdiabetes”
diabetes2$Pdiabetes <- factor(diabetes2$Pdiabetes)
levels(diabetes2$Pdiabetes) <- c("0","1") 
class(diabetes2$Pdiabetes)
## [1] "factor"
  1. Cambiamos a factor la variable “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 obtiene 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).

Atención: esta fórmula nos indica la posición del cuartil, no el valor del cuartil. El cuartil será el dato situado en la posición obtenida por la fórmula.

\[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 contiene 21\(kg/m^2\) y el 75% que representa el 3er cuartil que posee 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, con una desviación estándar de 1.3042497.

Por lo que, el sueño no parece un factor que influya mucho para la predicción diabetes tipo 2 en pacientes.

  • SoundSleep

Se obtiene que el mínimo es 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 es 6 horas y su media es de aproximadamente lo mismo. 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.

Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio constituye 4 horas de sueño profundo, mientras que, el 3er cuartil que representa el 75% es de 7 horas, con una desviación estándar de 1.8435140.

Entonces, se infiere que la mayoría de personas tienen un buen sueño profundo, sin embargo, existe personas que no lo tienen, por lo que, esta variable puede ser un factor que influya en la diabetes 2.

  • Pregancies

Se obtiene que el mínimo de embarazos es de 0 y el máximo de 4 embarazos. Por lo que, el 25% y el 75% de la población, es decir, el 1er cuartil y 3er cuartil se encuentra en 0 embarazos, con una desviación estándar de 0.9090479.

Es decir, que la variable “Pregancies” no es muy notable ya que no muchas mujeres se encuentran en este estado. Sin embargo, es bueno considerar la variable, puesto que, la diabetes gestacional aumenta el riesgo de tener presión arterial alta y preeclampsia, una complicación grave del embarazo que provoca presión arterial alta y otros síntomas que pueden poner en riesgo la vida de la madre y la del bebé.

Análisis visual de datos

Diagrama de barras (Gender, Age, PhysicallyActive, JunkFood)

  1. Variable “Gender”
library(ggplot2)
grafico_1 = ggplot(diabetes2,aes(x=Gender))+
  geom_bar(stat="count", width=0.7, fill="skyblue")+
  theme_minimal() +   geom_text(aes(label = ..count..), stat="count" )
print(grafico_1)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## 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 en la variable “Gender”, el más predominante es “Male”(masculino) con 557 individuos, mientras que “Female”(Femenino) tiene 349.

  1. Variable “Age”
grafico_2 = ggplot(diabetes2,aes(x=Age))+
  geom_bar(stat="count", width=0.7, fill="orange")+
  theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_2)

Interpretación

Se obtiene que en la variable “Age”, el rango predominante es “60 or older”(más de 60) con una suma de 464, por lo cual la población mayoritaria se encuentra en la 3ra edad.

Los otros rangos sobrantes se asemejan en cantidades, “less than 40”(menores de 40) con 139, 40-49 con 165 y 50-59 con 138 individuos.

  1. Variable “PhysicallyActive”
grafico_3 = ggplot(diabetes2,aes(x=PhysicallyActive))+
  geom_bar(stat="count", width=0.7, fill="green")+
  theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_3)

Interpretación

Se obtiene que el nivel que más predomina es “less than half an hr”(menos de media hora) con 321 individuos, cantidad preocupante ya que mientras menos ejercicio se realiza, mayor el riesgo de padecer alguna enfermedad.

También, el segundo rango sobresaliente es “more than half an hr”(más de media hora) con 227, es bueno la cantidad, siempre y cuando se considere que la gente lo haga al menos 5 días a la semana.

Los rangos minotarios es “none”(ninguno) con 134 y “one hr or more”(una hora o más) con 224.

Entonces, se infiere que, es importante hacer conciencia sobre la acividad física, para que así baje el rango de personas que no lo hacen. Sin embargo, como la población mayoritaria en edad es de la 3ra edad puede que sea dificil para ellos hacer ejercicio.

  1. Variable “JunkFood”
grafico_4 =ggplot(diabetes2,aes(x=JunkFood))+
  geom_bar(stat="count", width=0.7, fill="pink")+
  theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_4)

Interpretación

Se obtiene que el nivel “occasionally”(ocasionalmente), sobresale entre todos, por lo cual, se encuentra bien, ya que “always”(siempre) es 38, often(a menudo) es 188 y “very often”(muy a menudo) es 65, cantidades muy bajos con respecto a “occasionally”.

Por lo que, se infiere que la población trata de no comer mucha comida chatarra.

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)

Interpretación

Se obtiene que hay 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.

Gráficos de boxplot(cajas) entre Binaria y Numéricas

  1. Relación entre la variable “Diabetic” y “BMI”
library(ggplot2)
ggplot(diabetes2, aes (x = Diabetic, y = BMI, color = Diabetic)) + geom_boxplot()

Interpretación:

Se obtiene que la variable BMI en relación a diabetes, en el nivel “no” el 25% de la población, es decir, el 1er cuartil sobrepasa los 20 \(kg/m^2\), su mediana y media es aproximadamente de 24\(kg/m^2\).

También el 3er cuartil se acerca a 30 \(kg/m^2\), por lo que, el 75% de las personas en estudio tienen sobrepeso. Aunque con el máximo se verifica que efectivamente se trata con personas de obesidad severa, ya que contienen aproximadamente más de 38 \(kg/m^2\) e incluso se refleja 2 datos atípicos entre 38 y 45 \(kg/m^2\).

En el nivel yes el 25% de la población, es decir, el 1er cuartil se encuentra entre los 26 \(kg/m^2\), su mediana y media sobrepasa 25\(kg/m^2\).

  1. Relación entre la variable “Diabetic” y “Sleep”
ggplot(diabetes2, aes (x = Diabetic, y = Sleep, color = Diabetic)) + geom_boxplot()

Interpretación:

Se obtiene que el mínimo es de 4 horas de sueño entre los niveles yes y no, lo cual es poco, ya que el sueño adecuado es de 7 horas o más para un adulto. Sin embargo, su mediana es de 7 horas y su media de igual manera en los dos niveles, por lo que, se acerca al rango adecuado. Aunque se verificó que el máximo de horas de sueño es de 10 horas para yes y 11 horas para no.

Además, al considerar el 1er cuartil de los 2 niveles, se infiere que el 25% de la población en estudio constituye 6 horas de sueño, mientras que, el 3er cuartil de los 2, que representa el 75% es de 8 horas.

Por lo que, los niveles estudiados, son semejantes pero no iguales.

  1. Relación entre la variable “Diabetic” y “SoundSleep”
ggplot(diabetes2, aes (x = Diabetic, y = SoundSleep , color = Diabetic)) + geom_boxplot()

Interpretación:

Se obtiene que el mínimo del nivel “no”, es decir, cuando el individuo no contiene diabetes 2, es 0 horas , mientras, que el nivel “yes”, tiene un mínimo de 2, 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.

Pero, al ya comprobar la mediana de SoundSleep de los dos niveles es 6 horas y su media es de aproximadamente lo mismo. Por lo que la población intermedia tiene una buena hora de sueño. Esto se puede corroborar con la hora máxima de “yes” con 10 y el nivel “no” es de 11 horas.

Además, al considerar el 1er cuartil de los dos niveles , se infiere que el 25% de la población en estudio constituye 4 horas de sueño profundo, mientras que, el 3er cuartil que representa el 75% es de 7 horas..

Entonces, se infiere que la mayoría de personas tienen un buen sueño profundo, sin embargo, se observa que el sueño de las personas que contienen diabetes tipo 2 es muy bajo a comparación de los que no possen.

  1. Relación entre la variable “Diabetic” y “Pregancies”
ggplot(diabetes2, aes (x = Diabetic, y = Pregancies, color = Diabetic)) + geom_boxplot()

Interpretación

Se obtiene que el mínimo de embarazos es 0 para las 2 variables y el máximo es de 4 embarazos sólo para el nivel yes. Por lo que, el 25%, es decir, el 1er cuartil se encuentra en 0 embarazos para los dos niveles. Sin embargo, para el 3er cuartil , es decir, el 75% de la población de la variable “no” queda en 0, mientras para las personas diabéticas de tipo 2, es de 2 embarazos.

Por lo que se infiere, que mientras, la persona tenga más embarazos, tiene más probabilidad de contener diabetes tipo 2.

Gráficos de boxplot(cajas) entre binaria y nominales

  1. Relación entre la variable “Diabetic”
library(ggmosaic)
library(gridExtra)
                                            
q1<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, Gender),
                  fill = Diabetic)) + labs ("Gender", 
                                            title = "Factores_Diabetes")
q2<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, Family_Diabetes),
                  fill = Diabetic)) + labs ("Family_Diabetes", 
                                            title = "Factores_Diabetes")
q3 <- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, highBP),
                  fill = Diabetic)) + labs ("highBP", 
                                            title = "Factores_Diabetes")
q4 <- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, PhysicallyActive),
                  fill = Diabetic)) + labs("PhysicallyActive", 
                                            title = "Factores_Diabetes")
grid.arrange(q1, q2, q3, q4, nrow= 2, ncol = 2)
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
##   Please report the issue at <https://github.com/haleyjeppson/ggmosaic>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Interpretación de resultados

  • Relación entre la variable “Diabetic” y “Gender”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que entre la variable “Male”(Masculino) posse más individuos con DM2 que las mujeres “Female”.

  • Relación entre la variable “Diabetic” y “Family_Diabetes”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que si la persona proviene de una familia con historial de la enfermedad, tiene más probabilidades de poseer la enfermedad DM2.

  • Relación entre la variable “Diabetic” y “highBP”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras el diagnóstico de hipertensión arterial es alta, más probabilidad es que la persona contenga DM2.

  • Relación entre la variable “Diabetic” y “PhysicallyActive”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras menos deporte haga la persona, más es la probabilidad de contraer DM2.

q5<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, Smoking),
                  fill = Diabetic)) + labs ("Smoking", 
                                            title = "Factores_Diabetes")
q6<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, Alcohol),
                  fill = Diabetic)) + labs ("Alcohol", 
                                            title = "Factores_Diabetes")

q7 <- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, RegularMedicine),
                  fill = Diabetic)) + labs ("RegularMedicine", 
                                            title = "Factores_Diabetes")
q8 <- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, JunkFood),
                  fill = Diabetic)) + labs("JunkFood", 
                                            title = "Factores_Diabetes")
grid.arrange(q5, q6, q7, q8, nrow= 2, ncol = 2)

Interpretación de resultados

  • Relación entre la variable “Diabetic” y “Smoking”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más la persona fume, se tiene más probabilidad de contraer DM2.

  • Relación entre la variable “Diabetic” y “Alcohol”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más la persona fume, se tiene más probabilidad de contraer DM2.

  • Relación entre la variable “Diabetic” y “RegularMedicine”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más se toma alcohol, se tiene más probabilidad de contraer DM2.

  • Relación entre la variable “Diabetic” y “JunkFood”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más se consume comida chatarra, más es la probabilidad de contraer DM2.

q9<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, Stress),
                  fill = Diabetic)) + labs ("Stress", 
                                            title = "Factores_Diabetes")
q10<- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, BPLevel),
                  fill = Diabetic)) + labs ("BPLevel", 
                                            title = "Factores_Diabetes")

q11 <- ggplot(data = diabetes2)+ 
  geom_mosaic(aes(x= product(Diabetic, UriationFreq),
                  fill = Diabetic)) + labs ("UriationFreq", 
                                            title = "Factores_Diabetes")

grid.arrange(q9, q10, q11, nrow= 2, ncol = 2)

Interpretación de resultados

  • Relación entre la variable “Diabetic” y “Stress”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más estrés tenga la persona, más probabilidad es contraer la enfermedad.

  • Relación entre la variable “Diabetic” y “BPLevel”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más alta el la presión arterial, mayor es la probabilidad de contraer DM2.

  • Relación entre la variable “Diabetic” y “UrationFreq”

Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras que más alta la frecuencia urinaria, mayor es el riesgo de contraer la enfermedad.

Gráfico multivariante

Primer gráfico alternativo para las correlaciones

library(GGally)
library(ggmosaic)
ggpairs(diabetes2[, clases == "integer"])+ theme_bw()

Segundo gráfico alternativo para las correlaciones.

Este gráfico brinda mayor información sobre la data estudiada.

library(GGally)
library(ggmosaic)
p <- ggpairs(diabetes2[, c(which( clases == "integer") ,18)], aes(color = Diabetic)) + theme_bw()

for(i in 1:p$nrow){
  for(j in 1:p$ncol){
    p[i,j] <- p[i,j] +
      scale_fill_manual(values = c("#66CDAA", "#EE3050")) +
      scale_color_manual(values = c("#66CDAA", "#EE4050"))
  }
}

p

Interpretación de resultados del gráfico de correlación

  • Relación entre la variable “Sleep” y “BMI”

La relación entre las variales “Sleep” y “BMI” tiene una correlación de -0.073, lo cual es una correlación nula negativa. Por lo que, indica que mientras más sea el BMI, menor cantidad de sueño en horas tendrá el paciente.

Además, existe dispersión entre los valores de las dos variables, dando como resultado una correlación no lineal.

  • Relación entre la variable “SoundSleep” y “BMI”

La relación entre las variales “SoundSleep” y “BMI” tiene una correlación de -0.291, lo cual es una correlación nula negativa. Por lo cual, mientras más BMI presenta el paciente peor será el sueño profundo.

  • Relación entre la variable “Pregancies” y “BMI”

La relación entre las variales “Pregancies” y “BMI” tiene una correlación de -0.086, lo cual es una correlación nula negativa.

  • Relación entre la variable “SoundSleep” y “Sleep”

La relación entre las variables “SoundSleep” y “Sleep” revela una correlación con moderada intensidad, expresada mediante un valor numérico de 0.575. Este coeficiente sugierre una asociación significativa entre ambos aspectos, indicando cambios en uno podría estar relacionado con cambios proporcionados en el otro, aunque no de manera extremadamente fuerte.

  • Relación entre la variable “Pregancies” y “Sleep”

La relación entre las variales “Pregancies” y “Sleep” tiene una correlación de 0.054, lo cual es una correlación nula positiva.

  • Relación entre la variable “Pregancies” y “SoudSleep”

La relación entre las variales “Pregancies” y “SoundSleep” tiene una correlación de 0.117, lo cual es una correlación débil positiva.

Escalamiento de las variables

Divideremos el conjunto completo de individuos en dos partes, uno para entrenar el modelo, que contienen el 80% d elos individuos y otra para validarlo que contiene el resto. Esto es así porque si valoramos el modelo con las mismas observaciones que usamos para ajustarlo, la bondad del ajuste quedará sobrevalorada.

Antes de ajustar cualquier modelo, es conveniente escalar las variables numériccas y tenemos que reacondicionar las variables categóricas convirtiéndolas en variables ficticias y usando la primera o la última categoría como comparación.

Realizar el escalamiento de las variables numéricas

diabetes2[, clases == "integer"]= scale(diabetes2[, clases == "integer"])
head(diabetes2)

Conversión de las variables cualitativas categóricas en variables ficticias

Las varibles categóricas aparecen con 0 y 1.

X= model.matrix(Diabetic ~ ., data = diabetes2)
head(X)
##     (Intercept) Age40-49 Age50-59 Age60 or older GenderFemale
## 20            1        0        0              1            1
## 258           1        0        0              1            1
## 511           1        0        1              0            0
## 907           1        0        0              1            1
## 582           1        0        1              0            1
## 726           1        0        0              0            1
##     Family_Diabetesyes highBPyes PhysicallyActivenone
## 20                   1         0                    0
## 258                  1         0                    0
## 511                  1         0                    0
## 907                  1         0                    1
## 582                  0         0                    1
## 726                  0         0                    0
##     PhysicallyActive    \nmore than half an hr
## 20                                           0
## 258                                          0
## 511                                          1
## 907                                          0
## 582                                          0
## 726                                          0
##     PhysicallyActive \nless than half an hr        BMI Smokingyes Alcoholyes
## 20                                        1 -0.6487242          0          0
## 258                                       1 -0.6487242          0          0
## 511                                       0  0.1294871          0          0
## 907                                       0 -1.2323826          1          1
## 582                                       0 -0.4541713          0          1
## 726                                       0  0.1294871          1          0
##          Sleep SoundSleep RegularMedicineyes JunkFoodoccasionally
## 20  0.78534240  0.2119477                  0                    0
## 258 0.78534240  0.2119477                  0                    0
## 511 0.01861803  0.7543900                  0                    1
## 907 0.01861803 -0.3304947                  0                    1
## 582 0.01861803  0.2119477                  1                    1
## 726 0.78534240  0.7543900                  0                    1
##     JunkFoodvery often JunkFoodalways Stressnot at all Stresssometimes
## 20                   1              0                1               0
## 258                  1              0                1               0
## 511                  0              0                0               1
## 907                  0              0                1               0
## 582                  0              0                0               0
## 726                  0              0                0               1
##     Stressvery often BPLevelnormal BPLevel\tlow Pregancies Pdiabetes1
## 20                 0             0            1 -0.4201082          0
## 258                0             0            1 -0.4201082          0
## 511                0             0            1  2.8800479          0
## 907                0             0            1 -0.4201082          0
## 582                1             0            0 -0.4201082          0
## 726                0             0            1 -0.4201082          0
##     UriationFreqnot much
## 20                     0
## 258                    0
## 511                    0
## 907                    0
## 582                    1
## 726                    0

Se observa que las variables numéricas reescaladas contienen los mismo valores iniciales. Cada una de las variables nominales han sido convertida en variables binarias. El número de variables binarias es siempre el número de categorías de la variable nominal. Por ejemplo, la variable Gender (con dos categorías) ha sido convertida en GenderMale que es una variable numérca que vale 1 cuando el sexo es hombre y 0 cuando es mujer. El resto de variables también son convertidas a Binarias con el número de categorías que cada una almacena. Los parámetros correspondientes a las categóricas retenidas comparan a éstas con la categoría eliminada.

Divideremos el conjunto completo de individuos en dos partes, uno para entrenar el modelo, que contiene el 80% de los de los individuos y otra para validarlo que contiene el resto. Esto es

tr = round(nrow(diabetes2)*0.7)

set.seed(06071981) # semilla para el entrenamiento
muestra = sample.int(nrow(diabetes2), tr) # tomo una muestra del 70%
Train.diabet = diabetes2[muestra,] #tomo los datos para entrenamiento
Val.diabet = diabetes2[-muestra,]  #tomo los datos para validación 

Ahora disponemos de un conjunto de entrenamiento Train.diabet que es el 70% y un conjunto de validación Val.diabet que es el 30%.

Predicción de la diabetes (binaria) y variables que influyen en la misma.

Modelos de clasificación

Regresión logística

Trataremos de modelar la probabilidad de DIABETES positiva en función del resto de las variables.

  • El modelo logístico es

\[{p_1} = P\left({Y=1|X={x_i}}\right)=\frac{e^{\beta_{0}+\beta_{1}x_{i1}+...\beta_{p}x_{ip}}}{1+e^{\beta_{0}+\beta_{1}x_{i1}+...\beta_{p}x_{ip}}}\] Vamos ajustar el modelo desde el punto de vista estadístico para interpretar los parámetros.

Conceptos básicos

  • GML(Modelos Lineales Generalizados):

Un GLM está especificado por tres componentes:

  1. Aleatoria.

  2. Sistemática.

  3. De enlace.

Los GLM son, por tanto, una extensión de los modelos lineales que permiten utilizar distribuciones no normales de los errores (binomiales, Poisson, gamma, etc) y varianzas no constantes.

glm <- ajusta los modelos de regresió, que tipo de distribución se va aplicar. Distribucion binomial.

  • Valor z y valor p

La columna Pr(>|z|) representa el valor p asociado con el valor en la columna del valor z.

Si el valor p es menor que un cierto nivel de significancia (por ejemplo, α = 0,05), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable de respuesta en el modelo.

\[Valor ~ z = \frac{Estimación}{Error ~ Estándar} \]

\[Valor ~ p = 2*(1-pnorm(valor ~ z))\]

library(stats)
gfit1 <- glm( Diabetic ~ ., data = diabetes2, family = binomial)
summary(gfit1)
## 
## Call:
## glm(formula = Diabetic ~ ., family = binomial, data = diabetes2)
## 
## Coefficients:
##                                             Estimate Std. Error z value
## (Intercept)                                 -2.77088    1.08160  -2.562
## Age40-49                                     0.41120    0.36291   1.133
## Age50-59                                     1.62408    0.41602   3.904
## Age60 or older                              -1.68936    0.43244  -3.907
## GenderFemale                                 0.48706    0.37089   1.313
## Family_Diabetesyes                           1.00920    0.25459   3.964
## highBPyes                                   -0.85083    0.38970  -2.183
## PhysicallyActivenone                         0.55514    0.36247   1.532
## PhysicallyActive    \nmore than half an hr   0.85532    0.38718   2.209
## PhysicallyActive \nless than half an hr      1.68317    0.37751   4.459
## BMI                                          0.17735    0.12090   1.467
## Smokingyes                                   1.15528    0.50424   2.291
## Alcoholyes                                   0.09689    0.36237   0.267
## Sleep                                        0.05861    0.15561   0.377
## SoundSleep                                   0.39536    0.18442   2.144
## RegularMedicineyes                           2.97844    0.30926   9.631
## JunkFoodoccasionally                         0.08808    0.84774   0.104
## JunkFoodvery often                           0.25582    0.83663   0.306
## JunkFoodalways                               0.04005    0.97557   0.041
## Stressnot at all                            -0.03269    0.51891  -0.063
## Stresssometimes                             -0.53932    0.39565  -1.363
## Stressvery often                            -0.32951    0.45855  -0.719
## BPLevelnormal                              -15.08888  758.75534  -0.020
## BPLevel\tlow                                -1.47618    0.39038  -3.781
## Pregancies                                   0.32210    0.14874   2.165
## Pdiabetes1                                   4.01652    0.88504   4.538
## UriationFreqnot much                         0.43749    0.31153   1.404
##                                            Pr(>|z|)    
## (Intercept)                                0.010412 *  
## Age40-49                                   0.257177    
## Age50-59                                   9.47e-05 ***
## Age60 or older                             9.36e-05 ***
## GenderFemale                               0.189105    
## Family_Diabetesyes                         7.37e-05 ***
## highBPyes                                  0.029013 *  
## PhysicallyActivenone                       0.125639    
## PhysicallyActive    \nmore than half an hr 0.027165 *  
## PhysicallyActive \nless than half an hr    8.25e-06 ***
## BMI                                        0.142372    
## Smokingyes                                 0.021955 *  
## Alcoholyes                                 0.789187    
## Sleep                                      0.706443    
## SoundSleep                                 0.032045 *  
## RegularMedicineyes                          < 2e-16 ***
## JunkFoodoccasionally                       0.917245    
## JunkFoodvery often                         0.759775    
## JunkFoodalways                             0.967253    
## Stressnot at all                           0.949776    
## Stresssometimes                            0.172845    
## Stressvery often                           0.472393    
## BPLevelnormal                              0.984134    
## BPLevel\tlow                               0.000156 ***
## Pregancies                                 0.030350 *  
## Pdiabetes1                                 5.67e-06 ***
## UriationFreqnot much                       0.160219    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1091.56  on 905  degrees of freedom
## Residual deviance:  491.38  on 879  degrees of freedom
## AIC: 545.38
## 
## Number of Fisher Scoring iterations: 16

Interpretación de resultados más signficativos

  • Age60 or older

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Age” en el nivel “60 or older”(60 o más), la estimación para la variable predictora es de 1.62408, su error estándar es de , con valor de z 3.904 y con un valor p de 9.47e-05.

El valor p es menor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que tener 60 o mas años aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • Ageless than 40

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Age” en el nivel “less than 40”(menos de 40), la estimación para la variable predictora es de -1.68936 , su error estándar es de , con valor de z -3.907 y con un valor p de 9.36e-05.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que tener menos de 40 años, disminuye la probabilidad de contener diabetes tipo 2.

  • Family_Diabetesyes

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Family_Diabetes” en el nivel “yes”(sí), la estimación para la variable predictora es de 1.00920, su error estándar es de , con valor de z 3.964 y con un valor p de 7.37e-05.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que tener antecedentes familiares con diabetes tipo 2, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • highBPyes

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “highBP” en el nivel “yes”(sí), la estimación para la variable predictora es de -0.85083 , su error estándar es de , con valor de z -2.183 y con un valor p de 0.029013.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en el asterisco al lado del valor p. 

Por lo cual, indica que tener no contener presión alterial alta, disminuye la probabilidad de contener diabetes tipo 2.

PhysicallyActivenone 0.85532 0.38718 2.209 0.027165 *

  • PhysicallyActivenone

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “PhysicallyActive” en el nivel “none”(ninguno), la estimación para la variable predictora es de 0.85532, su error estándar es de , con valor de z 2.209 y con un valor p de 0.027165.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al no tener actividad física, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • PhysicallyActiveone hr or more

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “PhysicallyActive” en el nivel “nhr or more”(una hora o más), la estimación para la variable predictora es de 1.68317, su error estándar es de , con valor de z 4.459 y con un valor p de 8.25e-06.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al tener actividad física, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • Smokingyes

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Smoking” en el nivel “yes”(sí), la estimación para la variable predictora es de 1.15528, su error estándar es de , con valor de z 0.021955 y con un valor p de 0.021955.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al ser fumador, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • RegularMedicineyes

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “RegularMedcine” en el nivel “yes”(sí), la estimación para la variable predictora es de 2.97844, su error estándar es de , con valor de z 9.631 y con un valor p de 2e-16.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al medicarse, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

  • BPLevelnormal

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “BPLevel” en el nivel “normal”, la estimación para la variable predictora es de -1.47618, su error estándar es de , con valor de z -3.781 y con un valor p de 0.000156.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al tener la presion arterial normal, el paciente disminuye considerablemente la probabilidad de tener diabetes tipo 2.

  • Pdiabetesyes

Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “BPLevel” en el nivel “normal”, la estimación para la variable predictora es de 4.01652, su error estándar es de , con valor de z 4.538 y con un valor p de 5.67e-06.

El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p. 

Por lo cual, indica que al tener la diabetes gestional, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.

Anova

Compara medias para ver si hay diferencas significativas en diferentes grupos.

Se utiliza el test chi - cuadrado

gfit0 <- glm(Diabetic ~ 1, data = diabetes2,
             family = binomial)
anova (gfit0, gfit1, test = "Chisq")
  • Existe al menos un grupo que es significativo
  • La diferencia es altamente significativa entre el modelo de todas las variables es significatvamente mejor que el modelo solo con la consttante. Mirando el test de Wald para la sginficacion de cada parametro individual vemos que son altamente significativos los coeficientes para las variables Age, Family_Diabetes, highBP , PhysicallyActive, Smoking, RegularMedicine, BPLevel, Pdiabetes. Esto quiere decir que el resto de las variables no aportan significativamente cuando las demás están presentes. Si queremos ver los efectos conjuntos de cada variable podemos usar el comando anova en el que las variables se añaden secuencialmente.
anova(gfit1, test = "Chisq")
  • Interpretación

Se corrobora que las variables significativas son las mismas en los dos casos. Es decir, estas influyen en el modelo.

gfit2 <- glm( Diabetic ~ ., data = Train.diabet, family = binomial)
cbind(gfit1$coefficients, gfit2$coefficients)
##                                                    [,1]         [,2]
## (Intercept)                                 -2.77087932  -1.74808262
## Age40-49                                     0.41120398   0.59253917
## Age50-59                                     1.62408303   1.61214689
## Age60 or older                              -1.68935773  -1.74881721
## GenderFemale                                 0.48706126   0.75499209
## Family_Diabetesyes                           1.00919861   1.10013745
## highBPyes                                   -0.85082885  -1.34929812
## PhysicallyActivenone                         0.55513711   0.96937032
## PhysicallyActive    \nmore than half an hr   0.85532299   1.24247791
## PhysicallyActive \nless than half an hr      1.68316752   1.65601454
## BMI                                          0.17735494   0.14903473
## Smokingyes                                   1.15528381   1.46817871
## Alcoholyes                                   0.09688630  -0.93616362
## Sleep                                        0.05860712   0.13708311
## SoundSleep                                   0.39536387   0.24376942
## RegularMedicineyes                           2.97844459   3.18194151
## JunkFoodoccasionally                         0.08808372  -0.59620345
## JunkFoodvery often                           0.25582142  -0.68203158
## JunkFoodalways                               0.04005097  -0.80432089
## Stressnot at all                            -0.03268509  -0.09683845
## Stresssometimes                             -0.53932026  -0.66670031
## Stressvery often                            -0.32951273  -0.76141479
## BPLevelnormal                              -15.08887804 -15.55244810
## BPLevel\tlow                                -1.47618023  -1.88078889
## Pregancies                                   0.32210269   0.41273999
## Pdiabetes1                                   4.01651629   5.09624708
## UriationFreqnot much                         0.43749258   0.41011844
  • Interpretación

Al ya calcular el modelo, se predice con el conjunto de validación (Val.diabet) y entrenamiento.

p = predict(gfit2, Val.diabet, type = "response")
PredDiabet = as.factor (p > 0.5)
levels(PredDiabet) = c( "no", "yes")
library(lattice)
library(caret)
matrizLogis <- confusionMatrix (Val.diabet$Diabetic, PredDiabet)
matrizLogis
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  185  20
##        yes  16  51
##                                           
##                Accuracy : 0.8676          
##                  95% CI : (0.8215, 0.9056)
##     No Information Rate : 0.739           
##     P-Value [Acc > NIR] : 1.799e-07       
##                                           
##                   Kappa : 0.6506          
##                                           
##  Mcnemar's Test P-Value : 0.6171          
##                                           
##             Sensitivity : 0.9204          
##             Specificity : 0.7183          
##          Pos Pred Value : 0.9024          
##          Neg Pred Value : 0.7612          
##              Prevalence : 0.7390          
##          Detection Rate : 0.6801          
##    Detection Prevalence : 0.7537          
##       Balanced Accuracy : 0.8194          
##                                           
##        'Positive' Class : no              
## 
  • Interpretación

Para los verdaderos negativos es decir las personas que no tienen diabetes en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 185 personas.

Para los falsos negativos es decir las personas que si presentan diabetes tipo 2 en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 20 personas.

Para los falsos positivos es decir las personas que presentan diabetes tipo 2 en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 16 personas.

Para los verdaderos positivos es decir las personas que presentan diabetes tipo 2 en este momento, la posibilidad de que presenten diabetes tipo 2 a un futuro es de 51 personas.

library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
test_prob = predict(gfit2, newdata = Val.diabet, type = "response")
test_roc = roc(Val.diabet$Diabetic ~ test_prob, plot = T, print.auc = T)
## Setting levels: control = no, case = yes
## Setting direction: controls < cases

Es un modelo completamente aceptable, ya que es moderado. En la sensibildiad podemos ver el comportamiento de los valors positivos y la especicifidad es la de los valores negativos.

Los umbrales de desicion se establecen por el area bajo la curva se dice que el modelo de prediccion con el modelos de regresion logística aparentemente es bueno.

Máquinas de vector soporte.

Otro modelo de clasificación binaria es el conocido como Support Vector Machine (Maquina de vector soporte). Los paquetes que ajustan los modelos de SVM es e1071 y liblinear. Ajustamos el modelo para nuestros datos con el kernel radial que es el que se ajusta por defecto.

library(e1071)
fitsvm1 <- svm(Diabetic~., data= Train.diabet)
summary(fitsvm1)
## 
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
## 
## Number of Support Vectors:  265
## 
##  ( 132 133 )
## 
## 
## Number of Classes:  2 
## 
## Levels: 
##  no yes

A continuación la predicción los valores de la respuesta y calculamos la matriz de confusión:

library(caret)
predictedSVM <- predict(fitsvm1, Val.diabet)
matrizSVM1 <- confusionMatrix(Val.diabet$Diabetic,
                              predictedSVM)
matrizSVM1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  196   9
##        yes  14  53
##                                           
##                Accuracy : 0.9154          
##                  95% CI : (0.8758, 0.9456)
##     No Information Rate : 0.7721          
##     P-Value [Acc > NIR] : 3.803e-10       
##                                           
##                   Kappa : 0.7664          
##                                           
##  Mcnemar's Test P-Value : 0.4042          
##                                           
##             Sensitivity : 0.9333          
##             Specificity : 0.8548          
##          Pos Pred Value : 0.9561          
##          Neg Pred Value : 0.7910          
##              Prevalence : 0.7721          
##          Detection Rate : 0.7206          
##    Detection Prevalence : 0.7537          
##       Balanced Accuracy : 0.8941          
##                                           
##        'Positive' Class : no              
## 

Interpretemos esta matriz de confusión y sus estadísticas:

  • Accuracy (Precisión): 0.9154. Indica que el modelo tiene una precisión total del 91.54%.

  • 95% CI (Intervalo de confianza al 95%): (0.8758, 0.9456). Hay un 95% de confianza de que la precisión real del modelo esté entre 87.58% y 94.56%.

  • No Information Rate: 0.7721. Indica la precisión que se obtendría si se predijera siempre la clase mayoritaria (“no”).

  • P-Value [Acc > NIR]: 3.803e-10. Muy bajo, lo que indica que la precisión del modelo es significativamente mejor que predecir siempre la clase mayoritaria.

  • Kappa: 0.7664. Un valor alto que indica buen acuerdo entre las predicciones y las clases reales.

  • Sensitivity (Sensibilidad): 0.9333 para la clase positiva “no”. Indica buena capacidad de detectar la clase “no”.

  • Specificity (Especificidad): 0.8548 para la clase “no”. Indica buena capacidad de detectar la clase “sí”.

  • Pos Pred Value: Valor predictivo positivo alto (95.61%) para la clase “no”.

  • Neg Pred Value: Valor predictivo negativo del 79.1% para la clase “no”.

En conclusión, la matriz indica que el modelo tiene una muy buena precisión, con capacidad tanto para detectar la clase positiva “no” como la negativa “sí”.

library(e1071)
fitsvm2 <- svm(Diabetic ~ ., data = Train.diabet, kernel = "polynomial")
summary(fitsvm2)
## 
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "polynomial")
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  polynomial 
##        cost:  1 
##      degree:  3 
##      coef.0:  0 
## 
## Number of Support Vectors:  386
## 
##  ( 202 184 )
## 
## 
## Number of Classes:  2 
## 
## Levels: 
##  no yes
predictedSVM <- predict(fitsvm2, Val.diabet)
matrizSVM2 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  203   2
##        yes  51  16
##                                          
##                Accuracy : 0.8051         
##                  95% CI : (0.753, 0.8505)
##     No Information Rate : 0.9338         
##     P-Value [Acc > NIR] : 1              
##                                          
##                   Kappa : 0.3038         
##                                          
##  Mcnemar's Test P-Value : 4.301e-11      
##                                          
##             Sensitivity : 0.7992         
##             Specificity : 0.8889         
##          Pos Pred Value : 0.9902         
##          Neg Pred Value : 0.2388         
##              Prevalence : 0.9338         
##          Detection Rate : 0.7463         
##    Detection Prevalence : 0.7537         
##       Balanced Accuracy : 0.8441         
##                                          
##        'Positive' Class : no             
## 

Interpretación de resultados

  • Accuracy (precisión): 80.51%. Indica el porcentaje de predicciones correctas sobre el total.

  • Sensitivity (sensibilidad): 79.92%. Indica la capacidad del modelo para detectar correctamente los casos positivos (que sí tienen diabetes).

  • Specificity (especificidad): 88.89%. Indica la capacidad para detectar correctamente los negativos (que no tienen diabetes).

  • PPV (valor predictivo positivo): 99.02%. Indica la fiabilidad de las predicciones positivas.

  • NPV (valor predictivo negativo): 23.88%. Indica la fiabilidad de las predicciones negativas.

En conclusión, el modelo tiene una precisión moderada (80%), con mejor capacidad para detectar negativos que positivos. Las predicciones positivas son muy fiables (99%) pero las negativas mucho menos (24%).

library(e1071)
fitsvm3 <- svm(Diabetic ~ ., data = Train.diabet, kernel = "sigmoid") 
summary(fitsvm3)
## 
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "sigmoid")
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  sigmoid 
##        cost:  1 
##      coef.0:  0 
## 
## Number of Support Vectors:  281
## 
##  ( 140 141 )
## 
## 
## Number of Classes:  2 
## 
## Levels: 
##  no yes
predictedSVM <- predict(fitsvm3, Val.diabet)
matrizSVM3 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  186  19
##        yes  16  51
##                                           
##                Accuracy : 0.8713          
##                  95% CI : (0.8256, 0.9087)
##     No Information Rate : 0.7426          
##     P-Value [Acc > NIR] : 1.512e-07       
##                                           
##                   Kappa : 0.6586          
##                                           
##  Mcnemar's Test P-Value : 0.7353          
##                                           
##             Sensitivity : 0.9208          
##             Specificity : 0.7286          
##          Pos Pred Value : 0.9073          
##          Neg Pred Value : 0.7612          
##              Prevalence : 0.7426          
##          Detection Rate : 0.6838          
##    Detection Prevalence : 0.7537          
##       Balanced Accuracy : 0.8247          
##                                           
##        'Positive' Class : no              
## 

Interpretación de resultados

  • Se utilizó un kernel sigmoidal con un costo (regularización) de 1.

  • Se entrenó el modelo con 281 vectores de soporte (140 de la clase “no” y 141 de la clase “sí”).

  • Hay 2 clases, “no” para no diabético y “sí” para diabético.

  • La matriz de confusión muestra que el modelo predijo correctamente a 186 de 205 pacientes no diabéticos (verdaderos negativos) y 51 de 67 pacientes diabéticos (verdaderos positivos).

  • La precisión (accuracy) global es del 87.13%.

  • La sensibilidad (capacidad de detectar positivos) es del 92.08%.

  • La especificidad (capacidad de detectar negativos) es del 72.86%.

  • El valor predictivo positivo (precisión en positivos) es 90.73%.

  • El valor predictivo negativo (precisión en negativos) es 76.12%.

library(e1071)
fitsvm4 <- svm(Diabetic ~ ., data = Train.diabet, 
               kernel = "linear")
summary(fitsvm4)
## 
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "linear")
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  linear 
##        cost:  1 
## 
## Number of Support Vectors:  195
## 
##  ( 98 97 )
## 
## 
## Number of Classes:  2 
## 
## Levels: 
##  no yes
predictedSVM <- predict(fitsvm4, Val.diabet)
matrizSVM4 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM4
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  186  19
##        yes  16  51
##                                           
##                Accuracy : 0.8713          
##                  95% CI : (0.8256, 0.9087)
##     No Information Rate : 0.7426          
##     P-Value [Acc > NIR] : 1.512e-07       
##                                           
##                   Kappa : 0.6586          
##                                           
##  Mcnemar's Test P-Value : 0.7353          
##                                           
##             Sensitivity : 0.9208          
##             Specificity : 0.7286          
##          Pos Pred Value : 0.9073          
##          Neg Pred Value : 0.7612          
##              Prevalence : 0.7426          
##          Detection Rate : 0.6838          
##    Detection Prevalence : 0.7537          
##       Balanced Accuracy : 0.8247          
##                                           
##        'Positive' Class : no              
## 

Interpretación de resultados

  • Se utilizó una SVM con regularización C = 1 y kernel lineal.

  • El modelo resultante tiene 195 vectores de soporte (98 de la clase “no” y 97 de la clase “sí”). Los vectores de soporte son los puntos de datos críticos que definen la frontera de decisión.

  • Hay 2 clases, “no” para no diabético y “sí” para diabético.

  • La matriz de confusión compara las predicciones con los valores reales. El modelo predijo correctamente 186 de 205 no diabéticos y 51 de 67 diabéticos.

  • La precisión (accuracy) global es 87.13%.

  • La sensibilidad es 92.08%, indica la capacidad de detectar positivos.

  • La especificidad es 72.86%, capacidad de detectar negativos.

  • Valor predictivo positivo de 90.73%, precisión en los casos positivos predichos.

  • Valor predictivo negativo de 76.12%, precisión en los casos negativos predichos.

Accuracy <- c(matrizLogis$overall[1], matrizSVM1$overall[1],
             matrizSVM2$overall[1], matrizSVM3$overall[1],
             matrizSVM4$overall[1])
names(Accuracy) = c("Logística", "SVM-Radial","SVM-Polynomial", 
                    "SVM-Sigmoid", "SVM-Linear")
Accuracy
##      Logística     SVM-Radial SVM-Polynomial    SVM-Sigmoid     SVM-Linear 
##      0.8676471      0.9154412      0.8051471      0.8713235      0.8713235

INTERPRETACIÓN

Esta tabla muestra la precisión (accuracy) de 5 modelos de clasificación diferentes entrenados en los mismos datos para predecir diabetes:

Regresión Logística

SVM con kernel radial

SVM con kernel polinomial

SVM con kernel sigmoidal

SVM con kernel lineal

Al observar los valores de precisión:

El modelo con mejor performance es la SVM con kernel radial, con una precisión de 0.915 o 91.5 %.

Le siguen la SVM sigmoidal, la SVM lineal y la regresión logística todas con una precisión de 0.871 o 87.1 %.

La SVM polinomial tiene la precisión más baja de 0.805 o 80.5 %.

En conclusión, para estos datos la SVM con kernel radial es la que logra el mejor balance entre capacidad de aprendizaje y prevention del overfitting, resultando en la mayor precisión.

#Redes neuronales

require(neuralnet)
Loading required package: neuralnet
Train = data.frame(Train.diabet$Diabetic, model.matrix(Diabetic~., 
                                                       data = Train.diabet)[, -1])
colnames(Train)[1] = "Diabetic"
nn1 = neuralnet(Diabetic ~., data = Train, hidden = 3, act.fct = "logistic", linear.output = F)
plot(nn1, main = "Redes neuronales")
Validate  = data.frame(Val.diabet$Diabetic, model.matrix(Diabetic~.,
                                                         data = Val.diabet)[,-1])
colnames(Validate)[1] = "Diabetic"
Predict = compute (nn1, Validate)
predictedNN1 = factor(Predict$net.result[, 1]>0.5, labels = c ("no", "yes"))

matrizNN1 <- confusionMatrix(Val.diabet$Diabetic, predictedNN1)
matrizNN1
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no    5 200
       yes  58   9
                                          
               Accuracy : 0.0515          
                 95% CI : (0.0284, 0.0849)
    No Information Rate : 0.7684          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : -0.491          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.07937         
            Specificity : 0.04306         
         Pos Pred Value : 0.02439         
         Neg Pred Value : 0.13433         
             Prevalence : 0.23162         
         Detection Rate : 0.01838         
   Detection Prevalence : 0.75368         
      Balanced Accuracy : 0.06121         
                                          
       'Positive' Class : no              
                                          

Interpretación de resultados

Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 5 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 9 personas que tienen diabetes y que aun futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es malo, ya que, su valor es 0.0515, lo cual es muy bajo. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.

Incluso en kkapa se observa que contiene un valor negativo, lo cual se infiere que el modelo para esta predicción es demasiado malo.

n11 = neuralnet(Diabetic ~., data = Train, hidden = c(5,3), act.fct = "logistic", linear.output = F)
plot(nn1)
Predict = compute (nn1, Validate)
predictedNN1 = factor(Predict$net.result[,1]>0.5, labels = c ("no", "yes"))
matrizNN1 <- confusionMatrix(Val.diabet$Diabetic, predictedNN1)
matrizNN1
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no    5 200
       yes  58   9
                                          
               Accuracy : 0.0515          
                 95% CI : (0.0284, 0.0849)
    No Information Rate : 0.7684          
    P-Value [Acc > NIR] : 1               
                                          
                  Kappa : -0.491          
                                          
 Mcnemar's Test P-Value : <2e-16          
                                          
            Sensitivity : 0.07937         
            Specificity : 0.04306         
         Pos Pred Value : 0.02439         
         Neg Pred Value : 0.13433         
             Prevalence : 0.23162         
         Detection Rate : 0.01838         
   Detection Prevalence : 0.75368         
      Balanced Accuracy : 0.06121         
                                          
       'Positive' Class : no              
                                          

Interpretación de resultados

Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 5 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 9 personas que tienen diabetes y que aun futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es malo, ya que, su valor es 0.0515, lo cual es muy bajo. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.

Incluso en kkapa se observa que contiene un valor negativo, lo cual se infiere que el modelo para esta predicción es demasiado malo.

Se verifica que es lo mismo que el del anterior, ya que el resultado de comprobación del modelo no cambia, incluso colocando 5 y 4 nodos.

#Naive Bayes Trabaja con modelos de probabilidad.

fitbayes <- naiveBayes(Diabetic ~., data = Train.diabet)
summary(fitbayes)
          Length Class  Mode     
apriori    2     table  numeric  
tables    17     -none- list     
levels     2     -none- character
isnumeric 17     -none- logical  
call       4     -none- call     
#Predict Output
predictedBayes = predict(fitbayes, Val.diabet)
matrizNB <- confusionMatrix(Val.diabet$Diabetic, predictedBayes)
matrizNB
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  175  30
       yes  19  48
                                          
               Accuracy : 0.8199          
                 95% CI : (0.7689, 0.8637)
    No Information Rate : 0.7132          
    P-Value [Acc > NIR] : 3.363e-05       
                                          
                  Kappa : 0.5402          
                                          
 Mcnemar's Test P-Value : 0.1531          
                                          
            Sensitivity : 0.9021          
            Specificity : 0.6154          
         Pos Pred Value : 0.8537          
         Neg Pred Value : 0.7164          
             Prevalence : 0.7132          
         Detection Rate : 0.6434          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.7587          
                                          
       'Positive' Class : no              
                                          

Interpretación de resultados

Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 175 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 48 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8199, lo cual es bueno. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7132.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es mejor que el anterior, es decir, al modelo de redes neuronales.

#Árboles de decisión

library(tree)
tree1 = tree(Diabetic~., data = Train.diabet)
summary(tree1)

Classification tree:
tree(formula = Diabetic ~ ., data = Train.diabet)
Variables actually used in tree construction:
 [1] "RegularMedicine"  "Pdiabetes"        "Age"              "Stress"          
 [5] "SoundSleep"       "UriationFreq"     "PhysicallyActive" "Alcohol"         
 [9] "Family_Diabetes"  "BMI"              "Sleep"           
Number of terminal nodes:  21 
Residual mean deviance:  0.3115 = 190.9 / 613 
Misclassification error rate: 0.05836 = 37 / 634 
plot(tree1)
text(tree1, pretty = 1)

library(caret)
predicedtree1 = predict(tree1, Val.diabet, type = "class")
matriztree1 <- confusionMatrix(Val.diabet$Diabetic, predicedtree1)
matriztree1
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  197   8
       yes  16  51
                                          
               Accuracy : 0.9118          
                 95% CI : (0.8716, 0.9426)
    No Information Rate : 0.7831          
    P-Value [Acc > NIR] : 1.257e-08       
                                          
                  Kappa : 0.7524          
                                          
 Mcnemar's Test P-Value : 0.153           
                                          
            Sensitivity : 0.9249          
            Specificity : 0.8644          
         Pos Pred Value : 0.9610          
         Neg Pred Value : 0.7612          
             Prevalence : 0.7831          
         Detection Rate : 0.7243          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.8946          
                                          
       'Positive' Class : no              
                                          

Interpretación de resultados

Se obtiene que en la matriz de confusión los verdaderos negativos contiene un valor bajo de 197 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 51 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.9118, lo cual es bueno. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7831.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es mejor que el anterior, es decir, al modelo de naive bayes.

cv.tree1 =cv.tree(tree1, FUN = prune.misclass)
cv.tree1
## $size
##  [1] 21 18 16 11  8  7  6  3  2  1
## 
## $dev
##  [1]  65  65  64  62  63  67  88  90 114 196
## 
## $k
##  [1] -Inf  0.0  1.0  1.8  2.0  5.0  7.0  8.0 22.0 84.0
## 
## $method
## [1] "misclass"
## 
## attr(,"class")
## [1] "prune"         "tree.sequence"
plot(cv.tree1)

Validacion cruzada

prune.tree1 = prune.misclass(tree1, best = 10)
plot(prune.tree1)
text(prune.tree1, pretty = 0)

predicedtree2 = predict(prune.tree1, Val.diabet, type = "class")
matriztree2 <- confusionMatrix(Val.diabet$Diabetic,predicedtree2)
matriztree2
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  192  13
       yes  22  45
                                          
               Accuracy : 0.8713          
                 95% CI : (0.8256, 0.9087)
    No Information Rate : 0.7868          
    P-Value [Acc > NIR] : 0.0002243       
                                          
                  Kappa : 0.637           
                                          
 Mcnemar's Test P-Value : 0.1762964       
                                          
            Sensitivity : 0.8972          
            Specificity : 0.7759          
         Pos Pred Value : 0.9366          
         Neg Pred Value : 0.6716          
             Prevalence : 0.7868          
         Detection Rate : 0.7059          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.8365          
                                          
       'Positive' Class : no              
                                          

Interpretación de resultados

Se obtiene que en la matriz de confusión a través de validación cruzada con 10 ramas, los verdaderos negativos contiene un valor bajo de 197 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 49 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8713 , lo cual es bueno Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7868.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión sin ramas predichas.

prune.tree2 = prune.misclass(tree1, best = 5)
plot(prune.tree2)
text(prune.tree2, pretty = 0)

predicedtree3 = predict(prune.tree2, Val.diabet, type = "class")
matriztree3 <- confusionMatrix(Val.diabet$Diabetic,predicedtree3)
matriztree3
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  191  14
       yes  27  40
                                          
               Accuracy : 0.8493          
                 95% CI : (0.8011, 0.8896)
    No Information Rate : 0.8015          
    P-Value [Acc > NIR] : 0.02584         
                                          
                  Kappa : 0.5657          
                                          
 Mcnemar's Test P-Value : 0.06092         
                                          
            Sensitivity : 0.8761          
            Specificity : 0.7407          
         Pos Pred Value : 0.9317          
         Neg Pred Value : 0.5970          
             Prevalence : 0.8015          
         Detection Rate : 0.7022          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.8084          
                                          
       'Positive' Class : no              
                                          

Se obtiene que en la matriz de confusión a través de validación cruzada con 5 ramas, los verdaderos negativos contiene un valor bajo de 191 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 40 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8493, lo cual es bueno Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.8015.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión con ramas = 10.

prune.tree3 = prune.misclass(tree1, best = 15)
plot(prune.tree3)
text(prune.tree3, pretty = 0)

predicedtree4 = predict(prune.tree3, Val.diabet, type = "class")
matriztree4 <- confusionMatrix(Val.diabet$Diabetic,predicedtree4)
matriztree4
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  192  13
       yes  17  50
                                          
               Accuracy : 0.8897          
                 95% CI : (0.8463, 0.9243)
    No Information Rate : 0.7684          
    P-Value [Acc > NIR] : 2.327e-07       
                                          
                  Kappa : 0.6969          
                                          
 Mcnemar's Test P-Value : 0.5839          
                                          
            Sensitivity : 0.9187          
            Specificity : 0.7937          
         Pos Pred Value : 0.9366          
         Neg Pred Value : 0.7463          
             Prevalence : 0.7684          
         Detection Rate : 0.7059          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.8562          
                                          
       'Positive' Class : no              
                                          

Se obtiene que en la matriz de confusión a través de validación cruzada con 15 ramas, los verdaderos negativos contiene un valor bajo de 192 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 50 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8897, lo cual es bueno. Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión con ramas = 15.

Random Forest

library(randomForest)
randomForest 4.7-1.1
Type rfNews() to see new features/changes/bug fixes.

Attaching package: 'randomForest'
The following object is masked from 'package:gridExtra':

    combine
The following object is masked from 'package:ggplot2':

    margin
fitRF <- randomForest(Diabetic ~., data = Train.diabet, ntree = 500)
summary(fitRF)
                Length Class  Mode     
call               4   -none- call     
type               1   -none- character
predicted        634   factor numeric  
err.rate        1500   -none- numeric  
confusion          6   -none- numeric  
votes           1268   matrix numeric  
oob.times        634   -none- numeric  
classes            2   -none- character
importance        17   -none- numeric  
importanceSD       0   -none- NULL     
localImportance    0   -none- NULL     
proximity          0   -none- NULL     
ntree              1   -none- numeric  
mtry               1   -none- numeric  
forest            14   -none- list     
y                634   factor numeric  
test               0   -none- NULL     
inbag              0   -none- NULL     
terms              3   terms  call     
#Predict Output
predictedRF <- predict(fitRF, Val.diabet)
matrizRF <- confusionMatrix(Val.diabet$Diabetic, predictedRF)
matrizRF
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  200   5
       yes   9  58
                                          
               Accuracy : 0.9485          
                 95% CI : (0.9151, 0.9716)
    No Information Rate : 0.7684          
    P-Value [Acc > NIR] : 4.633e-16       
                                          
                  Kappa : 0.8585          
                                          
 Mcnemar's Test P-Value : 0.4227          
                                          
            Sensitivity : 0.9569          
            Specificity : 0.9206          
         Pos Pred Value : 0.9756          
         Neg Pred Value : 0.8657          
             Prevalence : 0.7684          
         Detection Rate : 0.7353          
   Detection Prevalence : 0.7537          
      Balanced Accuracy : 0.9388          
                                          
       'Positive' Class : no              
                                          
importance(fitRF)
                 MeanDecreaseGini
Age                     47.996445
Gender                   4.847399
Family_Diabetes         10.942331
highBP                   7.969586
PhysicallyActive        15.932822
BMI                     20.336674
Smoking                  1.582601
Alcohol                  4.221527
Sleep                   12.078554
SoundSleep              14.328307
RegularMedicine         56.264017
JunkFood                 6.266867
Stress                  15.764495
BPLevel                 16.423671
Pregancies              11.551984
Pdiabetes                5.105988
UriationFreq             4.936928
varImpPlot(fitRF)

Se obtiene que en la matriz de confusión, los verdaderos negativos contiene un valor bajo de 200 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 58 personas que tienen diabetes y que aún futuro lo seguirá teniendo.

Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es bueno, ya que, su valor es 0.9485, lo cual es excelente, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.

Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es excelente e incluso mejor que los otros modelos.