Ejercicio de creacion de un modelo de regresion lineal multiple


Pregunta 1

Realice un filtro a la base de datos e incluya sólo las ofertas de apartamentos. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.

# Cargar librerias
library(tidyverse)
library(mice)
library(dplyr)
library(ggplot2)
library(plotly)
library(GGally)
library(lmtest)
library(nortest)
library(car)
library(caret)
# descarga de la base de datos
#Acceso a la base de datos llamada "vivienda" en el paquete MODELOS
#install.packages("devtools")
#devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)

Aplicación del Filtro y Validación:

Se aplicó un filtro a la base de datos original para seleccionar únicamente los registros correspondientes a apartamentos, obteniendo un DataFrame llamado apartamentos. Este filtro fue validado comparando el número total de registros en el DataFrame filtrado con el número de registros en la base de datos original que tienen el tipo “apartamento”.

Descripción del DataFrame Filtrado:

A continuación, se presentan los tres primeros registros del DataFrame apartamentos, lo que permite una primera inspección visual de los datos filtrados:

#aplicacion filtro de apartamentos a la base de datos
apartamentos = subset(vivienda_ordenada, tipo == "Apartamento")

# tres primeros registros y comprobacion de que se aplico el filtro
head(apartamentos, 3)
## # A tibble: 3 × 13
##      id zona     piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  4654 Zona C…     3       3     100      70              2      2            3
## 2  4408 Zona C…     5       3     120      84              1      2            3
## 3  4395 Zona C…     4       3     125      66.8            2      2            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
table(apartamentos$tipo)
## 
## Apartamento 
##        5074
glimpse(apartamentos)
## Rows: 5,074
## Columns: 13
## $ id           <dbl> 4654, 4408, 4395, 4305, 1132, 5177, 5178, 1130, 3811, 378…
## $ zona         <chr> "Zona Centro", "Zona Centro", "Zona Centro", "Zona Centro…
## $ piso         <dbl> 3, 5, 4, 5, 2, 2, 11, 4, 4, 2, 2, 2, 2, 2, 5, 4, 5, 1, 11…
## $ estrato      <dbl> 3, 3, 3, 3, 5, 3, 4, 4, 3, 3, 3, 4, 4, 5, 4, 3, 3, 3, 4, …
## $ preciom      <dbl> 100, 120, 125, 120, 325, 300, 150, 170, 130, 150, 155, 31…
## $ areaconst    <dbl> 70.00, 84.00, 66.76, 84.00, 89.00, 130.00, 129.00, 96.00,…
## $ parqueaderos <dbl> 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, …
## $ banios       <dbl> 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 3, 2, 2, 1, 1, 3, 2, …
## $ habitaciones <dbl> 3, 3, 3, 3, 3, 3, 2, 2, 5, 4, 3, 2, 5, 3, 2, 2, 2, 5, 3, …
## $ tipo         <chr> "Apartamento", "Apartamento", "Apartamento", "Apartamento…
## $ barrio       <chr> "alameda", "alameda", "bretaña", "bretaña", "centelsa", "…
## $ longitud     <dbl> -76.53200, -76.53123, -76.53111, -76.53081, -76.51100, -7…
## $ latitud      <dbl> 3.45200, 3.44011, 3.44034, 3.44034, 3.48700, 3.45100, 3.4…
summary(apartamentos)
##        id           zona                piso           estrato     
##  Min.   :   3   Length:5074        Min.   : 1.000   Min.   :3.000  
##  1st Qu.:2178   Class :character   1st Qu.: 2.000   1st Qu.:4.000  
##  Median :4160   Mode  :character   Median : 3.000   Median :5.000  
##  Mean   :4283                      Mean   : 3.915   Mean   :4.727  
##  3rd Qu.:6557                      3rd Qu.: 5.000   3rd Qu.:6.000  
##  Max.   :8317                      Max.   :12.000   Max.   :6.000  
##     preciom         areaconst      parqueaderos        banios     
##  Min.   :  58.0   Min.   : 40.0   Min.   : 1.000   Min.   :1.000  
##  1st Qu.: 175.0   1st Qu.: 68.0   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 276.0   Median : 90.0   Median : 2.000   Median :2.000  
##  Mean   : 366.7   Mean   :112.5   Mean   : 1.639   Mean   :2.623  
##  3rd Qu.: 430.0   3rd Qu.:130.0   3rd Qu.: 2.000   3rd Qu.:3.000  
##  Max.   :1950.0   Max.   :932.0   Max.   :10.000   Max.   :8.000  
##   habitaciones       tipo              barrio             longitud     
##  Min.   :1.000   Length:5074        Length:5074        Min.   :-76.59  
##  1st Qu.:3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median :3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   :2.984                                         Mean   :-76.53  
##  3rd Qu.:3.000                                         3rd Qu.:-76.52  
##  Max.   :9.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.334  
##  1st Qu.:3.380  
##  Median :3.419  
##  Mean   :3.419  
##  3rd Qu.:3.453  
##  Max.   :3.498

