Regresión lineal múltiple
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:
Los coeficientes que empezan con “l3”, que van de “l3AgronomÃa” a “l3Villa Urquiza”, indican la diferencia del precio promedio de las propiedad del barrio indicado comparado con Abasto, el barrio basal o de referencia -que el algoritmo de la librería “lm” toma por defalut al ser el primero que aparece si los ordenáramos alfabéticamente-
coeficiente asociado a la variable “rooms”:indica la variacion del precio promedio si aumentamos en una unidad el número de habitaciones, dejando las demás variables en un valor constante.
coeficiente asociado a la variable “bathrooms”: indica la variacion del precio promedio si aumentamos en una unidad el número de baños, dejando las demás variables en un valor constante.
coeficiente asociado a la variable “surface_total”: indica la variacion del precio promedio si aumentamos en 1 m2 (metro cuadrado) la superficie total del inmueble, dejando las demás variables en un valor constante
coeficiente asociado a la variable “surface_covered”: indica la variacion del precio promedio si aumentamos en 1 m2 (metro cuadrado) la superficie total del inmueble, dejando las demás variables en un valor constante
coeficientes que empiezan con “property_type”: indican la diferencia del precio promedio del tipo de propiedad indicado comparado con “Casa”, el tipo de propiedad basal o de referncia
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
¿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.)
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
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
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.
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.
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)
Evaluación del modelo:
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)
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 “log_rooms”:es la elasticidad estimada del precio promedio respecto a la cantidad de habitaciones. Esto implica que por cada aumento del 1% en las cantidad de habitaciones el precio se incrementará en un Beta_log_rooms por ciento.
coeficiente asociado a la variable “log_bathrooms”: es la elasticidad estimada del precio promedio respecto a la cantidad de baños. Por ejemplo si incremetáramos de uno a dos baños, (un incremento de un 100%) el precio se incrementará en un 100*Beta_log_bathrooms %.
coeficiente asociado a la variable “log_surface_covered”: es la elasticidad estimada del precio promedio respecto a la superficie cubierta. Esto implica que por cada aumento del 1% en lasuperficie cubierta el precio se incrementará en un log_surface_covered por ciento.
coeficientes que empiezan con “property_type”: es el “rendimiento” del tipo de propiedad respecto al al tipo “casa”. Indica la variaciçón porcentual del precio de la propiedad comparada con una propiedad del tipo “casa” (nivel basal o de referencia de la variable cualitativa “tipo de propiedad”,de las mismas caracteristicas (medidas en todas las demás variables explicativas).
Los coeficientes que empezan con “barrio”, indican el “rendimiento” del tipo de barrio respecto al tipo de barrio “ALTO”. Indica la variaciçón porcentual del precio de la propiedad comparada con una propiedad de un barrio catalogado como “ALTO” (nivel basal o de referencia de la variable cualitativa “Barrio”) de la mismas caracteriticas (medidas en todas las demás variables explicativas).
-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.
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.