R Markdown

Introducción

El mercado de bienes raíces en Cali, Colombia, ha experimentado un crecimiento significativo en los últimos años, impulsado por factores como el aumento de la población, la inversión extranjera directa, y el desarrollo de nuevos proyectos inmobiliarios. La empresa B&C, con una década de operaciones en este dinámico mercado, se encuentra en una posición estratégica para capitalizar las oportunidades emergentes. Este informe tiene como objetivo analizar las tendencias actuales en el mercado de bienes raíces de Cali, proporcionando a B&C información valiosa para la toma de decisiones estratégica.

Objetivos

  1. Identificar el precio promedio de las viviendas en diferentes zonas de Cali.
  2. Determinar el tipo de viviendas más ofertadas en la ciudad.
  3. Analizar las características más relevantes de la oferta de vivienda en Cali.

Métodos

Para realizar este análisis, se utilizó la base de datos de propiedades recopilada por B&C, que incluye información sobre el precio, la ubicación, las características, y las ventas de viviendas en Cali. Se emplearon técnicas estadísticas descriptivas para identificar tendencias y patrones en los datos. El análisis se centró en tres áreas principales: precios de las viviendas, tipos de viviendas ofertadas, y características de las viviendas.

Primero, se procedió con la importación de la base de datos a nuestro entorno de trabajo, seguido de la integración de diversas bibliotecas esenciales para el análisis y representación gráfica de los datos, tales como RColorBrewer, ggplot2, dplyr, knitr y kableExtra. Posteriormente, se llevó a cabo una revisión preliminar de los datos para reconocer las distintas variables presentes, clasificándolas de la manera siguiente:

-Id: Se trata de una variable de identificación que no se tomó en cuenta para el análisis.

-Zona: Clasificada como una variable nominal cualitativa.

-Piso: Considerada como una variable discreta cuantitativa.

-Estrato: Definida como una variable ordinal cualitativa.

-Precio (millones): Identificada como una variable continua cuantitativa.

-Área construida: También una variable continua cuantitativa.

-Baños: Una variable discreta cuantitativa.

-Habitación: Otra variable discreta cuantitativa.

-Tipo: Una variable nominal cualitativa.

-Barrio: Una variable de identificación que no se incluyó en el análisis.

-Longitud: Variable continua cuantitativa.

-Latitud: Variable continua cuantitativa.

Durante la fase de limpieza de datos, se realizar los siguientes cambios:

Asignar un valor de cero a las variables continuas que carecían de información. Unificar criterios en la variable “Tipo” para estandarizar la denominación de las propiedades como casa o apartamento. Crear rangos para facilitar el análisis comparativo en la variable “Número de parqueaderos”. Con la aplicación del teorema del límite central y contando con un número de registros superior a 30, se optó por describir la mayoría de las variables mediante el uso de la media y la desviación estándar. Para la representación gráfica de los datos, se emplearon diversos tipos de gráficos, incluyendo diagramas circulares, de barras, de cajas y gráficas de líneas, entre otros.

Resultados

En su mayoría, los bienes inmuebles se localizaron predominantemente en la zona sur, representando el 56.8% del total, seguida por la zona norte con un 23.1%, y la zona oeste con un 14.5%. La zona central presentó la menor cantidad de propiedades, constituyendo apenas el 1.5% del total. La distribución de las propiedades por zona se ilustra en la Figura 1.

#install.packages("learnr") # solo una vez#·install.packages("devtools") # solo una vez
#devtools::install_github("dgonxalex80/paqueteMET")
library(paqueteMET)
library(RColorBrewer)
library(ggplot2)

#Cargar data
data(vivienda_faltantes)

# Crear una tabla de frecuencias de la variable "zona"
tabla_zonas <- table(vivienda_faltantes$zona)
# Calcular el porcentaje de cada categoría
porcentaje <- prop.table(tabla_zonas) * 100

# Crear el dataframe para el gráfico
df_zonas <- data.frame(zona = names(tabla_zonas),
                       frecuencia_absoluta = tabla_zonas,
                       porcentaje = porcentaje)

# Paleta de colores tipo pastel
colores_pastel <- brewer.pal(length(df_zonas$zona), "Pastel2")

