En el siguiente artículo se darán a conocer los pasos para poder crear una red neuronal y un modelo de Árbol en rStudio. Se utilizaran diferentes librerías para que el contenido pueda ser ilustrativo y entendible. De esta manera, se podrá generar estos procesos de una forma más sencilla y óptima.

A continuación se darán definiciones de lo que son Redes Neuronales y Modelo de Árbol.

#MODELO DE ARBOL

El árbol de decisión o de clasificación es una representación visual de la manera en que se estructuran las decisiones que dan lugar a la clasificación. El árbol de clasificación lo componen una serie de nodos internos y externos así como arcos que unen los nodos. Los nodos externos se les conocen como hojas del árbol y se marcan con una clase o una distribución de probabilidad sobre las clases. Los árboles de decisión son un método usado en distintas disciplinas como modelo de predicción. Estos son similares a diagramas de flujo, en los que llegamos a puntos en los que se toman decisiones de acuerdo a una regla.

#REDES NEURONALES

Las redes neuronales son un paradigma de aprendizaje y procesamiento automático basado en el funcionamiento de nuestro sistema nervioso, este sistema este compuesto por una serie de neuronas y conexiones entre ellas que colaboran entre sí para producir una salida.

#cARGAMOS LA DATA

Se importa la data asignada de GitHub.

DiabetesAguilar=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/diabetes_m.csv", sep = ";")

#COMPRENSION DE LA DATA

Se necesita comprender los datos de dicha data para poder continuar con el siguiente paso. Aquí se mostrarán el número de variables que existen y los datos.

names(DiabetesAguilar)
##  [1] "n"                                  
##  [2] "NumeroEmbarazos"                    
##  [3] "Concentrac.blucosa.plama"           
##  [4] "Presión.arterial.diastólica"        
##  [5] "Tríceps.espesor.del.pliegue.cutáneo"
##  [6] "X2.horas.suero.insulina"            
##  [7] "Índice.de.masa.corporal"            
##  [8] "Función.pedigrí.de.la.diabetes"     
##  [9] "edad"                               
## [10] "resultado"
head(DiabetesAguilar)
##   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
str(DiabetesAguilar)
## '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 ...

#ELIMINANDO VARIABLE

Al momento de ejecutar los comandos anteriores se puede visualizar que hay una variable innecesaria la cual se procederá a eliminar.

DiabetesAguilar01<-DiabetesAguilar[,2:10]
head(DiabetesAguilar01)
##   NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1               6                      148                          72
## 2               1                       85                          66
## 3               8                      183                          64
## 4               1                       89                          NA
## 5               0                      137                          40
## 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

#VALORES NA’s Al analizar la data se detecto que existen valores NA’s en las variables:Presion arterial diastolica,Tríceps espesor del pliegue cutáneo y X2 horas suero insulina.

Existe en dichas variables un valor de 3% en datos NA’s.

library(Amelia)
missmap(DiabetesAguilar01)

En el siguiente gráfico se puede observar los valores perdidos (NA’s)

library(VIM)
missing=aggr(DiabetesAguilar01)

summary(missing)
## 
##  Missings per variable: 
##                             Variable Count
##                      NumeroEmbarazos     0
##             Concentrac.blucosa.plama     0
##          Presión.arterial.diastólica    84
##  Tríceps.espesor.del.pliegue.cutáneo    66
##              X2.horas.suero.insulina    70
##              Índice.de.masa.corporal     0
##       Función.pedigrí.de.la.diabetes     0
##                                 edad     0
##                            resultado     0
## 
##  Missings in combinations of variables: 
##       Combinations Count    Percent
##  0:0:0:0:0:0:0:0:0   569 74.0885417
##  0:0:0:0:1:0:0:0:0    55  7.1614583
##  0:0:0:1:0:0:0:0:0    52  6.7708333
##  0:0:0:1:1:0:0:0:0     8  1.0416667
##  0:0:1:0:0:0:0:0:0    71  9.2447917
##  0:0:1:0:1:0:0:0:0     7  0.9114583
##  0:0:1:1:0:0:0:0:0     6  0.7812500

