#Se carga la data 
diabetes<-read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/diabetes_m.csv",sep=";")
#Se visualiza la cabecera
head(diabetes)
##   n NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1 1               6                      148                          72
## 2 2               1                       85                          66
## 3 3               8                      183                          64
## 4 4               1                       89                          NA
## 5 5               0                      137                          40
## 6 6               5                      116                          74
##   Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1                                  35                       0
## 2                                  29                       0
## 3                                   0                       0
## 4                                  23                      94
## 5                                  NA                     168
## 6                                   0                       0
##   Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad resultado
## 1                    33.6                          0.627   50  Positivo
## 2                    26.6                          0.351   31  Negativo
## 3                    23.3                          0.672   32  Positivo
## 4                    28.1                          0.167   21  Negativo
## 5                    43.1                          2.288   33  Positivo
## 6                    25.6                          0.201   30  Negativo

Descripción 1: El head muestra todas las variables con sus 6 primeros datos de cada una.

str(diabetes)
## 'data.frame':    768 obs. of  10 variables:
##  $ n                                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ NumeroEmbarazos                    : int  6 1 8 1 0 5 3 10 2 8 ...
##  $ Concentrac.blucosa.plama           : int  148 85 183 89 137 116 78 115 197 125 ...
##  $ Presión.arterial.diastólica        : int  72 66 64 NA 40 74 NA 0 70 96 ...
##  $ Tríceps.espesor.del.pliegue.cutáneo: int  35 29 0 23 NA 0 32 0 45 0 ...
##  $ X2.horas.suero.insulina            : int  0 0 0 94 168 0 88 0 543 0 ...
##  $ Índice.de.masa.corporal            : num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
##  $ Función.pedigrí.de.la.diabetes     : num  0.627 0.351 0.672 0.167 2.288 ...
##  $ edad                               : int  50 31 32 21 33 30 26 29 53 54 ...
##  $ resultado                          : Factor w/ 2 levels "Negativo","Positivo": 2 1 2 1 2 1 2 1 2 2 ...

Descripción 2: El str detalla todas las variables y tambien muestra algunos datos de la data.

library(ggplot2)
ggplot(data=diabetes)+
  geom_point(mapping = aes(x=NumeroEmbarazos, y=Índice.de.masa.corporal,
                           color=resultado))

Descripción 3: El gráfico de ggplot muestra la intercepcion de las variables X(numero de embarazos)y Y(indice de masa corporal), ya que quiero ver cuantos son los mas propensos a diabetes (positivo) y quienes no (negativo).

#Se verifica si existe valores perdidos en la data
library(VIM)
aggr(diabetes)

Descripción 4: El gráfico nos muestra datos perdidos pero completamente al azar por lo cual se debe aplicar metodos de imputación.

#Se aplica técnica de imputación
library(DMwR)
diabetes1=knnImputation(diabetes)
aggr(diabetes1)

Descripción 5: En el gráfico se puede ver que se solucionó los missings.

#Ahora se va a corregir el problema de los 0's
diabetes2=diabetes1[,2:10]
head(diabetes2)
##   NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1               6                      148                    72.00000
## 2               1                       85                    66.00000
## 3               8                      183                    64.00000
## 4               1                       89                    63.76161
## 5               0                      137                    40.00000
## 6               5                      116                    74.00000
##   Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1                            35.00000                       0
## 2                            29.00000                       0
## 3                             0.00000                       0
## 4                            23.00000                      94
## 5                            27.75491                     168
## 6                             0.00000                       0
##   Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad resultado
## 1                    33.6                          0.627   50  Positivo
## 2                    26.6                          0.351   31  Negativo
## 3                    23.3                          0.672   32  Positivo
## 4                    28.1                          0.167   21  Negativo
## 5                    43.1                          2.288   33  Positivo
## 6                    25.6                          0.201   30  Negativo

Descripción 6: El único cambio que se hizo fue eliminar la primera variable, que el número de orden de los datos pues se elimino porque no es relevante para el análisis.

dim(diabetes2)
## [1] 768   9

Descripción 7: Muestra la nueva dimension de la data(diabetes2).