# Crear el gráfico de pastel con colores tipo pastel
ggplot(data = df_zonas, aes(x = "", y = porcentaje, fill = zona)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste(round(porcentaje, 1), "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Figura 1. Distribución de inmuebles por zona",
       x = NULL, y = NULL) +
  scale_fill_manual(values = colores_pastel) +
  theme_minimal()
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

En cuanto a la clasificación de los inmuebles, los apartamentos resultaron ser el tipo predominante, abarcando el 61.3% del total, mientras que las casas representaron el 38.7% restante, como se muestra en la Figura 2.

estandarizar_tipo <- function(x) {
  x <- gsub("(?i)APARTAMENTO", "Apartamento", x, perl = TRUE)  # (?i) ignora mayúsculas/minúsculas
  x <- gsub("(?i)apto", "Apartamento", x, perl = TRUE)
  return(x)
}

# Aplicar la función a la columna "tipo" del data frame
vivienda_faltantes$tipo <- estandarizar_tipo(vivienda_faltantes$tipo)

# Resultado
print(vivienda_faltantes)
## # A tibble: 8,330 × 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 Apar…
##  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 
##  7  8299 Zona Sur       2       6     305       125       2      3       3 Apar…
##  8  8300 Zona Oeste    NA       5     480       280       4      4       4 Apar…
##  9  8286 Zona Sur      NA       5     275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2       5     285       120       2      4       3 Apar…
## # ℹ 8,320 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Función para estandarizar los valores en la columna "tipo"
estandarizar_tipo <- function(x) {
  x <- gsub("(?i)APARTAMENTO", "Apartamento", x, perl = TRUE)  # (?i) ignora mayúsculas/minúsculas
  x <- gsub("(?i)apto", "Apartamento", x, perl = TRUE)
  x <- gsub("(?i)CASA", "Casa", x, perl = TRUE)
  return(x)
}

# Aplicar la función a la columna "tipo" del data frame
vivienda_faltantes$tipo <- estandarizar_tipo(vivienda_faltantes$tipo)

# Crear una tabla de frecuencias de la variable "tipo"
tabla_tipos <- table(vivienda_faltantes$tipo)

# Calcular el porcentaje de cada categoría
porcentaje <- prop.table(tabla_tipos) * 100

# Crear el dataframe para el gráfico
df_tipos <- data.frame(tipo = names(tabla_tipos),
                       frecuencia_absoluta = tabla_tipos,
                       porcentaje = porcentaje)

# Crear el gráfico de pastel con colores tipo pastel
ggplot(data = df_tipos, aes(x = "", y = porcentaje, fill = tipo)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste(round(porcentaje, 1), "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Figura 2. Clasificación de los inmuebles",
       x = NULL, y = NULL) +
  scale_fill_manual(values = colores_pastel) +
  theme_minimal()
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

Entre los inmuebles analizados, la mayor parte pertenecía al estrato 5, con un total de 2751 unidades, seguido por el estrato 4 con 2131 unidades y el estrato 6 con 1992 unidades. El estrato 3 presentó la menor cantidad de propiedades, también con 1992 unidades, como se muestra en la Figura 3.

vivienda_faltantes$estrato <- factor(vivienda_faltantes$estrato, levels = c(3, 4, 5, 6))

# Eliminar las filas con valores NA en la variable "estrato"
vivienda_faltantes <- vivienda_faltantes[!is.na(vivienda_faltantes$estrato), ]

# Describir las frecuencias de cada estrato
summary(vivienda_faltantes$estrato)
##    3    4    5    6 
## 1453 2131 2751 1992
# Crear el gráfico de barras

ggplot(vivienda_faltantes, aes(x = estrato, fill = estrato)) +
  geom_bar() +
  geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5), color = "black") +
  labs(title = "Figura 3. Distribución de viviendas según el estrato",
       x = "Estrato", y = "Frecuencia") +
  theme_minimal()
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

En promedio las viviendas tenia un precio de 434.25 Millones de pesos. Sin embargo, se evidenció una alta variabilidad.

# Calcula el promedio del precio
promedio_precio <- mean(vivienda_faltantes$preciom, na.rm = TRUE)

