library(tidyverse)
library(openintro)
library(GGally)
library(corrr)
library(knitr)
library(kableExtra)
library(ggplot2)
library(purrr)
propiedades <- read.csv(file="C:/Users/tomas/Desktop/Maestria/EEA/DiegoKoz-EEA2019-c64a28c/trabajos_practicos/TP-1/ar_properties/ar_properties.csv", header=TRUE, sep=",")
glimpse(propiedades)
Observations: 388,891
Variables: 24
$ id [3m[38;5;246m<fct>[39m[23m S0we3z3V2JpHUJreqQ2t/w==, kMxcmAS8NvrynGBVbMOEa...
$ ad_type [3m[38;5;246m<fct>[39m[23m Propiedad, Propiedad, Propiedad, Propiedad, Pro...
$ start_date [3m[38;5;246m<fct>[39m[23m 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,...
$ created_on [3m[38;5;246m<fct>[39m[23m 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,...
$ lon [3m[38;5;246m<dbl>[39m[23m -54.92966, -58.42060, NA, -58.79089, -58.78712,...
$ l1 [3m[38;5;246m<fct>[39m[23m Uruguay, Argentina, Argentina, Argentina, Argen...
$ l2 [3m[38;5;246m<fct>[39m[23m Maldonado, Capital Federal, Bs.As. G.B.A. Zona ...
$ l3 [3m[38;5;246m<fct>[39m[23m Punta del Este, Boedo, NA, Moreno, Moreno, Rosa...
$ l4 [3m[38;5;246m<fct>[39m[23m NA, NA, NA, Moreno, Moreno, NA, Ituzaingó, NA,...
$ l5 [3m[38;5;246m<fct>[39m[23m 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,...
$ rooms [3m[38;5;246m<int>[39m[23m 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, N...
$ bedrooms [3m[38;5;246m<int>[39m[23m 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...
$ surface_total [3m[38;5;246m<int>[39m[23m 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, 3...
$ surface_covered [3m[38;5;246m<int>[39m[23m 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA, ...
$ price [3m[38;5;246m<int>[39m[23m 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA,...
$ currency [3m[38;5;246m<fct>[39m[23m UYU, 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...
$ title [3m[38;5;246m<fct>[39m[23m Departamento - Roosevelt, PH - Boedo, Ituzaingo...
$ property_type [3m[38;5;246m<fct>[39m[23m Departamento, PH, Casa, Casa, Casa, Casa, Casa,...
$ operation_type [3m[38;5;246m<fct>[39m[23m Alquiler, Venta, Alquiler, Venta, Venta, Venta,...
df <- propiedades %>%
filter(l1=='Argentina' , l2 =='Capital Federal') %>% # punto i.
filter(currency =='USD') %>% # punto ii.
filter(property_type == 'Departamento' | property_type == 'PH' | property_type == 'Casa' ) %>% # punto iii.
filter(operation_type == 'Venta') # punto iv.
df <- df %>%
select (id, l3, rooms, bedrooms, bathrooms, surface_total, surface_covered, price, property_type)
cat("Hata este punto del TP, el dataset contiene", dim(df)[1], "filas y", dim(df)[2], "columnas" )
Hata este punto del TP, el dataset contiene 61905 filas y 9 columnas
valores_unicos <- map(df, ~n_distinct(.))
valores_faltantes <- map(df, ~sum(is.na(.)))
valores_unicos_y_faltantes <- data.frame(valores_unicos)
valores_unicos_y_faltantes <- rbind(valores_unicos_y_faltantes, valores_faltantes)
rownames(valores_unicos_y_faltantes)[1:2] <- c("unicos", "faltantes")
valores_unicos_y_faltantes %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
| id | l3 | rooms | bedrooms | bathrooms | surface_total | surface_covered | price | property_type | |
|---|---|---|---|---|---|---|---|---|---|
| unicos | 61905 | 58 | 24 | 25 | 15 | 671 | 573 | 4095 | 3 |
| faltantes | 0 | 355 | 5314 | 25298 | 3196 | 3671 | 2975 | 0 | 0 |
df_num <- df %>%
select(-id, -l3, -property_type)
df_num %>%
correlate(use = "complete.obs") %>%
shave() %>%
fashion()
Correlation method: 'pearson'
Missing treated using: 'complete.obs'
df <- df %>%
select(-bedrooms)
df2 <- df[complete.cases(df), ]
cantidad_datos_con_NA <- dim(df)-dim(df2)
cat("Fueron eliminados por presentar valores faltantes", cantidad_datos_con_NA [1], "registros.\nHasta este punto del TP, el dataset contiene", dim(df2)[1], "filas y", dim(df2)[2], "columnas" )
Fueron eliminados por presentar valores faltantes 10695 registros.
Hasta este punto del TP, el dataset contiene 51210 filas y 8 columnas
df <- df2
histograma_precio <- function (x) {
qplot(x$price,
geom="histogram",
main="Distribucion de los precios de las propiedades",
xlab="Precios (en dolares)",
ylab="Cantidad",
binwidth=50000,
fill=I("blue"),
alpha=I(.2),
....=c(20,50))
}
histograma_precio(df)
Ignoring unknown parameters: ....
summary(df$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
descriptivas <- function (x) {
x %>%
group_by(property_type) %>%
summarise(Q1 = quantile(price, 0.25),
Mediann= quantile(price, 0.5),
Media = mean (price),
Q3 = quantile(price, 0.75),
Minimo = min (price),
Maximo = max (price))
}
descriptivas(df)
boxplot_precio <- function (x) {
ggplot(x, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
labs(title = 'Precios segun el tipo de propiedad', x = 'Tipo de propiedad', y = 'Precio', fill = 'Tipo de propiedad') +
geom_boxplot(alpha=0.2)
}
boxplot_precio(df)
correlagrama <- function (x) {
x %>%
select(-id, -l3) %>%
ggpairs(.,
title = "Correlograma segun tipo de propiedad",
mapping = aes(colour= property_type))
}
correlagrama (df)
df2 <- df %>%
mutate(metro_cuadrado = price/surface_total) %>%
filter(metro_cuadrado >= 1000, metro_cuadrado <= 20000)
cantidad_outliers <- dim(df)-dim(df2)
cat("Fueron detectados y eliminados como outliers", cantidad_outliers[1], "casos")
Fueron detectados y eliminados como outliers 860 casos
summary(df2$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
24000 119000 170000 251614 270000 6000000
histograma_precio(df2)
Ignoring unknown parameters: ....
descriptivas(df2)
boxplot_precio(df2)
correlagrama(df2)
Puede observarse que hay un aumento en el valor mínimo del precio de las propiedades (antes:USD 6.000 / ahora:USD 24.000), mientras el resto de los valores se mantienen relativamente constantes.
Si si realiza el desglose por tipo de propiedad, es posible observar un cambio a nivel de los valores mínimos de todos los tipos de propiedades:
- Casa –> antes: USD 20.000 / ahora: USD 62.000
- Departamento –> antes: USD 6.000 / ahora: USD 24.000
- PH –> antes: USD 32.000 / ahora: USD 45.000
Los boxplots desglozados por tipo de propiedad se mantuvieron practicamente sin cambios, lo cual da cuenta el metodo utilizado para detectar outliers y eliminarlos (relativo al metro cuadrado) es independiente de los valores que parecen outliers a partir de los valores absolutos de precios segun tipo de propiedad, posible de ser medidos por la distancias de 1.5 IQR. Finalmente, las correlaciones dan mas altas al quitar los outliers.
modelo_rooms <- lm(price ~ rooms, data = df2)
summary(modelo_rooms)
Call:
lm(formula = price ~ rooms, data = df2)
Residuals:
Min 1Q Median 3Q Max
-2920646 -100166 -33322 42834 5387301
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -58366.2 2519.6 -23.16 <2e-16 ***
rooms 111844.1 816.5 136.97 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 248500 on 50348 degrees of freedom
Multiple R-squared: 0.2715, Adjusted R-squared: 0.2715
F-statistic: 1.876e+04 on 1 and 50348 DF, p-value: < 2.2e-16
ggplot2::ggplot(df2, ggplot2::aes(x=rooms, y=price)) +
ggplot2::geom_point(ggplot2::aes()) +
ggplot2::geom_smooth(method = "lm") +
ggplot2::labs(x = "Cantidad de habitaciones",
y = "Precio en dolares",
title = "Modelo lineal simple de precio en funcion de habitaciones")
modelo_superficie_total <- lm(price ~ surface_total, data = df2)
summary(modelo_superficie_total)
Call:
lm(formula = price ~ surface_total, data = df2)
Residuals:
Min 1Q Median 3Q Max
-2199237 -43180 -6536 25067 4245174
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8113.99 1361.93 -5.958 2.57e-09 ***
surface_total 2938.23 11.85 247.991 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 195400 on 50348 degrees of freedom
Multiple R-squared: 0.5499, Adjusted R-squared: 0.5498
F-statistic: 6.15e+04 on 1 and 50348 DF, p-value: < 2.2e-16
A continuacion se explicaran los valores de los coeficientes estimados.
El intercepto, o β0, dio para el primer modelo -58366.2 mientras que para el segundo modelo -8113.99 El intercepto no es posible ser interpretado, ya que no tiene sentido interpretar el valor que tomaria (según esta predicción)una propiedad en caso que tenga 0 cuartos, o si tuviera 0 metros cuadrados de superficie.
Aquello que si se puede interpretar es el β1, que para el modelo 1 significa cuanto aumentaría (según la prediccion de este modelo) el valor de la propiedad por cada cuarto extra que tiene (por cada cuarto extra el valor de la propiedad aumenta, segun este modelo, en USD 111844.1 ); y para el modelo 2 significa cuanto aumenta este valor por cada metro cuadrado extra de la misma (por cada metro cuadrado extra el valor de la propiedad aumenta, segun este modelo, en USD 2938.23)
Finalmente, utilizaria el modelo que toma como valor de entrada la superficie de la propiedad (modelo 2), teniendo en cuenta que el R-cuadrado es mayor (R2= 0.55)al modelo que toma como valor de entrada la cantidad de cuartos(R2=0.27).