1. Regresión lineal múltiple

    1. Crear un modelo para predecir el precio con todas las covariables.
library(readr)
library(tidyverse)
## -- Attaching packages -------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.1     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.3
## v tidyr   1.0.0     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()
ds = read.csv("C:/Users/charly/Desktop/FCEyN- MAESTRIA/Materia - ENFOQUE ESTADISTICO DEL APRENDIZAJE/trabajos_practicos/TP-2/TP2/ar_properties2.CSV")

glimpse(ds)
## Observations: 45,904
## Variables: 8
## $ id              <fct> AfdcsqUSelai1ofCAq2B0Q==, ESzybdH7YU2uIU1/kHtR...
## $ l3              <fct> Velez Sarsfield, Nuñez, Almagro, Almagro, Alm...
## $ rooms           <int> 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1...
## $ bathrooms       <int> 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1...
## $ surface_total   <int> 95, 44, 40, 49, 40, 40, 40, 49, 40, 40, 40, 32...
## $ surface_covered <int> 69, 38, 37, 44, 37, 37, 37, 44, 37, 37, 37, 30...
## $ price           <int> 199900, 147000, 92294, 115000, 77000, 88900, 8...
## $ property_type   <fct> Casa, Departamento, Departamento, Departamento...
mod.completo = lm(price~l3+rooms+bathrooms+surface_total+surface_covered+property_type,data=ds)

