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, María recibió una carta solicitando asesoría 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 condiciones:
| Características | Vivienda 1 | Vivienda 2 |
|---|---|---|
| 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 |
Obtenemos la información basica de la base de datos
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
id: (Variable tipo numérica) Número de identificación único para cada vivienda.
zona: (Variable tipo categórica) Contiene información sobre la zona de ubicación de la vivienda, puede ser Zona Sur,Zona Centro, Zona Norte, Zona Occidente o Zona Oriente
piso: (Variable tipo categórica) Contiene información sobre el piso en el que se encuentra ubicada la vivienda.
estrato: (Variable tipo numérica) Indica el estrato socioeconómico al que pertenece la vivienda.
preciom: (Variable tipo numérica) Precio de la vivienda en millones de pesos.
areaconst: (Variable tipo numérica) Área construida de la vivienda.
parqueaderos: (Variable tipo numérica) Número de parqueaderos disponibles en la vivienda.
banios: (Variable tipo numérica) Número de baños en la vivienda.
habitaciones: (Variable tipo numérica) Número de habitaciones en la vivienda.
tipo: (Variable tipo numérica) El tipo de vivienda puede ser Casa o Apartamento.
barrio: (Variable tipo numérica) Barrio donde se encuentra la vivienda.
longitud: (Variable tipo numérica) Coordenada geográfica de longitud donde se ubica la vivienda.
latitud: (Variable tipo numérica) La coordenada geográfica de latitud donde se ubica la vivienda.
Realizamos una validación de los primeros cinco datos de la base
knitr::kable (head(vivienda, 5), 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 | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
Verificamos las variables con un resumen estadistico, esto con el fin de identificar comportamientos atipicos de las variables
knitr::kable (summary(vivienda), caption = "Resumen estadístico")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 1 | Length:8322 | Length:8322 | Min. :3.000 | Min. : 58.0 | Min. : 30.0 | Min. : 1.000 | Min. : 0.000 | Min. : 0.000 | Length:8322 | Length:8322 | Min. :-76.59 | Min. :3.333 | |
| 1st Qu.:2080 | Class :character | Class :character | 1st Qu.:4.000 | 1st Qu.: 220.0 | 1st Qu.: 80.0 | 1st Qu.: 1.000 | 1st Qu.: 2.000 | 1st Qu.: 3.000 | Class :character | Class :character | 1st Qu.:-76.54 | 1st Qu.:3.381 | |
| Median :4160 | Mode :character | Mode :character | Median :5.000 | Median : 330.0 | Median : 123.0 | Median : 2.000 | Median : 3.000 | Median : 3.000 | Mode :character | Mode :character | Median :-76.53 | Median :3.416 | |
| Mean :4160 | NA | NA | Mean :4.634 | Mean : 433.9 | Mean : 174.9 | Mean : 1.835 | Mean : 3.111 | Mean : 3.605 | NA | NA | Mean :-76.53 | Mean :3.418 | |
| 3rd Qu.:6240 | NA | NA | 3rd Qu.:5.000 | 3rd Qu.: 540.0 | 3rd Qu.: 229.0 | 3rd Qu.: 2.000 | 3rd Qu.: 4.000 | 3rd Qu.: 4.000 | NA | NA | 3rd Qu.:-76.52 | 3rd Qu.:3.452 | |
| Max. :8319 | NA | NA | Max. :6.000 | Max. :1999.0 | Max. :1745.0 | Max. :10.000 | Max. :10.000 | Max. :10.000 | NA | NA | Max. :-76.46 | Max. :3.498 | |
| NA’s :3 | NA | NA | NA’s :3 | NA’s :2 | NA’s :3 | NA’s :1605 | NA’s :3 | NA’s :3 | NA | NA | NA’s :3 | NA’s :3 |
No se identifica nada atipico en la base de datos
Podemos validar la cantidad de casas y apartamentos que hay en
cada una de las zonas de la ciudad de Cali
conteo = table(vivienda$zona, vivienda$tipo)
kable(conteo, caption = "Tabla resumen")
| Apartamento | Casa | |
|---|---|---|
| Zona Centro | 24 | 100 |
| Zona Norte | 1198 | 722 |
| Zona Oeste | 1029 | 169 |
| Zona Oriente | 62 | 289 |
| Zona Sur | 2787 | 1939 |
Obtenemos los datos nulos que tienen cada una de las diferentes variables
knitr::kable (vivienda %>%
summarise_all(~sum(is.na(.))), caption = "Valores Nulos")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 3 | 2638 | 3 | 2 | 3 | 1605 | 3 | 3 | 3 | 3 | 3 | 3 |
Dado que la compañia solicita que las viviendas tengan un minimo de parqueaderos, baños y habitaciones por tanto podriamos eliminar los registros en donde el número de habitaciones y de parqueaderos es nulo.
Casa en el Norte de la ciudad, con 200 metros cuadrados
construidos, con 1 parqueadero, 2 baños, 4 habitaciones, estrato 4 o 5,
ubicada en el norte y con un credito preaprobado de 350
millones.
Dado nuestro problema inicial, crearemos la base de datos =
base1 en donde estarán ubicadas las viviendas tipo
casa que están ubicadas en el norte de
la ciudad.
base1 <- filter(vivienda, zona == "Zona Norte" & tipo == "Casa")
knitr::kable (head(base1, 3), caption = "Primeros 3 registros de base1")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
| 4057 | Zona Norte | 02 | 6 | 750 | 445 | NA | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
knitr::kable (summary(base1), caption = "Resumen estadistico base 1")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 58.0 | Length:722 | Length:722 | Min. :3.000 | Min. : 89.0 | Min. : 30.0 | Min. : 1.000 | Min. : 0.000 | Min. : 0.000 | Length:722 | Length:722 | Min. :-76.59 | Min. :3.333 | |
| 1st Qu.: 766.2 | Class :character | Class :character | 1st Qu.:3.000 | 1st Qu.: 261.2 | 1st Qu.: 140.0 | 1st Qu.: 1.000 | 1st Qu.: 2.000 | 1st Qu.: 3.000 | Class :character | Class :character | 1st Qu.:-76.53 | 1st Qu.:3.452 | |
| Median :2257.0 | Mode :character | Mode :character | Median :4.000 | Median : 390.0 | Median : 240.0 | Median : 2.000 | Median : 3.000 | Median : 4.000 | Mode :character | Mode :character | Median :-76.52 | Median :3.468 | |
| Mean :2574.6 | NA | NA | Mean :4.202 | Mean : 445.9 | Mean : 264.9 | Mean : 2.182 | Mean : 3.555 | Mean : 4.507 | NA | NA | Mean :-76.52 | Mean :3.460 | |
| 3rd Qu.:4225.0 | NA | NA | 3rd Qu.:5.000 | 3rd Qu.: 550.0 | 3rd Qu.: 336.8 | 3rd Qu.: 3.000 | 3rd Qu.: 4.000 | 3rd Qu.: 5.000 | NA | NA | 3rd Qu.:-76.50 | 3rd Qu.:3.482 | |
| Max. :8319.0 | NA | NA | Max. :6.000 | Max. :1940.0 | Max. :1440.0 | Max. :10.000 | Max. :10.000 | Max. :10.000 | NA | NA | Max. :-76.47 | Max. :3.496 | |
| NA | NA | NA | NA | NA | NA | NA’s :287 | NA | NA | NA | NA | NA | NA |
Sin novedades la base de datos base1
mapa <- leaflet() %>%
addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
addPolygons(data = datos_shapefile,
color = "orange",
fillOpacity = 0.8)
mapa <- mapa %>%
addCircleMarkers(data = base1,
lng = ~longitud,
lat = ~latitud,
label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
stroke = FALSE,
fillOpacity = 0.6,
radius = 3,
color = 'green',
popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))
mapa
Zona Norte: Según la alcaldia de Cali la zona comprende el territorio que va desde la KR 1 entre la CL 1 OESTE hasta el separador vial ubicado entre las CL 25 y CL 26, vía por la cual se continúa hasta la KR 7, y desde este punto, siguiendo el trazado del corredor férreo hasta llegar a la CL 88, a partir de la cual, se continua hacia el norte por el límite del suelo urbano hasta finalizar en el punto de inicio en la KR 1.
Por tanto, según la descripción proporcionada por la alcaldía, así como la validación visual realizada, se ha identificado que existen varios puntos registrados como ‘Zona Norte’ que en realidad pertenecen a otras áreas de la ciudad. Estos errores posiblemente se deben a dificultades en el proceso de registro de la ubicación, ya que no se utiliza un sistema de georreferenciación automática, sino que la información se ingresa manualmente.
Dado que necesitamos crear un modelo para determinar la
vivienda1 (Primer vivienda solicitada por la compañia
intercional), procedemos a imputar los datos nulos de la variable piso
con un “1”, esto dado que el cliente no tuvo en cuenta el numero de piso
en su solicitud pero el aegnte inmobiliario si podría utilizar el dato
del piso para mostrar algún beneficio adicional que sirva para la
negociación, ademas se eliminan los valores Nulos de las otras
variables, y esto se hace dado que la Compañia Internacional interesada
en la compra exige ciertas condiciones.
base1$piso <- ifelse(is.na(base1$piso), 1, base1$piso)
base1_nueva <- base1[complete.cases(base1), ]
head(base1_nueva)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 02 5 320 150 2 4 6
## 2 1592 Zona N… 02 5 780 380 2 3 3
## 3 4460 Zona N… 02 4 625 355 3 5 5
## 4 6081 Zona N… 02 5 750 237 2 6 6
## 5 7824 Zona N… 02 4 600 160 1 4 5
## 6 7987 Zona N… 02 5 420 200 4 4 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Analisis Piso
piso_data <- base1_nueva$piso
plot <- plot_ly(x = ~piso_data, type = "histogram", name = "Piso") %>%
layout(title = "Distribución de Pisos",
xaxis = list(title = "Número de Pisos"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1) #
plot
Podemosobservar que la mayor cantidad de datos fue los que
imputamos como “1”, es decir los que no tenían información, en cuanto a
los que si tenían información el dato predominante es casas de dos
pisos.
Analisis Precio Vivienda
preciom_data <- base1_nueva$preciom
plot <- plot_ly(x = ~preciom_data, type = "histogram", name = "Preciom") %>%
layout(title = "Distribución de Precios de Viviendas",
xaxis = list(title = "Precio (en millones de pesos)"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayor cantidad de casas se ubican en el rango de precio de
350-400 millones, en total 6a registros, seeguido del rango 300-350 con
54 registros.
Analisis Estrato Vivienda
estrato_data <- base1_nueva$estrato
plot <- plot_ly(x = ~estrato_data, type = "histogram", name = "Estrato") %>%
layout(title = "Distribución de Estratos de Viviendas",
xaxis = list(title = "Estrato Socioeconómico"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
Con 223 registros, el estrato 5 predomina en las casas ubicadas
al norte de la ciudad.
Analisis Banios
banios_data <- base1_nueva$banios
plot <- plot_ly(x = ~banios_data, type = "histogram", name = "Baños") %>%
layout(title = "Distribución de Número de Baños en Viviendas",
xaxis = list(title = "Número de Baños"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayoria de casas poseen 3 baños
Analisis
Habitaciones
habitaciones_data <- base1_nueva$habitaciones
plot <- plot_ly(x = ~habitaciones_data, type = "histogram", name = "Habitaciones") %>%
layout(title = "Distribución del Número de Habitaciones en Viviendas",
xaxis = list(title = "Número de Habitaciones"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
Las casas en su mayoria poseen 4 habitaciones, en total con 4
habitaciones se tienen 142 registros, le sigue 5 habitaciones con 101
registros y 3 habitaciones con 75 registros, este sería el top 3.
Analisis Parqueadero
parqueaderos_data <- base1_nueva$parqueaderos
plot <- plot_ly(x = ~parqueaderos_data, type = "histogram", name = "Parqueaderos") %>%
layout(title = "Distribución del Número de Parqueaderos en Viviendas",
xaxis = list(title = "Número de Parqueaderos"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayoria de viviendas tiene 1 parqueadero.
subset_data <- base1_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
correlation_matrix <- cor(subset_data, use = "complete.obs", method = "pearson")
ggcorrplot(correlation_matrix,
hc.order = TRUE,
type = "upper",
ggtheme = ggplot2::theme_minimal())
Vemos graficamente que existe gran relación positiva entre las
variables.
subset_data <- base1_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
ggpairs(subset_data, title = "Gráficos de Dispersión y Correlación")
Podemos confirmar numéricamente que existe una sólida relación
positiva entre las variables seleccionadas. Esto significa que cuando
una variable aumenta, las demás tienden a aumentar en conjunto. Es
interesante observar que la correlación más fuerte se encuentra entre
‘areaconst’ y ‘preciom’. Esto tiene sentido, ya que a medida que el
tamaño de la construcción areaconst aumenta, el precio
de la vivienda preciom tiende a aumentar, y viceversa.
En otras palabras, cuanto más grande es la construcción, se espera que
su precio sea más alto, lo que es una relación coherente y lógica en el
contexto del mercado inmobiliario
modelo_vivienda1 = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = base1_nueva)
summary(modelo_vivienda1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios +
## habitaciones, data = base1_nueva)
##
## Residuals:
## Min 1Q Median 3Q Max
## -784.29 -77.56 -16.03 47.67 978.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -238.17090 44.40551 -5.364 1.34e-07 ***
## areaconst 0.67673 0.05281 12.814 < 2e-16 ***
## estrato 80.63495 9.82632 8.206 2.70e-15 ***
## parqueaderos 24.00598 5.86889 4.090 5.14e-05 ***
## banios 18.89938 7.48800 2.524 0.012 *
## habitaciones 7.64511 5.65873 1.351 0.177
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.1 on 429 degrees of freedom
## Multiple R-squared: 0.6041, Adjusted R-squared: 0.5995
## F-statistic: 130.9 on 5 and 429 DF, p-value: < 2.2e-16
Cuando se analiza el modelo de regresión para estimar los
precios de las casas, se observa que el coeficiente de determinación,
R^2, es igual a 0.5995, esto significa que aproximadamente el 59.95% de
las variaciones en los precios de las casas pueden explicarse utilizando
las variables que hemos incluido en el modelo, el modelo puede predecir
cerca del 60% de las diferencias en los precios de las viviendas.
Todas las variables del modelo son estadísticamente significativas,
es decir que: el área construida, el estrato, el número de parqueaderos,
el número de baños y el número de habitaciones, tienen un impacto
importante y medible en el precio de las casas.
Precio =
-238.17090 + 0.67673 * (área construida) + 80.63495 * (estrato) +
24.00598 * (parqueaderos) + 18.89938 * (baños) + 7.64511 *
(habitaciones
La ecuación del modelo nos ayuda a
comprender cómo estas variables influyen en los precios de las casas,
por ejemplo, un aumento de una unidad en el estrato se relaciona con un
aumento de aproximadamente 80.63 unidades en el precio de la casa,
manteniendo todas las demás variables constantes.
plot(modelo_vivienda1, which = 1)
Dado el grafico obtenido podríamos decir que existe un patrón de
heterocedasticidad dado que a medida que se avanza a lo largo de la
línea los datos se vuelven mas dispersos lo que puede insidar que la
varianza de los errores no es constante.
shapiro.test(modelo_vivienda1$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo_vivienda1$residuals
## W = 0.85246, p-value < 2.2e-16
Estadístico de prueba (W): 0.85246 Valor p: < 2.2e-16 (Valor extremadamente pequeño, prácticamente cero)
El resultado del test de Shapiro-Wilk para la normalidad de los residuos del modelo “modelo_vivienda1” muestra un valor extremadamente bajo del estadístico W (0.85246) y un p-valor muy cercano a cero (p-value < 2.2e-16). Esto indica que los residuos no siguen una distribución normal, los residuos del modelo no se ajustan bien a una distribución gaussiana.
Esta falta de normalidad en los residuos podría tener implicaciones
en la validez de las pruebas de hipótesis y estimaciones realizadas con
el modelo.
qqnorm(modelo_vivienda1$residuals)
qqline(modelo_vivienda1$residuals)
Según el grafico podemos decir que que falta normalidad dado que
existe una desviación hacia arriba en los puntos.
bptest(modelo_vivienda1)
##
## studentized Breusch-Pagan test
##
## data: modelo_vivienda1
## BP = 80.281, df = 5, p-value = 7.33e-16
Estadístico de prueba BP (Breusch-Pagan): 80.281 Grados de libertad (df): 5 Valor p: 7.33e-16
El resultado del test de Breusch-Pagan (BP) indica que existe heterocedasticidad en los residuos del modelo “modelo_vivienda1”. El valor extremadamente bajo del p-valor (7.33e-16) sugiere que al menos una de las variables explicativas en el modelo contribuye significativamente a la heterocedasticidad, es decir que la varianza de los errores no es constante en todo el rango de valores de las variables predictoras, lo que significa que puede afectar la validez de las inferencias del modelo.
plot(modelo_vivienda1, which = 3)
Vemos que existe un patros similar a un embudo, la dispersión de
puntos cambia a lo largo del rango de valores, podriamos decir que se
confirma la heterocedasticidad.
dwtest(modelo_vivienda1)
##
## Durbin-Watson test
##
## data: modelo_vivienda1
## DW = 1.7615, p-value = 0.005472
## alternative hypothesis: true autocorrelation is greater than 0
Estadístico de prueba DW (Durbin-Watson): 1.7615
Valor p: 0.005472 (menor que 0.05)
El resultado del test de Durbin-Watson (DW) sugiere la posibilidad de autocorrelación positiva en los residuos del modelo “modelo_vivienda1”. Aunque el valor de DW no indica fuertemente la presencia de autocorrelación, el valor p (0.005472) es significativo, lo que sugiere cierta correlación entre los errores.
vif(modelo_vivienda1)
## areaconst estrato parqueaderos banios habitaciones
## 1.460998 1.307757 1.226334 1.967421 1.721015
Los valores de VIF están cerca de 1 para todas las variables predictoras, lo que indica que no hay una alta multicolinealidad entre estas variables en el modelo, se considera que un valor de VIF por debajo de 5 significa que no existe una multicolinealidad significativa, lo que es positivo para la estimación de los coeficientes de regresión y la interpretación del modelo.
Creamos el data.frame con los dos vectores de las condiciones de la compañia internacional
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_vivienda1.")
| areaconst | estrato | parqueaderos | banios | habitaciones |
|---|---|---|---|---|
| 200 | 4 | 1 | 2 | 4 |
| 200 | 5 | 1 | 2 | 4 |
Corremos el modelo con la información consignada en el data.fram
anteriormente creado.
predicciones_precio <- predict(modelo_vivienda1, newdata = Vivienda_1)
Valores obtenidos al correr el modelo
predicciones_precio
## 1 2
## 312.1010 392.7359
Creamos los parametros solicitados por la compañia
internacional
parametros_vivienda1 <- which(base1_nueva$estrato>=4 & base1_nueva$areaconst>= 200 & base1_nueva$parqueaderos>=1 & base1_nueva$banios>=2 & base1_nueva$habitaciones>=4 & base1_nueva$estrato>=4 & base1_nueva$estrato<=5 & base1_nueva$preciom<=350 )
Realizamos la depuración de nuestra base de datos con
los parametros que necesitamos
oferta_casas <- base1_nueva[parametros_vivienda1,]
Seleccionamos nuestros 5 registros y organizamos de
forma descendente por area construida
oferta_casas_cinco = oferta_casas[order(oferta_casas$areaconst, decreasing = TRUE), ]
knitr::kable(head(oferta_casas_cinco, 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3101 | Zona Norte | 02 | 5 | 340 | 355 | 2 | 5 | 8 | Casa | san vicente | -76.52377 | 3.46384 |
| 5031 | Zona Norte | 03 | 4 | 350 | 350 | 1 | 4 | 5 | Casa | salomia | -76.53464 | 3.44987 |
| 1943 | Zona Norte | 1 | 5 | 350 | 346 | 1 | 2 | 4 | Casa | vipasa | -76.51847 | 3.47503 |
| 4209 | Zona Norte | 02 | 5 | 350 | 300 | 3 | 5 | 6 | Casa | el bosque | -76.53010 | 3.48577 |
| 3352 | Zona Norte | 1 | 4 | 335 | 300 | 3 | 4 | 4 | Casa | el bosque | -76.52600 | 3.43400 |
Definimos data con las 5 casas a mapear
cinco_casas <- head(oferta_casas_cinco, 5)
Creamos el mapa
mapa_casas_5 <- leaflet() %>%
addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
addPolygons(data = datos_shapefile,
color = "green",
fillOpacity = 0.3)
mapa_casas_5 <- mapa_casas_5 %>%
addCircleMarkers(data = cinco_casas,
lng = ~longitud,
lat = ~latitud,
label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
stroke = FALSE,
fillOpacity = 0.6,
radius = 6,
color = 'blue',
popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))
mapa_casas_5
De las casas seleccionadas, la 4209, 1943 y 3101 cumplen con los criterios del cliente, la 5031 y la 3352 no cumplen dado que estan ubicadas por fuera de la zona norte
Apartamento en el Sur de la ciudad, con 300 metros cuadrados
construidos, con 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5 o 6
y con un credito preaprobado de 850 millones.
Dado nuestro problema inicial, crearemos la base de datos =
base2 en donde estarán ubicadas las viviendas tipo
Apartamento que están ubicadas en el
Sur de la ciudad.
base2 <- filter(vivienda, zona == "Zona Sur" & tipo == "Apartamento")
knitr::kable (head(base2, 3), caption = "Primeros 3 registros de base2")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5098 | Zona Sur | 05 | 4 | 290 | 96 | 1 | 2 | 3 | Apartamento | acopi | -76.53464 | 3.44987 |
| 698 | Zona Sur | 02 | 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 |
knitr::kable (summary(base2), caption = "Resumen estadistico base 2")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 3 | Length:2787 | Length:2787 | Min. :3.00 | Min. : 75.0 | Min. : 40.00 | Min. : 1.000 | Min. :0.000 | Min. :0.000 | Length:2787 | Length:2787 | Min. :-76.57 | Min. :3.334 | |
| 1st Qu.:2292 | Class :character | Class :character | 1st Qu.:4.00 | 1st Qu.: 175.0 | 1st Qu.: 65.00 | 1st Qu.: 1.000 | 1st Qu.:2.000 | 1st Qu.:3.000 | Class :character | Class :character | 1st Qu.:-76.54 | 1st Qu.:3.370 | |
| Median :4004 | Mode :character | Mode :character | Median :5.00 | Median : 245.0 | Median : 85.00 | Median : 1.000 | Median :2.000 | Median :3.000 | Mode :character | Mode :character | Median :-76.53 | Median :3.383 | |
| Mean :4131 | NA | NA | Mean :4.63 | Mean : 297.3 | Mean : 97.47 | Mean : 1.415 | Mean :2.488 | Mean :2.966 | NA | NA | Mean :-76.53 | Mean :3.390 | |
| 3rd Qu.:5876 | NA | NA | 3rd Qu.:5.00 | 3rd Qu.: 335.0 | 3rd Qu.:110.00 | 3rd Qu.: 2.000 | 3rd Qu.:3.000 | 3rd Qu.:3.000 | NA | NA | 3rd Qu.:-76.52 | 3rd Qu.:3.406 | |
| Max. :8302 | NA | NA | Max. :6.00 | Max. :1750.0 | Max. :932.00 | Max. :10.000 | Max. :8.000 | Max. :6.000 | NA | NA | Max. :-76.46 | Max. :3.497 | |
| NA | NA | NA | NA | NA | NA | NA’s :406 | NA | NA | NA | NA | NA | NA |
Sin novedades la base de datos base2
mapa <- leaflet() %>%
addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
addPolygons(data = datos_shapefile,
color = "red",
fillOpacity = 0.8)
mapa <- mapa %>%
addCircleMarkers(data = base2,
lng = ~longitud,
lat = ~latitud,
label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
stroke = FALSE,
fillOpacity = 0.6,
radius = 3,
color = 'green',
popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))
mapa
Zona Sur: Esta zona comprende el territorio que va desde la KR 50 con la CL 57 hasta la CL 5, vía por la cual se continúa hacia el sur de la ciudad hasta el Río Meléndez, siguiendo su cauce aguas arriba hasta el cruce con el límite del suelo urbano, por el que se continua hacia el sur de la ciudad hasta la KR 127 y por esta vía hasta la CL 18, punto en el cual se sigue el trazado (hacia el sur) del límite del suelo de expansión urbano hasta llegar al punto de inicio en la KR 50.
Por tanto, según la descripción proporcionada por la alcaldía, así como la validación visual realizada, se ha identificado que existen varios puntos registrados como ‘Zona Sur’ que en realidad pertenecen a otras áreas de la ciudad. Estos errores posiblemente se deben a dificultades en el proceso de registro de la ubicación, ya que no se utiliza un sistema de georreferenciación automática, sino que la información se ingresa manualmente.
Dado que necesitamos crear un modelo para determinar la
vivienda2 (Segunda vivienda solicitada por la compañia
intercional), procedemos a imputar los datos nulos de la variable piso
con un “1”, esto dado que el cliente no tuvo en cuenta el numero de piso
en su solicitud pero el agente inmobiliario si podría utilizar el dato
del piso para mostrar algún beneficio adicional que sirva para la
negociación, ademas se eliminan los valores Nulos de las otras
variables, y esto se hace dado que la Compañia Internacional interesada
en la compra exige ciertas condiciones.
base2$piso <- ifelse(is.na(base2$piso), 1, base2$piso)
base2_nueva <- base2[complete.cases(base2), ]
head(base2_nueva)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona S… 05 4 290 96 1 2 3
## 2 698 Zona S… 02 3 78 40 1 1 2
## 3 8199 Zona S… 1 6 875 194 2 5 3
## 4 6975 Zona S… 06 4 220 75 1 2 3
## 5 5615 Zona S… 08 3 210 72 2 2 3
## 6 7396 Zona S… 1 3 115 58 1 2 2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Analisis Piso
piso_data <- base2_nueva$piso
plot <- plot_ly(x = ~piso_data, type = "histogram", name = "Piso",marker = list(color = "green")) %>%
layout(title = "Distribución de Pisos",
xaxis = list(title = "Número de Pisos"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1) #
plot
Podemosobservar que la mayor cantidad de datos fue los que
imputamos como “1”, es decir los que no tenían información, en cuanto a
los que si tenían información el dato predominante es apartamentos en el
4to y 5to piso con 287 registros.
Analisis Precio Vivienda
preciom_data <- base2_nueva$preciom
intervalos <- seq(0, max(preciom_data) + 100, by = 100)
plot <- plot_ly() %>%
add_histogram(x = ~preciom_data, name = "Preciom", marker = list(color = "green"), xbins = list(start = min(intervalos), end = max(intervalos), size = 100)) %>%
layout(title = "Distribución de Precios de Viviendas",
xaxis = list(title = "Precio (en millones de pesos)"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayor cantidad de apartamentos se ubican en el rango de
precio de 200-300 millones, en total 928 registros.
Analisis Estrato Vivienda
estrato_data <- base2_nueva$estrato
plot <- plot_ly(x = ~estrato_data, type = "histogram", name = "Estrato",,marker = list(color = "green")) %>%
layout(title = "Distribución de Estratos de Viviendas",
xaxis = list(title = "Estrato Socioeconómico"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
Con 990 registros, el estrato 5 predomina en los apartamentos
ubicados al su de la ciudad.
Analisis Banios
banios_data <- base2_nueva$banios
plot <- plot_ly(x = ~banios_data, type = "histogram", name = "Baños",marker = list(color = "green")) %>%
layout(title = "Distribución de Número de Baños en Viviendas",
xaxis = list(title = "Número de Baños"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayoria de apartamentos disponen de 2 baños.
Analisis Habitaciones
habitaciones_data <- base2_nueva$habitaciones
plot <- plot_ly(x = ~habitaciones_data, type = "histogram", name = "Habitaciones",marker = list(color = "green")) %>%
layout(title = "Distribución del Número de Habitaciones en Viviendas",
xaxis = list(title = "Número de Habitaciones"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
Los apartamentos en su mayoria poseen 3 habitaciones, en total
con 3 habitaciones se tienen 142 registros.
Analisis
Parqueadero
parqueaderos_data <- base2_nueva$parqueaderos
plot <- plot_ly(x = ~parqueaderos_data, type = "histogram", name = "Parqueaderos",marker = list(color = "green")) %>%
layout(title = "Distribución del Número de Parqueaderos en Viviendas",
xaxis = list(title = "Número de Parqueaderos"),
yaxis = list(title = "Frecuencia"),
barmode = "overlay",
bargap = 0.1)
plot
La mayoria de apartamentos tiene 1 parqueadero.
subset_data <- base2_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
correlation_matrix <- cor(subset_data, use = "complete.obs", method = "pearson")
ggcorrplot(correlation_matrix,
hc.order = TRUE,
type = "upper",
ggtheme = ggplot2::theme_minimal())
Vemos graficamente que existe gran relación positiva entre las
variables. siendo la relación precio - areaconst la que mas relacion
visual tiene
subset_data <- base2_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
ggpairs(subset_data, title = "Gráficos de Dispersión y Correlación")
Podemos confirmar numéricamente que existe una sólida relación
positiva entre las variables seleccionadas. Esto significa que cuando
una variable aumenta, las demás tienden a aumentar en conjunto. Es
interesante observar que la correlación más fuerte se encuentra entre
‘areaconst’ y ‘preciom’. Esto tiene sentido, ya que a medida que el
tamaño de la construcción areaconst aumenta, el precio
de la vivienda preciom tiende a aumentar, y viceversa.
En otras palabras, cuanto más grande es la construcción, se espera que
su precio sea más alto, lo que es una relación coherente y lógica en el
contexto del mercado inmobiliario
modelo_vivienda2 = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = base2_nueva)
summary(modelo_vivienda2)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios +
## habitaciones, data = base2_nueva)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1092.02 -42.28 -1.33 40.58 926.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -261.62501 15.63220 -16.736 < 2e-16 ***
## areaconst 1.28505 0.05403 23.785 < 2e-16 ***
## estrato 60.89709 3.08408 19.746 < 2e-16 ***
## parqueaderos 72.91468 3.95797 18.422 < 2e-16 ***
## banios 50.69675 3.39637 14.927 < 2e-16 ***
## habitaciones -24.83693 3.89229 -6.381 2.11e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 98.02 on 2375 degrees of freedom
## Multiple R-squared: 0.7485, Adjusted R-squared: 0.748
## F-statistic: 1414 on 5 and 2375 DF, p-value: < 2.2e-16
Cuando se analiza el modelo de regresión para estimar los
precios de las casas, se observa que el coeficiente de determinación,
R^2, es igual a 0.748, esto significa que aproximadamente el 74,8% de
las variaciones en los precios de las casas pueden explicarse utilizando
las variables que hemos incluido en el modelo, el modelo puede predecir
cerca del 75% de las diferencias en los precios de los apartamentos.
Todas las variables del modelo son estadísticamente significativas,
es decir que: el área construida, el estrato, el número de parqueaderos,
el número de baños y el número de habitaciones, tienen un impacto
importante y medible en el precio de los apartamentos.
Precio = -262.62501 + 1,28505 * (área construida) + 60.89709 *
(estrato) + 72.91468 * (parqueaderos) + 50.69675 * (baños) -24.83693 *
(habitaciones
La ecuación del modelo nos ayuda a
comprender cómo estas variables influyen en los precios de los
apartamentos, por ejemplo, un aumento de una unidad en el estrato se
relaciona con un aumento de aproximadamente 60.90 unidades en el precio
de la casa, manteniendo todas las demás variables constantes.
plot(modelo_vivienda2, which = 1)
Dado el grafico obtenido podríamos decir que existe un patrón de
heterocedasticidad dado que a medida que se avanza a lo largo de la
línea los datos se vuelven mas dispersos lo que puede insidar que la
varianza de los errores no es constante.
shapiro.test(modelo_vivienda2$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo_vivienda2$residuals
## W = 0.79118, p-value < 2.2e-16
Estadístico de prueba (W): 0.79118 Valor p: < 2.2e-16
El resultado del test de Shapiro-Wilk para la normalidad de los residuos del modelo “modelo_vivienda1” muestra un valor extremadamente bajo del estadístico W (0.79118) y un p-valor muy cercano a cero (p-value < 2.2e-16). Esto indica que los residuos no siguen una distribución normal, los residuos del modelo no se ajustan bien a una distribución gaussiana.
Esta falta de normalidad en los residuos podría tener implicaciones
en la validez de las pruebas de hipótesis y estimaciones realizadas con
el modelo.
qqnorm(modelo_vivienda2$residuals)
qqline(modelo_vivienda2$residuals)
Según el grafico podemos decir que que falta normalidad dado que
existe una desviación hacia arriba en los puntos.
bptest(modelo_vivienda2)
##
## studentized Breusch-Pagan test
##
## data: modelo_vivienda2
## BP = 754.81, df = 5, p-value < 2.2e-16
Estadístico de prueba BP (Breusch-Pagan): 754.81 Grados de libertad (df): 5 Valor p: 2.2e-16
El resultado del test de Breusch-Pagan (BP) indica que existe heterocedasticidad en los residuos del modelo “modelo_vivienda2”. El valor bajo del p-valor (2.2e-16) sugiere que al menos una de las variables explicativas en el modelo contribuye significativamente a la heterocedasticidad, es decir que la varianza de los errores no es constante en todo el rango de valores de las variables predictoras, lo que significa que puede afectar la validez de las inferencias del modelo.
plot(modelo_vivienda2, which = 3)
Vemos que existe un patron similar a un embudo, la dispersión de
puntos cambia a lo largo del rango de valores, podriamos decir que se
confirma la heterocedasticidad.
dwtest(modelo_vivienda2)
##
## Durbin-Watson test
##
## data: modelo_vivienda2
## DW = 1.5333, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Estadístico de prueba DW (Durbin-Watson): 1.5333
Valor p: 2.2e-16 (menor que 0.05)
El resultado del test de Durbin-Watson (DW) sugiere la posibilidad de autocorrelación positiva en los residuos del modelo “modelo_vivienda2”. Aunque el valor de DW no indica fuertemente la presencia de autocorrelación, el valor p (2.2e-16) es significativo, lo que sugiere cierta correlación entre los errores.
vif(modelo_vivienda2)
## areaconst estrato parqueaderos banios habitaciones
## 2.066518 1.545162 1.737878 2.529494 1.429280
Los valores de VIF están cerca de 1 para todas las variables predictoras, lo que indica que no hay una alta multicolinealidad entre estas variables en el modelo, se considera que un valor de VIF por debajo de 5 significa que no existe una multicolinealidad significativa, lo que es positivo para la estimación de los coeficientes de regresión y la interpretación del modelo.
Creamos el data.frame con los dos vectores de las condiciones de la compañia internacional
Vivienda_2 = data.frame( areaconst=c(300,300), parqueaderos=c(3,3),
estrato=c(5,6),
banios=c(3,3),
habitaciones=c(5,5)
)
knitr::kable(Vivienda_2, caption = "Datos para predicción de modelo_vivienda2.")
| areaconst | parqueaderos | estrato | banios | habitaciones |
|---|---|---|---|---|
| 300 | 3 | 5 | 3 | 5 |
| 300 | 3 | 6 | 3 | 5 |
Corremos el modelo con la información consignada en el
data.frame anteriormente creado.
predicciones_precio_p <- predict(modelo_vivienda2, newdata = Vivienda_2)
Valores obtenidos al correr el modelo
predicciones_precio_p
## 1 2
## 675.0247 735.9218
Creamos los parametros solicitados por la compañia
internacional
parametros_vivienda2 <- which(base2_nueva$estrato>=5 & base2_nueva$areaconst>= 300 & base2_nueva$parqueaderos>=3 & base2_nueva$banios>=3 & base2_nueva$habitaciones>=5 & base2_nueva$preciom<=850 )
Realizamos la depuración de nuestra base de datos con
los parametros que necesitamos
oferta_apartamentos <- base2_nueva[parametros_vivienda2,]
Seleccionamos nuestros 5 registros y organizamos de
forma descendente por area construida
oferta_apartamentos_cinco = oferta_apartamentos[order(oferta_apartamentos$areaconst, decreasing = TRUE), ]
knitr::kable(head(oferta_apartamentos_cinco, 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 | 1 | 5 | 730 | 573 | 3 | 8 | 5 | Apartamento | guadalupe | -76.548 | 3.408 |
| 7512 | Zona Sur | 1 | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | seminario | -76.550 | 3.409 |
Solo dos apartamentos cumplen con las condiciones solicitadas
por la compañia internacional.
Creamos el mapa
mapa_apartamentos_5 <- leaflet() %>%
addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
setView(lng = -76.51, lat = 3.38, zoom = 11.8) %>%
addPolygons(data = datos_shapefile,
color = "green",
fillOpacity = 0.3)
mapa_apartamentos_5 <- mapa_apartamentos_5 %>%
addCircleMarkers(data = oferta_apartamentos_cinco,
lng = ~longitud,
lat = ~latitud,
label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
stroke = FALSE,
fillOpacity = 0.6,
radius = 6,
color = 'blue',
popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))
mapa_apartamentos_5
De los apartamentos que cumplen con las condiciones de la compañia internacional que son: 7182 y 7512 están ubicados por fuera de la Zona Sur, aunque dada la cercania con la Zona Sur y su precio 730 y 670 millones respectivamente, la Compañia C & A podría negociar para poder concretar el negocio