1. INTRODUCCIÓN

Con el crecimiento exponencial de la población, la inversión extranjera directa y el desarrollo de nuevos proyectos inmobiliarios en la ciudad, el mercado de bienes raíces ha crecido significativamente y se espera que este comportamiento se mantenga.

En este contexto, el mercado de bienes raíces se destaca como un sector dinámico y de gran influencia económica, por lo que es tan importante identificar patrones y tendencias que permitan seguir incentivando esta dinámica de la economía regional y no frenar el proceso de crecimiento que lleva.

El análisis estadístico descriptivo es una herramienta valiosa y fundamental para comprender el comportamiento de cualquier sector, ya que proporciona una visión amplia y detallada de las tendencias, patrones, relaciones y características de las variables que conforman el conjunto de datos que definen el entorno. El análisis descriptivo de datos es entonces la hoja de ruta para llegar a una toma de decisiones con conciencia y basada en hechos, lo que puede llevar a la compañía B&C a hacer una planificación estratégica exitosa dentro de la industria inmobiliaria y posicionarla como un referente para sus competidores.

2. OBJETIVOS

El propósito central de este proyecto es realizar un análisis estadístico descriptivo con el fin de identificar patrones y tendencias significativas en el mercado de bienes raíces en la ciudad de Cali. El enfoque se centrará en la limpieza y análisis detallado de datos relacionados con propiedades en venta, con el objetivo de brindar a la empresa B&C una visión profunda de las dinámicas actuales del mercado.

3. MÉTODOS

Para efectos prácticos, se trabajará con la base de datos proporcionada por la empresa B&C, donde se recogió información valiosa sobre 8.330 viviendas en la ciudad, la cual contiene 13 variables relacionadas con el tipo de vivienda, sus características, la zona donde está ubicada y el precio.

3.1 Base de datos

Lo primero que se debe hacer para comenzar a trabajar con la base de datos es instalar las librerías que vamos a utilizar en el modelo:

Librerías

  • Librerías necesarias para cargar la base de datos
library(paqueteMET)
library(devtools)
  • Librerías para la imputacion de NAs
library(mice)
library(naniar)
library(DescTools)
library(VIM)
  • Librería para quitar las tildes
#install.packages("stringi")
library(stringi)
  • Librerías necesarias para trabajar con el RMarkdown
library(knitr)
library(rmarkdown)
library(devtools)
  • Librerías para hacer el análisis descriptivo
library(psych)
library(dplyr)
library(ggplot2)
library(table1)
require(table1)
library(tidyverse)

Datos

Ahora procedemos a importar los datos para el modelo, los cuales se encuentran en un repositorio de GitHub

#devtools::install_github("dgonxalex80/paqueteMET")
data("vivienda_faltantes")

Resumen estadístico

Para tener un panorama más claro de la base de datos, haremos un resumen que contenga las variables y sus primeras 6 observaciones

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>

3.2. Limpieza de datos

Inicialmente, la base de datos contenía 8.330 registros, para validar estos datos se deben seguir ciertos pasos.

1. Primero se debe llevar la base de datos a un data frame para poder analizar y graficar los datos faltantes, tomando como tamaño de la muestra, las 8.330 observaciones, para así analizar todo el conjunto.

vivienda_df <- sample_n(vivienda_faltantes,8330)
nrow(vivienda_df)
## [1] 8330

2. Es importante visualizar los datos faltantes para observar su comportamiento

datosNA <- colSums(is.na(vivienda_df))
datosNA
##        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

Gráfico de patrón de datos faltantes

md.pattern(vivienda_df, rotate.names = TRUE)

##      preciom id zona estrato areaconst banios habitac tipo barrio longitud
## 4812       1  1    1       1         1      1       1    1      1        1
## 1912       1  1    1       1         1      1       1    1      1        1
## 877        1  1    1       1         1      1       1    1      1        1
## 726        1  1    1       1         1      1       1    1      1        1
## 1          1  0    0       0         0      0       0    0      0        0
## 2          0  0    0       0         0      0       0    0      0        0
##            2  3    3       3         3      3       3    3      3        3
##      latitud parquea piso     
## 4812       1       1    1    0
## 1912       1       1    0    1
## 877        1       0    1    1
## 726        1       0    0    2
## 1          0       0    0   12
## 2          0       0    0   13
##            3    1606 2641 4279

Como se puede observar en el gráfico de patrón de datos variables, hay 2 observaciones con todos los datos en blanco y hay una observación que solo tiene diligenciada la variable del precio. Por lo tanto, la decisión tomada fue eliminarlos y quedamos con una base de datos de 8.327 observaciones.

3. Identificación de datos faltantes

viv_idsinNA <- vivienda_df %>%
  filter(!is.na(vivienda_df$id))
