Es importante para las empresas usar los recursos disponibles para fomentar el crecimiento. El análisis de datos y las estadística descriptiva, son la mejor alternativa para el crecimiento basado en data (data driven). A continuación presentaremos una serie de análisis y conclusiones que ayudaran al crecimiento de la misma.
Análisis Descriptivo: Realizar un análisis descriptivo exhaustivo de los datos para identificar tendencias, patrones y anomalías en el mercado de bienes raíces de Cali. Este análisis ayudará a entender mejor el estado actual del mercado y su evolución reciente.
Segmentación del Mercado: Determinar las diferencias en precios y características de las viviendas según las zonas de Cali. Esto permitirá identificar áreas de alta demanda y aquellas con potencial de desarrollo.
Identificación de Nichos de Mercado: Definir los nichos de mercado más prometedores para B&C, basándose en el tipo de viviendas más ofertadas y las características que predominan en la oferta actual.
Desarrollo de Estrategias de Marketing: Proponer estrategias de marketing dirigidas a los segmentos identificados, con el fin de optimizar la promoción y venta de propiedades.
Establecimiento de Precios de Venta: Orientar a B&C en el establecimiento de precios competitivos y realistas para sus propiedades, acorde con las tendencias del mercado y las expectativas de los consumidores.
A continuación vamos a ejecutar las siguientes acciones
print(paste("Numero total de filas: ", nrow(vivienda_faltantes)))
## [1] "Numero total de filas: 8330"
print(colSums(is.na(vivienda_faltantes)))
## id zona piso estrato preciom areaconst parquea banios
## 3 3 2641 3 2 3 1606 3
## habitac tipo barrio longitud latitud
## 3 3 3 3 3
df <- vivienda_faltantes[!is.na(vivienda_faltantes$id), ]
print(paste("Numero final de filas despues de Remover: ", nrow(df)))
## [1] "Numero final de filas despues de Remover: 8327"
colSums(is.na(df))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 2638 0 0 0 1603 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
Empezamos a hacer revisión de variable por variable y exploramos que
tipo de datos tienen para hacer las transformaciones correspondientes.
Variable: Tipo
table(df$tipo)
##
## Apartamento APARTAMENTO apto casa Casa CASA
## 5032 61 13 14 3195 12
La variable tipo requiere que los valores iguales tengan la misma cadena de caracteres, procedemos con la normalización cambiando todo a mayúsculas y remplazando apto a APARTAMENTO.
df$tipo <- ifelse(df$tipo %in% c("apto") , "APARTAMENTO", df$tipo)
df$tipo <- str_to_upper(df$tipo)
table(df$tipo)
##
## APARTAMENTO CASA
## 5106 3221
Variable Piso
Sabemos que tenemos alrededor de 2638 valores vacíos, vamos a rellenar la información utilizando la moda.
soloApto <- subset(df, tipo == "APARTAMENTO" & !is.na(df$piso))
table(soloApto$piso)
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 431 512 573 545 564 243 203 211 146 128 84 83
Reemplazamos los valores de piso NA donde el tipo es NA por el valor 3, que es el que contiene mas repeticiones como se muestra en la tabla de arriba.
df$piso <- ifelse(is.na(df$piso) & df$tipo == "APARTAMENTO" , 3 , df$piso)
colSums(is.na(df))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 1255 0 0 0 1603 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
soloCasa <- subset(df, tipo == "CASA" & !is.na(df$piso))
soloCasa <- soloCasa[order(-soloCasa$estrato), ]
table(soloCasa$piso)
##
## 1 2 3 4 5 6 7 10
## 430 938 524 62 4 2 4 2
Como resultado vamos a imputar cuando el tipo es CASA el valor de 2
df$zona_estrato = paste(df$zona, df$estrato, sep = "_")
df$piso <- ifelse(is.na(df$piso) & df$tipo == "CASA" , 2 , df$piso)
colSums(is.na(df))
## id zona piso estrato preciom areaconst
## 0 0 0 0 0 0
## parquea banios habitac tipo barrio longitud
## 1603 0 0 0 0 0
## latitud zona_estrato
## 0 0
Para esta variable si vamos hacer la moda (valor mas comun) pero vamos hacer una agregación por estrato, ya que al inspeccionar la data el estrato tiene correlación con el número de parqueaderos.
sinParqueVacio <- subset(df, !is.na(df$parquea))
sinParqueVacio$estrato_tipo <- paste(sinParqueVacio$estrato, sinParqueVacio$tipo)
table(sinParqueVacio$estrato, sinParqueVacio$parquea)
##
## 1 2 3 4 5 6 7 8 9 10
## 3 557 93 19 10 1 3 0 0 0 1
## 4 1238 318 50 23 4 4 2 0 1 2
## 5 1207 1030 136 100 27 13 5 3 1 1
## 6 154 1037 316 253 36 48 11 14 2 4
table(sinParqueVacio$estrato_tipo, sinParqueVacio$parquea)
##
## 1 2 3 4 5 6 7 8 9 10
## 3 APARTAMENTO 280 14 2 0 0 0 0 0 0 0
## 3 CASA 277 79 17 10 1 3 0 0 0 1
## 4 APARTAMENTO 921 120 3 2 0 0 0 0 0 1
## 4 CASA 317 198 47 21 4 4 2 0 1 1
## 5 APARTAMENTO 972 640 30 16 0 0 1 0 0 1
## 5 CASA 235 390 106 84 27 13 4 3 1 0
## 6 APARTAMENTO 126 812 218 72 4 2 0 0 0 0
## 6 CASA 28 225 98 181 32 46 11 14 2 4
Para imputar de valores se hara de la siguient forma:
df$parquea <- ifelse(is.na(df$parquea) & df$estrato < 5 , 1 , df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato > 5 , 2 , df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato == 5 & df$tipo == "APARTAMENTO" , 1 , df$parquea)
df$parquea <- ifelse(is.na(df$parquea) & df$estrato == 5 & df$tipo == "CASA" , 2 , df$parquea)
colSums(is.na(df))
## id zona piso estrato preciom areaconst
## 0 0 0 0 0 0
## parquea banios habitac tipo barrio longitud
## 0 0 0 0 0 0
## latitud zona_estrato
## 0 0
df$barrio <- str_to_lower(df$barrio)
df$barrio <- removerTildes(df$barrio)
df$barrio <- removerTildes(df$barrio)
df$barrio <- tolower(df$barrio)
df$barrio <- trimws(df$barrio)
df$barrio <- ifelse(df$barrio %in% c("la ceibas", "ceibas"), "las ceibas", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("ciudad antejardin", "ciudad jardin pance", "pance", "parcelaciones pance", "farrallones de pance"), "ciudad jardin", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("el ingenio 3", "el ingenio i", "el ingenio ii", "el ingenio iii", "ingenio i", "ingenio ii", "ingenio", "palmas del ingenio"), "el ingenio", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("ciudadela paso ancho"), "ciudadela pasoancho", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("norte la flora", "laflora", "urbanizacion la flora", "flora"), "la flora", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("la rivera ii", "la rivera i"), "la rivera", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("valle de lili", "urbanizacion lili", "urbanizacion rio lili"), "valle del lili", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("el gran limonar", "bloques del limonar", "brisas del limonar", "gran limonar", "bosques del limonar", "prados del limonar"), "el limonar", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("santa anita sur"), "santa anita", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("caney especial", "caney"), "el caney", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("ciudad capri"), "capri", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("urbanizacion la merced"), "la merced", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("urbanizacion pacara"), "pacara", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("alamos", "ciudad los alamos" ), "los alamos", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("chiminangos 1 etapa", "chiminangos 2 etapa"), "chiminangos", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("bajo aguacatal", "miradol del aguacatal", "sector aguacatal"), "aguacatal", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("santa monica norte", "santa monica", "santa monica alta"), "santa monica residencial", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("ed benjamin herrera"), "benjamin herrera", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("ciudad melendez", "ciudadela melendez"), "melendez", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("quintas de salomia", "rincon de salomia"), "salomia", df$barrio)
df$barrio <- ifelse(df$barrio %in% c("bella suiza alta"), "bella suiza", df$barrio)
barrios <- unique(df$barrio)
length(barrios)
## [1] 332
print(barrios)
## [1] "arboleda" "normandia"
## [3] "miraflores" "el guabal"
## [5] "bella suiza" "valle del lili"
## [7] "el nacional" "santa teresita"
## [9] "aguacatal" "bellavista"
## [11] "el peñon" "la riverita"
## [13] "terron colorado" "melendez"
## [15] "guadalupe" "cristales"
## [17] "la arboleda" "brisas de guadalupe"
## [19] "el refugio" "altos de guadalupe"
## [21] "seminario" "guadalupe alto"
## [23] "pampalinda" "cuarto de legua"
## [25] "cerros de guadalupe" "normandia west point"
## [27] "el limonar" "la cascada"
## [29] "puente palma" "prados del sur"
## [31] "nueva tequendama" "brisas de los"
## [33] "urbanizacion las cascadas" "sector cañaveralejo guadalupe"
## [35] "santa rita" "san pedro"
## [37] "santa isabel" "el caney"
## [39] "los cristales" "los cristales club"
## [41] "cerro cristales" "caldas"
## [43] "alto jordan" "refugio"
## [45] "napoles" "el lido"
## [47] "colinas del sur" "altos de santa"
## [49] "acopi" "san fernando"
## [51] "el jordan" "ciudad jardin"
## [53] "centenario" "bosques de alboleda"
## [55] "bochalema" "tejares cristales"
## [57] "tequendama" "san joaquin"
## [59] "urbanizacion tequendama" "tejares de san"
## [61] "san fernando viejo" "mamellan"
## [63] "san fernando nuevo" "camino real"
## [65] "tequendema" "mayapan las vegas"
## [67] "alferez real" "el ingenio"
## [69] "francisco eladio ramirez" "san cayetano"
## [71] "ciudad real" "capri"
## [73] "villa del prado" "san antonio"
## [75] "las vegas" "la campiña"
## [77] "el bosque" "sierras de normandia"
## [79] "san vicente" "salomia"
## [81] "eucaristico" "menga"
## [83] "los cambulos" "la floresta"
## [85] "chipichape" "cambulos"
## [87] "templete" "multicentro"
## [89] "juanambu" "campestre"
## [91] "santa anita" "los libertadores"
## [93] "libertadores" "departamental"
## [95] "el cedro" "calicanto"
## [97] "quintas de don" "santa monica residencial"
## [99] "san nicolas" "primero de mayo"
## [101] "panamericano" "junin"
## [103] "la hacienda" "champagnat"
## [105] "benjamin herrera" "alameda"
## [107] "el troncal" "san bosco"
## [109] "el prado" "pacara"
## [111] "ciudadela pasoancho" "nueva floresta"
## [113] "ciudad cordoba" "la merced"
## [115] "granada" "colseguros"
## [117] "las quintas de" "centro"
## [119] "san luis" "unicentro cali"
## [121] "prados del norte" "pasoancho"
## [123] "bretaña" "villas de veracruz"
## [125] "versalles" "flora industrial"
## [127] "cañasgordas" "vipasa"
## [129] "la flora" "urbanizacion barranquilla"
## [131] "santo domingo" "santa monica popular"
## [133] "los andes" "jorge isaacs"
## [135] "el jardin" "guayaquil"
## [137] "colinas del bosque" "ciudad 2000"
## [139] "la buitrera" "berlin"
## [141] "los alamos" "santa"
## [143] "popular" "ciudad bochalema"
## [145] "urbanizacion colseguros" "villa del lago"
## [147] "urbanizacion la nueva" "cataya real"
## [149] "villa del sur" "urbanizacion san joaquin"
## [151] "el trebol" "la portada al"
## [153] "poblado campestre" "las delicias"
## [155] "las ceibas" "jamundi"
## [157] "jamundi alfaguara" "colseguros andes"
## [159] "calipso" "villa de veracruz"
## [161] "torres de comfandi" "puente del comercio"
## [163] "paso del comercio" "oasis de pasoancho"
## [165] "los guaduales" "los alcazares"
## [167] "las vegas de" "el dorado"
## [169] "ciudad pacifica" "bueno madrid"
## [171] "alcazares" "hacienda alferez real"
## [173] "las camelias" "colinas de menga"
## [175] "altos de menga" "las granjas"
## [177] "santa elena" "la independencia"
## [179] "cristobal colon" "aranjuez"
## [181] "santa rosa" "samanes"
## [183] "samanes de guadalupe" "cañaverales"
## [185] "alborada" "san judas"
## [187] "cañaverales los samanes" "ciudadela comfandi"
## [189] "santa helena de" "aguablanca"
## [191] "la alborada" "urbanizacion boyaca"
## [193] "las americas" "la morada"
## [195] "simon bolivar" "porvenir"
## [197] "calicanto viii" "cali"
## [199] "ciudad modelo" "prados de oriente"
## [201] "la fortaleza" "ciudad cordoba reservado"
## [203] "rincon de la" "san carlos"
## [205] "rafael uribe uribe" "centelsa"
## [207] "manzanares" "las acacias"
## [209] "la esmeralda" "union de vivienda"
## [211] "santa fe" "chapinero"
## [213] "belalcazar" "atanasio girardot"
## [215] "riveras del valle" "ciudad del campo"
## [217] "alameda del rio" "conjunto gibraltar"
## [219] "la selva" "villa colombia"
## [221] "los parques barranquilla" "fuentes de la"
## [223] "ciudad universitaria" "portales de comfandi"
## [225] "metropolitano del norte" "villa del sol"
## [227] "calima" "los robles"
## [229] "guaduales" "floralia"
## [231] "chiminangos" "la base"
## [233] "base aerea" "oasis de comfandi"
## [235] "la villa del" "portada de comfandi"
## [237] "urbanizacion el saman" "lares de comfenalco"
## [239] "santa barbara" "parque residencial el"
## [241] "siete de agosto" "la nueva base"
## [243] "la rivera" "jorge eliecer gaitan"
## [245] "alfonso lopez i" "comfenalco"
## [247] "ciudad country" "marroquin iii"
## [249] "ciudadela del rio" "zona oeste"
## [251] "ciudad talanga" "zona sur"
## [253] "jose manuel marroquin" "alfonso lopez"
## [255] "zona oriente" "zona norte"
## [257] "gaitan" "calimio norte"
## [259] "barrio 7de agosto" "calibella"
## [261] "brisas del guabito" "el guabito"
## [263] "arboledas" "los guayacanes"
## [265] "primitivo crespo" "fonaviemcali"
## [267] "la riviera" "nueva base"
## [269] "norte" "paseo de los"
## [271] "barranquilla" "villa del parque"
## [273] "zona residencial" "la alianza"
## [275] "pampa linda" "zona norte los"
## [277] "el vallado" "fenalco kennedy"
## [279] "el paraiso" "evaristo garcia"
## [281] "san juan bosco" "el sena"
## [283] "cañaveralejo" "antonio nariño"
## [285] "santafe" "belisario caicedo"
## [287] "el diamante" "morichal de comfandi"
## [289] "el rodeo" "barrio tranquilo y"
## [291] "sameco" "la gran colombia"
## [293] "municipal" "primavera"
## [295] "fepicol" "la primavera"
## [297] "20 de julio" "santander"
## [299] "saavedra galindo" "republica de israel"
## [301] "cali bella" "bolivariano"
## [303] "barrio el recuerdo" "agua blanca"
## [305] "boyaca" "mariano ramos"
## [307] "zona centro" "cali canto"
## [309] "arboleda campestre candelaria" "barrio obrero"
## [311] "la libertad" "san judas tadeo"
## [313] "colon" "valle grande"
## [315] "ponce" "urbanizacion gratamira"
## [317] "buenos aires" "cascajal"
## [319] "la reforma" "compartir"
## [321] "autopista sur" "el castillo"
## [323] "occidente" "barrio eucaristico"
## [325] "rozo la torre" "los jockeys"
## [327] "3 de julio" "la playa"
## [329] "lourdes" "urbanizacion nueva granada"
## [331] "los farallones" "la luisa"
**Creamos variables para hacer agregaciones: Estas variables nos serán útiles en el futuro cuando queramos ver data agregada en gráficos o tablas: 1. Variable zona_tipo 1. Variable zona_tipo_estrato
df$zona_tipo = paste(df$zona, df$tipo, sep = "_")
df$zona_tipo_estrato = paste(df$zona_tipo, df$estrato, sep = "_")
df$zona_estrato = paste(df$zona, df$estrato, sep = "_")
df$tipo_estrato = paste(df$tipo, df$estrato, sep = "_")
En en diagrama de cajas Distribución de precios por zona, se puede ver que hay bastantes datos atípicos por encima del bigote superior, y sin valores atípicos por debajo, Especialmente marcado en tres zonas de la ciudad Norte, Oeste y Sur.
niveles <- length(unique(df$zona))
set.seed(124)
colores_aleatorios <- grDevices::rainbow(niveles)
p <- ggplot(df, aes(x = zona, y = preciom, fill = zona)) +
geom_boxplot() +
labs(title = "Distribución de precios por zona y tipo",
x = "Zona",
y = "Precio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_manual(values = colores_aleatorios)
ggplotly(p)
Hipótesis 1: Si hacemos una agrupación por zona y tipo vamos a reducir los valores atipicos.
niveles <- length(unique(df$zona_tipo))
colores_aleatorios <- grDevices::rainbow(niveles)
p <- ggplot(df, aes(x = zona_tipo, y = preciom, fill = zona_tipo)) +
geom_boxplot() +
labs(title = "Distribución de precios por zona y tipo",
x = "Zona/Tipo",
y = "Precio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_manual(values = colores_aleatorios)
ggplotly(p)
Hipótesis 1 Conclusión: Aunque mejoró en ciertas zonas vemos aun muchos valores a atípicos.
Hipótesis 2: Tendremos una mejor distribución de los datos si agrupamos por zona, tipo y estrato.
niveles <- length(unique(df$zona_tipo_estrato))
colores_aleatorios <- grDevices::rainbow(niveles)
p <- ggplot(df, aes(x = zona_tipo_estrato, y = preciom, fill = zona_tipo_estrato)) +
geom_boxplot() +
labs(title = "Distribución de precios por zona, tipo y estrato",
x = "Zona/Tipo/Estrato",
y = "Precio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_manual(values = colores_aleatorios)
ggplotly(p)
Hipótesis 2 Conclusión: Aun que ya vamos viendo mejorías en la distribución de los datos. Creo que se puede mejorar la data no haciendo el análisis por todo el precio, sino por el precio del metro cuadrado.
Hipótesis 3: Al sacar los precios pro metro cuadrado y agruparlos por zona, tipo y estrato vamos a tener una mejor distribución de los datos.
df$precioMetro2 <- round(df$preciom / df$areaconst, 4)
niveles <- length(unique(df$zona_tipo_estrato))
colores_aleatorios <- grDevices::rainbow(niveles)
p <- ggplot(df, aes(x = zona_tipo_estrato, y = precioMetro2, fill = zona_tipo_estrato)) +
geom_boxplot() +
labs(title = "Distribución de precios metro cuadrado por zona, tipo y estrato",
x = "Zona/Tipo/Estrato",
y = "Precio metro cuadrado") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_manual(values = colores_aleatorios)
ggplotly(p)
Hipótesis 3 Conclusión: Ya vemos una mejor distribución de los datos, con menos datos atípicos.
Hipótesis 4: Si eliminamos los datos atípicos de la data vamos a tener datos suficientes para hacer un buen análisis de precios.
print(paste("Numero de filas antes de eliminar atípicos: ", nrow(df)))
## [1] "Numero de filas antes de eliminar atípicos: 8327"
quitar_outliers <- function(x) {
Q1 <- quantile(x$precioMetro2, 0.25)
Q3 <- quantile(x$precioMetro2, 0.75)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
df_filtrado <- x %>% filter(precioMetro2 >= lower_bound & precioMetro2 <= upper_bound)
return(df_filtrado)
}
df_sin_outliers <- df %>%
group_by(zona_tipo_estrato) %>%
group_modify(~ quitar_outliers(.x)) %>%
filter(n() > 10) %>%
ungroup()
cat("Numero de filas antes de eliminar atípicos:", nrow(df_sin_outliers), "\n")
## Numero de filas antes de eliminar atípicos: 8113
cat("Diferencia:", nrow(df) - nrow(df_sin_outliers), "\n")
## Diferencia: 214
cat("Porcentage:", round(nrow(df_sin_outliers) / nrow(df), digits = 2 ) * 100, "%\n")
## Porcentage: 97 %
niveles <- length(unique(df_sin_outliers$zona_tipo_estrato))
colores_aleatorios <- grDevices::rainbow(niveles)
p <- ggplot(df_sin_outliers, aes(x = zona_tipo_estrato, y = precioMetro2, fill = zona_tipo_estrato)) +
geom_boxplot() +
labs(title = "Distribución de precios metro cuadrado por zona, tipo y estrato",
x = "Zona/Tipo/Estrato",
y = "Precio metro cuadrado") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
scale_fill_manual(values = colores_aleatorios)
ggplotly(p)
resumen_grupo_zona <- df %>%
group_by(zona_tipo_estrato) %>%
#filter(n() > 1) %>%
summarise(
count = n(),
promedio_precio = mean(precioMetro2),
mediana_precio = median(precioMetro2),
min_precio = min(precioMetro2),
max_precio = max(precioMetro2),
skewness = skewness(precioMetro2),
kurtosis = kurtosis(precioMetro2)
)
datatable(resumen_grupo_zona, options = list(pageLength = 10))
## NULL
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Hipótesis 4 Conclusión: Ya con los datos de esta manera podemos tener una data con la que podemos trabajar para calcular los precios y nos permite simplificar el número de variables e ignorar baños, habitaciones y parqueadores.
t <- aggregate(list(Precio = df_sin_outliers$preciom), list(Zonas = df_sin_outliers$zona), FUN=median)
datatable(t, options = list(pageLength = 10, order = list(list(2, 'desc'))))
t <- aggregate(list(Precio_metro_cuadrado = df_sin_outliers$precioMetro2), list(Zonas = df_sin_outliers$zona), FUN=median)
t$Precio_metro_cuadrado <- round(t$Precio_metro_cuadrado, 2)
datatable(t, options = list(pageLength = 10, order = list(list(2, 'desc'))))
El nicho de mercado para la inmobiliaria debes ser claramente la venta de apartamentos en las zonas oeste, zona sur y zona norte. La zona oriente y zona centro son de baja liquidez de inmuebles, precios mas bajos que los demás especialmente la zona oriente, además esta ultima con algunos barrios con complicaciones en la seguridad.
t <- aggregate(list(Precio_metro_cuadrado = df_sin_outliers$precioMetro2), list(Zonas = df_sin_outliers$zona_tipo_estrato), FUN=median)
t$Precio_metro_cuadrado <- round(t$Precio_metro_cuadrado, 2)
datatable(t, options = list(pageLength = 10, order = list(list(2, 'desc'))))
Para definir los precios responder las siguientes preguntas: