1. Introducción.

El presente documento es un informe estadístico descriptivo presentado a la empresa B&C (Bienes y Casas) construido a partir de la base de datos de propiedades inmobiliarias en la ciudad de Cali, recogida por la misma empresa. Debido a su naturaleza descriptiva, el fin de este informe está centrado en mejorar la comprensión del mercado inmobiliario en la ciudad, hacer recomendaciones sobre el manejo de los datos y generar recomendaciones de posibles nichos de mercado que puedan interesar a la empresa. En este sentido, la realización de modelos predictivos sobre el comportamiento futuro del mercado excede el alcance del trabajo presentado, sin embargo, las recomendaciones que se realizan sí se orientan a optimizar los recursos de campañas de mercadeo para que su alcance sea más eficiente y llegue los clientes adecuados. La base de datos aquí trabajada cuenta con 8.330 observaciones o propiedades descritas, que luego del proceso de limpieza de la base se reducen a 3.319, y 13 variables que se dividen en:

  1. ID: Número único para cada propiedad.

  2. Zona: Sector cardinal de la ciudad en la que se encuentra la propiedad.

  3. Estrato: Estrato socioeconómico de la propiedad.

  4. Precio: Valor en millones de pesos colombianos de la propiedad.

  5. Área construida en metros cuadrados.

  6. Parqueaderos: Número de estacionamientos con que cuenta la propiedad.

  7. Baños: Número de baños con los que cuenta la propiedad.

  8. Habitaciones: Número de habitaciones de la propiedad.

  9. Tipo: Si la vivienda es una Casa o un Apartamento. No se incluyen propiedades comerciales.

  10. Barrio donde se ubica la propiedad.

  11. Longitud.

  12. Latitud.

Aunque este informe no trabaja directamente con las coordenadas (Longitud y Latitud) estas variables no fueron eliminadas para que sean utilizadas en futuras labores de mapeo y cartografía. El ejercicio de análisis fue realizado utilizando el lenguaje de programación R y el programa R-Studio, ambas herramientas especializadas en el manejo de datos y el análisis estadístico. A continuación, se presenta la estructura del informe: (1) Objetivos, donde se delimitan tres objetivos claros del informe, (2) Presentación general de los métodos de limpieza y análisis de la base de datos suministrada, (3) Resultados, donde se expone la información extraída de manera clara, (4) La discusión donde se dan las principales recomendaciones en términos de mercadeo para la empresa y (6) Las conclusiones donde se recogen los principales hallazgos y recomendaciones para la empresa.

library(htmltools)
library(paqueteMETODOS)
library(janitor)
library(tidyverse)
library(dplyr)
library(kableExtra)
library(ggplot2)
library(plotly)
Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
#Generamos el DS con el que vamos a trabajar
data(vivienda_faltantes)

2. Objetivos

En esta sección se presentan los tres objetivos concretos con los que se desarrolló el análisis de los datos. Este no se trata de un informe especializado en mercadeo, sin embargo sus hallazgos son insumo para esta tarea y se realizan sugerencias en ese sentido.

  1. Describir el comportamiento general de los valores de las viviendas en la ciudad de Cali, relacionando el dato con la ubicación de la propiedad.

  2. Identificar las viviendas con mayor oferta en la ciudad; su tipo, ubicación y características principales.

  3. Generar sugerencias generales de mercadeo como la definición de un nicho de mercado, posibles estrategias de marketing y sugerencias de servicios especializados a clientes.

3. Métodos

I. Análisis exploratorio

En la primera etapa del proceso de datos se exploró de manera superficial los datos, reconociendo el tipo y número de variables, algunos de los datos que contiene e identificar si las variables categóricas estaban estandarizadas:

#exploración inicial de los datos
str(vivienda_faltantes)
## spc_tbl_ [8,330 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id       : num [1:8330] 8312 8311 8307 8296 8297 ...
##  $ zona     : chr [1:8330] "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
##  $ piso     : num [1:8330] 4 1 NA 2 NA NA 2 NA NA 2 ...
##  $ estrato  : num [1:8330] 6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : num [1:8330] 1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num [1:8330] 318 300 800 150 112 390 125 280 74 120 ...
##  $ parquea  : num [1:8330] 2 1 4 1 2 8 2 4 1 2 ...
##  $ banios   : num [1:8330] 4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : num [1:8330] 2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr [1:8330] "Apartamento" "Casa" "Casa" "Casa" ...
##  $ barrio   : chr [1:8330] "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num [1:8330] -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num [1:8330] 3454 3454 3455 3417 3408 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   zona = col_character(),
##   ..   piso = col_double(),
##   ..   estrato = col_double(),
##   ..   preciom = col_double(),
##   ..   areaconst = col_double(),
##   ..   parquea = col_double(),
##   ..   banios = col_double(),
##   ..   habitac = col_double(),
##   ..   tipo = col_character(),
##   ..   barrio = col_character(),
##   ..   longitud = col_double(),
##   ..   latitud = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
glimpse(vivienda_faltantes)
## Rows: 8,330
## Columns: 13
## $ id        <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona      <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso      <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato   <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom   <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea   <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, NA, 2, NA, 1, 2, 2, 2, 4, 1…
## $ banios    <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac   <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo      <chr> "Apartamento", "Casa", "Casa", "Casa", "Casa", "Casa", "Apar…
## $ barrio    <chr> "arboleda", "normandía", "miraflores", "el guabal", "bella s…
## $ longitud  <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud   <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …
head(vivienda_faltantes)
## # A tibble: 6 × 13
##      id zona        piso estrato preciom areaconst parquea banios habitac tipo  
##   <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr> 
## 1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apart…
## 2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa  
## 3  8307 Zona Oeste    NA       5    1200       800       4      7       5 Casa  
## 4  8296 Zona Sur       2       3     220       150       1      2       4 Casa  
## 5  8297 Zona Oeste    NA       5     330       112       2      4       3 Casa  
## 6  8298 Zona Sur      NA       5    1350       390       8     10      10 Casa  
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
tail(vivienda_faltantes)
## # A tibble: 6 × 13
##      id zona        piso estrato preciom areaconst parquea banios habitac tipo  
##   <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr> 
## 1  8313 Zona Oeste     7       6     525       137       2      3       3 Apart…
## 2  8314 Zona Oeste     7       6    1400       210       3      4       3 Apart…
## 3  8315 Zona Oeste    NA       6     620       167       2      4       4 Apart…
## 4  8316 Zona Norte     7       5     400       220       1      4       4 Apart…
## 5  8317 Zona Oeste    NA       6    1100       290       4      4       3 Apart…
## 6  8318 Zona Norte    NA       4     580       295       2      5       5 Casa  
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
#revisión de variables de texto
unique(vivienda_faltantes$tipo)
## [1] "Apartamento" "Casa"        "APARTAMENTO" "casa"        "CASA"       
## [6] "apto"        NA
unique(vivienda_faltantes$barrio)
##   [1] "arboleda"                      "normandía"                    
##   [3] "miraflores"                    "el guabal"                    
##   [5] "bella suiza alta"              "bella suiza"                  
##   [7] "valle del lili"                "el nacional"                  
##   [9] "santa teresita"                "aguacatal"                    
##  [11] "bellavista"                    "el peñon"                     
##  [13] "la riverita"                   "miradol del aguacatal"        
##  [15] "terrón colorado"               "mel√©ndez"                    
##  [17] "guadalupe"                     "cristales"                    
##  [19] "la arboleda"                   "brisas de guadalupe"          
##  [21] "el refugio"                    "altos de guadalupe"           
##  [23] "seminario"                     "guadalupe alto"               
##  [25] "pampalinda"                    "cuarto de legua"              
##  [27] "cerros de guadalupe"           "normandia"                    
##  [29] "normandía west point"          "el gran limonar"              
##  [31] "la cascada"                    "puente palma"                 
##  [33] "prados del sur"                "nueva tequendama"             
##  [35] "brisas de los"                 "urbanización las cascadas"    
##  [37] "sector cañaveralejo guadalupe" "santa rita"                   
##  [39] "san pedro"                     "santa isabel"                 
##  [41] "caney"                         "los cristales"                
##  [43] "los cristales club"            "cerro cristales"              
##  [45] "caldas"                        "alto jordán"                  
##  [47] "refugio"                       "napoles"                      
##  [49] "el lido"                       "colinas del sur"              
##  [51] "altos de santa"                "acopi"                        
##  [53] "san fernando"                  "el jordán"                    
##  [55] "pance"                         "centenario"                   
##  [57] "bosques de alboleda"           "bochalema"                    
##  [59] "tejares cristales"             "ciudad jardín"                
##  [61] "tequendama"                    "san joaquin"                  
##  [63] "urbanización tequendama"       "urbanizacion lili"            
##  [65] "tejares de san"                "san fernando viejo"           
##  [67] "mamellan"                      "san fernando nuevo"           
##  [69] "el limonar"                    "camino real"                  
##  [71] "tequendema"                    "mayapan las vegas"            
##  [73] "ciudad meléndez"              "alferez real"                 
##  [75] "el ingenio ii"                 "gran limonar"                 
##  [77] "francisco eladio ramirez"      "san cayetano"                 
##  [79] "ciudad real"                   "capri"                        
##  [81] "parcelaciones pance"           "villa del prado"              
##  [83] "ciudad capri"                  "el ingenio"                   
##  [85] "san antonio"                   "las vegas"                    
##  [87] "la campiña"                    "el bosque"                    
##  [89] "sierras de normandía"          "el ingenio i"                 
##  [91] "san vicente"                   "salomia"                      
##  [93] "eucarístico"                   "menga"                        
##  [95] "los cámbulos"                  "la floresta"                  
##  [97] "chipichape"                    "cambulos"                     
##  [99] "templete"                      "ciudad jardin"                
## [101] "multicentro"                   "melendez"                     
## [103] "juanamb√∫"                     "campestre"                    
## [105] "santa anita"                   "los libertadores"             
## [107] "los cambulos"                  "libertadores"                 
## [109] "departamental"                 "el cedro"                     
## [111] "calicanto"                     "quintas de don"               
## [113] "santa mónica residencial"      "san nicolas"                  
## [115] "primero de mayo"               "panamericano"                 
## [117] "junín"                         "la hacienda"                  
## [119] "champagnat"                    "benjamín herrera"             
## [121] "alameda"                       "el troncal"                   
## [123] "san bosco"                     "el prado"                     
## [125] "pacará"                        "ciudadela pasoancho"          
## [127] "nueva floresta"                "ingenio i"                    
## [129] "ciudadela paso ancho"          "ciudad córdoba"               
## [131] "la merced"                     "granada"                      
## [133] "colseguros"                    "las quintas de"               
## [135] "santa mónica"                  "santa mónica alta"            
## [137] "centro"                        "ed benjamin herrera"          
## [139] "santa monica residencial"      "san luís"                     
## [141] "unicentro cali"                "el ingenio iii"               
## [143] "prados del norte"              "pasoancho"                    
## [145] "bretaña"                       "villas de veracruz"           
## [147] "versalles"                     "flora industrial"             
## [149] "cañasgordas"                   "bosques del limonar"          
## [151] "vipasa"                        "urbanización la flora"        
## [153] "urbanización barranquilla"     "santo domingo"                
## [155] "santa monica"                  "santa mónica popular"         
## [157] "santa monica norte"            "los andes"                    
## [159] "jorge isaacs"                  "el jardín"                    
## [161] "guayaquil"                     "la flora"                     
## [163] "colinas del bosque"            "ciudad 2000"                  
## [165] "la buitrera"                   "berlin"                       
## [167] "alamos"                        "santa"                        
## [169] "santa monica popular"          "popular"                      
## [171] "flora"                         "ciudad bochalema"             
## [173] "urbanización colseguros"       "prados del limonar"           
## [175] "villa del lago"                "urbanización la nueva"        
## [177] "La Hacienda"                   "cataya real"                  
## [179] "villa del sur"                 "urbanización san joaquin"     
## [181] "el trébol"                    "Santo Domingo"                
## [183] "la portada al"                 "poblado campestre"            
## [185] "las delicias"                  "las ceibas"                   
## [187] "jamundi"                       "jamundi alfaguara"            
## [189] "colseguros andes"              "calipso"                      
## [191] "villa de veracruz"             "torres de comfandi"           
## [193] "puente del comercio"           "paso del comercio"            
## [195] "oasis de pasoancho"            "Los Guaduales"                
## [197] "los alcazares"                 "las vegas de"                 
## [199] "el dorado"                     "ciudadela melendez"           
## [201] "ciudad pacifica"               "Ciudad Pacifica"              
## [203] "Bueno Madrid"                  "alcazares"                    
## [205] "hacienda alferez real"         "ciudad antejardin"            
## [207] "las camelias"                  "colinas de menga"             
## [209] "altos de menga"                "las granjas"                  
## [211] "santa elena"                   "palmas del ingenio"           
## [213] "junin"                         "la independencia"             
## [215] "cristóbal colón"               "aranjuez"                     
## [217] "santa rosa"                    "samanes"                      
## [219] "samanes de guadalupe"          "los guaduales"                
## [221] "los alcázares"                 "laflora"                      
## [223] "ingenio"                       "cañaverales"                  
## [225] "Brisas De Los"                 "alborada"                     
## [227] "san judas"                     "cañaverales los samanes"      
## [229] "ciudadela comfandi"            "santa helena de"              
## [231] "caney especial"                "aguablanca"                   
## [233] "la alborada"                   "urbanización boyacá"          
## [235] "las américas"                 "la morada"                    
## [237] "urbanización la merced"        "simón bolivar"                
## [239] "porvenir"                      "calicanto viii"               
## [241] "Cali"                          "ciudad modelo"                
## [243] "valle de lili"                 "prados de oriente"            
## [245] "la fortaleza"                  "ciudad córdoba reservado"     
## [247] "rincon de la"                  "san carlos"                   
## [249] "rafael uribe uribe"            "ciudad los alamos"            
## [251] "centelsa"                      "manzanares"                   
## [253] "las acacias"                   "la esmeralda"                 
## [255] "Santa Anita"                   "unión de vivienda"            
## [257] "santa fe"                      "chapinero"                    
## [259] "belalcazar"                    "atanasio girardot"            
## [261] "rincón de salomia"             "riveras del valle"            
## [263] "ciudad del campo"              "alameda del rio"              
## [265] "ciudad cordoba"                "conjunto gibraltar"           
## [267] "la selva"                      "villa colombia"               
## [269] "los parques barranquilla"      "fuentes de la"                
## [271] "ciudad universitaria"          "portales de comfandi"         
## [273] "pacara"                        "metropolitano del norte"      
## [275] "villa del sol"                 "calima"                       
## [277] "los robles"                    "guaduales"                    
## [279] "floralia"                      "chiminangos"                  
## [281] "la base"                       "base aérea"                  
## [283] "oasis de comfandi"             "la villa del"                 
## [285] "portada de comfandi"           "urbanizacion el saman"        
## [287] "lares de comfenalco"           "chiminangos 2 etapa"          
## [289] "santa bárbara"                 "parque residencial el"        
## [291] "chiminangos 1 etapa"           "bloques del limonar"          
## [293] "siete de agosto"               "la nueva base"                
## [295] "la rivera ii"                  "la rivera"                    
## [297] "ceibas"                        "la rivera i"                  
## [299] "quintas de salomia"            "la ceibas"                    
## [301] "jorge eliecer gaitán"          "alfonso lópez i"              
## [303] "comfenalco"                    "ciudad country"               
## [305] "Colseguros Andes"              "marroquín iii"                
## [307] "ciudadela del río"             "zona oeste"                   
## [309] "ciudad talanga"                "zona sur"                     
## [311] "jose manuel marroquín"         "nápoles"                      
## [313] "alfonso lópez"                 "zona oriente"                 
## [315] "zona norte"                    "alfonso lopez"                
## [317] "gaitan"                        "calimio norte"                
## [319] "urbanización pacara"           "barrio 7de agosto"            
## [321] "calibella"                     "brisas del guabito"           
## [323] "el guabito"                    "arboledas"                    
## [325] "los guayacanes"                "ciudad los álamos"            
## [327] "primitivo crespo"              "fonaviemcali"                 
## [329] "Villa Del Prado"               "san luis"                     
## [331] "Prados Del Norte"              "la riviera"                   
## [333] "nueva base"                    "Chiminangos"                  
## [335] "norte"                         "paseo de los"                 
## [337] "barranquilla"                  "villa del parque"             
## [339] "zona residencial"              "La Flora"                     
## [341] "Villas De Veracruz"            "los alamos"                   
## [343] "la alianza"                    "pampa linda"                  
## [345] "zona norte los"                "alameda del río"              
## [347] "el vallado"                    "fenalco kennedy"              
## [349] "el paraíso"                    "evaristo garcía"              
## [351] "san juan bosco"                "el sena"                      
## [353] "cañaveralejo"                  "el caney"                     
## [355] "antonio nariño"                "Santafe"                      
## [357] "belisario caicedo"             "el diamante"                  
## [359] "morichal de comfandi"          "el rodeo"                     
## [361] "barrio tranquilo y"            "sameco"                       
## [363] "la gran colombia"              "municipal"                    
## [365] "primavera"                     "fepicol"                      
## [367] "la primavera"                  "20 de julio"                  
## [369] "santander"                     "saavedra galindo"             
## [371] "rep√∫blica de israel"          "cali bella"                   
## [373] "bolivariano"                   "urbanización río lili"        
## [375] "Valle Del Lili"                "brisas del limonar"           
## [377] "barrio el recuerdo"            "agua blanca"                  
## [379] "san joaquín"                   "boyacá"                       
## [381] "mariano ramos"                 "zona centro"                  
## [383] "cali canto"                    "Ciudad 2000"                  
## [385] "San Fernando"                  "arboleda campestre candelaria"
## [387] "barrio obrero"                 "Belalcazar"                   
## [389] "cristobal colón"               "la libertad"                  
## [391] "san judas tadeo"               "colon"                        
## [393] "El Caney"                      "valle grande"                 
## [395] "san nicolás"                   "el ingenio 3"                 
## [397] "norte la flora"                "ciudad jardin pance"          
## [399] "ponce"                         "Ciudad Jardín"                
## [401] "urbanizacion gratamira"        "Prados Del Limonar"           
## [403] "El Bosque"                     "ingenio ii"                   
## [405] "El Ingenio"                    "Santa Monica"                 
## [407] "buenos aires"                  "cascajal"                     
## [409] "Pance"                         "Quintas De Don"               
## [411] "la reforma"                    "compartir"                    
## [413] "autopista sur"                 "sector aguacatal"             
## [415] "el castillo"                   "occidente"                    
## [417] "juanambu"                      "santa anita sur"              
## [419] "alf√©rez real"                 "barrio eucarístico"           
## [421] "Centenario"                    "rozo la torre"                
## [423] "los jockeys"                   "3 de julio"                   
## [425] "farrallones de pance"          "Camino Real"                  
## [427] "la playa"                      "Miraflores"                   
## [429] "ciudad melendez"               "lourdes"                      
## [431] "urbanización nueva granada"    "Santa Isabel"                 
## [433] "los farallones"                "bajo aguacatal"               
## [435] "Santa Teresita"                "la luisa"                     
## [437] NA
unique(vivienda_faltantes$zona)
## [1] "Zona Oeste"   "Zona Sur"     "Zona Norte"   "Zona Oriente" "Zona Centro" 
## [6] NA