#REEMPLAZANDO LOS NA’S

Ya se logró apreciar que existen filas que no se encuentrar con la data correspondiente(VACIOS). Por lo que se procederá a rellenarlos con el promedio ponderado de los datos mas cercanos.

library(DMwR)
Diabetes_Im_Fa=knnImputation(DiabetesAguilar01)
summary(Diabetes_Im_Fa)
##  NumeroEmbarazos  Concentrac.blucosa.plama Presión.arterial.diastólica
##  Min.   : 0.000   Min.   :  0.0            Min.   :  0.00             
##  1st Qu.: 1.000   1st Qu.: 99.0            1st Qu.: 63.02             
##  Median : 3.000   Median :117.0            Median : 71.21             
##  Mean   : 3.845   Mean   :120.9            Mean   : 68.94             
##  3rd Qu.: 6.000   3rd Qu.:140.2            3rd Qu.: 79.06             
##  Max.   :17.000   Max.   :199.0            Max.   :122.00             
##  Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
##  Min.   : 0.0                        Min.   :  0.00         
##  1st Qu.: 0.0                        1st Qu.:  0.00         
##  Median :23.0                        Median : 42.39         
##  Mean   :20.5                        Mean   : 78.57         
##  3rd Qu.:32.0                        3rd Qu.:126.55         
##  Max.   :99.0                        Max.   :680.00         
##  Índice.de.masa.corporal Función.pedigrí.de.la.diabetes      edad      
##  Min.   : 0.00           Min.   :0.0780                 Min.   :21.00  
##  1st Qu.:27.30           1st Qu.:0.2437                 1st Qu.:24.00  
##  Median :32.00           Median :0.3725                 Median :29.00  
##  Mean   :31.99           Mean   :0.4719                 Mean   :33.24  
##  3rd Qu.:36.60           3rd Qu.:0.6262                 3rd Qu.:41.00  
##  Max.   :67.10           Max.   :2.4200                 Max.   :81.00  
##     resultado  
##  Negativo:500  
##  Positivo:268  
##                
##                
##                
## 

#REDES NEURONALES

Una vez analizada la data se procederá a hacer lo que son redes neuronales. El primer paso partir la data y por ende usamos el siguiente comando

dim(Diabetes_Im_Fa)
## [1] 768   9
set.seed(111)
muestra=sample(480,288)

Una ves partida la data se crean la data TRAIN y la data TEST lo cual nos ayudará con nuestro modelo predictivo.

#DATA TRAIN

train_01=Diabetes_Im_Fa[-muestra,]
head(train_01)
##    NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1                6                      148                    72.00000
## 2                1                       85                    66.00000
## 4                1                       89                    65.93520
## 7                3                       78                    67.42610
## 11               4                      110                    92.00000
## 15               5                      166                    72.71296
##    Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1                                   35                       0
## 2                                   29                       0
## 4                                   23                      94
## 7                                   32                      88
## 11                                   0                       0
## 15                                  19                     175
##    Í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
## 4                     28.1                          0.167   21  Negativo
## 7                     31.0                          0.248   26  Positivo
## 11                    37.6                          0.191   30  Negativo
## 15                    25.8                          0.587   51  Positivo

#DATA TEST

test_01=Diabetes_Im_Fa[muestra,]
dim(train_01)
## [1] 480   9
dim(test_01)
## [1] 288   9
fix(train_01)

#ENTRENAMOS LO QUE VENDRÍAN A SER LOS VALORES ANN

Para este caso se decidio trabajar con 50 neuronas

