TP2: Regresión lineal Múltiple
Alumno: Tomás Ariel D’Amelio
mail: dameliotomas@gmail.com
Cargo librerias necesarias para la realización del presente trabajo práctico
## -- Attaching packages ------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.1 v purrr 0.3.3
## v tibble 2.1.1 v dplyr 0.8.3
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## Warning: package 'ggplot2' was built under R version 3.6.1
## Warning: package 'purrr' was built under R version 3.6.1
## Warning: package 'dplyr' was built under R version 3.6.1
## -- Conflicts ---------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## Please visit openintro.org for free statistics materials
##
## Attaching package: 'openintro'
## The following object is masked from 'package:ggplot2':
##
## diamonds
## The following objects are masked from 'package:datasets':
##
## cars, trees
## Warning: package 'GGally' was built under R version 3.6.1
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
##
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
##
## nasa
## Warning: package 'corrr' was built under R version 3.6.1
## Warning: package 'knitr' was built under R version 3.6.1
## Warning: package 'kableExtra' was built under R version 3.6.1
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
Leer el archivo ar_properties.csv
1. Regresión lineal múltiple
a. Crear un modelo para predecir el precio con todas las covariables
#Elimino columna de ID
propiedades <- propiedades[,-1]
# Paso a factores las variables categoricas
propiedades$l3 <- as.factor(propiedades$l3)
propiedades$property_type <- as.factor(propiedades$property_type)
# Corro el modelo de regresion lineal multiple para todo el set de datos de propiedades
lm_propiedades <-
propiedades %>%
lm(price ~ ., data = .)
##
## Call:
## lm(formula = price ~ ., data = .)
##
## 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
b. Analizar los resultados del modelo:
I. Interpretación de los coeficientes estimados
A partir del modelo lineal realizado para el set de datos de propiedades pueden sacarse diversas conclusiones. En primera instancia es importante aclarar que el set de datos cuenta con variables tanto categóricas como continuas. De esta forma, la interpretación de los coeficientes será distinta dependiendo el tipo de variable que estamos observando en el modelo.
Para una variable continua, los coeficientes estimados representan cuánto varía la esperanza del precio de la propiedad por cada unidad que aumenta dicha variable continua (manteniendo fijas el resto de las varibles). Por ejemplo, para la variable “surface_total” (superficie total del inmueble), el coeficiente estimado es 919.08, lo cual podria ser interpretado que, por cada metro cuadrado que aumenta la propiedad, el valor de la misma aumenta en USD 919.08 (para el modelo ajustado). Del mismo modo, según el modelo ajustado, el precio de la propiedad aumenta USD 34040.98 por cada baño extra, USD 1457.18 por cada metro cuadrado cubierto que se adiciona. Aquello que resulta extraño es que por cada habitación que se agrega a la propiedad el valor del inmueble desciende en USD 3961.27. La interpretacion del intercepto carece de sentido para todas estas variable conitnuas puesto que no se puede observar en el set de datos una propiedad son 0 metros cuadrados totales o cubiertos, con 0 baños, ni tampoco con 0 dormitorios Los p-valores resultaron significativos, los cual nos haría pensar en la relevancia de estas variables para la estimacion del precio de los inmuebles.
Para una variable categorica, el coeficiente 1 estimado representa la diferencia de dicho coeficiente para esa variable categórica con respecto al estimador de la categoria tomada como referencia (manteniendo fijas el resto de las varibles). Por eJemplo, en el caso de la variabel ’l3" que representa el barrio en que se encuentra el inmueble, la categoría de referencia tomada por R fue “Abasto” (teniendo en cuenta que R asigna dichas categorías de referencia por orden alfabetico). Así, el estimador para cualquier otro barrio representa una diferencia con el estimador de la categoria de referencia (manteniendo fijas el resto de las variables). De este modo, si tomamos a modo de ejemplo el estimador para el barrio de Agronomia, consideramos que el precio de la propiedad es USD 623.53 mayor para el modelo ajustado en comparacion con el barrio de Abasto. Lo mismo sucede con el tipo de propiedad. La categoría de referencia es “casa”. De este modo, el estimador del 1 para PH es de 46779.37, lo cual indicaría que el precio de la propiedad es USD 46779.37 mayor para el modelo ajustado en comparacion con que el inmueble sea una casa. Esto resulta antiintuitivo, lo cual puede encontrarse también para los departamentos, cuyo estimador de beta 1 dio un valor de 92653.32. Esto implica que el precio de un departamento es USD 92653.32 mayor para el modelo ajustado en comparacion con que el inmueble sea una casa (manteniendo constante el resto de las variables).
II. ¿Qué observan respecto de la significatividad de las variables dummy?
Retomando lo expuesto anteriormente, la estimación de los 1 para las variables categoricas convertidas a “dummy” debe realizarse teniendo en cuenta que categoria de referencia. En el caso de barrio, las categoria de referencia fue el barrio de Abasto. Así, para interpretar tanto dicha estimación como también la significatividad de la misma es necesario tener en cuenta dicha categoría de referencia. En el caso de los barrios, hay un gran proporción de dichas variables que son significativas, que significa que hay diferencia con respecto a la categoria basal “Abasto”. Por ejemplo, Puerto madero y Palermo tienen coeficientes positivos y significativas (p<0.001). Por el contrario, Villa Soladati y Parque Chacabuco tienen coeficientes negativos, tambien significativos. Esto es consistente de acuerdo a nuestro conocimiento del dominio en cuanto a los precios de los inmuebles en los barrios anteriormente mencionados.
c. ¿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.
# Caso 1: depto en Abasto
value_caso1<- round(predict(lm_propiedades, data.frame(l3="Abasto",rooms=3,bathrooms=2,surface_covered=120,property_type="Departamento", surface_total=120)),2)
paste("Según el modelo ajustado se estima que un departamento de 120 mts cuadrados cubiertos en Abasto, con 3 dormitorios y 2 baños cuesta", value_caso1, "dólares")
## [1] "Según el modelo ajustado se estima que un departamento de 120 mts cuadrados cubiertos en Abasto, con 3 dormitorios y 2 baños cuesta 324596.42 dólares"
# Caso 1: depto en Balvanera
value_caso2<- round(predict(lm_propiedades, data.frame(l3="Balvanera",rooms=2,bathrooms=3,surface_covered=80,property_type="PH", surface_total=100)),2)
paste("Según el modelo ajustado se estima que un PH en balvanera, con 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños", value_caso2, "dólares")
## [1] "Según el modelo ajustado se estima que un PH en balvanera, con 80 mts cuadrados cubiertos, 20 mts cuadrados no cubiertos, 2 dormitorios y 3 baños 215267.63 dólares"
De esta forma, podemos ver que es preferible tener para vender el departamento correspondiente al caso 1, a partir de las predicciones utilizando el modelo lineal ajustado al principio del trabajo práctico.
d. Realizar un modelo sin la covariable l3 e interpretar sus resultados (todas las partes de la salida que consideren relevantes)
# Modelo lineal múltiple sin l3
lm_propiedades_sin_l3 = lm(price ~ rooms+bathrooms+surface_total+surface_covered+property_type, data = propiedades)
summary(lm_propiedades_sin_l3)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## property_type, data = propiedades)
##
## 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
El p valor del estadístico F del modelo es menor a 0.05, al igual que el modelo que contenía la variable l3. Los coeficientes estimados para las varibales que no fueron removidas han cambiado. Todos ellos aumentaron, a excepción del coeficiente de superficie total que disminuyó el valor de 1.
e. ¿Cuál es el modelo que mejor explica la variabilidad del precio?
El R² bajó de 0.78 (modelo con la variable l3) a 0.68 (modelo sin la variable l3). Lo cual indicaría que bajó la variabilidad del precio explicada por el modelo
2. Creación de variables:
a. En el ejercicio anterior encontramos que algunos barrios son significativos, aunque no todos. 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
En primera instancia, grafico los precios de los propiedades agrupadas por barrios calculando el valor del precio del metro cuadrado, para realizar un primer análisis exploratorio.
df_m2_por_barrio = propiedades %>%
group_by(l3)%>%
summarize(m2 = mean(price/surface_total))%>%
arrange(m2)
propiedades_2 <- merge(x = propiedades, y = df_m2_por_barrio, by = "l3", all.x = TRUE)
ggplot(df_m2_por_barrio, aes(x= factor(l3, levels = df_m2_por_barrio$l3), y = m2))+
geom_point(col = 'blue')+
labs(title =" Precio m² promedio por barrio", x = "Barrio", y = "Precio m²")+
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 8))
Realizamos un histograma para clarificar la distribucion de los promedios de los m² por barrio
df_m2_por_barrio %>%
ggplot( aes(x=m2) ) +
geom_histogram(binwidth = 100) +
ggtitle("Histograma de precio x m²")
Una forma de agrupar los datos para la construiccion de una nueva variable “barrios” con categorias que reflejen los el valor de los precios del m² seria estableciendo como puntos de corte el percentil 33 y el 66.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1093 2062 2204 2358 2579 5472
Estableciendo dichos puntos de cortes no obtenía grupos homogeneos. Es por eso que, en cambio, utilizo la media como punto de corte entre las categorías “bajo” y “medio”, mientras que para el punto de corte entre el grupo “medio” y “alto” tomo el valor 3000, que representa el salto entre los valores del metro cuadrado en retiro y Barrio Norte (como se puede apreciar en el gráfico “Precio m² promedio por barrio” ).
propiedades_2$barrio <- cut(propiedades_2$m2, breaks = c(0,2358,3000,6000),
labels = c("bajo", "medio", "alto"),
include.lowest = TRUE)
#Elimino la variable "l3" del set de datos
propiedades_2 <- subset( propiedades_2, select = -l3 )
# Hago categorica la variable barrio
propiedades_2$barrio <- as.factor(propiedades_2$barrio)
Calculo cuantas propiedades quedaron en cada una de las nuevas clases de la variable “barrio”
##
## bajo medio alto
## 11126 17259 17519
b. Calcular el modelo que predice el precio en función de las nuevas covariables e interpretar sus resultados (todas las partes de la salida que consideren relevantes)
#Elimino la varibale m2 del df
propiedades_2 <- subset( propiedades_2, select = -m2 )
#Corro el modelo lineal
lm_propiedades_2 <-
propiedades_2 %>%
lm(price ~ ., data = .)
summary(lm_propiedades_2)
##
## Call:
## lm(formula = price ~ ., data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -424841 -36502 -4768 25303 684162
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -132491.75 2473.72 -53.56 <2e-16 ***
## rooms -7889.80 464.51 -16.98 <2e-16 ***
## bathrooms 36402.45 676.53 53.81 <2e-16 ***
## surface_total 945.25 24.56 38.49 <2e-16 ***
## surface_covered 1509.24 29.96 50.38 <2e-16 ***
## property_typeDepartamento 94245.94 2269.03 41.54 <2e-16 ***
## property_typePH 48846.16 2389.89 20.44 <2e-16 ***
## barriomedio 31488.53 867.25 36.31 <2e-16 ***
## barrioalto 92757.85 891.29 104.07 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 70480 on 45895 degrees of freedom
## Multiple R-squared: 0.7491, Adjusted R-squared: 0.7491
## F-statistic: 1.713e+04 on 8 and 45895 DF, p-value: < 2.2e-16
El estadístico F sigue siendo significativo con la nueva variale “barrio”. El estadístico R² fue de 0.74, es decir que la variablidad explicada por este modelo es unos puntos inferior que el modelo anterior. Obviamente, como la variable fue reconfigurada para que tenga tres niveles (alto, medio, alto), los estimadores de los coeficientes también han cambiado. De esta forma, la categoria de referencia para “barrio” es “bajo”. Podemos ver que el estimador de 1 para “barrio medio” es de 31488.53, lo que indica que manteniendo las otras variables constantes, según el ajuste de este modelo la esperanza de una propiedad localizada en un barrio medio seria USD 31488.53 mayor que para un barrio bajo. Del mismo modo, el estimador del 1 para “barrio alto” dio 92757.85, , lo que indica que manteniendo las otras variables constantes, según el ajuste de este modelo la esperanza de una propiedad localizada en un barrio alto seria USD 92757.85 mayor que para un barrio bajo.
c. ¿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é?
El modelo que mejor explica la variabilidad es el primero (que utiliza la variable “l3”). Sin embargo, y pesar de que el valor del R es mayor en el segundo modelo que el del primero, el modelo que reconfigura la variable barrio en 3 categorías resutla mas util, de acuerdo de un criterio de parsimonia.
d. 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:
I. 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.
Creo una nueva variable “superficie patio”. En caso que la superficie total del inmueble sea mayor a la superficie cubierta se le asignará un valor de 0 para dicha variable en esa propiedad. Una vez hecho esto, elimino la variable que refiere a la superficie total.
II. 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
##
## Call:
## lm(formula = price ~ ., data = .)
##
## Residuals:
## Min 1Q Median 3Q Max
## -424841 -36502 -4768 25303 684162
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -132491.75 2473.72 -53.56 <2e-16 ***
## rooms -7889.80 464.51 -16.98 <2e-16 ***
## bathrooms 36402.45 676.53 53.81 <2e-16 ***
## surface_covered 2454.48 15.82 155.11 <2e-16 ***
## property_typeDepartamento 94245.94 2269.03 41.54 <2e-16 ***
## property_typePH 48846.16 2389.89 20.44 <2e-16 ***
## barriomedio 31488.53 867.25 36.31 <2e-16 ***
## barrioalto 92757.85 891.29 104.07 <2e-16 ***
## surface_patio 945.25 24.56 38.49 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 70480 on 45895 degrees of freedom
## Multiple R-squared: 0.7491, Adjusted R-squared: 0.7491
## F-statistic: 1.713e+04 on 8 and 45895 DF, p-value: < 2.2e-16
El R² para el presente modelo es igual al R² del modelo anterior que contenía el valor de la superficie total. Para este ultimo modelo el 1 de la superficie cubierta es de 2454.48, y de la superficie patio de 945.25 Lo cual significa que aumentando un m² de superficie cubierta aumenta USD 2454.48 el precio del inmueble segun el modelo ajustado (con el resto de las variables fijas), mientras que aumentando un m² de superficie del patio aumenta USD 945.25 el precio del inmueble segun el modelo ajustado (con el resto de las variables fijas).
3.Evaluación del modelo
a. Analizar los residuos del modelo elaborado en 2.d
Uno de los supuestos del modelo de regresion lineal utilizado es la homocedasticidad de los residuos. Se analizara de esta forma si se cumple con dicho supuesto
residuos = data.frame( x = lm_superficie_patio$fitted.values,
y = lm_superficie_patio$residuals )
residuos %>% ggplot( aes(x=x, y=y) ) +
geom_point(col="green", alpha = 0.8) +
ggtitle("Grafico de residuos vs predichos") +
xlab("Predichos") +
ylab("Residuos")
De acuerdo a lo observado en este grafico, es posible dar cuenta que dichos residuos no son homocedasticos. Del mismo modo podemos analizar si su distribucion es normal.
qqnorm( rstandard(lm_superficie_patio),
main = "QQ para residuos estandarizados",
xlab = "Quantiles normales",
ylab = "Residuos Estandarizados", )
abline(0,1)
A partir de este grafico, uno puede observar que tampoco se cumple con este supuesto.
b. Calcular el modelo log(price)=β0+β1log(rooms)+β2log(bathrooms)+β3log(surface_covered)+β4property_type+β5barrio+β6surface_patio. 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.
modelo_log <- lm( log(price) ~ log(rooms)+ log(bathrooms)+ log(surface_covered) + surface_patio + property_type + barrio, data = df_superficie_patio)
summary(modelo_log)
##
## Call:
## lm(formula = log(price) ~ log(rooms) + log(bathrooms) + log(surface_covered) +
## surface_patio + property_type + barrio, data = df_superficie_patio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.34779 -0.14872 -0.00854 0.13804 1.33105
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.3431278 0.0184976 451.039 < 2e-16 ***
## log(rooms) -0.0351830 0.0037769 -9.315 < 2e-16 ***
## log(bathrooms) 0.1798452 0.0038088 47.218 < 2e-16 ***
## log(surface_covered) 0.8000598 0.0044492 179.822 < 2e-16 ***
## surface_patio 0.0041331 0.0000795 51.991 < 2e-16 ***
## property_typeDepartamento 0.2062921 0.0072210 28.568 < 2e-16 ***
## property_typePH 0.0531386 0.0076391 6.956 3.54e-12 ***
## barriomedio 0.1866250 0.0028007 66.636 < 2e-16 ***
## barrioalto 0.4249501 0.0028789 147.611 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2276 on 45895 degrees of freedom
## Multiple R-squared: 0.8216, Adjusted R-squared: 0.8215
## F-statistic: 2.642e+04 on 8 and 45895 DF, p-value: < 2.2e-16
El R aumento aproximadamente en un 8% en comapracion con el modelo anterior, siendo ahora de 0,82. Analizare ahora si se cumplen los supuestos del modelo lineal
residuos_log = data.frame( x = modelo_log$fitted.values,
y = modelo_log$residuals )
residuos_log %>% ggplot( aes(x=x, y=y) ) +
geom_point(col="green", alpha = 0.8) +
ggtitle("Modelo Log:Grafico de residuos vs predichos") +
xlab("Predichos") +
ylab("Residuos")
qqnorm( rstandard(modelo_log),
main = "Modelo Log: QQ para residuos estandarizados",
xlab = "Quantiles normales",
ylab = "Residuos Estandarizados", )
abline(0,1)
Puede observarse que ahora los residuos se distribuyen mas homogeneamente, incluso con una varianza más estable. Del mismo modo, el QQ plot da cuenta de una mayor correspondencia con el modelo normal en comparación con el otro modelo ajustado sin la escala logarítmica. Considerando esto y que explica mayor variabilidad en comparación con otros modelos ajustados (como fue expuesto anteriormente), es que se lo considera mejor que los otros modelos ajustados para el precio de las propiedades. De este modo, el modelo en escala log cumpliría mejor con los supuestos de los modelos modelos lineales en comparacion con el otro modelo ajustado. Para las variables que no fueron convertidas a escala log, la interpretacion de los coeficientes no se realiza de forma lineal sino a partir de porcentajes.De este modo, por ejemplo, la variable “surface_patio” es de 0.004. Esto puede interpretarse que por cada m² de la propiedad, se produce (dejando el resto de las variables constantes) un aumento del precio medio del inmueble en un 0.4% En cambio, para las variables que fueron convertidas a escala log, la interpretación también en es porcentaje tanto para la variable explicativa como tambien para la variable dependiente. Así, tomando como ejemplo la variable “superficie cubierta”, por cada 1% que aumenta la superficie cubierta, aumenta en un 0.80% el valor de la propiedad. Todos los coeficientes dieron significativos en este modelo con escala log. Es decir que los 1 para todas las variables del modelo ajustado difieren significativamente de 0.
4.Dataframes anidados
a. Anidar por la variable property_type
b. 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?
funcion_map <- function(df) {
lm( price ~ rooms + bathrooms + surface_covered + surface_patio + barrio, data = df)
}
df_anidado <- df_anidado %>%
mutate(model = map(data, funcion_map))
df_anidado$model
## [[1]]
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_covered + surface_patio +
## barrio, data = df)
##
## Coefficients:
## (Intercept) rooms bathrooms surface_covered
## -42023 -13136 32499 2852
## surface_patio barriomedio barrioalto
## 1107 26477 85887
##
##
## [[2]]
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_covered + surface_patio +
## barrio, data = df)
##
## Coefficients:
## (Intercept) rooms bathrooms surface_covered
## 1768.6 1279.8 21630.0 1352.6
## surface_patio barriomedio barrioalto
## 626.4 48842.2 99860.0
##
##
## [[3]]
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_covered + surface_patio +
## barrio, data = df)
##
## Coefficients:
## (Intercept) rooms bathrooms surface_covered
## 5038 6893 27719 1125
## surface_patio barriomedio barrioalto
## 510 69356 177315
Obtengo los estimadores de los tres modelos
## # A tibble: 3 x 14
## property_type data model r.squared adj.r.squared sigma statistic
## <fct> <lis> <lis> <dbl> <dbl> <dbl> <dbl>
## 1 Departamento <tib~ <lm> 0.776 0.776 68203. 23315.
## 2 PH <tib~ <lm> 0.697 0.697 52747. 1674.
## 3 Casa <tib~ <lm> 0.592 0.590 86598. 284.
## # ... with 7 more variables: p.value <dbl>, df <int>, logLik <dbl>,
## # AIC <dbl>, BIC <dbl>, deviance <dbl>, df.residual <int>
La primer diferencia entre los modelos es el R². Mientras para el modelo de Casa es de 0.59, para el modelo de PH es 0.70 y para el modelo de departamento es 0.78. Esto da cuenta de notorias diferencias en la variabilidad explicada para cada uno de estos tres modelos. Para los 3 modelos, los coeficientes de referencia fueron barrios donde el precio del metro cuadrado era bajo.
Una cuestión que llama la atención es que el coeficiente “rooms” es negativo para Departamento, mientras que para el resto de las propiedades es positivo. Por otra parte podemos notar que para los departamentos el coeficiente de “bathrooms” (32499) es mayor en comparación a los PH (21630) y que para las casas (27719). Es decir que por cada baño extra el precio de las propiedad aumenta comparativamente más para los departamentos comparado con los PH y las casas. Además, es notable que para los departamentos el coeficiente del metro cuadrado de patio es 1107, casi el doble comparado con PH y Casa. Y algo similar ocurre con los valores de la superficie cubierta. Esto tiene sentido si se piensa que los valores de los departamento escalan más rápidamente de acuerdo a su superficie por m² en comparación con las casas y los PH.