1. Requerimiento

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. Este reto se debe resolver en RStudio y presentar los resultados a través de un documento (html o pdf) creado con RMarkdown. 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.

2. Carga de Librerias

library(knitr)
library(dplyr)
library(randomForest)
library(visreg)

#library(scatterplot3d)

3. Carga de datos

Iniciaremos importando los datos de nuestro dataset de entrenamiento (TABLON_ENTRENAMIENTO.csv) y validación (TABLON_VALIDACION.csv). Estos conjuntos de datos contienen las variables predictoras (VAR1, VAR2, VAR3, VAR4) y la variable objetivo que ya sabemos que es cuantitativa continua (TARGET)

training_board <-read.csv('TABLON_ENTRENAMIENTO.csv',sep = ";", header=T, na.strings='')
validation_board <-read.csv('TABLON_VALIDACION.csv',sep = ";", header=T, na.strings='')

4. Exploración de los datos

Utilizamos la función str() para explorar la estructura de los datos de entrenamiento, de esta manera comprenderemos la naturaleza de las variables y nos aseguramos de que estén en el formato adecuado para el análisis y modelado.

  str(training_board)
## 'data.frame':    3150 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 ...

Hacemos una visión rápida de las primeras observaciones con glimpse, y vemos desde otra perspectiva la información sobre las variables y sus tipos de datos

glimpse(training_board)
## Rows: 3,150
## Columns: 5
## $ TARGET <dbl> 0.127681, 0.137929, 0.166577, 0.276655, 0.375599, 0.537873, 0.6…
## $ VAR1   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, …
## $ VAR2   <dbl> 0.5, 0.5, 0.5, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ VAR4   <int> 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300…

Con Head vemos una muestra inicial de los datos, permitiendonos examinar las observaciones y asegurarnos de que la carga de datos haya sido exitosa

head(training_board) 
##     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

Damos un vistazo estadístico del conjunto de datos de entrenamiento, donde podemos apreciar algunas estadísticas descriptivas claves: como la media, mediana, mínimo, máximo y cuartiles, para cada variable.

summary(training_board)
##      TARGET            VAR1           VAR2             VAR3            VAR4    
##  Min.   :0.1277   Min.   : 1.0   Min.   : 0.500   Min.   :1.000   Min.   :300  
##  1st Qu.:2.2131   1st Qu.:13.0   1st Qu.: 0.750   1st Qu.:1.000   1st Qu.:300  
##  Median :3.5503   Median :25.5   Median : 2.500   Median :3.000   Median :400  
##  Mean   :3.0593   Mean   :25.5   Mean   : 3.893   Mean   :3.333   Mean   :400  
##  3rd Qu.:4.1773   3rd Qu.:38.0   3rd Qu.: 7.500   3rd Qu.:6.000   3rd Qu.:500  
##  Max.   :4.6191   Max.   :50.0   Max.   :10.000   Max.   :6.000   Max.   :500

Vemos los valores únicos por cada variable y así entendemos aún más la diversidad de categorías o rangos numéricos en las variables predictoras

print("Unique VAR1")
## [1] "Unique VAR1"
unique(training_board$VAR1)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
print("Unique VAR2")
## [1] "Unique VAR2"
unique(training_board$VAR2)
## [1]  0.50  0.75  1.00  2.50  5.00  7.50 10.00
print("Unique VAR3")
## [1] "Unique VAR3"
unique(training_board$VAR3)
## [1] 1 3 6
print("Unique VAR4")
## [1] "Unique VAR4"
unique(training_board$VAR4)
## [1] 300 400 500

Contamos missings en números: Verificamos si existen valores nulos en cada columna de los conjuntos de datos

colSums(is.na(training_board))
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0
colSums(is.na(validation_board))
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0

Como podemos ver no será necesario hacer un tratamiento de datos faltantes ya que estos no están presentes en nuestros conjuntos de datos

5. Entrenamiento del modelo

En este apartado, iniciaremos con el entrenado de los modelos para predecir la variable TARGET, según la naturaleza de la variable a predecir seleccionamos dos modelos diferentes de predicción continua: un modelo de Regresión Lineal y un modelo de Bosque Aleatorio.