summary(mod.completo)
## 
## Call:
## lm(formula = price ~ l3 + rooms + bathrooms + surface_total + 
##     surface_covered + property_type, data = ds)
## 
## 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 ***
## l3Agronomía                  623.53    8846.14   0.070 0.943807    
## l3Almagro                   -4520.04    4295.24  -1.052 0.292650    
## l3Balvanera                -24788.27    4551.65  -5.446 5.18e-08 ***
## l3Barracas                 -10128.24    5351.06  -1.893 0.058397 .  
## l3Barrio Norte              49921.81    4417.82  11.300  < 2e-16 ***
## l3Belgrano                  69648.12    4283.55  16.259  < 2e-16 ***
## l3Boca                     -47540.60    7076.20  -6.718 1.86e-11 ***
## l3Boedo                    -19034.38    5219.54  -3.647 0.000266 ***
## l3Caballito                  6220.15    4301.29   1.446 0.148153    
## l3Catalinas                -76321.95   33563.74  -2.274 0.022974 *  
## l3Centro / Microcentro     -29046.49    6781.80  -4.283 1.85e-05 ***
## l3Chacarita                 11903.39    5299.02   2.246 0.024687 *  
## l3Coghlan                   40820.55    5462.90   7.472 8.02e-14 ***
## l3Colegiales                34073.02    4816.54   7.074 1.52e-12 ***
## l3Congreso                 -32314.97    5494.75  -5.881 4.10e-09 ***
## l3Constitución            -47292.98    6321.63  -7.481 7.50e-14 ***
## l3Flores                   -22510.27    4536.15  -4.962 6.99e-07 ***
## l3Floresta                 -28315.65    5069.38  -5.586 2.34e-08 ***
## l3Las Cañitas              90455.90    5883.38  15.375  < 2e-16 ***
## l3Liniers                  -20080.34    5366.27  -3.742 0.000183 ***
## l3Mataderos                -33863.43    5424.79  -6.242 4.35e-10 ***
## l3Monserrat                -32431.49    5228.46  -6.203 5.59e-10 ***
## l3Monte Castro              -8770.72    5949.63  -1.474 0.140445    
## l3Nuñez                    56958.42    4559.69  12.492  < 2e-16 ***
## l3Once                     -30757.83    5456.51  -5.637 1.74e-08 ***
## l3Palermo                   66169.58    4221.50  15.674  < 2e-16 ***
## l3Parque Avellaneda        -34398.95    7598.09  -4.527 5.99e-06 ***
## l3Parque Centenario        -12288.30    5016.45  -2.450 0.014305 *  
## l3Parque Chacabuco         -22537.83    5314.36  -4.241 2.23e-05 ***
## l3Parque Chas                5195.26    7542.97   0.689 0.490981    
## l3Parque Patricios         -36808.02    5973.29  -6.162 7.24e-10 ***
## l3Paternal                 -13314.50    5189.69  -2.566 0.010304 *  
## l3Pompeya                  -79977.17    8035.74  -9.953  < 2e-16 ***
## l3Puerto Madero            259015.83    5095.12  50.836  < 2e-16 ***
## l3Recoleta                  64088.22    4360.34  14.698  < 2e-16 ***
## l3Retiro                    26067.40    5281.27   4.936 8.01e-07 ***
## l3Saavedra                  19492.00    4914.18   3.966 7.31e-05 ***
## l3San Cristobal            -23739.75    4955.13  -4.791 1.67e-06 ***
## l3San Nicolás             -26247.55    5168.96  -5.078 3.83e-07 ***
## l3San Telmo                 -5653.85    4877.12  -1.159 0.246356    
## l3Tribunales               -34608.17    8924.63  -3.878 0.000106 ***
## l3Velez Sarsfield          -25943.69    8303.75  -3.124 0.001783 ** 
## l3Versalles                -22232.13    6758.40  -3.290 0.001004 ** 
## l3Villa Crespo               1595.26    4317.54   0.369 0.711770    
## l3Villa del Parque          -3290.17    4866.59  -0.676 0.498997    
## l3Villa Devoto              13301.39    4807.08   2.767 0.005659 ** 
## l3Villa General Mitre      -19170.08    6802.25  -2.818 0.004831 ** 
## l3Villa Lugano             -83039.18    6533.35 -12.710  < 2e-16 ***
## l3Villa Luro                -7579.11    5404.78  -1.402 0.160833    
## l3Villa Ortuzar             18667.61    6829.18   2.734 0.006269 ** 
## l3Villa Pueyrredón         10516.80    5349.56   1.966 0.049314 *  
## l3Villa Real                -8823.37    8745.56  -1.009 0.313030    
## l3Villa Riachuelo          -32775.66   17171.10  -1.909 0.056298 .  
## l3Villa Santa Rita          -5767.71    6383.86  -0.903 0.366274    
## l3Villa Soldati           -136489.91   18944.29  -7.205 5.90e-13 ***
## l3Villa Urquiza             30648.43    4418.91   6.936 4.09e-12 ***
## 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 ***
## property_typeDepartamento   92653.32    2191.23  42.284  < 2e-16 ***
## property_typePH             46779.37    2274.94  20.563  < 2e-16 ***
## ---
## 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
sort(levels(ds$l3))
##  [1] "Abasto"               "Agronomía"           "Almagro"             
##  [4] "Balvanera"            "Barracas"             "Barrio Norte"        
##  [7] "Belgrano"             "Boca"                 "Boedo"               
## [10] "Caballito"            "Catalinas"            "Centro / Microcentro"
## [13] "Chacarita"            "Coghlan"              "Colegiales"          
## [16] "Congreso"             "Constitución"        "Flores"              
## [19] "Floresta"             "Las Cañitas"         "Liniers"             
## [22] "Mataderos"            "Monserrat"            "Monte Castro"        
## [25] "Nuñez"               "Once"                 "Palermo"             
## [28] "Parque Avellaneda"    "Parque Centenario"    "Parque Chacabuco"    
## [31] "Parque Chas"          "Parque Patricios"     "Paternal"            
## [34] "Pompeya"              "Puerto Madero"        "Recoleta"            
## [37] "Retiro"               "Saavedra"             "San Cristobal"       
## [40] "San Nicolás"         "San Telmo"            "Tribunales"          
## [43] "Velez Sarsfield"      "Versalles"            "Villa Crespo"        
## [46] "Villa del Parque"     "Villa Devoto"         "Villa General Mitre" 
## [49] "Villa Lugano"         "Villa Luro"           "Villa Ortuzar"       
## [52] "Villa Pueyrredón"    "Villa Real"           "Villa Riachuelo"     
## [55] "Villa Santa Rita"     "Villa Soldati"        "Villa Urquiza"

b)Analizar los resultados del modelo: i)Interpretación de los coeficientes estimados

RESPUESTA: Por definición del modelo de regresión lineal múltiple los coeficientes beta_o y beta_i (con i de 1 a p-1, en este caso en el rango {1-63}*) representan el valor esperado del precio de una propiedad cuyo valor de cada uno de sus atributos sea igual a cero (a todas a luces un elemento irreal), matemáticamente llamada "ordenada al origen o intercepto, y los beta_i la tasa de variación de la media del precio por variación unitaria de la variable_i, manteniendo las p-2 variables restantes constantes (en cualquier valor), en términos matemáticos es derivada parcial del precio respecto a la variable i.

(*) Para el cálculo de la cantidad de variables predictoras utilizadas por el modelo (al haber creado dummies para cada atributo categórico) es nrow(summary(mod.completo)$coefficients)

