Informe sobre el Análisis de Precios de Viviendas en Función del Área Construida

Introducción

El presente informe se centra en el análisis de los precios de viviendas en función del área construida en la ciudad de Cali, que sean estrato 4 y tengan un área construida menor a 200 metros cuadrados. El objetivo principal es comprender la relación entre el precio de una vivienda y el espacio que ofrece, así como identificar el modelo estadístico que mejor describe esta relación. Para ello, se ha utilizado un conjunto de datos llamado “vivienda4” que contiene información sobre diversas viviendas, incluyendo sus precios y áreas construidas.

Análisis Exploratorio

Antes de adentrarnos en el modelo de regresión, es importante realizar un análisis exploratorio de los datos. Se observó una fuerte relación entre el precio de las viviendas y el área construida, lo que sugiere que el tamaño de una vivienda es un factor determinante en su precio. Para visualizar esta relación, se crearon gráficos de dispersión que mostraban una tendencia clara de aumento de precios a medida que aumenta el área construida.

## WARNING: Rtools is required to build R packages, but is not currently installed.
## 
## Please download and install Rtools 4.2 from https://cran.r-project.org/bin/windows/Rtools/.
## Skipping install of 'paqueteMETODOS' from a github remote, the SHA1 (9696ffdc) has not changed since last install.
##   Use `force = TRUE` to force installation
## Loading required package: cubature
## Warning: package 'cubature' was built under R version 4.2.3
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: MASS
## Warning: package 'MASS' was built under R version 4.2.3
## Loading required package: summarytools
## Loading required package: psych
## Warning: package 'psych' was built under R version 4.2.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Loading required package: tidyverse
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::select() masks MASS::select()
## ✖ tibble::view()  masks summarytools::view()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

Modelo de Regresión Lineal

Para cuantificar la relación entre el precio de las viviendas y el área construida, se ajustó un modelo de regresión lineal. El modelo utilizado fue el siguiente:

lm(preciom ~ areaconst, data = vivienda4)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4)
## 
## Coefficients:
## (Intercept)    areaconst  
##      67.381        1.803

Este modelo tiene como variable dependiente el precio de la vivienda (preciom) y como variable independiente el área construida (areaconst). Se seleccionó este modelo debido a la alta correlación observada en el análisis exploratorio y a la simplicidad del mismo.

Resultados y Conclusiones

El modelo muestra una relación positiva y significativa entre el área construida y el precio de las viviendas estudiadas. Cada unidad adicional de área construida se asocia con un aumento promedio de 1.803 millones de pesos COP en el precio de la vivienda.

Bondad del Ajuste del Modelo:

El coeficiente de determinación (R²) es de 0.5822, lo que significa que el modelo explica aproximadamente el 58.22% de la variabilidad en los precios de las viviendas. Esto indica una capacidad razonable para predecir los precios en función del área construida. Significancia Estadística:

Tanto el intercepto como el coeficiente de área construida son altamente significativos, con valores de p < 0.001. Esto respalda la relación observada entre el área construida y el precio de las viviendas.

Sin embargo es de destacar que el modelo no cumple con los supuesto de normalidad aún realizando las respectivas transformaciones para corregirlo, esta no normalidad tiene la particularidad de que la desviación no es lo suficientemente grande y que tienen la misma forma de campana de la distribución normal. Por lo tanto hay que utilizar el modelo con precaución.

Dicho esto los resultados respaldan la idea de que el área construida es un predictor importante del precio de una vivienda en la ciudad analizada. Sin embargo, es fundamental recordar que este modelo se basa en una relación lineal simple y no captura necesariamente todas las complejidades del mercado inmobiliario. Otros factores, la calidad de la construcción y las comodidades adicionales, también pueden influir en los precios de las viviendas.

Anexos

