library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
library(RecordLinkage)
library(leaflet)
library(htmltools)
library(readxl)
datos <- read_excel("Datos_Vivienda.xlsx")
#View(datos)
id = 1:dim(datos)[1]
datos= data.frame(id,datos)
require(RecordLinkage)
pos=which(jarowinkler("pance", datos$Barrio)>0.98)
datos_subdatos=datos[pos,]
head(datos_subdatos)
##    id     Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 1   1 Zona Sur    2       6           880            237            2     5
## 5   5 Zona Sur    2       6          1300            600            4     7
## 6   6 Zona Sur    3       6           513            160            2     4
## 10 10 Zona Sur    6       6           690            150            2     5
## 19 19 Zona Sur    3       6           550            136            2     4
## 33 33 Zona Sur    1       6           900            330            2     4
##    Habitaciones        Tipo Barrio cordenada_longitud Cordenada_latitud
## 1             4        Casa  pance          -76.46300           3.43000
## 5             5        Casa  pance          -76.46438           3.43463
## 6             4        Casa  pance          -76.46438           3.43463
## 10            4 Apartamento  pance          -76.46478           3.42783
## 19            4 Apartamento  pance          -76.46554           3.42933
## 33            4        Casa  pance          -76.46809           3.41664
library(dplyr)
names(datos_subdatos)
##  [1] "id"                 "Zona"               "piso"              
##  [4] "Estrato"            "precio_millon"      "Area_contruida"    
##  [7] "parqueaderos"       "Banos"              "Habitaciones"      
## [10] "Tipo"               "Barrio"             "cordenada_longitud"
## [13] "Cordenada_latitud"

Indicadores de centralidad

length(pos)
## [1] 409

Con este dato podemos confirmar que esta base de datos contiene 409 viviendas en el barrio Pance.

require(leaflet)
leaflet() %>% addCircleMarkers(lng = datos_subdatos$cordenada_longitud, lat = datos_subdatos$Cordenada_latitud, radius
= 1, color = "purple", label = paste0( 'ID',datos_subdatos$ID, 'Precio:', datos_subdatos$precio_millon,'Area:',
datos_subdatos$Area_contruida, 'Barrio:', datos_subdatos$Barrio,' Lat: ' ,datos_subdatos$Cordenada_latitud, 'Long:',datos_subdatos$cordenada_longitud)) %>% addTiles()

En este mapa podemos encontrar la ubicación geográfica exacta de las 409 viviendas de la base de datos con nombre Pance, se puede ver que hay cierto número de viviendas que aparecen fuera del barrio Pance y son tomadas como si lo fuera.

Promedio de precios de las viviendas en Pance

promedio_precio=mean (datos_subdatos$precio_millon,na.rm = TRUE)
mediana_precio=median(datos_subdatos$precio_millon,na.rm = TRUE)
minimo_precio=min(datos_subdatos$precio_millon,na.rm = TRUE)
maximo_precio= max(datos_subdatos$precio_millon,na.rm  = TRUE)
desvest_precio=sd(datos_subdatos$precio_millon, na.rm = TRUE)
indic_precio=data.frame(promedio_precio,mediana_precio, minimo_precio, maximo_precio, desvest_precio)
indic_precio
##   promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
## 1        881.8044            780           245          1900       389.5001

El precio máximo de una vivienda de Pance en esta base de datos es de $1 900 millones. El precio mínimo de una vivienda de Pance es de $245 millones. El precio promedio de una vivienda de Pance es de $881 millones. La mediana del precio de una vivienda en Pance es de $780 millones, un dato menor al promedio, lo que quiere decir que hay precios muy altos que lo están elevando. La desviación estándar del precio de una vivienda en Pance es de $389 millones.

library(plotly)
g1=ggplot(data = datos_subdatos, mapping = aes(x=precio_millon))+ geom_histogram(fill="purple")+theme_bw()
ggplotly(g1)

De 409 observaciones, 119 se encuentran entre el rango de precios de $570 y $684 millones, esto representa el 29% de observaciones.

