# Cargo los paquetes a utilizar:

library(tidyverse)
library(plotly)
library(modelr)
library(tidymodels)
library(ggridges)
library(ggthemes)
library(ggplot2)
library(purrr)
# Como primer paso, cargo el dataset
properati <- readRDS("ar_properties.rds")
str(properati)
## Classes 'tbl_df', 'tbl' and 'data.frame':    45904 obs. of  8 variables:
##  $ id             : chr  "AfdcsqUSelai1ofCAq2B0Q==" "ESzybdH7YU2uIU1/kHtRGw==" "r22OfzZ3kXooSPoE5HMuZQ==" "atZQXVtyfG7+OiX6gYY3lA==" ...
##  $ l3             : chr  "Velez Sarsfield" "Nuñez" "Almagro" "Almagro" ...
##  $ rooms          : num  3 1 1 1 1 1 1 1 1 1 ...
##  $ bathrooms      : num  2 1 1 1 1 1 1 1 1 1 ...
##  $ surface_total  : num  95 44 40 49 40 40 40 49 40 40 ...
##  $ surface_covered: num  69 38 37 44 37 37 37 44 37 37 ...
##  $ price          : num  199900 147000 92294 115000 77000 ...
##  $ property_type  : chr  "Casa" "Departamento" "Departamento" "Departamento" ...

Modelo I: modelado del precio del inmueble a partir de todas las covariables.

# Paso a factores las variables categóricas
properati <-properati%>% mutate(l3 = as.factor(l3),
                                id = as.factor(id),
                                property_type=as.factor(property_type)
                                )

Creo un modelo para predecir el precio de las propiedades con todas las covariables.

# Utilizo la función "lm" para crear el modelo de Regresión Lineal Múltiple
modelo_1 <- lm( price ~ rooms+ bathrooms+ surface_total+ surface_covered + factor(l3) + factor(property_type) , data = properati)
summary(modelo_1)
## 
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered + 
##     factor(l3) + factor(property_type), data = properati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -400904  -33817   -3307   24660  560915 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)                       -109406.61    4788.67 -22.847  < 2e-16
## rooms                               -3961.27     444.58  -8.910  < 2e-16
## bathrooms                           34040.98     644.28  52.836  < 2e-16
## surface_total                         919.08      23.52  39.069  < 2e-16
## surface_covered                      1457.18      28.73  50.715  < 2e-16
## factor(l3)Agronomía                   623.53    8846.14   0.070 0.943807
## factor(l3)Almagro                   -4520.04    4295.24  -1.052 0.292650
## factor(l3)Balvanera                -24788.27    4551.65  -5.446 5.18e-08
## factor(l3)Barracas                 -10128.24    5351.06  -1.893 0.058397
## factor(l3)Barrio Norte              49921.81    4417.82  11.300  < 2e-16
## factor(l3)Belgrano                  69648.12    4283.55  16.259  < 2e-16
## factor(l3)Boca                     -47540.60    7076.20  -6.718 1.86e-11
## factor(l3)Boedo                    -19034.38    5219.54  -3.647 0.000266
## factor(l3)Caballito                  6220.15    4301.29   1.446 0.148153
## factor(l3)Catalinas                -76321.95   33563.74  -2.274 0.022974
## factor(l3)Centro / Microcentro     -29046.49    6781.80  -4.283 1.85e-05
## factor(l3)Chacarita                 11903.39    5299.02   2.246 0.024687
## factor(l3)Coghlan                   40820.55    5462.90   7.472 8.02e-14
## factor(l3)Colegiales                34073.02    4816.54   7.074 1.52e-12
## factor(l3)Congreso                 -32314.97    5494.75  -5.881 4.10e-09
## factor(l3)Constitución             -47292.98    6321.63  -7.481 7.50e-14
## factor(l3)Flores                   -22510.27    4536.15  -4.962 6.99e-07
## factor(l3)Floresta                 -28315.65    5069.38  -5.586 2.34e-08
## factor(l3)Las Cañitas               90455.90    5883.38  15.375  < 2e-16
## factor(l3)Liniers                  -20080.34    5366.27  -3.742 0.000183
## factor(l3)Mataderos                -33863.43    5424.79  -6.242 4.35e-10
## factor(l3)Monserrat                -32431.49    5228.46  -6.203 5.59e-10
## factor(l3)Monte Castro              -8770.72    5949.63  -1.474 0.140445
## factor(l3)Nuñez                     56958.42    4559.69  12.492  < 2e-16
## factor(l3)Once                     -30757.83    5456.51  -5.637 1.74e-08
## factor(l3)Palermo                   66169.58    4221.50  15.674  < 2e-16
## factor(l3)Parque Avellaneda        -34398.95    7598.09  -4.527 5.99e-06
## factor(l3)Parque Centenario        -12288.30    5016.45  -2.450 0.014305
## factor(l3)Parque Chacabuco         -22537.83    5314.36  -4.241 2.23e-05
## factor(l3)Parque Chas                5195.26    7542.97   0.689 0.490981
## factor(l3)Parque Patricios         -36808.02    5973.29  -6.162 7.24e-10
## factor(l3)Paternal                 -13314.50    5189.69  -2.566 0.010304
## factor(l3)Pompeya                  -79977.17    8035.74  -9.953  < 2e-16
## factor(l3)Puerto Madero            259015.83    5095.12  50.836  < 2e-16
## factor(l3)Recoleta                  64088.22    4360.34  14.698  < 2e-16
## factor(l3)Retiro                    26067.40    5281.27   4.936 8.01e-07
## factor(l3)Saavedra                  19492.00    4914.18   3.966 7.31e-05
## factor(l3)San Cristobal            -23739.75    4955.13  -4.791 1.67e-06
## factor(l3)San Nicolás              -26247.55    5168.96  -5.078 3.83e-07
## factor(l3)San Telmo                 -5653.85    4877.12  -1.159 0.246356
## factor(l3)Tribunales               -34608.17    8924.63  -3.878 0.000106
## factor(l3)Velez Sarsfield          -25943.69    8303.75  -3.124 0.001783
## factor(l3)Versalles                -22232.13    6758.40  -3.290 0.001004
## factor(l3)Villa Crespo               1595.26    4317.54   0.369 0.711770
## factor(l3)Villa del Parque          -3290.17    4866.59  -0.676 0.498997
## factor(l3)Villa Devoto              13301.39    4807.08   2.767 0.005659
## factor(l3)Villa General Mitre      -19170.08    6802.25  -2.818 0.004831
## factor(l3)Villa Lugano             -83039.18    6533.35 -12.710  < 2e-16
## factor(l3)Villa Luro                -7579.11    5404.78  -1.402 0.160833
## factor(l3)Villa Ortuzar             18667.61    6829.18   2.734 0.006269
## factor(l3)Villa Pueyrredón          10516.80    5349.56   1.966 0.049314
## factor(l3)Villa Real                -8823.37    8745.56  -1.009 0.313030
## factor(l3)Villa Riachuelo          -32775.66   17171.10  -1.909 0.056298
## factor(l3)Villa Santa Rita          -5767.71    6383.86  -0.903 0.366274
## factor(l3)Villa Soldati           -136489.91   18944.29  -7.205 5.90e-13
## factor(l3)Villa Urquiza             30648.43    4418.91   6.936 4.09e-12
## factor(property_type)Departamento   92653.32    2191.23  42.284  < 2e-16
## factor(property_type)PH             46779.37    2274.94  20.563  < 2e-16
##                                      
## (Intercept)                       ***
## rooms                             ***
## bathrooms                         ***
## surface_total                     ***
## surface_covered                   ***
## factor(l3)Agronomía                  
## factor(l3)Almagro                    
## factor(l3)Balvanera               ***
## factor(l3)Barracas                .  
## factor(l3)Barrio Norte            ***
## factor(l3)Belgrano                ***
## factor(l3)Boca                    ***
## factor(l3)Boedo                   ***
## factor(l3)Caballito                  
## factor(l3)Catalinas               *  
## factor(l3)Centro / Microcentro    ***
## factor(l3)Chacarita               *  
## factor(l3)Coghlan                 ***
## factor(l3)Colegiales              ***
## factor(l3)Congreso                ***
## factor(l3)Constitución            ***
## factor(l3)Flores                  ***
## factor(l3)Floresta                ***
## factor(l3)Las Cañitas             ***
## factor(l3)Liniers                 ***
## factor(l3)Mataderos               ***
## factor(l3)Monserrat               ***
## factor(l3)Monte Castro               
## factor(l3)Nuñez                   ***
## factor(l3)Once                    ***
## factor(l3)Palermo                 ***
## factor(l3)Parque Avellaneda       ***
## factor(l3)Parque Centenario       *  
## factor(l3)Parque Chacabuco        ***
## factor(l3)Parque Chas                
## factor(l3)Parque Patricios        ***
## factor(l3)Paternal                *  
## factor(l3)Pompeya                 ***
## factor(l3)Puerto Madero           ***
## factor(l3)Recoleta                ***
## factor(l3)Retiro                  ***
## factor(l3)Saavedra                ***
## factor(l3)San Cristobal           ***
## factor(l3)San Nicolás             ***
## factor(l3)San Telmo                  
## factor(l3)Tribunales              ***
## factor(l3)Velez Sarsfield         ** 
## factor(l3)Versalles               ** 
## factor(l3)Villa Crespo               
## factor(l3)Villa del Parque           
## factor(l3)Villa Devoto            ** 
## factor(l3)Villa General Mitre     ** 
## factor(l3)Villa Lugano            ***
## factor(l3)Villa Luro                 
## factor(l3)Villa Ortuzar           ** 
## factor(l3)Villa Pueyrredón        *  
## factor(l3)Villa Real                 
## factor(l3)Villa Riachuelo         .  
## factor(l3)Villa Santa Rita           
## factor(l3)Villa Soldati           ***
## factor(l3)Villa Urquiza           ***
## factor(property_type)Departamento ***
## factor(property_type)PH           ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 66580 on 45841 degrees of freedom
## Multiple R-squared:  0.7764, Adjusted R-squared:  0.7761 
## F-statistic:  2568 on 62 and 45841 DF,  p-value: < 2.2e-16

