Datos de ofertas de Vivienda (Fuente Finca Raiz Cali)

Los siguientes datos corresponden a ofertas de vivienda (casas y apartamentos) de la ciudad de Cali 2019-2 que se ofrecen por medio de la plataforma finca raíz. La base contiene 8322 registros que se han filtrado según las especificaciones de este informe.

Filtrar Base de Datos

A continuación se procede con el enfoque en un segmento de la base de datos: Ofertas en el Norte de la ciudad menores a 500 MM COP, solo apartamentos y áreas menores a 300 mt2.

Con los filtros realizados se obtienen 1077 datos.

library(readxl)
library(ggplot2)
library(plotly)
library(leaflet)
Datos_Vivienda <- read_excel("C:/Users/Isabella/Downloads/Datos_Vivienda.xlsx")
criterios=Datos_Vivienda$Zona=="Zona Norte"&Datos_Vivienda$precio_millon<500&Datos_Vivienda$Tipo=="Apartamento"&Datos_Vivienda$Area_contruida<300
Datos_filtro=Datos_Vivienda[criterios,]
table(Datos_filtro$Zona)
## 
## Zona Norte 
##       1077
table(Datos_filtro$Tipo)
## 
## Apartamento 
##        1077
summary(Datos_filtro$precio_millon)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    65.0   132.0   220.0   233.8   320.0   495.0       3
View(Datos_filtro)
head(Datos_filtro,3)
## # A tibble: 3 x 12
##   Zona  piso  Estrato precio_millon Area_contruida parqueaderos Banos
##   <chr> <chr>   <dbl>         <dbl>          <dbl> <chr>        <dbl>
## 1 Zona~ 2           3           135             56 1                1
## 2 Zona~ NA          3            78             54 2                1
## 3 Zona~ NA          5           340            106 2                2
## # ... with 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## #   cordenada_longitud <dbl>, Cordenada_latitud <dbl>

Mapa de Localización de Ofertas

El siguiente es el mapa con las coordenadas de los apartamentos en la Zona norte, menores a 500 MM COP y con áreas menores a 300 mt2. Se puede observar que hay un número considerable de ofertas que supuestamente deberían estar ubicadas en la zona Norte pero aparecen en el Sur, en otras Zonas de la ciudad o incluso por fuera de Cali y esto se debe a que están codificadas erróneamente en la fuente de finca raíz o quienes suben las ofertas han puesto mal la dirección:

leaflet() %>% addCircleMarkers(lng=Datos_filtro$cordenada_longitud,lat=Datos_filtro$Cordenada_latitud,radius=0.1, color = "blue", label = Datos_filtro$precio_millon, opacity = 0.9)%>% addTiles()

Explorar la relación entre el precio, Area Construida y Estrato

Se explora la relación entre precio, el area construida y el Estrato:

Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
g1=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=Estrato))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g1)

Se observa en la figura que existe una relación directa entre el precio de la vivienda y el área construida, indicando lo que se espera que a mayor área la vivienda incrementa su precio en promedio. También vemos que las líneas a medida que el Estrato aumenta tienen mayor intercepto indicando que el precio base por estrato también se incrementa. Hay que tener presente que la base es el estrato 3.

Explorar la relación entre el precio, Area Construida y Si tiene parquedero

Se explora la relación entre precio, el area construida y si el apartamento tiene parqueadero

Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$tiene_parqueadero=as.character(Datos_filtro$tiene_parqueadero)
g2=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=tiene_parqueadero))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g2)

Se observa en la figura que existe una relación directa entre el precio de la vivienda y el si tiene parqueadero, indicando que el precio base cambia si el apartamento tiene o no el mismo. Lo anterior tiene sentido, porque los parqueaderos normalmente cuando son propios están escriturados y pagan predial.

Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
Datos_filtro$tiene_parqueadero=as.character(Datos_filtro$tiene_parqueadero)
Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
g3=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=Estrato))+geom_point()+theme_bw()+geom_smooth(method = "lm")+facet_grid(~tiene_parqueadero)
ggplotly(g3)

Estimación del Modelo para precio del apartamento

Lo primero que hay que considerar es que acá estamos suponiendo una relación lineal entre la variable dependiente y las variables independientes o explicativas.

La base de datos incluye 12 variables:

  1. Zona.
  2. Piso.
  3. Estrato.
  4. Precio Millón.
  5. Área Construida.
  6. Parqueadero.
  7. Baños.
  8. Habitaciones.
  9. Tipo.
  10. Barrio.
  11. Coordenada Longitud.
  12. Coordenada Latitud.

En este caso, vamos a considerar la variable precio_millon como variable de interés y en función del área construida y de dos variables categóricas que son el estrato y si el predio tiene o no parqueaderos.

