#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.