Análisis del modelo I

Interpretación de los coeficientes estimados:

  • rooms: coeficiente negativo y significativo al 1%
  • bathrooms, surface_total y surface_covered: coeficientes positivos y significativos al 1%
  • property type: significativo al 1%. coeficiente positivo para PH y Departamento.
  • Barrio (l3): significativo al 1%. coeficiente positivo para algunos casos y negativo en otros.

Medidas de evaluación del modelo I:

El modelo logra captar un 77,6% de la variabilidad del precio (R2 = 0.776). Asimismo, el test F de significatividad global registra un p-valor menor a 1%; por lo tanto, se rechaza la hipótesis nula de que todos los coeficientes son cero.

Qué es preferible tener para vender?¿un depto. en Abasto o un PH en Balvanera?

Para responder a esta pregunta evaluamos las características de cada propiedad en el modelo estimado en la sub sección previa.

  • Departamento de 120 mts cuadrados cubiertos en abasto, con 3 dormitorios y 2 baños
  • Un PH en Balvanera, con 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños.
# Con la función predict comparo el valor total de cada uno de las propiedades dadas las características del problema
predict.list <- predict(modelo_1,
    newdata = data.frame(l3 = c("Abasto", "Balvanera"), rooms = c(3,2), bathrooms=c(2,3), surface_total=c(120,80),  surface_covered=c(120,60), property_type=c("Departamento","PH")), se.fit = FALSE)

tidy(predict.list)
## # A tibble: 2 x 2
##   names       x
##   <chr>   <dbl>
## 1 1     324596.
## 2 2     167742.

El modelo estima un precio de 324.5 mil dólares para el departamento en Abasto y un precio de 167.7 mil dólares para el PH en Balvanera.Por lo tanto conviene tener para vender el departamento en el Abasto

Modelo II: modelado del precio del inmueble a partir de todas las covariables menos l3 (barrio).

Analizo la regresión lineal múltiple si no se incluyera la variable l3:

# Este modelo es idéntico al anterior pero sin agregar la variable "l3" en el sumando.
modelo_2 <- lm( price ~ rooms+ bathrooms+ surface_total+ surface_covered+ factor(property_type), data = properati)

