Parte 1: Predicción ataques cárdiacos

P1

Cargue todos los paquetes que necesita para trabajar con data.table, modelos de predicción de regresión, árboles de decisión, cluster y Cross-Validation. Además, cargue la base de datos. (1 punto) Importante: Verifique la clase (class) de las variables que vaya a utilizar en todos sus modelos y si es necesario transformarla a numérica o factor, hágalo!

rm(list=ls())

library(data.table)
library(ggplot2)
library(moderndive)
library(knitr)
library(caret)
library(jtools)
library(factoextra)
library(dbscan)
library(rpart.plot)
library(rpart)
library(leaflet)
library(car)

hearts<- fread("C:/Users/jose/Desktop/Daniela/uai/Data Science/control 3/heart.csv")

class(hearts)
## [1] "data.table" "data.frame"
str(hearts)
## Classes 'data.table' and 'data.frame':   303 obs. of  14 variables:
##  $ age     : int  63 37 41 56 57 57 56 44 52 57 ...
##  $ sex     : int  1 1 0 1 0 1 0 1 1 1 ...
##  $ cp      : int  3 2 1 1 0 0 1 1 2 2 ...
##  $ trtbps  : int  145 130 130 120 120 140 140 120 172 150 ...
##  $ chol    : int  233 250 204 236 354 192 294 263 199 168 ...
##  $ fbs     : int  1 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : int  0 1 0 1 1 1 0 1 1 1 ...
##  $ thalachh: int  150 187 172 178 163 148 153 173 162 174 ...
##  $ exng    : int  0 0 0 0 1 0 0 0 0 0 ...
##  $ oldpeak : num  2.3 3.5 1.4 0.8 0.6 0.4 1.3 0 0.5 1.6 ...
##  $ slp     : int  0 0 2 2 2 1 1 2 2 2 ...
##  $ caa     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ thall   : int  1 2 2 2 2 1 2 3 3 2 ...
##  $ output  : int  1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, ".internal.selfref")=<externalptr>
summary(hearts)
##       age             sex               cp            trtbps     
##  Min.   :29.00   Min.   :0.0000   Min.   :0.000   Min.   : 94.0  
##  1st Qu.:47.50   1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:120.0  
##  Median :55.00   Median :1.0000   Median :1.000   Median :130.0  
##  Mean   :54.37   Mean   :0.6832   Mean   :0.967   Mean   :131.6  
##  3rd Qu.:61.00   3rd Qu.:1.0000   3rd Qu.:2.000   3rd Qu.:140.0  
##  Max.   :77.00   Max.   :1.0000   Max.   :3.000   Max.   :200.0  
##       chol            fbs            restecg          thalachh    
##  Min.   :126.0   Min.   :0.0000   Min.   :0.0000   Min.   : 71.0  
##  1st Qu.:211.0   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:133.5  
##  Median :240.0   Median :0.0000   Median :1.0000   Median :153.0  
##  Mean   :246.3   Mean   :0.1485   Mean   :0.5281   Mean   :149.6  
##  3rd Qu.:274.5   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:166.0  
##  Max.   :564.0   Max.   :1.0000   Max.   :2.0000   Max.   :202.0  
##       exng           oldpeak          slp             caa        
##  Min.   :0.0000   Min.   :0.00   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.00   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.80   Median :1.000   Median :0.0000  
##  Mean   :0.3267   Mean   :1.04   Mean   :1.399   Mean   :0.7294  
##  3rd Qu.:1.0000   3rd Qu.:1.60   3rd Qu.:2.000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :6.20   Max.   :2.000   Max.   :4.0000  
##      thall           output      
##  Min.   :0.000   Min.   :0.0000  
##  1st Qu.:2.000   1st Qu.:0.0000  
##  Median :2.000   Median :1.0000  
##  Mean   :2.314   Mean   :0.5446  
##  3rd Qu.:3.000   3rd Qu.:1.0000  
##  Max.   :3.000   Max.   :1.0000
hearts$age <- as.numeric(hearts$age)
hearts$sex <- as.factor(hearts$sex)
hearts$cp <- as.factor(hearts$cp)
hearts$trtbps <- as.numeric(hearts$trtbps)
hearts$chol <- as.numeric(hearts$chol)
hearts$fbs <- as.factor(hearts$fbs)
hearts$restecg <- as.factor(hearts$restecg)
hearts$thalachh <- as.numeric(hearts$thalachh)
hearts$exng <- as.factor(hearts$exng)
hearts$oldpeak <- as.numeric(hearts$oldpeak)
hearts$slp <- as.numeric(hearts$slp)
hearts$caa <- as.numeric(hearts$caa)
hearts$thall <- as.numeric(hearts$thall)
hearts$output <- as.factor(hearts$output)

P2

Realice dos modelos de regresión lineal multiple para predecir la Presión arterial en reposo ¿Cuál predice mejor dentro de muestra?. (8 puntos) Observación: No obtendrá puntaje si compara un modelo de regresión de una variable.