Análisis Descriptivo:

Al analizar el resumen estadístico de la variable de interés (precio), se observa que el precio mínimo de los apartamentos es de 58 millones, mientras que el máximo alcanza los 1950 millones. Esto sugiere una amplia variabilidad en los precios, lo que podría indicar una diversidad en las características de las propiedades (ubicación, tamaño, estrato, etc.).

El rango intercuartil de 255 millones sugiere que la mitad de los apartamentos tienen precios que varian en este rango por encima o por debajo en su precio.

Pregunta 2

Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

#seleccion de las variables a relacionar
variables_seleccionadas = apartamentos[,c("preciom","areaconst","estrato","banios","habitaciones","zona")]

#creacion del grafico precio y area construida
p1 = ggplot(variables_seleccionadas, aes(x=areaconst, y = preciom, color = estrato)) +
  geom_point() +
  labs(title = "Precio vs Area Construida", x = "Area Construida (m2)", y = "Precio (Millones)") +
  theme_minimal()

#convertir grafico a plotly para interactividad
fig1 = ggplotly(p1, tooltip = c("x","y","color"))
fig1

En la gráfica de precio versus área construida, se observa una fuerte correlación positiva (r = 0.834) entre ambas variables, lo que indica que a mayor área construida, el precio del apartamento tiende a ser más alto. Esta tendencia es particularmente evidente en apartamentos de estrato 6, donde los valores se concentran en rangos de precios altos y áreas grandes.

Por otro lado, los apartamentos de estrato 3, que generalmente tienen áreas más pequeñas, se agrupan en la parte inferior del gráfico, con precios que no superan los 250 millones de pesos. Esta distribución sugiere una segmentación clara del mercado según el estrato, donde los apartamentos más accesibles en precio suelen ser también los de menor tamaño y estrato.

#creacion del grafico precio y habitaciones
p2 = ggplot(variables_seleccionadas, aes(x=habitaciones, y=preciom, color = estrato)) +
  geom_point() +
  labs(title = "Precio vs N° habitaciones", x = "N° habitaciones", y = "Precio (Millones)") +
  theme_minimal()

#convertir grafico a plotly para interactividad
fig2 = ggplotly(p2, tooltip = c("x","y","color"))
fig2

En la gráfica de precio versus número de habitaciones, no se observa una relación clara entre estas dos variables. Aunque inicialmente el precio parece aumentar al agregar una o dos habitaciones, esta tendencia se detiene alrededor de las cinco habitaciones, mostrando que el número de habitaciones no siempre se traduce en un mayor precio. De hecho, a partir de las tres habitaciones, los precios de las viviendas se mantienen en un rango amplio sin un patrón definido, independientemente de si la vivienda tiene tres o cinco habitaciones. Esto se corrobora con la tabla de correlaciones, donde el coeficiente de 0.311 indica una correlación positiva débil entre el número de habitaciones y el precio.

Además, se destaca que en los apartamentos de estrato 3, el número de habitaciones puede variar considerablemente, desde 1 hasta 9, sin que esto tenga un impacto significativo en el precio al que se ofertan. Esto sugiere que en este estrato, otros factores podrían estar desempeñando un papel más importante en la determinación del precio de los apartamentos.

#creacion del grafico precio y numero de baños
p3 = ggplot(variables_seleccionadas, aes(x=banios, y=preciom, color=estrato)) +
  geom_point() +
  labs(title = "Precio vs N°banios", x = "N° banios", y = "Precio (Millones)")+
  theme_minimal()
#convertir grafico a plotly para interactividad
fig3 = ggplotly(p3, tooltip = c("x","y","color"))
fig3