summary(modelo_2)
## 
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered + 
##     factor(property_type), data = properati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -518799  -36177   -9643   25740  724251 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)                       -131096.86    2750.50  -47.66   <2e-16
## rooms                              -13348.53     519.02  -25.72   <2e-16
## bathrooms                           42664.68     756.37   56.41   <2e-16
## surface_total                         877.03      27.59   31.79   <2e-16
## surface_covered                      1783.80      33.53   53.21   <2e-16
## factor(property_type)Departamento  135177.47    2513.93   53.77   <2e-16
## factor(property_type)PH             68598.52    2677.46   25.62   <2e-16
##                                      
## (Intercept)                       ***
## rooms                             ***
## bathrooms                         ***
## surface_total                     ***
## surface_covered                   ***
## factor(property_type)Departamento ***
## factor(property_type)PH           ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 79210 on 45897 degrees of freedom
## Multiple R-squared:  0.6832, Adjusted R-squared:  0.6831 
## F-statistic: 1.649e+04 on 6 and 45897 DF,  p-value: < 2.2e-16

Análisis del modelo II

Interpretación de los coeficientes estimados:

  • rooms: coeficiente negativo y significativo al 1%
  • bathrooms,surface_total y surface_covered: coeficientes positivos y significativos al 1%
  • property type: significativo al 1%. coeficiente positivo para PH y Departamento.

Medidas de evaluación del modelo II:

El modelo logra captar un 68.3% de la variabilidad del precio (R2 = 0.683). Asimismo, el test F de significatividad global registra un p-valor menor a 1%; por lo tanto, se rechaza la hipótesis nula de que todos los coeficientes son cero.

Dado que el R2 del modelo I es mayor al R2 del modelo II, podemos decir que el modelos I logra captar una mayor proporción de la variabilidad del precio de los inmuebles.

Creación de variables

Para generar la nueva variable barrios que clasifica los barrios de la ciudad de acuerdo a si el precio es bajo, medio o alto se realizó un análisis de clusters a partir del la mediana delos precios de cada barrio. Concretamente utilizó el algoritmo PAM.

En una primer etapa generamos la variable precio_m2, que es el precio por metro cuadrado de la propiedad, y el dataset precio_barrio, que contiene la mediana de los precios del barrio.

#Genero variable precio por metro cuadrado
properati<-properati %>%
  mutate(precio_m2=price/surface_total)

#Genero dataset con mediana de precios. Se tomó la mediana por ser más robusta ante la presencia de outliers
precio_barrio <- properati %>% group_by(l3) %>% summarise(precio_barrio = median(precio_m2))

#ponemos nombre del barrio a la fila
rownames(precio_barrio)<-precio_barrio$l3

Luego, calculamos los cluster a través del algoritmo PAM con k=3.

#Cargo librería
library(cluster)

#Calculo matriz de distancias euclideas
distancia = dist(precio_barrio,method = "euclidean")

#Calculo los clusters para k=3
set.seed(1515)
pam_cluster<-pam(x = precio_barrio, k = 3, metric = "euclidean", stand = FALSE)
#Grafico
factoextra::fviz_cluster(pam_cluster, palette = "jo", ellipse.type = "t", repel = TRUE, ggtheme = theme_minimal())

De esta forma obtenemos tres grupos con los siguientes umbrales de precios por m2:

precio_barrio <- cbind(precio_barrio, cluster = pam_cluster$clustering)
precio_barrio %>% group_by(as.factor(cluster)) %>% summarise(min= min(precio_barrio),
                                                  max = max(precio_barrio))

En el gráfico se puede observar que estos cluster separan a los barrios en tres categorías acordes a niveles de precios diferentes.

