Datos provistos por Properati Argentina
ALUMNO: Carlos Arana
i. Pertenecen a Argentina y Capital Federal
ii. Cuyo precio esta en dolares (USD)
iii. El tipo de propiedad sea: Departamento, PH o Casa
iv. El tipo de operacion sea Venta
library(tidyr)
library(tidyverse)
## -- Attaching packages --------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.1 v purrr 0.3.2
## v tibble 2.1.3 v dplyr 0.8.3
## v readr 1.3.1 v stringr 1.4.0
## v ggplot2 3.2.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(dplyr)
library(ggplot2)
#############################
# Pto 1.a)
#############################
pr = read_csv('C:/Users/charly/Desktop/FCEyN- MAESTRIA/Materia - ENFOQUE ESTADISTICO DEL APRENDIZAJE/trabajos_practicos/TP-1/ar_properties.csv')
## Parsed with column specification:
## cols(
## .default = col_character(),
## start_date = col_date(format = ""),
## end_date = col_date(format = ""),
## created_on = col_date(format = ""),
## lat = col_double(),
## lon = col_double(),
## l6 = col_logical(),
## rooms = col_double(),
## bedrooms = col_double(),
## bathrooms = col_double(),
## surface_total = col_double(),
## surface_covered = col_double(),
## price = col_double()
## )
## See spec(...) for full column specifications.
glimpse(pr)
## Observations: 388,891
## Variables: 24
## $ id <chr> "S0we3z3V2JpHUJreqQ2t/w==", "kMxcmAS8NvrynGBVb...
## $ ad_type <chr> "Propiedad", "Propiedad", "Propiedad", "Propie...
## $ start_date <date> 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-1...
## $ end_date <date> 2019-06-14, 2019-04-16, 9999-12-31, 9999-12-3...
## $ created_on <date> 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-1...
## $ lat <dbl> -34.94331, -34.63181, NA, -34.65471, -34.65495...
## $ lon <dbl> -54.92966, -58.42060, NA, -58.79089, -58.78712...
## $ l1 <chr> "Uruguay", "Argentina", "Argentina", "Argentin...
## $ l2 <chr> "Maldonado", "Capital Federal", "Bs.As. G.B.A....
## $ l3 <chr> "Punta del Este", "Boedo", NA, "Moreno", "More...
## $ l4 <chr> NA, NA, NA, "Moreno", "Moreno", NA, "Ituzaingó...
## $ l5 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ l6 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ rooms <dbl> 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, ...
## $ bedrooms <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ bathrooms <dbl> 1, NA, 1, 2, 3, 1, 3, 3, NA, NA, NA, NA, NA, N...
## $ surface_total <dbl> 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, ...
## $ surface_covered <dbl> 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA,...
## $ price <dbl> 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA...
## $ currency <chr> "UYU", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
## $ price_period <chr> "Mensual", "Mensual", NA, "Mensual", "Mensual"...
## $ title <chr> "Departamento - Roosevelt", "PH - Boedo", "Itu...
## $ property_type <chr> "Departamento", "PH", "Casa", "Casa", "Casa", ...
## $ operation_type <chr> "Alquiler", "Venta", "Alquiler", "Venta", "Ven...
#############################
# Pto 1.b)
#############################
pr<- pr %>%
filter (l1=="Argentina" , l2=="Capital Federal", currency=="USD",
property_type=="Departamento" | property_type=="PH" | property_type=="Casa",
operation_type=="Venta") %>%
dplyr::select(id, l3, rooms, bedrooms, bathrooms, surface_total, surface_covered, price, property_type)
glimpse(pr)
## Observations: 61,905
## Variables: 9
## $ id <chr> "oyj+f764ALCYodIqBvWAww==", "HdjpKrqdwYfH9YU1D...
## $ l3 <chr> "Barracas", "Boedo", "Palermo", "Belgrano", "V...
## $ rooms <dbl> NA, 6, NA, 3, NA, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ bedrooms <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ bathrooms <dbl> NA, 2, 2, 4, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
## $ surface_total <dbl> 300, 178, 240, 157, 140, 95, 44, 40, 49, 40, 4...
## $ surface_covered <dbl> 180, 240, 157, NA, 110, 69, 38, 37, 44, 37, 37...
## $ price <dbl> 320000, 500000, 350000, 470000, 155000, 199900...
## $ property_type <chr> "PH", "Casa", "Casa", "Casa", "Casa", "Casa", ...
#############################
# Pto 2.a)
#############################
# con RBase
Variable=c("id","l3", "rooms", "bedrooms", "bathrooms", "surface_total", "surface_covered", "price", "property_type")
Cant_Valores_unicos=c(length(unique(pr$id)),length(unique(pr$l3)),
length(unique(pr$rooms)),length(unique(pr$bedrooms)),
length(unique(pr$bathrooms)),length(unique(pr$surface_total)),
length(unique(pr$surface_covered)), length(unique(pr$price)), length(unique(pr$property_type)))
Cant_NA=c(sum(is.na(pr$id)),sum(is.na(pr$l3)),sum(is.na(pr$rooms)),sum(is.na(pr$bedrooms)),
sum(is.na(pr$bathrooms)),sum(is.na(pr$surface_total)),sum(is.na(pr$surface_covered)),sum(is.na(pr$price)),sum(is.na(pr$property_type)))
data.frame(Variable=Variable, Val_Unicos=Cant_Valores_unicos, Cant_NA=Cant_NA)
# con Tidyverse
Variable=c("id","l3", "rooms", "bedrooms", "bathrooms", "surface_total","surface_covered", "price", "property_type")
Cant_Valores_unicos=unlist(map(.x=pr, function(x) length(unique(x))))
Cant_NA=unlist(map(.x=pr, function(x) sum(is.na(x))))
data.frame(Variable=Variable, Val_Unicos=Cant_Valores_unicos, Cant_NA=Cant_NA)
Podemos observar que las variable con menos datos faltantes son “property_type” (tipo de propiedad) y “price” (precio), ambas presentando ningún faltante. Una cierta lógica asiste a esta situación: es fundamental conocer el tipo de propiedad y su precio parea publicarla en un portal de compra/venta de inmuebles.
A su vez podemos observar que la variable “bedrooms” es la que que más faltantes presenta, superando de forma notable a la que le sigue, “rooms”. Sin duda los propietarios o inmobiliarias muchas veces omiten indicar la cantidad de habitaciones, situación y cosutmbre que habría que analizar, pues el mínimo sentido común marca que es una variable de marcada relevancia a la hora de evaluar la compra/alquiler de un inmueble.
#############################
# Pto 2.b)
#############################
install.packages("corrr", dependencies = TRUE, repos = 'http://cran.rstudio.com/')
## Installing package into 'C:/Users/charly/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'corrr' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\charly\AppData\Local\Temp\Rtmpwblbaj\downloaded_packages
library(corrr)
library(tidyverse)
var_numericas = colnames(pr)[unlist(map(.x=pr, .f=is.numeric))]
pr %>% dplyr::select(var_numericas)%>% correlate(use = "complete.obs")
##
## Correlation method: 'pearson'
## Missing treated using: 'complete.obs'
La matriz de correlación nos brinda la siguiente información:
-Las siguientes variables que presentan una correlación positiva alta son: > baños-habitaciones : a más habitaciones suele haber más baños > superficie total - superficie cubierta: al invrementarse la superficie cubierta suele incrementarse la superificie total.
| 3) Preparacion de los datos (II) |
| En el punto 2 deberian haber encontrado que la variable bedrooms presenta una alta proporción de valores faltantes y que presenta una fuerte correlacion con la variable rooms. Por lo tanto, vamos a eliminarla. Eliminar todos los registros que presentan valores faltantes |
| ```r ############################# # Pto 3.a) ############################# |
| pr <- dplyr::select(pr, -bedrooms) |
| pr <- na.omit(pr) |
| glimpse(pr) ``` |
## Observations: 51,210 ## Variables: 8 ## $ id <chr> "HdjpKrqdwYfH9YU1DKjltg==", "AfdcsqUSelai1ofCA... ## $ l3 <chr> "Boedo", "Velez Sarsfield", "Nuñez", "Almagro"... ## $ rooms <dbl> 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1... ## $ bathrooms <dbl> 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1... ## $ surface_total <dbl> 178, 95, 44, 40, 49, 40, 40, 40, 49, 40, 23, 4... ## $ surface_covered <dbl> 240, 69, 38, 37, 44, 37, 37, 37, 44, 37, 23, 3... ## $ price <dbl> 500000, 199900, 147000, 92294, 115000, 77000, ... ## $ property_type <chr> "Casa", "Casa", "Departamento", "Departamento"... |
#############################
# Pto 4.a)
#############################
summary(pr$price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6000 119000 170000 251577 270000 6000000
ggplot(pr, aes(x=price))+
geom_histogram(binwidth = 10000)
Mediante 6 numeros representativos de un conjunto de datos ( Min.,1st Qu., Median,Mean,3rd Qu. y Max. ) y la observación del histograma podemos afirmar que la distribución de los precios presenta un alto sesgo a derechas.
#############################
# Pto 4.b)
#############################
pr %>% group_by(property_type) %>% summarize(min=min(price), Q1=quantile(price,probs = 0.25),median=median(price),Q3=quantile(price,probs = 0.75), media=mean(price), max=max(price) )
#############################
# Pto 4.c)
#############################
ggplot(pr, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
geom_boxplot()
Nuevamente podemos apreciar aquí un fuerte sesgo a deechas en los precios, ahora agrupados por tipo de propiedad.
#############################
# Pto 4.d)
#############################
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
##
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
##
## nasa
pr %>% dplyr::select(-c(id, l3)) %>% ggpairs(mapping = aes(color = property_type))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Outliers
#############################
# Pto 5.a)
#############################
# Observando los 6 números que describen al precio en función del tipo de propiedad obervamos que tenemos valores atípicos tanto a izquierdas (valores extremadamente bajos) y a derechas (valores extremasamente altos)
# probemos cómo quedaría el histograma y el boxplot quitando el 5% de cada lado de la distribución:
ggplot(pr %>% filter(price>quantile(price, probs=0.05), price<quantile(price, probs=0.95)), aes(x=price))+
geom_histogram(binwidth = 10000)
# vemos que el cuantil 5 es bastante grande (79000), y que el pcuantil 95, es relatovamente poco para propiedades de alta gama (670000). Pruebo con cuantiles 2.5 y 97.5 y y la conculsión es similar, por ende opto por determinar dos puntos de corte, dejando el dataset acotado a precios entre 30000 y 1200000 (treinta m,il y un millón de dólares)
pr_2 = filter(pr, price>30000, price<=1000000)
Analisis exploratorios (III)
#############################
# Pto 6.a)
#############################
summary(pr_2$price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 31500 118000 168000 218259 264000 1000000
# Histograma con todos los valores de la variable precio
ggplot(pr_2, aes(x=price))+
geom_histogram(binwidth = 10000)
AHora hemos obtenido una distribución, que aún siendo fuertemente sesgada a derecha, no posee outliers “salvajes”.
#############################
# Pto b)
#############################
pr_2 %>% group_by(property_type) %>% summarize(min=min(price), Q1=quantile(price,probs = 0.25),median=median(price),Q3=quantile(price,probs = 0.75), media=mean(price), max=max(price) )
Aquí podemos arribar a la misma copnlsusión anteriori mediante la observaciço de los seis números descriptivos para los conjuntos de precios agrupados por tipo de propiedad
#############################
# Pto c)
#############################
ggplot(pr, aes(x = property_type, y = price, group = property_type, fill = property_type )) +
geom_boxplot()
Aquí se ve claramante que siguen siendo distribuciones marcadamente sesgadas a derecha, pero que ahora presentan bopxplots más razonables en términos de presencia y detección de valores anómalos
7)Modelo lineal
a) 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)
b)Usar la función summary() para obtener informacion de ambos modelos. Explicar los valores de los coeficientes estimados.
c)¿Cuál modelo usarían para predecir el precio? ¿Por qué?
#############################
# Pto 7.a)
#############################
glimpse(pr_2)
## Observations: 50,037
## Variables: 8
## $ id <chr> "HdjpKrqdwYfH9YU1DKjltg==", "AfdcsqUSelai1ofCA...
## $ l3 <chr> "Boedo", "Velez Sarsfield", "Nuñez", "Almagro"...
## $ rooms <dbl> 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ bathrooms <dbl> 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ surface_total <dbl> 178, 95, 44, 40, 49, 40, 40, 40, 49, 40, 23, 4...
## $ surface_covered <dbl> 240, 69, 38, 37, 44, 37, 37, 37, 44, 37, 23, 3...
## $ price <dbl> 500000, 199900, 147000, 92294, 115000, 77000, ...
## $ property_type <chr> "Casa", "Casa", "Departamento", "Departamento"...
lm_rooms = lm(price ~ rooms, data=pr_2)
lm_surface = lm(price ~ surface_total ,data=pr_2)
#############################
# Pto 7.b)
#############################
# Info modelos lm_rooms
summary(lm_rooms)
##
## Call:
## lm(formula = price ~ rooms, data = pr_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1674332 -67224 -19224 29645 834356
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25065.2 1257.9 19.93 <2e-16 ***
## rooms 70289.6 411.5 170.83 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 123200 on 50035 degrees of freedom
## Multiple R-squared: 0.3684, Adjusted R-squared: 0.3684
## F-statistic: 2.918e+04 on 1 and 50035 DF, p-value: < 2.2e-16
# El beta_0 algebraicamente represnta la "ordenada al origen", o sea el valor que toma la variabla dependeiente "y" cuando la variable independiente"X" es igual a 0. En términos del entorno de aplicación puntual de este dataset representa el precio que el modelo le asignaría a una propiedad que no tuviera ningún ambiente.
# El beta_1 representa en nomenclatura matemñatica a la pendiente de la recta tangente en un punto, o la tasa de variación de y respecto de x, en otras palabras: cuanto varía "y" cuando "x" varía en una unidad.En términos del entorno de aplicación puntual de este dataset representa la variación del precio por cada ambiente adicional de una propiedad.
# Info modelos lm_rooms
summary(lm_surface)
##
## Call:
## lm(formula = price ~ surface_total, data = pr_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1368936 -99849 -49979 45730 782302
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.172e+05 6.968e+02 311.70 <2e-16 ***
## surface_total 1.084e+01 8.412e-01 12.89 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 154800 on 50035 degrees of freedom
## Multiple R-squared: 0.003309, Adjusted R-squared: 0.003289
## F-statistic: 166.1 on 1 and 50035 DF, p-value: < 2.2e-16
# El beta_0 algebraicamente represnta la "ordenada al origen", o sea el valor que toma la variabla dependeiente "y" cuando la variable independiente"X" es igual a 0. En términos del entorno de aplicación puntual de este dataset representa el precio que el modelo le asignaría a una propiedad cuya superficie sea 0.
# El beta_1 representa en nomenclatura matemñatica a la pendiente de la recta tangente en un punto, o la tasa de variación de y respecto de x, en otras palabras: cuanto varía "y" cuando "x" varía en una unidad.En términos del entorno de aplicación puntual de este dataset representa la variación del precio por cada metro cuadrado adicional de una propiedad.
#############################
# Pto c)
#############################
# primero realizo un diagrama de dispersión que muestre la relación entre entre la cantidad de ambientes y entre la superficie total del inmnueble y su precio
Beta_0_rooms=lm_rooms$coefficients["(Intercept)"]
Beta_1_rooms=lm_rooms$coefficients["rooms"]
ggplot(pr_2, aes(x=rooms, y=price)) + geom_abline(aes(intercept = Beta_0_rooms, slope = Beta_1_rooms, colour = "red"), alpha = 1 ) +geom_point()
Veamos la ECM del modelo:
ECM_mod_rooms= sqrt(sum((pr_2$price - (Beta_0_rooms + Beta_1_rooms*pr_2$rooms))^2)/nrow(pr_2))
Y ahora para el segundo modelo, lm_surface, que relaciona la superficie total con el precio
Beta_0_surface=lm_surface$coefficients["(Intercept)"]
Beta_1_surface=lm_surface$coefficients["surface_total"]
ggplot(pr_2, aes(x=surface_total, y=price)) + geom_abline(aes(intercept = Beta_0_surface, slope = Beta_1_surface, colour = "red"), alpha = 1 ) +geom_point()
Claramente la presencia de esos valores extremos en x distorsionan el gráfico, y el cálculo del ECM. Por ende los voy eliminar del dataset
pr_3 = filter(pr_2, surface_total < 5e+04)
lm_surface = lm(price ~ surface_total ,data=pr_3)
Beta_0_surface_2=lm_surface$coefficients["(Intercept)"]
Beta_1_surface_2=lm_surface$coefficients["surface_total"]
ggplot(pr_3, aes(x=surface_total, y=price)) + geom_abline(aes(intercept = Beta_0_surface_2, slope = Beta_1_surface_2, colour = "red"), alpha = 1 ) +geom_point()
Y sin esos valores veamos la ECM del modelo:
ECM_mod_surface= sqrt(sum((pr_3$price - (Beta_0_surface_2 + Beta_1_surface_2*pr_3$surface_total))^2)/nrow(pr_3))
A la luz de la raíz de la suma de los promdeios de los cuadrados de los residuos, y habiendo hecho una eliminiación de valores muy extremos de la variable superficie total, podríamos decir que el modelo de regresión simple cuya variable independiente es la cantidad de ambientes predice levemente mejor el precio del inmueble que el que utiliza la superficie total.