print(vivienda4)
## # A tibble: 1,706 × 5
##    zona       estrato preciom areaconst tipo       
##    <fct>      <fct>     <dbl>     <dbl> <fct>      
##  1 Zona Norte 4           220        52 Apartamento
##  2 Zona Norte 4           600       160 Casa       
##  3 Zona Norte 4           320       108 Apartamento
##  4 Zona Sur   4           290        96 Apartamento
##  5 Zona Norte 4           220        82 Apartamento
##  6 Zona Norte 4           305       117 Casa       
##  7 Zona Norte 4           220        75 Apartamento
##  8 Zona Norte 4           162        60 Apartamento
##  9 Zona Norte 4           225        84 Apartamento
## 10 Zona Norte 4           370       117 Apartamento
## # ℹ 1,696 more rows
#Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamentos
#de estrato 4 con área construida menor a 200 m2 (vivienda4.RDS) la inmobiliaria A&C requiere el
#apoyo de un cientifico de datos en la construcción de un modelo que lo oriente sobre los precios
#de inmuebles.

#Con este propósito el equipo de asesores a diseñado los siguientes pasos para obtener un modelo 
#y así poder a futuro determinar los precios de los inmuebles a negociar
#Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) 
#y área de la vivienda (metros cuadrados) - incluir gráficos e indicadores apropiados interpretados.

#Histograma de distribución de precios 
hist(vivienda4$preciom, main = "Distribución de Precios", xlab = "Precio (millones de COP)", col = "lightblue")

#Relación entre Área y precio
plot(vivienda4$areaconst, vivienda4$preciom, main = "Precio vs. Área", xlab = "Área (m^2)", ylab = "Precio (millones de COP)", pch = 16, col = "blue")

mean(vivienda4$preciom)
## [1] 225.3746
median(vivienda4$preciom)
## [1] 210
mean(vivienda4$areaconst)
## [1] 87.62954
median(vivienda4$areaconst)
## [1] 75
#Realice un análisis exploratorio bivariado de datos, enfocado en la relación entre la
#variable respuesta (precio) en función de la variable predictora (area construida) - incluir gráficos e indicadores apropiados interpretados.

library(ggplot2)

ggplot(data = vivienda4, aes(x = areaconst, y = preciom)) +
  geom_point() +
  labs(title = "Relación entre Área Construida y Precio",
       x = "Área Construida (m^2)",
       y = "Precio (millones de COP)")

# Gráficamente, vemos que posiblemente exista una relación positiva entre el precio y el área
# construida, podemos ver como a mayor área construida, aumenta también el precio.

correlation <- cor(vivienda4$areaconst, vivienda4$preciom)
cat("Coeficiente de correlación:", correlation, "\n")
## Coeficiente de correlación: 0.7630166
#una correlación de 0.76 sugiere una fuerte relación positiva entre el precio y el área de las viviendas en tu conjunto de datos, 
#lo que indica que estas dos variables están asociadas de manera significativa en términos de sus valores. Sin embargo, 
#para comprender completamente la relación entre ellas y tomar decisiones significativas, es necesario considerar otros factores y realizar análisis adicionales.
# 3. Estime el modelo de regresión lineal simple entre precio=f(area)+ε.Interprete los coeficientes
#del modelo β0, β1 en caso de ser correcto.

lm_model <- lm(preciom ~ areaconst, data = vivienda4)
summary(lm_model)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -195.86  -31.95   -8.95   27.87  431.17 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   67.381      3.510   19.20   <2e-16 ***
## areaconst      1.803      0.037   48.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 55.53 on 1704 degrees of freedom
## Multiple R-squared:  0.5822, Adjusted R-squared:  0.5819 
## F-statistic:  2374 on 1 and 1704 DF,  p-value: < 2.2e-16
# El modelo de regresión obtenido es 67.381 + 1.803(areaconst), ambas variables son significativas para el modelo
# ya que (p-value < 0.001). p-value: < 2.2e-16.
# El valor del R cuadrado es 0.5819. Representa la proporción de variabilidad en la variable respuesta (precio) 
# que se explica mediante el modelo. En este caso, el modelo explica aproximadamente el 58.19% de la variabilidad en el precio.