#Haré un pequeño analisis exploratorio de datos
hist(sqrt(diabetes2$NumeroEmbarazos))

Descripción 8: En el gráfico un histograma de la variable número de embarazos, pero le puse el sqrt porque traté de que su sesgo sea en forma de campana pero no se pudo y lo único más cerca fue esa.

#################################################################################################################
                                              ### RED NEURONAL
#################################################################################################################

#Muestra
set.seed(111)
muestra=sample(537,231)
#Train
train=diabetes2[-muestra,]
dim(train)
## [1] 537   9

Descripción 9: En esta red neuronal apliqué de semilla el 111 la muestra es de 537 para train y 231 para test.Por ello se ve que la dimensión de la train es 537 datos y 9 variables.

#Test
test=diabetes2[muestra,]
dim(test)
## [1] 231   9

Descripción 10: Muestra que la dimensión de la test es 231 datos y 9 variables.

#Modelo de la red neuronal
library(nnet)
names(train)
## [1] "NumeroEmbarazos"                    
## [2] "Concentrac.blucosa.plama"           
## [3] "Presión.arterial.diastólica"        
## [4] "Tríceps.espesor.del.pliegue.cutáneo"
## [5] "X2.horas.suero.insulina"            
## [6] "Índice.de.masa.corporal"            
## [7] "Función.pedigrí.de.la.diabetes"     
## [8] "edad"                               
## [9] "resultado"

Descripción 11: Muestra que la dimensión de la test es 231 datos y 9 variables.

set.seed(222)
modelo_red=nnet(resultado~.,data=train,size=50,method="class")
## # weights:  501
## initial  value 392.855680 
## iter  10 value 324.449481
## iter  20 value 313.472422
## iter  30 value 301.476773
## iter  40 value 287.046108
## iter  50 value 272.103852
## iter  60 value 252.833698
## iter  70 value 248.292229
## iter  80 value 245.158790
## iter  90 value 239.119385
## iter 100 value 227.966290
## final  value 227.966290 
## stopped after 100 iterations

Descripción 12: En este caso le puse semilla 222 para entrenarlo, luego hice el modelo con 50 neuronas.

predichos_red=predict(modelo_red,test, type = "class")
predichos_red
##   [1] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
##   [7] "Positivo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
##  [13] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Positivo"
##  [19] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
##  [25] "Positivo" "Negativo" "Positivo" "Positivo" "Negativo" "Positivo"
##  [31] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
##  [37] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
##  [43] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [49] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
##  [55] "Negativo" "Positivo" "Positivo" "Positivo" "Negativo" "Negativo"
##  [61] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [67] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [73] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [79] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [85] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [91] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [97] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [103] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [109] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [115] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [121] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [127] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [133] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [139] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
## [145] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [151] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [157] "Negativo" "Positivo" "Positivo" "Positivo" "Negativo" "Positivo"
## [163] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [169] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [175] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [181] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Positivo"
## [187] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [193] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Positivo"
## [199] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [205] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [211] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [217] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [223] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [229] "Negativo" "Negativo" "Negativo"

Descripción 13: Muestra los valores predichos del modelo.

#Se realizará la matriz de confusión
table(predichos_red, test$resultado)
##              
## predichos_red Negativo Positivo
##      Negativo      126       45
##      Positivo       24       36

Descripción 14: Muestra los valores predichos y los valores reales de la red neuronal.

#Se realizará los indicadores
library(caret)
predichos_red=as.factor(predichos_red)
indicadores=confusionMatrix(predichos_red,test$resultado)
indicadores
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Negativo Positivo
##   Negativo      126       45
##   Positivo       24       36
##                                           
##                Accuracy : 0.7013          
##                  95% CI : (0.6378, 0.7596)
##     No Information Rate : 0.6494          
##     P-Value [Acc > NIR] : 0.05509         
##                                           
##                   Kappa : 0.3025          
##                                           
##  Mcnemar's Test P-Value : 0.01605         
##                                           
##             Sensitivity : 0.8400          
##             Specificity : 0.4444          
##          Pos Pred Value : 0.7368          
##          Neg Pred Value : 0.6000          
##              Prevalence : 0.6494          
##          Detection Rate : 0.5455          
##    Detection Prevalence : 0.7403          
##       Balanced Accuracy : 0.6422          
##                                           
##        'Positive' Class : Negativo        
## 