Utilizamos las variables predictoras VAR1, VAR2, VAR3, y VAR4 para predecir la variable objetivo TARGET en el conjunto de datos de entrenamiento (training_board).

# Entrenar modelo de Regresión Lineal
modelo_reg_lineal <- lm(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)

# Entrenar modelo de Bosque Aleatorio
modelo_bosque <- randomForest(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)

6. Estadisticas para cada modelo

Hacemos un resumen detallado de los modelos de Regresión Lineal y Bosque Aleatorio que hemos entrenado previamente

summary(modelo_reg_lineal)
## 
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)
## 
## 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
summary(modelo_bosque)
##                 Length Class  Mode     
## call               3   -none- call     
## type               1   -none- character
## predicted       3150   -none- numeric  
## mse              500   -none- numeric  
## rsq              500   -none- numeric  
## oob.times       3150   -none- numeric  
## importance         4   -none- numeric  
## importanceSD       0   -none- NULL     
## localImportance    0   -none- NULL     
## proximity          0   -none- NULL     
## ntree              1   -none- numeric  
## mtry               1   -none- numeric  
## forest            11   -none- list     
## coefs              0   -none- NULL     
## y               3150   -none- numeric  
## test               0   -none- NULL     
## inbag              0   -none- NULL     
## terms              3   terms  call

6.1 Resumen modelos

Según lo que nos arroja la función summary(), podemos ver y resaltar lo siguiente:

  • La mayoría de los residuos se encuentran entre -1.31 y 1.00
  • El 1Q y 3Q indican que el 25% de los residuos son menores que -0.49 y el 75% son menores que 0.48, respectivamente.

Según lo especificado anteriormente podemos decir que la distribución de los residuos indica que el modelo tiene un buen ajuste, ya que los residuos no parecen tener patrones sistemáticos

  • Tambien vemos que el intercepto es significativamente diferente de cero 0.9167535, lo que sugiere que el modelo tiene una constante significativa.

  • Residual standard error (0.5476): Esto indica un buen ajuste, ya que un valor bajo sugiere que los puntos de datos tienden a estar cercanos a la línea de regresión

  • Multiple R-squared (0.8435): Aquí podemos ver la proporción de la variabilidad en la variable

  • TARGET y vemos claramente que el 84% de la variabilidad es explicada por las variables predictoras.

  • Adjusted R-squared (0.8433): Similar a lo anterior, pero este se ajusta según el número de variables predictoras que tenemos que en este caso son 4, con este 84% podemos decir que las variables predictoras han contribuido positivamente al modelo de regresión lineal entrenado

*F-statistic (4238) y p-value (< 2.2e-16): Esto nos indica que el modelo es altamente significativo, ya que el p-value es esencialmente cero

7. Gráficos

Dibujamos algunos gráficos relevantes para evaluar el desempeño y la validez de los modelos entrenados

plot(modelo_reg_lineal)

plot(modelo_bosque)

Utilizamos la función visreg() para visualizar las relaciones entre las variables predictoras (VAR1, VAR2, VAR3, VAR4) y la variable objetivo (TARGET) para ambos modelos entrenados: Regresión Lineal y Bosque Aleatorio.

visreg(modelo_reg_lineal)

visreg(modelo_bosque)

Nota: Estos gráficos nos proporcionan una perspectiva más clara de cómo las variables predictoras están relacionadas con la variable objetivo según los modelos entrenados.

# Realizar predicciones en el conjunto de validación
predicciones_bosque <- predict(modelo_bosque, newdata = validation_board)
predicciones_reg_lineal <- predict(modelo_reg_lineal, newdata = validation_board)

8. Evaluación de los Modelos

Realizamos el test de los modelos entrenados para realizar las predicciones en el conjunto de validación “TABLON_VALIDACION.csv”. Luego, Calculamos el \(R^2\) score y el RMSE para evaluar el rendimiento de los modelos.

Para tener una evaluación más completa y una comprensión más holística de la capacidad predictiva y rendimiento de los modelos entrenados, hacemos uso de distintas métricas según la naturaleza de los datos. Las métricas a utilzar son Mean Squared Error (MSE), Root Mean Squared Error (RMSE) y el \(R^2\) score, estas métricas nos ayudan con la cuantificación de la precisión y la capacidad explicativa de los modelos en relación con los valores reales de la variable objetivo.

