# Cargo los paquetes a utilizar:
library(tidyverse)
library(plotly)
library(modelr)
library(tidymodels)
library(ggridges)
library(ggthemes)
library(ggplot2)
library(purrr)
# Como primer paso, cargo el dataset
properati <- readRDS("ar_properties.rds")
str(properati)
## Classes 'tbl_df', 'tbl' and 'data.frame': 45904 obs. of 8 variables:
## $ id : chr "AfdcsqUSelai1ofCAq2B0Q==" "ESzybdH7YU2uIU1/kHtRGw==" "r22OfzZ3kXooSPoE5HMuZQ==" "atZQXVtyfG7+OiX6gYY3lA==" ...
## $ l3 : chr "Velez Sarsfield" "Nuñez" "Almagro" "Almagro" ...
## $ rooms : num 3 1 1 1 1 1 1 1 1 1 ...
## $ bathrooms : num 2 1 1 1 1 1 1 1 1 1 ...
## $ surface_total : num 95 44 40 49 40 40 40 49 40 40 ...
## $ surface_covered: num 69 38 37 44 37 37 37 44 37 37 ...
## $ price : num 199900 147000 92294 115000 77000 ...
## $ property_type : chr "Casa" "Departamento" "Departamento" "Departamento" ...
# Paso a factores las variables categóricas
properati <-properati%>% mutate(l3 = as.factor(l3),
id = as.factor(id),
property_type=as.factor(property_type)
)
Creo un modelo para predecir el precio de las propiedades con todas las covariables.
# Utilizo la función "lm" para crear el modelo de Regresión Lineal Múltiple
modelo_1 <- lm( price ~ rooms+ bathrooms+ surface_total+ surface_covered + factor(l3) + factor(property_type) , data = properati)
summary(modelo_1)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## factor(l3) + factor(property_type), data = properati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -400904 -33817 -3307 24660 560915
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -109406.61 4788.67 -22.847 < 2e-16
## rooms -3961.27 444.58 -8.910 < 2e-16
## bathrooms 34040.98 644.28 52.836 < 2e-16
## surface_total 919.08 23.52 39.069 < 2e-16
## surface_covered 1457.18 28.73 50.715 < 2e-16
## factor(l3)Agronomía 623.53 8846.14 0.070 0.943807
## factor(l3)Almagro -4520.04 4295.24 -1.052 0.292650
## factor(l3)Balvanera -24788.27 4551.65 -5.446 5.18e-08
## factor(l3)Barracas -10128.24 5351.06 -1.893 0.058397
## factor(l3)Barrio Norte 49921.81 4417.82 11.300 < 2e-16
## factor(l3)Belgrano 69648.12 4283.55 16.259 < 2e-16
## factor(l3)Boca -47540.60 7076.20 -6.718 1.86e-11
## factor(l3)Boedo -19034.38 5219.54 -3.647 0.000266
## factor(l3)Caballito 6220.15 4301.29 1.446 0.148153
## factor(l3)Catalinas -76321.95 33563.74 -2.274 0.022974
## factor(l3)Centro / Microcentro -29046.49 6781.80 -4.283 1.85e-05
## factor(l3)Chacarita 11903.39 5299.02 2.246 0.024687
## factor(l3)Coghlan 40820.55 5462.90 7.472 8.02e-14
## factor(l3)Colegiales 34073.02 4816.54 7.074 1.52e-12
## factor(l3)Congreso -32314.97 5494.75 -5.881 4.10e-09
## factor(l3)Constitución -47292.98 6321.63 -7.481 7.50e-14
## factor(l3)Flores -22510.27 4536.15 -4.962 6.99e-07
## factor(l3)Floresta -28315.65 5069.38 -5.586 2.34e-08
## factor(l3)Las Cañitas 90455.90 5883.38 15.375 < 2e-16
## factor(l3)Liniers -20080.34 5366.27 -3.742 0.000183
## factor(l3)Mataderos -33863.43 5424.79 -6.242 4.35e-10
## factor(l3)Monserrat -32431.49 5228.46 -6.203 5.59e-10
## factor(l3)Monte Castro -8770.72 5949.63 -1.474 0.140445
## factor(l3)Nuñez 56958.42 4559.69 12.492 < 2e-16
## factor(l3)Once -30757.83 5456.51 -5.637 1.74e-08
## factor(l3)Palermo 66169.58 4221.50 15.674 < 2e-16
## factor(l3)Parque Avellaneda -34398.95 7598.09 -4.527 5.99e-06
## factor(l3)Parque Centenario -12288.30 5016.45 -2.450 0.014305
## factor(l3)Parque Chacabuco -22537.83 5314.36 -4.241 2.23e-05
## factor(l3)Parque Chas 5195.26 7542.97 0.689 0.490981
## factor(l3)Parque Patricios -36808.02 5973.29 -6.162 7.24e-10
## factor(l3)Paternal -13314.50 5189.69 -2.566 0.010304
## factor(l3)Pompeya -79977.17 8035.74 -9.953 < 2e-16
## factor(l3)Puerto Madero 259015.83 5095.12 50.836 < 2e-16
## factor(l3)Recoleta 64088.22 4360.34 14.698 < 2e-16
## factor(l3)Retiro 26067.40 5281.27 4.936 8.01e-07
## factor(l3)Saavedra 19492.00 4914.18 3.966 7.31e-05
## factor(l3)San Cristobal -23739.75 4955.13 -4.791 1.67e-06
## factor(l3)San Nicolás -26247.55 5168.96 -5.078 3.83e-07
## factor(l3)San Telmo -5653.85 4877.12 -1.159 0.246356
## factor(l3)Tribunales -34608.17 8924.63 -3.878 0.000106
## factor(l3)Velez Sarsfield -25943.69 8303.75 -3.124 0.001783
## factor(l3)Versalles -22232.13 6758.40 -3.290 0.001004
## factor(l3)Villa Crespo 1595.26 4317.54 0.369 0.711770
## factor(l3)Villa del Parque -3290.17 4866.59 -0.676 0.498997
## factor(l3)Villa Devoto 13301.39 4807.08 2.767 0.005659
## factor(l3)Villa General Mitre -19170.08 6802.25 -2.818 0.004831
## factor(l3)Villa Lugano -83039.18 6533.35 -12.710 < 2e-16
## factor(l3)Villa Luro -7579.11 5404.78 -1.402 0.160833
## factor(l3)Villa Ortuzar 18667.61 6829.18 2.734 0.006269
## factor(l3)Villa Pueyrredón 10516.80 5349.56 1.966 0.049314
## factor(l3)Villa Real -8823.37 8745.56 -1.009 0.313030
## factor(l3)Villa Riachuelo -32775.66 17171.10 -1.909 0.056298
## factor(l3)Villa Santa Rita -5767.71 6383.86 -0.903 0.366274
## factor(l3)Villa Soldati -136489.91 18944.29 -7.205 5.90e-13
## factor(l3)Villa Urquiza 30648.43 4418.91 6.936 4.09e-12
## factor(property_type)Departamento 92653.32 2191.23 42.284 < 2e-16
## factor(property_type)PH 46779.37 2274.94 20.563 < 2e-16
##
## (Intercept) ***
## rooms ***
## bathrooms ***
## surface_total ***
## surface_covered ***
## factor(l3)Agronomía
## factor(l3)Almagro
## factor(l3)Balvanera ***
## factor(l3)Barracas .
## factor(l3)Barrio Norte ***
## factor(l3)Belgrano ***
## factor(l3)Boca ***
## factor(l3)Boedo ***
## factor(l3)Caballito
## factor(l3)Catalinas *
## factor(l3)Centro / Microcentro ***
## factor(l3)Chacarita *
## factor(l3)Coghlan ***
## factor(l3)Colegiales ***
## factor(l3)Congreso ***
## factor(l3)Constitución ***
## factor(l3)Flores ***
## factor(l3)Floresta ***
## factor(l3)Las Cañitas ***
## factor(l3)Liniers ***
## factor(l3)Mataderos ***
## factor(l3)Monserrat ***
## factor(l3)Monte Castro
## factor(l3)Nuñez ***
## factor(l3)Once ***
## factor(l3)Palermo ***
## factor(l3)Parque Avellaneda ***
## factor(l3)Parque Centenario *
## factor(l3)Parque Chacabuco ***
## factor(l3)Parque Chas
## factor(l3)Parque Patricios ***
## factor(l3)Paternal *
## factor(l3)Pompeya ***
## factor(l3)Puerto Madero ***
## factor(l3)Recoleta ***
## factor(l3)Retiro ***
## factor(l3)Saavedra ***
## factor(l3)San Cristobal ***
## factor(l3)San Nicolás ***
## factor(l3)San Telmo
## factor(l3)Tribunales ***
## factor(l3)Velez Sarsfield **
## factor(l3)Versalles **
## factor(l3)Villa Crespo
## factor(l3)Villa del Parque
## factor(l3)Villa Devoto **
## factor(l3)Villa General Mitre **
## factor(l3)Villa Lugano ***
## factor(l3)Villa Luro
## factor(l3)Villa Ortuzar **
## factor(l3)Villa Pueyrredón *
## factor(l3)Villa Real
## factor(l3)Villa Riachuelo .
## factor(l3)Villa Santa Rita
## factor(l3)Villa Soldati ***
## factor(l3)Villa Urquiza ***
## factor(property_type)Departamento ***
## factor(property_type)PH ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 66580 on 45841 degrees of freedom
## Multiple R-squared: 0.7764, Adjusted R-squared: 0.7761
## F-statistic: 2568 on 62 and 45841 DF, p-value: < 2.2e-16
rooms
: coeficiente negativo y significativo al 1%bathrooms
, surface_total
y surface_covered
: coeficientes positivos y significativos al 1%property type
: significativo al 1%. coeficiente positivo para PH y Departamento.Barrio (l3)
: significativo al 1%. coeficiente positivo para algunos casos y negativo en otros.El modelo logra captar un 77,6% de la variabilidad del precio (R2 = 0.776). Asimismo, el test F de significatividad global registra un p-valor menor a 1%; por lo tanto, se rechaza la hipótesis nula de que todos los coeficientes son cero.
Para responder a esta pregunta evaluamos las características de cada propiedad en el modelo estimado en la sub sección previa.
# Con la función predict comparo el valor total de cada uno de las propiedades dadas las características del problema
predict.list <- predict(modelo_1,
newdata = data.frame(l3 = c("Abasto", "Balvanera"), rooms = c(3,2), bathrooms=c(2,3), surface_total=c(120,80), surface_covered=c(120,60), property_type=c("Departamento","PH")), se.fit = FALSE)
tidy(predict.list)
## # A tibble: 2 x 2
## names x
## <chr> <dbl>
## 1 1 324596.
## 2 2 167742.
El modelo estima un precio de 324.5 mil dólares para el departamento en Abasto y un precio de 167.7 mil dólares para el PH en Balvanera.Por lo tanto conviene tener para vender el departamento en el Abasto
l3
(barrio).Analizo la regresión lineal múltiple si no se incluyera la variable l3
:
# Este modelo es idéntico al anterior pero sin agregar la variable "l3" en el sumando.
modelo_2 <- lm( price ~ rooms+ bathrooms+ surface_total+ surface_covered+ factor(property_type), data = properati)
summary(modelo_2)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## factor(property_type), data = properati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -518799 -36177 -9643 25740 724251
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -131096.86 2750.50 -47.66 <2e-16
## rooms -13348.53 519.02 -25.72 <2e-16
## bathrooms 42664.68 756.37 56.41 <2e-16
## surface_total 877.03 27.59 31.79 <2e-16
## surface_covered 1783.80 33.53 53.21 <2e-16
## factor(property_type)Departamento 135177.47 2513.93 53.77 <2e-16
## factor(property_type)PH 68598.52 2677.46 25.62 <2e-16
##
## (Intercept) ***
## rooms ***
## bathrooms ***
## surface_total ***
## surface_covered ***
## factor(property_type)Departamento ***
## factor(property_type)PH ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 79210 on 45897 degrees of freedom
## Multiple R-squared: 0.6832, Adjusted R-squared: 0.6831
## F-statistic: 1.649e+04 on 6 and 45897 DF, p-value: < 2.2e-16
rooms
: coeficiente negativo y significativo al 1%bathrooms
,surface_total
y surface_covered
: coeficientes positivos y significativos al 1%property type
: significativo al 1%. coeficiente positivo para PH y Departamento.El modelo logra captar un 68.3% de la variabilidad del precio (R2 = 0.683). Asimismo, el test F de significatividad global registra un p-valor menor a 1%; por lo tanto, se rechaza la hipótesis nula de que todos los coeficientes son cero.
Dado que el R2 del modelo I es mayor al R2 del modelo II, podemos decir que el modelos I logra captar una mayor proporción de la variabilidad del precio de los inmuebles.
Para generar la nueva variable barrios
que clasifica los barrios de la ciudad de acuerdo a si el precio es bajo, medio o alto se realizó un análisis de clusters a partir del la mediana delos precios de cada barrio. Concretamente utilizó el algoritmo PAM.
En una primer etapa generamos la variable precio_m2
, que es el precio por metro cuadrado de la propiedad, y el dataset precio_barrio
, que contiene la mediana de los precios del barrio.
#Genero variable precio por metro cuadrado
properati<-properati %>%
mutate(precio_m2=price/surface_total)
#Genero dataset con mediana de precios. Se tomó la mediana por ser más robusta ante la presencia de outliers
precio_barrio <- properati %>% group_by(l3) %>% summarise(precio_barrio = median(precio_m2))
#ponemos nombre del barrio a la fila
rownames(precio_barrio)<-precio_barrio$l3
Luego, calculamos los cluster a través del algoritmo PAM con k=3.
#Cargo librería
library(cluster)
#Calculo matriz de distancias euclideas
distancia = dist(precio_barrio,method = "euclidean")
#Calculo los clusters para k=3
set.seed(1515)
pam_cluster<-pam(x = precio_barrio, k = 3, metric = "euclidean", stand = FALSE)
#Grafico
factoextra::fviz_cluster(pam_cluster, palette = "jo", ellipse.type = "t", repel = TRUE, ggtheme = theme_minimal())
De esta forma obtenemos tres grupos con los siguientes umbrales de precios por m2:
precio_barrio <- cbind(precio_barrio, cluster = pam_cluster$clustering)
precio_barrio %>% group_by(as.factor(cluster)) %>% summarise(min= min(precio_barrio),
max = max(precio_barrio))
En el gráfico se puede observar que estos cluster separan a los barrios en tres categorías acordes a niveles de precios diferentes.
precio_barrio %>%
ggplot(aes(x = reorder(l3,precio_barrio), y = precio_barrio,fill=as.factor(cluster)))+
geom_bar(stat = "identity", color="black")+
labs(title="Mediana de precio por m2 por barrio", subtitle = "Fuente: Properati Argentina")+
labs(x="Barrios", y="Precio por m2 (USD)",fill="Cluster")+
theme_fivethirtyeight()+
theme(axis.line.x = element_line(size = .5, colour = "black"),
axis.line.y = element_line(size = .5, colour = "black"),
axis.text.x = element_text(colour = "black", size = 10, angle = 90),
axis.text.y = element_text(colour = "black", size = 10),
legend.position = "top",
legend.direction = "horizontal",
legend.box = "horizontal",
legend.key = element_blank())+
geom_hline(yintercept=2000, color = "black", linetype="dashed")+
geom_hline(yintercept=2650, color = "black", linetype="dashed")
Finalmente hago un join entre las tablas
#genero variable barrio
precio_barrio <- precio_barrio %>% mutate( barrios = case_when(cluster==1 ~ "medio",
cluster==2 ~ "alto",
cluster==3 ~ "bajo"))
#join
properati<- left_join(properati,precio_barrio,by= c("l3"="l3"))
barrios
.El modelo 3, que busca explicar el precio de los inmueble en base a las covariables habitación, baños, superficie, tipo de propiedad y nivel de precios del barrio, se presenta a continuación:
modelo_3 <- lm( price ~ rooms + bathrooms+ surface_total + surface_covered + factor(property_type) + factor(barrios), data = properati)
summary(modelo_3)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_total + surface_covered +
## factor(property_type) + factor(barrios), data = properati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -432485 -37145 -4055 25355 690643
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54717.39 2573.37 -21.26 <2e-16
## rooms -7804.81 468.65 -16.65 <2e-16
## bathrooms 37266.83 680.77 54.74 <2e-16
## surface_total 900.92 24.77 36.37 <2e-16
## surface_covered 1568.76 30.16 52.02 <2e-16
## factor(property_type)Departamento 100884.39 2283.97 44.17 <2e-16
## factor(property_type)PH 53872.87 2407.94 22.37 <2e-16
## factor(barrios)bajo -104050.12 1822.98 -57.08 <2e-16
## factor(barrios)medio -69248.19 695.69 -99.54 <2e-16
##
## (Intercept) ***
## rooms ***
## bathrooms ***
## surface_total ***
## surface_covered ***
## factor(property_type)Departamento ***
## factor(property_type)PH ***
## factor(barrios)bajo ***
## factor(barrios)medio ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 71070 on 45895 degrees of freedom
## Multiple R-squared: 0.7449, Adjusted R-squared: 0.7449
## F-statistic: 1.676e+04 on 8 and 45895 DF, p-value: < 2.2e-16
rooms
: coeficiente negativo y significativo al 1%. El coeficiente puede interpretarse como: “por cada habitación adicional que tenga el inmueble el \(\hat{price}\) caerá 54.7 miles de dólares.bathrooms
,surface_total
y surface_covered
: coeficientes positivos y significativos al 1%. Interpretación: Por cada unidad que aumenten bathrooms
,surface_total
y surface_covered
, \(\hat{price}\) se incrementará en 37.2 mil, 900 y 1567 dólares respectivamente.property type
: coeficiente significativo al 1%. coeficiente positivo para PH y Departamento.barrio
: coeficientes negativos para los caso de barrios con niveles de precios medios y bajos. Coeficiente significativo al 1%.El modelo logra captar un 75,5% de la variabilidad del precio. En ese sentido resulta superior al modelo II pero inferior al modelo I.
Se rechaza la Ho del test f de significatividad global.
En la siguiente tabla y gráfico mostramos la cantidad de datos con los que contamos en cada barrio. En algunos casos tenemos información para menos de 20 inmuebles. Considero que en el caso de predecir el precio de una propiedad en estos barrios el modelo 3 tendrá un mayor poder explicativo que el modelo 1.Sin embargo en barrios con mayor disponibilidad de información (Palermo, Nuñez, etc) el modelo 1 puede ser superior.
properati %>% count(l3,cluster) %>% arrange(n) %>% head()
properati %>% count(l3,cluster) %>% ggplot(mapping = aes(x = reorder(l3,n), y = n, fill=as.factor(cluster) ))+geom_bar(stat = "identity", color="black") +
labs(title="Cant. de datos por barrio", subtitle = "Fuente: Properati Argentina")+
labs(x="Barrios", y="Frecuencia",fill="Cluster") +
theme_fivethirtyeight() +
theme(axis.line.x = element_line(size = .5, colour = "black"),
axis.line.y = element_line(size = .5, colour = "black"),
axis.text.x = element_text(colour = "black", size = 10, angle = 90),
axis.text.y = element_text(colour = "black", size = 10),
legend.position = "top",
legend.direction = "horizontal",
legend.box = "horizontal",
legend.key = element_blank())
surface_patio
.Generamos la variable patio. Todos los valores son mayores cero.
#Genreo variable
properati <-properati %>% mutate(surface_patio = surface_total- surface_covered)
summary(properati$surface_patio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 5.000 9.338 10.000 91.000
sum(properati$surface_total<properati$surface_covered)
## [1] 0
Corremos el modelo que diferencia la superficie total en cubierta y descubierta:
modelo_4 <- lm( price ~ rooms + bathrooms+ surface_patio + surface_covered + factor(property_type) + factor(barrios), data = properati)
summary(modelo_4)
##
## Call:
## lm(formula = price ~ rooms + bathrooms + surface_patio + surface_covered +
## factor(property_type) + factor(barrios), data = properati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -432485 -37145 -4055 25355 690643
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54717.39 2573.37 -21.26 <2e-16
## rooms -7804.81 468.65 -16.65 <2e-16
## bathrooms 37266.83 680.77 54.74 <2e-16
## surface_patio 900.92 24.77 36.37 <2e-16
## surface_covered 2469.68 15.93 155.07 <2e-16
## factor(property_type)Departamento 100884.39 2283.97 44.17 <2e-16
## factor(property_type)PH 53872.87 2407.94 22.37 <2e-16
## factor(barrios)bajo -104050.12 1822.98 -57.08 <2e-16
## factor(barrios)medio -69248.19 695.69 -99.54 <2e-16
##
## (Intercept) ***
## rooms ***
## bathrooms ***
## surface_patio ***
## surface_covered ***
## factor(property_type)Departamento ***
## factor(property_type)PH ***
## factor(barrios)bajo ***
## factor(barrios)medio ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 71070 on 45895 degrees of freedom
## Multiple R-squared: 0.7449, Adjusted R-squared: 0.7449
## F-statistic: 1.676e+04 on 8 and 45895 DF, p-value: < 2.2e-16
La variabilidad explicada alcanza el 74.5%. Se rechaza el test F de significatividad global.
Los coeficientes que afectan a las variables surface_patio
y surface_covered
son positivos y significativos al 1%. Se destaca que el coeficiente que afecta al a variable surace_patio
es menor que el de surface_covered
. Por lo tanto, un incremento de un metro de superficie cubierta tiene mayor incidencia sobre el precio que un incremento en la superficie descubierta.
En el gráfico siguiente permite comparar los reduo vs el valor predicho por el modelo para el dataset de properati. La linea roja, indica la tendencia de los residuos. Como se puede observar, no existe un tendencia clara ni hacia arriba ni hacia abajo, sino que se mantiene en torno al cero. Esto indica que el dataset de properati puede analizarse correctamente con un modelo lineal.
plot(modelo_4, which=1, col=c("light blue")) # Scale-Location Plot
Corremos el modelo. Agregamos un +1 a surface patio por que no se puede hacer el logaritmo de cero (-infinito)
modelo_5 <- lm(log(price) ~ log(rooms) + log(bathrooms) + log(surface_patio+1) + log(surface_covered) + factor(property_type) + factor(barrios), data = properati)
summary(modelo_5)
##
## Call:
## lm(formula = log(price) ~ log(rooms) + log(bathrooms) + log(surface_patio +
## 1) + log(surface_covered) + factor(property_type) + factor(barrios),
## data = properati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.36387 -0.14483 -0.00861 0.13155 1.33083
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.6407249 0.0186029 464.484 <2e-16
## log(rooms) -0.0353365 0.0037497 -9.424 <2e-16
## log(bathrooms) 0.1701206 0.0037918 44.866 <2e-16
## log(surface_patio + 1) 0.0607937 0.0008852 68.678 <2e-16
## log(surface_covered) 0.8108231 0.0043913 184.643 <2e-16
## factor(property_type)Departamento 0.2090568 0.0070662 29.585 <2e-16
## factor(property_type)PH 0.0711727 0.0075655 9.408 <2e-16
## factor(barrios)bajo -0.5222348 0.0057920 -90.165 <2e-16
## factor(barrios)medio -0.2971883 0.0022123 -134.336 <2e-16
##
## (Intercept) ***
## log(rooms) ***
## log(bathrooms) ***
## log(surface_patio + 1) ***
## log(surface_covered) ***
## factor(property_type)Departamento ***
## factor(property_type)PH ***
## factor(barrios)bajo ***
## factor(barrios)medio ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2259 on 45895 degrees of freedom
## Multiple R-squared: 0.8243, Adjusted R-squared: 0.8243
## F-statistic: 2.691e+04 on 8 and 45895 DF, p-value: < 2.2e-16
El modelo 5 es muy superior a los anteriores en varios sentidos:
surface_patio
es positivo pero inferior al de surface_covered
rooms
es negativo, lo que , dado que controlamos por superficie, penaliza a las propiedades con habitaciones más pequeñas.Como el modelos es de tipo log-log para las variables no dummy y log-lin para las dummy los coeficientes se pueden interpretar de la siguiente manera:
en el caso de las variables log-log, decimos por ejemplo que un aumento de 1% en la superficie cubierta se traducirá a un alza de 0.8% de \(\hat{price}\)
en el caso de las variables log-lin, decimos por ejemplo que en el caso de que se trate de una propiedad del tipo PH, \(\hat{price}\) registrará un alza de 0.07%.
plot(modelo_5, which=1, col=c("light blue")) # Scale-Location Plot
# Primero agrupo la data por tipo de propiedad
by_property_type <- properati %>%
group_by(property_type) %>%
nest()
# Creo la funcion de regresión lineal para usarla dentro de la función map
funcion_modelo <- function(df) {
modelo4 <- lm( price ~ rooms + bathrooms + surface_covered + surface_patio + barrios, data = df)
}
models <- map(by_property_type$data, funcion_modelo)
# Para cada tipo de departamento se calcula la función lineal múltiple y se agrega al dataframe
by_property_type <- by_property_type %>%
mutate(model = map(data, funcion_modelo))
# Extraigo de cada propiedad los resultados del cálculo de las métricas del modelo
glnc <- by_property_type %>%
mutate(glnc = map(model, glance)) %>%
unnest(glnc, .drop = TRUE)
glnc
Los tres modelos resultan significativos(Test F, se rechaza la hipótesis que todas los coeficientes de las variables sean nulos). En cuanto a la variabilidad explicada, el modelo de las viviendas tipo departamento registra el valor más alto (77%), mientras que el de las casas el menor (68%).No obstante, ninguno de los tres modelos logra supera en R2 del quinto modelo.