Luego de esta verificación se identificó que era necesario estandarizar la variable de “Tipo” pues había opciones diferenciadas por la escritura en mayúscula y minúscula y abreviaturas como ‘apto’ para Apartamento. En este punto es importante realizar una primera recomendación frente al registro de los datos, esto es, tener un protocolo estandarizado para el registro en la base de datos, procurando que las variables de texto sean todas incluidas en minúscula y sin abreviaturas.

De este primer análisis también se encontraron algunos datos faltantes y se reconoce la posibilidad de que existan datos duplicados, para lo que se generan dos vectores que resuman estos dos grupos de datos:

#Identificación de datos faltantes
faltantes1 <- colSums(is.na(vivienda_faltantes)) %>% #generamos un vector que contabilice las variables faltantes
  as.data.frame()
#Identificación de datos duplicados
get_dupes(vivienda_faltantes,id) 
## # A tibble: 19 × 14
##       id dupe_count zona   piso estrato preciom areaconst parquea banios habitac
##    <dbl>      <int> <chr> <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl>
##  1    NA          3 <NA>     NA      NA      NA        NA      NA     NA      NA
##  2    NA          3 <NA>     NA      NA      NA        NA      NA     NA      NA
##  3    NA          3 <NA>     NA      NA     330        NA      NA     NA      NA
##  4  8309          2 Zona…     5       4     150        56      NA      1       2
##  5  8309          2 Zona…     5       4     150        56      NA      1       2
##  6  8310          2 Zona…     1       6    1600       463       4      6       3
##  7  8310          2 Zona…     1       6    1600       463       4      6       3
##  8  8313          2 Zona…     7       6     525       137       2      3       3
##  9  8313          2 Zona…     7       6     525       137       2      3       3
## 10  8314          2 Zona…     7       6    1400       210       3      4       3
## 11  8314          2 Zona…     7       6    1400       210       3      4       3
## 12  8315          2 Zona…    NA       6     620       167       2      4       4
## 13  8315          2 Zona…    NA       6     620       167       2      4       4
## 14  8316          2 Zona…     7       5     400       220       1      4       4
## 15  8316          2 Zona…     7       5     400       220       1      4       4
## 16  8317          2 Zona…    NA       6    1100       290       4      4       3
## 17  8317          2 Zona…    NA       6    1100       290       4      4       3
## 18  8318          2 Zona…    NA       4     580       295       2      5       5
## 19  8318          2 Zona…    NA       4     580       295       2      5       5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
duplicados1 = vivienda_faltantes[duplicated(vivienda_faltantes), ] #Creamos un vector sólo con las observaciones repetidas