nrow(viv_idsinNA)
## [1] 8327

Otra validación importante es revisar que la variable ID nob tenga duplicados, debido a que esta es una variable de valor único con el que se identifica cada vivienda.

viv_nodup <- subset(viv_idsinNA, !duplicated(viv_idsinNA$id, fromLast = TRUE))
nrow(viv_nodup)
## [1] 8319

Como resultado de esta imputación, tenemos que de estas 8.327 observaciones se encontraron 8 líneas cuyos Ids estaban repetidos, por lo tanto, estas observaciones también fueron eliminadas del modelo. Así que, finalmente, el modelo quedó con un total de 8.319 registros únicos.

vis_miss(viv_nodup)

Como se puede observar en el gráfico de valores faltantes, en la base de datos existen dos variables con valores nulos que representan el 3,9 % del total. De la cantidad de observaciones de la variable piso, hay un 32 % de datos faltantes, y de la variable parqueadero 19 %

4. Imputación de datos faltantes Se procederá a crear un indicador de NAs por cada variable con faltantes, para comparar el promedio de los pisos en aquellas viviendas sin datos en los parqueaderos y el promedio de los parqueaderos en aquellas viviendas sin datos en los pisos.

piso_NA <- is.na(viv_nodup$piso)
parq_NA <- is.na(viv_nodup$parquea)

#Para los pisos
tapply(X=viv_nodup$piso, INDEX=parq_NA, FUN = mean, na.rm = T)
##    FALSE     TRUE 
## 3.885607 3.141553
#Para los parqueaderos
tapply(X=viv_nodup$parquea, INDEX=piso_NA, FUN = mean, na.rm = T)
##    FALSE     TRUE 
## 1.815100 1.885804

De lo anterior se concluye que los resultados de los faltantes y los datos completos son muy similares en ambos casos, la diferencia es de decimales: 0,7 en los pisos y 0,07 en los parqueaderos. Por lo que podemos proceder a hacer la imputación de datos.

5. Reemplazo de los valores faltantes

Se tomó la decisión de reemplazar los valores vacíos por la mediana y de los parqueaderos por la moda por las siguientes razones:

  1. Las variables piso y parqueadero son las únicas que tienen valores NA, 2.635 y 1.602 respectivamente y ambas son variables cuantitativas discretas que toman valores enteros.
  2. Para los parqueaderos se mantendría la distribución inicial de los datos, ya que tienden a tener un valor que es predominante en el conjunto de datos y se muestra en el siguiente diagrama.
barplot(table(viv_nodup$parquea), main = "Histograma de parqueaderos")

