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)
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.
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.
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")
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.
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.
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.