Como primer paso se cargan los paquetes

library(dplyr)
library(tidyr)
library(readr)
library(corrr)
library(GGally)

1. Preparacion de los datos (I)

  1. Cargar los datos y mostrar su estructura
#Cargo los datos
ar_properties <- read_csv("D:/OneDrive/Ciencia de Datos/06 Enfoque estadĆ­stico/TP01/TP01/ar_properties.csv")
#Veo su estructura
glimpse(ar_properties)
## 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...
summary(ar_properties)
##       id              ad_type            start_date        
##  Length:388891      Length:388891      Min.   :2018-12-29  
##  Class :character   Class :character   1st Qu.:2019-02-15  
##  Mode  :character   Mode  :character   Median :2019-03-31  
##                                        Mean   :2019-03-31  
##                                        3rd Qu.:2019-05-12  
##                                        Max.   :2019-06-26  
##                                                            
##     end_date            created_on              lat        
##  Min.   :2018-12-30   Min.   :2018-12-29   Min.   :-54.98  
##  1st Qu.:2019-05-15   1st Qu.:2019-02-15   1st Qu.:-34.67  
##  Median :2019-06-27   Median :2019-03-31   Median :-34.60  
##  Mean   :4426-06-16   Mean   :2019-03-31   Mean   :-34.48  
##  3rd Qu.:9999-12-31   3rd Qu.:2019-05-12   3rd Qu.:-34.43  
##  Max.   :9999-12-31   Max.   :2019-06-26   Max.   : 44.67  
##                                            NA's   :50597   
##       lon               l1                 l2           
##  Min.   :-105.27   Length:388891      Length:388891     
##  1st Qu.: -58.80   Class :character   Class :character  
##  Median : -58.48   Mode  :character   Mode  :character  
##  Mean   : -59.37                                        
##  3rd Qu.: -58.40                                        
##  Max.   : -41.90                                        
##  NA's   :50597                                          
##       l3                 l4                 l5               l6         
##  Length:388891      Length:388891      Length:388891      Mode:logical  
##  Class :character   Class :character   Class :character   NA's:388891   
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##      rooms           bedrooms        bathrooms     surface_total     
##  Min.   : 1.0     Min.   : -2.00   Min.   : 1.00   Min.   :    -3.0  
##  1st Qu.: 2.0     1st Qu.:  1.00   1st Qu.: 1.00   1st Qu.:    50.0  
##  Median : 3.0     Median :  2.00   Median : 1.00   Median :    91.0  
##  Mean   : 2.9     Mean   :  2.16   Mean   : 1.67   Mean   :   458.3  
##  3rd Qu.: 4.0     3rd Qu.:  3.00   3rd Qu.: 2.00   3rd Qu.:   266.0  
##  Max.   :40.0     Max.   :390.00   Max.   :20.00   Max.   :200000.0  
##  NA's   :144668   NA's   :230747   NA's   :94136   NA's   :74063     
##  surface_covered       price             currency        
##  Min.   :   -139   Min.   :0.000e+00   Length:388891     
##  1st Qu.:     43   1st Qu.:2.000e+04   Class :character  
##  Median :     70   Median :9.400e+04   Mode  :character  
##  Mean   :    235   Mean   :2.690e+05                     
##  3rd Qu.:    142   3rd Qu.:2.250e+05                     
##  Max.   :4000000   Max.   :2.147e+09                     
##  NA's   :97854     NA's   :21222                         
##  price_period          title           property_type     
##  Length:388891      Length:388891      Length:388891     
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##                                                          
##  operation_type    
##  Length:388891     
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
  1. y c. Seleccion de los registros y variables indicados en el TP
df = ar_properties %>%
  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)

dim(df) #se confirma las dimensiones indicadas en el TP
## [1] 61905     9

2. Analisis exploratorios (I)

  1. Obtengo los valores unicos y los NA
  #transformo a factores 
  charcol = c('id', 'l3', "property_type")
  df[charcol] <- lapply(df[charcol] , factor)
  #valores unicos para cada variable
  unicos = sapply(df, function(x) length(unique(x)))
  
  #cantidad de NA para cada variable
  nas = sapply(df, function(x) sum(is.na(x)))
  
  rbind(unicos, nas)
##           id  l3 rooms bedrooms bathrooms surface_total surface_covered
## unicos 61905  58    24       25        15           671             573
## nas        0 355  5314    25298      3196          3671            2975
##        price property_type
## unicos  4095             3
## nas        0             0