library(nnet)
names(train_01)
## [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"
set.seed(222)
modelo_diab=nnet(resultado~.,data=train_01, size=50)
## # weights:  501
## initial  value 346.427604 
## iter  10 value 275.195483
## iter  20 value 267.030124
## iter  30 value 255.971540
## iter  40 value 244.149738
## iter  50 value 228.023063
## iter  60 value 213.644460
## iter  70 value 197.555366
## iter  80 value 188.317310
## iter  90 value 180.004177
## iter 100 value 177.654852
## final  value 177.654852 
## stopped after 100 iterations

#PRODECIMIENTO DE PREDICCIÓN

Aquí se muestra las predicciones que se realizaron, pero se puede mejorar.

predichos_diab=predict(modelo_diab, test_01, type = "class")
predichos_diab
##   [1] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##   [7] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
##  [13] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [19] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [25] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
##  [31] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [37] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
##  [43] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
##  [49] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [55] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
##  [61] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [67] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [73] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
##  [79] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [85] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
##  [91] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [97] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [103] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [109] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [115] "Positivo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [121] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Positivo"
## [127] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [133] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [139] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [145] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [151] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [157] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [163] "Negativo" "Positivo" "Negativo" "Positivo" "Positivo" "Negativo"
## [169] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [175] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [181] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [187] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [193] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [199] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [205] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [211] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [217] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [223] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [229] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Positivo"
## [235] "Negativo" "Negativo" "Positivo" "Positivo" "Positivo" "Negativo"
## [241] "Negativo" "Positivo" "Negativo" "Positivo" "Positivo" "Positivo"
## [247] "Positivo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [253] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [259] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Positivo"
## [265] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Positivo"
## [271] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
## [277] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [283] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
comparando=as.data.frame(cbind(test_01$resultado, predichos_diab))
fix(comparando)

Se realizó un conteo de las predicciones hechas.

table(test_01$resultado, predichos_diab)
##           predichos_diab
##            Negativo Positivo
##   Negativo      141       42
##   Positivo       66       39

#INDICADORES

Se necesito cambiar el valor de la variale a “factor” para poder continuar con el siguiente paso. Podemos ver que contamos con: Accuracy: 0.6354 (muy bajo) Sensibilidad: 0.7705 (muy bajo) Especificidad: 0.3714 (demasiado bajo)

library(caret)
str(predichos_diab)
##  chr [1:288] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" ...
predichos_diab=as.factor(predichos_diab)
str(test_01$resultado)
##  Factor w/ 2 levels "Negativo","Positivo": 1 1 1 1 2 2 1 1 1 1 ...
indicadores_diab=confusionMatrix(predichos_diab, test_01$resultado)
indicadores_diab
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Negativo Positivo
##   Negativo      141       66
##   Positivo       42       39
##                                           
##                Accuracy : 0.625           
##                  95% CI : (0.5663, 0.6811)
##     No Information Rate : 0.6354          
##     P-Value [Acc > NIR] : 0.66746         
##                                           
##                   Kappa : 0.1492          
##                                           
##  Mcnemar's Test P-Value : 0.02689         
##                                           
##             Sensitivity : 0.7705          
##             Specificity : 0.3714          
##          Pos Pred Value : 0.6812          
##          Neg Pred Value : 0.4815          
##              Prevalence : 0.6354          
##          Detection Rate : 0.4896          
##    Detection Prevalence : 0.7188          
##       Balanced Accuracy : 0.5710          
##                                           
##        'Positive' Class : Negativo        
## 

#CURVA ROC

La curva roc visualizada no es buena.

library(ROCR)
predichos_prob=predict(modelo_diab, test_01, type = "raw")
pred1=prediction(predichos_prob, test_01$resultado)
pred2=performance(pred1, "tpr", "fpr")
plot(pred2, colorize=T)
lines(x=c(0,1), y=c(0,1))

#MODELO DE ÁRBOL

Partimos la data Diabetes_Im_Fa en 2 partes con un 70% para el TRAIN y el 30% para TEST.