El signifcado de cada coeficiente en el entorno del cual fue tomada la muestra contenida en este dataset (negocio inmobiliario) es:

  1. ¿Qué observan respecto de la significatividad de las variables dummy?

RESPUESTA= La significatividad viene dada por el p_value asociado al test de contraste de hipótesis en el que se busca refutar la Ho:Beta_i=0, por lo que se querría chequear que los precios medios del barrio_i son iguales a los precios promedios en el barrio “Abasto”. Si el p_valor es suficientemente bajo (<0.05) podríamos considerar que, a la luz de los datos proporcionada por la muestra (el dataset), hay evidencia significativa para rechazar la hipótesis nula.

Hay varios barrios cuya test de significatovidad “T de Student” de su coeficiente no es significativo, y otros que si. Siendo que sería engorroso agrupar barrios en zonas para luego ver si estas zonas si son significativas, probaría un test global de significatividad de la variable “barrio” mediante un ANOVA.

anova(mod.completo)

Aquí claramente podesmo ver que la variabla “l3” evaluada mediante un ANOVA es es estadísticamente significativa.

iii)Medidas de evaluación del modelo Son el R2_ajustado y el F-statistic, y su P_valor asociado. El primero representa el porcentaje de variación de la variable respuesta que puede ser explicada por el modelo de regresión lineal múltiple, y el segundo una medida de cuánto mejora el modelo la predicción de la variable respuesta comparada con el nivel de imprecisión de los datos originales, evaluando por ello la hipótesis nula Ho) Beta_j=Beta_k para todo j distinto de k en el rango {1-(p-1)}

Ambas medidas de bondad del ajuste poseen un valor considerable, una por valor, 0.7764 y la otra por su significatividad estadística, p-value: < 2.2e-16

  1. ¿Qué es preferible tener para vender?:

    1)un departamento de 120 mts cuadrados cubiertos en abasto, con 3 dormitorios y 2 baños 2)Un PH en Balvanera, con 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños.

    Para elegir una de las respuestas Corro una predicción del modelo para cada una de estas propiedades

newdata=data.frame(l3="Abasto",rooms=3, bathrooms=2, surface_total=120,surface_covered=120 ,property_type='Departamento')

Abasto_120=predict(mod.completo, newdata)


newdata=data.frame(l3="Balvanera",rooms=2, bathrooms=3, surface_total=100,surface_covered=80 ,property_type='PH')

Balvanera_80 = predict(mod.completo, newdata)

Abasto_120
##        1 
## 324596.4
Balvanera_80
##        1 
## 215267.6

RESPUESTA= Es preferible tener para vender un departamento de 120 mts cuadrados cubiertos en abasto, con 3 dormitorios y 2 baños pues la estimación del precio promedio de venta es mayor a la del precio promedio de la otra opcion (Un PH en balvanera, con 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños.)

  1. Realizar un modelo sin la covariable l3 e interpretar sus resultados (todas las partes de la salida que consideren relevantes)
mod.completo.2 = lm(price~ rooms + bathrooms + surface_total + surface_covered + property_type, data=ds)

summary(mod.completo.2)
## 
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered + 
##     property_type, data = ds)
## 
## 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 ***
## property_typeDepartamento  135177.47    2513.93   53.77   <2e-16 ***
## property_typePH             68598.52    2677.46   25.62   <2e-16 ***
## ---
## 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

RESPUESTA= Es un modelo cuyas variables son todas significativas (tiene un p_valor < a 0.05) y su R2_aj es Adjusted R-squared: 0.6831 . A su vez también es significativo el resultado del test de F-statistic

  1. ¿Cuál es el modelo que mejor explica la variabilidad del precio? RESPUESTA= me inclino por primero (con el barrio) pues su R2 ajustado es mayor
  1. Creación de variables:

crear una nueva variable barrios que divida a los barrios según el precio por metro cuadrado promedio de las propiedades en ellos, con los grupos c(‘alto’, ‘medio’, ‘bajo’). Realizar un análisis exploratorio para definir los puntos de corte de la nueva variable y explicar los criterios utilizados en la construcción de la misma.

library(tidyverse)
library(dplyr)

Precio_prom_barrios= ds %>% group_by(l3) %>% summarise(Precio_prom=mean(price/surface_covered))

ggplot(Precio_prom_barrios, aes(x=Precio_prom))+
  geom_histogram(binwidth = 100)

