Cargamos librerías y datos
library(tidyverse)
library(mice)
library(dplyr)
library(tidyr)
library(ggplot2)
library(lubridate)
library(GGally)
library(corrplot)
base <- read_csv('C:/Users/Artur/Desktop/Arturo/EEA2019-master/tp1/ar_properties/ar_properties.csv')
Revisamos brevemente el dataset, su contenido y tipo de variables.
glimpse(base)
Observations: 388,891
Variables: 24
$ id [3m[38;5;246m<chr>[39m[23m "S0we3z3V2JpHUJreqQ2t/w==", "kMxcmAS8NvrynGBVbMOEaQ==", "Ce3ojF+ZTOkB8d+LI9dpxg==",...
$ ad_type [3m[38;5;246m<chr>[39m[23m "Propiedad", "Propiedad", "Propiedad", "Propiedad", "Propiedad", "Propiedad", "Prop...
$ start_date [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14...
$ end_date [3m[38;5;246m<date>[39m[23m 2019-06-14, 2019-04-16, 9999-12-31, 9999-12-31, 2019-07-09, 2019-08-08, 2019-07-10...
$ created_on [3m[38;5;246m<date>[39m[23m 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14, 2019-04-14...
$ lat [3m[38;5;246m<dbl>[39m[23m -34.94331, -34.63181, NA, -34.65471, -34.65495, -32.93547, -34.65183, -34.91213, -3...
$ lon [3m[38;5;246m<dbl>[39m[23m -54.92966, -58.42060, NA, -58.79089, -58.78712, -60.68398, -58.65912, -54.84749, -5...
$ l1 [3m[38;5;246m<chr>[39m[23m "Uruguay", "Argentina", "Argentina", "Argentina", "Argentina", "Argentina", "Argent...
$ l2 [3m[38;5;246m<chr>[39m[23m "Maldonado", "Capital Federal", "Bs.As. G.B.A. Zona Norte", "Bs.As. G.B.A. Zona Oes...
$ l3 [3m[38;5;246m<chr>[39m[23m "Punta del Este", "Boedo", NA, "Moreno", "Moreno", "Rosario", "Ituzaingó", "José Ig...
$ l4 [3m[38;5;246m<chr>[39m[23m NA, NA, NA, "Moreno", "Moreno", NA, "Ituzaingó", NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ l5 [3m[38;5;246m<chr>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ l6 [3m[38;5;246m<lgl>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ rooms [3m[38;5;246m<dbl>[39m[23m 2, NA, 2, 2, 2, 4, NA, 6, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, ...
$ bedrooms [3m[38;5;246m<dbl>[39m[23m NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,...
$ bathrooms [3m[38;5;246m<dbl>[39m[23m 1, NA, 1, 2, 3, 1, 3, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 1, 1, 1, 1,...
$ surface_total [3m[38;5;246m<dbl>[39m[23m 45, NA, 200, 460, 660, NA, 70, NA, 1300, 405, 352, 373, 360, 1325, 250, 80142, 101,...
$ surface_covered [3m[38;5;246m<dbl>[39m[23m 40, NA, NA, 100, 148, 89, 122, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, 54, 180, ...
$ price [3m[38;5;246m<dbl>[39m[23m 13000, 0, NA, NA, NA, NA, NA, NA, 0, NA, 0, NA, NA, NA, NA, NA, 0, 0, 0, NA, 0, 0, ...
$ currency [3m[38;5;246m<chr>[39m[23m "UYU", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
$ price_period [3m[38;5;246m<chr>[39m[23m "Mensual", "Mensual", NA, "Mensual", "Mensual", "Mensual", "Mensual", "Mensual", "M...
$ title [3m[38;5;246m<chr>[39m[23m "Departamento - Roosevelt", "PH - Boedo", "Ituzaingo 1100 - $ 1 - Casa Alquiler", ...
$ property_type [3m[38;5;246m<chr>[39m[23m "Departamento", "PH", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Lote", "Lote...
$ operation_type [3m[38;5;246m<chr>[39m[23m "Alquiler", "Venta", "Alquiler", "Venta", "Venta", "Venta", "Venta", "Alquiler", "V...
Procedemos a filtrar para dejar únicamente las propiedades en “Venta” de Argentina, Capital Federal, valuadas en USD, de tipo “Casa”, “PH” y “Departamento”. Las variables con las contaremos serán, “ID”, Barrio (“l3”), ambientes, cuartos, baños, superficie total, superficie cubierta, precio y tipo de propiedad.
base=base %>%
filter(l1=="Argentina",l2=="Capital Federal",currency=="USD",property_type=="PH"|property_type=="Casa"|property_type=="Departamento",operation_type=="Venta")%>%
select(id, l3, rooms, bedrooms, bathrooms, surface_total, surface_covered, price, property_type)
Observamos cuantos valores únicos y faltantes tiene cada columna
for (i in 1:8){
a=sum(is.na(base[1:61905,i]))
b=count(unique(base[,i]))
c=names(base[,i])
d= round(a/61905,2)
print(paste("La columna '",c,"' tiene ",a," faltantes(",d," porcentaje del total) y tiene ", b," valores unicos"))
}
[1] "La columna ' id ' tiene 0 faltantes( 0 porcentaje del total) y tiene 61905 valores unicos"
[1] "La columna ' l3 ' tiene 355 faltantes( 0.01 porcentaje del total) y tiene 58 valores unicos"
[1] "La columna ' rooms ' tiene 5314 faltantes( 0.09 porcentaje del total) y tiene 24 valores unicos"
[1] "La columna ' bedrooms ' tiene 25298 faltantes( 0.41 porcentaje del total) y tiene 25 valores unicos"
[1] "La columna ' bathrooms ' tiene 3196 faltantes( 0.05 porcentaje del total) y tiene 15 valores unicos"
[1] "La columna ' surface_total ' tiene 3671 faltantes( 0.06 porcentaje del total) y tiene 671 valores unicos"
[1] "La columna ' surface_covered ' tiene 2975 faltantes( 0.05 porcentaje del total) y tiene 573 valores unicos"
[1] "La columna ' price ' tiene 0 faltantes( 0 porcentaje del total) y tiene 4095 valores unicos"
En la columna de ID, vemos que no hay datos faltantes y además podemos intuir que no hay IDs repetidos ya que los valores únicos coinciden con la cantidad de filas del dataframe. en cuanto a los barrios (“l3”), hay pocos faltantes en términos relativos y la cantidad de valores únicos de 58, si bien es mayor a los 48 barrios oficiales, existen 115 barrios no oficiales, por lo que puede ser un valor posible. La variable que más faltante presenta es “cuartos” (bedroom) con 25 mil registros aprox., lo que implica una proporción considerable de nuestro data set (de 41%). Esto podría transformarse en un problema si pensaramos en eliminar los registros con algún faltante. Pero falta analizar aún la importancia de esta variable. Las 4 variables restantes no presenta ninguna un faltante mayor al 9%.
Ahora, separamos las variables numéricas para analizar la matriz de correlación omitiendo los valores faltantes.
base_numerica=base %>%
select(rooms, bedrooms, bathrooms, surface_total, surface_covered, price)
basecor=cor(base_numerica,use= "complete.obs", method="pearson")
corrplot(basecor,addCoef.col ="black",diag=F,type = "upper")
Dado que la variable “Bedrooms” y “Rooms” estan altamente correlacionadas (0.92) de forma positiva ello nos indica que una de ellas casi no aporta nueva información adicional a la otra. Considerando, como ya vimos, que “bedrooms” tenía una alta proporción de faltante y este alto nivel de correlación, la eliminaremos.
base=base%>%
select(-bedrooms)
La siguiente matriz nos muestra que para las 8 variables tenemos datos completos en 51210 casos (con cero faltante). En rojo vemos los faltantes en una columna y sus combinaciones (a la izquierda se ven la cantidad de casos que ocurre la situación de la fila y a la derecha cuantos faltantes por fila de 8 variables). Como se observa a continuación, el caso más común es el de registros en los cuales falta únicamente la variable “rooms”, con 3300 casos.
md.pattern(base)
id price property_type l3 surface_covered bathrooms surface_total rooms
51210 1 1 1 1 1 1 1 1 0
3303 1 1 1 1 1 1 1 0 1
1694 1 1 1 1 1 1 0 1 1
182 1 1 1 1 1 1 0 0 2
1373 1 1 1 1 1 0 1 1 1
728 1 1 1 1 1 0 1 0 2
71 1 1 1 1 1 0 0 1 2
26 1 1 1 1 1 0 0 0 3
1198 1 1 1 1 0 1 1 1 1
199 1 1 1 1 0 1 1 0 2
556 1 1 1 1 0 1 0 1 2
54 1 1 1 1 0 1 0 0 3
83 1 1 1 1 0 0 1 1 2
45 1 1 1 1 0 0 1 0 3
59 1 1 1 1 0 0 0 1 3
769 1 1 1 1 0 0 0 0 4
58 1 1 1 0 1 1 1 1 1
3 1 1 1 0 1 1 1 0 2
247 1 1 1 0 1 1 0 1 2
31 1 1 1 0 1 0 1 1 2
4 1 1 1 0 1 0 0 1 3
2 1 1 1 0 0 1 1 1 2
3 1 1 1 0 0 1 0 1 3
1 1 1 1 0 0 0 1 1 3
1 1 1 1 0 0 0 0 1 4
5 1 1 1 0 0 0 0 0 5
0 0 0 355 2975 3196 3671 5314 15511
pto 3.b) Con este análisis notamos que si eliminamos los registros con faltante reduciríamos la base en un 17% del dataset pre-seleccionado lo que parece no demasiado arriesgado (nos quedamos con el 82,7%, o sea 51 mil filas de casi 62 mil). Vale aclarar que de haber considerado que este percentaje era demasiado para eliminar, dado que trabajaremos con superficies, precios y ambientes, podríamos haber dejado casos con ciertos faltantes. Por ejemplo, hay casos con solo faltantes en “bathroom”, con lo cual si no eliminàsemos estos casos podríamos sumar 1300 nuevos registros.
basecomp <- na.omit(base)
Revisamos la variable precio para todas los tipos de propiedades juntas
summary(basecomp$price)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 119000 170000 251577 270000 6000000
Realizamos un histograma del logaritmo de los precios en USD
ggplot(data = basecomp) +
geom_histogram(mapping = aes(x = price), fill = "pink") +
scale_x_log10() +
labs(x = "Precio en USD (escala log.)", y = "Frecuencia absoluta",
title = "Histograma de precio de viviendas",
subtitle = "escala logarítmica") +
theme_bw()
PH=basecomp%>%
filter(property_type=="PH")
casa=basecomp%>%
filter(property_type=="Casa")
depto=basecomp%>%
filter(property_type=="Departamento")
print("Analisis de precios de PH:")
[1] "Analisis de precios de PH:"
print(summary(PH$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
32000 137000 190000 218747 270000 1500000
print("Analisis de precios de Casa:")
[1] "Analisis de precios de Casa:"
print(summary(casa$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
20000 235000 335000 434189 490000 5000000
print("Analisis de precios de Departamento:")
[1] "Analisis de precios de Departamento:"
print(summary(depto$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
6000 115000 164000 246856 260000 6000000
Se observa que la media de precios de las casas es considerablemente mas alta (en torno a $430 mil USD) que la de PH y departamente (entre 218 mil USD y 247 mil USD, respectivamente)
Se realizan a continuación los boxplot por tipo de propiedad. Dado que el crecimiento de los precios dificulta ver la la “caja” de los boxplot, realizamos una transformación en logaritmos de la variable precio.
ggplot(basecomp,aes(y=log(price,10),color=property_type))+
geom_boxplot(alpha=0.75)+
labs(title = "Logaritmo de precios de propiedades en función de su superficie",x="Superficie Total",y="Logaritmo del precio en USD")+
theme(legend.position = 'None')+
facet_wrap(~property_type)
Realizamos un correlogramas para ver la relación y diagrama de dispersión entre las variables numéricas.
var_numericas <- basecomp %>%
select(rooms,bathrooms,surface_total,surface_covered,price)
GGally::ggpairs(data = var_numericas,
lower = list(continuous = GGally::wrap("points", alpha = 0.4, size=0.2),
combo = GGally::wrap("dot", alpha = 0.5, size=0.25) )) +
ggplot2::labs(title = "Correlograma de variables", x = "", y = "") +
ggplot2::theme_bw() +
ggplot2::theme(
legend.position = "bottom",
)
Del correlograma se puede ver la relación positiva entre baños y ambientes (ambas discretas, por eso la forma separada de sus puntos). En cuanto superficies (cubierta y total) se observan algunos outlier que aplana considerablemente la distribución de los puntos en cuanto a ambientes (impidiendo ver la relación entre ambas) o concentrando los puntos en cuanto a precios.
En primer lugar, del análisis precedente resaltan algunas propiedades con mas de 10 baños y pocos ambientes. Descubrimos que los siguientes 9 departamentos tienen mal cargado sus baños por su relación inviable con habitaciones y metros totales. Pese a ello, su relación entre metros cuadrados y precio no parece ameritar su eliminación por ser números razonables (teniendo en cuenta que la variable en la que nos centramos es “precio”, por la consigna del TP).
basecomp%>%
filter(bathrooms>10)
Dado que muchas propiedades con errores de carga pueden ocultarse al estar dentro el “rango” de precios normales, crearemos una nueva variable “Precio por Metro cuadrado” para detectar mejor posibles errores y outliers.
basecomp=basecomp%>%
mutate(precio_m2=price/surface_total)
ggplot(data=basecomp,aes(y=precio_m2,color=property_type))+
geom_boxplot(alpha=0.75)+
labs(title = "Precio por metro cuadrados de distintas propiedades",y="Precio en USD por metro cuadrado")+
theme(legend.position = 'None')+
facet_wrap(~property_type)
Los problemas que notamos al filtrar las propiedades con valor por metro cuadrado por encima de 16 mil dólares son varios: uno de ellos esta dado por superficies totales menores a la superficie cubierta. Otro parecerían ser precios extremos donde los valores podrían tener un dígito de más. Por ello:
1- Primero limpiamos aquellas propiedades con superficie cubierta mayor a la total en 10 metros o más (163 registros). Con esto, además de eliminar propiedades con errores groseros, estaremos eliminando algunos precios por metro cuadrado “posible” (en áreas como puerto madero) pero que en realidad son fruto de cargas erroneas.
2- Limpiamos aquellas propiedades con precios por metro cuadrado superior a los 16.000 mil dólares (se eligió este valor ya que hasta este monto se observaban registros “razonables” en zonas exclusivas de CABA). En este paso se eliminan 11 Registros
3- Por el lado opuesto, de bajos precios por metros cuadrado, se nota que en el rango de menos de 350 dólares el metro cuadrado (78 registros) la tasa de probables errores es sumamente alta, ya sea en superficies exageradas(con dígitos de más) o en precios bajos (con dígitos de menos).
4- Adicionalmente, filtramos las propiedades con 14 metros cuadrados totales o menos, ya que se sospecha que puede tratarse de cocheras, ya que sus precios no superan los 28 mil dólares. Se trata de 9 registros.
5- Por último se eliminan 4 registros (entre los cuales parece haber 3 repetidos en Villa Devoto) con una superficie total de 2000 metros cuadrados (la cual es bastante rara para un departamento o casa ya que sería un tercio de manzana). El resultado final es una base de datos con 50.939 registros.
Basecomp_filtrada=basecomp%>%
filter((surface_total+10>surface_covered))
Basecomp_filtrada=Basecomp_filtrada%>%
filter(precio_m2<16000)
Basecomp_filtrada=Basecomp_filtrada%>%
filter(precio_m2>350)
Basecomp_filtrada=Basecomp_filtrada%>%
filter(surface_total>=15)
Basecomp_filtrada=Basecomp_filtrada%>%
filter(surface_total<2000)
Cuando volvemos a analizar el rango, vemos que las medidas centrales como medias y medianas casi no variaron y apenas se registra algún cambio en los máximos y mínimos
Casa2=Basecomp_filtrada %>%
filter(property_type=="Casa")
Departamento2=Basecomp_filtrada %>%
filter(property_type=="Departamento")
PH2=Basecomp_filtrada %>%
filter(property_type=="PH")
print("PH sin outliers")
[1] "PH sin outliers"
print(summary(PH2$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
32000 137000 190000 218639 270000 1500000
print("Casas sin outliers")
[1] "Casas sin outliers"
print(summary(Casa2$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
62000 235000 334450 431491 490000 4000000
print("Dptos sin outliers")
[1] "Dptos sin outliers"
print(summary(Departamento2$price))
Min. 1st Qu. Median Mean 3rd Qu. Max.
12500 115000 164000 246510 260000 6000000
Sin embargo, al realizar nuevamente el boxplot del precio por metro cuadrado de superficie a posteriori de la limpieza de outliers, se observa mejor el comportamientos de las variables en los tres tipos de viviendas, y en escalas dentro de rangos “esperables”. Asimismo, se observa que el precio promedio por metro cuadrado es considerablemente mayor entre los departamentos (2931 USD/M2) que entre casas (1740 USD/M2) y PH (1954 USD/M2)
ggplot(data=Basecomp_filtrada,aes(y=precio_m2,color=property_type))+
geom_boxplot(alpha=0.75)+
labs(title = "Precio por metro cuadrados de distintas propiedades",x="Superficie Total",y="Precio en USD por metro cuadrado")+
theme(legend.position = 'None')+
facet_wrap(~property_type)
print("PH sin outliers")
[1] "PH sin outliers"
print(summary(PH2$precio_m2))
Min. 1st Qu. Median Mean 3rd Qu. Max.
388.6 1440.3 1903.4 1954.1 2403.0 4903.8
print("Casas sin outliers")
[1] "Casas sin outliers"
print(summary(Casa2$precio_m2))
Min. 1st Qu. Median Mean 3rd Qu. Max.
350.8 1213.1 1634.2 1739.9 2079.3 9600.0
print("Dptos sin outliers")
[1] "Dptos sin outliers"
print(summary(Departamento2$precio_m2))
Min. 1st Qu. Median Mean 3rd Qu. Max.
352.6 2297.3 2750.0 2930.9 3333.3 15806.5
Veamos ahora el comportamiento del precio final en miles de dólares (no por metro cuadrado)
ggplot(Basecomp_filtrada, aes(y = price/1000, fill = property_type )) +
geom_boxplot()+
scale_y_continuous(limits = c(0, 5000))+
labs(x="Tipo de vivienda", y="Precio (en miles de dolares)")+
facet_wrap(~ property_type, labeller = "label_both")
var_numericas_filtrada <- Basecomp_filtrada %>%
select(rooms,bathrooms,surface_total,surface_covered,price)
ggpairs(data = var_numericas_filtrada,lower = list(continuous = GGally::wrap("points", alpha = 0.4, size=0.2),
combo = GGally::wrap("dot", alpha = 0.5, size=0.25) )) +
labs(title = "Correlograma de variables", x = "", y = "") +
theme_bw() +
theme(legend.position = "bottom")
A diferencia del correlograma anterior, ahora se puede percibir mejor la relación positiva entre superfies (total y cubierta) y el precio, ambiente o baños. Con estos datos limpios y sospechando algún tipo de relación lineal entre estas variables procedemos a realizar modelos lineales.
#Lineal por ambientes Realizamos un modelo lineal en función de los ambientes
lmfitrooms <- lm(price~rooms,data = basecomp)
summary(lmfitrooms)
Call:
lm(formula = price ~ rooms, data = basecomp)
Residuals:
Min 1Q Median 3Q Max
-2711264 -97662 -32662 37125 5413191
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -41911.5 2520.1 -16.63 <2e-16 ***
rooms 104786.7 805.7 130.06 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 253900 on 51208 degrees of freedom
Multiple R-squared: 0.2483, Adjusted R-squared: 0.2483
F-statistic: 1.691e+04 on 1 and 51208 DF, p-value: < 2.2e-16
El coeficiente de ordenada al origen es de -41.911 USD mientras que la pendiente hallada es de casi 105 mil USD. Ambas mediciones tienen p-value altamente significativos. Es decir, que valor estimado por el modelo para una vivienda de 1 ambiente sería un precio de aproximadamente 63 mil USD. El r2, o variabilidad explicada por el modelo, es de casi 25%.
ggplot(Basecomp_filtrada, aes(rooms, price/1000)) +
geom_smooth(method = "lm") +
geom_point(size=0.05)+
labs(x="cantidad de ambientes", y="Precio (en miles de USD)",title = 'Modelo general de regresión lineal', subtitle = 'Precio de viviendas en función de sus ambientes') +
ggpubr::stat_regline_equation(mapping=aes(label=paste(..eq.label..,..adj.rr.label.., sep="~~~~")))+
theme_minimal()+
theme(legend.position = "bottom")
ggplot(Basecomp_filtrada, aes(rooms, price/1000, colour = property_type))+
geom_smooth(method = "lm",se=TRUE) +
geom_point(size=0.05)+
ggpubr::stat_regline_equation(mapping=aes(label=paste(..eq.label..,..adj.rr.label.., sep="~~~~")))+
labs(x="cantidad de ambientes", y="Precio (en miles de USD)",title = 'Modelo de regresión lineal por tipo de vivienda', subtitle = 'Precio de viviendas en función de sus ambientes') +
theme_minimal()+
theme(legend.position = "bottom")+
facet_wrap(~ property_type, labeller = "label_both")
##Modelo lineal por superficie
Realizamos un modelo lineal en función de la superficie total
lmfitsup <- lm(price~surface_total,data = Basecomp_filtrada)
summary(lmfitsup)
Call:
lm(formula = price ~ surface_total, data = Basecomp_filtrada)
Residuals:
Min 1Q Median 3Q Max
-2757166 -45643 -15293 19597 4483246
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 23945.55 1418.26 16.88 <2e-16 ***
surface_total 2488.01 11.73 212.09 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 210200 on 50937 degrees of freedom
Multiple R-squared: 0.469, Adjusted R-squared: 0.469
F-statistic: 4.498e+04 on 1 and 50937 DF, p-value: < 2.2e-16
El coeficiente de ordenada al origen es de 23.945 USD mientras que la pendiente hallada es de 1418 USD. Es decir, que valor estimado por el modelo crece a razón de 1400 por metro cuadrado. Ambas mediciones tienen p-value altamente significativos. El r2, o variabilidad explicada por el modelo, es de casi 47%.
ggplot(Basecomp_filtrada, aes(surface_total, price/1000)) +
geom_smooth(method = "lm") +
geom_point(size=0.05)+
labs(x="cantidad de ambientes", y="Precio (en miles de USD)",title = 'Modelo general de regresión lineal', subtitle = 'Precio de viviendas en función de su superficie') +
ggpubr::stat_regline_equation(mapping=aes(label=paste(..eq.label..,..adj.rr.label.., sep="~~~~")))+
theme_minimal()+
theme(legend.position = "bottom")
ggplot(Basecomp_filtrada, aes(surface_total, price/1000, colour = property_type)) +
geom_smooth(method = "lm") +
geom_point(size=0.08)+
labs(x="Sup. Total en M2", y="Precio (en miles de USD)",title = 'Modelo de regresión lineal por tipo de propiedad', subtitle = 'Precio de viviendas en función de su superficie') +
theme_minimal()+
ggpubr::stat_regline_equation(mapping=aes(label=paste(..eq.label..,..adj.rr.label.., sep="~~~~")))+
theme(legend.position = "bottom")+
facet_wrap(~ property_type, labeller = "label_both")
De acuerdo los valores de R cuadrado, podemos inferir que entre los dos modelos, aquel con la variable metros cuadrados de superficie total tiene una mayor capacidad de explicar la variaciones en la variable precio en comparación con el modelo que utiliza los ambientes. En esto puede que juegue un rol la mayor rigidez de la variable discreta “ambientes” en relación a la mayor flexibilidad que posee la variable metros cuadrados (continua). Por otra parte, cabe destacar que al realizar las regresiones lineales según tipo de propiedad, los parámetros de las rectas varian considerablemente. Asimismo, en los casos de departamentos y ph se obtuvieron mayores R2 que en los modelos generales, tanto medido en función de los ambientes como de los metros cuadrados de superficie total.