library(caret)
set.seed(111)
particion=createDataPartition(y = Diabetes_Im_Fa$resultado, p=0.7, list = F, times = 1)
train_02=Diabetes_Im_Fa[particion,]
test_02=Diabetes_Im_Fa[-particion,]
dim(Diabetes_Im_Fa)
## [1] 768   9
dim(train_02)
## [1] 538   9
dim(test_02)
## [1] 230   9

Se nos muestra un esquema del árbol que acabamos de crear, primero se encuentra por el nodo lo cual es la variable después de eso vienen lo que son las hojas del árbol lo cual corresponde a los datos.

library(rpart)
set.seed(111)
modelo_02=rpart(resultado~.,data=train_02, method = "class")
modelo_02
## n= 538 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##   1) root 538 188 Negativo (0.65055762 0.34944238)  
##     2) Concentrac.blucosa.plama< 123.5 332  63 Negativo (0.81024096 0.18975904)  
##       4) edad< 28.5 183  13 Negativo (0.92896175 0.07103825) *
##       5) edad>=28.5 149  50 Negativo (0.66442953 0.33557047)  
##        10) Índice.de.masa.corporal< 26.35 30   0 Negativo (1.00000000 0.00000000) *
##        11) Índice.de.masa.corporal>=26.35 119  50 Negativo (0.57983193 0.42016807)  
##          22) Concentrac.blucosa.plama< 103.5 59  15 Negativo (0.74576271 0.25423729)  
##            44) Función.pedigrí.de.la.diabetes< 0.6355 48   8 Negativo (0.83333333 0.16666667) *
##            45) Función.pedigrí.de.la.diabetes>=0.6355 11   4 Positivo (0.36363636 0.63636364) *
##          23) Concentrac.blucosa.plama>=103.5 60  25 Positivo (0.41666667 0.58333333)  
##            46) NumeroEmbarazos< 6.5 42  20 Negativo (0.52380952 0.47619048)  
##              92) X2.horas.suero.insulina< 140 30  11 Negativo (0.63333333 0.36666667)  
##               184) Índice.de.masa.corporal>=33.75 16   3 Negativo (0.81250000 0.18750000) *
##               185) Índice.de.masa.corporal< 33.75 14   6 Positivo (0.42857143 0.57142857) *
##              93) X2.horas.suero.insulina>=140 12   3 Positivo (0.25000000 0.75000000) *
##            47) NumeroEmbarazos>=6.5 18   3 Positivo (0.16666667 0.83333333) *
##     3) Concentrac.blucosa.plama>=123.5 206  81 Positivo (0.39320388 0.60679612)  
##       6) Índice.de.masa.corporal< 29.95 62  22 Negativo (0.64516129 0.35483871)  
##        12) edad< 26.5 17   1 Negativo (0.94117647 0.05882353) *
##        13) edad>=26.5 45  21 Negativo (0.53333333 0.46666667)  
##          26) edad>=56 9   0 Negativo (1.00000000 0.00000000) *
##          27) edad< 56 36  15 Positivo (0.41666667 0.58333333)  
##            54) Índice.de.masa.corporal>=28.8 10   2 Negativo (0.80000000 0.20000000) *
##            55) Índice.de.masa.corporal< 28.8 26   7 Positivo (0.26923077 0.73076923) *
##       7) Índice.de.masa.corporal>=29.95 144  41 Positivo (0.28472222 0.71527778)  
##        14) edad< 28.5 51  24 Positivo (0.47058824 0.52941176)  
##          28) Concentrac.blucosa.plama< 165.5 38  15 Negativo (0.60526316 0.39473684)  
##            56) Presión.arterial.diastólica>=72.3342 16   2 Negativo (0.87500000 0.12500000) *
##            57) Presión.arterial.diastólica< 72.3342 22   9 Positivo (0.40909091 0.59090909)  
##             114) NumeroEmbarazos>=0.5 13   5 Negativo (0.61538462 0.38461538) *
##             115) NumeroEmbarazos< 0.5 9   1 Positivo (0.11111111 0.88888889) *
##          29) Concentrac.blucosa.plama>=165.5 13   1 Positivo (0.07692308 0.92307692) *
##        15) edad>=28.5 93  17 Positivo (0.18279570 0.81720430) *