Con estos datos organizados se reconocen 3 registros completamente vacíos y la falta de datos en dos variables específicas; en el número de pisos faltan 2.641 datos y en el número de parqueaderos faltan 1.606 datos. Adicionalmente, se identifican 8 observaciones repetidas, sin tener en cuenta los datos faltantes. En la siguiente etapa se propone una estrategia para manejar este problema.

II. Limpieza de datos

Para iniciar el proceso de limpieza se crea una nueva base que será manipulada para tener los datos listos para el análisis, esta nueva base se organiza teniendo en cuenta el ID de manera descendente y se corrige el nombre de la variable “banios” a “banos”.

#Organizamos los datos según el id
base1 = arrange(vivienda_faltantes,id) 
#Cambiar nombre variable erronea: Baños
base1 = base1 %>% 
  rename(banos = banios)

En la exploración de datos también se identificó que la variable “estrato” estaba identificada sólo como un número, sin embargo, debido a que los estratos socioeconómicos son una variable con carácter jerárquico se modifican a tipo “factor” y se corrige el orden de la escala.

#Transformamos la variable estrato en factor para denotar la jerarquía
base1$estrato <- as.factor(base1$estrato) 
levels(base1$estrato) 
## [1] "3" "4" "5" "6"
base1$estrato <- factor((base1$estrato), levels = c("6","5","4","3")) #Verificar  y corregir el orden sea correcto

Para estandarizar los datos de tipo texto (tipo, zona y barrio) se transforman todas las observaciones a minúsculas. También se reemplazan las entradas de “tipo” realizadas a manera de abreviatura.

#Estandarizar valores de tipo character
base1$tipo <- tolower(base1$tipo)#Pasamos todas las observaciones a minúscula
base1$zona <- tolower(base1$zona)
base1$barrio <- tolower(base1$barrio)
base1$tipo <- ifelse(base1$tipo == "apto", "apartamento", base1$tipo)

A continuación, se realiza el manejo de variables faltantes y duplicadas, se crean nuevamente vectores con estos valores, esta vez a partir de la base que se está manipulando para verificar los cambios en la misma de forma más sencilla. Se eliminan los valores duplicados y las 3 observaciones completamente vacías.

#Manejo de observaciones con información faltante
#Se identifica que es necesario eliminar las que no tienen datos en la variable ID pues están vacías
#Identificación de datos faltantes
faltantes2 <- colSums(is.na(base1)) %>% #generamos un vector que contabilice las variables faltantes
  as.data.frame()
base1 = base1 %>% 
  drop_na(id)

#Manejo de observaciones duplicadas
get_dupes(base1,id) 
## # A tibble: 16 × 14
##       id dupe_count zona    piso estrato preciom areaconst parquea banos habitac
##    <dbl>      <int> <chr>  <dbl> <fct>     <dbl>     <dbl>   <dbl> <dbl>   <dbl>
##  1  8309          2 zona …     5 4           150        56      NA     1       2
##  2  8309          2 zona …     5 4           150        56      NA     1       2
##  3  8310          2 zona …     1 6          1600       463       4     6       3
##  4  8310          2 zona …     1 6          1600       463       4     6       3
##  5  8313          2 zona …     7 6           525       137       2     3       3
##  6  8313          2 zona …     7 6           525       137       2     3       3
##  7  8314          2 zona …     7 6          1400       210       3     4       3
##  8  8314          2 zona …     7 6          1400       210       3     4       3
##  9  8315          2 zona …    NA 6           620       167       2     4       4
## 10  8315          2 zona …    NA 6           620       167       2     4       4
## 11  8316          2 zona …     7 5           400       220       1     4       4
## 12  8316          2 zona …     7 5           400       220       1     4       4
## 13  8317          2 zona …    NA 6          1100       290       4     4       3
## 14  8317          2 zona …    NA 6          1100       290       4     4       3
## 15  8318          2 zona …    NA 4           580       295       2     5       5
## 16  8318          2 zona …    NA 4           580       295       2     5       5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
duplicados2 = base1[duplicated(base1), ] #Creamos un vector sólo con las observaciones repetidas
base1 = unique(base1) #Se excluyen las observaciones duplicadas

Como recomendación de manejo de los datos se pide a la empresa designar personal que verifique de manera periódica la existencia de valores duplicados o registros que hayan quedado guardados sin datos.

Después de la limpieza de las observaciones sin ningún registro queda pendiente el manejo de los datos faltantes en las variables “piso” y “parquea”.

Para la variable parquea se genera un vector que muestra solamente los tipos de vivienda y el número de parqueaderos, para analizar cuáles son los casos sin el dato parqueadero, debido a que esto sucede en ambos tipos de vivienda se toma la decisión de asumir que los apartamentos que no registran parqueadero pertenecen a apartamentos en conjuntos residenciales donde los propietarios no tienen un parqueadero designado, sino que se trata de un parqueadero comunitario donde los puestos se llenan según la llegada de vehículos. En ese orden de ideas, se reemplazan las observaciones sin datos en la variable parqueadero por el valor 0, en los casos que son parqueaderos.

En cuanto a la variable piso se hace un proceso similar, generando un vector que permita visualizar los casos en que no se registra el número del piso de la propiedad, también sucede en casas y apartamentos. En este caso se asume que los casos en los que faltan datos y el tipo de vivienda es una casa, se trata de casas de un solo piso, por lo que los datos faltantes se reemplazan por 1.

#El siguiente caso de datos faltantes es en "piso" y "parqueadero"
tipo_parqueo = base1 %>% 
  select(tipo,parquea)