# β0 = 67.381 representa el valor estimado de la variable dependiente (precio) cuando la variable independiente (areaconstruida) 
# son iguales a cero. En caso de construcción y viviendas podríamos asumir esto como el valor de un lote en Cali.
# β1= 1.803 representa cuánto se espera que cambie el valor de la variable dependiente (precio) por cada unidad adicional de la 
# variable independiente(área construida).En este contexto, significa que, en promedio, por cada metro cuadrado adicional de área
# construida en una vivienda, se espera que el precio aumente en aproximadamente 1.803 millones de pesos.
# Construir un intervalo de confianza (95%) para el coeficiente β1, interpretar y concluir si el coeficiente es igual 
#a cero o no. Compare este resultado con una prueba de hipótesis t.

confint(lm_model, level = 0.95)
##                 2.5 %    97.5 %
## (Intercept) 60.496208 74.265055
## areaconst    1.730404  1.875547
summary(lm_model)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -195.86  -31.95   -8.95   27.87  431.17 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   67.381      3.510   19.20   <2e-16 ***
## areaconst      1.803      0.037   48.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 55.53 on 1704 degrees of freedom
## Multiple R-squared:  0.5822, Adjusted R-squared:  0.5819 
## F-statistic:  2374 on 1 and 1704 DF,  p-value: < 2.2e-16
#Teniendo encuenta que el valor de P para β1 es 2e-16 podemos concluir que no es igual a cero y que la variable areaconst 
# tiene un efecto significativo en el precio. 
# El intervalo de confianza es (1.73 - 1.87). Esto significa que podemos estar razonablemente seguro al 95% de confianza de que el 
# valor real de se encuentra entre 1.73 y 1.87.

coef_estimado <- coef(lm_model)["areaconst"]
error_estandar <- summary(lm_model)$coefficients["areaconst", "Std. Error"]
stat_t <- coef_estimado / error_estandar
grados_libertad <- summary(lm_model)$df[2]  # Obtiene los grados de libertad de los residuos
valor_p <- 2 * (1 - pt(abs(stat_t), df = grados_libertad))
print(valor_p)
## areaconst 
##         0
#un valor p igual a cero es una fuerte evidencia de que el coeficiente es significativamente diferente de cero,
#respaldando la idea de que areaconst tiene un efecto significativo en el precio de las viviendas.
# 5.Calcule e interprete el indicador de bondad R2

r_squared <- summary(lm_model)$r.squared
print(r_squared)
## [1] 0.5821944
#R^2 de 0.5821944 indica que el modelo explica aproximadamente el 58.22% de la variabilidad en el 
#precio de las viviendas en función del área construida, lo que sugiere que la variable de área construida 
#es un predictor significativo, pero no el único, de los precios de las viviendas.
#¿Cuál sería el precio promedio estimado para un apartamento de 110 metros cuadrados?
#Considera entonces con este resultado que un apartamento en la misma zona con 110 metros cuadrados en un precio de 200
#millones sería una atractiva esta oferta? ¿Qué consideraciones adicionales se deben tener?.

area_construida <- 110 
precio_estimado <- coef(lm_model)["(Intercept)"] + coef(lm_model)["areaconst"] * area_construida
precio_estimado
## (Intercept) 
##    265.7079
#El precio estimado por el modelo para un apartamento de 110 metros cuadrados es de aproximadamente
# 265 millones de pesos. 
#Teniendo en cuenta que se mantiene la misma zona y por la misma área encontramos otro apartamento por
# 200 millones se puede considerar que es una buena oferta, ya que el modelo calculado es relativamente 
# adecuado. Sin embargo, habría que considerar otras variables para tomar la decisión.
# 7.Realice la validación de los supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones
#si se violan algunos de ellos. Utilice las pruebas de hipótesis para la validación de supuestos y compare los resultados con lo observado en los gráficos asociados.

# Gráfico de probabilidad normal (QQ plot)
qqnorm(resid(lm_model))
qqline(resid(lm_model))

# Prueba de Shapiro-Wilk para normalidad
shapiro.test(resid(lm_model))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(lm_model)
## W = 0.92671, p-value < 2.2e-16
#Estos resultados indican que los residuos del modelo de regresión lineal no siguen una distribución normal. El valor p es extremadamente bajo,
#lo que sugiere una fuerte evidencia en contra de la hipótesis nula de que los residuos son normalmente distribuidos.