moda_parq <- Mode(viv_nodup$parquea, na.rm = TRUE)
viv_nodup$parquea[is.na(viv_nodup$parquea)] <- moda_parq
summary(viv_nodup$piso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   2.000   3.000   3.771   5.000  12.000    2635
  1. Para los pisos no hay una tendencia tan marcada a un solo dato predominante, sino que la distribución se enfoca particularmente en los primeros 5 pisos, lo que nos muestra una distribución asimétrica con sesgo a la derecha, por esto se hará imputación con la mediana.
barplot(table(viv_nodup$piso), main = "Histograma de pisos")

mediana_piso <- median(viv_nodup$piso, na.rm = TRUE)
viv_nodup$piso[is.na(viv_nodup$piso)] <- mediana_piso
summary(viv_nodup$piso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   3.527   4.000  12.000

Con la imputación de estas dos variables, el mapa de valores faltantes queda sin ningún valor, como se puede ver en la siguiente gráfica

gg_miss_var(viv_nodup)

Ahora el conjunto de datos está listo para ser trabajado, ya que se eliminó y corrigió alguna información que podría desvirtuar el objetivo del proyecto. Para futuros análisis se debería tener en cuenta el porqué de estos faltantes, pues por análisis podría interpretarse que la casilla no se llenó o que el valor es cero, es decir, vivienda sin parqueaderos y vivienda de único piso.

3.3. Estandarización de las variables

Algunas variables cualitativas tienen valores que son lo mismo, pero están digitados de manera distinta, por lo cual, se procederá a hacer una estandarización:

Para el tipo de vivienda se tienen los siguientes valores únicos en la base de datos

tipo_unico <- unique(viv_nodup$tipo)
tipo_unico
## [1] "Casa"        "Apartamento" "casa"        "CASA"        "APARTAMENTO"
## [6] "apto"

Procedemos a poner todas las letras en minúscula y a modificar los valores con la palabra “apto” por la palabra “apartamento”

viv_nodup$tipo[viv_nodup$tipo == "apto"] <- "apartamento"
viv_nodup$tipo <- tolower(viv_nodup$tipo)
unique(viv_nodup$tipo)
## [1] "casa"        "apartamento"
  1. Para la variable barrio procederemos a dejar todas las letras en minúscula y a quitar las tildes.
length(unique(viv_nodup$barrio))
## [1] 436
viv_nodup$barrio <- tolower(viv_nodup$barrio) #Quitando las mayúsculas
viv_nodup$barrio <- iconv(viv_nodup$barrio, to = "ASCII//TRANSLIT")
length(unique(viv_nodup$barrio))
## [1] 389

Con esta estandarización, logramos disminuir los errores en las variables, pasando de 6 valores únicos a 2 en el tipo de vivienda y de 436 a 389 en los barrios

4. Análisis estadístico

Un dato interesante considerado es evaluar el precio del metro cuadrado en las diferentes zonas de la ciudad, para esto se construyó la siguiente variable:

precio_m2 <- viv_nodup$preciom/viv_nodup$areaconst

Ahora, llevamos esta variable a un boxplot para comparar el comportamiento del precio del metro cuadrado por las 6 zonas.

boxplot(precio_m2~viv_nodup$zona,
        main = "Distribución del precio del metro cuadrado por zona",
        ylab="millones de pesos",
        xlab = "zona", las=1,
        col=c("#f4d35e","#ee964b","gray","purple","blue"))

p_prom_zona <- aggregate(precio_m2 ~ viv_nodup$zona, data = viv_nodup, FUN = mean)
p_prom_zona
##   viv_nodup$zona precio_m2
## 1    Zona Centro  1.745886
## 2     Zona Norte  2.448327
## 3     Zona Oeste  3.644159
## 4   Zona Oriente  1.442864
## 5       Zona Sur  2.720418

De este gráfico se puede concluir que el precio del metro cuadrado en la zona oriente es el más barato y en la zona oeste se tiene el valor por metro cuadrado más alto, esto puede deberse a las condiciones de las zonas, la seguridad, la cercanía a diferentes lugares; sin embargo, con la información con la que se cuenta, no es posible afirmar la razón.

La zona centro tiende a ser la más equilibrada, pues tiene menos datos atípicos que las demás y tiene una caja relativamente pequeña, lo que sugiere una menor dispersión entre sus datos.

La zona sur presenta un patrón de distribución muy marcado, donde la mayoría de los datos se centran en un valor de 2.7 millones, pero cuenta con mucha variabilidad en el resto de valores, pues los bigotes del boxplot son muy largos y además hay muchos datos atípicos. Esto puede significar que dentro de la zona sur, hay regiones más cotizadas, tal vez por el desarrollo urbanístico, por la seguridad, y por muchas otras razones que no se pueden concluir con estos datos.

Con esta información, se podría segmentar de una mejor manera el mercado, y se podrían lanzar estrategias de acuerdo con cada nicho. Orientar a clientes que buscan economía a zonas como el centro y el oriente y a clientes con una mayor solvencia económica a zonas como el oeste y el sur.

pie(table(viv_nodup$tipo))

table(viv_nodup$tipo) %>% prop.table()*100
## 
## apartamento        casa 
##    61.29342    38.70658

La mayoría de viviendas corresponden a apartamentos, siendo un 61.29 % del total de viviendas. Esto puede concluirse a la nueva modalidad de construcción, que se centra más en urbanizaciones donde haya más apartamentos, pues así se aprovecha el área vertical.

p_prom_piso <- aggregate(precio_m2 ~ viv_nodup$piso, data = viv_nodup, FUN = mean)
p_prom_piso
##    viv_nodup$piso precio_m2
## 1               1  2.552507
## 2               2  2.411295
## 3               3  2.640815
## 4               4  2.785264
## 5               5  2.872637
## 6               6  3.393568
## 7               7  3.289228
## 8               8  3.328972
## 9               9  3.597784
## 10             10  3.337798
## 11             11  3.684092
## 12             12  3.688355

De la tabla anterior se puede concluir que los pisos más altos tienden a tener un mayor valor del metro cuadrado, esto puede deberse a temas de iluminación, ruido y la posibilidad de ver la ciudad.

boxplot(precio_m2 ~ viv_nodup$tipo, xlab="Tipo", ylab="Precio", col="orchid", las=1)

Del anterior gráfico podemos concluir que el precio por metro cuadrado de las casas es inferior al de los apartamentos, esto puede deberse a que los apartamentos generalmente tienen vigilancia y dan la sensación de más seguridad.Ambas distribuciones presentan gran cantidad de datos atípicos, por lo que sería bueno tener el detalle de algunos de estos para validar la razón del precio tan elevado para el metro cuadrado en algunas viviendas.

ggplot(viv_nodup, aes(y=areaconst , x=preciom))+
geom_point()

summary(viv_nodup$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   220.0   330.0   433.9   540.0  1999.0

Este último gráfico permite ver que la mayoría de las viviendas oscilan entre un valor de 58 millones y 540 millones independientemente de los metros cuadrados de área construida.Pues hay viviendas de 250 metros cuadrados a precios de casi 2.000 millones de pesos. Por lo tanto, no hay una correlación suficiente entre el área construida y el precio de la vivienda.

boxplot(precio_m2~viv_nodup$estrato,
        main = "Distribución del precio del metro cuadrado por zona",
        ylab="millones de pesos",
        xlab = "estrato", las=1,
        col=c("#f4d35e","#ee964b","gray","purple","blue"))

p_prom_estrato <- aggregate(precio_m2 ~ viv_nodup$estrato, data = viv_nodup, FUN = mean)
p_prom_estrato
##   viv_nodup$estrato precio_m2
## 1                 3  1.765289
## 2                 4  2.451122
## 3                 5  2.783360
## 4                 6  3.627821

De esta gráfica podemos concluir que a medida que es más alto el estrato es más alto el valor del metro cuadrado, lo cual tiene lógica, debido a que los etsratos altos tienen mejores condiciones ambientales, de infrastructura y accesibilidad a espacios.

4. RESULTADOS

Cada zona de la ciudad exhibe una dinámica única en relación con el precio del metro cuadrado. Mientras que la zona oriente presenta una tarifa más asequible, la zona oeste destaca por sus valores más elevados en esta métrica. No obstante, es importante señalar que el centro muestra una distribución más balanceada y una menor variabilidad en comparación con otras áreas. En particular, la zona sur se caracteriza por una concentración significativa de datos alrededor de los 2.7 millones, aunque también revela una variabilidad considerable y la presencia de datos atípicos.

Estos patrones permiten identificar oportunidades de segmentación en el mercado. Estrategias enfocadas en economía podrían dirigirse hacia las zonas centro y oriente, donde los precios son más favorables para aquellos en busca de opciones de menor valor. En contraste, las zonas oeste y sur pueden ser estratégicas para atraer a clientes con mayor capacidad económica.

Dentro de este contexto, el panorama de viviendas muestra una marcada preponderancia de apartamentos, representando un 61.29% del total. Este predominio refleja una tendencia hacia la construcción vertical, favoreciendo la maximización del uso del terreno.

Estas conclusiones sugieren la importancia de una consideración cuidadosa al abordar el mercado inmobiliario. La diversidad en el precio del metro cuadrado en diferentes zonas y la preferencia por apartamentos delinean una oportunidad para la implementación de estrategias de segmentación y enfoque en función de las características únicas de cada área y tipo de vivienda.

5. CONCLUSIONES

El presente informe no solo refleja tendencias numéricas, sino que también arroja una luz sobre aspectos más amplios que impactan el panorama inmobiliario y las decisiones estratégicas:

El mercado inmobiliario en Cali presenta un mosaico de precios que varían según las diferentes zonas de la ciudad. Estas diferencias reflejan la riqueza de la geografía urbana y los factores únicos que influyen en el valor de la propiedad en cada área. Desde la accesibilidad hasta las comodidades y servicios que se encuentran en los alrededores, cada zona aporta su propia perspectiva al mercado, enriqueciendo la experiencia residencial de los habitantes.

Las divergencias de precios también brindan un mapa de oportunidades para inversores. Identificar áreas con precios más accesibles podría señalar potenciales zonas de crecimiento y revitalización, impulsando el desarrollo urbano de manera estratégica y sostenible. Por otro lado, las áreas con precios más elevados podrían destacar mercados exclusivos, presentando opciones atractivas para un público específico.

El predominio de apartamentos en el mercado subraya la evolución de los estilos de vida urbanos. La preferencia por soluciones habitacionales compactas y eficientes refleja la tendencia moderna hacia la simplificación y la maximización del espacio. Estos cambios en la preferencia del consumidor tienen el potencial de influir en el diseño arquitectónico y la planificación urbana en los años siguientes

Aunque los datos actuales no permiten afirmaciones definitivas, la variación en los precios podría reflejar diferencias socioeconómicas y niveles de desarrollo en las diferentes zonas. La seguridad, la infraestructura y la accesibilidad son solo algunos de los factores que contribuyen a estas diferencias. Este análisis sugiere la importancia de considerar el contexto más amplio al evaluar el mercado inmobiliario.

En última instancia, este análisis proporciona una visión holística que va más allá de los datos en bruto, iluminando las interconexiones entre el mercado inmobiliario y el tejido social, económico y urbanístico de la ciudad de Cali. Estas conclusiones no solo guían las decisiones empresariales, sino que también contribuyen al entendimiento general de la dinámica y evolución de la vivienda en la ciudad.