Lectura de los datos
setwd("/home/andy/maestria/EEA2019/trabajos_practicos/TP-1/TP1") #Elegimos el directorio de trabajo
ar_properties <- read.delim(file = "ar_properties.csv", header = T, sep = ",", stringsAsFactors = F) #Leemos el archivo de datos
str(ar_properties)
'data.frame': 388891 obs. of 24 variables:
$ id : chr "S0we3z3V2JpHUJreqQ2t/w==" "kMxcmAS8NvrynGBVbMOEaQ==" "Ce3ojF+ZTOkB8d+LI9dpxg==" "AUGpj3raGmOCiulSMGIBPA==" ...
$ ad_type : chr "Propiedad" "Propiedad" "Propiedad" "Propiedad" ...
$ start_date : chr "2019-04-14" "2019-04-14" "2019-04-14" "2019-04-14" ...
$ end_date : chr "2019-06-14" "2019-04-16" "9999-12-31" "9999-12-31" ...
$ created_on : chr "2019-04-14" "2019-04-14" "2019-04-14" "2019-04-14" ...
$ lat : num -34.9 -34.6 NA -34.7 -34.7 ...
$ lon : num -54.9 -58.4 NA -58.8 -58.8 ...
$ l1 : chr "Uruguay" "Argentina" "Argentina" "Argentina" ...
$ l2 : chr "Maldonado" "Capital Federal" "Bs.As. G.B.A. Zona Norte" "Bs.As. G.B.A. Zona Oeste" ...
$ l3 : chr "Punta del Este" "Boedo" NA "Moreno" ...
$ l4 : chr NA NA NA "Moreno" ...
$ l5 : chr NA NA NA NA ...
$ l6 : logi NA NA NA NA NA NA ...
$ rooms : int 2 NA 2 2 2 4 NA 6 NA NA ...
$ bedrooms : int NA NA NA NA NA NA NA NA NA NA ...
$ bathrooms : int 1 NA 1 2 3 1 3 3 NA NA ...
$ surface_total : int 45 NA 200 460 660 NA 70 NA 1300 405 ...
$ surface_covered: int 40 NA NA 100 148 89 122 NA NA NA ...
$ price : int 13000 0 NA NA NA NA NA NA 0 NA ...
$ currency : chr "UYU" NA NA NA ...
$ price_period : chr "Mensual" "Mensual" NA "Mensual" ...
$ title : chr "Departamento - Roosevelt" "PH - Boedo" "Ituzaingo 1100 - $ 1 - Casa Alquiler" "Dr. Vera 300 - Consulte precio - Casa en Venta" ...
$ property_type : chr "Departamento" "PH" "Casa" "Casa" ...
$ operation_type : chr "Alquiler" "Venta" "Alquiler" "Venta" ...
dim(ar_properties)
[1] 388891 24
head(ar_properties)
View(ar_properties[1:10, ])
unique(ar_properties$l2) #Veamos cuantas formas hay de llamar a capital federal
[1] "Maldonado" "Capital Federal" "Bs.As. G.B.A. Zona Norte" "Bs.As. G.B.A. Zona Oeste" "Santa Fe"
[6] "Buenos Aires Costa Atlántica" "Río Negro" "Córdoba" "Tucumán" "Bs.As. G.B.A. Zona Sur"
[11] "Neuquén" "La Pampa" "Corrientes" "Tierra Del Fuego" "Salta"
[16] "Buenos Aires Interior" "Entre Ríos" "Misiones" "Canelones" "Montevideo"
[21] "Catamarca" "Mendoza" "San Juan" "Chaco" "San Luis"
[26] "Chubut" "Jujuy" "Santa Cruz" "Santiago Del Estero" "La Rioja"
[31] "Florida" "Colonia" "Rio de Janeiro" "Rocha" "Santa Catarina"
[36] "Miami" "Formosa" "Michigan" "New York" "Maryland"
[41] "Pennsylvania"
propiedades <- ar_properties[ar_properties$l1 == "Argentina" & ar_properties$l2 == "Capital Federal", ] #Nos quedamos con los da argentina y cap fed
propiedades <- propiedades[propiedades$currency == "USD", ] #Nos quedamos con las operaciones en dolares
propiedades <- propiedades[propiedades$property_type %in% c("Departamento", "PH", "Casa"), ] #Nos quedamos con los tipos específicos de propiedades
propiedades <- propiedades[propiedades$operation_type == "Venta", ] #Nos quedamos con las operaciones de venta
propiedades <- propiedades[,c("id", "l3", "rooms", "bedrooms", "bathrooms", "surface_total", "surface_covered", "price", "property_type")] #Nos quedamos con los datos de interes
dim(propiedades) #Tenemos los datos esperados
[1] 61905 9
rownames(propiedades) <- propiedades[, 1]
propiedades <- propiedades[, -1]
rm(ar_properties)
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1809393 96.7 4347570 232.2 3302975 176.4
Vcells 6845276 52.3 36558239NA 45625322 348.1
correlaciones
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
propiedades <- propiedades[, !colnames(propiedades) %in% "bedrooms"]
propiedades <- propiedades[complete.cases(propiedades), ]
dim(propiedades)
[1] 51210 7
summary(propiedades$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
library(ggplot2)
library(GGally)
ggplot(propiedades, aes(x = price)) + geom_histogram()
ggplot(propiedades, aes(x = price)) + geom_histogram() + scale_x_log10() #Graficamos logaritmo para que se vea mejor
price_por_type<-aggregate(price ~ property_type, propiedades, summary)
price_por_type
ggplot(propiedades, aes(y = price, color = property_type)) + geom_boxplot()
ggcorr(propiedades)
data in column(s) 'l3', 'property_type' are not numeric and were ignored
maximo<-aggregate(price ~ property_type, propiedades, function(p){ return(quantile(p, 0.75) + 1.5*IQR(p))})
minimo<-aggregate(price ~ property_type, propiedades, function(p){ return(quantile(p, 0.25) - 1.5*IQR(p))})
maximo <- setNames(maximo$price, maximo$property_type)
Los mínimos incluyen al cero así que sacamos únicamente los que están por arriba del máximo
table(outliers)
outliers
FALSE TRUE
46956 4254
summary(propiedades$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
ggplot(propiedades, aes(x = price)) + geom_histogram()
ggplot(propiedades, aes(x = price)) + geom_histogram() + scale_x_log10() #Graficamos logaritmo para que se vea mejor
ggplot(propiedades_sin_outliers, aes(x = price)) + geom_histogram()
ggplot(propiedades_sin_outliers, aes(x = price)) + geom_histogram() + scale_x_log10() #Graficamos logaritmo para que se vea mejor
price_por_type<-aggregate(price ~ property_type, propiedades, summary)
price_por_type
ggplot(propiedades, aes(y = price, color = property_type)) + geom_boxplot()
ggplot(propiedades_sin_outliers, aes(y = price, color = property_type)) + geom_boxplot()
ggcorr(propiedades)
data in column(s) 'l3', 'property_type' are not numeric and were ignored
ggcorr(propiedades_sin_outliers)
data in column(s) 'l3', 'property_type' are not numeric and were ignored
Sacar los outliers permite concentrarse en los valores más típicos y en las escalas más típicas como muestran el histograma y el boxplot. Además, aumentan levemente la correlación entre el precio y la cantidad de habitaciones y baños. Los outliers deben incluir otros aspectos, como ubicación.
ml_rooms <- lm(price ~ rooms, propiedades_sin_outliers)
ml_surface_total <- lm(price ~ surface_total, propiedades_sin_outliers)
summary(ml_rooms)
Call:
lm(formula = price ~ rooms, data = propiedades_sin_outliers)
Residuals:
Min 1Q Median 3Q Max
-747427 -47389 -11167 31890 590776
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 51451.2 834.4 61.67 <2e-16 ***
rooms 51943.1 284.7 182.47 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 77900 on 46954 degrees of freedom
Multiple R-squared: 0.4149, Adjusted R-squared: 0.4149
F-statistic: 3.33e+04 on 1 and 46954 DF, p-value: < 2.2e-16
summary(ml_surface_total)
Call:
lm(formula = price ~ surface_total, data = propiedades_sin_outliers)
Residuals:
Min 1Q Median 3Q Max
-772520 -73607 -28772 51196 679199
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.883e+05 4.720e+02 398.85 <2e-16 ***
surface_total 6.340e+00 5.531e-01 11.46 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 101700 on 46954 degrees of freedom
Multiple R-squared: 0.002791, Adjusted R-squared: 0.00277
F-statistic: 131.4 on 1 and 46954 DF, p-value: < 2.2e-16
Si Bien los coeficientes en ambos ajustes dan significativos, el R2 muestra que surface_total no explica el precio. Viendo los gráficos de residuos y los R2 se observa que surface_total no explica bien el precio, mientras que rooms explica una parte. Usaríamos rooms.