ggplot(Precio_prom_barrios, aes(x = "Barrios", y = Precio_prom))+
geom_boxplot()

q2=median(Precio_prom_barrios$Precio_prom)
q1=quantile(Precio_prom_barrios$Precio_prom, 0.25)
q3=quantile(Precio_prom_barrios$Precio_prom, 0.75)

Precio_prom_barrios=Precio_prom_barrios%>% mutate(barrios = case_when(Precio_prom<q1 ~ "BAJO", 
                                                  Precio_prom>=q1 & Precio_prom < q3 ~ "MEDIO",
                                                  Precio_prom>=q3 ~ "ALTO")) 
str(Precio_prom_barrios)    
## Classes 'tbl_df', 'tbl' and 'data.frame':    57 obs. of  3 variables:
##  $ l3         : Factor w/ 57 levels "Abasto","Agronomía",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Precio_prom: num  2821 2677 2735 2309 2616 ...
##  $ barrios    : chr  "MEDIO" "MEDIO" "MEDIO" "MEDIO" ...
for (i in 1:nrow(ds)) {
    ds$barrio[i] = Precio_prom_barrios$barrios[Precio_prom_barrios$l3==ds$l3[i]]
}                                                   

str(ds)
## 'data.frame':    45904 obs. of  9 variables:
##  $ id             : Factor w/ 45904 levels "//E++5/CZfagBuy/nNSY6w==",..: 9116 15470 32968 9779 33082 36984 30907 24829 26128 29050 ...
##  $ l3             : Factor w/ 57 levels "Abasto","Agronomía",..: 43 25 3 3 3 3 3 3 3 3 ...
##  $ rooms          : int  3 1 1 1 1 1 1 1 1 1 ...
##  $ bathrooms      : int  2 1 1 1 1 1 1 1 1 1 ...
##  $ surface_total  : int  95 44 40 49 40 40 40 49 40 40 ...
##  $ surface_covered: int  69 38 37 44 37 37 37 44 37 37 ...
##  $ price          : int  199900 147000 92294 115000 77000 88900 88798 110975 92943 99000 ...
##  $ property_type  : Factor w/ 3 levels "Casa","Departamento",..: 1 2 2 2 2 2 2 2 2 2 ...
##  $ barrio         : chr  "BAJO" "ALTO" "MEDIO" "MEDIO" ...

Armo un nuevo dataset Precio_prom_barrio que contiene dos columnas, una con el barrio y la otra con el precio cuadrad por unidad de superficie cubierta promedio de las propiedades en ese barrio.

Al ser relativamente acampando el histograma de frecuencias relativas de esta variable considero oportuno armar las variables a partir de los cuartiles, por lo que delimito la variable barrio mediante la siguiente función partida: si precio_prom < q1 –> barrio=“Bajo” si precio_prom >= q1 Y <Q3 –> barrio=“MEDIO” si precio_prom >=Q3 –> barrio=“ALTO”

a posteriori creo la variable barrio en el dataset original ds

  1. ¿Qué modelo explica mejor la variabilidad de los datos, el que utiliza la variable l3 o el que utiliza barrio? En su opinión, ¿Qué modelo es más útil? ¿Porqué?
m5= lm(price~ barrio+rooms+bathrooms+surface_total+surface_covered+property_type, data=ds)
summary(m5)
## 
## Call:
## lm(formula = price ~ barrio + rooms + bathrooms + surface_total + 
##     surface_covered + property_type, data = ds)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -435174  -37037   -5457   25819  698947 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               -68416.37    2601.43  -26.30   <2e-16 ***
## barrioBAJO                -90182.08    1465.86  -61.52   <2e-16 ***
## barrioMEDIO               -61320.55     727.94  -84.24   <2e-16 ***
## rooms                      -8593.91     477.38  -18.00   <2e-16 ***
## bathrooms                  36372.37     695.21   52.32   <2e-16 ***
## surface_total                862.91      25.24   34.19   <2e-16 ***
## surface_covered             1657.29      30.69   53.99   <2e-16 ***
## property_typeDepartamento 105230.11    2321.78   45.32   <2e-16 ***
## property_typePH            54837.89    2453.61   22.35   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 72450 on 45895 degrees of freedom
## Multiple R-squared:  0.7349, Adjusted R-squared:  0.7349 
## F-statistic: 1.591e+04 on 8 and 45895 DF,  p-value: < 2.2e-16