En la gráfica de precio versus número de baños, se observa una relación directa entre estas variables: a medida que aumenta el número de baños, los precios de los apartamentos tienden a ser más altos. Esta tendencia es evidente en la mayoría de los casos y se respalda por la gráfica de correlación, que muestra un coeficiente de 0.75, indicando una correlación positiva fuerte entre el número de baños y el precio.

Además, se nota que los apartamentos en estratos más bajos tienden a tener menos baños, lo que podría reflejar las limitaciones de espacio o las características típicas de las viviendas en estos estratos. Esta relación sugiere que el número de baños es un factor relevante en la valorización de los apartamentos, especialmente en estratos más altos, donde la oferta suele incluir más comodidades.

#creacion del grafico precio y zona
p4 = ggplot(variables_seleccionadas, aes(x=zona, y=preciom, color=estrato)) +
  geom_point() +
  labs(title = "Precio vs Zona", x = "Zona", y = "Precio (Millones)") +
  theme_minimal()
#convertir grafico a plotly para interactividad
fig4 = ggplotly(p4, tooltip = c("x", "y", "color"))
fig4

En la gráfica de precio versus zona, se observa que las zonas Centro y Oriente presentan una oferta de apartamentos predominantemente en estrato 3, con precios que no superan los 450 millones de pesos. Estas zonas muestran una menor variabilidad en los precios de los apartamentos, indicando una oferta más homogénea en términos de precios.

Por otro lado, las zonas Norte, Oeste y Sur exhiben una mayor variabilidad en los precios. Estas zonas abarcan una gama más amplia de estratos, incluyendo el estrato 6, que suele albergar los apartamentos más costosos. La alta variabilidad de precios en estas áreas refleja una oferta más diversa, donde los precios de los apartamentos pueden variar significativamente en función del estrato y otros factores. Esta diferencia en la variabilidad de precios entre las zonas sugiere que la ubicación juega un papel crucial en la determinación del precio de los apartamentos.

ggpairs(apartamentos[,5:9], title = " ")

En la tabla/grafica de correlación, que incluye únicamente variables numéricas, se confirma la mayoría de las relaciones observadas en las gráficas anteriores. La relación entre el precio y el número de parqueaderos destaca con una correlación positiva fuerte de 0.614, lo que sugiere que el número de parqueaderos podría ser una variable relevante para la predicción en el modelo de regresión lineal múltiple (MRLM).

Además, al examinar las correlaciones entre las demás variables, se observa que ninguna de ellas muestra una correlación superior a 0.80, lo que indica que no existe una colinealidad significativa entre las variables independientes. Esto es positivo para la estabilidad del modelo, ya que sugiere que cada variable aporta información única y no redundante en la predicción del precio.

Pregunta 3

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

#se seleccionan las variables a trabajar en el modelo
variables_modelo = apartamentos[, c("preciom","areaconst","estrato","banios","habitaciones","parqueaderos")]

#se convierte la variable estrato a factor porque es categorica nominal
variables_modelo$estrato = as.factor(variables_modelo$estrato)

#se crea un modelo
modelo1 = lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = variables_modelo)

#resumen del modelo
summary(modelo1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = variables_modelo)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1759.53   -55.25     1.38    48.05   964.99 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -76.26721   10.76408  -7.085 1.58e-12 ***
## areaconst      2.10650    0.04317  48.791  < 2e-16 ***
## estrato4      35.77822    6.41703   5.576 2.60e-08 ***
## estrato5      71.00942    6.52340  10.885  < 2e-16 ***
## estrato6     209.46511    7.99917  26.186  < 2e-16 ***
## habitaciones -38.32544    3.37543 -11.354  < 2e-16 ***
## parqueaderos  57.95915    3.35912  17.254  < 2e-16 ***
## banios        52.51439    3.00006  17.504  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 128.3 on 5066 degrees of freedom
## Multiple R-squared:  0.8036, Adjusted R-squared:  0.8034 
## F-statistic:  2962 on 7 and 5066 DF,  p-value: < 2.2e-16

Interpretación de los Coeficientes:

En el resumen del modelo, se observa que todas las variables son altamente significativas para la predicción del precio del apartamento, dado que sus valores p son menores que 2e-16, lo que está por debajo del nivel de significancia del 0.05. Esto nos permite rechazar la hipótesis nula y confirmar que estas variables son relevantes en el modelo.

Al analizar cada variable individualmente:

Área Construida: El coeficiente estimado de 2.11 indica que, por cada metro cuadrado adicional de área construida, el valor del apartamento aumenta en 2,110,000 pesos. La alta significancia de este coeficiente refuerza que el área construida es una variable predictora clave en el modelo.

Estrato: La ubicación del apartamento en estratos superiores al 3 incrementa significativamente su valor. Por ejemplo, un apartamento en estrato 4 tiene un precio promedio 35,780,000 pesos más alto que uno en estrato 3. Para estrato 5, el aumento es de 71,010,000 pesos, y para estrato 6, es de 209,470,000 pesos más. Todos estos coeficientes son altamente significativos, lo que subraya la importancia del estrato en la determinación del precio.

Habitaciones: De manera contraria a lo que se podría esperar, el incremento en el número de habitaciones reduce el precio promedio en 38,330,000 pesos, manteniendo constantes las demás variables. Aunque este resultado es significativo, la relación negativa podría estar relacionada con la saturación del número de habitaciones, donde después de un cierto punto (cinco habitaciones), el precio tiende a disminuir como se muestra en la grafica precio vs habitaciones.

Parqueaderos: Cada parqueadero adicional incrementa el precio en 57,960,000 pesos, y este coeficiente es altamente significativo.

Baños: Por cada baño adicional, el precio del apartamento aumenta en 52,510,000 pesos, y este efecto es también altamente significativo.

Este análisis permite comprender mejor la dinámica del mercado inmobiliario para apartamentos: aquellos con mayor área construida, ubicados en estratos superiores y con una mejor distribución de áreas de servicio como baños y parqueaderos, tienden a tener precios más elevados. Sin embargo, otras variables como los materiales de construcción y los acabados podrían ser incluidas en el modelo para mejorar aún más su capacidad predictiva.

Interpretacion del R2:

En cuanto al R2 de 0.8036, indica que el modelo explica aproximadamente el 80.36% de la variabilidad en el precio de los apartamentos, lo que es bastante robusto. El R² ajustado de 0.8034 sugiere que el modelo no está sobreajustado.

Si con este resultado aun se busca mejorar el r2, podriamos pensar en incluir otras variables que puedan influir en el precio y para mejorar la explicacion del modelo sobre la variabilidad de los datos, tambien esta la opcion de incluir la interracion entre variables, como por eejmplo la interracion entre la variable habitacion y area cosntruida para nuestro caso buscando mejorar el modelo.

Mejoras Potenciales al R2:

Si bien el modelo ya presenta un R2 bastante alto, aún hay opciones para mejorar la capacidad explicativa del modelo sobre la variabilidad del precio. Una estrategia sería incluir variables adicionales que podrían tener un impacto significativo en el precio de los apartamentos. Variables como la antigüedad del edificio, la calidad de los acabados, o la cercanía a servicios clave, podrían aumentar la capacidad del modelo para capturar más variabilidad en los precios.

Otra opción sería explorar interacciones entre variables existentes. Por ejemplo, la interacción entre el número de habitaciones y el área construida o el número de habitaciones y el estrato, podrían capturar aspectos en cómo estas características juntas afectan el precio, lo que podría resultar en un modelo más robusto y un R² más elevado.

Tambien se puede realizar transformaciones a las variables, si algunas relaciones no son lineales, las transformaciones de variables (como logaritmos o potencias) pueden ayudar a capturar mejor la relación entre la variable dependiente y las independientes. Por ejemplo, si el impacto del área construida sobre el precio no es lineal, una transformación logarítmica de la variable área podría mejorar el ajuste.

Pregunta 4

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

Validación de supuestos del modelo:

#validadcion de supuestos del modelo

#linealidad
plot(modelo1, which = 1)

Linealidad : En el gráfico de residuos versus valores ajustados, los residuos parecen dispersarse de manera aleatoria alrededor de la línea de cero, lo que sugiere que el supuesto de linealidad se cumple en nuestro modelo.

#independencia de los errores
dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.7285, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Independencia de errores : El estadístico Durbin-Watson (DW) es 1.7285, lo cual está cercano a 2. Esto generalmente sugiere que no hay autocorrelación significativa en los residuos. Sin embargo, el p-valor es extremadamente bajo (< 2.2e-16), indicando que la autocorrelación es significativa.

