Datos provistos por Properati Argentina

ALUMNO: Carlos Arana

  1. Preparacion de los datos (I)
  1. Leer el archivo ar_properties.csv y mostrar su estructura
  2. Quedarse con aquellos registros que:
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", ...

  1. Analisis exploratorios (I)
  1. Obtener la cantidad de valores unicos y de valores faltantes (NAs) para cada una de estas variables
  2. Obtener la matriz de correlacion para las variables numericas. Pista: usen ‘complete.obs’ para poder omitir los valores faltantes.
#############################
# 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"...
  1. Analisis exploratorios (II)
  1. Obtener estadisticas descriptivas para la variable precio (cuartiles, promedio, minimo y maximo) y realizar un histograma de la variable
  2. Obtener estadisticas descriptivas para la variable precio (cuartiles, promedio, minimo y maximo) por cada tipo de propiedad.
  3. Realizar un grafico de boxplot de la variable precio por tipo de propiedad
  4. Realizar un correlagrama usando GGAlly
#############################
# 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`.

  1. Outliers

    1. Eliminar los outliers de la variable precio con algún criterio que elijan: puede ser por valores de corte, eliminar el x% a izquierda y derecha,etc.
#############################
# 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)
  1. Analisis exploratorios (III)

    1. Repetir los 4 análisis exploratorios realizados en el punto 4 y realizar unos breves comentarios sobre los cambios que encontraron
#############################
# 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.