El modelo con l3 tiene un R2 aj de 0.7764 . Este nuevo modelo con el factor que indica el nivel del precio/sup para el barrio tiene un r2 aj de 0.7336. Evaluados a partir de esta medida de bondad de ajuste es mejor el modelo que incluye con el barrio l3

En mi opinión , y a la luz de los resultados que arrojaron los modelos ajustados con ambas variables, es mejor contar con la información más desagregada que nos da el barrio. Hay componentes de variación y asociación entre el barrio específico y el precio de la vivienda que quedan mejor explicadas por el modelo que incluye l3 (cada barrio con su variable dummy) que por solo la variable nivel del barrio medido en términos del precio/m2 promedio.

  1. La interpretación de los coeficientes de las variables surface_covered y surface_total puede ser un poco problemática ya que se encuentran correlacionadas. Entonces, podemos construir una nueva variable surface_patio para la diferencia entre ambas superficies.

    1. Construir una nueva variable surface_patio. Dado que algunos registros pueden contener la contradicción de que surface_total<surface_covered, explicitar cómo se procede para dichos casos.
  1. Calcular nuevamente el modelo lineal para todas las covariables previas (excepto surface_total), surface_covered y surface_patio e interpretar los coeficientes de estas dos últimas variables
ds=ds%>% mutate(surface_patio = case_when(surface_total>surface_covered ~ (surface_total-surface_covered), 
                                          surface_total<=surface_covered ~ as.integer(0)))

str(ds)
## 'data.frame':    45904 obs. of  10 variables:
##  $ id             : Factor w/ 45904 levels "//E++5/CZfagBuy/nNSY6w==",..: 9116 15470 32968 9779 33082 36984 30907 24829 26128 29050 ...
##  $ l3             : Factor w/ 57 levels "Abasto","Agronomía",..: 43 25 3 3 3 3 3 3 3 3 ...
##  $ rooms          : int  3 1 1 1 1 1 1 1 1 1 ...
##  $ bathrooms      : int  2 1 1 1 1 1 1 1 1 1 ...
##  $ surface_total  : int  95 44 40 49 40 40 40 49 40 40 ...
##  $ surface_covered: int  69 38 37 44 37 37 37 44 37 37 ...
##  $ price          : int  199900 147000 92294 115000 77000 88900 88798 110975 92943 99000 ...
##  $ property_type  : Factor w/ 3 levels "Casa","Departamento",..: 1 2 2 2 2 2 2 2 2 2 ...
##  $ barrio         : chr  "BAJO" "ALTO" "MEDIO" "MEDIO" ...
##  $ surface_patio  : int  26 6 3 5 3 3 3 5 3 3 ...
mod.completo.5 = lm(price~ l3+rooms + bathrooms + surface_covered+property_type+surface_patio, data=ds)

