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
Vamos a realizar el PIF con la informacion que se aloja en Ames.xlsx
Ames <- read_excel("Ames.xlsx")
skim(Ames)
| 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 | ▇▇▁▁▁ |
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(.))
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)
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.