library(tidyverse)
dataset<-readRDS("ar_properties.rds")
Modelo_1<-lm(price ~ l3+rooms+bathrooms+surface_total+surface_covered+property_type, data = dataset)
Al aplicar un modelo lineal sobre todas las variables que se tienen se observan que el modelo contiene 63 parámetros, de los cuales 50 resultaron significativos (p values menor o igual a 0.05).
Para la interpretación de los parámetros, por ejemplo para la variable rooms:
Por otro lado se observó un R cuadrado ajustado igual a 0.7761. y también se obtuvo que el modelo resulto estadísticamente significativo (F=2568 Y PValue<=0.05).
summary(Modelo_1)
##
## Call:
## lm(formula = price ~ l3 + rooms + bathrooms + surface_total +
## surface_covered + property_type, data = dataset)
##
## 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
length(Modelo_1$coefficients)
## [1] 63
Para analizar la significatividad de las variables dummy se recurre a aplicar anova al modelo.En el se realiza el test de hipótesis de si la diferencia de medias de los precios en cada grupo es la misma o difiere. En el mismo podemos observar que todas las variables resultan significativas al 5%. Es decir, que la variable l3 afecta al precio en al menos uno de sus grupos.
anova(Modelo_1)
## Analysis of Variance Table
##
## Response: price
## Df Sum Sq Mean Sq F value Pr(>F)
## l3 56 1.8443e+14 3.2934e+12 742.95 < 2.2e-16 ***
## rooms 1 3.0174e+14 3.0174e+14 68067.54 < 2.2e-16 ***
## bathrooms 1 9.7588e+13 9.7588e+13 22014.36 < 2.2e-16 ***
## surface_total 1 9.6762e+13 9.6762e+13 21827.91 < 2.2e-16 ***
## surface_covered 1 1.2667e+13 1.2667e+13 2857.40 < 2.2e-16 ***
## property_type 2 1.2491e+13 6.2453e+12 1408.85 < 2.2e-16 ***
## Residuals 45841 2.0321e+14 4.4329e+09
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Es preferible vender “un departamento de 120 mts cuadrados cubiertos en abasto, con 3 dormitorios y 2 baños ya que el valor estimado del precio de venta es mayor.
Propuesta_1 <- predict(Modelo_1,
newdata = data.frame(l3 = "Abasto", rooms = 3, bathrooms=2, surface_total=120, surface_covered=120, property_type="Departamento"), se.fit = FALSE)
Propuesta_2 <- predict(Modelo_1,
newdata = data.frame(l3 = "Balvanera", rooms = 2, bathrooms=3, surface_total=100, surface_covered=80, property_type="PH"), se.fit = FALSE)
c(Propuesta_1,
Propuesta_2)
## 1 1
## 324596.4 215267.6
Al realizar dicho modelo se observó que todas las variables resultaron significativas al 5%. Por otro lado se encontró que el R cuadrado ajustado de 0.6831. El modelo resultó significativo (F=1.649e+04 Y P_asociada=2.2e-16<0.05) El precio de las propiedades es en promedio 42664.68 ante incrementos unitarios en la variable bathrooms, cuando las dem?s variables permanecen constantes.
Modelo_2<-lm(price ~ rooms+bathrooms+surface_total+surface_covered+property_type, data = dataset)
summary(Modelo_2)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## property_type, data = dataset)
##
## 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
El mejor modelo que ajusta a los datos es el primero ya que se obtiene un R cuadrado ajusstado superior al segundo
Para crear los grupos Bajo, medio y alto se analizaron los precios promedios por barrio. En el se observan que tiene una distribución asimétrica hacia la derecha
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
dataset%>%
group_by(l3)%>%
summarise(Precio_prom=mean(price,na.rm=TRUE))%>%
# ggplot()+
# aes(Precio_prom)+
# geom_histogram(bins = 20,col="blue",
# fill="blue",
# alpha = .2)+
# scale_x_continuous(labels = comma)+
# theme_minimal()%>%
summary(Precio_prom)
## l3 Precio_prom
## Length:57 Min. :115106
## Class :character 1st Qu.:144323
## Mode :character Median :164325
## Mean :184638
## 3rd Qu.:194193
## Max. :512831
dataset%>%
group_by(l3)%>%
summarise(Precio_prom=mean(price,na.rm=TRUE))%>%
ggplot()+
aes(Precio_prom)+
geom_histogram(bins = 20,col="blue",
fill="blue",
alpha = .2)+
scale_x_continuous(labels = comma)+
theme_minimal()
# summary(Precio_prom)
# arrange(-Precio_prom)
En base a lo observado, para definir los grupos se decidecortar la variable precios de la siguiente manera:
* Bajos: precios <=160000
* Medios:entre 160000 y 300000
* Altos: Mayores a 300000
dataset_barrio<-dataset%>%
group_by(l3)%>%
summarise(Precio_prom=mean(price,na.rm=TRUE))%>%
mutate(Grupo_barrio=case_when(Precio_prom<=160000~"Bajo",
Precio_prom>160000 & Precio_prom<=300000~"Medio",
Precio_prom>250000~"Alto"))%>%
select(l3,Grupo_barrio)
La nueva variable queda compuesta de la siguiente forma:
dataset<-dataset%>%
left_join(dataset_barrio,by="l3")%>%
select(-l3)
head(dataset)
## # A tibble: 6 x 8
## id rooms bathrooms surface_total surface_covered price property_type
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Afdc~ 3 2 95 69 199900 Casa
## 2 ESzy~ 1 1 44 38 147000 Departamento
## 3 r22O~ 1 1 40 37 92294 Departamento
## 4 atZQ~ 1 1 49 44 115000 Departamento
## 5 R7Is~ 1 1 40 37 77000 Departamento
## 6 Tur/~ 1 1 40 37 88900 Departamento
## # ... with 1 more variable: Grupo_barrio <chr>
table(dataset$Grupo_barrio)
##
## Alto Bajo Medio
## 3327 10187 32390
Al aplicar el nuevo modelo se observa que todos los parametros resultaron significativos al 5%. Se obtuvo un R cuadrado ajustado de 0.7176. El ajuste del modelo resultó significativo.
Interpretación de parametros:
* Superficie total: En promedio el precio de las propiedades aumenta 884.38 a medida que hay incrementos unitarios en lavarile superficie total, permaneciendo constantes las otras variables. * Grupo_barrioBajo: En promedio el precio de las propiedades disminuye -108906.78 cuando la propiedad se encuentra en un barrio con precios bajos que para las propiedades que se encuentran en barrios con precios altos, permaneciendo constantes las otras variables.
Modelo_3<-lm(price ~ rooms+bathrooms+surface_total+surface_covered+property_type+Grupo_barrio, data = dataset)
summary(Modelo_3)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## property_type + Grupo_barrio, data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -491181 -36056 -6035 24570 658081
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -38313.81 3043.80 -12.59 <2e-16 ***
## rooms -10633.86 491.31 -21.64 <2e-16 ***
## bathrooms 38987.45 716.79 54.39 <2e-16 ***
## surface_total 884.38 26.10 33.89 <2e-16 ***
## surface_covered 1625.16 31.85 51.02 <2e-16 ***
## property_typeDepartamento 118106.68 2385.86 49.50 <2e-16 ***
## property_typePH 61677.83 2530.10 24.38 <2e-16 ***
## Grupo_barrioBajo -108906.78 1538.84 -70.77 <2e-16 ***
## Grupo_barrioMedio -63067.94 1389.47 -45.39 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 74780 on 45895 degrees of freedom
## Multiple R-squared: 0.7176, Adjusted R-squared: 0.7176
## F-statistic: 1.458e+04 on 8 and 45895 DF, p-value: < 2.2e-16
El nuevo modelo obtuvo un R cuadrado de 0.71, mientras el que utilizaba todos los barrios obtuvo uno de 0.77. Es preferible utilizar el nuevo modelo ya que el valor de R cuadrado es parecido y estima menos parámetros.
Interpretación de parametros:
* surface_covered: En promedio el precio de las propiedades aumenta 2509.54 a medida que hay incrementos unitarios en la variable surface_covered, permaneciendo constantes las otras variables.
* surface_patio: En promedio el precio de las propiedades aumenta 884.38 a medida que hay incrementos unitarios en la variable surface_patio, permaneciendo constantes las otras variables.
Cabe mencionar, como se hizo una transformación en la variable surface_total y ahora la información que antes tenía surface_total esta contenida en la variable surface_patio, coeficiente de esete último es el mismo pero varió el coeficiente asociado a la variable surface_covered
dataset<-dataset %>%
mutate(surface_patio=surface_total - surface_covered )
Modelo_4<-lm(price ~ rooms+bathrooms+surface_patio+surface_covered+property_type+Grupo_barrio, data = dataset)
summary(Modelo_4)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_patio + surface_covered +
## property_type + Grupo_barrio, data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -491181 -36056 -6035 24570 658081
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -38313.81 3043.80 -12.59 <2e-16 ***
## rooms -10633.86 491.31 -21.64 <2e-16 ***
## bathrooms 38987.45 716.79 54.39 <2e-16 ***
## surface_patio 884.38 26.10 33.89 <2e-16 ***
## surface_covered 2509.54 16.81 149.27 <2e-16 ***
## property_typeDepartamento 118106.68 2385.86 49.50 <2e-16 ***
## property_typePH 61677.83 2530.10 24.38 <2e-16 ***
## Grupo_barrioBajo -108906.78 1538.84 -70.77 <2e-16 ***
## Grupo_barrioMedio -63067.94 1389.47 -45.39 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 74780 on 45895 degrees of freedom
## Multiple R-squared: 0.7176, Adjusted R-squared: 0.7176
## F-statistic: 1.458e+04 on 8 and 45895 DF, p-value: < 2.2e-16
En primer lugar, podemos observar que los residuos se concentral al rededor del 0
library(modelr)
residuos<-dataset%>%
add_residuals(Modelo_4)
# ggplot(data=residuos,aes(resid)) +
# geom_freqpoly(binwidth = 0.5)
mean(residuos$resid)
## [1] 4.243773e-08
ggplot(data=residuos,aes(resid)) +
geom_freqpoly()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
El primer gráfico se muestran los Residuos versus el modelo ajustado: en el mismo, se puede ver que a medida que aumentan los valores ajustados, los residuos se alejan del 0.
El segundo grafico es un QQ Plot Normal.: En el observamos la distribución teórica versus la de los residuos. En la misma podemos ver que se aleja de la distribución teóricas en las colas de la gráfica
Scale-location plot: Este grafico es similar al primero pero se grafica la raiz cuadrada de los residuos estandarizados. En ella vemos que no hay ningún patrón.
Scale vs leverage: El leverage mide cuan influyentes son los puntos en el modelo. Se observan algunos puntos alejados (en la derecha de la gráfica)
Por lo tanto podemos decir que no se cumple el supuesto de homocedasticidad, ni de normalidad de los residuos.
plot(Modelo_4)
Con el nuevo modelo se encontró que todos los parámetros son significativos al 5% Por otro lado se encontró un R cuadrado ajustado de 0.78, superior al encontrado anteriormente (0.71).
* Rooms (log): ante incrementos del 1% en las variable rooms, el precio de las propiedades disminuye en un 0.06%.
* Bathrooms (log): ante incrementos del 1% en las variable Bathrooms, el precio de las propiedades aumenta en un 0.2% * surface_patio: ante incrementos unitarios en la variable surface_patio, manteniendo el resto de las variables constantes, aumenta el precio en promedio de las propiedades en un 0.3%.
Modelo_5<-lm(log(price) ~ log(rooms)+log(bathrooms)+log(surface_covered)+property_type+Grupo_barrio+surface_patio,data = dataset)
summary(Modelo_5)
##
## Call:
## lm(formula = log(price) ~ log(rooms) + log(bathrooms) + log(surface_covered) +
## property_type + Grupo_barrio + surface_patio, data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.34489 -0.16274 -0.00398 0.15259 1.29089
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.650e+00 2.176e-02 397.43 <2e-16 ***
## log(rooms) -6.713e-02 4.192e-03 -16.01 <2e-16 ***
## log(bathrooms) 2.011e-01 4.233e-03 47.52 <2e-16 ***
## log(surface_covered) 8.205e-01 4.963e-03 165.34 <2e-16 ***
## property_typeDepartamento 3.210e-01 7.965e-03 40.30 <2e-16 ***
## property_typePH 1.155e-01 8.486e-03 13.61 <2e-16 ***
## Grupo_barrioBajo -4.386e-01 5.220e-03 -84.03 <2e-16 ***
## Grupo_barrioMedio -2.015e-01 4.710e-03 -42.78 <2e-16 ***
## surface_patio 3.766e-03 8.865e-05 42.48 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2534 on 45895 degrees of freedom
## Multiple R-squared: 0.7789, Adjusted R-squared: 0.7788
## F-statistic: 2.02e+04 on 8 and 45895 DF, p-value: < 2.2e-16
Al analizar los residuos del nuevo modelo se encuentra una mejora, ya que en el QQ Plot Normal, la distribución de los resduos del nuevo modelo se asemejan mejor a la distribución teórica. Y, por otro lado, el gráfico de los residuos versus los valores ajustados no muestra ningún patrón.
plot(Modelo_5)
dataset_anidado<-dataset%>%
group_by(property_type)%>%
nest()
Al ajustar un modelo para cada tipo de propiedad, se puede ver una clara diferencia en los R cuadrados ajustados, se obtuvo un r cuadrado ajustado de 0.749 para departamentos y uno de 0.482 para casas. Cabe mencionar que la cantidad de observaciones difiere bastante entre cada uno de los modelos.
library(broom)
##
## Attaching package: 'broom'
## The following object is masked from 'package:modelr':
##
## bootstrap
Propiedad_modelo <- function(df) {
lm(price ~ rooms+bathrooms+surface_patio+surface_covered+Grupo_barrio, data = df)
}
dataset_anidado<-dataset_anidado%>%
mutate(model = map(data, Propiedad_modelo))
Resultados_anidados2 <- dataset_anidado %>%
mutate(Res = map(model, glance),
tdy = map(model, tidy)) %>%
unnest(tdy, .drop=TRUE)
Resultados_anidados <- dataset_anidado %>%
mutate(Res = map(model, glance),
tdy = map(model, tidy)) %>%
unnest(Res, .drop=TRUE)
Resultados_anidados
## # A tibble: 3 x 12
## property_type r.squared adj.r.squared sigma statistic p.value df
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1 Casa 0.485 0.482 97360. 184. 3.34e-165 7
## 2 Departamento 0.749 0.749 72277. 20024. 0. 7
## 3 PH 0.607 0.607 60082. 1124. 0. 7
## # ... with 5 more variables: logLik <dbl>, AIC <dbl>, BIC <dbl>,
## # deviance <dbl>, df.residual <int>
Por último, se puede observar que la variable rooms no resulta significativa en modelo para PH. Es decir el precio de las propiedades en los PH no depende de de la cantidad de habitaciones. Por otro lado, se puede observar como tambien esta variable rooms, toma signos distintos el coeficiente para casa y departament (en el modelo para CASA el coeficiente es positivo, mientras que para “Departamento” es negativo)
library(DT)
Resultados_anidados2%>% arrange(term)%>%select(1,2,3,6)%>%
mutate(Es_significativa=ifelse(p.value<=0.05,"Si","No"))%>%
datatable(selection = 'single',
rownames = FALSE,
escape = FALSE,
extensions = 'Scroller',
options = list(dom = 't',
scrollY = 500,
scroller = TRUE,
paging=TRUE,
autoWidth = TRUE,
columnDefs = list(list(width = '80px', className = 'dt-center',
targets = "_all"))))