El MSE y el RMSE mediran la diferencia entre las predicciones y los valores reales y el \(R^2\) score nos proporcionará una medida de la proporción de la variabilidad explicada por el modelo.

Nota: Al final según los resultados obtenidos seleccionaremos el modelo más efectivo para la predicción de la variable TARGET

# Calcular MSE por separado
mse_reg_lineal <- mean((validation_board$TARGET - predicciones_reg_lineal)^2)
mse_bosque <- mean((validation_board$TARGET - predicciones_bosque)^2)


# Calcular RMSE en el conjunto de validación
rmse_reg_lineal <- sqrt(mean((validation_board$TARGET - predicciones_reg_lineal)^2))
rmse_bosque <- sqrt(mean((validation_board$TARGET - predicciones_bosque)^2))



# Calcular R^2 en el conjunto de validación

r2_reg_lineal <- summary(modelo_reg_lineal)$r.squared

r2_bosque <- 1 - (sum((validation_board$TARGET - predicciones_bosque)^2) / sum((validation_board$TARGET - mean(validation_board$TARGET))^2))

8.1 Resumen

A continuación proporcionamos una visión resumida y comparativa de los resultados obtenidos por cada modelo en el conjunto de validación

# Crear un dataframe con los resultados
resultados_df <- data.frame(
  Modelo = c("Bosque Aleatorio", "Regresión Lineal"),
  RMSE = c(rmse_bosque, rmse_reg_lineal),
   MSE = c(mse_bosque, mse_reg_lineal),
  R2 = c(r2_bosque, r2_reg_lineal)
)

# Mostrar el dataframe de resultados
print(resultados_df)
##             Modelo      RMSE       MSE        R2
## 1 Bosque Aleatorio 0.4802986 0.2306867 0.8829898
## 2 Regresión Lineal 0.5601824 0.3138043 0.8435213

Nota: Estas métricas proporcionarán una evaluación cuantitativa de la capacidad predictiva del modelo en el conjunto de validación “TABLON_VALIDACION.csv”.

8.1.1 Comparaciones:

Basándonos en los resultados obtenidos en la tabla anterior, podemos hacer las siguientes comparaciones:

##             Modelo      RMSE
## 1 Bosque Aleatorio 0.4802986
## 2 Regresión Lineal 0.5601824

Un valor de RMSE más bajo indica un mejor rendimiento. En este caso, el Bosque Aleatorio tiene un RMSE más bajo, lo cual sugiere que tiene una mejor capacidad para hacer predicciones precisas en el conjunto de validación.

##             Modelo       MSE
## 1 Bosque Aleatorio 0.2306867
## 2 Regresión Lineal 0.3138043

Similar al RMSE, un MSE más bajo indica un mejor rendimiento. El Bosque Aleatorio tiene un MSE inferior, lo que respalda su mejor rendimiento en términos de precisión.

##             Modelo        R2
## 1 Bosque Aleatorio 0.8829898
## 2 Regresión Lineal 0.8435213

Un \(R^2\) más cercano a 1 indica un mejor ajuste del modelo a los datos. En este caso, el Bosque Aleatorio tiene un \(R^2\) más alto, lo que sugiere una mejor capacidad para explicar la variabilidad en la variable objetivo.

8.2 Métrica que mejor se adapta a nuestro caso de estudio

Tras realizar la comparación entre las métricas obtenidas, el Bosque Aleatorio se desempeña mejor en la tarea de predicción de la variable objetivo (TARGET) en comparación con la Regresión Lineal en el conjunto de validación.

9. Conclusión

En este análisis hemos comparado el rendimiento entre los modelos predictivos: Bosque Aleatorio y Regresión Lineal utilizando un conjunto de datos de entrenamiento y validación. Los resultados revelan claramente la superioridad del Bosque Aleatorio, evidenciada por métricas como RMSE, MSE y \(R^2\) mostrando una capacidad predictiva más robusta, con un menor error cuadrático medio, una raíz cuadrada del error cuadrático medio más baja y una mayor capacidad para explicar la variabilidad en la variable objetivo. Estos hallazgos nos indican que emplear el Bosque Aleatorio como el modelo preferido para este caso de estudio es la mejor opción.