A pesar de este p-valor, el valor del DW cercano a 2 sugiere que la autocorrelación no es muy fuerte. En conclusión, aunque hay una señal de autocorrelación, no parece ser lo suficientemente pronunciada como para invalidar el supuesto de independencia de los errores en el modelo. Por lo tanto, podríamos considerar que el modelo cumple razonablemente bien con este supuesto.

#homoscedasticidad
plot(modelo1, which = 3)

bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 1410.9, df = 7, p-value < 2.2e-16

Homoscedasticidad:

En el gráfico de residuos versus valores ajustados, se observa una relación que sugiere un patrón no aleatorio de los residuos, lo que indica la presencia de heterocedasticidad. Esto significa que la varianza de los errores no es constante a lo largo de los valores ajustados, lo que puede afectar la eficiencia y precisión de las estimaciones del modelo.

El resultado del test de Breusch-Pagan confirma esta observación, mostrando un estadístico BP de 1410.9 con 7 grados de libertad y un p-valor < 2.2e-16. Este p-valor extremadamente bajo nos lleva a rechazar la hipótesis nula de homocedasticidad, confirmando que los residuos no tienen una varianza constante.

No se cumple es supuesto de homocedasticidad, el modelo presenta heterocedasticidad, lo que sugiere que la precisión de las predicciones varía con los valores de las variables independientes.

Mejoras de supuestos:

Para mejorar el modelo, es recomendable aplicar transformaciones logaritmicas a la varible dependiente precio y la variable independiente area construida, obteniendo un mejor r2 y cumpliendo con los supuestos, tambien se puede considerar técnicas como la estimación por mínimos cuadrados ponderados (WLS) que corrige el supuesto de homoscedasticidad.(ver Anexos)

#normalidad de los errores
par(mfrow = c(1,2))
plot(modelo1, which = 2)
# Histograma de residuos
hist(residuals(modelo1), breaks = 30, main = "Histograma de Residuos", xlab = "Residuos", col = "lightblue")

# Test de Anderson-Darling
ad.test(residuals(modelo1))
## 
##  Anderson-Darling normality test
## 
## data:  residuals(modelo1)
## A = 178.77, p-value < 2.2e-16

Normalidad:

La gráfica de Q-Q de los residuos revela que estos no siguen una distribución normal; en cambio, muestran una distribución asimétrica. Esta observación se confirma con el histograma de los residuos, que presenta una distribución asimétrica hacia la izquierda.

Para confirmar estos hallazgos, se utilizó el test de Anderson-Darling. El estadístico A obtenido es 178.77 y el p-valor es menor a 2.2e-16, lo que indica que el test es altamente significativo. Esto sugiere que los residuos no se ajustan a una distribución normal, lo que puede afectar la precisión de las predicciones del modelo.

Recomendaciones:

Dado que el modelo no cumple con el supuesto de normalidad, es recomendable realizar ajustes. Una opción es aplicar transformaciones a la variable dependiente (precio) para mejorar la normalidad de los residuos y, por ende, el ajuste del modelo. Esto puede ayudar a obtener estimaciones más precisas y confiables.

#colinealidad
vif(modelo1)
##                  GVIF Df GVIF^(1/(2*Df))
## areaconst    2.707794  1        1.645537
## estrato      2.079606  3        1.129788
## habitaciones 1.477098  1        1.215359
## parqueaderos 1.638834  1        1.280170
## banios       3.117152  1        1.765546

Colinealidad:

En el análisis de colinealidad utilizando el GVIF (Factor de Inflación de la Varianza Generalizado), observamos lo siguiente:

Variables con baja colinealidad: Las variables estrato, habitaciones y parqueaderos presentan coeficientes de colinealidad muy bajos, con valores de GVIF cercanos a 1. Esto indica que estas variables no están significativamente correlacionadas con otras variables del modelo, lo que sugiere que no hay problemas de multicolinealidad en este caso.

Variables con colinealidad moderada: Las variables areaconst y banios tienen coeficientes de GVIF por encima de 1.5. Esto sugiere que podrían tener cierta correlación con otras variables en el modelo. Aunque estos valores no son alarmantemente altos, es importante tener en cuenta esta colinealidad moderada, ya que podría afectar la estabilidad y la interpretación de los coeficientes del modelo.

Se podria analizar la relevancia de las variables con mayor GVIF y considerar la posibilidad de realizar transformaciones o combinaciones de variables para reducir la colinealidad.