#Modelo 1
reg1<- lm(trtbps~age+sex+cp, data=hearts)
get_regression_table(reg1) %>% kable()
term estimate std_error statistic p_value lower_ci upper_ci
intercept 105.093 6.587 15.954 0.000 92.129 118.056
age 0.506 0.109 4.650 0.000 0.292 0.721
sex1 -1.752 2.111 -0.830 0.407 -5.907 2.403
cp1 -1.580 2.806 -0.563 0.574 -7.103 3.943
cp2 -0.767 2.313 -0.332 0.740 -5.320 3.785
cp3 8.932 3.775 2.366 0.019 1.502 16.361
hearts[,pred1:=predict(reg1)]
hearts[,resid1:=resid(reg1)]

summary(reg1)
## 
## Call:
## lm(formula = trtbps ~ age + sex + cp, data = hearts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -37.269 -10.908  -0.919   9.463  66.549 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 105.0927     6.5873  15.954  < 2e-16 ***
## age           0.5064     0.1089   4.650 5.01e-06 ***
## sex1         -1.7515     2.1113  -0.830   0.4074    
## cp1          -1.5800     2.8065  -0.563   0.5739    
## cp2          -0.7672     2.3132  -0.332   0.7404    
## cp3           8.9319     3.7752   2.366   0.0186 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.78 on 297 degrees of freedom
## Multiple R-squared:  0.09998,    Adjusted R-squared:  0.08483 
## F-statistic: 6.599 on 5 and 297 DF,  p-value: 7.661e-06
pred1<- predict(reg1)
predicciones1<-data.table(RMSE=RMSE(pred1,hearts$trtbps,na.rm = T),
                         MAE=MAE(pred1,hearts$trtbps,na.rm = T))
predicciones1
##        RMSE      MAE
## 1: 16.61084 12.83325
#Modelo 2
reg2<- lm(trtbps~age+chol+restecg, data=hearts)
get_regression_table(reg2) %>% kable()
term estimate std_error statistic p_value lower_ci upper_ci
intercept 102.530 7.240 14.162 0.000 88.282 116.777
age 0.485 0.110 4.395 0.000 0.268 0.702
chol 0.018 0.019 0.915 0.361 -0.020 0.056
restecg1 -3.302 1.990 -1.659 0.098 -7.218 0.615
restecg2 3.781 8.546 0.442 0.658 -13.037 20.599
hearts[,pred2:=predict(reg2)]
hearts[,resid2:=resid(reg2)]

summary(reg2)
## 
## Call:
## lm(formula = trtbps ~ age + chol + restecg, data = hearts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.285 -11.055  -0.960   9.687  65.240 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 102.52962    7.23974  14.162  < 2e-16 ***
## age           0.48460    0.11027   4.395 1.54e-05 ***
## chol          0.01768    0.01933   0.915   0.3610    
## restecg1     -3.30178    1.99020  -1.659   0.0982 .  
## restecg2      3.78129    8.54584   0.442   0.6585    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.83 on 298 degrees of freedom
## Multiple R-squared:  0.09181,    Adjusted R-squared:  0.07962 
## F-statistic: 7.531 on 4 and 298 DF,  p-value: 8.617e-06
pred2<- predict(reg2)
predicciones2<-data.table(RMSE=RMSE(pred2,hearts$trtbps,na.rm = T),
                         MAE=MAE(pred2,hearts$trtbps,na.rm = T))
predicciones2
##        RMSE      MAE
## 1: 16.68611 12.87803

Respuesta: En relación a los modelos propuestos es posible apreciar un R-cuadrado mayor en el modelo 1, que corresponde a un 0.09998 en comparación al modelo 2 que tiene 0.09181 -mientras más cercano a 1 es mejor-. Por otro lado, comparando el RMSE y MAE de ambos modelos también se observa que en el modelo 1 son menores que en el modelo 2 por lo tanto el 1 presenta un menor error que el 2, lo que significa que el modelo 1 logra una mejor estimación de la Presión arterial en reposo.

P3

Realice validación cruzada (CV) a los modelos de la pregunta anterior por el método K-folds con 5 folds. ¿Se mantienen las conclusiones anteriores?. (8 putos) Pista1: Recuerde setear la semilla set.seed(12345).

Pista2: Si existen variables con NA recuerde que puede excluirlas esas observaciones del análisis, pero no las elimine.

set.seed(12345)

setupKCV <- trainControl(method = "cv" , number = 5)

predkfolds1<-train(trtbps~age+sex+cp,data=hearts,method="lm",trControl= setupKCV)

predkfolds2<-train(trtbps~age+chol+restecg,data=hearts,method="lm",trControl= setupKCV)

