package 㤼㸱tidyverse㤼㸲 was built under R version 3.5.3[30m-- [1mAttaching packages[22m --------------------------------------- tidyverse 1.2.1 --[39m
[30m[32mv[30m [34mggplot2[30m 3.1.1 [32mv[30m [34mpurrr [30m 0.3.2
[32mv[30m [34mtibble [30m 2.1.1 [32mv[30m [34mdplyr [30m 0.8.0.[31m1[30m
[32mv[30m [34mtidyr [30m 0.8.3 [32mv[30m [34mstringr[30m 1.4.0
[32mv[30m [34mreadr [30m 1.3.1 [32mv[30m [34mforcats[30m 0.4.0 [39m
package 㤼㸱ggplot2㤼㸲 was built under R version 3.5.3[30m-- [1mConflicts[22m ------------------------------------------ tidyverse_conflicts() --
[31mx[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31mx[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
Parsed with column specification:
cols(
.default = col_character(),
start_date = [34mcol_date(format = "")[39m,
end_date = [34mcol_date(format = "")[39m,
created_on = [34mcol_date(format = "")[39m,
lat = [32mcol_double()[39m,
lon = [32mcol_double()[39m,
l6 = [33mcol_logical()[39m,
rooms = [32mcol_double()[39m,
bedrooms = [32mcol_double()[39m,
bathrooms = [32mcol_double()[39m,
surface_total = [32mcol_double()[39m,
surface_covered = [32mcol_double()[39m,
price = [32mcol_double()[39m
)
See spec(...) for full column specifications.
Muestro la estructura correspondiente en 24 variables y 388.891 observaciones
Observations: 388,891
Variables: 24
$ id [3m[38;5;246m<chr>[39m[23m "S0we3z3V2JpHUJreqQ2t/w==", "kMxcmAS...
$ ad_type [3m[38;5;246m<chr>[39m[23m "Propiedad", "Propiedad", "Propiedad...
$ start_date [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14,...
$ end_date [3m[38;5;246m<date>[39m[23m 2019-06-14, 2019-04-16, 9999-12-31,...
$ created_on [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14,...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.94331, -34.63181, NA, -34.65471,...
$ lon [3m[38;5;246m<dbl>[39m[23m -54.92966, -58.42060, NA, -58.79089,...
$ l1 [3m[38;5;246m<chr>[39m[23m "Uruguay", "Argentina", "Argentina",...
$ l2 [3m[38;5;246m<chr>[39m[23m "Maldonado", "Capital Federal", "Bs....
$ l3 [3m[38;5;246m<chr>[39m[23m "Punta del Este", "Boedo", NA, "More...
$ l4 [3m[38;5;246m<chr>[39m[23m NA, NA, NA, "Moreno", "Moreno", NA, ...
$ l5 [3m[38;5;246m<chr>[39m[23m 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, ...
$ rooms [3m[38;5;246m<dbl>[39m[23m 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA...
$ bedrooms [3m[38;5;246m<dbl>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 1, NA, 1, 2, 3, 1, 3, 3, NA, NA, NA,...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 45, NA, 200, 460, 660, NA, 70, NA, 1...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 40, NA, NA, 100, 148, 89, 122, NA, N...
$ price [3m[38;5;246m<dbl>[39m[23m 13000, 0, NA, NA, NA, NA, NA, NA, 0,...
$ currency [3m[38;5;246m<chr>[39m[23m "UYU", NA, NA, NA, NA, NA, NA, NA, N...
$ price_period [3m[38;5;246m<chr>[39m[23m "Mensual", "Mensual", NA, "Mensual",...
$ title [3m[38;5;246m<chr>[39m[23m "Departamento - Roosevelt", "PH - Bo...
$ property_type [3m[38;5;246m<chr>[39m[23m "Departamento", "PH", "Casa", "Casa"...
$ operation_type [3m[38;5;246m<chr>[39m[23m "Alquiler", "Venta", "Alquiler", "Ve...
library(dplyr)
filtro1 <- ar_properties %>% filter(
(l1=="Argentina" & l2=="Capital Federal") & #Pertenece a Capital y Argentina
(currency=="USD") & #Precio en dolares
(property_type=="PH" | property_type=="Departamento" |property_type=="Casa") & #Tipo de propiedad Departamento, PH o Casa
(operation_type=="Venta") # Operacion de venta
)Deberian llegar a un dataset con 61905 observaciones y 9 variables.️
dataset = filtro1 %>%
select(id, l3, rooms, bedrooms, bathrooms, surface_total, surface_covered, price , property_type)
glimpse(dataset)Observations: 61,905
Variables: 9
$ id [3m[38;5;246m<chr>[39m[23m "oyj+f764ALCYodIqBvWAww==", "HdjpKrq...
$ l3 [3m[38;5;246m<chr>[39m[23m "Barracas", "Boedo", "Palermo", "Bel...
$ rooms [3m[38;5;246m<dbl>[39m[23m NA, 6, NA, 3, NA, 3, 1, 1, 1, 1, 1, ...
$ bedrooms [3m[38;5;246m<dbl>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m NA, 2, 2, 4, 1, 2, 1, 1, 1, 1, 1, 1,...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 300, 178, 240, 157, 140, 95, 44, 40,...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 180, 240, 157, NA, 110, 69, 38, 37, ...
$ price [3m[38;5;246m<dbl>[39m[23m 320000, 500000, 350000, 470000, 1550...
$ property_type [3m[38;5;246m<chr>[39m[23m "PH", "Casa", "Casa", "Casa", "Casa"...
package 㤼㸱kableExtra㤼㸲 was built under R version 3.5.3
Attaching package: 㤼㸱kableExtra㤼㸲
The following object is masked from 㤼㸱package:dplyr㤼㸲:
group_rows
funcion_unicos <- function(x)length(unique(x))
# lista de unicos por variable, traspuesta para visualizarlo.
unicos <- dataset %>%
dplyr::summarise_all(list(funcion_unicos = funcion_unicos)) %>%
t()
#kable_styling para formatear
knitr::kable(x =unicos, col.names = "Cantidad de valores únicos",format = "html") %>%
kableExtra::kable_styling(bootstrap_options = "striped", full_width = F)| Cantidad de valores únicos | |
|---|---|
| id_funcion_unicos | 61905 |
| l3_funcion_unicos | 58 |
| rooms_funcion_unicos | 24 |
| bedrooms_funcion_unicos | 25 |
| bathrooms_funcion_unicos | 15 |
| surface_total_funcion_unicos | 671 |
| surface_covered_funcion_unicos | 573 |
| price_funcion_unicos | 4095 |
| property_type_funcion_unicos | 3 |
Cantidad de valores Faltantes
cantidad <-sapply(dataset, function(y) sum(length(which(is.na(y)))))
porcentaje = sapply(dataset, function(y) sum(length(which(is.na(y))))/sum(length((y))))
porcentaje =scales::percent(porcentaje)
df3 <- rbind(cantidad, porcentaje)
df3 = data.frame(t(df3))
#otra opcion de Kable Styling.
kable(df3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))| cantidad | porcentaje | |
|---|---|---|
| id | 0 | 0.0% |
| l3 | 355 | 0.6% |
| rooms | 5314 | 8.6% |
| bedrooms | 25298 | 40.9% |
| bathrooms | 3196 | 5.2% |
| surface_total | 3671 | 5.9% |
| surface_covered | 2975 | 4.8% |
| price | 0 | 0.0% |
| property_type | 0 | 0.0% |
La variable bedrooms presenta una alta proporción de valores faltantes 40.9% , dado que tiene un alta correlacion con la variale rooms, considero eliminar la variable con mayor faltantes no elimina información significativa.
correlacion <- cor(dataset %>% select_if(is.numeric) , use='complete.obs')
kable(correlacion) %>%
kable_styling(bootstrap_options = c("striped", "hover"))| rooms | bedrooms | bathrooms | surface_total | surface_covered | price | |
|---|---|---|---|---|---|---|
| rooms | 1.0000000 | 0.9213872 | 0.6133503 | 0.0682824 | 0.0746833 | 0.4874875 |
| bedrooms | 0.9213872 | 1.0000000 | 0.6157802 | 0.0674690 | 0.0720683 | 0.4322175 |
| bathrooms | 0.6133503 | 0.6157802 | 1.0000000 | 0.0623426 | 0.0677701 | 0.5990425 |
| surface_total | 0.0682824 | 0.0674690 | 0.0623426 | 1.0000000 | 0.6965623 | 0.0509526 |
| surface_covered | 0.0746833 | 0.0720683 | 0.0677701 | 0.6965623 | 1.0000000 | 0.0625796 |
| price | 0.4874875 | 0.4322175 | 0.5990425 | 0.0509526 | 0.0625796 | 1.0000000 |
package 㤼㸱corrplot㤼㸲 was built under R version 3.5.3corrplot 0.84 loaded
Eliminamos Rooms y variables con missing values
Observations: 51,210
Variables: 8
$ id [3m[38;5;246m<chr>[39m[23m "HdjpKrqdwYfH9YU1DKjltg==", "AfdcsqU...
$ l3 [3m[38;5;246m<chr>[39m[23m "Boedo", "Velez Sarsfield", "Nuñez",...
$ rooms [3m[38;5;246m<dbl>[39m[23m 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 178, 95, 44, 40, 49, 40, 40, 40, 49,...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 240, 69, 38, 37, 44, 37, 37, 37, 44,...
$ price [3m[38;5;246m<dbl>[39m[23m 500000, 199900, 147000, 92294, 11500...
$ property_type [3m[38;5;246m<chr>[39m[23m "Casa", "Casa", "Departamento", "Dep...
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
library(ggplot2)
ggplot(data2, aes(x=price)) +
ggtitle('Figura 1: Histograma de la variable Precio') +
xlab('Precio (USD)') +
ylab('Frecuencia') +
geom_histogram(fill='blue', colour="grey", bins=25 )Aplico logaritmo para suavizar la escala
ggplot(data2, aes(x=price)) + geom_histogram(fill='blue', colour="grey", bins=25 ) + scale_x_log10() +
labs(title="Figura 2:Histograma de la variable precio en escala logarítmica", x="precio (USD)", y = "Frecuencia")precio_x_tipo <- tapply(data2$price,data2$property_type,summary)
precio_x_tipo = as.data.frame(do.call('rbind',precio_x_tipo ))
precio_x_tipoggplot(data2, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
ggtitle('Figura 3: Boxplot precio por tipo de propiedad') +
xlab('tipo de propiedad') + stat_boxplot(geom ='errorbar', width = 0.6) +
ylab('precio') +
geom_boxplot(alpha=0.50)package 㤼㸱GGally㤼㸲 was built under R version 3.5.3
Attaching package: 㤼㸱GGally㤼㸲
The following object is masked from 㤼㸱package:dplyr㤼㸲:
nasa
fig4 = ggpairs(data2, columns=3:7, progress=FALSE, title = "Figura 4: Correlograma", mapping = aes(colour= property_type))
fig4De la Figura 4: Correlograma. Se puede observar relación poisitiva entre baños y ambientes. En cuanto superficies (cubierta y total) no puedo observar de este gráfico y por lo tanto lo amplio en la siguiente figura.
ggplot2::ggplot(data2, ggplot2::aes(x=surface_total, y=price)) +
ggplot2::geom_point(ggplot2::aes(color = property_type))+
ggplot2::labs(x = "Superficie Total",
y = "Precio (USD)",
title = "Figura 5: Precio en función de la superficie total")Tanto en la “Figura 3: Boxplot precio por tipo de propiedad” como en la Figura 1: Histograma de la variable Precio" encuentro que la menor cantidad de datos se encuentra por debajo de 2e+06. Si bien esos datos son validos, comprenden aquellas viviendas de gran tamaño y barrios más caro de la ciudad. Mi analisis es dentro de las propiedades de mayor oferta y por lo tanto decido eliminar los valor por encima de 2e+06.
En “Figura 4: Correlograma” podemos observar en el grafico de precio en funcion de superficie totalse observan dos puntos alejados del resto, esto es con poco precio y gran superficie cubierta. Por otro lado en “Figura 5: Precio en función de la superficie total” también aparece un punto atipico, un PH inusualmente grande, de 32 habitaciones y un precio muy bajo. Considero que debe corresponder a un error de carga. Por lo tanto estos puntos decido eliminarlos también cómo outliers.
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 118635 169900 238923 270000 2000000
Histograma
ggplot(datasinout, aes(x=price)) + geom_histogram(fill='blue', colour="grey", bins=25 ) +
labs(title="Figura 6: Histograma de la variable precio (sin outliers)", x="precio (USD)", y = "Frecuencia")Medidas de resumen por tipo de propiedad
datasinout %>% group_by(property_type) %>%
summarise(Q1 = quantile(price, probs = 0.25),
Mediana = quantile(price, probs = 0.5),
Q3 = quantile(price, probs = 0.75),
Media = mean(price),
Minimo = min(price),
Maximo = max(price))Boxplot
ggplot(datasinout, aes(fill=property_type, y=price))+ geom_boxplot() +
labs(y = "Precio (USD)",
title = "Figura 7: Precio por tipo de propiedad (sin outliers)",
fill = "Tipo de propiedad")fig8 = ggpairs(datasinout, columns=3:7, progress=FALSE, title = "Figura 8: Correlograma sin outliers", mapping = aes(colour= property_type))
fig8El correlograma sin outliers muestra una distribución más homogénea en todas las variables.
Call:
lm(formula = price ~ rooms, data = datasinout)
Residuals:
Min 1Q Median 3Q Max
-1380571 -84407 -27407 33354 1741833
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -14114.0 1819.6 -7.757 8.88e-15 ***
rooms 90760.3 585.4 155.027 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 181600 on 50967 degrees of freedom
Multiple R-squared: 0.3204, Adjusted R-squared: 0.3204
F-statistic: 2.403e+04 on 1 and 50967 DF, p-value: < 2.2e-16
El coeficiente de ordenada al origen es de -14.114 por lo cual el intercept no es realista para el analisis en cambio la pendiente determina que para un aumento en la cantidad de habitaciones se obtendrá un aumento medio de 90760.3 USD en el precio Ambas mediciones tienen p-value altamente significativos. Es decir, que valor estimado por el modelo para una vivienda de 1 ambiente sería un precio de aproximadamente 76 mil USD, lo cual me parece logico. El r2, o variabilidad explicada por el modelo, es de casi 32%.
Call:
lm(formula = price ~ surface_total, data = datasinout)
Residuals:
Min 1Q Median 3Q Max
-3366708 -107570 -62810 26782 1715024
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.103e+05 1.048e+03 200.73 <2e-16 ***
surface_total 3.009e+02 4.859e+00 61.93 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 212400 on 50967 degrees of freedom
Multiple R-squared: 0.06999, Adjusted R-squared: 0.06997
F-statistic: 3836 on 1 and 50967 DF, p-value: < 2.2e-16
En el modelo 2, el r2 da 6%, el p valor es significativo. Se muestra que para un aumento en la unidad de superficie total el precio tendrá, en este modelo, un aumento medio de 300.9 USD
El modelo que utiliza las habitaciones como variable me da mayor R cuadrado por lo tanto elegiría ese modelo. Sin embargo si analizo la variable superifice total observo que la mayor cantidad de datos se encuentra por debajo de 1500m2 y un rango de valores que llega hasta aproximadamente 12000 m2, puede considerarse que el modelo lineal no es lo más adecuado para este tipo de distribución.
ggplot2::ggplot(datasinout, ggplot2::aes(x=rooms, y=price)) +
ggplot2::geom_point(ggplot2::aes(color = property_type)) +
ggplot2::geom_smooth(method = "lm") +
ggplot2::labs(x = "Cantidad de habitaciones",
y = "Precio (USD)",
title = "Figura 9: Modelo lineal para el precio en función de cantidad de habitaciones") +
ggplot2::labs(fill = "Tipo de propiedad")Gráfico de la regresión lineal de precio en función de la superficie total