Pregunta 5

Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime el modelo con la muestra del 70%. Muestre los resultados.

# Establecer una semilla para reproducibilidad
set.seed(123)

# Dividir el conjunto de datos en entrenamiento (70%) y prueba (30%)
tamaño_entrenamiento = floor(0.7 * nrow(variables_modelo))
indices_entrenamiento = sample(seq_len(nrow(variables_modelo)), size = tamaño_entrenamiento)

# Crear los conjuntos de entrenamiento y prueba
datos_entrenamiento = variables_modelo[indices_entrenamiento, ]
datos_prueba = variables_modelo[-indices_entrenamiento, ]

# Estimar el modelo con el conjunto de entrenamiento utilizando validación cruzada
control = trainControl(method = "cv", number = 10)
modelo_cv = train(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = datos_entrenamiento, method = "lm", trControl = control)

# Mostrar el resumen del modelo ajustado
print(modelo_cv)
## Linear Regression 
## 
## 3551 samples
##    5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 3195, 3196, 3195, 3196, 3195, 3197, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   129.3417  0.8022675  79.89649
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
summary(modelo_cv$finalModel)  # Resumen del modelo final
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1697.95   -55.74     1.16    48.26   964.84 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -93.06176   12.77418  -7.285 3.94e-13 ***
## areaconst      2.03254    0.05087  39.957  < 2e-16 ***
## estrato4      34.66788    7.67365   4.518 6.45e-06 ***
## estrato5      70.91931    7.79592   9.097  < 2e-16 ***
## estrato6     208.20731    9.56951  21.757  < 2e-16 ***
## habitaciones -33.80496    4.02247  -8.404  < 2e-16 ***
## parqueaderos  60.41390    3.96468  15.238  < 2e-16 ***
## banios        55.25322    3.57703  15.447  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 128.8 on 3543 degrees of freedom
## Multiple R-squared:  0.8034, Adjusted R-squared:  0.803 
## F-statistic:  2068 on 7 and 3543 DF,  p-value: < 2.2e-16

Pregunta 6

Realice predicciones con el modelo anterior usando los datos de prueba (30%)

# Realizar predicciones usando los datos de prueba
predicciones = predict(modelo_cv, newdata = datos_prueba)

# Crear un data frame que contenga las predicciones y los valores reales
resultados = data.frame(Real = datos_prueba$preciom, Prediccion = predicciones)
head(resultados)
##   Real Prediccion
## 1  120  147.17732
## 2  300  301.08820
## 3  170  295.29389
## 4  130  190.79487
## 5  108  135.32938
## 6  105   87.29661

Pregunta 7

Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.

# Calcular el error cuadrático medio (MSE)
mse = mean((resultados$Real - resultados$Prediccion)^2)
cat("Error Cuadrático Medio (MSE):", mse, "\n")
## Error Cuadrático Medio (MSE): 16246.53

El Error Cuadrático Medio (MSE) obtenido es de 16246.53. Este valor representa el promedio de los errores al cuadrado entre las predicciones realizadas por el modelo y los valores reales del precio de los apartamentos en el conjunto de prueba. La interpretación del MSE depende de la escala de la variable dependiente, que en este caso es el precio de los apartamentos expresado en millones.

Dado que el MSE refleja la magnitud del error cuadrático promedio, un valor de 16246.53 sugiere que el modelo presenta un error considerable en sus predicciones. Este valor, al ser elevado, indica que la precisión del modelo es limitada. Por lo tanto, es recomendable considerar ajustes al modelo, como la inclusión de nuevas variables o transformaciones, con el objetivo de mejorar su capacidad predictiva.

# Calcular el error absoluto medio (MAE)
mae = mean(abs(resultados$Real - resultados$Prediccion))  # Corregir la columna
cat("Error Absoluto Medio (MAE):", mae, "\n")
## Error Absoluto Medio (MAE): 79.53757

El Error Absoluto Medio (MAE) obtenido es de 79.54. Este valor representa el promedio de las diferencias absolutas entre las predicciones realizadas por el modelo y los valores reales del precio de los apartamentos en el conjunto de prueba. A diferencia del MSE, el MAE proporciona una medida de error en las mismas unidades que la variable dependiente, en este caso, millones de pesos.

Un MAE de 79.54 millones significa que las predicciones del modelo están desviadas del valor real en aproximadamente 79.54 millones de pesos, este valor de MAE es considerablemente alto, indicando que el modelo no está siendo suficientemente preciso y, deberia ser ajustado para reducir el error.

