Cargo las librerias
library(tidyverse)
library(knitr)
library(kableExtra)
library(ggplot2)
library(GGally)
library(ggthemes)
Cargo el dataset
properati<-read_rds(path = "ar_properati.rds")
write_rds(properati,"ar_properati.rds")
El dataset de Properati cuenta información de avisos inmobiliarios para cuatro países (Argentina, Brasil, Uruguay y EEUU). Entre las principales variables del dataset se destacan: fecha de al aviso, longitud y latitud de la propiedad, localidad, barrio, tipo de propiedad, cantidad de habitaciones, metros cuadrados cubiertos y totales y precio.
glimpse(properati)
Observations: 388,891
Variables: 24
$ id [3m[38;5;246m<fct>[39m[23m S0we3z3V2JpHUJreqQ2t/w==, kMxcmAS8NvrynGBVbMOEaQ==, Ce3ojF+ZTOkB8d+LI9dpxg==, AUGpj3raGmOCiulSM...
$ ad_type [3m[38;5;246m<fct>[39m[23m Propiedad, Propiedad, Propiedad, Propiedad, Propiedad, Propiedad, Propiedad, Propiedad, Propied...
$ start_date [3m[38;5;246m<fct>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14,...
$ end_date [3m[38;5;246m<fct>[39m[23m 2019-06-14, 2019-04-16, 9999-12-31, 9999-12-31, 2019-07-09, 2019-08-08, 2019-07-10, 2019-06-14,...
$ created_on [3m[38;5;246m<fct>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14,...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.94331, -34.63181, NA, -34.65471, -34.65495, -32.93547, -34.65183, -34.91213, -34.60338, NA,...
$ lon [3m[38;5;246m<dbl>[39m[23m -54.92966, -58.42060, NA, -58.79089, -58.78712, -60.68398, -58.65912, -54.84749, -58.43450, NA,...
$ l1 [3m[38;5;246m<fct>[39m[23m Uruguay, Argentina, Argentina, Argentina, Argentina, Argentina, Argentina, Uruguay, Argentina, ...
$ l2 [3m[38;5;246m<fct>[39m[23m Maldonado, Capital Federal, Bs.As. G.B.A. Zona Norte, Bs.As. G.B.A. Zona Oeste, Bs.As. G.B.A. Z...
$ l3 [3m[38;5;246m<fct>[39m[23m Punta del Este, Boedo, NA, Moreno, Moreno, Rosario, Ituzaingó, José Ignacio, Almagro, Miramar, ...
$ l4 [3m[38;5;246m<fct>[39m[23m NA, NA, NA, Moreno, Moreno, NA, Ituzaingó, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
$ l5 [3m[38;5;246m<fct>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ l6 [3m[38;5;246m<lgl>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ rooms [3m[38;5;246m<int>[39m[23m 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, ...
$ bedrooms [3m[38;5;246m<int>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ bathrooms [3m[38;5;246m<int>[39m[23m 1, NA, 1, 2, 3, 1, 3, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1,...
$ surface_total [3m[38;5;246m<int>[39m[23m 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, 352, 373, 360, 1325, 250, 80142, 101, NA, 54, 180...
$ surface_covered [3m[38;5;246m<int>[39m[23m 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, 54, 180, 33, 33, 34, ...
$ price [3m[38;5;246m<int>[39m[23m 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA, NA, NA, NA, NA, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, ...
$ currency [3m[38;5;246m<fct>[39m[23m UYU, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ price_period [3m[38;5;246m<fct>[39m[23m Mensual, Mensual, NA, Mensual, Mensual, Mensual, Mensual, Mensual, Mensual, Mensual, Mensual, M...
$ title [3m[38;5;246m<fct>[39m[23m Departamento - Roosevelt, PH - Boedo, Ituzaingo 1100 - $ 1 - Casa Alquiler, Dr. Vera 300 - C...
$ property_type [3m[38;5;246m<fct>[39m[23m Departamento, PH, Casa, Casa, Casa, Casa, Casa, Casa, Lote, Lote, Lote, Lote, Lote, Lote, Lote,...
$ operation_type [3m[38;5;246m<fct>[39m[23m Alquiler, Venta, Alquiler, Venta, Venta, Venta, Venta, Alquiler, Venta, Venta, Venta, Venta, Ve...
summary(properati)
id ad_type start_date end_date created_on
///dr7MC645N/4gZ6eXuUg==: 1 Propiedad:388891 2019-05-31: 10567 9999-12-31:117295 2019-05-31: 10567
//+CYRxKFmd756CnDA/cqA==: 1 2019-04-29: 6121 2019-06-23: 34915 2019-04-29: 6121
//+tP3jysTzlcccJ3QSc0w==: 1 2019-01-16: 6102 2019-06-08: 15091 2019-01-16: 6102
//0A/RLg2X1acCjxTk7lXQ==: 1 2019-06-01: 4749 2019-07-10: 13981 2019-06-01: 4749
//17Mk/t87M5tdc6l/hwVw==: 1 2019-06-10: 4712 2019-07-19: 8640 2019-06-10: 4712
//2nJwFGlRu5WFZQ3szAMQ==: 1 2019-05-03: 4592 2019-06-14: 7381 2019-05-03: 4592
(Other) :388885 (Other) :352048 (Other) :191588 (Other) :352048
lat lon l1 l2 l3
Min. :-54.98 Min. :-105.27 Argentina :374977 Capital Federal :124327 Rosario : 29634
1st Qu.:-34.67 1st Qu.: -58.80 Brasil : 34 Bs.As. G.B.A. Zona Norte : 72088 Tigre : 23421
Median :-34.60 Median : -58.48 Estados Unidos: 305 Santa Fe : 36199 Mar del Plata: 23075
Mean :-34.48 Mean : -59.37 Uruguay : 13575 Buenos Aires Costa Atlántica: 30649 Palermo : 18907
3rd Qu.:-34.43 3rd Qu.: -58.40 Bs.As. G.B.A. Zona Oeste : 28576 Córdoba : 14006
Max. : 44.67 Max. : -41.90 Bs.As. G.B.A. Zona Sur : 28080 (Other) :267077
NA's :50597 NA's :50597 (Other) : 68972 NA's : 12771
l4 l5 l6 rooms bedrooms bathrooms
Nordelta : 10696 Barrio El Golf : 400 Mode:logical Min. : 1.0 Min. : -2.00 Min. : 1.00
La Plata : 4225 BarrioPortezuelo : 400 NA's:388891 1st Qu.: 2.0 1st Qu.: 1.00 1st Qu.: 1.00
Ramos Mejía: 3753 Barrio Los Alisos: 230 Median : 3.0 Median : 2.00 Median : 1.00
Olivos : 2597 Barrio Los Lagos : 173 Mean : 2.9 Mean : 2.16 Mean : 1.67
San Isidro : 2474 Islas del Canal : 138 3rd Qu.: 4.0 3rd Qu.: 3.00 3rd Qu.: 2.00
(Other) : 91766 (Other) : 1065 Max. :40.0 Max. :390.00 Max. :20.00
NA's :273380 NA's :386485 NA's :144668 NA's :230747 NA's :94136
surface_total surface_covered price currency price_period
Min. : -3.0 Min. : -139 Min. :0.000e+00 ARS :116131 Diario : 49
1st Qu.: 50.0 1st Qu.: 43 1st Qu.:2.000e+04 PEN : 123 Mensual:227625
Median : 91.0 Median : 70 Median :9.400e+04 USD :242465 Semanal: 28
Mean : 458.3 Mean : 235 Mean :2.690e+05 UYU : 1178 NA's :161189
3rd Qu.: 266.0 3rd Qu.: 142 3rd Qu.:2.250e+05 NA's: 28994
Max. :200000.0 Max. :4000000 Max. :2.147e+09
NA's :74063 NA's :97854 NA's :21222
title property_type operation_type
DEPARTAMENTO EN VENTA : 11559 Departamento :188588 Alquiler :104263
DEPARTAMENTO EN ALQUILER : 7115 Casa : 84117 Alquiler temporal: 15815
CASA EN VENTA : 5298 Lote : 45724 Venta :268813
Departamento en Alquiler Temporario: 2364 PH : 19340
LOTE EN VENTA : 2340 Local comercial: 19225
PH EN VENTA : 2214 Oficina : 13516
(Other) :358001 (Other) : 18381
Filtro variables seleccionadas: país = Argentina, ciudad= CABA, tipo de operación = venta, tipo de propiedad y moneda de la operación = dólares.
properati<-properati %>%
filter(l1=="Argentina" & l2=="Capital Federal" &
currency=="USD" & (property_type=="PH" | property_type=="Departamento" |
property_type=="Casa") & operation_type=="Venta") %>%
select(id,l3,rooms,bedrooms,bathrooms,surface_total,surface_covered,price,property_type)
properati %>%
head() %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
id | l3 | rooms | bedrooms | bathrooms | surface_total | surface_covered | price | property_type |
---|---|---|---|---|---|---|---|---|
oyj+f764ALCYodIqBvWAww== | Barracas | NA | NA | NA | 300 | 180 | 320000 | PH |
HdjpKrqdwYfH9YU1DKjltg== | Boedo | 6 | NA | 2 | 178 | 240 | 500000 | Casa |
YwWE3rTb2+gmsBwjUHmAPQ== | Palermo | NA | NA | 2 | 240 | 157 | 350000 | Casa |
6AxnSWOhbIU8TUCqb+paBg== | Belgrano | 3 | NA | 4 | 157 | NA | 470000 | Casa |
U4fk+co3Rd8JDMot0pQI6Q== | Versalles | NA | NA | 1 | 140 | 110 | 155000 | Casa |
AfdcsqUSelai1ofCAq2B0Q== | Velez Sarsfield | 3 | NA | 2 | 95 | 69 | 199900 | Casa |
Calculo la cantidad de valores unicos por variable.
#Funciones para el cálculo de faltantes y valores únicos
sumo_na<-function(x){ sum(is.na(x))}
cant_unicos<-function(x){ length(unique(x))}
#Cantidad de valores únicos
properati %>% summarise_all(list( cant_unicos= cant_unicos)) %>% gather()
Calculo la cantidad de valores faltantes por variable. La variable bedrooms tiene una elevada presentcia de datos faltantes.
#Cantidad de faltantes
properati %>% summarise_all(list(cant_na = sumo_na, cant_unicos= cant_unicos)) %>% gather()
#Grafico Faltantes
properati %>% summarise_all(list(cant_na = sumo_na)) %>% gather() %>% ggplot(.,aes(x=reorder(key,-value), y= value))+ geom_bar(stat = "identity")+ labs(title = "Cantidad de faltates por variable") +
labs(x = "Nº faltantes", y = "Variables") + theme( axis.text.x = element_text(colour = "black", size = 10, angle = 90),
axis.text.y = element_text(colour = "black", size = 10))
Se encuentra que las varaibles bedrooms y rooms registran una elevada correlación lineal (0.92).
properati %>%
select(-id,-l3,-property_type) %>%
cor(., use="complete.obs", method="pearson")
rooms bedrooms bathrooms surface_total surface_covered price
rooms 1.00000000 0.92138719 0.61335026 0.06828238 0.07468335 0.48748747
bedrooms 0.92138719 1.00000000 0.61578024 0.06746895 0.07206826 0.43221753
bathrooms 0.61335026 0.61578024 1.00000000 0.06234262 0.06777010 0.59904254
surface_total 0.06828238 0.06746895 0.06234262 1.00000000 0.69656225 0.05095265
surface_covered 0.07468335 0.07206826 0.06777010 0.69656225 1.00000000 0.06257960
price 0.48748747 0.43221753 0.59904254 0.05095265 0.06257960 1.00000000
Elimino variable bedrooms
por tener una proporción grande de faltantes y tener una elevada correlación con rooms
. Asimismo, me quedo con aquellos registros completos.
properati<-properati %>% select(-bedrooms) %>% filter(complete.cases(.))
summary(properati$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
Los precios presentan una distribución log-normal
ggplot(properati, aes(x = price)) + geom_histogram(bins = 40, col="#4d4d4d", fill="#d8b365")+theme_tufte(base_size = 15)+ggtitle("Distribución de precios de inmuebles")+xlab("Precio (USD)")+ylab("Frecuencia")
ggplot(properati, aes(y = price,fill=property_type)) + geom_boxplot()+theme_tufte(base_size = 15) + labs(title = "Precios de inmuebles por tipo de vivienda", subtitle = "en dólares")+xlab("")+ylab("Precios (USD)")+labs(fill = "Tipo de propiedad")+
theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
panel.border = element_rect(colour = "black", fill = NA, size = .5),
legend.position = "bottom")
#geom_boxplot(outlier.shape = NA)
properati %>%
select(-id,-l3,property_type) %>%
ggpairs(.,
title = "Matriz de correlaciones",
mapping = aes(colour= property_type))
Se tomo como criterio para definir como outlier a aquellos valores que superaban en 2.5 el rango intercuartil. De esta forma se considerarán como outliers al 5% de los datos
#Funciones para identificar valores atípicos
lim_sup_precio <- function(data, tipo_vivienda){data %>% filter(property_type==tipo_vivienda) %>% summarise( l_sup = quantile(price,probs = 0.75, names = F) +2.5*IQR(price)) }
lim_inf_precio <- function(data, tipo_vivienda){data %>% filter(property_type==tipo_vivienda) %>% summarise( l_sup = quantile(price,probs = 0.25,names = F) -2.5*IQR(price))}
#Genero variable 'oulier' que toma valor 1 si es considerado valor extremo
properati <- properati %>%
mutate(outlier = ifelse( (property_type=="Casa" & price > lim_sup_precio(.,"Casa")[[1]]) |
(property_type=="Casa" & price < lim_inf_precio(.,"Casa")[[1]]) |
(property_type=="PH" & price > lim_sup_precio(.,"PH")[[1]]) |
(property_type=="PH" & price < lim_inf_precio(.,"PH")[[1]]) |
(property_type=="Departamento" & price > lim_sup_precio(.,"Departamento")[[1]]) |
(property_type=="Departamento" & price < lim_inf_precio(.,"Departamento")[[1]]),1,0 ))
#Genero data frame 'properati 1' que no contiene calores extremos
properati_1<-properati %>% filter(outlier==0)
glue::glue("Proporción de outliers = ", sum(properati$outlier)/nrow(properati))
Proporción de outliers = 0.0518648701425503
ggplot(properati_1, aes(x = price)) + geom_histogram(bins = 40, col="#4d4d4d", fill="#d8b365")+theme_tufte(base_size = 15)+ggtitle("Distribución de precios de inmuebles")+xlab("Precio (USD)")+ylab("Frecuencia")
A continuación se presenta el box-plot de los precios por tipo de propiedad. De observar el gráfico se desprende que: - las casas tienen una mayor dispersión de precios que los otros tipos de vivienda. - las casas son en promedio más caras que los PH y los departamentos. - Los PHs son en promedio más caros que os departamentos.
ggplot(properati_1, aes(y = price,fill=property_type)) + geom_boxplot()+theme_tufte(base_size = 15) + labs(title = "Precios de inmuebles por tipo de vivienda", subtitle = "en dólares")+xlab("")+ylab("Precios (USD)")+ylim(0,9.5e+05)+labs(fill = "Tipo de propiedad")+
theme(plot.title = element_text(size = 14, family = "Tahoma", face = "bold"),
panel.border = element_rect(colour = "black", fill = NA, size = .5),
legend.position = "bottom")
properati_1 %>%
select(-id,-l3,property_type) %>%
ggpairs(.,
title = "Matriz de correlaciones",
mapping = aes(colour= property_type))
Realizar un modelo lineal simple para explicar el precio en función de las habitaciones (rooms) y otro modelo que explique el precio en función de la superficie total (surface_total)
Usar la función summary() para obtener informacion de ambos modelos. Explicar los valores de los coeficientes estimados. ¿Cuál modelo usarían para predecir el precio? ¿Por qué?
El modelo I busca explicar los precios como una función lineal de la cantidad de habitaciones. El coeficiente que vincula estas variables es positivo y significativo con un p-value <2e-16. Asimismo, el cofieciente (58.857) puede interpretarse como: por cada habitación el precio de la viviendase incrementa en 58 mil dólares.
El R cuadrado indica que el modelo logra explicar un 40% de la variabilidad del precio.
modelo_rooms<-lm(data = properati_1,formula = price ~ rooms)
summary(modelo_rooms)
Call:
lm(formula = price ~ rooms, data = properati_1)
Residuals:
Min 1Q Median 3Q Max
-1325720 -55007 -14256 31136 763422
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 42292.6 977.8 43.25 <2e-16 ***
rooms 58857.1 327.0 180.00 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 93440 on 48552 degrees of freedom
Multiple R-squared: 0.4002, Adjusted R-squared: 0.4002
F-statistic: 3.24e+04 on 1 and 48552 DF, p-value: < 2.2e-16
ggplot(properati_1,mapping = aes(x=price, y = rooms))+geom_point()+geom_smooth(method = "lm")+ labs(title = "Cantidad de habitaciones y precios de inmuebles", subtitle = "")+xlab("Precio (USD)")+ylab("Cat. Habitaciones")+theme_bw()+
theme(plot.title = element_text(size = 14, face = "bold"),
panel.border = element_rect(colour = "black", fill = NA, size = .5))
El modelo II busca explicar los precios como una función a la superficie total. La presencia de outliers hace que lo coeficientes estén mal estimados.
por esta razón se reetimo el modelo quitando las viviendas con más de 1500 metros cuadrados.
modelo_surface<-lm(data = properati_1, price ~ surface_total)
summary(modelo_surface)
Call:
lm(formula = price ~ surface_total, data = properati_1)
Residuals:
Min 1Q Median 3Q Max
-984524 -85458 -36029 49212 896735
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.002e+05 5.501e+02 363.84 <2e-16 ***
surface_total 7.928e+00 6.549e-01 12.11 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 120500 on 48552 degrees of freedom
Multiple R-squared: 0.003009, Adjusted R-squared: 0.002988
F-statistic: 146.5 on 1 and 48552 DF, p-value: < 2.2e-16
ggplot(properati_1,mapping = aes(x=price, y = surface_total))+geom_point()+geom_smooth(method = "lm")+ labs(title = "Superficie total y precios de inmuebles", subtitle = "")+xlab("Precio (USD)")+ylab("Superficie (m2)")+theme_bw()+
theme(plot.title = element_text(size = 14, face = "bold"),
panel.border = element_rect(colour = "black", fill = NA, size = .5))
El modelo corregido registra coeficientes positivo y significativos al 1%. Asimismo, el cofieciente (1269.6) que asocia la superfcie al precio puede interpretarse como: por cada metro cuadrado de superficie el precio de la viviendase incrementa en 1270 dólares.
El R cuadrado indica que el modelo logra explicar apenas un 48% de la variabilidad del precio.
modelo_surface<-lm(data = properati_1[properati_1$surface_total<1500,], price ~ surface_total)
summary(modelo_surface)
Call:
lm(formula = price ~ surface_total, data = properati_1[properati_1$surface_total <
1500, ])
Residuals:
Min 1Q Median 3Q Max
-1237352 -47463 -19109 31386 599196
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 96011.045 629.819 152.4 <2e-16 ***
surface_total 1269.611 5.951 213.3 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 86640 on 48502 degrees of freedom
Multiple R-squared: 0.4841, Adjusted R-squared: 0.4841
F-statistic: 4.551e+04 on 1 and 48502 DF, p-value: < 2.2e-16
ggplot(properati_1[properati_1$surface_total<1500,],mapping = aes(x=price, y = surface_total))+geom_point()+geom_smooth(method = "lm")+ labs(title = "Superficie total y precios de inmuebles", subtitle = "")+xlab("Precio (USD)")+ylab("Superficie (m2)")+theme_bw()+
theme(plot.title = element_text(size = 14, face = "bold"),
panel.border = element_rect(colour = "black", fill = NA, size = .5))
Dado que el R cuadrado es superior en el segundo modelo, se puede argumentar que este modelo logra explicar una mayor proporción de la variabilida y por lo tanto resulta superior al modelo de habitaciones.