Descripción 15: Muestra los valores predichos y los valores reales de la red neuronal. También muestra que tiene un accuracy de 70.13%, mientras que su sensibilidad es 84% y su especificidad es 44,44%.Es aceptable, pero se debe mejorar esa especificidad.

#Graficar la curva ROC de la neurona
pred_1<-predict(modelo_red,test, type = "raw")
library(ROCR)
## Loading required package: gplots
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
## 
##     lowess
pred_2<-prediction(pred_1, test$resultado)
pred_3<-performance(pred_2, "tpr", "fpr")
plot(pred_3, colorize=T)
lines(x=c(0,1), y=c(0,1))

Descripción 16: Muestra la curva roc de la red neuronal. Esta nos ayuda a determinar la exactitud diagnóstica del test.

#################################################################################################################
                                              ### ÁRBOL DE DECISIÓN
#################################################################################################################

library(rpart)
names(diabetes2)
## [1] "NumeroEmbarazos"                    
## [2] "Concentrac.blucosa.plama"           
## [3] "Presión.arterial.diastólica"        
## [4] "Tríceps.espesor.del.pliegue.cutáneo"
## [5] "X2.horas.suero.insulina"            
## [6] "Índice.de.masa.corporal"            
## [7] "Función.pedigrí.de.la.diabetes"     
## [8] "edad"                               
## [9] "resultado"
modelo_arbol=rpart(resultado~.,data=train, method = "class")
library(partykit)
plot(as.party(modelo_arbol))

Descripción 17: Grafica el modelo de arbol, pero ello lo hace con la librerias mostradas.

predichos_arbol=predict(modelo_arbol, test, type = "class")
table(predichos_arbol, test$resultado)
##                
## predichos_arbol Negativo Positivo
##        Negativo      110       30
##        Positivo       40       51

Descripción 18: Muestra los valores predichos y los valores reales del arbol.

indicadores_arbol=confusionMatrix(predichos_arbol, test$resultado)
indicadores_arbol
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Negativo Positivo
##   Negativo      110       30
##   Positivo       40       51
##                                           
##                Accuracy : 0.697           
##                  95% CI : (0.6333, 0.7555)
##     No Information Rate : 0.6494          
##     P-Value [Acc > NIR] : 0.07266         
##                                           
##                   Kappa : 0.3529          
##                                           
##  Mcnemar's Test P-Value : 0.28206         
##                                           
##             Sensitivity : 0.7333          
##             Specificity : 0.6296          
##          Pos Pred Value : 0.7857          
##          Neg Pred Value : 0.5604          
##              Prevalence : 0.6494          
##          Detection Rate : 0.4762          
##    Detection Prevalence : 0.6061          
##       Balanced Accuracy : 0.6815          
##                                           
##        'Positive' Class : Negativo        
## 

Descripción 19: Muestra los indicadores del arbol.

#Curva ROC
predichos=predict(modelo_arbol, test, type = "prob")[,2]

pred_1_arbol=prediction(predichos, test$resultado)
pred_2_arbol=performance(pred_1_arbol, "tpr", "fpr")
plot(pred_2_arbol, colorize=T)
lines(x=c(0,1), y=c(0,1))

Descripción 20: Muestra la curva roc del arbol. Esta nos ayuda a determinar la exactitud diagnóstica del test.

#Comparación entre la curva roc de la red neuronal vs la del árbol
par(mfrow=c(1,2))
plot(pred_3, colorize=T)#red neuronal
lines(x=c(0,1), y=c(0,1))
plot(pred_2_arbol, colorize=T)#arbol
lines(x=c(0,1), y=c(0,1))

Descripción 21: Como se puede apreciar ambas curvas estan por encima de la recta pero eso no significa que ambas estén bien pues una de ellas llega a la lo que se le llama una ’parabola’pero aun así falta mejorar.