print(predkfolds1)
## Linear Regression 
## 
## 303 samples
##   3 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 242, 242, 242, 244, 242 
## Resampling results:
## 
##   RMSE      Rsquared    MAE     
##   17.01383  0.07948348  13.17806
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(predkfolds2)
## Linear Regression 
## 
## 303 samples
##   3 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 243, 241, 242, 243, 243 
## Resampling results:
## 
##   RMSE      Rsquared    MAE    
##   16.72611  0.08528162  12.9677
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE

Respuesta: En relación a los nuevos resultados obtenidos no se mantienen las conclusiones anteriores, cambia el modelo que tiene mejor predicción. En este análsis el r-cuadrado del modelo 1 es menor que el modelo 2 -siendo el segundo más acertivo-, mientras que los parámatros de error son menores para el segundo modelo lo que permite una predicción con un menor grado de error.

P4

Proponga dos variables sobre las cuales segmentar la muestra, en orden de hacer análisis de clusters con el método de kmeans. Muestre sus resultados gráficamente. (5 puntos) Pista1: Si existen outliers recuerde eliminarlos, para esto cree un nuevo objeto donde se encuentren estas dos variables.

datacluster<-hearts[,.(age,trtbps)]

ggplot(data = datacluster,aes(x=age,y=trtbps))+
  geom_point()

fviz_nbclust(x = datacluster, FUNcluster = kmeans, method = "wss", k.max = 15, 
             diss = get_dist(datacluster, method = "euclidean"), nstart = 50)

k1<-kmeans(x=datacluster,centers=5,nstart=25)

fviz_cluster(k1,data=datacluster,geom = "point")

P5

Realice dos modelos de árboles de clasificación de la variable output. Pruebe cuál modelo clasifica mejor con validación cruzada. Entrene el modelo con un 80% de la muestra y testee con el 20% restante. Explicite qué modelo es mejor y porqué. (12 puntos) Importante: Recuerde setear la semilla set.seed(12345).

Observación: No obtendrá puntaje si compara un modelo de clasificación de una variable.

set.seed(12345)

#Modelo 1
arbol1 <- rpart(output~sex+age, data=hearts, method = "class")
rpart.plot(arbol1, main = "Árbol de Clasificación Ataques al Corazón")

set.seed(12345)

#Modelo 2
arbol2 <- rpart(output~age+chol, data=hearts, method = "class")
rpart.plot(arbol2, main = "Árbol de Clasificación Ataques al Corazón")

set.seed(12345)

div1 <- createDataPartition(hearts$output, times = 1, p = 0.8, list = F) 

train1 <- hearts[div1,] 
test1 <- hearts[-div1,]

arbol_train1 <- rpart(output~sex+age, data=train1, method = "class")
rpart.plot(arbol_train1, main = "Árbol de Clasificación Ataques al Corazón")

prediccion_arbol1 <- predict(arbol_train1, newdata = test1, type = "class")

matriz1 <- table(test1$output, prediccion_arbol1)
matriz1
##    prediccion_arbol1
##      0  1
##   0 19  8
##   1 12 21
precision_arbol1 <- sum(diag(matriz1))/sum(matriz1)
precision_arbol1
## [1] 0.6666667
set.seed(12345)

div2 <- createDataPartition(hearts$output, times = 1, p = 0.8, list = F) 

train2 <- hearts[div2,] 
test2 <- hearts[-div2,]

arbol_train2 <- rpart(output~age+chol, data=train2, method = "class")
rpart.plot(arbol_train2, main = "Árbol de Clasificación Ataques al Corazón")

prediccion_arbol2 <- predict(arbol_train2, newdata = test2, type = "class")

matriz2 <- table(test2$output, prediccion_arbol2)
matriz2
##    prediccion_arbol2
##      0  1
##   0 17 10
##   1  9 24
precision_arbol2 <- sum(diag(matriz2))/sum(matriz2)
precision_arbol2
## [1] 0.6833333

Respuesta: Al entrenar ambos modelos propuestos al 80% de muestra y 20% testeo podemos probar que el modelo que clasifica mejor con validación cruzada es el modelo 2 con una precisión del 68,3% en comparación al modelo 1 que posee un 66,7% de precisión.

Parte 2: Charla

P6

Dada la charla del profesor Esteban Lopéz, explique brevemente, ¿Por qué es importante Spatial Analytics?

Permite descubrir patrones que no se podrían percibir de otra manera, ya que la información clave está en una dimensión espacial geográfica. Al tratarse de un análisis interdisciplinario, es la combinación entre teoría, métodos y manipulación de datos lo que permite aplicarse a varios campos como la ciencia, tecnología y negocios.

P7

Mencione tres ejemplos del machine learning, intesligencia artificial, que señaló el profesor Alexis Montecinos.

Ejemplos vistos en la charla son: 1. Reconocimiento de imágenes de medicina para analizar la neumonía. 2. Reconocimiento de voz en una grabación donde hay más de una voz o ruido. (Cocktail party problem). 3. Análisis y predicción de retornos en finanzas. 4. Clasificación de clientes y pricing óptimo.