summary(mod.completo.5)
## 
## Call:
## lm(formula = price ~ l3 + rooms + bathrooms + surface_covered + 
##     property_type + surface_patio, data = ds)
## 
## 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 ***
## l3Agronomía                  623.53    8846.14   0.070 0.943807    
## l3Almagro                   -4520.04    4295.24  -1.052 0.292650    
## l3Balvanera                -24788.27    4551.65  -5.446 5.18e-08 ***
## l3Barracas                 -10128.24    5351.06  -1.893 0.058397 .  
## l3Barrio Norte              49921.81    4417.82  11.300  < 2e-16 ***
## l3Belgrano                  69648.12    4283.55  16.259  < 2e-16 ***
## l3Boca                     -47540.60    7076.20  -6.718 1.86e-11 ***
## l3Boedo                    -19034.38    5219.54  -3.647 0.000266 ***
## l3Caballito                  6220.15    4301.29   1.446 0.148153    
## l3Catalinas                -76321.95   33563.74  -2.274 0.022974 *  
## l3Centro / Microcentro     -29046.49    6781.80  -4.283 1.85e-05 ***
## l3Chacarita                 11903.39    5299.02   2.246 0.024687 *  
## l3Coghlan                   40820.55    5462.90   7.472 8.02e-14 ***
## l3Colegiales                34073.02    4816.54   7.074 1.52e-12 ***
## l3Congreso                 -32314.97    5494.75  -5.881 4.10e-09 ***
## l3Constitución            -47292.98    6321.63  -7.481 7.50e-14 ***
## l3Flores                   -22510.27    4536.15  -4.962 6.99e-07 ***
## l3Floresta                 -28315.65    5069.38  -5.586 2.34e-08 ***
## l3Las Cañitas              90455.90    5883.38  15.375  < 2e-16 ***
## l3Liniers                  -20080.34    5366.27  -3.742 0.000183 ***
## l3Mataderos                -33863.43    5424.79  -6.242 4.35e-10 ***
## l3Monserrat                -32431.49    5228.46  -6.203 5.59e-10 ***
## l3Monte Castro              -8770.72    5949.63  -1.474 0.140445    
## l3Nuñez                    56958.42    4559.69  12.492  < 2e-16 ***
## l3Once                     -30757.83    5456.51  -5.637 1.74e-08 ***
## l3Palermo                   66169.58    4221.50  15.674  < 2e-16 ***
## l3Parque Avellaneda        -34398.95    7598.09  -4.527 5.99e-06 ***
## l3Parque Centenario        -12288.30    5016.45  -2.450 0.014305 *  
## l3Parque Chacabuco         -22537.83    5314.36  -4.241 2.23e-05 ***
## l3Parque Chas                5195.26    7542.97   0.689 0.490981    
## l3Parque Patricios         -36808.02    5973.29  -6.162 7.24e-10 ***
## l3Paternal                 -13314.50    5189.69  -2.566 0.010304 *  
## l3Pompeya                  -79977.17    8035.74  -9.953  < 2e-16 ***
## l3Puerto Madero            259015.83    5095.12  50.836  < 2e-16 ***
## l3Recoleta                  64088.22    4360.34  14.698  < 2e-16 ***
## l3Retiro                    26067.40    5281.27   4.936 8.01e-07 ***
## l3Saavedra                  19492.00    4914.18   3.966 7.31e-05 ***
## l3San Cristobal            -23739.75    4955.13  -4.791 1.67e-06 ***
## l3San Nicolás             -26247.55    5168.96  -5.078 3.83e-07 ***
## l3San Telmo                 -5653.85    4877.12  -1.159 0.246356    
## l3Tribunales               -34608.17    8924.63  -3.878 0.000106 ***
## l3Velez Sarsfield          -25943.69    8303.75  -3.124 0.001783 ** 
## l3Versalles                -22232.13    6758.40  -3.290 0.001004 ** 
## l3Villa Crespo               1595.26    4317.54   0.369 0.711770    
## l3Villa del Parque          -3290.17    4866.59  -0.676 0.498997    
## l3Villa Devoto              13301.39    4807.08   2.767 0.005659 ** 
## l3Villa General Mitre      -19170.08    6802.25  -2.818 0.004831 ** 
## l3Villa Lugano             -83039.18    6533.35 -12.710  < 2e-16 ***
## l3Villa Luro                -7579.11    5404.78  -1.402 0.160833    
## l3Villa Ortuzar             18667.61    6829.18   2.734 0.006269 ** 
## l3Villa Pueyrredón         10516.80    5349.56   1.966 0.049314 *  
## l3Villa Real                -8823.37    8745.56  -1.009 0.313030    
## l3Villa Riachuelo          -32775.66   17171.10  -1.909 0.056298 .  
## l3Villa Santa Rita          -5767.71    6383.86  -0.903 0.366274    
## l3Villa Soldati           -136489.91   18944.29  -7.205 5.90e-13 ***
## l3Villa Urquiza             30648.43    4418.91   6.936 4.09e-12 ***
## rooms                       -3961.27     444.58  -8.910  < 2e-16 ***
## bathrooms                   34040.98     644.28  52.836  < 2e-16 ***
## surface_covered              2376.26      15.13 157.106  < 2e-16 ***
## property_typeDepartamento   92653.32    2191.23  42.284  < 2e-16 ***
## property_typePH             46779.37    2274.94  20.563  < 2e-16 ***
## surface_patio                 919.08      23.52  39.069  < 2e-16 ***
## ---
## 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

Para calcular la superficie del patio utilicé la siguiente función partida

SI surface_total>surface_covered => surface_patio= surface_total-surface_covered

SI surface_total<=surface_covered => 0

El beta asociado a la variable surface_patio representa la tasa de variación de la media del precio por cada metro cuadrado adicional de patio, manteniendo las p-2 variables restantes constantes (en cualquier valor)

  1. Evaluación del modelo:

    1. Analizar los residuos del modelo elaborado en 2.d
sum.mod5=summary(mod.completo.5)
res.mod5=sum.mod5$residuals

matplot(predict(mod.completo.5,ds),res.mod5,  pch=1, col="blue", xlab="Observaciones", ylab="Residuos")

