Librerias

Para la realizacion del PIF necesitamos de las siguientes librerias:

library(readxl)
library(skimr)
## Warning: package 'skimr' was built under R version 4.3.3
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(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.95 loaded
library(glmnet)
## Warning: package 'glmnet' was built under R version 4.3.3
## Loading required package: Matrix
## Loaded glmnet 4.1-8

Proyecto de investigacion (info. casas)

Vamos a realizar el PIF con la informacion que se aloja en Ames.xlsx

Ames <- read_excel("Ames.xlsx")
skim(Ames)
Data summary
Name Ames
Number of rows 2930
Number of columns 18
_______________________
Column type frequency:
character 7
numeric 11
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
PID 0 1 10 10 0 2930 0
MS Zoning 0 1 2 7 0 7 0
Lot Shape 0 1 3 3 0 4 0
Utilities 0 1 6 6 0 3 0
Lot Config 0 1 3 7 0 5 0
Land Slope 0 1 3 3 0 3 0
Kitchen Qual 0 1 2 2 0 5 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Order 0 1.00 1465.50 845.96 1 733.25 1465.5 2197.75 2930 ▇▇▇▇▇
Lot Frontage 490 0.83 69.22 23.37 21 58.00 68.0 80.00 313 ▇▃▁▁▁
Lot Area 0 1.00 10147.92 7880.02 1300 7440.25 9436.5 11555.25 215245 ▇▁▁▁▁
Overall Cond 0 1.00 5.56 1.11 1 5.00 5.0 6.00 9 ▁▁▇▅▁
Year Built 0 1.00 1971.36 30.25 1872 1954.00 1973.0 2001.00 2010 ▁▂▃▆▇
Year Remod/Add 0 1.00 1984.27 20.86 1950 1965.00 1993.0 2004.00 2010 ▅▂▂▃▇
Garage Cars 1 1.00 1.77 0.76 0 1.00 2.0 2.00 5 ▅▇▂▁▁
Pool Area 0 1.00 2.24 35.60 0 0.00 0.0 0.00 800 ▇▁▁▁▁
Mo Sold 0 1.00 6.22 2.71 1 4.00 6.0 8.00 12 ▅▆▇▃▃
Yr Sold 0 1.00 2007.79 1.32 2006 2007.00 2008.0 2009.00 2010 ▇▇▇▇▃
SalePrice 0 1.00 180796.06 79886.69 12789 129500.00 160000.0 213500.00 755000 ▇▇▁▁▁

Paso 1 - Preparación de los datos

Antes de ajustar un modelo, asegurémonos de que las variables estén bien definidas. Verificando los valores nulos y transformando las variables categóricas en factores.

# Convertir variables categóricas en factores
Ames <- Ames %>%
  mutate(across(c(`MS Zoning`, `Lot Shape`, `Utilities`, `Lot Config`, 
                  `Land Slope`, `Kitchen Qual`), as.factor))

# Verificar y manejar valores nulos
colSums(is.na(Ames))  
##          Order            PID      MS Zoning   Lot Frontage       Lot Area 
##              0              0              0            490              0 
##      Lot Shape      Utilities     Lot Config     Land Slope   Overall Cond 
##              0              0              0              0              0 
##     Year Built Year Remod/Add   Kitchen Qual    Garage Cars      Pool Area 
##              0              0              0              1              0 
##        Mo Sold        Yr Sold      SalePrice 
##              0              0              0
Ames <- Ames %>%
  filter(complete.cases(.)) 

Paso 2 - Exploración de relaciones iniciales

Gráfico donde cada celda muestra la relación entre un par de variables. Las correlaciones más altas (positivas o negativas) se destacan con colores más intensos. Esto ayudará a identificar cuáles variables numéricas tienen mayor relación con SalePrice.

# Seleccionar solo las variables numéricas del dataset
numeric_vars <- Ames %>%
  select(where(is.numeric))

# Calcular la matriz de correlación
cor_matrix <- cor(numeric_vars, use = "complete.obs")

# Graficar la matriz de correlación con mejoras de espaciado y legibilidad
corrplot(cor_matrix, 
         method = "color", 
         type = "upper", 
         addCoef.col = "black",      # Mostrar coeficientes
         tl.col = "black",           # Color de las etiquetas
         tl.srt = 45,                # Rotación de las etiquetas
         tl.cex = 0.8,               # Tamaño de las etiquetas
         number.cex = 0.7,           # Tamaño de los coeficientes
         col = colorRampPalette(c("blue", "white", "red"))(200), # Gradiente de color
         mar = c(1, 1, 2, 1),        # Márgenes para separar el gráfico
         cl.cex = 0.8,               # Tamaño de la barra de color
         title = "Gráfico de Correlación",
         diag = FALSE)               # Ocultar la diagonal (opcional)

Paso 3 - Implementacion modelo

El modelo de regresión lineal múltiple es una herramienta comúnmente utilizada para analizar la relación entre una variable dependiente en este caso (SalePrice) y varias variables independientes en este caso (Garage Cars, Year Remod/Add y Year Built) pero vemos que las variables independientes están altamente correlacionadas entre sí, el modelo puede sufrir de multicolinealidad, lo que hace que los coeficientes sean inestables asi que un modelo como regresión de Ridge podría ser más adecuado.

Si las variables predictoras en tu modelo están fuertemente correlacionadas, la regresión de Ridge es una alternativa robusta que puede ayudarte a obtener un modelo más generalizable y con menor riesgo de sobreajuste. Además, Ridge es fácil de interpretar y ajusta de manera eficiente los coeficientes de las variables correlacionadas.

# Preparar los datos, asegurándose de que no hay valores faltantes
Ames_ridge <- Ames %>%
  select(SalePrice, `Garage Cars`, `Year Remod/Add`, `Year Built`) %>%
  filter(complete.cases(.))

# Separar variables independientes y dependientes
X <- as.matrix(Ames_ridge[, c("Garage Cars", "Year Remod/Add", "Year Built")])
y <- Ames_ridge$SalePrice

# Ajustar el modelo de regresión de Ridge (alpha = 0 significa solo Ridge)
modelo_ridge <- cv.glmnet(X, y, alpha = 0)

# Ver el mejor valor de lambda (penalización) elegido por la validación cruzada
modelo_ridge$lambda.min
## [1] 5484.166
# Ver los coeficientes obtenidos por el modelo de Ridge
coef(modelo_ridge, s = "lambda.min")
## 4 x 1 sparse Matrix of class "dgCMatrix"
##                           s1
## (Intercept)    -2598173.1079
## Garage Cars       45937.7136
## Year Remod/Add      872.4230
## Year Built          490.5766
# Realizar predicciones
predicciones <- predict(modelo_ridge, X, s = "lambda.min")

# Evaluar el modelo (por ejemplo, calcular el error cuadrático medio)
rmse <- sqrt(mean((predicciones - y)^2))
rmse
## [1] 57450.58

R/ = Del modelo pordemos concluir que:

  • Los coeficientes indican cómo las variables afectan al precio de venta, ajustado por la penalización de Ridge.

  • Garage Cars: 45,937.7136. Por cada unidad adicional de Garage Cars (número de coches en el garaje), el precio de venta (SalePrice) aumentará en promedio 45,937.71.

  • Year Remod/Add: 872.4230. Por cada año adicional en la fecha de renovación o ampliación de la vivienda, el precio de venta aumentará en promedio 872.42.

  • Year Built: 490.5766. Por cada año adicional en la antigüedad de la vivienda (año de construcción), el precio de venta aumentará en promedio 490.58.