1.Problema a solucionar

A través de un conjunto de datos (TABLON_ENTRENAMIENTO.csv) se debe entrenar un modelo que realice la predicción de la variable TARGET teniendo en cuenta los inputs dados por las variables (VAR1, VAR2, VAR3, VAR4).

Se debe realizar el test del modelo utilizando los datos del fichero TABLON_VALIDACION.csv. Para ello, elija la métrica que mejor se adapte a la naturaleza de los datos. Pista: la variable TARGET es cuantitativa continua.

Debe indagar sobre diferentes naturalezas de modelos predictivos y mostrar cuál de ellos es el que mejor resultado arroja para el caso bajo estudio tras realizar la comparación entre las métricas obtenidas.

Ejercicio

2. Carga de los datos

2.1 Se usaron los siguientes paquetes para el análisis:

library(ggplot2)
library(dplyr)
library(GGally)
library(rpart)
library(rpart.plot)
library(randomForest)
library(caret)
library(mltools)
library(e1071)
library(rsample)
library(yardstick)
library(Metrics)
library(reshape2)
library(corrplot)

2.2 Cargar los datos

setwd("C:/Users/bianc/OneDrive/Escritorio/Maestria/Modulo 3/Foro")
tablontrain <- read.csv("TABLON_ENTRENAMIENTO.csv", sep=";", header=TRUE, stringsAsFactors = FALSE)
tablontest <- read.csv("TABLON_VALIDACION.csv", sep=";", header=TRUE, stringsAsFactors = FALSE)

2.3 Nuevo conjunto de datos

Creo un nuevo conjunto datos con ambos sets, o sea, tanto el de Entrenamiento y Validación.

tablon <- bind_rows(tablontrain,tablontest)
str(tablon)
## 'data.frame':    5400 obs. of  5 variables:
##  $ TARGET: num  0.128 0.138 0.167 0.277 0.376 ...
##  $ VAR1  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ VAR2  : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ VAR3  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ VAR4  : int  300 300 300 300 300 300 300 300 300 300 ...
head(tablon)
##     TARGET VAR1 VAR2 VAR3 VAR4
## 1 0.127681    1  0.5    1  300
## 2 0.137929    2  0.5    1  300
## 3 0.166577    3  0.5    1  300
## 4 0.276655    4  0.5    1  300
## 5 0.375599    5  0.5    1  300
## 6 0.537873    6  0.5    1  300

2.5 Revisar si la data tiene valores faltantes

La base de dato conjunta no tiene valores faltantes.

colSums(is.na(tablon))
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0
colSums(tablon=="")
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0

3. Análisis de la data

3.1 Histograma

La variable TARGET tiene una distribución asimétrica hacia la izquierda. Mientras que la variable VAR1 muestra una distribución uniforme. No se realizaron histograma de las variables VAR2, VAR3 y VAR4 porque son variables categóricas.

ggplot(tablon, aes(x=TARGET)) + 
 geom_histogram(aes(y=..density..), colour="black", fill="white")+
 geom_density(alpha=.2, fill="#FF6666") 
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(tablon, aes(x=VAR1)) + 
 geom_histogram(aes(y=..density..), colour="black", fill="white")+
 geom_density(alpha=.2, fill="#FF6666") 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

3.2 Boxplot de las variables

Las variables VAR1 y VAR2 tienen una relación positiva con la variable TARGET, siendo la VAR1 la que muestra una relación más fuerte, aunque ésta aparenta no ser lineal. VAR3 y VAR4 tienen una relación negativa respecto a la variable TARGET y a su vez débil.

ggplot(tablon, aes(as.factor(VAR1), TARGET)) +
  geom_boxplot() + xlab("VAR1")

ggplot(tablon, aes(as.factor(VAR2), TARGET)) +
  geom_boxplot() + xlab("VAR2")

ggplot(tablon, aes(as.factor(VAR3), TARGET)) + 
  geom_boxplot() + xlab("VAR3")

ggplot(tablon, aes(as.factor(VAR4), TARGET)) +
  geom_boxplot() + xlab("VAR4")

3.3 Scatterplot

Scatterplot nos confirma que la relación entre la variable TARGET, y VAR1 no es lineal. Esto es importante para tenerlo en consideración para el ajuste en el modelo.

ggplot(tablon,aes(VAR1,TARGET)) +
  geom_point()+
  geom_smooth()  
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

3.4 Matriz de Correlación

La variable VAR1 es la que tiene mayor correlación con la variable TARGET. Las demás correlaciones son muy débiles.

newtablon <- cor(tablon[ , c('TARGET','VAR1', 'VAR2', 'VAR3', 'VAR4')], use='complete')
corrplot(newtablon, method = "number")

4.Modelos

4.1 Modelo Linear (LM)

En el modelo todas las variables son significativas. El valor del R-ajustado es de 84.3%, lo que significa que el modelo tiene un buen fit. Sin embargo, viendo las gráficas mostradas anteriormente, debemos explorar diferentes vertientes del modelo (LM) para averiguar cuál es el mejor modelo predictivo. Debemos, considerar que las variables VAR2, VAR3 y VAR4 son categórica, por lo cual, sería bueno especificar esto en el modelo.

set.seed(1234)
model.lm <- lm(TARGET~.,data = tablontrain)