Los residuos del modelo lineal para todas las covariables previas (excepto surface_total) más surface_covered y surface_patio presentan una estructura parecería indicar de que se viola el supuesto de linealidad de la esperanza condicional, lo cual nos lleva a pensar que el vínculo entre el valor esperado de la variable respuesta Y la relación entre ellas y las covariables se vería mejor modelada por una función más complicada que la lineal (lo que genéricamente suele denominarse una curva).Pag 85 del apunte

Supuestos de normalidad y heterocedasticidad:

library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
sresid <- studres(mod.completo.5)

hist(sresid, freq=FALSE,
   main="Distribución  Residuos Studentizados")

qqPlot(mod.completo.5, main="QQ Plot")

## [1] 44857 44859

A la luz del qqPlot parecería no estar cumpliéndose el supuesto de normalidad.

Sobre el supuesto de normalidad (extraído del apunte de M-Eug. Szretter pagina 90 y 92) “El supuesto de normalidad de los errores juega un rol menor en el análisis de regresión. Es necesario para realizar inferencias en el caso de muestras pequeñas, aunque los métodos de bootstrap (o resampleo) pueden usarse si este supuesto no está presente. El problema con las muestras pequeñas es que chequear el supuesto de normalidad a través de los residuos cuando no hay muchas observaciones es muy difícil. Los grácos cuantil cuantil de los residuos (qq-plots) y los tests de normalidad realizados sobre ellos pueden ayudar en esta tarea. Hay varios tests posibles que ayudan a descartar la normalidad, entre ellos el test de Shapiro- Wilks (que está esencialmente basado en el cuadrado de la correlación entre las observaciones ordenadas y sus valores esperados bajo normalidad), o el test de Kolmogorov-Smirnov, que están implementados en los paquetes. En la práctica los supuestos de normalidad y homoscedasticidad nunca se cumplen exactamente. Sin embargo, mientras más cerca estén nuestros datos de los supuestos del modelo lineal,más apropiados serán los tests e intervalos de conanza que construyamos. Para muestras grandes el supuesto de distribución normal no es crucial. Una versión extendida del Teorema Central del Límite garantiza que el estimador de mí- nimos cuadrados de la pendiente tiene distribución de muestreo aproximadamente normal cuando n es grande.”

En la línea de lo anterior realizaría un test de Shapiro-Wilks, pero no podría pues este test admite máximo un tamaño de muestra de 500. Sabiendo que este test arroja el mismo resultado que el de Kolmogoroff Smirnoff lo probarñe utilizando este ultimo test, y su variante para media y varianza desconocida.

# install.packages("nortest")
library(nortest)
lillie.test(x = sresid)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  sresid
## D = 0.11055, p-value < 2.2e-16

A la luz de la evidencia coin la que contamos rechazamos la hipótesos de que los resiudos estandarizados siguen una distribución normal con un p_valor altamente significativo (2.2e-16)

  1. Calcular el modelo log(price)=β0+β1log(rooms)+β2log(bathrooms)+β3log(surface_covered)+β4property_type+β5barrio+β6surface_patio
ds=ds %>% mutate(log_price=log(price)) %>% mutate(log_rooms=log(rooms)) %>% mutate(log_bathrooms=log(bathrooms)) %>% mutate(log_surface_covered=log(surface_covered))

La performance del modelo elaborado en 2.d es R2_aj=0.7761

Comparar la performance del modelo de 2.d con éste, tanto en términos de la variabilidad explicada cómo de su relación con los supuestos del modelo lineal. Re-interpretar los parámetros del modelo.

mod.completo.6=lm(log_price ~ log_rooms+log_bathrooms+log_surface_covered+property_type+barrio+surface_patio, ds )

summary(mod.completo.6)
## 
## Call:
## lm(formula = log_price ~ log_rooms + log_bathrooms + log_surface_covered + 
##     property_type + barrio + surface_patio, data = ds)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.2969 -0.1512 -0.0051  0.1389  1.3824 
## 
## Coefficients:
##                             Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)                8.595e+00  1.922e-02  447.117   <2e-16 ***
## log_rooms                 -4.586e-02  3.900e-03  -11.758   <2e-16 ***
## log_bathrooms              1.817e-01  3.936e-03   46.157   <2e-16 ***
## log_surface_covered        8.209e-01  4.580e-03  179.239   <2e-16 ***
## property_typeDepartamento  2.484e-01  7.433e-03   33.421   <2e-16 ***
## property_typePH            7.658e-02  7.890e-03    9.706   <2e-16 ***
## barrioBAJO                -4.558e-01  4.760e-03  -95.740   <2e-16 ***
## barrioMEDIO               -2.720e-01  2.364e-03 -115.054   <2e-16 ***
## surface_patio              3.788e-03  8.218e-05   46.096   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2353 on 45895 degrees of freedom
## Multiple R-squared:  0.8093, Adjusted R-squared:  0.8092 
## F-statistic: 2.434e+04 on 8 and 45895 DF,  p-value: < 2.2e-16
res.mod6=summary(mod.completo.6)$residuals

