install.packages("tidyverse")
library("tidyverse")
library(dplyr)
library(tidyr)
library(ggplot2)
library(lubridate)
library(knitr)
library(markdown)
install.packages("corrplot")
library("corrplot")
install.packages("car")
library("car")
install.packages("ggpubr")
library("ggpubr")
install.packages("GGally")
library("GGally")
library(tidyverse)
library(modelr)
install.packages("plotly")
library("plotly")
1-Preparacion de los datos (I) a-
propiedad<-read_csv(file="C:/Users/PC/Desktop/EE/TP1/ar_properties.csv")
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.
prop=data.frame(propiedad)
glimpse(propiedad)
Observations: 388,891
Variables: 24
$ id [3m[38;5;246m<chr>[39m[23m "S0we3z3V2JpHUJreqQ2t/w==", "kMxcmAS8NvrynGBVbMOEaQ=="...
$ ad_type [3m[38;5;246m<chr>[39m[23m "Propiedad", "Propiedad", "Propiedad", "Propiedad", "P...
$ start_date [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-...
$ end_date [3m[38;5;246m<date>[39m[23m 2019-06-14, 2019-04-16, 9999-12-31, 9999-12-31, 2019-...
$ created_on [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.94331, -34.63181, NA, -34.65471, -34.65495, -32.93...
$ lon [3m[38;5;246m<dbl>[39m[23m -54.92966, -58.42060, NA, -58.79089, -58.78712, -60.68...
$ l1 [3m[38;5;246m<chr>[39m[23m "Uruguay", "Argentina", "Argentina", "Argentina", "Arg...
$ l2 [3m[38;5;246m<chr>[39m[23m "Maldonado", "Capital Federal", "Bs.As. G.B.A. Zona No...
$ l3 [3m[38;5;246m<chr>[39m[23m "Punta del Este", "Boedo", NA, "Moreno", "Moreno", "Ro...
$ l4 [3m[38;5;246m<chr>[39m[23m NA, NA, NA, "Moreno", "Moreno", NA, "Ituzaingó", NA, N...
$ l5 [3m[38;5;246m<chr>[39m[23m 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...
$ rooms [3m[38;5;246m<dbl>[39m[23m 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, NA, NA, ...
$ bedrooms [3m[38;5;246m<dbl>[39m[23m NA, NA, NA, NA, NA, 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, NA, NA, NA, NA, N...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, 352, 373...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA, NA, NA,...
$ price [3m[38;5;246m<dbl>[39m[23m 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA, NA, NA...
$ currency [3m[38;5;246m<chr>[39m[23m "UYU", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ price_period [3m[38;5;246m<chr>[39m[23m "Mensual", "Mensual", NA, "Mensual", "Mensual", "Mensu...
$ title [3m[38;5;246m<chr>[39m[23m "Departamento - Roosevelt", "PH - Boedo", "Ituzaingo ...
$ property_type [3m[38;5;246m<chr>[39m[23m "Departamento", "PH", "Casa", "Casa", "Casa", "Casa", ...
$ operation_type [3m[38;5;246m<chr>[39m[23m "Alquiler", "Venta", "Alquiler", "Venta", "Venta", "Ve...
b,c-Filtrado de datos y seleccion de varialbes Se filtran registros que pertenecen a Argentina y capital federal, cuyo precio esta en dolares(USD), el tipo de propiedad es Departamento, PH, ? Casa; y el tipo de operacion es Venta. Se seleccinan las variables id, l3, rooms, beedrooms, bathrooms, surfece_total, surface_covered, price y property_type.
datofil <- prop %>%
filter( l1 == "Argentina",
l2 == "Capital Federal",
currency == "USD",
property_type %in% c("Departamento", "PH", "Casa"),
operation_type =="Venta"
) %>%
select("id", "l3", "rooms", "bedrooms", "bathrooms", "surface_total", "surface_covered", "price","property_type")
glimpse(datofil)
Observations: 61,905
Variables: 9
$ id [3m[38;5;246m<chr>[39m[23m "oyj+f764ALCYodIqBvWAww==", "HdjpKrqdwYfH9YU1DKjltg=="...
$ l3 [3m[38;5;246m<chr>[39m[23m "Barracas", "Boedo", "Palermo", "Belgrano", "Versalles...
$ rooms [3m[38;5;246m<dbl>[39m[23m NA, 6, NA, 3, NA, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ bedrooms [3m[38;5;246m<dbl>[39m[23m NA, NA, NA, NA, NA, 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, 1, 1, 1, 1, 1, 1,...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 300, 178, 240, 157, 140, 95, 44, 40, 49, 40, 40, 40, 4...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 180, 240, 157, NA, 110, 69, 38, 37, 44, 37, 37, 37, 44...
$ price [3m[38;5;246m<dbl>[39m[23m 320000, 500000, 350000, 470000, 155000, 199900, 147000...
$ property_type [3m[38;5;246m<chr>[39m[23m "PH", "Casa", "Casa", "Casa", "Casa", "Casa", "Departa...
2-Analisis exploratorios (I)
Se obtienen la cantidad de valores únicos
unicos<-function(x)length(unique(x))
datounico <- datofil %>%
dplyr::summarise_all(list(unicos = unicos)) %>%
t()
datounico
[,1]
id_unicos 61905
l3_unicos 58
rooms_unicos 24
bedrooms_unicos 25
bathrooms_unicos 15
surface_total_unicos 671
surface_covered_unicos 573
price_unicos 4095
property_type_unicos 3
Se Obtienen la cantidad de valores faltantes
sapply(datofil, function(x) sum(is.na(x)))
id l3 rooms bedrooms bathrooms
0 355 5314 25298 3196
surface_total surface_covered price property_type
3671 2975 0 0
rs<-round(cor(datofil[,3:8],use="complete.obs"),3)
rs
rooms bedrooms bathrooms surface_total surface_covered price
rooms 1.000 0.921 0.613 0.068 0.075 0.487
bedrooms 0.921 1.000 0.616 0.067 0.072 0.432
bathrooms 0.613 0.616 1.000 0.062 0.068 0.599
surface_total 0.068 0.067 0.062 1.000 0.697 0.051
surface_covered 0.075 0.072 0.068 0.697 1.000 0.063
price 0.487 0.432 0.599 0.051 0.063 1.000
3-Preparacion de los datos(II) Se elimina la variable bedrooms por estar muy correlacionada con rooms y presentar muchos NAs. Luego se eliminan NAs
data<-datofil[,-4]%>%na.omit(datofinal)
glimpse(data)
Observations: 51,210
Variables: 8
$ id [3m[38;5;246m<chr>[39m[23m "HdjpKrqdwYfH9YU1DKjltg==", "AfdcsqUSelai1ofCAq2B0Q=="...
$ l3 [3m[38;5;246m<chr>[39m[23m "Boedo", "Velez Sarsfield", "Nuñez", "Almagro", "Almag...
$ rooms [3m[38;5;246m<dbl>[39m[23m 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, ...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 178, 95, 44, 40, 49, 40, 40, 40, 49, 40, 23, 40, 40, 3...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 240, 69, 38, 37, 44, 37, 37, 37, 44, 37, 23, 37, 37, 3...
$ price [3m[38;5;246m<dbl>[39m[23m 500000, 199900, 147000, 92294, 115000, 77000, 88900, 8...
$ property_type [3m[38;5;246m<chr>[39m[23m "Casa", "Casa", "Departamento", "Departamento", "Depar...
4-Analisis exploratorio (II) a.Estadistica descriptiva de todas las variables
sapply(data[,3:7], function(x) mean(x))
rooms bathrooms surface_total surface_covered price
2.80082 1.50043 101.70801 85.45626 251577.21804
sapply(data[,3:7], function(x) max(x))
rooms bathrooms surface_total surface_covered price
32 14 126062 126062 6000000
sapply(data[,3:7], function(x) min(x))
rooms bathrooms surface_total surface_covered price
1 1 10 2 6000
sapply(data[,3:7], function(x) quantile(x))
rooms bathrooms surface_total surface_covered price
0% 1 1 10 2 6000
25% 2 1 45 40 119000
50% 3 1 66 59 170000
75% 4 2 106 91 270000
100% 32 14 126062 126062 6000000
Se puede observar datos atipicos, en el caso del cuantil de mayor precio se ve datos que posiblemente sean outliers ya que 32 habitaciones, 14 baños y 126062 metros cuadrados no pareceria corresponder a una casa PH o departamento.
summary((data$price))# estadisticas descriptivas de variable precio
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
Histrogra de la variable precio
ggplot(data, aes(x=price)) +
ggtitle('Price histogram') +
xlab('price') +
ylab('frequency') +
geom_histogram(fill='red', alpha=0.75, bins=30 )
b-Estadistica descriptiva para la variable precio por cadad tipo de ropiedad (cuartiles, mean, minimo y maximo)
data %>%
group_by(property_type) %>%
summarise(mean = mean(price),
primerq = quantile(price, 0.25),
mediana = median(price),
tercerq = quantile(price, 0.75),
max = max(price)
)
c-Boxplot
ggplot(data, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 6100000))
Del Boxplot se pueden observar valores atípicos.
d.Correlograma
library(GGally)
data2<-data[,3:8]
data2%>%ggpairs(.,
title = "Correlograma",
mapping = aes(colour= property_type)
)
Se puede observar que la mayoría de los datos corresponden a departamentos.
5-Outliers
Genero nuevas variables donde analizo las relaciones precio superficie cubierta y precio room
datain <- data %>%
mutate(Indices=price/surface_covered)
datain <- datain %>%
mutate(Indicer=price/rooms)
head(datain)
Considerando que en el mercado inmobiliario se utiliza precio por metro cuadrado, se procede a filtrar los datos utilizando la informacón de valores minimos y maximos de precio m2(USD) para eliminar outliers. Luego se aplica otro filtrado considerando la superficie total y que la superficie cubierta no sea mayor a la supeficie total declarada.
Filtrado Indice price/suface_covered , tambien agrego filtrado por superficie y los casos donde la superficie total sea menor que la superficie cubierta
dataout<-filter(datain, Indices>=900,Indices<=6700)# al observarse alguno datos anómalos se agrega otro filtrado
dataout<-filter(dataout,surface_total<2500,surface_total>=surface_covered)
glimpse(dataout)
Observations: 49,680
Variables: 10
$ id [3m[38;5;246m<chr>[39m[23m "AfdcsqUSelai1ofCAq2B0Q==", "ESzybdH7YU2uIU1/kHtRGw=="...
$ l3 [3m[38;5;246m<chr>[39m[23m "Velez Sarsfield", "Nuñez", "Almagro", "Almagro", "Alm...
$ rooms [3m[38;5;246m<dbl>[39m[23m 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, ...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, ...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 95, 44, 40, 49, 40, 40, 40, 49, 40, 23, 40, 40, 32, 40...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 69, 38, 37, 44, 37, 37, 37, 44, 37, 23, 37, 37, 30, 34...
$ price [3m[38;5;246m<dbl>[39m[23m 199900, 147000, 92294, 115000, 77000, 88900, 88798, 11...
$ property_type [3m[38;5;246m<chr>[39m[23m "Casa", "Departamento", "Departamento", "Departamento"...
$ Indices [3m[38;5;246m<dbl>[39m[23m 2897.101, 3868.421, 2494.432, 2613.636, 2081.081, 2402...
$ Indicer [3m[38;5;246m<dbl>[39m[23m 66633.33, 147000.00, 92294.00, 115000.00, 77000.00, 88...
luego del filtrado quedaron 49680 Observaciones
6-Análisis Exploratorio(III)
a.Estadistica descriptiva de todas las variables
mean1<-round(sapply(dataout[,3:7], function(x) mean(x)),3)
mean1
rooms bathrooms surface_total surface_covered price
2.776 1.473 89.226 76.599 231601.769
max1<-sapply(dataout[,3:7], function(x) max(x))
max1
rooms bathrooms surface_total surface_covered price
32 14 2000 1400 5000000
min1<-round(sapply(dataout[,3:7], function(x) min(x)),3)
min1
rooms bathrooms surface_total surface_covered price
1 1 12 12 12000
quantile1<-round(sapply(dataout[,3:7], function(x) quantile(x)),3)
quantile1
rooms bathrooms surface_total surface_covered price
0% 1 1 12 12 12000
25% 2 1 45 40 118000
50% 3 1 65 58 168725
75% 4 2 103 89 265000
100% 32 14 2000 1400 5000000
summary((dataout$price))# estadisticas descriptivas de variable precio
Min. 1st Qu. Median Mean 3rd Qu. Max.
12000 118000 168725 231602 265000 5000000
Histograma de la variable precio filtrado
ggplot(dataout, aes(x=price)) +
ggtitle('Price histogram') +
xlab('price') +
ylab('frequency') +
geom_histogram(fill='red', alpha=0.75, bins=30 )
b-Estadisticas descriptivas por cada tipo de propiedad
dataout %>%
group_by(property_type) %>%
summarise(mean = mean(price),
primerq = quantile(price, 0.25),
mediana = median(price),
tercerq = quantile(price, 0.75),
max = max(price)
)
c-Boxplot
ggplot(dataout, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 5100000))
d-Correlograma
dataout2<-dataout[,3:8]
dataout2%>%ggpairs(.,
title = "Correlograma datos sin outliers",
mapping = aes(colour= property_type)
)
7-Modelo lineal a y b.Se analizan dos modelos lineales simples, uno para explicar el precio en funcion de las habitaciones y otro modelo que explica el precio en funcion de la superficie total.
modsup<-lm(price~surface_total, data=dataout)
modroom<-lm(price~rooms, data=dataout)
summary(modsup)
Call:
lm(formula = price ~ surface_total, data = dataout)
Residuals:
Min 1Q Median 3Q Max
-3334324 -43509 -17378 21969 2173949
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 51693.22 979.00 52.8 <2e-16 ***
surface_total 2016.32 8.24 244.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 144100 on 49678 degrees of freedom
Multiple R-squared: 0.5465, Adjusted R-squared: 0.5465
F-statistic: 5.988e+04 on 1 and 49678 DF, p-value: < 2.2e-16
Según los resultados obtenidos del primer modelo (precio en función de la superficie total, el B0 es 51693.22, corresponde a la ordenada al origen. El B1 del modelo es 2016,32 corresponde al aumento de precio del inmueble en dolares al aumentar cada metro2 de la superficie total.
ggplot(dataout, aes(surface_total, price)) +
geom_point(size=1, color = "pink") +
geom_smooth(method = 'lm') +
labs(title = "Precios en funcion de Superficie Total", x = "Superficie total (m2)", y = "Precio (USD)") +
theme(plot.title = element_text(hjust = 0.5))
summary(modroom)
Call:
lm(formula = price ~ rooms, data = dataout)
Residuals:
Min 1Q Median 3Q Max
-2372940 -78784 -19979 40021 4090775
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -28826.6 1742.3 -16.55 <2e-16 ***
rooms 93805.2 563.1 166.58 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 171400 on 49678 degrees of freedom
Multiple R-squared: 0.3584, Adjusted R-squared: 0.3584
F-statistic: 2.775e+04 on 1 and 49678 DF, p-value: < 2.2e-16
Los resultados obtenidos del segundo modelo (precio en funcion de room), el B0 es -28826,6 este valor corresponde a la ordenada al origen (precio promedio de una propiedad cuya superficie total es 0). El B1 del modelo es 93805,2, corresponde al aumento de precio del inmueble en dolares al aumentar cada habitación.
ggplot(dataout, aes(rooms, price)) +
geom_point(size=1, color = "pink") +
geom_smooth(method = 'lm') +
labs(title = "Precios en funcion de Habitaciones", x = "Habitaciones", y = "Precio (USD)") +
theme(plot.title = element_text(hjust = 0.5))
7 c.Conclusion: Analizando los R2 de ambos modelos se podria decir que el modelo de precio en funcion de la superficie total logra explicar mayor proporcion de la variabilidad de los precios , su R2 es de 0.5465 versus el R2 del modelo por habitacion que dio 0.3584.