precio_barrio %>%
   ggplot(aes(x = reorder(l3,precio_barrio), y = precio_barrio,fill=as.factor(cluster)))+
   geom_bar(stat = "identity", color="black")+
   labs(title="Mediana de precio por m2 por barrio", subtitle = "Fuente: Properati Argentina")+
   labs(x="Barrios", y="Precio por m2 (USD)",fill="Cluster")+
   theme_fivethirtyeight()+
   theme(axis.line.x = element_line(size = .5, colour = "black"),
                axis.line.y = element_line(size = .5, colour = "black"),
                axis.text.x = element_text(colour = "black", size = 10, angle = 90),
                axis.text.y = element_text(colour = "black", size = 10),
                legend.position = "top",
                legend.direction = "horizontal",
                legend.box = "horizontal",
                legend.key = element_blank())+
   geom_hline(yintercept=2000, color = "black", linetype="dashed")+
    geom_hline(yintercept=2650, color = "black", linetype="dashed")

Finalmente hago un join entre las tablas

#genero variable barrio
precio_barrio <- precio_barrio %>% mutate( barrios = case_when(cluster==1 ~ "medio",
                                                              cluster==2 ~ "alto",
                                                              cluster==3 ~ "bajo"))
#join
properati<- left_join(properati,precio_barrio,by= c("l3"="l3"))

Modelo III: modelado del precio del inmueble en funciones con creación de variable barrios.

El modelo 3, que busca explicar el precio de los inmueble en base a las covariables habitación, baños, superficie, tipo de propiedad y nivel de precios del barrio, se presenta a continuación:

modelo_3 <- lm( price ~ rooms + bathrooms+ surface_total + surface_covered + factor(property_type) + factor(barrios), data = properati)

summary(modelo_3)
## 
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered + 
##     factor(property_type) + factor(barrios), data = properati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -432485  -37145   -4055   25355  690643 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)                        -54717.39    2573.37  -21.26   <2e-16
## rooms                               -7804.81     468.65  -16.65   <2e-16
## bathrooms                           37266.83     680.77   54.74   <2e-16
## surface_total                         900.92      24.77   36.37   <2e-16
## surface_covered                      1568.76      30.16   52.02   <2e-16
## factor(property_type)Departamento  100884.39    2283.97   44.17   <2e-16
## factor(property_type)PH             53872.87    2407.94   22.37   <2e-16
## factor(barrios)bajo               -104050.12    1822.98  -57.08   <2e-16
## factor(barrios)medio               -69248.19     695.69  -99.54   <2e-16
##                                      
## (Intercept)                       ***
## rooms                             ***
## bathrooms                         ***
## surface_total                     ***
## surface_covered                   ***
## factor(property_type)Departamento ***
## factor(property_type)PH           ***
## factor(barrios)bajo               ***
## factor(barrios)medio              ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 71070 on 45895 degrees of freedom
## Multiple R-squared:  0.7449, Adjusted R-squared:  0.7449 
## F-statistic: 1.676e+04 on 8 and 45895 DF,  p-value: < 2.2e-16

Interpretación de los coeficientes estimados:

  • rooms: coeficiente negativo y significativo al 1%. El coeficiente puede interpretarse como: “por cada habitación adicional que tenga el inmueble el \(\hat{price}\) caerá 54.7 miles de dólares.
  • bathrooms,surface_total y surface_covered: coeficientes positivos y significativos al 1%. Interpretación: Por cada unidad que aumenten bathrooms ,surface_total y surface_covered, \(\hat{price}\) se incrementará en 37.2 mil, 900 y 1567 dólares respectivamente.
  • property type: coeficiente significativo al 1%. coeficiente positivo para PH y Departamento.
  • barrio: coeficientes negativos para los caso de barrios con niveles de precios medios y bajos. Coeficiente significativo al 1%.

Medidas de evaluación del modelo III:

El modelo logra captar un 75,5% de la variabilidad del precio. En ese sentido resulta superior al modelo II pero inferior al modelo I.

Se rechaza la Ho del test f de significatividad global.

¿Qué modelo es más útil?

En la siguiente tabla y gráfico mostramos la cantidad de datos con los que contamos en cada barrio. En algunos casos tenemos información para menos de 20 inmuebles. Considero que en el caso de predecir el precio de una propiedad en estos barrios el modelo 3 tendrá un mayor poder explicativo que el modelo 1.Sin embargo en barrios con mayor disponibilidad de información (Palermo, Nuñez, etc) el modelo 1 puede ser superior.