matplot(predict(mod.completo.6,ds),res.mod6,  pch=1, col="blue", xlab="Observaciones", ylab="Residuos")

Tanto comparando el R2 ajustado de este modelo (que es 0.8081, mayor al del modelo anterior) como en la estructura del grafico de residuos, que presenta una estructura más de nubes de puntos, sin una estructura definida, es acertado afirmar que este modelo utilizando la variables transformadas por sus logaritmos ajusta mejor a los datos

El signifcado de cada coeficiente de este nuevo modelo es:

-coeficiente asociado a la variable “surface_patio”: Indica el incremento porcentual del precio de la propiedad por cada m2 adicional de superficie de patio. Este coeficiente representa la semi-elasticidad entre la variable predictora surface_patio y el precio.

  1. dataframes anidados

    Anidar por la variable property_type Construir para cada tipo de propiedad el modelo de 2.d e interpretar los resultados en cada caso. Qué diferencias encuentran entre los distintos modelos?

library(dplyr)
library(broom)

ds_prop= ds %>% group_by(property_type)%>% do(mod_lm =summary(lm(price~ barrio+rooms + bathrooms + surface_covered+surface_patio, data=.)))
modelo_Casa=ds_prop$mod_lm[1][[1]]

modelo_Departamento=ds_prop$mod_lm[2][[1]]

modelo_PH=ds_prop$mod_lm[3][[1]]

str(modelo_PH$coefficients)
##  num [1:7, 1:4] 80256 -95322 -57842 548 24072 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:7] "(Intercept)" "barrioBAJO" "barrioMEDIO" "rooms" ...
##   ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
data.frame(modelo=c("modelo_Casa","modelo_Departamento","modelo_PH"),
           F_value=c(as.numeric(modelo_Casa$fstatistic["value"]),as.numeric(modelo_Departamento$fstatistic["value"]),
                     as.numeric(modelo_PH$fstatistic["value"])),
           R2_ajustado=c(modelo_Casa$adj.r.squared,modelo_Departamento$adj.r.squared, modelo_PH$adj.r.squared),
           Beta_barrioBAJO=c(modelo_Casa$coefficients[2],modelo_Departamento$coefficients[2],
                             modelo_PH$coefficients[2]),
           Beta_barrioMEDIO=c(modelo_Casa$coefficients[3],modelo_Departamento$coefficients[3],
                              modelo_PH$coefficients[3]),
           Beta_rooms=c(modelo_Casa$coefficients[4],modelo_Departamento$coefficients[4],modelo_PH$coefficients[4]),
           Beta_bathrooms=c(modelo_Casa$coefficients[5],modelo_Departamento$coefficients[5],
                            modelo_PH$coefficients[5]),
           Beta_surface_covered=c(modelo_Casa$coefficients[6],modelo_Departamento$coefficients[6],
                                  modelo_PH$coefficients[6]),
           Beta_surface_patio=c(modelo_Casa$coefficients[7],modelo_Departamento$coefficients[7],
                                modelo_PH$coefficients[7]))

Los tres modelos son significtivos medidos mediante el estadístico F, pero el Modelo ajustado solo con propiedades de Tipo “Departamento” es el que mejor ajusta a los datos pues tiene el R2_ajustado mayor.

Los coeficientes presentan las siguientes características:

El Beta_rooms es ahora positivo para Casa y PH, mientras que en Departamento sigue siendo negativo. estp se puede deber a que hubo una reducción de la multicolinealidad entre los predictores para este tipod e propiedades

Los Beta_baños son bastante similares entre si.

El m2 cubierto es en promedio más caro en un departamento que en un PH, y a su vez este es más caro que en una casa.

El m2 de patio es más caro en promedio en un departamento que en una casa y que un un PH.

Un PH y una casa en un barrio medio son en promedio más caro que en un barrio bajo.