Suponga que Ud. trabaja como analista en conjunto con médicos del área cardiovascular. Estos médicos le entregan una base de datos cuyas observaciones corresponde a personas que han tenido o no un ataque al corazón.
Para comenzar con su análisis:
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!
#Cargar paquetes necesarios
#data.table
library(data.table)
#regresion
#install.packages("moderndive")
library(moderndive)
library(knitr)
library(ggplot2) #graficos
#Cross- Validation
#install.packages("caret")
#install.packages("jtools")
library(caret)
library(jtools)
#CART (Cluster)
#install.packages("factoextra")
#install.packages("dbscan")
library(factoextra)
library(dbscan)
#Arbol de decision
#install.packages("rpart")
#install.packages("rpart.plot")
library(rpart.plot)
library(rpart)
#Cargar base de datos
corazon <- fread('heart.csv')
class(corazon)
## [1] "data.table" "data.frame"
str(corazon)
## 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>
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.
#multiple 1: Como el colesteron y la edad influyen en la presión arterial en reposo del individuo
reg_multiple1<- lm(trtbps~chol + age, data = corazon)
summ(reg_multiple1)
## MODEL INFO:
## Observations: 303
## Dependent Variable: trtbps
## Type: OLS linear regression
##
## MODEL FIT:
## F(2,300) = 13.44, p = 0.00
## R² = 0.08
## Adj. R² = 0.08
##
## Standard errors: OLS
## ------------------------------------------------
## Est. S.E. t val. p
## ----------------- ------- ------ -------- ------
## (Intercept) 98.25 6.82 14.40 0.00
## chol 0.02 0.02 1.17 0.24
## age 0.51 0.11 4.68 0.00
## ------------------------------------------------
pred1<-predict(reg_multiple1)
corazon[,pred1:=predict(reg_multiple1)]
#multiple 2: Como el colesteron, la edad, peack anterior y nivel de azucar en la sangre influyen en la presión arterial en reposo del individuo
reg_multiple2<- lm(trtbps~chol + age + oldpeak + fbs, data = corazon)
summ(reg_multiple2)
## MODEL INFO:
## Observations: 303
## Dependent Variable: trtbps
## Type: OLS linear regression
##
## MODEL FIT:
## F(4,298) = 10.45, p = 0.00
## R² = 0.12
## Adj. R² = 0.11
##
## Standard errors: OLS
## ------------------------------------------------
## Est. S.E. t val. p
## ----------------- ------- ------ -------- ------
## (Intercept) 99.93 6.71 14.90 0.00
## chol 0.02 0.02 1.21 0.23
## age 0.42 0.11 3.79 0.00
## oldpeak 2.16 0.84 2.58 0.01
## fbs 7.36 2.69 2.74 0.01
## ------------------------------------------------
pred2<-predict(reg_multiple2)
corazon[,pred2:=predict(reg_multiple2)]
#error cuadrartico medio regresion 1
prediccion1<-data.table(RMSE=RMSE(pred1,corazon$trtbps),
MAE=MAE(pred1,corazon$trtbps))
prediccion1
## RMSE MAE
## 1: 16.77357 12.8915
#error cuadrartico medio regresion 2
prediccion2<-data.table(RMSE=RMSE(pred2,corazon$trtbps),
MAE=MAE(pred2,corazon$trtbps))
prediccion2
## RMSE MAE
## 1: 16.39663 12.84569
Dados los valores de R-cuadrado y R-cuadrado ajustado se puede evidenciar que el modelo de regresión múltiple 2 posee un R-cuadrado mayor, lo cual indica que las variables independientes de este efectivamente explican un mayor porcentaje de la variación de la variable dependiente, en este caso los ataques cardíacos. De igual forma, cuando se observa el error cuadrático medio (RMSE) y el MAE se puede evidenciar que el segundo modelo tiene valores inferiores. Dado lo anterior es que el modelo que predice de mejor manera dentro de la muestra es la regresión múltiple 2.
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 puntos) 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.
#Prediccion fuera de muestra
#semilla
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)
#prediccion multiple 1
predkfolds1<-train(trtbps~chol + age,data=corazon,method="lm",trControl= setupKCV)
#prediccion multiple 2
predkfolds2<-train(trtbps~chol + age + oldpeak + fbs,data=corazon,method="lm",trControl= setupKCV)
#resultados predicciones
print(predkfolds1) #multiple 1
## Linear Regression
##
## 303 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 242, 242, 242, 244, 242
## Resampling results:
##
## RMSE Rsquared MAE
## 16.85443 0.08385918 12.96532
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(predkfolds2)#multiple 2
## Linear Regression
##
## 303 samples
## 4 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 243, 241, 242, 243, 243
## Resampling results:
##
## RMSE Rsquared MAE
## 16.33495 0.1261277 12.90413
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Se mantienen las conclusiones anteriores.
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.
#Nuevo objeto con variables
corazon2<-corazon[,c("age", "trtbps")]
#grafico de codo
fviz_nbclust(x = corazon2, FUNcluster = kmeans, method = "wss", k.max = 15,
diss = get_dist(corazon2, method = "euclidean"), nstart = 50)
#CLuster
k1<-kmeans(x=corazon2,centers=5,nstart=50)
#grafico
fviz_cluster(object = k1, data = corazon2,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.
#Crear arbol
arbol_1 <- rpart(output~age +trtbps, data=corazon, method = "class")
#Graficar
rpart.plot(arbol_1, main = "Arbol de clasificacion: Ataques al corazón")
#Probando el modelo
set.seed(12345)
div <- createDataPartition(corazon $output, times=1,p = 0.8, list = FALSE)
train <- corazon[div, ]
test <- corazon[-div, ]
#Grafico arbol entrenamiento
arbol_2 <- rpart(output~age +trtbps, data = train, method = "class")
rpart.plot(arbol_2)
#Evaluar el modelo con los datos de testeo
pred_1 <- predict(arbol_2, newdata = test, type = "class")
#Matriz
matriz <- table(test$output, pred_1)
matriz
## pred_1
## 0 1
## 0 7 22
## 1 9 22
#Precision del modelo
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.4833333
#Crear base sin las variables de predicciones ingresadas a la base original en las preguntas anteriores
corazon3 <- corazon[,c("age","sex","cp","trtbps","chol","fbs","restecg","thalachh","exng","oldpeak","slp","caa","thall","output")]
#Crear arbol
arbol_3 <- rpart(output~., data=corazon3, method = "class")
#graficar
rpart.plot(arbol_3, main = "Arbol de clasificacion: Ataques al corazón 2")
#Probando el modelo
set.seed(12345)
div2 <- createDataPartition(corazon3 $output, times=1,p = 0.8, list = FALSE)
train2 <- corazon3[div2, ]
test2 <- corazon3[-div2, ]
#Grafico arbol entrenamiento
arbol_4 <- rpart(output~., data = train2, method = "class")
rpart.plot(arbol_4)
#Evaluar el modelo con los datos de testeo
pred_2 <- predict(arbol_4, newdata = test2, type = "class")
#Matriz de confusión
matriz2 <- table(test2$output, pred_2)
matriz2
## pred_2
## 0 1
## 0 20 9
## 1 5 26
#Precision del modelo
precision2 <- sum(diag(matriz2))/sum(matriz2)
precision2
## [1] 0.7666667
Al realizar dos modelos de árboles de decisión para la variable output y sus respectivas matrices de confusión, se pudo observar que el modelo 2 predice de mejor manera los ataques al corazón, dado que considera todas las variables de la muestra que demuestran ser significativas. En primer lugar, con la matriz de confusión del modelo 1, considerando 0 = negativo ataque al corazón y 1= positivo ataque al corazón, se puede observar que existen 9 falsos negativos y 22 falsos positivos, de manera que este modelo tiene apenas una precisión del 48,3%. Por otro lado, la matriz de confusión del modelo 2 es mucho más precisa con un 76,7%, ya que posee solo 5 falsos negativos y 9 falsos positivos. Es por ello que se puede concluir que el modelo 2 es mejor.
Dada la charla del profesor Esteban Lopéz, explique brevemente, ¿Por qué es importante Spatial Analytics?
Spatial Analytics es el uso de datos geográficos o espaciales a modo de identificar los patrones en el comportamiento del ser humano, para luego explicar y predecir dichos comportamientos. Aquello se ha convertido en un estudio importante, ya que con la aparición de nuevas tecnologías y la evolución hacia un mundo interconectado, las empresas y organizaciones requieren de un mecanismo para entender “dónde las cosas pasan, por qué las cosas pasan y cómo las cosas pasan”. Spatial Analytics es importante, porque se puede aplicar en todos los sectores, desde empresas privadas hasta políticas públicas.
Mencioné tres ejemplos del machine learning, intesligencia artificial, que señaló el profesor Alexis Montecinos.
Machine learning permite reconocer patrones que no son fáciles de detectar, de manera óptima, sin la inteligencia artificial, pues esta contribuye a un manejo del negocio de una manera más eficiente y productiva. Además, es una herramienta que puede ser utilizada de manera transversal, no se cierra a un solo rubro. Esto se pudo observar con tres ejemplos proporcionados por el profesor Alexis Montecinos:
Hospital ABC: la cantidad de pacientes que no asistían a sus citas médicas generaban pérdidas anuales y con la ayuda de inteligencia artificial y el reconocimiento de patrones, esta logró predecir con exactitud un 98% el comportamiento de los pacientes lo cual trajo como consecuencia una disminución en un 50% las pérdidas por “No Shows”.
Reinforcement learning: a través de la inteligencia artificial y el reconocimiento de patrones se pueden desarrollar desde modelos de negocios hasta juegos, un ejemplo de este último es aquel juego que tiene como objetivo romper los bloques, en términos concretos, la máquina luego de varias repeticiones descubrió que era óptimo romper los bloques de las esquinas primero para poder ganar el juego.
Tarjetas de crédito: el último ejemplo es la predicción del uso de las tarjetas de crédito de acuerdo a la edad y género de la persona, pues si uno posee una base de datos que obtenga los datos mencionados anteriormente y a través de la inteligencia artificial, se puede predecir quienes utilizarían una tarjeta de crédito.