tipo_sin_parqueo = base1$tipo == "apartamento" & is.na(base1$parquea)
base1$parquea = ifelse(tipo_sin_parqueo, 0, base1$parquea)

#Puede ser que en los casos sin "Piso" se trate de casas de un sólo piso
tipo_piso = base1 %>% #Verificamos que todos los NA de piso sean casas. No lo son
  select(piso,tipo)
#Hay que reemplazar los casos en que sean casas sin piso por 1
tipo_sin_piso <- base1$tipo == "casa" & is.na(base1$piso)
base1$piso <- ifelse(tipo_sin_piso, 1, base1$piso)

view(faltantes2)
view(duplicados2)

Después de realizar este procedimiento los datos faltantes en la variable parquea pasaron de 1.606 a 734, mientras que los valores faltantes en piso pasaron de 2.641 a 1.381.

#Manejo de observaciones con información faltante
#Se identifica que es necesario eliminar las que no tienen datos en la variable ID pues están vacías
#Identificación de datos faltantes
faltantes2 <- colSums(is.na(base1)) %>% #generamos un vector que contabilice las variables faltantes
  as.data.frame()
base1 = base1 %>% 
  drop_na(id)

#Manejo de observaciones duplicadas
get_dupes(base1,id) 
## # A tibble: 0 × 14
## # ℹ 14 variables: id <dbl>, dupe_count <int>, zona <chr>, piso <dbl>,
## #   estrato <fct>, preciom <dbl>, areaconst <dbl>, parquea <dbl>, banos <dbl>,
## #   habitac <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
duplicados2 = base1[duplicated(base1), ] #Creamos un vector sólo con las observaciones repetidas
base1 = unique(base1) #Se excluyen las observaciones duplicadas

Hasta este punto de la limpieza la base pasó de tener 8.330 registros a 8.319, sin duplicados ni registros vacíos. Para finalizar el proceso de limpieza se examinarán los datos atípicos o outliers en lo referente a los valores de las propiedades, con este fin se genera un gráfico de caja y alambres o boxplot como estrategia para visualizar los casos más extremos.

#Limpieza de datos atípicos (Outliers)
base1 %>% 
  ggplot(aes(preciom)) + 
  geom_boxplot() +
  theme_bw()+
  scale_x_continuous(breaks = seq(0, 2000, by = 250))+
  labs(x = "Valor de las propiedades en millones",
       y = NULL,
       title = "Distribución del valor de las propiedades")

Al ver este gráfico es claro que los precios atípicos en la base se encuentran más allá de los 1.000 millones COP. Para el manejo de estos datos se generará una base principal con la que se harán los análisis de las propiedades hasta los 1.000 millones COP, con el objetivo de no afectar los indicadores de tendencia central ni dispersión.

#Creación de base principal
base_principal = base1 %>% 
  filter(preciom <= 1000)

Esto genera una base de 7.766 entradas. Con el fin de no perder los registros de propiedades de gran valor, se genera también una base con los datos atípicos.

#Creación de df de outliers o valores atípicos
base_outliers = base1 %>% 
  filter(preciom > 1000)

Esta nueva base tiene 553 entradas y puede ser considerada una fuente de información para clientes VIP. Esta propuesta se explora a profundidad más adelante.

III. Manipulación de datos

Para la manipulación de datos se generaron algunos sub-sets de los datos principales, con el objetivo de tener bases con variables diferenciadas para el trabajo de análisis de los datos. Primero, desde la base principal se crearon 3 bases. La primera (data_ubicacoc) con las variables id, zona, estrato, barrio, longitud y latitud reúne variables con características de ubicación, la segunda (data_caract), con las variables id, tipo, piso, areaconst, parquea, banos y habitac, reúne las características físicas de las propiedades, por último, la tercera base (data_precios) con las variables id, zona, estrato, areaconst, tipo, barrio, preciom reúne las características generales de las propiedades y el precio.

#Seleccionamos las variables con las que vamos a trabajar
#Creamos 3 vectores principales para analizar
data_ubicacion = base_principal %>%
  select(id, zona, estrato, barrio, longitud, latitud)
data_caract = base_principal %>% 
  select(id, tipo, piso, areaconst, parquea, banos, habitac)
data_precios = base_principal %>% 
  select(id, zona, estrato, areaconst, tipo, barrio, preciom)

Enseguida se generan otros sub-sets a partir de los datos de data_precios, pero diferenciando las entradas que corresponden a casas y a apartamentos.

#Creación de sub-set de casas y apartamentos
data_casa = data_precios %>% 
  filter(tipo == "casa")
data_apto = data_precios %>% 
  filter(tipo == "apartamento")

IV. Descripción y resumen de los datos

Para iniciar la descripción de los datos se visualizan preliminarmente indicadores de tendencia central y de dispersión de la base central, con particular interés en la variable de los precios, aunque también considerando el área construida. Se genera una tabla resumen de los principales indicadores para fácil visualización.

