install.packages("dplyr")
## package 'dplyr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PERFER\AppData\Local\Temp\RtmpeGlR4v\downloaded_packages

Cargar librería

library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(caret)
## Loading required package: lattice
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
## The following object is masked from 'package:dplyr':
## 
##     combine

#Carga de datos

datos_entrenamiento <- read.csv("C:/Users/PERFER/OneDrive - Watlow/Desktop/NE/TABLON_ENTRENAMIENTO.csv", sep = ";", header = TRUE)
datos_validacion <- read.csv("C:/Users/PERFER/OneDrive - Watlow/Desktop/NE/TABLON_VALIDACION.csv", sep = ";", header = TRUE)

Resumen estadístico

Para obtener un resumen que nos da una idea inicial sobre la distribución de cada variable.

summary(datos_entrenamiento)
##      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

TARGET: la variable objetivo caría entre 0.13 y 4.62 con una mediana de 3.55, lo que indica que la mayoría de los valores se concentran alrededor de este punto.

sapply(datos_entrenamiento, function(x) sum(is.na(x)))
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0

Podemos observar que el conjunto de datosno tiene datos faltantes.

hist(datos_entrenamiento$VAR1, main = "Histograma de VAR1", xlab = "VAR1")

hist(datos_entrenamiento$VAR2, main = "Histograma de VAR2", xlab = "VAR2")

hist(datos_entrenamiento$VAR3, main = "Histograma de VAR3", xlab = "VAR3")

hist(datos_entrenamiento$VAR4, main = "Histograma de VAR4", xlab = "VAR4")

boxplot(datos_entrenamiento$VAR1, main = "Boxplot de VAR1")

boxplot(datos_entrenamiento$VAR2, main = "Boxplot de VAR2")

boxplot(datos_entrenamiento$VAR3, main = "Boxplot de VAR3")

boxplot(datos_entrenamiento$VAR4, main = "Boxplot de VAR4")

Podemos ver la distribución, de cada variable

correlaciones <- cor(datos_entrenamiento %>% select(-TARGET))
print(correlaciones)
##      VAR1          VAR2          VAR3          VAR4
## VAR1    1  0.000000e+00  0.000000e+00  0.000000e+00
## VAR2    0  1.000000e+00  1.786398e-18 -2.002944e-21
## VAR3    0  1.786398e-18  1.000000e+00 -3.361203e-21
## VAR4    0 -2.002944e-21 -3.361203e-21  1.000000e+00

Estandarización de datos

datos_entrenamiento_est <- scale(datos_entrenamiento %>% select(-TARGET))
datos_entrenamiento_est <- as.data.frame(datos_entrenamiento_est)

Modelo de Regresión Lineal

modelo_lineal <- lm(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento)
summary(modelo_lineal)
## 
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento)
## 
## 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

Existe una realación estadística significativa con la variable TARGET. VAR1 y VAR2 tiene un efecto positivo meintras que VAR3 Y VAR4 muestran un efecto negativo

El 84.33% sugiere que el modelo se ajusta bien a los datos y es eficaz en la predicción de TARGET usando estas variables.

library(ggplot2)
ggplot(data = datos_entrenamiento, aes(x = predict(modelo_lineal), y = residuals(modelo_lineal))) +
  geom_point(color = "purple") +
  theme_bw() +
  labs(title = "Gráfico de Residuos (Regresión Lineal)", x = "Predicciones", y = "Residuos")

En el gráfico podemos ver que hay un patrón que sugiere que las predicciones del modelo no son perfectas.

library(randomForest)

Modelo Rnadom Forest

modelo_rf <- randomForest(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento)
print(modelo_rf)
## 
## Call:
##  randomForest(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 0.2522859
##                     % Var explained: 86.82

El modelo Random Fores, indica que es capaz de explicar el 86.72% de la variabilidad de TARGET con las variables predictoras VAR1, VAR2, VAR3, VAR4.

varImpPlot(modelo_rf, main = "Importancia de Variables en Random Forest")

VAR1 es la variable más influyente, este gráfico ayuda a ver como influye cada variable a mejorar la precisión del modelo.

prediccion_lineal <- predict(modelo_lineal, datos_entrenamiento)
prediccion_rf <- predict(modelo_rf, datos_entrenamiento)

#Cáculo de MAE y MSE para Regresión Lineal

MAE_lineal <- mean(abs(prediccion_lineal - datos_entrenamiento$TARGET))
MSE_lineal <- mean((prediccion_lineal - datos_entrenamiento$TARGET)^2)

#Cálculo de MAE y MSE para Random Forest

MAE_rf <- mean(abs(prediccion_rf - datos_entrenamiento$TARGET))
MSE_rf <- mean((prediccion_rf - datos_entrenamiento$TARGET)^2)

#Evaluación del Modelo con el conjunto de datos TABLON_VALIDACION.csv

predicciones_lineal_val <- predict(modelo_lineal, datos_validacion)
predicciones_rf_val <- predict(modelo_rf, datos_validacion)

Cálculo de MAE Y MSE para regresión lineal

MAE_lineal_val <- mean(abs(predicciones_lineal_val - datos_validacion$TARGET))
MSE_lineal_val <- mean((predicciones_lineal_val - datos_validacion$TARGET)^2)

Cálculo de MAE y MSE para Random Forest

MAE_rf_val <- mean(abs(predicciones_rf_val - datos_validacion$TARGET))
MSE_rf_val <- mean((predicciones_rf_val - datos_validacion$TARGET)^2)

#Comparación de Predicciones y Valores Reales En estos gráficos comparan visualmente las predicciones de los modelos con los valores reales de TARGET

datos_validacion$prediccion_lineal <- predicciones_lineal_val
datos_validacion$prediccion_rf <- predicciones_rf_val

Gráfico para la regresión lineal

ggplot(datos_validacion, aes(x = TARGET, y = prediccion_lineal))  +
  geom_point(color = "green") +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "blue") +
  labs(title = "Comparación de Predicciones vs. Valores Reales (Regresión Lineal)",
       x = "TARGET Real", y = "Predicción")

Los puntos verdes representan las predicciones para cada observacio´n en comparación con los valore sreales. La línea punteada representa la perfecta predicción , donde la spredicciones coinciden exactamente con los valores reales. Los valoresaltos y bajos sugieren ue el modelo podria subestimar o sobreestimar en esos rangos.

ggplot(datos_validacion, aes(x = TARGET, y = prediccion_rf))  +
  geom_point(color = "orange") +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "blue") +
  labs(title = "Comparación de Predicciones vs. Valores Reales (Random Forest)",
       x = "TARGET Real", y = "Predicción")

EN este gráfico veomos las predicicones hechas por el modelo random forest. los puntos se agrupan más cerca de la línea ideal en comparación con la regresión linealprevia, aún así hay un patrón que indica una tendencia a subestimar o sobreestimar en diferentes partes del rando de TARGET