Queriendo tener un gráfico más claro de poder observar usamos los comandos siguientes.

library(partykit)
plot(as.party(modelo_02))

#Predecimos

Usamos la función precict() para poder ser mas sistemáticos.

predichos=predict(modelo_02,test_02,type="class")
predichos
##        2        8       12       14       29       34       36       39 
## Negativo Positivo Positivo Positivo Negativo Negativo Negativo Negativo 
##       42       44       46       48       49       58       60       62 
## Positivo Positivo Positivo Negativo Negativo Positivo Negativo Positivo 
##       63       64       65       66       71       75       78       82 
## Negativo Negativo Positivo Negativo Negativo Negativo Negativo Negativo 
##       87       89       94       96       98      101      102      106 
## Positivo Positivo Negativo Positivo Negativo Positivo Negativo Negativo 
##      110      111      114      116      117      121      122      124 
## Negativo Positivo Negativo Positivo Positivo Negativo Negativo Negativo 
##      125      126      131      134      135      136      140      149 
## Negativo Negativo Negativo Negativo Negativo Positivo Negativo Positivo 
##      150      151      152      155      158      164      165      167 
## Negativo Negativo Negativo Positivo Negativo Negativo Positivo Negativo 
##      168      169      170      175      176      182      185      188 
## Positivo Positivo Positivo Negativo Positivo Negativo Positivo Positivo 
##      190      192      195      206      208      210      216      218 
## Negativo Positivo Negativo Negativo Positivo Positivo Positivo Positivo 
##      224      225      228      232      234      241      244      245 
## Negativo Negativo Negativo Positivo Negativo Negativo Positivo Positivo 
##      247      249      250      252      253      257      262      264 
## Positivo Positivo Negativo Positivo Negativo Positivo Negativo Positivo 
##      266      268      278      279      282      283      284      286 
## Positivo Negativo Negativo Negativo Positivo Positivo Positivo Positivo 
##      287      290      291      292      294      297      299      301 
## Positivo Negativo Negativo Negativo Negativo Positivo Negativo Positivo 
##      305      312      319      320      329      332      335      338 
## Positivo Negativo Negativo Negativo Negativo Negativo Negativo Positivo 
##      339      340      346      347      355      356      357      359 
## Positivo Positivo Positivo Negativo Negativo Positivo Negativo Negativo 
##      364      369      376      377      379      380      383      384 
## Positivo Negativo Positivo Negativo Positivo Positivo Negativo Negativo 
##      386      390      399      402      420      427      433      439 
## Negativo Negativo Negativo Positivo Positivo Negativo Negativo Negativo 
##      443      446      450      451      452      453      456      458 
## Negativo Positivo Negativo Negativo Negativo Negativo Positivo Negativo 
##      466      470      471      478      480      492      494      506 
## Negativo Negativo Negativo Negativo Negativo Negativo Negativo Negativo 
##      509      517      518      528      529      536      539      555 
## Negativo Positivo Positivo Negativo Negativo Negativo Negativo Negativo 
##      556      558      562      572      575      576      577      579 
## Positivo Positivo Positivo Negativo Negativo Negativo Negativo Positivo 
##      580      581      583      586      587      590      596      603 
## Positivo Negativo Positivo Negativo Positivo Negativo Positivo Positivo 
##      607      610      613      615      619      622      623      627 
## Positivo Negativo Positivo Positivo Positivo Negativo Positivo Negativo 
##      628      629      631      633      634      637      638      639 
## Negativo Positivo Positivo Negativo Negativo Positivo Negativo Positivo 
##      646      657      659      667      671      675      676      678 
## Positivo Negativo Positivo Positivo Positivo Negativo Positivo Negativo 
##      682      684      685      687      688      689      695      696 
## Negativo Negativo Negativo Negativo Positivo Negativo Negativo Positivo 
##      697      699      700      704      707      708      710      713 
## Negativo Negativo Negativo Positivo Negativo Negativo Negativo Positivo 
##      716      717      719      722      725      736      743      745 
## Positivo Positivo Negativo Negativo Positivo Negativo Negativo Positivo 
##      747      748      751      752      759      762 
## Negativo Positivo Negativo Negativo Negativo Positivo 
## Levels: Negativo Positivo