En la tabla anterior se puede ver como todas las propiedades cuentan con un precio y tienen asignada un tipo de propiedad. Las demĆ”s varaibles tienen datos faltantes. La variable con mayor proporción de datos faltantes es ā€œbedroomsā€ seguida por ā€œroomsā€.

  1. Calculo la matriz de correlacion para variables numericas
  df %>% 
    select(-c(id,l3,property_type)) %>%
    cor(.,use="pairwise.complete.obs")
##                      rooms   bedrooms  bathrooms surface_total
## rooms           1.00000000 0.92382161 0.62574631    0.08169819
## bedrooms        0.92382161 1.00000000 0.62667805    0.07892981
## bathrooms       0.62574631 0.62667805 1.00000000    0.08607046
## surface_total   0.08169819 0.07892981 0.08607046    1.00000000
## surface_covered 0.09199855 0.08435479 0.09633800    0.69441844
## price           0.30418750 0.34137037 0.42063819    0.07664240
##                 surface_covered      price
## rooms                0.09199855 0.30418750
## bedrooms             0.08435479 0.34137037
## bathrooms            0.09633800 0.42063819
## surface_total        0.69441844 0.07664240
## surface_covered      1.00000000 0.09236313
## price                0.09236313 1.00000000
#se produce una visualizacion de la matriz de correlacion
  df %>% 
    select(-c(id,l3,property_type)) %>%
    correlate(use = 'complete.obs')%>% 
  network_plot(min_cor = 0.4)
## 
## Correlation method: 'pearson'
## Missing treated using: 'complete.obs'

La matriz de correlación y el grĆ”fico anterior muestran como las variables ā€œroomsā€ y ā€œbedroomsā€ son las que presentan una mayor correlación entre sĆ­. Le siguen la ā€œsurface_totalā€ y ā€œsurface_coveredā€. Al analizar la correlación con la variable precio se observa que las variables mĆ”s correlacionadas son ā€œroomsā€, ā€œbedroomsā€ y ā€œbathroomsā€ todas relacionadas con la cantidad de habitaciones de una propiedad. Resalta el hecho de que la correlación con del precio con la superficie es muy baja y es sabido que este valor influye de manera importante en el precio de una propiedad.

3. Preparacion de los datos (II)

a y b) eliminacion de variable room y de datos faltantes

  df = df %>%
    select(-bedrooms) %>%
    na.omit()
  
  head(df)
## # A tibble: 6 x 8
##   id    l3    rooms bathrooms surface_total surface_covered  price
##   <fct> <fct> <dbl>     <dbl>         <dbl>           <dbl>  <dbl>
## 1 Hdjp~ Boedo     6         2           178             240 500000
## 2 Afdc~ Vele~     3         2            95              69 199900
## 3 ESzy~ NuƱez     1         1            44              38 147000
## 4 r22O~ Alma~     1         1            40              37  92294
## 5 atZQ~ Alma~     1         1            49              44 115000
## 6 R7Is~ Alma~     1         1            40              37  77000
## # ... with 1 more variable: property_type <fct>
  dim(df) #se confirma las dimensiones del dataset del tp
## [1] 51210     8

4. Analisis exploratorios (II)

  1. Estadistica descriptiva de la variable precio y creacion de histrograma
summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    6000  119000  170000  251577  270000 6000000
ggplot(df, aes(price))+
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

La estadística descriptiva indica que el menor de la variable precio es de 6 000 USD lo cuÔl puede considerarse como un error, a su vez muestra un valor mÔximo de 6 000 000 USD que podría considerarse atípico (habría que evaluar otras variables). Puesto que el valor de la mediana es inferior a la media, la distribución tiene una asimetría derecha. Al ver el histograma se puede ver como existen valores altos con muy poca frecuencia. Esto puede indicar que los valores altos son un grupo de propiedades con características propias o corresponden a valores atípicos.

  1. Estadistica descriptiva de la variable precio para cada tipo de propiedad
  casa = summary((df %>% filter(property_type == 'Casa'))$price)
  ph = summary((df %>% filter(property_type == 'PH'))$price)
  depto = summary((df %>% filter(property_type == 'Departamento'))$price)
  t(rbind(casa, ph, depto))
##              casa        ph     depto
## Min.      20000.0   32000.0    6000.0
## 1st Qu.  235000.0  137000.0  115000.0
## Median   335000.0  190000.0  164000.0
## Mean     434188.8  218747.4  246855.7
## 3rd Qu.  490000.0  270000.0  260000.0
## Max.    5000000.0 1500000.0 6000000.0
  1. Boxplot de precio para cada tipo de propiedad
