Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, Maria recibió una carta solicitando asesoria para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes:
| Caracteristicas | Vivienda1 | Vivienda2 |
|---|---|---|
| Tipo | casa | Apartamento |
| área construida | 200 | 300 |
| parqueaderos | 1 | 3 |
| baños | 2 | 3 |
| habitaciones | 4 | 5 |
| estrato | 4 o 5 | 5 o 6 |
| zona | Norte | Sur |
| crédito preaprobado | 350 millones | 850 millones |
Nota: Se presento dificultad para acceder a “dgonxalex80/paqueteMOD” despues de uan actualización realizada en R, por lo cual, se trabajo con la base de datos “viviendas.xlsx” para dar respuesta a las soluciones de la actividad.
library(readxl)
vivienda <- read_excel("viviendas.xlsx", col_types = c("numeric", "text", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"text", "text", "numeric", "numeric")
)
#vivienda$estrato <- as.numeric(levels(vivienda$estrato))[vivienda$estrato]
Vista general del base de datos de Vivienda contenidad en “dgonxalex80/paqueteMOD”.
knitr::kable(head(vivienda, 10), caption = "Base de Datos VIVIENDA")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 2 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 1 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 1 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
| 2326 | Zona Norte | 1 | 4 | 220 | 52 | 2 | 2 | 3 | Apartamento | acopi | -76.51974 | 3.42627 |
| 4386 | Zona Norte | 1 | 5 | 310 | 137 | 2 | 3 | 4 | Apartamento | acopi | -76.53105 | 3.38296 |
| 1209 | Zona Norte | 2 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 2 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
Nota: convertimos las variables piso, estrato en números y ajustamos el punto decimal en longitud: -76.xxxx y laitud: 3.xxxx.
knitr::kable(head(BASE1_Norte, 3), caption = "Base1 Norte")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | 2 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 2 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
| 4057 | Zona Norte | 2 | 6 | 750 | 445 | NA | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Norte$longitud,
lat = BASE1_Norte$latitud,
label = as.character(paste0(BASE1_Norte$tipo, " est:", BASE1_Norte$estrato, " Precio:",BASE1_Norte$preciom, "'000.000", " Pisos:", BASE1_Norte$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'red'
)knitr::kable(head(BASE1_Oriente, 3), caption = "Base1 Oriente")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Oriente$longitud,
lat = BASE1_Oriente$latitud,
label = as.character(paste0(BASE1_Oriente$tipo, " est:", BASE1_Oriente$estrato, " Precio:",BASE1_Oriente$preciom, "'000.000", " #Pisos:", BASE1_Oriente$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'orange'
)knitr::kable(head(BASE1_Sur, 3), caption = "Base1 Sur")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5992 | Zona Sur | 2 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.540 | 3.435 |
| 5157 | Zona Sur | 2 | 3 | 500 | 354 | 1 | 2 | 4 | Casa | alameda | -76.535 | 3.437 |
| 5501 | Zona Sur | 2 | 3 | 175 | 102 | NA | 2 | 4 | Casa | alameda | -76.537 | 3.435 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Sur$longitud,
lat = BASE1_Sur$latitud,
label = as.character(paste0(BASE1_Sur$tipo, " est:", BASE1_Sur$estrato, " Precio:",BASE1_Sur$preciom, "'000.000", " #Pisos:", BASE1_Sur$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'blue'
)knitr::kable(head(BASE1_Oeste, 3), caption = "Base1 Oeste")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6928 | Zona Oeste | 3 | 6 | 1850 | 302 | 4 | 4 | 3 | Casa | aguacatal | -76.54600 | 3.44400 |
| 7510 | Zona Oeste | 3 | 6 | 1950 | 400 | 4 | 5 | 3 | Casa | aguacatal | -76.55000 | 3.45600 |
| 7586 | Zona Oeste | 3 | 6 | 870 | 275 | 3 | 5 | 4 | Casa | aguacatal | -76.55074 | 3.45649 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Oeste$longitud,
lat = BASE1_Oeste$latitud,
label = as.character(paste0(BASE1_Oeste$tipo, " est:", BASE1_Oeste$estrato, " Precio:",BASE1_Oeste$preciom, "'000.000", " #Pisos:", BASE1_Oeste$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'green'
)knitr::kable(head(BASE1_Centro, 3), caption = "Base1 Centro")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5298 | Zona Centro | 1 | 3 | 650 | 240 | 2 | 4 | 4 | Casa | alameda | -76.53564 | 3.43521 |
| 5107 | Zona Centro | 2 | 4 | 400 | 460 | NA | 5 | 7 | Casa | alameda | -76.53471 | 3.43627 |
| 5117 | Zona Centro | 2 | 3 | 380 | 290 | NA | 4 | 8 | Casa | alameda | -76.53481 | 3.43712 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Centro$longitud,
lat = BASE1_Centro$latitud,
label = as.character(paste0(BASE1_Centro$tipo, " est:", BASE1_Centro$estrato, " Precio:",BASE1_Centro$preciom, "'000.000", " #Pisos:", BASE1_Centro$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'brown'
)Pueden existir varias razones por las cuales podrían aparecer registros de una zona en otra zona del mapa cuando se aplican filtros de zona en un mapa de datos; algunas posibles explicaciones, son:
1. Error humano: Es muy probable que se haya cometido un error humano en la toma de información en campo, o al momento de tabular o al definir las zonas o al asignar los registros a las zonas correspondientes. En este caso, es necesario revisar cuidadosamente la configuración de las zonas y la asignación de los registros para asegurarse de que todo esté correctamente definido.
2. Problemas con los datos: Es posible que estos datos estén incompletos o desactualizados. Esto fácilmente podría provocar que los registros se asignen a zonas equivocadas o que no se muestren correctamente en el mapa.
Segmentamos la Base de datos que solo contendra información de las Casas para hacer comparación o busqueda de mejores oferta que Vivienda 1 presentada por la compañia C&A.
pos <- which(vivienda$tipo=="Casa")
vivienda_casas <- vivienda[pos,]-Vista general de la estructura de datos de la Base de Datos con solo Casas.
glimpse(vivienda_casas)Rows: 3,219
Columns: 13
$ id <dbl> 1147, 1169, 1350, 5992, 1209, 1592, 4057, 4460, 6081, 782…
$ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
$ piso <dbl> NA, NA, NA, 2, 2, 2, 2, 2, 2, 2, 2, 3, NA, NA, NA, NA, NA…
$ estrato <dbl> 3, 3, 3, 4, 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, …
$ preciom <dbl> 250, 320, 350, 400, 320, 780, 750, 625, 750, 600, 420, 49…
$ areaconst <dbl> 70, 120, 220, 280, 150, 380, 445, 355, 237, 160, 200, 118…
$ parqueaderos <dbl> 1, 1, 2, 3, 2, 2, NA, 3, 2, 1, 4, 2, NA, NA, NA, NA, NA, …
$ banios <dbl> 3, 2, 2, 5, 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, …
$ habitaciones <dbl> 6, 3, 4, 3, 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, …
$ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
$ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
$ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51341, -7…
$ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.47968, 3.48721, 3.3…
-Análisis general y descriptivos de las variables en Base de Datos.
result <- summary(vivienda_casas[,3:9])
knitr::kable(result, caption = "Análisis generar las variable BASE1")| piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | |
|---|---|---|---|---|---|---|---|
| Min. : 1.000 | Min. :3.000 | Min. : 77 | Min. : 30.0 | Min. : 1.00 | Min. : 0.000 | Min. : 0.00 | |
| 1st Qu.: 2.000 | 1st Qu.:3.000 | 1st Qu.: 300 | 1st Qu.: 154.0 | 1st Qu.: 1.00 | 1st Qu.: 3.000 | 1st Qu.: 3.00 | |
| Median : 2.000 | Median :5.000 | Median : 430 | Median : 240.0 | Median : 2.00 | Median : 4.000 | Median : 4.00 | |
| Mean : 2.138 | Mean :4.485 | Mean : 540 | Mean : 273.4 | Mean : 2.29 | Mean : 3.894 | Mean : 4.61 | |
| 3rd Qu.: 3.000 | 3rd Qu.:5.000 | 3rd Qu.: 670 | 3rd Qu.: 350.0 | 3rd Qu.: 3.00 | 3rd Qu.: 5.000 | 3rd Qu.: 5.00 | |
| Max. :10.000 | Max. :6.000 | Max. :1999 | Max. :1745.0 | Max. :10.00 | Max. :10.000 | Max. :10.00 | |
| NA’s :1254 | NA | NA | NA | NA’s :733 | NA | NA |
-Histograma de la variable Piso.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~piso, name = "Piso")
plotA partir de esta información, podemos concluir que la mayoría de las casas tienen entre 1 y 3 pisos, ya que estos son los valores más comunes (la mediana y los cuartiles). Sin embargo, hay una un datos de una casa con una gran cantidad de pisos, puesto ya que el valor máximo es 10 pisos.
-Histograma de la variable Estrato.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~estrato, name = "estrato")
plot-Histograma de la variable Preciom.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~preciom, name = "Precio de casa")
plotLos datos para la variable precio de las viviendas fluctúa ampliamente, identificando que algunos precios son muy altos, y debido a estos aumentan el valor promedio. La mediana de los precios de las viviendas es de 430 millones, por lo que se infiere que la mayoría de las viviendas tienen un precio inferior a este valor. Los cuartiles muestran que hay una gran variación en los precios de las viviendas, mostrando una diferencia con un 25% de las viviendas con precios muy bajos y otro 25% con precios muy altos.
-Histograma de la variable Area construida.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~areaconst, name = "estrato")
plotLa variable área construida en m2 presenta una gran dispersión de los datos, puesto que se observa un rango que va desde los 30 m2 hasta 47,463 m2. Otro dato relevante es que la media es de 402.1 m2 y la mediana se sitúa en 240 m2, lo anterior indica que la mitad de la cantidad de casas de la base de datos tienen un área construida menor a este valor. En los datos el tercer cuartil, indica que la mayoría de las propiedades tienen un área construida inferior a 350 m2. Estos datos son relevantes para la evaluación de precios y tiene una correlación directa con el precio de la vivienda, indispensable para la toma de decisiones en el mercado inmobiliario.
-Histograma de la variable Parqueaderos.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~parqueaderos, name = "estrato")
plot-Histograma de la variable Baños.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~banios, name = "Baños")
plot-Histograma de la variable Habitaciones.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~habitaciones, name = "Habitaciones")
plotEsta variable corresponde a la cantidad de habitaciones en una casa, según el histograma se infiere que presenta una distribución asimétrica positiva con una media de 4.61 habitaciones. El valor mínimo es 0 habitaciones, lo que puede significar que es una característica de casas pequeñas o monoambientes, es decir en las cuales se comparten cocina, sala y dormitorio en un solo ambiente. El valor máximo es de 10 habitaciones en una casa, lo que sugiere casas muy grandes o mansiones. En general, la cantidad de habitaciones en una casa varía significativamente y puede ser un indicador importante que puede tener correlación con las variables de área construida y precio de la vivienda.
-Histograma de la variable Zona.
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~zona, name = "Zona")
plot-Correlación usando la libreria “GGally”.
La tabla de correlaciones proporcionada por la herramienta GGally, muestra información de la relación entre diferentes variables. En este caso para la base de datos de vivienda, se evidencia la correlación para 6 variables: precio de vivienda, estrato, parqueadero, baños y habitaciones.
La correlación entre el precio de la vivienda y el estrato es de 0.666. Esta correlación es positiva y fuerte, que mediante el indicador se evidencia que existe una relación directa entre el precio de la vivienda y el estrato. Es decir, a medida que aumenta el estrato, también lo hace el precio de la vivienda.
La correlación entre el precio de la vivienda y el parqueadero es de 0.639. Esta correlación también es positiva y fuerte de acuerdo al indicador corr, lo que indica que existe una relación directa entre el precio de la vivienda y la cantidad de parqueaderos por vivienda. Es decir, a medida que aumenta el precio de la vivienda, hace también que exista mayor probabilidad de que esta tenga un parqueadero o más.
La correlación entre el precio de la vivienda y los baños es de 0.558. Esta correlación es positiva y fuerte al igual que las dos anteriormente analizadas, lo que indica que existe una relación directa entre el precio de la vivienda y el número de baños. Es decir, a medida que aumenta el número de baños, también lo hace el precio de la vivienda.
La correlación entre los baños y las habitaciones es de 0.476. Esta correlación es positiva y fuerte, lo que muestra que existe un indicador de relación directa entre el número de baños y el número de habitaciones. Es decir, a medida que aumenta el número de habitaciones, también lo hace el número de baños.
La correlación entre los baños y el estrato es de 0.449. Esta correlación es positiva y fuerte, lo que muestra que existe una relación directa entre el número de baños y el estrato. Es decir, a medida que aumenta el estrato, también lo hace el número de baños.
La correlación entre los parqueaderos y el estrato es de 0.463. Esta correlación indica que existe una relación directa entre la disponibilidad de parqueaderos y el estrato. Es decir, a medida que aumenta el estrato, también lo hace la probabilidad de que una vivienda tenga un parqueadero.
Finalmente, la correlación entre los baños y los parqueaderos es de 0.447. Esta correlación es positiva e indica que existe una relación directa entre el número de baños y la disponibilidad de parqueaderos. Es decir, a medida que aumenta el número de baños, también lo hace la probabilidad de que una vivienda tenga un parqueadero.
En resumen, la tabla de correlaciones muestra que existe una relación directa y moderadamente fuerte entre el precio de la vivienda, el estrato, el número de baños, la disponibilidad de parqueaderos y el número de habitaciones. Esta información puede ser útil para entender las tendencias en el mercado inmobiliario y para tomar decisiones de inversión en este sector.
modelo_casas = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = vivienda_casas)
summary(modelo_casas)
Call:
lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios +
habitaciones, data = vivienda_casas)
Residuals:
Min 1Q Median 3Q Max
-1190.80 -114.52 -25.94 74.59 986.16
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -413.87536 25.58852 -16.174 < 2e-16 ***
areaconst 0.74227 0.02941 25.235 < 2e-16 ***
estrato 116.07109 5.26618 22.041 < 2e-16 ***
parqueaderos 64.29943 3.47719 18.492 < 2e-16 ***
banios 39.03498 4.05083 9.636 < 2e-16 ***
habitaciones -14.74995 3.18137 -4.636 3.73e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 205.2 on 2480 degrees of freedom
(733 observations deleted due to missingness)
Multiple R-squared: 0.6834, Adjusted R-squared: 0.6828
F-statistic: 1071 on 5 and 2480 DF, p-value: < 2.2e-16
En la estimación de los coeficiente, en el modelos de casas, la determinación de R2 e de 0.6834, lo que intepreta como el 68.34% de las variaciones del precio son explicadas por las variables del modelo llamado modelo_casas. Con respecto a los estimadores de los parametros se destaca que todas las variable son significativas para el modelo. El modelo tiene la siguiente construcción: Precio = -413.87536+0.74227(areaconst)+116.07109(estrato)+64.29943(parqueaderos)+39.03498(banios)-14.74995(habitaciones)
Para verificar la multicolianialidad de las variables:
knitr::kable(vif(modelo_casas), caption = "Datos para predicción de Modelo_Casas.")| x | |
|---|---|
| areaconst | 1.541765 |
| estrato | 1.694080 |
| parqueaderos | 1.535105 |
| banios | 2.059733 |
| habitaciones | 1.594265 |
los factores calculados por el VIF estan por debajo de 5 y muy sutilmente por encima de 1, de tal forma, podemos decir que existe una multicoliniadad muy leve en las variables.
par(mfrow = c(2, 2))
plot(modelo_casas)Obtención de los errores:
e = modelo_casas$residuals-Supuesto de normalidad de los errores.
H0: los errores tienen distribución normal.
shapiro.test(e)
Shapiro-Wilk normality test
data: e
W = 0.89699, p-value < 2.2e-16
Los residuales NO cumple los criterios de distribution normal debido a que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0.
-Supuesto de independencia de errores.
H0: Los errores sin independientes (no estan relacionados).
Loading required package: zoo
Attaching package: 'zoo'
The following objects are masked from 'package:base':
as.Date, as.Date.numeric
dwtest(modelo_casas)
Durbin-Watson test
data: modelo_casas
DW = 1.5759, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Los errores son dependientes debido a que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0 y acepta la hipostesis alternativa.De igual forma, este supuesto no aplica para este conjunto de datos debido aque no existe una relación temporal(tiempo) en la recolección de los mismo.
-Supuesto de varianza constante.
H0: la varianza de los erroes es constante.
gqtest(modelo_casas)
Goldfeld-Quandt test
data: modelo_casas
GQ = 1.268, df1 = 1237, df2 = 1237, p-value = 1.525e-05
alternative hypothesis: variance increases from segment 1 to 2
Los errores NO cumple con el supuesto de varianza constante debido que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0.
Una propuesta para mejorar los supuestos sobre los errores seria realizar transformación de linealidad a esas variables que no tienen un comportamiento lineal.
Vivienda_1 = data.frame( areaconst=c(200,200),
estrato=c(4,5),
parqueaderos=c(1,1),
banios=c(2,2),
habitaciones=c(4,4)
)
knitr::kable(Vivienda_1, caption = "Datos para predicción de Modelo_Casas.")| areaconst | estrato | parqueaderos | banios | habitaciones |
|---|---|---|---|---|
| 200 | 4 | 1 | 2 | 4 |
| 200 | 5 | 1 | 2 | 4 |
Predicción de las viviendas:
1 2
282.2318 398.3029
Según la predicción del modelo, para:
| prediccion | areaconst | estrato | parqueaderos | banios | habitaciones | predicción_precio | escala |
|---|---|---|---|---|---|---|---|
| 1 | 200 | 4 | 1 | 2 | 4 | 249.2789 | Millones |
| 2 | 200 | 5 | 1 | 2 | 4 | 381.7347 | Millones |
pos <- which(vivienda_casas$estrato>=4 & vivienda_casas$areaconst>= 200 & vivienda_casas$parqueaderos>=1 & vivienda_casas$banios>=2 & vivienda_casas$habitaciones>=4 & vivienda_casas$estrato>=4 & vivienda_casas$estrato<=5 & vivienda_casas$preciom<=350 )
Ofertas_casas <- vivienda_casas[pos,]Ofertas_casas_5 = Ofertas_casas[order(Ofertas_casas$areaconst, decreasing = TRUE), ]
ofertac5 <- head(Ofertas_casas_5, 5)
knitr::kable(head(Ofertas_casas_5, 5), caption = "5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7436 | Zona Sur | 1 | 4 | 330 | 400 | 2 | 4 | 4 | Casa | el lido | -76.54973 | 3.42484 |
| 7499 | Zona Oeste | 3 | 4 | 320 | 380 | 2 | 4 | 4 | Casa | santa rita | -76.55000 | 3.45400 |
| 6922 | Zona Sur | NA | 4 | 345 | 360 | 3 | 3 | 5 | Casa | nueva tequendama | -76.54600 | 3.41100 |
| 3101 | Zona Norte | 2 | 5 | 340 | 355 | 2 | 5 | 8 | Casa | san vicente | -76.52377 | 3.46384 |
| 7903 | Zona Oeste | 2 | 4 | 325 | 355 | 2 | 3 | 4 | Casa | santa rita | -76.55300 | 3.45300 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = ofertac5$longitud,
lat = ofertac5$latitud,
label = as.character(paste0(ofertac5$tipo, " est:", ofertac5$estrato, " Precio:",ofertac5$preciom, "'000.000", " Pisos:", ofertac5$piso, " Parqueaderos: ", ofertac5$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = 'blue'
)knitr::kable(head(BASE2_Norte, 3), caption = "Base2 Sur")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1212 | Zona Norte | 1 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 1 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
| 2326 | Zona Norte | 1 | 4 | 220 | 52 | 2 | 2 | 3 | Apartamento | acopi | -76.51974 | 3.42627 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE2_Norte$longitud,
lat = BASE2_Norte$latitud,
label = as.character(paste0(BASE2_Norte$tipo, " est:", BASE2_Norte$estrato, " Precio:",BASE2_Norte$preciom, "'000.000", " Pisos:", BASE2_Norte$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'red'
)knitr::kable(head(BASE2_Oriente, 3), caption = "Base2 Oriente")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 82 | Zona Oriente | 1 | 3 | 115 | 111 | 1 | 2 | 4 | Apartamento | alfonso lópez | -76.48141 | 3.45379 |
| 78 | Zona Oriente | 2 | 3 | 58 | 50 | 1 | 1 | 2 | Apartamento | alfonso lópez | -76.47978 | 3.45131 |
| 999 | Zona Oriente | 2 | 3 | 135 | 120 | NA | 2 | 4 | Apartamento | atanasio girardot | -76.50737 | 3.44454 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE2_Oriente$longitud,
lat = BASE2_Oriente$latitud,
label = as.character(paste0(BASE2_Oriente$tipo, " est:", BASE2_Oriente$estrato, " Precio:",BASE2_Oriente$preciom, "'000.000", " Pisos:", BASE2_Oriente$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'orange'
)knitr::kable(head(BASE2_Sur, 3), caption = "Base2 Sur")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5098 | Zona Sur | 5 | 4 | 290 | 96 | 1 | 2 | 3 | Apartamento | acopi | -76.53464 | 3.44987 |
| 698 | Zona Sur | 2 | 3 | 78 | 40 | 1 | 1 | 2 | Apartamento | aguablanca | -76.50100 | 3.40000 |
| 8199 | Zona Sur | NA | 6 | 875 | 194 | 2 | 5 | 3 | Apartamento | aguacatal | -76.55700 | 3.45900 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE2_Sur$longitud,
lat = BASE2_Sur$latitud,
label = as.character(paste0(BASE2_Sur$tipo, " est:", BASE2_Sur$estrato, " Precio:",BASE2_Sur$preciom, "'000.000", " Pisos:", BASE2_Sur$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'blue'
)knitr::kable(head(BASE2_Oeste, 3), caption = "Base2 Oeste")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6999 | Zona Oeste | 1 | 6 | 870 | 200 | 2 | 5 | 3 | Apartamento | aguacatal | -76.54666 | 3.44624 |
| 8037 | Zona Oeste | 1 | 4 | 130 | 50 | NA | 1 | 3 | Apartamento | aguacatal | -76.55409 | 3.44338 |
| 8055 | Zona Oeste | 1 | 4 | 165 | 61 | 1 | 2 | 3 | Apartamento | aguacatal | -76.55447 | 3.45783 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE1_Oeste$longitud,
lat = BASE1_Oeste$latitud,
label = as.character(paste0(BASE1_Oeste$tipo, " est:", BASE1_Oeste$estrato, " Precio:",BASE1_Oeste$preciom, "'000.000", " Pisos:", BASE1_Oeste$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'green'
)knitr::kable(head(BASE2_Centro, 3), caption = "Base2 Centro")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4654 | Zona Centro | 3 | 3 | 100 | 70.00 | NA | 2 | 3 | Apartamento | alameda | -76.53200 | 3.45200 |
| 4408 | Zona Centro | 5 | 3 | 120 | 84.00 | 1 | 2 | 3 | Apartamento | alameda | -76.53123 | 3.44011 |
| 4395 | Zona Centro | 4 | 3 | 125 | 66.76 | NA | 2 | 3 | Apartamento | bretaña | -76.53111 | 3.44034 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = BASE2_Centro$longitud,
lat = BASE2_Centro$latitud,
label = as.character(paste0(BASE2_Centro$tipo, " est:", BASE2_Centro$estrato, " Precio:",BASE2_Centro$preciom, "'000.000", " Pisos:", BASE2_Centro$piso)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'brown'
)Pueden existir varias razones por las cuales podrían aparecer registros de una zona en otra zona del mapa cuando se aplican filtros de zona en un mapa de datos; algunas posibles explicaciones, son:
1. Error humano: Es muy probable que se haya cometido un error humano en la toma de información en campo, o al momento de tabular o al definir las zonas o al asignar los registros a las zonas correspondientes. En este caso, es necesario revisar cuidadosamente la configuración de las zonas y la asignación de los registros para asegurarse de que todo esté correctamente definido.
2. Problemas con los datos: Es posible que estos datos estén incompletos o desactualizados. Esto fácilmente podría provocar que los registros se asignen a zonas equivocadas o que no se muestren correctamente en el mapa.
Segmentamos la Base de datos que solo contendra información de los Apartamentos para hacer comparación o busqueda de mejores oferta que Vivienda 2 presentada por la compañia C&A.
vivienda <- read_excel("viviendas.xlsx", col_types = c("numeric", "text", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"text", "text", "numeric", "numeric")
)
pos <- which(vivienda$tipo=="Apartamento")
vivienda_apartamentos <- vivienda[pos,]-Vista general de la estructura de datos de la Base de Datos con solo Apartamento.
glimpse(vivienda_apartamentos)Rows: 5,100
Columns: 13
$ id <dbl> 1212, 1724, 2326, 4386, 7497, 5424, 6271, 6857, 3817, 509…
$ zona <chr> "Zona Norte", "Zona Norte", "Zona Norte", "Zona Norte", "…
$ piso <dbl> 1, 1, 1, 1, 2, 3, 3, 3, 4, 5, 5, 5, 5, 5, 6, NA, NA, NA, …
$ estrato <dbl> 5, 5, 4, 5, 6, 4, 5, 3, 3, 6, 6, 4, 5, 6, 5, 5, 3, 5, 5, …
$ preciom <dbl> 260, 240, 220, 310, 520, 320, 385, 100, 175, 820, 450, 29…
$ areaconst <dbl> 90, 87, 52, 137, 98, 108, 103, 49, 80, 377, 103, 96, 124,…
$ parqueaderos <dbl> 1, 1, 2, 2, 2, 2, 2, NA, 1, 1, 2, 1, 3, 2, 1, NA, NA, NA,…
$ banios <dbl> 2, 3, 2, 3, 2, 3, 2, 1, 2, 4, 3, 2, 3, 3, 1, 3, 1, 4, 2, …
$ habitaciones <dbl> 3, 3, 3, 4, 2, 3, 3, 2, 3, 4, 4, 3, 3, 4, 2, 3, 5, 4, 2, …
$ tipo <chr> "Apartamento", "Apartamento", "Apartamento", "Apartamento…
$ barrio <chr> "acopi", "acopi", "acopi", "acopi", "acopi", "acopi", "ac…
$ longitud <dbl> -76.51350, -76.51700, -76.51974, -76.53105, -76.54999, -7…
$ latitud <dbl> 3.45891, 3.36971, 3.42627, 3.38296, 3.43505, 3.40770, 3.4…
-Análisis general y descriptivos de las variables en Base de Datos.
vivienda_apartamento <- vivienda_apartamentos[,3:9]
knitr::kable(summary(vivienda_apartamento), caption = "Análisis generar las variable BASE2")| piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | |
|---|---|---|---|---|---|---|---|
| Min. : 1.000 | Min. :3.000 | Min. : 58.0 | Min. : 35.0 | Min. : 1.000 | Min. :0.000 | Min. :0.000 | |
| 1st Qu.: 2.000 | 1st Qu.:4.000 | 1st Qu.: 175.0 | 1st Qu.: 68.0 | 1st Qu.: 1.000 | 1st Qu.:2.000 | 1st Qu.:3.000 | |
| Median : 4.000 | Median :5.000 | Median : 279.0 | Median : 90.0 | Median : 1.000 | Median :2.000 | Median :3.000 | |
| Mean : 4.634 | Mean :4.727 | Mean : 366.9 | Mean :112.8 | Mean : 1.568 | Mean :2.617 | Mean :2.971 | |
| 3rd Qu.: 6.000 | 3rd Qu.:6.000 | 3rd Qu.: 430.0 | 3rd Qu.:130.0 | 3rd Qu.: 2.000 | 3rd Qu.:3.000 | 3rd Qu.:3.000 | |
| Max. :12.000 | Max. :6.000 | Max. :1950.0 | Max. :932.0 | Max. :10.000 | Max. :8.000 | Max. :9.000 | |
| NA’s :1381 | NA | NA | NA | NA’s :869 | NA | NA |
-Histograma de la variable Piso.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~piso, name = "Piso")
plotA partir de esta información, podemos concluir que la mayoría de las ofertas de apartamentos estan entre el 1 y el 5 pisos, ya que estos son los valores más comunes (la mediana y los cuartiles).
-Histograma de la variable Estrato.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~estrato, name = "Estrato")
plot-Histograma de la variable Preciom.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~preciom, name = "Precio de casa")
plotLos datos para la variable precio de las viviendas fluctúa ampliamente, identificando que algunos precios son muy altos, y debido a estos aumentan el valor promedio. La mediana de los precios de las viviendas es de 366.9 millones, por lo que se infiere que la mayoría de las viviendas tienen un precio inferior a este valor.
-Histograma de la variable Area construida.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~areaconst, name = "Área construida")
plot-Histograma de la variable Parqueaderos.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~parqueaderos, name = "Parqueaderos")
plotLas ofertas en las base de datos comprende una cantidad de parqueaderos entre la cantidad de 1 y 2.
-Histograma de la variable Baños.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~banios, name = "Baños")
plot-Histograma de la variable Habitaciones.
plot <- plot_ly(vivienda_apartamento, type = "histogram")
plot <- plot %>% add_trace(x = ~habitaciones, name = "Habitaciones")
plot-Correlación usando la libreria “GGally”.
La tabla de correlaciones proporcionada por la herramienta GGally, muestra información de la relación entre diferentes variables. En este caso para la base de datos de vivienda, se evidencia la correlación para 6 variables: precio de vivienda, estrato, parqueadero, baños y habitaciones.
La correlación entre el precio de la vivienda y el estrato es de 0.667. Esta correlación es positiva y fuerte, que mediante el indicador se evidencia que existe una relación directa entre el precio de la vivienda y el estrato. Es decir, a medida que aumenta el estrato, también lo hace el precio de la vivienda.
La correlación entre el precio de la vivienda y el parqueadero es de 0.739. Esta correlación también es positiva y fuerte de acuerdo al indicador corr, lo que indica que existe una relación directa entre el precio de la vivienda y la cantidad de parqueaderos por vivienda. Es decir, a medida que aumenta el precio de la vivienda, hace también que exista mayor probabilidad de que esta tenga un parqueadero o más.
La correlación entre el precio de la vivienda y los baños es de 0.740. Esta correlación es positiva y fuerte al igual que las dos anteriormente analizadas, lo que indica que existe una relación directa entre el precio de la vivienda y el número de baños. Es decir, a medida que aumenta el número de baños, también lo hace el precio de la vivienda.
En resumen, la tabla de correlaciones muestra que existe una relación directa y moderadamente fuerte entre el precio de la vivienda, el estrato, el número de baños, la disponibilidad de parqueaderos y el número de habitaciones. Esta información puede ser útil para entender las tendencias en el mercado inmobiliario y para tomar decisiones de inversión en este sector.
modelo_apartamento = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = vivienda_apartamento)
summary(modelo_apartamento)
Call:
lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios +
habitaciones, data = vivienda_apartamento)
Residuals:
Min 1Q Median 3Q Max
-63847 142 237 447 63406
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -722.3912 92.7632 -7.787 8.54e-15 ***
areaconst 5.7988 0.8068 7.188 7.75e-13 ***
estrato -144.8864 21.3764 -6.778 1.39e-11 ***
parqueaderos 393.8946 55.0190 7.159 9.52e-13 ***
banios -240.7140 25.9108 -9.290 < 2e-16 ***
habitaciones 273.1798 11.3656 24.036 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2274 on 4225 degrees of freedom
(869 observations deleted due to missingness)
Multiple R-squared: 0.4864, Adjusted R-squared: 0.4858
F-statistic: 800.2 on 5 and 4225 DF, p-value: < 2.2e-16
En la estimación de los coeficiente, en el modelos de casas, la determinación de R2 e de 0.6029, lo que intepreta como el 60.29% de las variaciones del precio son explicadas por las variables del modelo llamado modelo_casas. Con respecto a los estimadores de los parametros se destaca que la variable habitaciones no es significativas para el modelo. El modelo tiene la siguiente construcción: Precio = -232.0195+4.6219(areaconst)-118.2008(estrato)+8.954e+01(parqueaderos)+419.0192(banios)+259.9397(habitaciones)
Para verificar la multicolianialidad de las variables:
vif(modelo_apartamento) areaconst estrato parqueaderos banios habitaciones
10.14804 39.45984 59.61042 55.25645 15.09084
<p style=“text-align: justify;”Los factores calculados por el VIF
estan por debajo del factos 5 y 10 para algunas variables, por lo cual,
podemos concluir que hay una alta dependencia de estas variables con
repecto al precio de venta de la vivienda 2, de tal forma,
podemos decir que existe problemas de multicoliniadad significativos en
el modelo para apartamentos.
par(mfrow = c(2, 2))
plot(modelo_apartamento)## Warning: not plotting observations with leverage one:
## 1, 2, 3, 4, 5, 6
Obtención de los errores:
e = modelo_apartamento$residuals-Supuesto de normalidad de los errores.
H0: los errores tienen distribución normal.
shapiro.test(e)
Shapiro-Wilk normality test
data: e
W = 0.067892, p-value < 2.2e-16
Los residuales NO cumple los criterios de distribution normal debido a que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0.
-Supuesto de independencia de errores.
H0: Los errores sin independientes (no estan relacionados).
dwtest(modelo_apartamento)
Durbin-Watson test
data: modelo_apartamento
DW = 1.4458, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Los errores son dependientes debido a que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0 y acepta la hipostesis alternativa.De igual forma, este supuesto no aplica para este conjunto de datos debido aque no existe una relación temporal(tiempo) en la recolección de los mismo.
-Supuesto de varianza constante.
H0: la varianza de los erroes es constante.
gqtest(modelo_apartamento)
Goldfeld-Quandt test
data: modelo_apartamento
GQ = 1.5813, df1 = 2110, df2 = 2109, p-value < 2.2e-16
alternative hypothesis: variance increases from segment 1 to 2
Los errores NO cumple con el supuesto de varianza constante debido que p-value < 5% de significancia. Por lo tanto, se rechaza la hipotesis H0.
Una propuesta para mejorar los supuestos sobre los errores seria realizar transformación de linealidad a esas variables que no tienen un comportamiento lineal.
Vivienda_2 = data.frame( areaconst=c(300,300),
estrato=c(5,6),
parqueaderos=c(3,3),
banios=c(3,3),
habitaciones=c(5,5)
)
knitr::kable(Vivienda_2, caption = "Datos para predicción de Modelo_Apartamento.")| areaconst | estrato | parqueaderos | banios | habitaciones |
|---|---|---|---|---|
| 300 | 5 | 3 | 3 | 5 |
| 300 | 6 | 3 | 3 | 5 |
Predicción de las viviendas:
1 2
2118.265 1973.378
Según la predicción del modelo, para:
| prediccion | areaconst | estrato | parqueaderos | banios | habitaciones | predicción_precio | escala |
|---|---|---|---|---|---|---|---|
| 1 | 200 | 5 | 3 | 3 | 5 | 1229.139 | Millones |
| 2 | 200 | 6 | 3 | 3 | 5 | 1110.938 | Millones |
pos <- which(vivienda_apartamentos$estrato>=5 & vivienda_apartamentos$estrato<=6 & vivienda_apartamentos$areaconst>= 300 & vivienda_apartamentos$parqueaderos>=3 & vivienda_apartamentos$banios>=3 & vivienda_apartamentos$habitaciones>=5 & vivienda_apartamentos$preciom<=850 )
Ofertas_apartamentos <- vivienda_apartamentos[pos,]Ofertas_apartamento_5 = Ofertas_apartamentos[order(Ofertas_apartamentos$areaconst, decreasing = TRUE), ]
oferta5 <- head(Ofertas_apartamento_5, 5)
knitr::kable(head(Ofertas_apartamento_5, 5), caption = "5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7182 | Zona Sur | NA | 5 | 730 | 573 | 3 | 8 | 5 | Apartamento | guadalupe | -76.54800 | 3.40800 |
| 3572 | Zona Norte | 5 | 5 | 450 | 307 | 4 | 4 | 5 | Apartamento | versalles | -76.52708 | 3.46439 |
| 7512 | Zona Sur | NA | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | seminario | -76.55000 | 3.40900 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 12) %>%
addCircleMarkers(lng = oferta5$longitud,
lat = oferta5$latitud,
label = as.character(paste0(oferta5$tipo, " est:", oferta5$estrato, " Precio:",oferta5$preciom, "'000.000", " Pisos:", oferta5$piso, " Parqueaderos: ", oferta5$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = 'blue'
)