#Matriz de confusion e indicadores

table(predichos, test_02$resultado)
##           
## predichos  Negativo Positivo
##   Negativo      105       29
##   Positivo       45       51

Tenemos una precisión (accuracy), Kappa y otros estadísticos con valores aceptables. Podemos ver que contamos con: Accuracy: 0.6783 (muy bajo) Sensibilidad: 0.7000 (muy bajo) Especificidad: 0.6375 (muy bajo)

library(caret)
str(test_02$resultado)
##  Factor w/ 2 levels "Negativo","Positivo": 1 1 2 2 1 1 1 2 1 2 ...
test_02$resultado=as.factor(test_02$resultado)
indicadores=confusionMatrix(predichos,test_02$resultado)
indicadores
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Negativo Positivo
##   Negativo      105       29
##   Positivo       45       51
##                                           
##                Accuracy : 0.6783          
##                  95% CI : (0.6137, 0.7382)
##     No Information Rate : 0.6522          
##     P-Value [Acc > NIR] : 0.22411         
##                                           
##                   Kappa : 0.3225          
##                                           
##  Mcnemar's Test P-Value : 0.08121         
##                                           
##             Sensitivity : 0.7000          
##             Specificity : 0.6375          
##          Pos Pred Value : 0.7836          
##          Neg Pred Value : 0.5312          
##              Prevalence : 0.6522          
##          Detection Rate : 0.4565          
##    Detection Prevalence : 0.5826          
##       Balanced Accuracy : 0.6687          
##                                           
##        'Positive' Class : Negativo        
## 
library(nnet)
modelo_red=nnet(resultado~.,data=train_02, size=90)
## # weights:  901
## initial  value 405.951380 
## iter  10 value 310.786582
## iter  20 value 299.372146
## iter  30 value 285.281337
## iter  40 value 273.175793
## iter  50 value 250.602247
## iter  60 value 234.626144
## iter  70 value 220.543645
## iter  80 value 203.623130
## iter  90 value 188.851592
## iter 100 value 173.187614
## final  value 173.187614 
## stopped after 100 iterations
modelo_red
## a 8-90-1 network with 901 weights
## inputs: NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad 
## output(s): resultado 
## options were - entropy fitting
predichos_red=predict(modelo_red, test_02, type = "class")
predichos_red
##   [1] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
##   [7] "Positivo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
##  [13] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Positivo"
##  [19] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [25] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
##  [31] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [37] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
##  [43] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
##  [49] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
##  [55] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
##  [61] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
##  [67] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
##  [73] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
##  [79] "Positivo" "Positivo" "Positivo" "Positivo" "Negativo" "Negativo"
##  [85] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
##  [91] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Positivo"
##  [97] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Positivo"
## [103] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [109] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [115] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [121] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [127] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [133] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [139] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [145] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [151] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [157] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [163] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Positivo"
## [169] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [175] "Positivo" "Positivo" "Negativo" "Positivo" "Positivo" "Positivo"
## [181] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [187] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [193] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [199] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [205] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [211] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [217] "Positivo" "Negativo" "Positivo" "Positivo" "Negativo" "Positivo"
## [223] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [229] "Positivo" "Positivo"

#CURVA ROC

predichos_prob_02=predict(modelo_diab, test_02, type = "raw")
library(ROCR)
pred1=prediction(predichos_prob_02, test_02$resultado)
pred2=performance(pred1, "tpr", "fpr")
plot(pred2, colorize=T)
lines(x=c(0,1), y=c(0,1))