Las otras variables se descartan porque están contenidas dentro de las ya incluidas y pueden generar multicolinealidad en el modelo. Por ejemplo, la cantidad de habitaciones y baños, está contenido dentro del área. Las coordenadas y el barrio están dentro de la variable zona, la cual fue uno de los filtros iniciales a la base de datos (solo estamos trabajando con la zona norte)

Nota: cuando se corrió un modelo incluyendo todas las variables el ajuste R-cuadrado ajustado, se mantuvo en el 75%

Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
mod1=lm(precio_millon~Area_contruida+Estrato+tiene_parqueadero, data=Datos_filtro)
summary(mod1)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida + Estrato + tiene_parqueadero, 
##     data = Datos_filtro)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -242.442  -31.795   -0.944   27.529  223.738 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            49.03852    5.03387   9.742  < 2e-16 ***
## Area_contruida          1.04332    0.06037  17.281  < 2e-16 ***
## Estrato4               61.87913    4.84558  12.770  < 2e-16 ***
## Estrato5              146.16586    4.98649  29.312  < 2e-16 ***
## Estrato6              204.47149    9.27649  22.042  < 2e-16 ***
## tiene_parqueaderoTRUE  15.54122    3.98543   3.900 0.000102 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 54.8 on 1071 degrees of freedom
## Multiple R-squared:  0.7541, Adjusted R-squared:  0.7529 
## F-statistic: 656.9 on 5 and 1071 DF,  p-value: < 2.2e-16

Interpretación de los Estimadores y supuestos:

El modelo presenta un R-cuadrado ajustado de 0.7529, lo cual quiere decir que el modelo logra explicar en un 75.29% el precio en millones de la vivienda.

Antes de proceder con el análisis de los coeficientes vamos a validar los supuestos del modelo.

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

Los gráficos muestran que los supuestos del modelo están bien. El grafico QQ muestra que hay normalidad y el grafico Residual Vs Fitted value muestra que hay linealidad.En caso de que se violara algún supuesto, por ejemplo el de linealidad, se puede proceder con una transformación del modelo como lo sería el caso de una transformación logarítmica.

Teniendo en cuenta lo anterior para mejorar el R-cuadrado ajustado de la regresión lineal o mejor dicho para mejorar el ajuste del modelo, se recomienda incluir otras variables que pueden ser determinantes en el precio de la vivienda, como lo son la seguridad del sector, los parques, las vías, el acceso al transporte publico entre otras cualitativas.

Una vez validados los supuestos del modelo, se procede a validar la significancia estadística, para este caso, todos los coeficientes son estadísticamente significativos, a continuación su interpretación.

Intercepto: Teniendo en cuenta el estrato 3 como base, podemos concluir que el precio del lote es 49 millones de pesos, es decir cuando no hay nada construido, y no se tienen parqueaderos.

Coeficiente área Construida (Area_construida): Por cada metro cuadrado construido el precio de la vivienda incrementa en 1.04 millones de pesos.

Coeficiente Estrato 4: Estar en estrato 4 incrementa el precio de la vivienda en 61.87 millones de pesos con respecto al estrato 3 (categoría base).

Coeficiente Estrato 5: Estar en estrato 5 incrementa el precio de la vivienda en 146.16 millones de pesos con respecto al estrato 3 (categoría base).

Coeficiente Estrato 6: Estar en estrato 6 incrementa el precio de la vivienda en 204.47 millones de pesos con respecto al estrato 3 (categoría base).

Coeficiente Tiene_Parqueadero: Que la vivienda tenga parqueadero propio, incrementa el precio de esta en 15.54 millones de pesos.

Predicciones

En esta sección se procederá a predecir el precio de un apartamento con 100 mt2, de estrato 4 y con parqueadero y se analizará si este apartamento lo están ofreciendo en 450 millones es una buena oferta.

Una vez identificado que el mejor modelo es precio_millon=B0+B1Area_contruida+B2Estrato+B3Tiene_parqueadero+E se procede con la predicción solicitada.

preciomedio_estimadodemercado=predict(mod1,list(Area_contruida=100,Estrato="4",tiene_parqueadero=TRUE))
preciomedio_estimadodemercado
##        1 
## 230.7909

Teniendo en cuenta que el modelo arroja que el precio estimado del mercado es 230.79 millones de pesos, la oferta está sobrevalorada en 219.21 millones de pesos y se recomienda no tomarla. La diferencia en el precio es muy significativa, ni siquiera parece poderse explicar con acabados de lujo para un apartamento en la zona norte de 100 metros cuadrados en estrato 4. dicha diferencia podría estar explicada por variables cualitativas (seguridad, transporte, etc.) como las mencionadas con anterioridad, sin embargo, es casi el doble del precio estimado de mercado, la oferta parece estar muy sobrevalorada en cualquier escenario.

Opciones potenciales y sugerencias:

Teniendo en cuanta que hay una persona interesada en un apartamento en la zona norte con más de 100 mt2 de área, de estrato 4, que tenga parqueadero y tenga encuentra que la persona tiene un crédito preaprobado de máximo 400 millones de pesos, se presentan 5 opciones de apartamentos potenciales. Tal como lo muestra el mapa las 5 se encuentran ubicadas en la Zona norte de la ciudad, es decir que no hay errores de registro de la Zona y la dirección para las mismas en la fuente Finca raíz Cali. Dos de las alternativas están ubicados en el barrio San Vicente, una en Versalles, otra en Campiña y por último en Santa Mónica.

precio_modelo=mod1$fitted.values
precio_real=Datos_filtro$precio_millon
area=Datos_filtro$Area_contruida
tiene_p=Datos_filtro$tiene_parqueadero
estrato=Datos_filtro$Estrato

potencial=precio_modelo-precio_real
target=potencial>0&precio_real>=100&precio_real<=400&area>=100&estrato=="4"&tiene_p==TRUE

table(target)
## target
## FALSE  TRUE 
##  1072     5
Datos_filtro$potencial=round(potencial,1)

Datos_recomendados=Datos_filtro[target,]
Datos_recomendados
## # A tibble: 5 x 14
##   Zona  piso  Estrato precio_millon Area_contruida parqueaderos Banos
##   <chr> <chr> <chr>           <dbl>          <dbl> <chr>        <dbl>
## 1 Zona~ 4     4                 185           104  1                3
## 2 Zona~ 6     4                 270           152  1                3
## 3 Zona~ 3     4                 300           287  1                3
## 4 Zona~ 4     4                 190           104. 1                3
## 5 Zona~ NA    4                 280           173  2                3
## # ... with 7 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## #   cordenada_longitud <dbl>, Cordenada_latitud <dbl>, tiene_parqueadero <lgl>,
## #   potencial <dbl>
leaflet() %>% addCircleMarkers(lng = Datos_recomendados$cordenada_longitud,lat = Datos_recomendados$Cordenada_latitud,radius = 0.05,color = "blue",label  = paste("Potencial=",Datos_recomendados$potencial,";","Precio venta=",Datos_recomendados$precio_millon),opacity = 0.9)%>% addTiles()

Anexo:

Se intento una transformación logaritmica del modelo:

Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"

mod2=lm(log(precio_millon)~Area_contruida+Estrato+tiene_parqueadero, data=Datos_filtro)
summary(mod2)
## 
## Call:
## lm(formula = log(precio_millon) ~ Area_contruida + Estrato + 
##     tiene_parqueadero, data = Datos_filtro)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.88986 -0.14592  0.01888  0.16240  1.02666 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           4.4664295  0.0206619  216.17  < 2e-16 ***
## Area_contruida        0.0040291  0.0002478   16.26  < 2e-16 ***
## Estrato4              0.4225632  0.0198891   21.25  < 2e-16 ***
## Estrato5              0.7603609  0.0204675   37.15  < 2e-16 ***
## Estrato6              0.9200525  0.0380761   24.16  < 2e-16 ***
## tiene_parqueaderoTRUE 0.0966817  0.0163585    5.91 4.59e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2249 on 1071 degrees of freedom
## Multiple R-squared:  0.8006, Adjusted R-squared:  0.7997 
## F-statistic:   860 on 5 and 1071 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod2)

Con esta transformación se puede ver que los supuesto de normalidad se mantiene, el de linealidad se afecta un poco tomando una forma mas concava. Aunque el R-cuadrado ajustado mejora a un 80 % no tiene sentido transformar un modelo cuyos sipuestos estan bien.

Sacandole exponencial al modelo podemos ver como serían los coeficientes.

Sacar exponencial para poder interpretar los Coeficientres.

Intercepto=exp(4.4664295) ##  Estrato 3
Intercepto
## [1] 87.04537
Coeficiente_Area_construida=exp(0.0040291) 
Coeficiente_Area_construida
## [1] 1.004037
Coeficiente_Estrato4=exp(0.4225632)
Coeficiente_Estrato4
## [1] 1.525868
Coeficiente_Estrato5=exp(0.7603609)
Coeficiente_Estrato5
## [1] 2.139048
Coeficiente_Estrato6=exp(0.9200525)
Coeficiente_Estrato6
## [1] 2.509422
Coeficiente_Tiene_parqueadero=exp(0.0966817)
Coeficiente_Tiene_parqueadero
## [1] 1.10151

se corrobora que estos coeficientes no tienen mucho sentido. teniendo en cuenta que la base es el estrato 3, no lógico pensar que el cambio de estrato 3 al 6 aumente solo en 1.1 millones de pesos el precio de la vivienda de la zona norte, del mismo modo, puede pensarse de los demás coeficientes.Por tanto se toma en cuenta el primer modelo aún cuando su R-cuadrado ajustado es menor, pues el mismo se debe mejorar incluyendo otras variables importantes, como las cualitativas de seguridad, parques cercanos, transporte y etc. mas no modificando la relación entre la variable dependiente y las variables explicativas.