# Crea el gráfico de caja mejorado
ggplot(data = vivienda_faltantes, aes(x = factor(1), y = preciom)) +
  geom_boxplot(color = "#8D80AD", fill = "#F9EBB2", outlier.shape = NA) + # Oculta los outliers para simplificar el gráfico
  geom_hline(yintercept = quantile(vivienda_faltantes$preciom, 0.25, na.rm = TRUE), linetype = "dashed", color = "#5D6161") +
  geom_hline(yintercept = median(vivienda_faltantes$preciom, na.rm = TRUE), linetype = "dotted", color = "#5D6161") +
  geom_hline(yintercept = quantile(vivienda_faltantes$preciom, 0.75, na.rm = TRUE), linetype = "dashed", color = "#5D6161") +
  geom_hline(yintercept = promedio_precio, linetype = "solid", color = "pink", size = 1.2) + # Aumenta el tamaño para mayor visibilidad
  geom_text(aes(y = promedio_precio, label = paste("Promedio: ", round(promedio_precio, 2))), vjust = -2, color = "pink") + # Añade texto para el promedio
  labs(title = "Distribución del Precio de Viviendas",
       subtitle = paste0("Q1: ", round(quantile(vivienda_faltantes$preciom, 0.25, na.rm = TRUE), 2), " M, ",
                         "Mediana: ", round(median(vivienda_faltantes$preciom, na.rm = TRUE), 2), " M, ",
                         "Q3: ", round(quantile(vivienda_faltantes$preciom, 0.75, na.rm = TRUE), 2), " M, ",
                         "Promedio: ", round(promedio_precio, 2), " M"),
       y = "Precio (Millones de $)",
       x = "") +
  theme_minimal() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text.x = element_blank(),
        plot.subtitle = element_text(size = 10, face = "italic")) # Mejora la tipografía del subtítulo
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Nota: factor(1) se usa para evitar la representación de '1' en el eje x.

Considerando que la variabilidad en el precio podria estar influenciada por caracteristicas como el estrato, un análisis usando boxplots evidencia una tendencia creciente en el precio a medida que el estrato aumenta, siendo las viviendas estrato 6 las más costosas.

