#Importamos la data
diabetes <- read.csv("C:/Users/HP-PC/Desktop/diabetes.txt", sep=";")
head(diabetes)
## n NumeroEmbarazos Concentrac.blucosa.plama Presion.arterial.diastolica
## 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
## Triceps.espesor.del.pliegue.cutaneo X2.horas.suero.insulina
## 1 35 0
## 2 29 0
## 3 0 0
## 4 23 94
## 5 NA 168
## 6 0 0
## indice.de.masa.corporal Funcion.pedigri.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
#Separamos la data ya que no utilizaremos la fila n
diabetes=diabetes[,2:10]
head(diabetes)
## NumeroEmbarazos Concentrac.blucosa.plama Presion.arterial.diastolica
## 1 6 148 72
## 2 1 85 66
## 3 8 183 64
## 4 1 89 NA
## 5 0 137 40
## 6 5 116 74
## Triceps.espesor.del.pliegue.cutaneo X2.horas.suero.insulina
## 1 35 0
## 2 29 0
## 3 0 0
## 4 23 94
## 5 NA 168
## 6 0 0
## indice.de.masa.corporal Funcion.pedigri.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
#Veremos si hay missing
summary(diabetes)
## NumeroEmbarazos Concentrac.blucosa.plama Presion.arterial.diastolica
## Min. : 0.000 Min. : 0.0 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 62.00
## Median : 3.000 Median :117.0 Median : 72.00
## Mean : 3.845 Mean :120.9 Mean : 69.05
## 3rd Qu.: 6.000 3rd Qu.:140.2 3rd Qu.: 80.00
## Max. :17.000 Max. :199.0 Max. :122.00
## NA's :84
## Triceps.espesor.del.pliegue.cutaneo X2.horas.suero.insulina
## Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.00 1st Qu.: 0.00
## Median :23.00 Median : 24.00
## Mean :20.41 Mean : 78.23
## 3rd Qu.:32.00 3rd Qu.:127.75
## Max. :99.00 Max. :680.00
## NA's :66 NA's :70
## indice.de.masa.corporal Funcion.pedigri.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
##
##
##
##
##
#Utilizaremos la libreria Amelia y VIM para mostrarlo como grafica
library(Amelia)
## Loading required package: Rcpp
## ##
## ## Amelia II: Multiple Imputation
## ## (Version 1.7.5, built: 2018-05-07)
## ## Copyright (C) 2005-2019 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
missmap(diabetes)

library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## Loading required package: data.table
## VIM is ready to use.
## Since version 4.0.0 the GUI is in its own package VIMGUI.
##
## Please use the package to use the new (and old) GUI.
## Suggestions and bug-reports can be submitted at: https://github.com/alexkowa/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
miss=aggr(diabetes)

#Mostramos en porcentaje
summary(miss)
##
## Missings per variable:
## Variable Count
## NumeroEmbarazos 0
## Concentrac.blucosa.plama 0
## Presion.arterial.diastolica 84
## Triceps.espesor.del.pliegue.cutaneo 66
## X2.horas.suero.insulina 70
## indice.de.masa.corporal 0
## Funcion.pedigri.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
#Dependiendo el porcentaje de missing se aplicara un metodo distinto, en este caso usaremos el comando knnimputation para darle pureza a la data
library(DMwR)
## Loading required package: lattice
## Registered S3 method overwritten by 'xts':
## method from
## as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Attaching package: 'DMwR'
## The following object is masked from 'package:VIM':
##
## kNN
diabetes_im<-knnImputation(diabetes)
#Creamos un segundo dataframe para poder usarlo en la parte de la red neuronal
diabetes_im1<-knnImputation(diabetes)
summary(diabetes_im)
## NumeroEmbarazos Concentrac.blucosa.plama Presion.arterial.diastolica
## 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
## Triceps.espesor.del.pliegue.cutaneo 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
## indice.de.masa.corporal Funcion.pedigri.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
##
##
##
##
#Buscamos la mejor correlacion existente entre los datos
plot(diabetes_im)