residuos <- resid(lm_model)
hist(residuos, main = "Histograma de Residuos", xlab = "Residuos", ylab = "Frecuencia")

plot(density(residuos), main = "Gráfico de Densidad de Residuos", xlab = "Residuos")
lines(density(residuos, adjust = 2), col = "red")

#Con este gráfico se pueden evaluar la normalidad de los residuos, sindo la línea roja la distribución normal
#y la línea negra los residuos de nuestro modelo, si bien es cierto, que no cumple con la normalidad, podemos ver que
#la desviación no es lo suficientemente grande y que tienen la misma forma de campana de la distribución normal
#por lo que podemos seguir usando el modelo.
#8.De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo. 

#Para verificar si se puede mejorar la normalidad del modelo, se realizará una transformación logarítmica al mismo
vivienda4$log_precio <- log(vivienda4$preciom)
lm_model_log <- lm(log_precio ~ areaconst, data = vivienda4)
#9. De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.
summary(lm_model_log)
## 
## Call:
## lm(formula = log_precio ~ areaconst, data = vivienda4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.80097 -0.16347 -0.02737  0.16610  1.14818 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 4.7238296  0.0143492  329.21   <2e-16 ***
## areaconst   0.0072020  0.0001513   47.61   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.227 on 1704 degrees of freedom
## Multiple R-squared:  0.5709, Adjusted R-squared:  0.5706 
## F-statistic:  2267 on 1 and 1704 DF,  p-value: < 2.2e-16
qqnorm(resid(lm_model_log))
qqline(resid(lm_model_log))

shapiro.test(resid(lm_model_log))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(lm_model_log)
## W = 0.99287, p-value = 2.395e-07
#Al hacer esta transformación a un modelo logarítmico, vemos que el problema de normalidad no se soluciona
#además se reduce el valor del R^2 por lo que el precio se explicaría menos por el área. Por tal motivo, sería mejor
#quedarnos con el primer modelo calculado.
#10.Estime varios modelos y compare los resultados obtenidos. 
#En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?

#Realizando una revisión se encuentra que posiblemente la mejor transformación que se puede
#aplicar al modelo es la transformación de Box-Cox la cual se ajusta para que los residuos 
#transformados se distribuyan de manera más cercana a una distribución normal. 

install.packages("MASS")
## Warning: package 'MASS' is in use and will not be installed
library(MASS)

residuos_modelo <- resid(lm_model)
boxcox_result <- boxcox(lm_model, plotit = TRUE)

lambda_optimo <- boxcox_result$x[which.max(boxcox_result$y)]
residuos_transformados <- (residuos_modelo^lambda_optimo - 1) / lambda_optimo

# Ajustar un nuevo modelo con los residuos transformados
nuevo_modelo <- lm(preciom ~ areaconst, data = vivienda4, weights = 1/abs(residuos_transformados))
summary(nuevo_modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4, weights = 1/abs(residuos_transformados))
## 
## Weighted Residuals:
##      Min       1Q   Median       3Q      Max 
## -221.175    2.928   12.046   23.383  196.302 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 47.69214    3.80848   12.52   <2e-16 ***
## areaconst    2.19329    0.04445   49.34   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.99 on 732 degrees of freedom
##   (972 observations deleted due to missingness)
## Multiple R-squared:  0.7688, Adjusted R-squared:  0.7685 
## F-statistic:  2435 on 1 and 732 DF,  p-value: < 2.2e-16
qqnorm(resid(nuevo_modelo))
qqline(resid(nuevo_modelo))

shapiro.test(resid(nuevo_modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(nuevo_modelo)
## W = 0.7786, p-value < 2.2e-16
#Aplicando la prueba de normalidad, encontramos que aún transfomando el modelo a Box-Cox no mejora 
#la normalidad de los residuos.El valor p extremadamente bajo indica que hay una fuerte evidencia 
#en contra de la hipótesis nula de que los residuos son normalmente distribuidos. En este caso sería 
#importante revisar que es mejor, si mantener el modelo sencillo o si aún con el no cumplimiento de la 
#normalidad es mejor utilizar el modelo box-Cox.