Se utiliza el nuevo dataset, ya filtrado por los docentes, que se encuentra en https://diegokoz.github.io/EEA2019/trabajos_practicos/TP-2/ar_properties.rds
Datos provistos por Properati Argentina
#limpio la memoria
rm(list=ls())
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1912146 102.2 3444281 184.0 2661127 142.2
Vcells 6926901 52.9 24165035 184.4 24165032 184.4
#cargo librerias
library(tidyverse)
library(dplyr)
library(tidyr)
library(ggplot2)
library(lubridate)
library(GGally)
library(modelr)
library(plotly)
library(markdown)
library(corrr)
library(knitr)
library(kableExtra)
options(knitr.table.format = "html")
#seteo el directorio
setwd("~/Silcho/Maestria DM 2019/6 EEA/EEA-TPs")
#leo el archivo .rds
ar_prop2 <- readRDS(file = "ar_properties.rds")
#View(ar_properties)
#muestro la estructura del dataset
glimpse(ar_prop2)
Observations: 45,904
Variables: 8
$ id [3m[38;5;246m<chr>[39m[23m "AfdcsqUSelai1ofCAq2B0Q==", "ESzybdH7YU2uIU1/kHtRGw==", "r22...
$ l3 [3m[38;5;246m<chr>[39m[23m "Velez Sarsfield", "Nuñez", "Almagro", "Almagro", "Almagro",...
$ rooms [3m[38;5;246m<dbl>[39m[23m 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, ...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 95, 44, 40, 49, 40, 40, 40, 49, 40, 40, 40, 32, 40, 36, 90, ...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 69, 38, 37, 44, 37, 37, 37, 44, 37, 37, 37, 30, 34, 33, 90, ...
$ price [3m[38;5;246m<dbl>[39m[23m 199900, 147000, 92294, 115000, 77000, 88900, 88798, 110975, ...
$ property_type [3m[38;5;246m<chr>[39m[23m "Casa", "Departamento", "Departamento", "Departamento", "Dep...
Se crear un modelo para predecir el precio introduciendo todas las demás variables como predictoras. Este modelo presenta un p-valor muy por debajo de 0.01, por lo que la variable precio tiene una alta correlacion con las variables predictoras en su conjunto. A su vez, el modelo arroja un r2 ajustado: 0.776, por lo que es capaz de explicar el 77.6% de la variabilidad observada en el valor del precio. En este modelo se puede observar una ordenada al origen (beta 0): -109406,61 lo que indica que el valor medio del precio es negativo y, por lo tanto, carece de sentido. Por otro lado, se observan tantas pendientes como coeficientes de regresión parciales existen, en este caso son 62. Por ejemplo, si tenemos en cuenta el barrio Agronomía, nos indica que una vivienda situada en ese barrio incrementa 623.53 USD en promedio su precio manteniendo el resto de las variables constantes. Cabe aclarar, que por tratarse de una covariable categorica, el programa R toma como base la primer categoría (orden alfabetico), la cual forma parte del valor del intercep. Es por esto que ese incremento observado tiene como referencia al barrio Abasto. Haciendo un análisis más profundo sobre los coeficientes parciales (variables dummy), se observa que más del 20% (13 de 62) no son significativas, ya que presentan un p-valor >0.05 indicando que no contribuyen en la explicación del precio en este modelo. De todos modos, los 13 casos pertenecen a la variable barrio, por lo que si no se la considera en un futuro modelo, quizás se pueda mejorar la estimación del mismo aunque, en la realidad, el barrio donde está ubicada la propiedad afecta significativamente el precio de la vivienda.
# se genera un modelo con todas las variables (menos "id") como predictoras de la variable price
mod <- lm(price ~ l3 + rooms + bathrooms + surface_total + surface_covered + property_type, data = ar_prop2)
summary(mod)
Call:
lm(formula = price ~ l3 + rooms + bathrooms + surface_total +
surface_covered + property_type, data = ar_prop2)
Residuals:
Min 1Q Median 3Q Max
-400904 -33817 -3307 24660 560915
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -109406.61 4788.67 -22.847 < 2e-16 ***
l3Agronomía 623.53 8846.14 0.070 0.943807
l3Almagro -4520.04 4295.24 -1.052 0.292650
l3Balvanera -24788.27 4551.65 -5.446 5.18e-08 ***
l3Barracas -10128.24 5351.06 -1.893 0.058397 .
l3Barrio Norte 49921.81 4417.82 11.300 < 2e-16 ***
l3Belgrano 69648.12 4283.55 16.259 < 2e-16 ***
l3Boca -47540.60 7076.20 -6.718 1.86e-11 ***
l3Boedo -19034.38 5219.54 -3.647 0.000266 ***
l3Caballito 6220.15 4301.29 1.446 0.148153
l3Catalinas -76321.95 33563.74 -2.274 0.022974 *
l3Centro / Microcentro -29046.49 6781.80 -4.283 1.85e-05 ***
l3Chacarita 11903.39 5299.02 2.246 0.024687 *
l3Coghlan 40820.55 5462.90 7.472 8.02e-14 ***
l3Colegiales 34073.02 4816.54 7.074 1.52e-12 ***
l3Congreso -32314.97 5494.75 -5.881 4.10e-09 ***
l3Constitución -47292.98 6321.63 -7.481 7.50e-14 ***
l3Flores -22510.27 4536.15 -4.962 6.99e-07 ***
l3Floresta -28315.65 5069.38 -5.586 2.34e-08 ***
l3Las Cañitas 90455.90 5883.38 15.375 < 2e-16 ***
l3Liniers -20080.34 5366.27 -3.742 0.000183 ***
l3Mataderos -33863.43 5424.79 -6.242 4.35e-10 ***
l3Monserrat -32431.49 5228.46 -6.203 5.59e-10 ***
l3Monte Castro -8770.72 5949.63 -1.474 0.140445
l3Nuñez 56958.42 4559.69 12.492 < 2e-16 ***
l3Once -30757.83 5456.51 -5.637 1.74e-08 ***
l3Palermo 66169.58 4221.50 15.674 < 2e-16 ***
l3Parque Avellaneda -34398.95 7598.09 -4.527 5.99e-06 ***
l3Parque Centenario -12288.30 5016.45 -2.450 0.014305 *
l3Parque Chacabuco -22537.83 5314.36 -4.241 2.23e-05 ***
l3Parque Chas 5195.26 7542.97 0.689 0.490981
l3Parque Patricios -36808.02 5973.29 -6.162 7.24e-10 ***
l3Paternal -13314.50 5189.69 -2.566 0.010304 *
l3Pompeya -79977.17 8035.74 -9.953 < 2e-16 ***
l3Puerto Madero 259015.83 5095.12 50.836 < 2e-16 ***
l3Recoleta 64088.22 4360.34 14.698 < 2e-16 ***
l3Retiro 26067.40 5281.27 4.936 8.01e-07 ***
l3Saavedra 19492.00 4914.18 3.966 7.31e-05 ***
l3San Cristobal -23739.75 4955.13 -4.791 1.67e-06 ***
l3San Nicolás -26247.55 5168.96 -5.078 3.83e-07 ***
l3San Telmo -5653.85 4877.12 -1.159 0.246356
l3Tribunales -34608.17 8924.63 -3.878 0.000106 ***
l3Velez Sarsfield -25943.69 8303.75 -3.124 0.001783 **
l3Versalles -22232.13 6758.40 -3.290 0.001004 **
l3Villa Crespo 1595.26 4317.54 0.369 0.711770
l3Villa del Parque -3290.17 4866.59 -0.676 0.498997
l3Villa Devoto 13301.39 4807.08 2.767 0.005659 **
l3Villa General Mitre -19170.08 6802.25 -2.818 0.004831 **
l3Villa Lugano -83039.18 6533.35 -12.710 < 2e-16 ***
l3Villa Luro -7579.11 5404.78 -1.402 0.160833
l3Villa Ortuzar 18667.61 6829.18 2.734 0.006269 **
l3Villa Pueyrredón 10516.80 5349.56 1.966 0.049314 *
l3Villa Real -8823.37 8745.56 -1.009 0.313030
l3Villa Riachuelo -32775.66 17171.10 -1.909 0.056298 .
l3Villa Santa Rita -5767.71 6383.86 -0.903 0.366274
l3Villa Soldati -136489.91 18944.29 -7.205 5.90e-13 ***
l3Villa Urquiza 30648.43 4418.91 6.936 4.09e-12 ***
rooms -3961.27 444.58 -8.910 < 2e-16 ***
bathrooms 34040.98 644.28 52.836 < 2e-16 ***
surface_total 919.08 23.52 39.069 < 2e-16 ***
surface_covered 1457.18 28.73 50.715 < 2e-16 ***
property_typeDepartamento 92653.32 2191.23 42.284 < 2e-16 ***
property_typePH 46779.37 2274.94 20.563 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 66580 on 45841 degrees of freedom
Multiple R-squared: 0.7764, Adjusted R-squared: 0.7761
F-statistic: 2568 on 62 and 45841 DF, p-value: < 2.2e-16
Frente a la disputa entre vender un departamento en Abasto con las siguientes características: 120 mts cuadrados cubiertos, con 3 dormitorios y 2 baños y vender un ph en Balvanera con las siguientes características: 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños, se realiza una predicción de sus precios de venta para decidir. En este caso, es preferible poseer un departamento en Abasto porque presenta mayor precio de venta que el ph en Balvanera.
# genero prediccion con determinadas características para conocer su valor esperado
rbind( predict(mod, data.frame(property_type='Departamento', surface_covered=120, l3='Abasto', rooms=3, bathrooms=2, surface_total=120), interval = c("prediction"), level = 0.95),
predict(mod, data.frame(property_type='PH', surface_covered=80, l3='Balvanera', rooms=2, bathrooms=2, surface_total=100), interval = c("prediction"), level = 0.95))%>%
`rownames<-`(c('Depto en Abasto','PH en Balvanera'))%>%
`colnames<-`(c('Precio esperado','prediccion límite_inf','prediccion límite_sup')) %>%
kable() %>%
kable_styling("striped", full_width = F)
| Precio esperado | prediccion límite_inf | prediccion límite_sup | |
|---|---|---|---|
| Depto en Abasto | 324596.4 | 193837.52 | 455355.3 |
| PH en Balvanera | 181226.6 | 50652.16 | 311801.1 |
NA
NA
NA
Se crear un segundo modelo para predecir el precio introduciendo todas las demás variables como predictoras, excepto la variable barrio (l3). Este nuevo modelo presenta un p-valor también muy por debajo de 0.01, por lo que la variable precio tiene una alta correlacion con las variables predictoras en su conjunto. A su vez, el modelo arroja un r2 ajustado menor al modelo anterior, siendo de 0.68, por lo que es capaz de explicar el 68.3% de la variabilidad observada en el valor del precio. En este modelo también presenta una ordenada al origen (beta 0) negativa por lo que carece de sentido. Por otro lado, se observan tantas pendientes como coeficientes de regresión parciales existen, en este caso 6. Por ejemplo, si tenemos en cuenta la variable “bathrooms”, nos indica que al aumentar en una unidad la cantidad de baños de una vivienda, el precio de la misma se incrementa en 42664.6 USD en promedio su precio manteniendo el resto de las variables constantes, lo cual carece de sentido. Todas las variables dummy presentan un p-valor bastante por debajo de 0.05, por lo que todas aportan significancia al modelo generado.
Teniendo en cuenta ambos modelos generados, considero que el que mejor explica la variabilidad del precio es el que incluye la variable barrio (l3) en su estructura por poseer un mayor coeficiente de determinacion multiple (R2 ajustado= 0.77 vs 0.68)
# se genera un segundo modelo con todas las variables (menos "id" y "l3") como predictoras de la variable price
mod2 <- lm(price ~ rooms + bathrooms + surface_total + surface_covered + property_type, data = ar_prop2)
summary(mod2)
Call:
lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
property_type, data = ar_prop2)
Residuals:
Min 1Q Median 3Q Max
-518799 -36177 -9643 25740 724251
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -131096.86 2750.50 -47.66 <2e-16 ***
rooms -13348.53 519.02 -25.72 <2e-16 ***
bathrooms 42664.68 756.37 56.41 <2e-16 ***
surface_total 877.03 27.59 31.79 <2e-16 ***
surface_covered 1783.80 33.53 53.21 <2e-16 ***
property_typeDepartamento 135177.47 2513.93 53.77 <2e-16 ***
property_typePH 68598.52 2677.46 25.62 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79210 on 45897 degrees of freedom
Multiple R-squared: 0.6832, Adjusted R-squared: 0.6831
F-statistic: 1.649e+04 on 6 and 45897 DF, p-value: < 2.2e-16
#muestro comparacion de R2 ajustado entre el primer modelo y éste
rbind(
summary(mod)$adj.r.squared,
summary(mod2)$adj.r.squared)%>%
`rownames<-`(c('Modelo con barrios','Modelo sin barrios'))%>%
`colnames<-`(c('R cuadrado ajustado')) %>%
kable(digits = 4) %>% kable_styling("striped", full_width = F)
| R cuadrado ajustado | |
|---|---|
| Modelo con barrios | 0.7761 |
| Modelo sin barrios | 0.6831 |
En el primer modelo generado, se observa que algunos barrios son significativos, aunque no todos. Es por esto que se crea una nueva variable `pcio_barrio` que divide a los barrios según el precio por metro cuadrado promedio de las propiedades en ellos. El punto de corte que se utiliza para generar cada categoría está en relación a los cuantiles de la variable continua 'precio por metro cuadrado', quedando de la siguiente manera: 'bajo' con precios menores al 25%, 'medio' con precios entre el 25 y 75% y 'alto' con los precios mayores al 75% respecto a su distribución.
# genero un nuevo df con nuevas variables
mod_barrios <- ar_prop2 %>%
mutate(pcio_mt2= price/surface_total,
hasta= quantile(pcio_mt2, .25),
desde= quantile(pcio_mt2, .5) + mad(pcio_mt2))
#agrego al df la variable promedio por barrio de sus precios por m2
mod_barrios<- mod_barrios %>%
group_by(l3) %>%
mutate(pcio_mt2_barrio = mean(pcio_mt2))
# agrego al df una variable categorica, la cual clasifica al barrio segun su precio
mod_barrios<- mod_barrios%>%
mutate(pcio_barrio= case_when(pcio_mt2_barrio < hasta ~ 'bajo',
pcio_mt2_barrio > desde ~ 'alto',
TRUE~ 'medio'))
#veo distribucion de propiedades entre las categorias generadas
table(mod_barrios$pcio_barrio)
alto bajo medio
773 8486 36645
Se crea un tercer modelo que incluye a las nuevas covariables generadas para comprobar si aumentea su eficiencia respecto a los anteriores. En este caso, se observa que éste modelo
Este tercer modelo presenta un p-valor también muy por debajo de 0.01, por lo que la variable precio tiene una alta correlacion con las variables predictoras en su conjunto. Asimismo, el modelo arroja un r2 ajustado de 0.731, por lo que es capaz de explicar el 73.1% de la variabilidad observada en el valor del precio. En adición, todas las covariables presentan p-valor por debajo de 0.001, por lo que todas aportan significancia al modelo generado. La ordenada al origen, en este caso es positiva (USD 68386.82). La nueva covariable generada, por ser categórica utiliza la primer categoría (orden alfabetico) como base dentro del intercept, por lo que en este caso, las categorias ‘bajo’ y ‘medio’ presentan pendientes negativas, siendo la primera la de mayor pendiente. Esto resulta lógico debido a que partiendo, por ejemplo, de viviendas con valores altos (USD 68386.82) su precio disminuye en USD 222651 pasando de la categoria ‘alto’ a ‘bajo’.
Teniendo en cuenta todos los modelos generados, considero que el que mejor explica la variabilidad del precio sigue siendo el primero, que es el que incluye la variable barrio (l3) en su estructura por poseer un mayor coeficiente de determinacion multiple (R2 ajustado= 0.77 vs 0.68 vs 0.73)
# se genera un tercer modelo que incluye las covariables creadas anteriormente
mod3 <- lm(price ~ rooms + bathrooms + surface_total + surface_covered + property_type + pcio_barrio, data = mod_barrios)
summary(mod3)
Call:
lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
property_type + pcio_barrio, data = mod_barrios)
Residuals:
Min 1Q Median 3Q Max
-461248 -34686 -6754 25507 586488
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 68386.82 3747.70 18.25 <2e-16 ***
rooms -8115.18 481.59 -16.85 <2e-16 ***
bathrooms 36526.82 700.04 52.18 <2e-16 ***
surface_total 922.26 25.41 36.29 <2e-16 ***
surface_covered 1611.26 30.94 52.08 <2e-16 ***
property_typeDepartamento 110363.79 2336.14 47.24 <2e-16 ***
property_typePH 54658.28 2472.05 22.11 <2e-16 ***
pcio_barriobajo -222651.71 2787.91 -79.86 <2e-16 ***
pcio_barriomedio -165500.94 2675.62 -61.85 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 72960 on 45895 degrees of freedom
Multiple R-squared: 0.7312, Adjusted R-squared: 0.7312
F-statistic: 1.561e+04 on 8 and 45895 DF, p-value: < 2.2e-16
#muestro comparacion de R2 ajustado entre modelos
rbind(
summary(mod)$adj.r.squared,
summary(mod2)$adj.r.squared,
summary(mod3)$adj.r.squared)%>%
`rownames<-`(c('Modelo con barrios','Modelo sin barrios','Modelo con categ barrios'))%>%
`colnames<-`(c('R cuadrado ajustado')) %>%
kable(digits = 3) %>% kable_styling("striped", full_width = F)
| R cuadrado ajustado | |
|---|---|
| Modelo con barrios | 0.776 |
| Modelo sin barrios | 0.683 |
| Modelo con categ barrios | 0.731 |
#se eliminan columnas que ya no son necesarias
mod_barrios <- mod_barrios %>% select(-c(hasta, desde))
Se procede a la creación de la variable ‘surface_patio’ para eliminar la correlacion existente entre la superficie cubierta y la total.
Se calcula el modelo lineal para todas las variables anteriores, pero con la modificacion recien comentada. Es por eso que el modelo arroja los mismos valores de coeficientes que el anterior.
Como era de esperarse, la covariable ‘sup cubierta’ tiene una pendiente positiva mayor a la covariable ‘sup patio’. Esto explica que las viviendas aumentan su precio en USD 2533.51 por m2 cubierto manteniendo las demás covariables constantes. Por su parte, las viviendas aumentan USD 922.26 por m2 descubierto manteniendo las demás covariables constantes.
#generacion variable 'surface_patio'
mod_barrios <- mod_barrios %>%
mutate(surface_patio = surface_total - surface_covered) %>%
select(-c(surface_total))
# se genera un cuarto modelo incluyendo la variable 'surface_patio' y eliminando la variable 'surface_total'
mod4 <- lm(price ~ rooms + bathrooms + surface_patio + surface_covered + property_type + pcio_barrio, data = mod_barrios)
summary(mod4)
Call:
lm(formula = price ~ rooms + bathrooms + surface_patio + surface_covered +
property_type + pcio_barrio, data = mod_barrios)
Residuals:
Min 1Q Median 3Q Max
-461248 -34686 -6754 25507 586488
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 68386.82 3747.70 18.25 <2e-16 ***
rooms -8115.18 481.59 -16.85 <2e-16 ***
bathrooms 36526.82 700.04 52.18 <2e-16 ***
surface_patio 922.26 25.41 36.29 <2e-16 ***
surface_covered 2533.51 16.31 155.38 <2e-16 ***
property_typeDepartamento 110363.79 2336.14 47.24 <2e-16 ***
property_typePH 54658.28 2472.05 22.11 <2e-16 ***
pcio_barriobajo -222651.71 2787.91 -79.86 <2e-16 ***
pcio_barriomedio -165500.94 2675.62 -61.85 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 72960 on 45895 degrees of freedom
Multiple R-squared: 0.7312, Adjusted R-squared: 0.7312
F-statistic: 1.561e+04 on 8 and 45895 DF, p-value: < 2.2e-16
Para evaluar los supuestos del último modelo lineal generado (mod4) se analizan los residuos del mismo sobre los siguientes graficos de diagnóstico: residuos vs. valores ajustados, QQ plot normal de los residuos estandarizados, raíz cuadrada de los residuos vs. valores ajustados, y los residuos estandarizados vs. leverage.
En el primero gráfico, residuos vs valores ajustados, se puede observar una nube de puntos que aumenta su dispersion de izquierda a derecha, por lo que el supuesto de homocedasticidad de lo errores no se cumple. En la figura de QQ-plot se observa que los residuos estandarizados no se proyectan en su totalidad sobre la recta ideal de normalidad, por lo que tampoco se cumple el supuesto de normalidad. El tercer gráfico confirma que no se cumple con el supuesto de homocedasticidad de los errores, ya que se observa a las raíces cuadradas de los residuos estandarizados en funcion de los valores ajustados y no presentan una dispersion pareja. A su vez, la línea roja muestra una pendiente positiva, cuando idealmente se esperaría una recta horizontal. En el gráfico de residuos vs. leverage no observamos ningún punto influyente, ya que todas las observaciones están dentro de la distancia de Cook.
#genero graficos de residuos
plot(mod4)
A continuación se calcular el siguiente modelo: \[ log(price) = \beta_0 + \beta_1log(rooms) + \beta_2log(bathrooms) + \beta_3log(surface\_covered) + \beta_4property\_type + \beta_5barrio + \beta_6surface\_patio \] Al comparar la performance del modelo anterior (mod4) con éste último (mod5), se observa un aumento en el r2 ajustado, por lo que la variabilidad observada en el valor del precio pasa del 73.1% al 79%. Esto significa que la relación logarítmica de algunas de las covariables que integran el quinto modelo incrementa un 6% la capacidad de explicacion de la variabilidad del precio inmobiliario.
Este quinto modelo presenta un p-valor también muy por debajo de 0.01. A su vez, todas las covariables presentan p-valor por debajo de 0.001, por lo que todas aportan significancia al modelo generado.
Al analizar las covariables en este caso indican que, por ejemplo, por cada aumento de un 1% en la cantidad de cuartos, se reduce en 0.051% el precio esperado de la vivienda manteniendo todas las demas variables constantes.
El error del residuo estandar desciende drásticamente en este ultimo modelo respecto a los anteriores. Por ejemplo, en el modelo anterior era de 72960 y en el actual es 0.25, disminuyendo 5 órdenes de magnitud.
#se genera el quinto modelo tal cual se pide en el enunciado
mod5 <- lm(log(price) ~ log(rooms) + log(bathrooms) + log(surface_covered) + property_type + pcio_barrio + surface_patio, data = mod_barrios)
summary(mod5)
Call:
lm(formula = log(price) ~ log(rooms) + log(bathrooms) + log(surface_covered) +
property_type + pcio_barrio + surface_patio, data = mod_barrios)
Residuals:
Min 1Q Median 3Q Max
-1.31077 -0.16244 -0.00611 0.15683 1.22671
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.910e+00 2.265e-02 393.357 <2e-16 ***
log(rooms) -5.093e-02 4.101e-03 -12.421 <2e-16 ***
log(bathrooms) 1.922e-01 4.128e-03 46.560 <2e-16 ***
log(surface_covered) 8.304e-01 4.812e-03 172.577 <2e-16 ***
property_typeDepartamento 2.713e-01 7.800e-03 34.786 <2e-16 ***
property_typePH 7.551e-02 8.287e-03 9.111 <2e-16 ***
pcio_barriobajo -7.546e-01 9.441e-03 -79.929 <2e-16 ***
pcio_barriomedio -4.603e-01 9.063e-03 -50.792 <2e-16 ***
surface_patio 4.022e-03 8.627e-05 46.622 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.247 on 45895 degrees of freedom
Multiple R-squared: 0.7898, Adjusted R-squared: 0.7898
F-statistic: 2.156e+04 on 8 and 45895 DF, p-value: < 2.2e-16
#muestro comparacion de R2 ajustado entre modelos
rbind(
summary(mod)$adj.r.squared,
summary(mod2)$adj.r.squared,
summary(mod3)$adj.r.squared,
summary(mod5)$adj.r.squared)%>%
`rownames<-`(c('Modelo con barrios','Modelo sin barrios','Modelo con categ barrios','Mod5 - con log'))%>%
`colnames<-`(c('R cuadrado ajustado')) %>%
kable(digits = 3) %>% kable_styling("striped", full_width = F)
| R cuadrado ajustado | |
|---|---|
| Modelo con barrios | 0.776 |
| Modelo sin barrios | 0.683 |
| Modelo con categ barrios | 0.731 |
| Mod5 - con log | 0.790 |
NA
NA
Al observar los gráficos de los residuos del nuevo modelo (mod5) se concluye que en el primero y en el tercero se observan las nubes de puntos con formas muy similares, pero con una leve mejoría (menor extructura) en el caso del nuevo modelo. En el 2do gráfico puede verse que el supuesto de normalidad ajusta mejor en el nuevo modelo, y en el caso de los residuos vs leverage, la distribución es similar pero el nuevo modelo presenta valores más bajos, lo que indica una menor influencia de los puntos extremos.
#genero graficos de residuos
plot(mod5)
Luego de anidar por la variable property_type, se construye un modelos lineal para cada tipo de propiedad. Al realizar el modelo lineal múltiple a cada uno de ellos, se encuentra que los tres presentan un p-valor muy por debajo de 0.01 por lo que la variable precio tiene una alta correlacion con las variables predictoras en conjunto en cada uno de los tres modelos. Sin embargo, se puede observar que el modelo que mejor explica la variablilidad del precio es el que está anidado en base a ‘departamento’, ya que presenta un r2 ajustado superior respecto a los demás. Siendo el 76.2% explicado por el modelo departamento, 64.3% por el modelo ph y 53.4% por el modelo casa. Esto también se puede observar al analizar el desglose de los coeficientes, ya que en el modelo departamento todas las variables explican la variabilidad del precio de manera significativa, en el modelo ph son 5 variables y en el modelo casa son sólo 4 las variables que aportan variabilidad de manera significativa.
# anido los datos
prop_anidada <- mod_barrios %>%
group_by(property_type) %>%
nest()
prop_anidada
#modelo lineal para tipo de propiedad: casa
casa <- lm(price ~ pcio_barrio +rooms+bathrooms+surface_patio+surface_covered,data = prop_anidada$data[[1]])
summary(casa)
Call:
lm(formula = price ~ pcio_barrio + rooms + bathrooms + surface_patio +
surface_covered, data = prop_anidada$data[[1]])
Residuals:
Min 1Q Median 3Q Max
-276263 -55868 -5509 38386 500766
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 50500.4 92591.7 0.545 0.58558
pcio_barriobajo -61429.7 92605.4 -0.663 0.50724
pcio_barriomedio 23119.2 92617.8 0.250 0.80293
rooms 8490.0 2640.9 3.215 0.00134 **
bathrooms 31059.0 3890.3 7.984 3.36e-15 ***
surface_patio 450.6 103.0 4.376 1.32e-05 ***
surface_covered 1114.8 67.7 16.466 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 92370 on 1174 degrees of freedom
Multiple R-squared: 0.5363, Adjusted R-squared: 0.5339
F-statistic: 226.3 on 6 and 1174 DF, p-value: < 2.2e-16
#modelo lineal para tipo de propiedad: departamento
dpto <- lm(price ~ pcio_barrio +rooms+bathrooms+surface_patio+surface_covered,data = prop_anidada$data[[2]])
summary(dpto)
Call:
lm(formula = price ~ pcio_barrio + rooms + bathrooms + surface_patio +
surface_covered, data = prop_anidada$data[[2]])
Residuals:
Min 1Q Median 3Q Max
-517097 -31427 -5298 23968 573217
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 164109.25 2739.13 59.91 <2e-16 ***
pcio_barriobajo -213820.35 2731.22 -78.29 <2e-16 ***
pcio_barriomedio -159693.19 2598.80 -61.45 <2e-16 ***
rooms -13346.71 512.02 -26.07 <2e-16 ***
bathrooms 31850.30 747.46 42.61 <2e-16 ***
surface_patio 1104.84 31.36 35.23 <2e-16 ***
surface_covered 2943.54 18.09 162.72 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 70370 on 40348 degrees of freedom
Multiple R-squared: 0.7617, Adjusted R-squared: 0.7616
F-statistic: 2.149e+04 on 6 and 40348 DF, p-value: < 2.2e-16
#modelo lineal para tipo de propiedad: ph
ph <- lm(price ~ pcio_barrio +rooms+bathrooms+surface_patio+surface_covered,data = prop_anidada$data[[3]])
summary(ph)
Call:
lm(formula = price ~ pcio_barrio + rooms + bathrooms + surface_patio +
surface_covered, data = prop_anidada$data[[3]])
Residuals:
Min 1Q Median 3Q Max
-246964 -35298 -2992 25924 310280
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 66294.30 23472.59 2.824 0.00476 **
pcio_barriobajo -67221.23 23451.40 -2.866 0.00417 **
pcio_barriomedio -8629.84 23423.90 -0.368 0.71258
rooms -258.08 1136.38 -0.227 0.82035
bathrooms 25405.02 1623.67 15.647 < 2e-16 ***
surface_patio 540.36 37.50 14.409 < 2e-16 ***
surface_covered 1371.98 33.64 40.787 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 57260 on 4361 degrees of freedom
Multiple R-squared: 0.6432, Adjusted R-squared: 0.6427
F-statistic: 1310 on 6 and 4361 DF, p-value: < 2.2e-16
#muestro comparacion de R2 ajustado entre modelos por tipo de propiedad
rbind(
summary(casa)$adj.r.squared,
summary(dpto)$adj.r.squared,
summary(ph)$adj.r.squared) %>%
`rownames<-`(c('Modelo casa','Modelo departamento','Modelo ph'))%>%
`colnames<-`(c('R cuadrado ajustado')) %>%
kable(digits = 3) %>% kable_styling("striped", full_width = F)
| R cuadrado ajustado | |
|---|---|
| Modelo casa | 0.534 |
| Modelo departamento | 0.762 |
| Modelo ph | 0.643 |
NA