# Calcular el R2
r2 = 1 - sum((resultados$Real - resultados$Prediccion)^2) / sum((resultados$Real - mean(resultados$Real))^2)
cat("R2 del modelo:", r2, "\n")
## R2 del modelo: 0.803551

El R2 del modelo es 0.8036, lo que indica que aproximadamente el 80.36% de la variabilidad en el precio de los apartamentos es explicada por las variables predictoras incluidas en el modelo: área construida, estrato, número de habitaciones, número de parqueaderos y número de baños.

Un valor de R2 de 0.8036 dice que el modelo tiene un buen poder explicativo, ya que una gran parte de la variabilidad en los precios de los apartamentos puede ser atribuida a las variables seleccionadas. Sin embargo, esto también implica que hay un 19.64% de la variabilidad que no está siendo capturada por el modelo, lo que indica que podrían existir otras variables importantes que no han sido incluidas en el análisis o que se podria ajustar el modelo para mejorar su capacidad predictiva.

ANEXOS

Ajuste del modelo con una transformacion logaritmica en la variable dependiente y en una variable independiente, para cumplir con los supuestos.

# Aplicación de la transformación logarítmica
variables_modelo$log_precio = log(variables_modelo$preciom)
variables_modelo$log_area = log(variables_modelo$areaconst)

# Ajuste del modelo con las variables transformadas
modelo_transformado <- lm(log_precio ~ log_area + estrato + habitaciones + parqueaderos + banios, data = variables_modelo)

#establecer una semilla para reproducibilidad
set.seed(123)

#dividir el conjunto de datos en entrenamiento(70%) y prueba (30%)
tamaño_entrenamiento = floor(0.7*nrow(variables_modelo))
indices_entrenamiento = sample(seq_len(nrow(variables_modelo)), size = tamaño_entrenamiento)

#crear los conjuntos de entrenamiento y prueba
datos_entrenamiento = variables_modelo[indices_entrenamiento, ]
datos_prueba = variables_modelo[-indices_entrenamiento, ]

#aplicacion de la transformacion al modelo junto con la validacion cruzada
control = trainControl(method = "cv", number = 10)
modelo_cv_log = train(log_precio ~ log_area + estrato + habitaciones + parqueaderos + banios,
                  data = datos_entrenamiento,
                  method ="lm",
                  trControl = control)


# Resumen del modelo transformado
summary(modelo_cv_log)
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.79092 -0.13239  0.00634  0.14760  0.91982 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   1.943742   0.055135  35.254  < 2e-16 ***
## log_area      0.679394   0.015349  44.263  < 2e-16 ***
## estrato4      0.307599   0.013582  22.647  < 2e-16 ***
## estrato5      0.510143   0.014260  35.773  < 2e-16 ***
## estrato6      0.774329   0.017723  43.691  < 2e-16 ***
## habitaciones -0.070787   0.007216  -9.809  < 2e-16 ***
## parqueaderos  0.051231   0.006906   7.418 1.48e-13 ***
## banios        0.105751   0.006537  16.178  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2271 on 3543 degrees of freedom
## Multiple R-squared:  0.8799, Adjusted R-squared:  0.8797 
## F-statistic:  3708 on 7 and 3543 DF,  p-value: < 2.2e-16
print(modelo_cv_log)
## Linear Regression 
## 
## 3551 samples
##    5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 3195, 3196, 3195, 3196, 3195, 3197, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE      
##   0.2274381  0.8794376  0.1752192
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
par(mfrow = c(2,2))
plot(modelo_transformado)

# Realizar predicciones usando los datos de prueba
predicciones1 = predict(modelo_cv_log, newdata = datos_prueba)

# Revertir la transformación logarítmica
predicciones_originales = exp(predicciones1)

# Crear un data frame que contenga las predicciones y los valores reales
resultados1 = data.frame(Real = datos_prueba$preciom, Prediccion_log = predicciones1, Prediccion_millone = predicciones_originales)
head(resultados1)
##   Real Prediccion_log Prediccion_millone
## 1  120       5.004385           149.0653
## 2  300       5.352319           211.0973
## 3  170       5.579242           264.8707
## 4  130       5.091046           162.5597
## 5  108       4.780636           119.1801
## 6  105       4.624046           101.9055