ggplot(df, aes(property_type, price, colour = property_type))+
  geom_boxplot()

La estadĆ­stica descriptiva y los boxplots muestran que las departamentos son la propiedades que tienen un mayor rango, sin embargo el primer y tercer cuartil se encuentran cerca lo que implica que la mayorĆ­a de los datos estĆ”n concentrados cerca de su mediana en relación con las propiedades tipo ā€œCasaā€. Los precios de las casas son superiores respecto a las otras propiedades y presentan una gran dispersión en la parte alta al igual que las propiedades tipo departamento. Las propiedades tipo ā€œPHā€ son las que tienen un menor rango y tiene un compartamiento similar a los departamentos (exceptuando los valores del cuarto cuartil). La estadĆ­stica descriptica permite identificar que los valores mĆ­nimos y mĆ”ximos se encuentran en las propiedades tipo departamento.

  1. Correlograma utilizando GGAlly
 ggpairs(df[c(-1,-2)], title = "Matriz de correlaciones",mapping = aes(colour= 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`.

Al analizar el correlograma se puede ver que a nivel general se mantienen los resultados de las matriz de correlación. Luego de remover las variable ā€œbedroomsā€ y los faltantes, la variable que mejor explica el precio es la cantidad de baƱos seguida por la cantidad de cuartos. Al ver los grĆ”ficos de dispersión de la variable precio se pueden ver valores atĆ­picos y formas diferentes a la ā€œpelota de rugbyā€ que hacen que las estimaciones de correlación no sean las mejores.

5. Outliers

  1. Eliminar outliers de la variable precio En primer lugar se visualiza la variable precio
ggplot(df, aes(price, rank(price), colour = property_type))+
    geom_point(shape = 1)

Se observa que a partir de $1 000 000 existen muy pocas propiedades. La escala del grafico no permite observar las observaciones inferiores por ende se realiza un grafico de los menores valores

  ggplot(df, aes(price, rank(price), colour = property_type))+
    geom_point(shape = 1)+
  coord_cartesian(ylim=c(-0,500), xlim=c(0,70000))

Se asume que propiedades con valores menores a los $40 000 son irreales en el mercado. Se oberva que solo alrededor de 150 observaciones tienen estas propiedades.

Se realiza el corte univariado de outliers. Seria adecuado eventualmente realizar un analisis multivariado de outliers

 df_outlier = df %>%
    filter(price>40000 & price<1000000)

cat('porcentaje de outliers',(-nrow(df_outlier)+nrow(df))/nrow(df)*100,'%')
## porcentaje de outliers 2.442882 %

6 Analisis exploratorios (III)

Se repiten los pasos del punto 4 con los nuevos datos

summary(df_outlier$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   41000  118000  168000  218043  264000  999999
  ggplot(df_outlier, aes(price))+
    geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como se redujeron una mayor cantidad de datos altos, los valores de la estadistica descriptiva son menores. Se puede observar que el histograma mantiene su asimetria pero al recortar los valores atipicos, la cola se reduce y los bins tienen una altura perceptible.

#Obtener estadisticas descriptivas para la variable precio (cuartiles, promedio,
  #minimo y maximo) por cada tipo de propiedad.
  casa_outlier = summary((df_outlier %>% filter(property_type == 'Casa'))$price)
  ph_outlier = summary((df_outlier %>% filter(property_type == 'PH'))$price)
  depto_outlier = summary((df_outlier %>% filter(property_type == 'Departamento'))$price)
  print('estadisticas del precio por tipo de vivienda')
## [1] "estadisticas del precio por tipo de vivienda"
  t(rbind(casa_outlier, ph_outlier, depto_outlier))
##         casa_outlier ph_outlier depto_outlier
## Min.         55000.0    42000.0       41000.0
## 1st Qu.     230000.0   137000.0      115000.0
## Median      325000.0   190000.0      160000.0
## Mean        367608.1   218324.8      211283.5
## 3rd Qu.     460000.0   270000.0      250000.0
## Max.        990000.0   970000.0      999999.0

Se observa modificaciones en los tres tipos de variables, sin embargo la vivienda tipo PH mantiene el primer, segundo y tercer cuartil indicando que no se ve tan afectada por el recorte de datos atipicos.

  #Realizar un grafico de boxplot de la variable precio por tipo de propiedad
  ggplot(df_outlier, aes(property_type, price, colour = property_type))+
    geom_boxplot()

Lo mismo se refleja en los boxplots.

Realizo una resta de las matrices de correlacion para ver el cambio producto de la salida de outliers

  cor_df = df %>% 
    select(-c(id,l3,property_type)) %>%
    cor(.,use="pairwise.complete.obs")


cor_df_out =   df_outlier %>% 
    select(-c(id,l3,property_type)) %>%
    cor(.,use="pairwise.complete.obs")

cor_df-cor_df_out
##                       rooms   bathrooms surface_total surface_covered
## rooms            0.00000000  0.01867417  0.0101232529    0.0131332581
## bathrooms        0.01867417  0.00000000  0.0113302909    0.0154591326
## surface_total    0.01012325  0.01133029  0.0000000000    0.0008096315
## surface_covered  0.01313326  0.01545913  0.0008096315    0.0000000000
## price           -0.10765779 -0.05679452  0.0070259598    0.0119548617
##                       price
## rooms           -0.10765779
## bathrooms       -0.05679452
## surface_total    0.00702596
## surface_covered  0.01195486
## price            0.00000000

Al comparar las matrices de correlación se observa una variación importante en la correlación que es la relativa a precio-rooms (disminuye 0,108)

Es interesante notar que la correlacion entre rooms-precio y bathrooms-precio disminuye al eliminar outliers y todas las demas aumentan.

7 Modelo lineal

Habitaciones

  1. Se crea modelo lineal de precio en funcion de habitaciones
  #Realizar un modelo lineal simple para explicar el precio en función de las habitaciones (rooms)
  m_hab = lm(price~rooms, df_outlier)
  ggplot(df_outlier, aes(rooms, price))+
    geom_point(position = 'jitter', shape = 1, alpha = 0.2) +
    geom_smooth(method = 'lm')

  1. aplicar la funcion summary en modelo de habitaciones y explicar sus coeficientes
 summary(m_hab)
## 
## Call:
## lm(formula = price ~ rooms, data = df_outlier)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1661735   -66862   -18906    29498   824229 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  26040.5     1253.9   20.77   <2e-16 ***
## rooms        69865.4      410.4  170.25   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 122500 on 49957 degrees of freedom
## Multiple R-squared:  0.3672, Adjusted R-squared:  0.3672 
## F-statistic: 2.899e+04 on 1 and 49957 DF,  p-value: < 2.2e-16

El modelo linel ajustado es de la siguiente forma: Precio = 26040 + 69865xcuartos. Esto implica que cada cuarto adicional aumenta el monto del inmueble en 69865 USD. El p valor de los coeficientes indica que se puede rechazar la hipotesis nula de que no hay asociacion lineal entre el precio y cuartos.

Superficie

  1. Se crea modelo lineal de precio en funcion de superficie
  #y otro modelo que explique el precio en función de la superficie total (surface_total)
  m_surf = lm(price~surface_total, df_outlier)
  
  ggplot(df_outlier, aes(surface_total, price))+
    geom_point(position = 'jitter', shape = 1, alpha = 0.2)+
    geom_smooth(method = 'lm')

  1. aplicar la funcion summary en modelo de superficie y explicar sus coeficientes
  summary(m_surf)
## 
## Call:
## lm(formula = price ~ surface_total, data = df_outlier)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1349581   -99543   -49757    45826   780254 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   2.170e+05  6.928e+02  313.23   <2e-16 ***
## surface_total 1.069e+01  8.357e-01   12.79   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 153800 on 49957 degrees of freedom
## Multiple R-squared:  0.003265,   Adjusted R-squared:  0.003245 
## F-statistic: 163.6 on 1 and 49957 DF,  p-value: < 2.2e-16

El modelo linel ajustado es de la siguiente forma: Precio = 217000 + 10,69xsuperficie total. Esto implica que cada unidad de superficie adicional aumenta el monto del inmueble en 10,69 USD. El p valor de los coeficientes indica que se puede rechazar la hipotesis nula de que no hay asociacion lineal entre el precio y la superficie.

  1. Cual modelo utilizaria y por que?

Los modelos utlizados al analizarlos graficamente no tienen una clara relacion lineal (es probable que al ajustar de mejor manera por outliers el modelo mejore). Se deberia analizar mas en detalle los valores atipicos y explorar otros modelos para explicar de mejor manera el comportamiento de la variable precio. En todo caso, si tuviera que elegir eligiria el modelo que predice el precio en funcion de los cuartos ya que tiene un mejor R2, menor error estandar de los residuos y graficamente parece tener una relacion mas clara.