properati %>% count(l3,cluster) %>% arrange(n) %>% head()
properati %>% count(l3,cluster) %>% ggplot(mapping = aes(x =  reorder(l3,n), y = n, fill=as.factor(cluster) ))+geom_bar(stat = "identity", color="black") +
  labs(title="Cant. de datos por barrio", subtitle = "Fuente: Properati Argentina")+
   labs(x="Barrios", y="Frecuencia",fill="Cluster") +
   theme_fivethirtyeight() +
   theme(axis.line.x = element_line(size = .5, colour = "black"),
                axis.line.y = element_line(size = .5, colour = "black"),
                axis.text.x = element_text(colour = "black", size = 10, angle = 90),
                axis.text.y = element_text(colour = "black", size = 10),
                legend.position = "top",
                legend.direction = "horizontal",
                legend.box = "horizontal",
                legend.key = element_blank())

Modelo IV: modelado de precio de inmuebles incorporando variable surface_patio.

Generamos la variable patio. Todos los valores son mayores cero.

#Genreo variable
properati <-properati %>% mutate(surface_patio = surface_total- surface_covered)

summary(properati$surface_patio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   5.000   9.338  10.000  91.000
sum(properati$surface_total<properati$surface_covered)
## [1] 0

Corremos el modelo que diferencia la superficie total en cubierta y descubierta:

modelo_4 <- lm( price ~ rooms + bathrooms+ surface_patio + surface_covered + factor(property_type) + factor(barrios), data = properati)

summary(modelo_4)
## 
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_patio + surface_covered + 
##     factor(property_type) + factor(barrios), data = properati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -432485  -37145   -4055   25355  690643 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)                        -54717.39    2573.37  -21.26   <2e-16
## rooms                               -7804.81     468.65  -16.65   <2e-16
## bathrooms                           37266.83     680.77   54.74   <2e-16
## surface_patio                         900.92      24.77   36.37   <2e-16
## surface_covered                      2469.68      15.93  155.07   <2e-16
## factor(property_type)Departamento  100884.39    2283.97   44.17   <2e-16
## factor(property_type)PH             53872.87    2407.94   22.37   <2e-16
## factor(barrios)bajo               -104050.12    1822.98  -57.08   <2e-16
## factor(barrios)medio               -69248.19     695.69  -99.54   <2e-16
##                                      
## (Intercept)                       ***
## rooms                             ***
## bathrooms                         ***
## surface_patio                     ***
## surface_covered                   ***
## factor(property_type)Departamento ***
## factor(property_type)PH           ***
## factor(barrios)bajo               ***
## factor(barrios)medio              ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 71070 on 45895 degrees of freedom
## Multiple R-squared:  0.7449, Adjusted R-squared:  0.7449 
## F-statistic: 1.676e+04 on 8 and 45895 DF,  p-value: < 2.2e-16

Análisis del modelo

La variabilidad explicada alcanza el 74.5%. Se rechaza el test F de significatividad global.

Los coeficientes que afectan a las variables surface_patio y surface_covered son positivos y significativos al 1%. Se destaca que el coeficiente que afecta al a variable surace_patio es menor que el de surface_covered. Por lo tanto, un incremento de un metro de superficie cubierta tiene mayor incidencia sobre el precio que un incremento en la superficie descubierta.

Análisis de los residuos

En el gráfico siguiente permite comparar los reduo vs el valor predicho por el modelo para el dataset de properati. La linea roja, indica la tendencia de los residuos. Como se puede observar, no existe un tendencia clara ni hacia arriba ni hacia abajo, sino que se mantiene en torno al cero. Esto indica que el dataset de properati puede analizarse correctamente con un modelo lineal.

plot(modelo_4, which=1, col=c("light blue"))  # Scale-Location Plot

Modelo V: modelo en logaritmos

Corremos el modelo. Agregamos un +1 a surface patio por que no se puede hacer el logaritmo de cero (-infinito)

modelo_5 <- lm(log(price) ~ log(rooms) + log(bathrooms) + log(surface_patio+1) + log(surface_covered) + factor(property_type) + factor(barrios), data = properati)

summary(modelo_5)
## 
## Call:
## lm(formula = log(price) ~ log(rooms) + log(bathrooms) + log(surface_patio + 
##     1) + log(surface_covered) + factor(property_type) + factor(barrios), 
##     data = properati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.36387 -0.14483 -0.00861  0.13155  1.33083 
## 
## Coefficients:
##                                     Estimate Std. Error  t value Pr(>|t|)
## (Intercept)                        8.6407249  0.0186029  464.484   <2e-16
## log(rooms)                        -0.0353365  0.0037497   -9.424   <2e-16
## log(bathrooms)                     0.1701206  0.0037918   44.866   <2e-16
## log(surface_patio + 1)             0.0607937  0.0008852   68.678   <2e-16
## log(surface_covered)               0.8108231  0.0043913  184.643   <2e-16
## factor(property_type)Departamento  0.2090568  0.0070662   29.585   <2e-16
## factor(property_type)PH            0.0711727  0.0075655    9.408   <2e-16
## factor(barrios)bajo               -0.5222348  0.0057920  -90.165   <2e-16
## factor(barrios)medio              -0.2971883  0.0022123 -134.336   <2e-16
##                                      
## (Intercept)                       ***
## log(rooms)                        ***
## log(bathrooms)                    ***
## log(surface_patio + 1)            ***
## log(surface_covered)              ***
## factor(property_type)Departamento ***
## factor(property_type)PH           ***
## factor(barrios)bajo               ***
## factor(barrios)medio              ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2259 on 45895 degrees of freedom
## Multiple R-squared:  0.8243, Adjusted R-squared:  0.8243 
## F-statistic: 2.691e+04 on 8 and 45895 DF,  p-value: < 2.2e-16

Análisis del modelo

El modelo 5 es muy superior a los anteriores en varios sentidos:

  • logra captar un 82% de la variabilidad explicada, los anterioes eran inferiores a 77%.
  • Los residuos del modelo 5 (ver gráfico debajo) no presentan tendencia, demostrando que el proceso estadístico que estudiamos puede modelarse a partir de un modelo lineal
  • Los coeficientes (betas) son significativos al 1% y con el signo esperado:
  • Propiedades medias y baja tienen signo negativo
  • el coeficiente que afecta a surface_patio es positivo pero inferior al de surface_covered
  • el coeficiente que afecta a rooms es negativo, lo que , dado que controlamos por superficie, penaliza a las propiedades con habitaciones más pequeñas.

Como el modelos es de tipo log-log para las variables no dummy y log-lin para las dummy los coeficientes se pueden interpretar de la siguiente manera:

  • en el caso de las variables log-log, decimos por ejemplo que un aumento de 1% en la superficie cubierta se traducirá a un alza de 0.8% de \(\hat{price}\)

  • en el caso de las variables log-lin, decimos por ejemplo que en el caso de que se trate de una propiedad del tipo PH, \(\hat{price}\) registrará un alza de 0.07%.

plot(modelo_5, which=1, col=c("light blue"))  # Scale-Location Plot

Dataframes anidados

# Primero agrupo la data por tipo de propiedad
by_property_type <- properati %>%
                      group_by(property_type) %>%
                        nest()
# Creo la funcion de regresión lineal para usarla dentro de la función map
funcion_modelo <- function(df) {
                  modelo4 <- lm( price ~ rooms + bathrooms + surface_covered + surface_patio + barrios, data = df)
}

models <- map(by_property_type$data, funcion_modelo)
# Para cada tipo de departamento se calcula la función lineal múltiple y se agrega al dataframe
by_property_type <- by_property_type %>% 
                      mutate(model = map(data, funcion_modelo))
# Extraigo de cada propiedad los resultados del cálculo de las métricas del modelo
glnc <- by_property_type %>% 
  mutate(glnc = map(model, glance)) %>% 
  unnest(glnc, .drop = TRUE)
glnc

Los tres modelos resultan significativos(Test F, se rechaza la hipótesis que todas los coeficientes de las variables sean nulos). En cuanto a la variabilidad explicada, el modelo de las viviendas tipo departamento registra el valor más alto (77%), mientras que el de las casas el menor (68%).No obstante, ninguno de los tres modelos logra supera en R2 del quinto modelo.