#Descubrimos los indicadores de posición, centralidad y varianza de los precios de las viviendas y otras variables
summary(base_principal$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   210.0   315.0   367.2   475.0  1000.0
sd(base_principal$preciom)
## [1] 212.1766
Mode(base_principal$preciom)
## [1] 350
summary(data_casa$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    77.0   290.0   395.0   444.6   565.0  1000.0
summary(data_apto$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   170.0   265.0   321.2   400.0  1000.0
summary(data_casa$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    30.0   148.1   220.5   245.7   307.8  1745.0
summary(data_apto$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    35.0    65.0    89.0   104.5   122.2   932.0
base_principal %>% 
  filter(tipo == "casa") %>% 
  summary
##        id           zona                piso        estrato    preciom      
##  Min.   :   1   Length:2898        Min.   : 1.000   6:441   Min.   :  77.0  
##  1st Qu.:1666   Class :character   1st Qu.: 1.000   5:932   1st Qu.: 290.0  
##  Median :3866   Mode  :character   Median : 1.000   4:715   Median : 395.0  
##  Mean   :3813                      Mean   : 1.704   3:810   Mean   : 444.6  
##  3rd Qu.:5745                      3rd Qu.: 2.000           3rd Qu.: 565.0  
##  Max.   :8318                      Max.   :10.000           Max.   :1000.0  
##                                                                             
##    areaconst         parquea           banos           habitac      
##  Min.   :  30.0   Min.   : 1.000   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 148.1   1st Qu.: 1.000   1st Qu.: 3.000   1st Qu.: 3.000  
##  Median : 220.5   Median : 2.000   Median : 4.000   Median : 4.000  
##  Mean   : 245.7   Mean   : 2.038   Mean   : 3.715   Mean   : 4.594  
##  3rd Qu.: 307.8   3rd Qu.: 2.000   3rd Qu.: 5.000   3rd Qu.: 5.000  
##  Max.   :1745.0   Max.   :10.000   Max.   :10.000   Max.   :10.000  
##                   NA's   :701                                       
##      tipo              barrio             longitud            latitud        
##  Length:2898        Length:2898        Min.   :-76571.00   Min.   :   3.333  
##  Class :character   Class :character   1st Qu.:-76504.00   1st Qu.:   3.396  
##  Mode  :character   Mode  :character   Median :   -76.54   Median :   3.443  
##                                        Mean   :-22103.80   Mean   : 996.361  
##                                        3rd Qu.:   -76.52   3rd Qu.:3381.000  
##                                        Max.   :   -76.46   Max.   :3493.000  
## 
base_principal %>% 
  filter(tipo == "apartamento") %>% 
  summary
##        id           zona                piso        estrato     preciom      
##  Min.   :   3   Length:4868        Min.   : 1.000   6:1079   Min.   :  58.0  
##  1st Qu.:2111   Class :character   1st Qu.: 2.000   5:1748   1st Qu.: 170.0  
##  Median :3990   Mode  :character   Median : 4.000   4:1402   Median : 265.0  
##  Mean   :4174                      Mean   : 4.553   3: 639   Mean   : 321.2  
##  3rd Qu.:6353                      3rd Qu.: 6.000            3rd Qu.: 400.0  
##  Max.   :8316                      Max.   :12.000            Max.   :1000.0  
##                                    NA's   :1307                              
##    areaconst        parquea           banos          habitac     
##  Min.   : 35.0   Min.   : 0.000   Min.   :0.000   Min.   :0.000  
##  1st Qu.: 65.0   1st Qu.: 1.000   1st Qu.:2.000   1st Qu.:3.000  
##  Median : 89.0   Median : 1.000   Median :2.000   Median :3.000  
##  Mean   :104.5   Mean   : 1.221   Mean   :2.523   Mean   :2.947  
##  3rd Qu.:122.2   3rd Qu.: 2.000   3rd Qu.:3.000   3rd Qu.:3.000  
##  Max.   :932.0   Max.   :10.000   Max.   :8.000   Max.   :9.000  
##                                                                  
##      tipo              barrio             longitud            latitud        
##  Length:4868        Length:4868        Min.   :-76565.00   Min.   :   3.334  
##  Class :character   Class :character   1st Qu.:-76503.00   1st Qu.:   3.388  
##  Mode  :character   Mode  :character   Median :   -76.54   Median :   3.450  
##                                        Mean   :-20979.84   Mean   : 916.919  
##                                        3rd Qu.:   -76.52   3rd Qu.:3364.000  
##                                        Max.   :   -76.46   Max.   :3497.000  
## 
#Creación de tablas que permitan resumir mejor los datos
tabla_tipo_precio = base_principal %>% 
  select(tipo, preciom)

tabla_resumen = tabla_tipo_precio %>% 
  summarise(Conteo = length(preciom),
            Suma_precio = sum(preciom),
            Menor = min(preciom),
            Promedio = mean(preciom),
            Moda = Mode(preciom),
            Desviación_Estándar = round(sd(preciom),2),
            Rango = max(preciom) - min(preciom))
tabla_kable_resumen <- kable(tabla_resumen, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable_resumen, "tabla_resumen.html")

# Insertar la tabla HTML en el documento
includeHTML("tabla_resumen.html")
table output
Conteo Suma_precio Menor Promedio Moda Desviación_Estándar Rango
7766 2851986 58 367.24 350 212.18 942

En esta primera tabla se encuentra que el valor promedio de las propiedades es 367.24 millones COP, mientras que el valor más común de una propiedad, la moda, es de 350 millones COP, la cercanía de estos dos valores y una desviación estándar de 212.18 millones COP nos habla de una distribución compacta y no muy dispersa. Como referencia, si no se hubieran excluido valores atípicos el valor promedio sería 433.9 millones COP y la desviación estándar de 328.6 millones COP.

El rango en el que se distribuyen los valores de la base depurada es de 942, siendo 58 millones COP el valor mínimo y 1.000 el máximo (valor preestablecido para excluir los datos atípicos). En esta tabla también se incluye la suma del total de las propiedades, que alcanza los 2 billones, 851 millones; por sí sólo este dato no dice mucho, pero puede considerarse como el “capital potencial” que podría generar la empresa.

Para ver los valores diferenciados se genera una tabla que discrimina las casas y los apartamentos y otra tabla que discrimina los valores por zona.

tabla1 = tabla_tipo_precio %>% 
  group_by(tipo) %>% 
  summarise(Conteo = length(preciom),
            Suma_precio = sum(preciom),
            Menor = min(preciom),
            Promedio = round(mean(preciom),2),
            Moda = Mode(preciom),
            Desviación_Estándar = round(sd(preciom),2),
            Rango = max(preciom) - min(preciom)) %>% 
  arrange(Promedio)
tabla_kable1 <- kable(tabla1, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable1, "tabla1.html")

# Insertar la tabla HTML en el documento
includeHTML("tabla1.html")
table output
tipo Conteo Suma_precio Menor Promedio Moda Desviación_Estándar Rango
apartamento 4868 1563561 58 321.19 250 197.42 942
casa 2898 1288425 77 444.59 350 213.63 923

Al discriminar los valores por tipo de propiedad encontramos que el número de apartamentos supera en casi 2.000 unidades las casas, sin embargo, la diferencia en la suma total de precios es de 281 mil millones que, aunque se puede considerar un valor alto, no representa una gran diferencia teniendo en cuenta que hay muchas más propiedades de tipo apartamento. Lo anterior da indicios sobre la rentabilidad del mercado de las casas, que además pueden costar en promedio 123 millones de pesos más que los apartamentos. Otros valores que orientan el análisis en ese sentido son el valor mínimo y la moda, ambos superiores para las casas.

A continuación, se realizó un resumen de la distribución de propiedades de acuerdo con las zonas, a la vez que se evalúa qué porcentaje del mercado representa cada zona.

tabla_zona_precio = base_principal %>% 
  select(zona, preciom)
tabla2 = tabla_zona_precio %>% 
  group_by(zona) %>% 
  summarise(Conteo = length(preciom),
            Suma_precio = sum(preciom),
            Menor = min(preciom),
            Superior = max(preciom),
            Promedio = round(mean(preciom),2),
            Moda = Mode(preciom),
            Desviación_Estándar = round(sd(preciom),2),
            Rango = max(preciom) - min(preciom)) %>%
  arrange(Promedio)

tabla_kable2 <- kable(tabla2, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable2, "tabla2.html")

# Insertar la tabla HTML en el documento
includeHTML("tabla2.html")
table output
zona Conteo Suma_precio Menor Superior Promedio Moda Desviación_Estándar Rango
zona oriente 350 78864 58 750 225.33 350 106.43 692
zona centro 123 37302 100 1000 303.27 350 146.10 900
zona norte 1880 611029 65 1000 325.02 320 194.76 935
zona sur 4441 1616562 75 1000 364.01 250 206.46 925
zona oeste 972 508229 85 1000 522.87 450 222.30 915

A partir de esta tabla la empresa puede empezar a pensar en estrategias para enfocar sus ventas, pues es claro que la mayor parte del mercado está en la zona sur, con 4.441 propiedades y más de 1 billón y medio de capital potencial. Además de la alta concentración de hogares para comercializar, el valor promedio de las propiedades es de 364 millones, sólo 3 millones por debajo del promedio general. Otro dato de esta tabla que resalta el potencial del sur en ventas es que tiene un rango amplio de 925 millones y el dato de la moda es inferior al promedio, con 250 millones, lo anterior habla de la diversidad de clientes a los que puede atraer esta zona de la ciudad.

El segundo sector con mayor número de propiedades disponibles es el norte con 1.880, sin embargo, una zona aún más interesante es el oeste que con poco más de la mitad de los hogares disponibles, el capital potencial es menor que el del norte por 100 mil millones. Lo anterior podría explicarse porque la zona oeste tiene el valor promedio más alto de las 5 zonas de la ciudad, con 522.8 millones.

En cuanto a los sectores con menor potencial comercial está la zona centro, con tan sólo 123 propiedades que tienen además un promedio considerable a pesar de ser pocas. También podría incluirse la zona oriente, con 350 propiedades y el promedio de costo más bajo de todas las zonas.

A continuación, con el objetivo de explorar mejor cómo se distribuye el mercado inmobiliario en las 5 zonas, se presentan tablas que discriminan el número y porcentaje de casas o apartamentos por zona:

#Tablas contingentes (de valores categoricos)
tabla3_conteo = addmargins(table(base_principal$zona, base_principal$tipo))
tabla3_prop = addmargins(round(prop.table(table(base_principal$zona, base_principal$tipo),)*100,2))

tabla_kable3_conteo <- kable(tabla3_conteo, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable3_conteo, "tabla3_conteo.html")

tabla_kable3_prop <- kable(tabla3_prop, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable3_prop, "tabla3_prop.html")

# Insertar la tabla HTML en el documento
includeHTML("tabla3_conteo.html")
table output
apartamento casa Sum
zona centro 24 99 123
zona norte 1184 696 1880
zona oeste 837 135 972
zona oriente 61 289 350
zona sur 2762 1679 4441
Sum 4868 2898 7766
includeHTML("tabla3_prop.html")
table output
apartamento casa Sum
zona centro 0.31 1.27 1.58
zona norte 15.25 8.96 24.21
zona oeste 10.78 1.74 12.52
zona oriente 0.79 3.72 4.51
zona sur 35.57 21.62 57.19
Sum 62.70 37.31 100.01

Con estas nuevas tablas es más claro que sólo la zona sur comprende el 57,19% del mercado en la ciudad, en este sector además la oferta de apartamentos es más que el doble que las casas y representan además el 35,57% del mercado total de propiedades. Nuevamente se constata que la zona oeste en relación con la zona norte representa, en cuanto al número de hogares, sólo la mitad de las propiedades, pero al tener en cuenta los valores que ahí se concentran, no puede desestimarse la zona oeste pues tiene un potencial importante.

Finalmente, como parte del análisis de la distribución de las propiedades, se presenta la distribución de los hogares según el estrato socioeconómico y la zona:

#Tabla de distribución de propiedades por estrato
tabla4 = addmargins(table(base_principal$estrato, base_principal$zona))

tabla_kable4 <- kable(tabla4, "html") %>%
  kable_styling(full_width = FALSE)
save_kable(tabla_kable4, "tabla4.html")

# Insertar la tabla HTML en el documento
includeHTML("tabla4.html")
table output
zona centro zona norte zona oeste zona oriente zona sur Sum
6 1 151 571 0 797 1520
5 4 754 266 2 1654 2680
4 13 404 82 8 1610 2117
3 105 571 53 340 380 1449
Sum 123 1880 972 350 4441 7766

Al incluir esta tabla puede entenderse mejor el comportamiento de los valores descritos más arriba. En primer lugar, la zona oeste es la zona que tiene mayor número de propiedades estrato 6 después de la zona sur, mientras que el oriente no tiene ninguna, por el contrario, hay 340 propiedades en el estrato 3. También puede verse que la zona sur tiene mayor concentración de propiedades en los estratos 4 y 5, lo que sigue el comportamiento de los datos en general.

4. Resultados

Para la exposición de resultados se presentarán las herramientas de visualización de datos a partir de las cuales se generan nuevas recomendaciones.

I. Visualización de datos

Inicialmente, con el objetivo de tener una perspectiva más clara de la distribución de los datos se genera un histograma de la base de datos principal:

#1.1 Histograma distribución de valores de todas las propiedades 
base_principal %>% 
  ggplot(aes(preciom)) + 
  geom_histogram(binwidth = 90,fill = "#95EBDF") +
  theme_bw()+
  scale_x_continuous(breaks = seq(0, 1000, by = 300)) +
  labs(x = "Valor de las propiedades en millones",
       y = "Conteo propiedades",
       title = "Distribución del valor de las propiedades")

Esta primera gráfica corrobora la información sobre el promedio, como se había descrito en la sección anterior, además permite ver un sesgo de los datos hacia la izquierda, pues el valor de las propiedades está más concentrado antes de los 450 millones de pesos. Del otro lado, las viviendas con valores superiores a los 500 millones se reducen drásticamente en número.

Una primera forma de visualizar cómo están distribuidas estas propiedades es a través de un gráfico de torta, que muestre en porcentajes cómo el mercado está representado por las casas y los apartamentos:

#1.3 Gráfico de torta para ilustrar las proporciones de casas y apartamentos
tabla_conteo = table(base_principal$tipo)
tabla_prop = prop.table(tabla_conteo)*100

mis_colores = c("#8ABAF3", "#4A87CF")

pie(tabla_conteo, labels = paste(names(tabla_conteo),"\n", round(tabla_prop,2),"%"), 
    col = mis_colores, cex = 0.7, main = "Distribución de tipo de vivienda")

En esta torta se puede ver que más de la mitad del mercado, 61,29%, está representado por propiedades de tipo apartamento, mientras que 38,71% son Casas. Sin embargo, una forma tal vez más útil de verlo puede ser explorando cómo se distribuyen el número de propiedades por zona de acuerdo con el tipo de vivienda:

#1.2 Grafico de barras apartamentos y casas
barras1 <- base_principal %>% 
  ggplot(aes(x = zona, fill = tipo)) + 
  geom_bar() +
  theme_bw()+
  labs(x = "Zona",
       y = "Número de viviendas",
       title = "Distribución tipo de vivienda por zona") +
  scale_fill_manual(values = c("casa" = "#8ABAF3", "apartamento" = "#4A87CF"))+
  coord_flip()
ggplotly(barras1)

En este gráfico es mucho más clara la superioridad en el número de viviendas del sur de Cali, pero también puede verse de forma más evidente que hay una mayor oferta de apartamentos que de casas en todos los sectores de la ciudad, a excepción del oriente donde, curiosamente, hay mayor concentración de casas. También, al ver la distribución en forma de barras, es claro que el mercado disponible en el centro y oriente de la ciudad es muy pequeño y convendría a la empresa concentrar las estrategias de mercadeo en promocionar propiedades del sur.

Ahora bien, conociendo la composición del mercado en detalle, según el tipo de propiedad, es relevante visualizar cómo se comportan los valores de estas propiedades para cada caso. Para esto se construyeron gráficos de cajas y alambres, que permiten ver los indicadores de tendencia central de manera clara:

#1.4 grafico de caja y alambres para los valores, según el tipo
boxplot1 <- base_principal %>% 
  ggplot(aes(preciom)) + 
  geom_boxplot() +
  facet_wrap(~tipo) +
  theme_bw()+
  scale_x_continuous(breaks = seq(0, 2000, by = 200))+
  labs(x = "Valor de las propiedades en millones",
       y = NULL,
       title = "Distribución del valor de las propiedades")

El primer gráfico de cajas está discriminado según el tipo de propiedad. Por un lado, los valores de los apartamentos se reconocen más dispersos, con un mayor número de datos atípicos, según la posición de la caja, que comprende el conjunto de datos entre el segundo y tercer cuartil, el 50% de los apartamentos tienen un valor entre los 200 y 400 millones de pesos. Por el otro lado, las casas tienen menor cantidad de datos atípicos pero sus datos están más dispersos pues la caja, o el 50% de los datos, están distribuidos entre los 300 y casi 600 millones de pesos.

Otra forma de analizar la distribución de los valores es distinguiendo entre las zonas de la ciudad:

base_principal %>% 
  ggplot(aes(preciom)) + 
  geom_boxplot() +
  facet_wrap(~zona) +
  theme_bw()+
  scale_x_continuous(breaks = seq(0, 1000, by = 250))+
  labs(x = "Valor de las propiedades en millones",
       y = NULL,
       title = "Distribución del valor de las propiedades")

Desde esta perspectiva pueden reconocerse las zonas centro y oriente como las más compactas, con un pequeño número de datos atípicos y una caja relativamente corta, esto probablemente se debe a que estas son las zonas con menor cantidad de propiedades en venta. Las zonas norte y sur tienen también un comportamiento similar en cuanto a la dispersión de los datos, aunque es claro que los valores de la zona sur son más elevados. Finalmente, para la zona oeste no se tienen datos atípicos, pero se trata sin duda de la zona más costosa pues la caja se encuentra entre los 360 y los 680 millones.

5. Discusión

A partir de los datos expuestos en la sección anterior, pueden generarse algunas observaciones iniciales sobre estrategias de venta y marketing. En primer lugar, puede ser relevante dividir la oferta en dos partes: La primera, un mercado regular, donde se concentran 7.766 viviendas con valores que van de los 58 a los 1000 millones COP, con un promedio de 367 millones COP. La segunda, un mercado VIP con 553 propiedades con valores entre los 1000 y 2000 millones COP, con precio promedio de 1370 millones COP.

En segundo lugar, para el mercado regular se encontró una prevalencia en las propiedades de tipo apartamento, que a su vez están en una proporción importante entre los 200 y 400 millones de pesos, por eso se recomienda concentrar los esfuerzos en la oferta de propiedades a familias con capacidad de compra de vivienda en dicho rango, no sólo por la mayor disponibilidad de propiedades, sino porque también puede permitir acceder a un mercado más amplio que si se tratara de sólo vender inmuebles de alto valor.

Adicionalmente, con respecto a la distribución de las propiedades según la zona, se encontró que la zona sur es la que domina el mercado con el 57,19% de las propiedades, seguida por la zona norte con el 24,21% y la zona oeste con el 12,52%. Sólo estas tres zonas reúnen el 93,92% del mercado en la ciudad. Sin embargo, la zona oeste es también la zona más cara, demostrado no sólo por un promedio más elevado en los costos de las propiedades, sino porque también 226 de las 553 de las propiedades en el mercado VIP pertenecen a la zona oeste.

6. Conclusiones y Recomendaciones

Para finalizar este informe se realizan algunas recomendaciones en línea con los datos trabajados y descritos en este trabajo. En primer lugar, cabe destacar que la base de datos entregada presentaba un orden y estandarización considerable, más aún frente al número de entradas iniciales que tenía. Por esto, con miras a mantener una base de datos manejable y depurada, se recomienda a la empresa B&C establecer protocolos generalizados para el ingreso de datos a la base, así como designar un encargado de revisar su cumplimiento al menos una vez al mes. Lo anterior con el propósito de evitar los valores duplicados y datos vacíos. Respecto a las posibles estrategias de marketing y ofrecimiento de productos diferenciados, se recomienda trabajar la oferta de propiedades en tres líneas diferenciadas:

I. Línea familiar

La línea principal, destinada a la comercialización de propiedades para familias de clase media y alta, con capacidad de endeudamiento superior a los 200 millones de pesos, pero inferior a los 400. El nicho de esta línea es mucho más amplio, así como la oferta de apartamentos que se encuentran en este rango de precios, se espera que su promoción apele a familias de 3 o más integrantes, haciendo llamados a la importancia de tener un inmueble para la economía familiar.

II. Línea VIP

Como ya se comentó antes la línea VIP reuniría las viviendas de alto costo, mayores a 1000 millones de pesos. Este es un nicho mucho más pequeño, orientado principalmente a personas con capacidad adquisitiva alta, probablemente dueños de industrias locales o regionales que buscan invertir en propiedades de alto costo. Igual que sus clientes, el marketing de esta línea debe estar rodeado de exclusividad, mostrando las virtudes de las viviendas que componen este grupo y las zonas donde están ubicadas.

III. Línea de nuevos inversores

Esta línea es una propuesta para atraer clientes que quieran invertir en propiedad raíz, pero no tienen suficientes recursos para comprar una por sí solos. En este caso se ofrecen las compras fraccionadas, donde un grupo de personas invierten conjuntamente cierta cantidad de dinero para comprar juntos una propiedad. Según el porcentaje de la inversión es el retorno para cada persona. Esta modalidad de compra fraccionada es una nueva tendencia, particularmente popular con inversores jóvenes que buscan empezar a generar un capital. La empresa B&C puede apuntar a un público joven con estrategias de marketing llamativas en redes sociales y conseguir numerosos clientes para las propiedades de mediano y bajo costo que tienen a su disposición. La ventaja de esta estrategia es que las personas que invierten en el inmueble no vivirán ahí por lo que la oferta es por una inversión, no una vivienda.

Para cerrar este informe es relevante resaltar la importancia que la recolección de datos tiene para este tipo de empresas, permitiéndoles comprender a profundidad el negocio que manejan y tomar decisiones más informadas. En ese sentido, y como última recomendación, puede ser valioso que la empresa siga haciendo este registro, pero con una distinción año a año, esto permitiría hacer un seguimiento de las transformaciones del mercado y, dependiendo del volumen de los datos recolectados, incluso una predicción de su comportamiento futuro.