str(diabetes)
## 'data.frame': 768 obs. of 9 variables:
## $ 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 ...
## $ Presion.arterial.diastolica : int 72 66 64 NA 40 74 NA 0 70 96 ...
## $ Triceps.espesor.del.pliegue.cutaneo: 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 ...
## $ indice.de.masa.corporal : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
## $ Funcion.pedigri.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 ...
#REDES NEURONALES
#Crear la data train y test
dim(diabetes_im1)
## [1] 768 9
set.seed(111)
muestra=sample(537,231)
#Train data
train1=diabetes_im1[-muestra,]
#Test data
test1=diabetes_im1[muestra,]
dim(train1)
## [1] 537 9
dim(test1)
## [1] 231 9
fix(train1)
#Entrenamos el modelo de ANN
names(train1)
## [1] "NumeroEmbarazos"
## [2] "Concentrac.blucosa.plama"
## [3] "Presion.arterial.diastolica"
## [4] "Triceps.espesor.del.pliegue.cutaneo"
## [5] "X2.horas.suero.insulina"
## [6] "indice.de.masa.corporal"
## [7] "Funcion.pedigri.de.la.diabetes"
## [8] "edad"
## [9] "resultado"
set.seed(222)
library(nnet)
modelo_diab=nnet(resultado~.,data=train1, size=50)
## # weights: 501
## initial value 394.349169
## iter 10 value 323.393175
## iter 20 value 312.037157
## iter 30 value 295.778164
## iter 40 value 282.044343
## iter 50 value 271.860239
## iter 60 value 257.564340
## iter 70 value 240.073847
## iter 80 value 223.292872
## iter 90 value 209.207816
## iter 100 value 192.569667
## final value 192.569667
## stopped after 100 iterations
#Predecir baso en el modelo anterior
predichos_diab=predict(modelo_diab, test1, type = "class")
predichos_diab
## [1] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [7] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Positivo"
## [13] "Negativo" "Positivo" "Positivo" "Positivo" "Negativo" "Positivo"
## [19] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
## [25] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [31] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [37] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
## [43] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [49] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [55] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [61] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Positivo"
## [67] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
## [73] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Positivo"
## [79] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [85] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
## [91] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [97] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [103] "Negativo" "Positivo" "Positivo" "Negativo" "Positivo" "Negativo"
## [109] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [115] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [121] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Positivo"
## [127] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [133] "Positivo" "Positivo" "Negativo" "Positivo" "Positivo" "Negativo"
## [139] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [145] "Negativo" "Positivo" "Positivo" "Negativo" "Positivo" "Negativo"
## [151] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [157] "Negativo" "Positivo" "Positivo" "Positivo" "Negativo" "Negativo"
## [163] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [169] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [175] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [181] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Positivo"
## [187] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [193] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Positivo"
## [199] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [205] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [211] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [217] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
## [223] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [229] "Negativo" "Negativo" "Negativo"
comparando=as.data.frame(cbind(test1$resultado, predichos_diab))
fix(comparando)
#Creamos la Matriz de confusion
table(test1$resultado, predichos_diab)
## predichos_diab
## Negativo Positivo
## Negativo 117 33
## Positivo 43 38
#Indicadores del modelo
library(caret)
## Loading required package: ggplot2
str(predichos_diab)
## chr [1:231] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" ...
predichos_diab=as.factor(predichos_diab)
str(test1$resultado)
## Factor w/ 2 levels "Negativo","Positivo": 2 1 1 1 1 1 2 1 2 1 ...
indicadores_diab=confusionMatrix(predichos_diab, test1$resultado)
indicadores_diab
## Confusion Matrix and Statistics
##
## Reference
## Prediction Negativo Positivo
## Negativo 117 43
## Positivo 33 38
##
## Accuracy : 0.671
## 95% CI : (0.6063, 0.7312)
## No Information Rate : 0.6494
## P-Value [Acc > NIR] : 0.2689
##
## Kappa : 0.2564
##
## Mcnemar's Test P-Value : 0.3019
##
## Sensitivity : 0.7800
## Specificity : 0.4691
## Pos Pred Value : 0.7312
## Neg Pred Value : 0.5352
## Prevalence : 0.6494
## Detection Rate : 0.5065
## Detection Prevalence : 0.6926
## Balanced Accuracy : 0.6246
##
## 'Positive' Class : Negativo
##
#Diseño de la CURVA ROC
predichos_prob=predict(modelo_diab, test1, type = "raw")
library(ROCR)
## Loading required package: gplots
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
pred1=prediction(predichos_prob, test1$resultado)
pred2=performance(pred1, "tpr", "fpr")
plot(pred2, colorize=T)
lines(x=c(0,1), y=c(0,1))

#Creamos el Train y test
library(caret)
set.seed(111)
particio=createDataPartition(y=diabetes_im$resultado, p=0.7, list = F, times = 1)
train=diabetes_im[particio,]
test=diabetes_im[-particio,]
dim(diabetes_im)
## [1] 768 9
dim(train)
## [1] 538 9
dim(test)
## [1] 230 9
#Modelo arbol
set.seed(111)
library(rpart)
modelo1=rpart(resultado~.,data = train, method = "class")
modelo1
## 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) indice.de.masa.corporal< 26.35 30 0 Negativo (1.00000000 0.00000000) *
## 11) indice.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) Funcion.pedigri.de.la.diabetes< 0.6355 48 8 Negativo (0.83333333 0.16666667) *
## 45) Funcion.pedigri.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) indice.de.masa.corporal>=33.75 16 3 Negativo (0.81250000 0.18750000) *
## 185) indice.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) indice.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) indice.de.masa.corporal>=28.8 10 2 Negativo (0.80000000 0.20000000) *
## 55) indice.de.masa.corporal< 28.8 26 7 Positivo (0.26923077 0.73076923) *
## 7) indice.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) Presion.arterial.diastolica>=72.3342 16 2 Negativo (0.87500000 0.12500000) *
## 57) Presion.arterial.diastolica< 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) *
library(partykit)
## Loading required package: libcoin
## Loading required package: mvtnorm
plot(as.party(modelo1))

#Predecimos
predichos=predict(modelo1, test, 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
#Creamos la matriz de confusion
table(predichos, test$resultado)
##
## predichos Negativo Positivo
## Negativo 105 29
## Positivo 45 51
#Indicadores
library(caret)
str(test$resultado)
## Factor w/ 2 levels "Negativo","Positivo": 1 1 2 2 1 1 1 2 1 2 ...
test$resultado=as.factor(test$resultado)
indicadores=confusionMatrix(predichos, test$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
##