summary(model.lm)
## 
## Call:
## lm(formula = TARGET ~ ., data = tablontrain)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.31196 -0.49367  0.09087  0.47884  1.00021 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.9167535  0.0552213  16.601  < 2e-16 ***
## VAR1         0.0868552  0.0006762 128.455  < 2e-16 ***
## VAR2         0.0574772  0.0028297  20.312  < 2e-16 ***
## VAR3        -0.0196577  0.0047486  -4.140 3.57e-05 ***
## VAR4        -0.0005762  0.0001195  -4.822 1.49e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5476 on 3145 degrees of freedom
## Multiple R-squared:  0.8435, Adjusted R-squared:  0.8433 
## F-statistic:  4238 on 4 and 3145 DF,  p-value: < 2.2e-16

Al agregar un componente cuadrático de la variable VAR1, se observar una mejora en el fit del modelo, lo cual, va en línea con lo observado en el análisis descriptivo. El nuevo modelo nos muestra que todas las variables son significativas al 1%, y el R-ajustado es de 97.5%.

set.seed(1234)
tablontrain2 <- tablontrain %>% 
  mutate(VAR12 = VAR1 * VAR1)
model.lm2 <- lm(TARGET~ VAR1 + VAR12 + VAR2+ as.factor(VAR3) + as.factor(VAR4),data = tablontrain2)

summary(model.lm2)
## 
## Call:
## lm(formula = TARGET ~ VAR1 + VAR12 + VAR2 + as.factor(VAR3) + 
##     as.factor(VAR4), data = tablontrain2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.75959 -0.13641  0.01283  0.15190  0.64115 
## 
## Coefficients:
##                      Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)        -4.645e-01  1.510e-02  -30.758  < 2e-16 ***
## VAR1                2.243e-01  1.101e-03  203.819  < 2e-16 ***
## VAR12              -2.695e-03  2.092e-05 -128.835  < 2e-16 ***
## VAR2                5.748e-02  1.129e-03   50.891  < 2e-16 ***
## as.factor(VAR3)3   -4.928e-02  9.540e-03   -5.166 2.54e-07 ***
## as.factor(VAR3)6   -9.953e-02  9.540e-03  -10.434  < 2e-16 ***
## as.factor(VAR4)400 -5.435e-02  9.540e-03   -5.697 1.33e-08 ***
## as.factor(VAR4)500 -1.152e-01  9.540e-03  -12.080  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2186 on 3142 degrees of freedom
## Multiple R-squared:  0.9751, Adjusted R-squared:  0.975 
## F-statistic: 1.757e+04 on 7 and 3142 DF,  p-value: < 2.2e-16

Se estima el modelo (LM) utilizando remuestreo de tipo de validación cruzada. Esto se hizo con el objetivo de facilitar la comparación con los modelos de KKN y SVM.

set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
modelo.lm <- train(TARGET~ VAR1 + VAR12 + VAR2+ as.factor(VAR3) + as.factor(VAR4), data=tablontrain2, method="lm", metric="RMSE", trControl=trainControl)
modelo.lm
## Linear Regression 
## 
## 3150 samples
##    5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE     
##   0.2187508  0.9751295  0.173542
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE

A continuación, se ejecutan el modelo KNN y SVM para poder comparar con el modelo lineal y poder confirmar si el modelo lineal es el mejor modelo para predecir la variable TARGET.

4.2 Modelo KNN

set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
modelo.knn <- train(TARGET~., data=tablontrain2, method="knn", metric="RMSE", trControl=trainControl)
modelo.knn
## k-Nearest Neighbors 
## 
## 3150 samples
##    5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ... 
## Resampling results across tuning parameters:
## 
##   k  RMSE       Rsquared   MAE      
##   5  0.1529770  0.9877749  0.1043376
##   7  0.1768550  0.9836560  0.1242384
##   9  0.1769441  0.9836547  0.1290492
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 5.

4.3 Modelo SVM

set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
model.svm <- train(TARGET~., data=tablontrain2, method="svmLinear", metric="RMSE", trControl=trainControl)
model.svm
## Support Vector Machines with Linear Kernel 
## 
## 3150 samples
##    5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE      
##   0.2188841  0.9751298  0.1730969
## 
## Tuning parameter 'C' was held constant at a value of 1

5. Evaluación de los Modelos

5.1 Creando nuevas columnas con las predicciones de los modelos

tablontest <- tablontest %>% 
  mutate(VAR12 = VAR1 * VAR1)
results <- tablontest %>%
  mutate(`model_lm` = predict(modelo.lm, tablontest),
         `model_knn` = predict(modelo.knn, tablontest),
         `model_svm` = predict(model.svm, tablontest))

5.2 Evaluación del performance de los tres modelos

Luego de evaluar el performance de los tres modelos en el conjunto de datos test podemos concluir que, el mejor modelo para predecir la variable TARGET es el KNN. Si observamos en la tabla más abajo podemos ver que tanto las métricas de RMSE y MAE son las más pequeña, y su RSQ es el más cercano a 1.

lm0 <- metrics(results, truth = TARGET, estimate = `model_lm`)
knn0 <- metrics(results, truth = TARGET, estimate = `model_knn`)
svm0 <- metrics(results, truth = TARGET, estimate = `model_svm`)

lm0 <- lm0 %>%
  select(.metric, .estimate) %>%
  rename(LM = .estimate)
knn0 <- knn0 %>%
  select(.metric, .estimate) %>%
  rename(KNN = .estimate)
svm0 <- svm0 %>%
  select(.metric, .estimate) %>%
  rename(SMV = .estimate)


result  <- left_join(lm0,knn0, svm0, by = ".metric")
result2 <- left_join(result, svm0, by = ".metric") 
result2
## # A tibble: 3 × 4
##   .metric    LM    KNN   SMV
##   <chr>   <dbl>  <dbl> <dbl>
## 1 rmse    0.204 0.107  0.201
## 2 rsq     0.982 0.996  0.983
## 3 mae     0.169 0.0780 0.165