ggplot(data = vivienda_faltantes, aes(x = estrato, y = preciom)) +
  geom_boxplot(outlier.color = "pink", outlier.shape = 1) +
  scale_y_continuous(labels = scales::comma) + # Asegura que los números grandes sean fáciles de leer
  labs(title = "Distribución del Precio Promedio por Estrato",
       x = "Estrato",
       y = "Precio Promedio (Millones de $)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Mejora la legibilidad de las etiquetas del eje x

Una diferencia menos marcada se evidenció en el área construida de las viviendas según el estrato, sin embargo, las viviendas estrato 6 demostraron ser las más grandes en general.

ggplot(data = vivienda_faltantes, aes(x = estrato, y = areaconst)) +
  geom_boxplot(outlier.color = "pink", outlier.shape = 1) +
  scale_y_continuous(labels = scales::comma) + # Asegura que los números grandes sean fáciles de leer
  labs(title = "Distribución del Precio Promedio por Estrato",
       x = "Estrato",
       y = "Área construida (m2)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Mejora la legibilidad de las etiquetas del eje x

Esto se correlaciona también con el número de parqueaderos

ggplot(data = vivienda_faltantes, aes(x = estrato, y = parquea)) +
  geom_boxplot(outlier.color = "pink", outlier.shape = 1) +
  scale_y_continuous(labels = scales::comma) + # Asegura que los números grandes sean fáciles de leer
  labs(title = "Distribución del Precio Promedio por Estrato",
       x = "Estrato",
       y = "Parqueaderos (n)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Mejora la legibilidad de las etiquetas del eje x
## Warning: Removed 1603 rows containing non-finite values (`stat_boxplot()`).

Sin embargo, en cuanto al número de habitaciones, se evidenció una alta variabilidad en el estrato 3 y una constante en estratos 4, 5 y 6 con alrededor de 3 habitaciones en promedio.

ggplot(data = vivienda_faltantes, aes(x = estrato, y = habitac)) +
  geom_boxplot(outlier.color = "pink", outlier.shape = 1) +
  scale_y_continuous(labels = scales::comma) + # Asegura que los números grandes sean fáciles de leer
  labs(title = "Distribución del Habitaciones por Estrato",
       x = "Estrato",
       y = "Habitaciones (n)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Mejora la legibilidad de las etiquetas del eje x

El precio a su vez se correlacionó con el área construida.

ggplot(data = vivienda_faltantes, aes(x = preciom, y = areaconst)) +
  geom_point(color = "yellow", alpha = 0.7) +
  geom_smooth(method = "lm", color = "orange", se = FALSE) +
  labs(title = "Gráfico Lineal de 'preciom' y 'areaconst'",
       x = "Precio (m)",
       y = "Área construida (m²)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Al ahondar en la interrelación de múltiples variables, evidenciamos que el área construida no necesariamente se asocia con el nûmero de habitaciones. Por lo que seguramente las casa de estratos más altos (5 y 6) tienen un número promedio de habitaciones (alrededor de 3) con una mayor área de las mismas.

ggplot(data = vivienda_faltantes, aes(x = preciom, y = areaconst)) +
  geom_point(aes(color = habitac), alpha = 0.6) + # Representa habitac con el color
  scale_color_gradient(low = "yellow", high = "red", name = "Número de Habitaciones") + # Gradiente de color
  labs(title = "Relación entre Precio, Área Construida y Número de Habitaciones",
       x = "Precio (Millones)",
       y = "Área Construida (m²)") +
  theme_minimal() +
  theme(legend.position = "right") # Ajusta la posición de la leyenda

Discusión

La información proporcionada hasta ahora ofrece una visión detallada sobre el mercado de viviendas en una región específica, permitiendo realizar un análisis exhaustivo sobre las tendencias de precios, la distribución de las propiedades según su estrato, y la prevalencia de diferentes tipos de inmuebles. A continuación, se discuten estos puntos en detalle, integrando las observaciones y datos suministrados:

Distribución de Inmuebles por Zona La concentración predominante de inmuebles en la zona sur, con un 56.8%, seguida por la zona norte y oeste, sugiere una preferencia marcada o una mayor disponibilidad de propiedades en estas áreas. Este patrón podría estar influenciado por diversos factores, incluyendo el desarrollo urbano, la calidad de vida, y la disponibilidad de servicios y amenidades en estas zonas. La menor proporción de inmuebles en la zona centro resalta posiblemente una saturación del mercado, restricciones en el desarrollo de nuevos proyectos o una preferencia por vivir en áreas con menor densidad poblacional o más espacios verdes.

Tipos de Inmuebles La predominancia de apartamentos (61.3%) sobre las casas (38.7%) refleja una tendencia hacia la verticalización en la región, posiblemente impulsada por la optimización del espacio urbano y la búsqueda de soluciones habitacionales que se ajusten a un rango más amplio de presupuestos. Esta tendencia es común en áreas urbanas donde el crecimiento de la población y la limitación de espacio promueven la construcción en altura.

Precios de las Viviendas El análisis de precios revela una amplia gama en el mercado, desde viviendas accesibles a 58 millones hasta propiedades de lujo que alcanzan los 1999 millones. El precio promedio de 434.25 millones, con una desviación estándar significativa, indica una diversidad en las opciones de vivienda disponibles, abarcando desde opciones más económicas hasta inmuebles de alto valor. La distribución de precios, con el 50% de las viviendas ubicadas entre 220 y 540 millones, sugiere que, a pesar de la existencia de propiedades de lujo, hay un mercado sustancial para viviendas en el rango medio, accesibles para una porción significativa de la población.

Varios factores afetan el precio de la vivienda, como lo son el estrato donde se ubican asi como el área construida y el número de parqueaderos. Sin embargo, un mayor precio no parece relacionarse con el número de habitaciones, lo que hace pensar, que las casa de estratos altos tienen habitaciones más amplias, con espacios comunes más amplios también. Mientras que las casas de estrato 3 parecen tener más habitaciones en menor área contruida, lo que se refleja en un menor precio.

Implicaciones para B&C Para B&C, estos datos subrayan la importancia de adaptar su estrategia de mercado para atender las necesidades de un espectro amplio de clientes. La concentración de inmuebles en ciertas zonas sugiere la posibilidad de enfocar esfuerzos de marketing y desarrollo de proyectos en áreas con alta demanda o explorar nichos en zonas menos saturadas. La preferencia por apartamentos indica un mercado robusto para este tipo de inmuebles, aunque no se debe descuidar el segmento de casas, especialmente para familias que buscan más espacio o privacidad.

La variabilidad en los precios de las viviendas ofrece a B&C la oportunidad de segmentar su oferta, adaptando sus proyectos y servicios tanto para el mercado de lujo como para el segmento medio, maximizando así su alcance y competitividad en el mercado.

Conclusiones

El mercado de bienes raíces en Cali ofrece oportunidades significativas para B&C. La empresa puede definir su nicho de mercado enfocándose en apartamentos de gama media en zonas emergentes o casas en zonas residenciales para familias. Las estrategias de marketing deben resaltar las características más demandadas, como la seguridad, la ubicación, y las amenidades. Establecer precios competitivos será clave para atraer a un segmento más amplio del mercado.