Introducción

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.

Objetivos

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Tabs de navegación

Limpieza y normalización

Limpieza de datos

Metodologia

A continuación vamos a ejecutar las siguientes acciones

  1. Remover filas vacías: En esta paso las filas que no contengan valores se van a remover.
  2. Normalización de los datos: En este paso vamos a garantizar que cada variable del set de datos no tengan valores que siendo iguales, parezcan diferentes al estar escritos con mayúscula, minúscula o sinónimos. Ej: Apato, Apartamento, apartamento.
  3. Imputación de datos: Vamos a encontrar varios datos vacíos especialmente en las variables piso y paquea, para estos valores vamos a usar la moda para rellenar los valores cuyo valor sea NA.

Remover filas vacias:

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

Normalización

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

Variable Parquea:

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:

  1. Para estratos 1, 2, 3, 4 y tipo CASA o APARTAMENTO, parquea = 1
  2. Para estrato 6 y tipo es CASA o APARTAMENTO, parquea = 2
  3. Para estrato 5 y tipo es Casa, parquea = 2
  4. Para estrato 5 y tipo es APARTAMENTO, parquea = 1
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

Variable barrios:

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 = "_")

Discución

Diagramas de cajas

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.

Resultados

Precio de las viviendas en diferentes zonas de Cali.

Tabla mediana de precios por zona

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'))))

Tabla mediana de precios metro cuadrado por zona

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'))))

Tipo de viviendas más ofertadas en Cali.

Características más relevantes de la oferta de vivienda en Cali

Conclusiones

Definir su nicho de mercado.

Información relevante

  • La zona con mayor liquidez es la zona sur, comos se pudo observar en el gráfico, Cantidad de viviendas por zona.
  • Los apartamentos son los mas líquidos, especialmente en los estratos 5, 4 y 6 en ese orden respectivamente. Como se ve en el gráfico Cantidad de viviendas por zona y tipo.
  • El top 3 de área construida por zona esta en el estrato 6 en las zonas sur, norte y oeste.
  • El mayor precio por metro cuadrado esta en la zona oeste seguido de la zona sur y la zona norte. Como se muestra en la Tabla mediana de precios metro cuadrado por zona.
  • Los valores totales de los inmuebles esta en la zona oeste, seguido de la zona sur y zona norte. Como se muestra en la Tabla mediana de precios por zona.
  • El tipo de casa mas ofertada es de 3 habitaciones como se muestra en la gráfica Cantidad de inmuebles por Número de Habitaciones en Cada Zona.

Nicho de mercado

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.

Desarrollar estrategias de marketing

  1. Se recomienda tener 2 vendedores especializados en el estrato 6, uno que atienda la zona sur exclusivamente y el otro que atienda la zona oeste y norte. Estos vendedores deben de tener un perfil especial para poder vender las casas de mayor valor y llegar al cliente objetivo.
  2. Se recomienda tener vendedores por zonas para atender los otros estratos, donde al menos 4 vendedores atiendan la zona sur y 4 vendedores zona Oeste y norte.
  3. La inmobiliaria debe tener un plan de visitas/llamadas, los vendedores deben ingresar la mayor cantidad de inmuebles a la oferta de la compañía.
  4. Los datos de la base de datos se deben revisar al menos cada dos meses para

Establecer precios de venta

Tabla precios metro cuadrado por zona-tipo-estrato

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:

  1. ¿Cuantos metros cuadrados tiene el inmueble?
  2. ¿Donde esta ubicado el inmueble? Zona Oeste, Zona Sur, Zona Norte.
  3. ¿Qué tipo del inmueble es? CASA o APARTAMENTO.
  4. ¿En que estrato está? 1, 2, 3, 4, 5 o 6.
  5. Se busca en la Tabla precios metro cuadrado por zona-tipo-estrato
  6. Se multiplica el valor por metro cuadrado encontrado en la tabla por los metros cuadrados. Esto nos da el valor aproximado del inmueble.