ANÁLISIS BIVARIADO

library(ggplot2)
library(plotly)
ggplotly(
  ggplot(datos_subdatos, aes(x = Area_contruida, y = precio_millon)) +
    geom_point(color = "purple", alpha = 0.8, size = 2) +
    geom_smooth(method = "loess", color = "grey", se = TRUE) +
    labs(
      title = paste("Figura 5. Relación entre Área Construida y Precio\nCoef. de correlación:",
                    round(cor(datos_subdatos$precio_millon, datos_subdatos$Area_contruida, use = "complete.obs"), 2)),
      x = "Área Construida (m²)",
      y = "Precio (Millones)",
      caption = "Fuente: Datos de Vivienda"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
      axis.title = element_text(size = 12),
      axis.text = element_text(size = 10)
    )
)

Esta gráfica nos permite conocer el coeficiente de correlación entre el área construida de una vivienda y su respectivo precio; con 0.71, concluimos que es un coeficiente alto y por ende la correlación es fuerte.

Modelo de regresión múltiple

mod2 = lm(precio_millon~Area_contruida + Habitaciones + Banos , data =  datos_subdatos)
summary (mod2)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones + 
##     Banos, data = datos_subdatos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -856.62 -142.02  -60.06   84.14  902.01 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    163.27516   57.36820   2.846  0.00465 ** 
## Area_contruida   1.11071    0.07539  14.732  < 2e-16 ***
## Habitaciones    -1.90397   18.60466  -0.102  0.91854    
## Banos           94.04870   14.32087   6.567 1.58e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 258.1 on 405 degrees of freedom
## Multiple R-squared:  0.5643, Adjusted R-squared:  0.561 
## F-statistic: 174.8 on 3 and 405 DF,  p-value: < 2.2e-16

Según este análisis, solo el área construida y el número de baños son altamente significativos a la hora de predecir el precio de una vivienda en Pance. Cada metro cuadrado adicional en una vivienda en Pance aumenta su precio en un aproximado de $1 millón. Cada baño adicional en una vivienda en Pance aumenta su precio al rededor de $94 millones.

El R² es de 0,56; lo que quiere decir que la variabilidad en el precio es explicada en un 56% por el modelo, que en el campo de análisis inmobiliario es decente y útil.

Un p-value < 2,2e⁻¹⁶ quiere decir que el modelo es altamente significativo.

Selección de variables

mod_multiple2=step(mod2)
## Start:  AIC=4546.51
## precio_millon ~ Area_contruida + Habitaciones + Banos
## 
##                  Df Sum of Sq      RSS    AIC
## - Habitaciones    1       697 26972575 4544.5
## <none>                        26971877 4546.5
## - Banos           1   2872254 29844131 4585.9
## - Area_contruida  1  14454054 41425931 4720.0
## 
## Step:  AIC=4544.52
## precio_millon ~ Area_contruida + Banos
## 
##                  Df Sum of Sq      RSS    AIC
## <none>                        26972575 4544.5
## - Banos           1   4014703 30987277 4599.3
## - Area_contruida  1  14924245 41896820 4722.6
summary(mod2)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones + 
##     Banos, data = datos_subdatos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -856.62 -142.02  -60.06   84.14  902.01 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    163.27516   57.36820   2.846  0.00465 ** 
## Area_contruida   1.11071    0.07539  14.732  < 2e-16 ***
## Habitaciones    -1.90397   18.60466  -0.102  0.91854    
## Banos           94.04870   14.32087   6.567 1.58e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 258.1 on 405 degrees of freedom
## Multiple R-squared:  0.5643, Adjusted R-squared:  0.561 
## F-statistic: 174.8 on 3 and 405 DF,  p-value: < 2.2e-16

En este caso, como la única variable que no es significativa en el modelo es el número de habitaciones, la eliminamos en la transformación del modelo.

Validación de supuestos

par(mfrow=c(2,2))
plot(mod2)

  1. Residuals vs Fitted Hay cierta curvatura (especialmente a la derecha), lo cual sugiere que la relación no es perfectamente lineal (posible heterocedasticidad) para valores altos del precio estimado.

  2. Q-Q Residuals En general, los puntos siguen la línea, pero hay colas más gruesas (los extremos se desvían), esto sugiere que los residuos podrían no ser perfectamente normales.

  3. Scale-Location Hay una ligera pendiente ascendente en la línea roja, lo que sugiere que la variabilidad de los residuos crece con el precio, lo que refuerza la posible preocupación por la heterocedasticidad.

  4. Residuals vs Leverage Hay algunos puntos con alto apalancamiento (como el punto 5467), pero ninguno pasa el umbral de Cook’s distance 0.5 de manera preocupante.

Conclusión general El modelo parece razonable, pero no perfecto, por lo que para mejorarlo lo transformaremos haciendo una transformación logarítmica del precio y eliminando variables insignificantes para el precio de viviendas como el número de habitaciones.

Transformación de modelo

mod3=lm(log(precio_millon)~log(Area_contruida)+Banos,data = datos_subdatos)
summary (mod3)
## 
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida) + Banos, 
##     data = datos_subdatos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.75330 -0.14386 -0.01728  0.10979  0.67197 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          3.45015    0.10102  34.154  < 2e-16 ***
## log(Area_contruida)  0.54841    0.02251  24.366  < 2e-16 ***
## Banos                0.05896    0.01095   5.386 1.22e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2151 on 406 degrees of freedom
## Multiple R-squared:  0.7518, Adjusted R-squared:  0.7506 
## F-statistic: 614.9 on 2 and 406 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod3)

  1. Residuals vs Fitted La dispersión de los residuos ahora parece ser más aleatoria y más uniforme a lo largo del rango de los valores ajustados. Esto sugiere que la transformación logarítmica podría haber ayudado a mitigar el problema de la heterocedasticidad.

  2. Q-Q Residuals La mayoría de los puntos ahora se ajustan mucho más cerca de la línea diagonal que antes. Las desviaciones en los extremos parecen haberse reducido considerablemente, especialmente en la cola superior. Esto indica una mejora en la normalidad de los residuos.

  3. Scale-Location La banda de puntos ahora se ve más horizontal y aleatoria en comparación con el gráfico anterior. La tendencia creciente en la dispersión parece haber desaparecido. Esto refuerza la idea de que la transformación logarítmica ayudó a estabilizar la varianza de los residuos.

  4. Residuals vs Leverage Los puntos con alto apalancamiento todavía están presentes, pero los residuos estandarizados asociados con ellos parecen ser generalmente más pequeños que antes.

Conclusiones generales: Aplicar un logaritmo al precio y eliminar la variable Habitaciones parecen haber mejorado significativamente los supuestos del modelo de regresión lineal. La heterocedasticidad y la no normalidad de los residuos se han reducido notablemente. Sin embargo, todavía están presentes puntos con alto apalancamiento con altos residuos estandarizados

Pronóstico hipotético

¿Que pasa al predecir con este modelo transformado, por ejemplo cual seria el precio de una vivienda con 100m² de area construida y 5 baños?

y_log=predict(mod3,list(Area_contruida=200, Banos=5))
exp(y_log)
##        1 
## 773.2386

El precio de una vivienda en Pance que tenga 200 m2 de área construida y 5 baños es aproximadamente de $773 millones.

y_log=predict(mod3,list(Area_contruida=200, Banos=6))
exp(y_log)
##        1 
## 820.1977

El precio de una vivienda en Pance que tenga 200m² de área construida y 6 baños es aproximadamente de $820 millones. Podemos observar un aumento del precio de la vivienda de $47 millones al añadir un baño

Importancia del modelo

Esta es una información muy importante para una constructora que quiera realizar un proyecto en Pance, ya que caería en cuenta que realizar más habitaciones en una vivienda no es un factor significativo para aumentar su precio, sino el número de baños que tenga.