1 Descripción

El presente informe tiene como propósito desarrollar un análisis estadístico multivariante del mercado inmobiliario urbano, utilizando una base de datos detallada de propiedades. Para ello, se aplicarán técnicas estadísticas multivariantes de reducción de dimensionalidad, clasificación y análisis de asociación entre variables categóricas. Específicamente, se utilizarán el Análisis de Componentes Principales (PCA), el Análisis de Conglomerados y el Análisis de Correspondencia, buscando proporcionar ventajas competitivas en el mercado a través de una toma de decisiones informada.

2 Objetivos

2.1 Objetivo General

Realizar un análisis estadístico multivariante integral del mercado inmobiliario urbano, mediante la aplicación de técnicas de reducción de dimensionalidad, segmentación y análisis de asociación, con el fin de identificar patrones estructurales y generar recomendaciones estratégicas que optimicen la toma de decisiones de la empresa inmobiliaria.

2.2 Objetivos Específicos

  • Explorar y describir estadísticamente la base de datos inmobiliaria, identificando la naturaleza de las variables, su distribución, presencia de valores atípicos (outliers) o nulos y posibles relaciones preliminares.

  • Aplicar el Análisis de Componentes Principales (PCA) para reducir la dimensionalidad de las variables cuantitativas e identificar las características o factores que tienen mayor influencia en la variación del mercado.

  • Implementar un Análisis de Conglomerados para segmentar las propiedades residenciales en grupos homogéneos, permitiendo entender las dinámicas de oferta específicas en diferentes estratos y zonas de la ciudad.

  • Desarrollar un Análisis de Correspondencias para examinar la relación geométrica e identificar patrones de asociación fuertes entre variables categóricas.

  • Generar visualizaciones que faciliten la interpretación de los resultados.

  • Elaborar conclusiones fundamentadas y recomendaciones encaminadas a guiar las decisiones estratégicas de la empresa inmobiliaria.

3 Datos

La fuente de datos para realizar este ejercicio proviene de datos tomados de OLX mediante procedimiento webscraping.

Ver Anexo 1 con el detalle del cargue y la salida del código.

#Cargue de la Base de datos
#devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
data("vivienda")
#str(vivienda)

A partir de esta fuente de datos generamos la Tabla 1 que contiene el nombre de la variable, su naturaleza y una breve descripción de la misma. Adicionalmente sub-agrupamos estas variables para un mejor conocimiento de su distribución.

# Creación del diccionario de datos adaptado a la base "vivienda"
tabla_descriptiva = tibble::tribble(
  ~`Nombre de la Variable`, ~`Descripción`, ~`Naturaleza`,
  
  # Variables de Identificación y Ubicación Geográfica
  "id", "Identificador único del inmueble en la base de datos", "Cualitativa Nominal",
  "zona", "Zona macro de la ciudad donde se ubica el inmueble (ej. Zona Oriente)", "Cualitativa Nominal",
  "barrio", "Nombre del barrio específico donde se ubica la vivienda", "Cualitativa Nominal",
  "longitud", "Coordenada geográfica (longitud) para mapeo espacial", "Cuantitativa Continua",
  "latitud", "Coordenada geográfica (latitud) para mapeo espacial", "Cuantitativa Continua",
  
  # Variables Socioeconómicas y de Valoración
  "estrato", "Clasificación socioeconómica del sector (escala del 1 al 6)", "Cualitativa Ordinal",
  "preciom", "Precio de oferta de la vivienda (en millones de pesos)", "Cuantitativa Continua",
  
  # Variables Estructurales y Físicas del Inmueble
  "tipo", "Clasificación arquitectónica de la vivienda (Casa o Apartamento)", "Cualitativa Nominal",
  "areaconst", "Área total construida del inmueble en metros cuadrados", "Cuantitativa Continua",
  "habitaciones", "Número de habitaciones o alcobas disponibles", "Cuantitativa Discreta",
  "banios", "Número de baños disponibles en el inmueble", "Cuantitativa Discreta",
  "parqueaderos", "Cantidad de espacios de estacionamiento (garajes)", "Cuantitativa Discreta",
  "piso", "Nivel o piso en el que se ubica el inmueble (aplica más a apartamentos)", "Cualitativa Ordinal"
)

# Formato y renderizado de la tabla profesional
tabla_descriptiva %>%
  knitr::kable(
    col.names = c("Nombre de la Variable", "Descripción", "Naturaleza"),
    align = c('l', 'l', 'c') # Alineación: izquierda, izquierda, centro
  ) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "bordered", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  pack_rows("Identificación y Ubicación", 1, 5) %>%
  pack_rows("Socioeconómicas y Valoración", 6, 7) %>%
  pack_rows("Estructurales del Inmueble", 8, 13) %>%
  footnote(
    general = "Tabla 1: Diccionario de datos y naturaleza estadística de las variables del mercado inmobiliario.",
    general_title = ""
  )
Nombre de la Variable Descripción Naturaleza
Identificación y Ubicación
id Identificador único del inmueble en la base de datos Cualitativa Nominal
zona Zona macro de la ciudad donde se ubica el inmueble (ej. Zona Oriente) Cualitativa Nominal
barrio Nombre del barrio específico donde se ubica la vivienda Cualitativa Nominal
longitud Coordenada geográfica (longitud) para mapeo espacial Cuantitativa Continua
latitud Coordenada geográfica (latitud) para mapeo espacial Cuantitativa Continua
Socioeconómicas y Valoración
estrato Clasificación socioeconómica del sector (escala del 1 al 6) Cualitativa Ordinal
preciom Precio de oferta de la vivienda (en millones de pesos) Cuantitativa Continua
Estructurales del Inmueble
tipo Clasificación arquitectónica de la vivienda (Casa o Apartamento) Cualitativa Nominal
areaconst Área total construida del inmueble en metros cuadrados Cuantitativa Continua
habitaciones Número de habitaciones o alcobas disponibles Cuantitativa Discreta
banios Número de baños disponibles en el inmueble Cuantitativa Discreta
parqueaderos Cantidad de espacios de estacionamiento (garajes) Cuantitativa Discreta
piso Nivel o piso en el que se ubica el inmueble (aplica más a apartamentos) Cualitativa Ordinal
Tabla 1: Diccionario de datos y naturaleza estadística de las variables del mercado inmobiliario.

Como se observa en la Tabla 1, la base de datos captura las características de los inmuebles a través de 13 variables. Estructuralmente, el conjunto se compone de 4 variables cualitativas nominales, 2 cualitativas ordinales, 4 cuantitativas continuas y 3 cuantitativas discretas.

4 Exploración de los Datos

A continuación, realizaremos la exploración del conjunto de datos, con el fin de conocer la estructura, calidad y comportamiento general de la información disponible. En esta etapa se examinan las variables de manera descriptiva, se identifican posibles valores atípicos, patrones iniciales y eventuales inconsistencias en los datos.

# Calcular cantidad y porcentaje de nulos por variable
nulos_df <- data.frame(
  Variable = names(vivienda),
  Nulos = colSums(is.na(vivienda)),
  Porcentaje = round((colSums(is.na(vivienda)) / nrow(vivienda)) * 100, 2)
) %>%
  # Ordenar de mayor a menor cantidad de nulos
  arrange(desc(Nulos))

# Renderizar la tabla para el informe
nulos_df %>%
  knitr::kable(
    col.names = c("Variable", "Cantidad de Nulos", "Porcentaje (%)"),
    align = c('l', 'c', 'c'),
    row.names = FALSE
  ) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "bordered", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  kableExtra::footnote(
    general = "Tabla 2: Cuantificación y proporción de valores nulos por variable en la base de datos.",
    general_title = ""
  )
Variable Cantidad de Nulos Porcentaje (%)
piso 2638 31.70
parqueaderos 1605 19.29
id 3 0.04
zona 3 0.04
estrato 3 0.04
areaconst 3 0.04
banios 3 0.04
habitaciones 3 0.04
tipo 3 0.04
barrio 3 0.04
longitud 3 0.04
latitud 3 0.04
preciom 2 0.02
Tabla 2: Cuantificación y proporción de valores nulos por variable en la base de datos.

Como se detalla en la Tabla 2, la revisión de calidad de la base de datos revela la presencia de valores nulos que deben ser considerados antes del modelamiento estadístico. En primer lugar, se identifica un patrón constante de 3 registros faltantes en casi todas las variables, lo que sugiere la existencia de filas completas vacías desde el origen de los datos. Por otro lado, la variable piso presenta la mayor proporción de ausencias (31.70%), en este caso la hipótesis es que estos faltantes pueden deberse a la naturaleza de los datos, teniendo en cuenta que esta característica no aplicaría por ejemplo a propiedades de tipo “Casa” de una sola planta. Finalmente, la variable parqueaderos muestra un 19.29% de valores nulos.

4.1 Detección de Valores Atípicos (Outliers)

Para completar el análisis exploratorio, se examina la presencia de valores atípicos en las variables cuantitativas continuas y discretas. La identificación de estas observaciones extremas es crucial, ya que técnicas como el Análisis de Componentes Principales (PCA) son altamente sensibles a la varianza y pueden verse sesgadas por propiedades con precios, áreas o características estructurales desproporcionadas en comparación con el mercado estándar.

# Seleccionar solo las variables numéricas de interés
vivienda_num <- vivienda %>%
  select(preciom, areaconst, habitaciones, banios, parqueaderos)

# Transformar los datos a formato largo para graficarlos juntos con ggplot2
vivienda_larga <- vivienda_num %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor")

# Crear los diagramas de caja (Boxplots)
ggplot(vivienda_larga, aes(x = Variable, y = Valor, fill = Variable)) +
  geom_boxplot(outlier.colour = "red", outlier.shape = 16, outlier.size = 2, alpha = 0.7) +
  facet_wrap(~ Variable, scales = "free", ncol = 3) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title = "Figura 1: Distribución y Valores Atípicos por Variable Numérica",
    subtitle = "",
    x = "",
    y = "Valor"
  ) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", size = 14),
    strip.text = element_text(face = "bold", size = 12)
  )

Como se observa en la Figura 1, las variables numéricas presentan una clara asimetría positiva, especialmente preciom y areaconst. La mayoría de las propiedades se concentran en rangos medios de precio y tamaño, pero existe un grupo reducido con valores muy altos que genera una cola larga hacia la derecha. Esto evidencia que el mercado no es homogéneo y que está compuesto de viviendas estándar y otras de un segmento más exclusivo de alto valor.

En cuanto a las variables de diseño (habitaciones, banios y parqueaderos), se observa mayor estabilidad alrededor de configuraciones típicas (3 habitaciones, 2 baños y 1–2 parqueaderos). No obstante, también aparecen algunos valores extremos que probablemente podrían corresponder a propiedades de lujo o a posibles inconsistencias en los datos.

En conjunto, la dispersión y los valores atípicos sugieren la existencia de distintos segmentos de mercado, por lo que será importante estandarizar las variables antes de aplicar técnicas multivariantes, evitando que los valores más altos distorsionen los resultados.

4.2 Tratamiento y Depuración de Datos

Con base en los hallazgos del diagnóstico exploratorio (Tabla 2 y Figura 1), se procede a ejecutar un protocolo riguroso de limpieza e imputación. La integridad de la matriz de datos es un prerrequisito ineludible para las técnicas multivariantes posteriores, dado que los algoritmos como el Análisis de Componentes Principales (ACP) y el agrupamiento por K-Means requieren conjuntos de datos completos y son sensibles a inconsistencias extremas.

En esta fase operativa se aplican cuatro criterios de corrección: *1. Nulos Totales: Se descartan las observaciones completamente vacías de origen.

*2. Datos Atípicos: Se excluyen los registros atípicos identificados en la Figura 1 que carecen de sentido en el mercado inmobiliario (ej. propiedades reportadas con 0 habitaciones o 0 baños). Dado que el alcance u objetivo central del negocio es el mercado de viviendas urbanas (propiedades residenciales), y estos datos podrían corresponder a locales comerciales, oficinas o lotes que se filtraron en la captura de datos, los cuales introducirían ruido en los modelos de valoración residencial.

*3. Imputación: Para salvaguardar la representatividad de la muestra, los valores nulos de la variable parqueaderos (19.29%) se imputan utilizando la mediana condicionada al estrato y tipo de vivienda.

*4. Ajuste Categórico: Se recodifican los valores faltantes de la variable piso asignando la etiqueta “No Aplica” a las potenciales casas, validando así la hipótesis planteada previamente.

# 1. Eliminación de registros con nulos estructurales (las 3 filas vacías)
vivienda_limpia <- vivienda %>%
  filter(!is.na(id) & !is.na(preciom))

# 2. Corrección de inconsistencias lógicas (observadas en los outliers)
vivienda_limpia <- vivienda_limpia %>%
  filter(habitaciones > 0, banios > 0) 

# 3. Imputación de la variable 'parqueaderos' usando la mediana agrupada
vivienda_limpia <- vivienda_limpia %>%
  group_by(estrato, tipo) %>%
  mutate(
    parqueaderos = ifelse(is.na(parqueaderos), 
                          median(parqueaderos, na.rm = TRUE), 
                          parqueaderos)
  ) %>%
  ungroup()

# 4. Tratamiento de la variable categórica 'piso'
vivienda_limpia <- vivienda_limpia %>%
  mutate(
    piso = ifelse(is.na(piso) & tipo == "Casa", "No Aplica", piso),
    piso = ifelse(is.na(piso) & tipo == "Apartamento", "No Registrado", piso)
  )

# Verificación final de calidad de los datos
#nulos_finales <- colSums(is.na(vivienda_limpia))
#cat("Total de valores nulos restantes en variables cuantitativas (esperado 0):\n")
#print(nulos_finales[c("preciom", "areaconst", "habitaciones", "banios", "parqueaderos")])

Para observar el proceso de limpieza y el resultado obtenido después de aplicar el código, ver Anexo 2

5 Análisis de Componentes Principales (ACP)

Cumpliendo con el segundo objetivo específico, se aplica el Análisis de Componentes Principales para reducir la dimensionalidad del conjunto de datos. El propósito es identificar las variables (componentes) que explican la mayor parte de la variabilidad en la oferta y los precios del mercado inmobiliario, simplificando la complejidad sin perder información crítica.

5.1 Paso 1: Selección y Estandarización de Variables

El primer paso que realizaremos será únicamente sobre las variables cuantitativas continuas y discretas de la base depurada. Dado que estas variables se miden en escalas diferentes (el precio en millones de pesos frente al número de habitaciones en unidades del 1 al 10). Esto evita que variables con magnitudes grandes, como el precio o el área, distorsionen la creación de los componentes.

# 1. Seleccionar las variables numéricas de la base limpia
vivienda_num <- vivienda_limpia %>%
  select(preciom, areaconst, habitaciones, banios, parqueaderos)

# 2. Ejecutar el algoritmo PCA
res.pca <- PCA(vivienda_num, scale.unit = TRUE, graph = FALSE)

5.2 Paso 2: Evaluación de la varianza

Una vez aplicado el modelo, es importante revisar qué tanta información del conjunto original se conserva en las nuevas variables creadas. Para ello, se analizan los eigenvalues (valores propios) y el porcentaje de varianza explicada por cada componente. Los eigenvalues indican la importancia de cada dimensión, mientras que la varianza explicada muestra qué proporción del comportamiento total de los datos logra resumir cada una. Este paso permite comprobar que la simplificación realizada realmente representa bien el mercado inmobiliario, asegurando que se reduzca la complejidad del análisis sin perder los patrones clave que influyen en la oferta y en la formación de los precios.

# Extraer e imprimir la tabla de valores propios y varianza explicada
eig.val <- get_eigenvalue(res.pca)
print(eig.val)
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  3.2523931        65.047862                    65.04786
## Dim.2  0.8878888        17.757777                    82.80564
## Dim.3  0.3516897         7.033793                    89.83943
## Dim.4  0.3219785         6.439570                    96.27900
## Dim.5  0.1860499         3.720998                   100.00000
# Visualizar la varianza mediante un gráfico de sedimentación (Scree plot)
fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 100),
         main = "Figura 2: Varianza Explicada por Componente Principal",
         xlab = "Dimensiones (Componentes)",
         ylab = "Porcentaje de Varianza Explicada",
         barfill = "#3498db", barcolor = "#2980b9") +
  theme_minimal()

Los resultados muestran que la reducción de variables fue bastante efectiva. El primer componente por sí solo resume el 65.05% de la información del mercado, y el segundo agrega un 17.76% adicional. En conjunto, estas dos dimensiones permiten representar el 82.81% de la información original contenida en las cinco variables analizadas. Esto significa que es posible simplificar el análisis del mercado inmobiliario a solo dos ejes principales sin perder información relevante. Esta simplificación facilita la interpretación de los resultados y permite visualizar de manera más clara los patrones del mercado, apoyando la toma de decisiones estratégicas de la empresa.

5.3 Paso 3: Contribución de las Variables y Círculo de Correlaciones

Una vez definido que el comportamiento del mercado puede resumirse en dos dimensiones principales, es necesario dar sentido comercial a cada componente. Para ello, se analiza el círculo de correlaciones y el peso matemático de cada variable, lo que permite visualizar y cuantificar cómo los atributos físicos y financieros de las propiedades construyen estas nuevas variables.

# 1. Graficar el círculo de correlaciones
fviz_pca_var(res.pca,
             col.var = "contrib", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE,      
             title = "Figura 3: Círculo de Correlaciones de Variables Inmobiliarias") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 12))

# 2. Extraer la matriz de contribuciones matemáticas
var_pca <- get_pca_var(res.pca)

cat("Contribución porcentual a la Dimensión 1 (El primer factor del mercado):\n")
## Contribución porcentual a la Dimensión 1 (El primer factor del mercado):
print(round(var_pca$contrib[, 1], 2))
##      preciom    areaconst habitaciones       banios parqueaderos 
##        22.25        23.32        12.25        23.79        18.40
cat("\nContribución porcentual a la Dimensión 2 (El segundo factor diferenciador):\n")
## 
## Contribución porcentual a la Dimensión 2 (El segundo factor diferenciador):
print(round(var_pca$contrib[, 2], 2))
##      preciom    areaconst habitaciones       banios parqueaderos 
##        14.90         0.68        59.86         2.29        22.27

El análisis del círculo de correlaciones revela dos comportamientos distintos en la oferta inmobiliaria. Por un lado, se evidencia una fuerte asociación positiva entre el área construida, el número de baños, los parqueaderos y el precio, variables que en conjunto definen la magnitud estructural y el valor del inmueble (Dimensión 1). Por otro lado, la variable ‘habitaciones’ se proyecta de manera casi ortogonal a este grupo principal (Dimensión 2), indicando que la segmentación de los espacios habitables constituye un factor independiente. De lo anterior sería posible plantear que a mayor tamaño, mayor equipamiento y mayor precio.

5.4 Paso 4: Grafica de propiedades inmobiliaria en el plano PCA

fviz_pca_ind(res.pca,
             geom = "point",
             col.ind = "cos2",     
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # Azul (baja) a Rojo (alta)
             alpha.ind = 0.6,      # 
             title = "Figura 4: Dispersión de Propiedades en el Plano Principal (PCA)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 12))

La gráfica revela visualmente cómo está compuesto el mercado inmobiliario de la ciudad. La gran concentración de puntos agrupados en la zona central e izquierda indica que la mayoría de las viviendas comparten características muy similares en cuanto a tamaño, distribución y precio, es decir, viviendas de tamaño y precio estándar. Por el contrario, a medida que nos movemos hacia la derecha (inmuebles más grandes y costosos), los puntos se separan mucho más entre si, lo que indica que las propiedades grandes y costosas son menos frecuentes y pertenecen a un mercado más exclusivo. Además, las viviendas promedio tienden a parecerse mucho entre sí, mientras que las propiedades más grandes o con características particulares se distinguen con mayor claridad en el análisis. En conjunto, esto confirma que el mercado está compuesto principalmente por oferta tradicional, pero también incluye nichos específicos que pueden representar oportunidades estratégicas para la empresa.

6 Análisis de conglomerados

En línea con el tercer objetivo específico, se realiza un Análisis de Conglomerados con el fin de agrupar las propiedades en segmentos con características similares. A partir de los resultados obtenidos en el Análisis de Componentes Principales, se busca identificar cómo se organiza el mercado y qué tipos de viviendas comparten perfiles parecidos. Esta segmentación permite comprender mejor las distintas dinámicas de oferta presentes en la ciudad y facilita la formulación de recomendaciones estratégicas para orientar la inversión y las estrategias comerciales de la empresa inmobiliaria.

6.1 Paso 1: Determinación Número de Segmentos

Antes de aplicar el algoritmo de agrupamiento, es importante definir cuántos grupos representan mejor la estructura del mercado. Para ello, se utilizan las dos primeras dimensiones obtenidas en el PCA, ya que concentran la mayor parte de la información y permiten trabajar con datos más organizados y fáciles de interpretar.

Con el fin de determinar el número adecuado de segmentos, se aplica el Método del Codo. Este procedimiento ayuda a identificar en qué punto dividir el mercado produce grupos suficientemente diferenciados entre sí, evitando crear más segmentos de los necesarios y asegurando que cada grupo tenga coherencia interna.

# 1. Extraer las coordenadas de los individuos de las dimensiones 1 y 2 del PCA
datos_pca <- get_pca_ind(res.pca)$coord[, 1:2] 

# 2. Fijar semilla para garantizar la reproducibilidad de los resultados
set.seed(123)

# 3. Visualizar el Método del Codo (WSS)
fviz_nbclust(datos_pca, kmeans, method = "wss") +
  theme_minimal() +
  labs(title = "Figura 5: Método del Codo para Número de Clústeres",
       x = "Número de clústeres (k)",
       y = "Variabilidad dentro de los grupos") +
  theme(plot.title = element_text(face = "bold", size = 12))

Al analizar la Figura 5, se observa que la variación dentro de los grupos disminuye considerablemente cuando se pasa de uno a tres segmentos. A partir de tres grupos, la mejora comienza a ser mucho menor y la curva se vuelve más estable, formando el “codo”. Esto indica que dividir el mercado en más de tres o cuatro grupos no aportaría diferencias realmente significativas y podría complicar innecesariamente la interpretación. Por esta razón, y buscando un equilibrio entre precisión y utilidad práctica para la empresa, se concluye que la segmentación más adecuada para este mercado es de tres clústeres.

6.2 Paso 2: Agrupamiento (K-Means)

Una vez definido el número óptimo de grupos, se aplica el algoritmo K-Means utilizando las coordenadas obtenidas del Análisis de Componentes Principales. Este método asigna cada propiedad al grupo con el que comparte mayor cercanía en sus características, formando segmentos internamente más homogéneos. Finalmente, los grupos se representan en el plano factorial para visualizar con claridad cómo se delimitan los distintos nichos del mercado inmobiliario.

# 1. Aplicar el algoritmo K-Means con k = 3
set.seed(123) # Se mantiene la semilla para reproducibilidad
km_res <- kmeans(datos_pca, centers = 3, nstart = 25)

# 2. Agregar la asignación del clúster a nuestra base de datos original
vivienda_limpia$Cluster <- as.factor(km_res$cluster)

# 3. Visualizar los clústeres en el plano de las componentes principales
fviz_cluster(km_res, data = datos_pca,
             geom = "point",
             ellipse.type = "convex", 
             palette = "jco",
             ggtheme = theme_minimal(),
             main = "Figura 6: Segmentación del Mercado Inmobiliario (K-Means)") +
  theme(plot.title = element_text(face = "bold", size = 12))

La Figura 6 muestra cómo quedan distribuidas las propiedades una vez aplicada la segmentación con K-Means sobre el plano factorial. Al observar la ubicación de cada grupo, es posible identificar con claridad tres perfiles comerciales diferenciados dentro del mercado inmobiliario.

El Clúster 1 (azul) se ubica en valores medios de tamaño y precio, pero destaca por tener mayor número de habitaciones. Esto sugiere un segmento orientado a familias que priorizan la cantidad de espacios internos, incluso manteniendo precios relativamente accesibles. Es un mercado enfocado en funcionalidad y capacidad de alojamiento.

El Clúster 2 (amarillo) ocupa la zona derecha del gráfico, donde se concentran los valores más altos de tamaño, equipamiento y precio. Corresponde al segmento premium o de lujo, compuesto por propiedades más grandes, con más baños y parqueaderos, y con los precios más elevados. Además, la dispersión dentro de este grupo indica que el mercado de alto valor es variado y exclusivo.

Por su parte, el Clúster 3 (gris) se concentra en la parte inferior izquierda, agrupando propiedades de menor tamaño, menor precio y menos servicios. Representa el segmento más tradicional y masivo del mercado, orientado a compradores que buscan opciones más económicas o funcionales.

Esta clasificación permite diseñar estrategias comerciales específicas para cada segmento: oferta accesible y de rotación para el mercado tradicional, propuestas familiares con mayor compartimentación de espacios y una estrategia especializada para propiedades de alto valor.

7 Análisis de Correspondencias Múltiples

En cumplimiento del cuarto objetivo específico, se realiza un Análisis de Correspondencias Múltiples (ACM) con el fin de explorar cómo se relacionan entre sí las variables categóricas del mercado inmobiliario. A diferencia de los análisis anteriores, que se enfocaron en tamaño y precio, este procedimiento permite identificar patrones entre categorías, por ejemplo, si determinados tipos de vivienda predominan en ciertas zonas o barrios. De esta manera, la empresa obtiene una visión más clara de cómo se distribuye la oferta en el territorio y qué combinaciones son más frecuentes.

7.1 Paso 1: Selección de variables

Para llevar a cabo el análisis, se seleccionan las variables categóricas definidas en el proyecto: tipo de vivienda, zona y barrio. Cabe aclarar que inicialmente se realizó el gráfico con todos los registros de la variable barrio, no obstante, el gráfico quedaba ilegible con texto superpuesto, debido a esto se tomó la decisión de seleccionar el top 15 de los barrios con mayor cantidad de ofertas, agrupando el resto en una categoría llamada ‘otros’.

# 1. Preparar las variables categóricas (Agrupando el Top 15 de barrios)
vivienda_cat <- vivienda_limpia %>%
  mutate(barrio_agrupado = fct_lump_n(barrio, n = 15, other_level = "Otros_Barrios")) %>%
  select(tipo, zona, barrio_agrupado) %>% 
  mutate(across(everything(), as.factor))

# 2. Ejecutar el Análisis de Correspondencias Múltiples (ACM)
res.mca <- MCA(vivienda_cat, graph = FALSE)

# 3. Visualizar las asociaciones entre categorías en el plano bidimensional
fviz_mca_var(res.mca, 
             repel = TRUE,         # Evita la superposición de textos
             col.var = "contrib",  # Colorea según la importancia de la categoría
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # De Azul a Rojo
             title = "Figura 7: Asociaciones entre Tipo de Vivienda, Zona y Barrios") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 12))

La Figura 7 muestra cómo se agrupan y relacionan las distintas categorías del mercado inmobiliario. En este tipo de gráfico, las categorías que aparecen más cerca entre sí tienden a presentarse juntas con mayor frecuencia, mientras que las que están alejadas representan comportamientos distintos dentro de la ciudad.

En el caso de la Zona Oeste, se observa una asociación muy marcada con barrios como Santa Teresita, Normandía, Los Cristales y Aguacatal. Su ubicación apartada del resto indica que probablemente este sector tiene un perfil propio y diferenciado, con características muy particulares frente a otras zonas de la ciudad.

Asimismo, el gráfico evidencia una clara diferencia entre el Norte y el Sur. La Zona Norte se relaciona con barrios como La Flora y Prados del Norte, mientras que la Zona Sur agrupa una alta concentración de oferta en sectores como Ciudad Jardín, Pance y Valle del Lili. Esta separación sugiere que ambas zonas responden a dinámicas de mercado distintas.

En cuanto al tipo de vivienda, los apartamentos aparecen cerca del centro del gráfico, lo que indica que están presentes en casi todas las zonas y constituyen el producto más transversal del mercado. Por el contrario, las casas se ubican más alejadas y asociadas a sectores específicos, lo que sugiere que su oferta es más localizada y menos distribuida en toda la ciudad.

En términos estratégicos, el análisis confirma que la ubicación es un factor clave en la estructura del mercado inmobiliario. La empresa debería considerar la ciudad como un conjunto de zonas con comportamientos propios como Sur, Norte y Oeste y diseñar estrategias diferenciadas para cada una. Mientras que la comercialización de apartamentos puede abordarse de forma más general, la venta de casas requiere un enfoque más específico y adaptado al contexto de cada zona.

8 Conclusiones y Recomendaciones

El análisis integral realizado permitió comprender de manera clara cómo se estructura y segmenta el mercado inmobiliario urbano. A partir de las diferentes técnicas aplicadas, fue posible identificar patrones de valoración, segmentación natural de la oferta y comportamientos geográficos diferenciados, transformando la información estadística en insumos estratégicos para la toma de decisiones.

8.1 Conclusiones

En primer lugar, el Análisis de Componentes Principales evidenció que el valor de los inmuebles se organiza alrededor de dos grandes factores. El primero está asociado a la magnitud del inmueble (área, baños, parqueaderos y precio), que crecen de manera conjunta y explican gran parte del comportamiento del mercado. El segundo factor está relacionado con la distribución interna, particularmente el número de habitaciones, que actúa como un elemento diferenciador independiente. Esto demuestra que el mercado no solo valora el tamaño, sino también cómo está organizado el espacio.

En segundo lugar, el Análisis de Conglomerados confirmó que la oferta inmobiliaria no es homogénea, sino que se divide en tres segmentos claramente diferenciados: un segmento económico o tradicional, que concentra la mayor parte de la oferta; un segmento familiar, con precios competitivos; y un segmento premium, compuesto por propiedades de mayor tamaño y alto valor, con características más exclusivas.

Finalmente, el Análisis de Correspondencias mostró que la ubicación geográfica es un factor determinante en la configuración del mercado. La Zona Oeste se comporta como un nicho diferenciado y exclusivo, mientras que el Norte y el Sur presentan dinámicas propias y consolidadas. Además, los apartamentos aparecen como el tipo de vivienda más transversal en toda la ciudad, mientras que las casas presentan una distribución más localizada.

8.2 Recomendaciones

Con base en estos hallazgos, se recomienda a la dirección de la empresa adoptar una estrategia diferenciada por segmento y por zona geográfica.

En primer lugar, estructurar estrategias comerciales específicas para cada uno de los tres segmentos identificados. El segmento económico requiere enfoque en volumen y rotación; el segmento familiar demanda una comunicación orientada a funcionalidad y habitabilidad; y el segmento premium necesita estrategias más personalizadas y de alto valor agregado.

En segundo lugar, la ubicación debe convertirse en un eje central de la estrategia comercial. La Zona Oeste muestra un comportamiento diferenciado y puede trabajarse con una imagen más exclusiva. El Norte y el Sur también presentan dinámicas propias, por lo que conviene adaptar los mensajes y el enfoque comercial según la zona.

Finalmente, al momento de valorar una propiedad, no solo debe considerarse el tamaño o el precio promedio del sector, sino también cómo está distribuido el espacio. La cantidad de habitaciones demostró ser un elemento que influye en el perfil del comprador, por lo que puede representar una ventaja competitiva si se comunica adecuadamente.

9 Anexos

9.1 Anexo 1

#Cargue de la Base de datos
#devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
data("vivienda")
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   zona = col_character(),
##   ..   piso = col_character(),
##   ..   estrato = col_double(),
##   ..   preciom = col_double(),
##   ..   areaconst = col_double(),
##   ..   parqueaderos = col_double(),
##   ..   banios = col_double(),
##   ..   habitaciones = col_double(),
##   ..   tipo = col_character(),
##   ..   barrio = col_character(),
##   ..   longitud = col_double(),
##   ..   latitud = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

9.2 Anexo 2

# 1. Eliminación de registros con nulos estructurales (las 3 filas vacías)
vivienda_limpia <- vivienda %>%
  filter(!is.na(id) & !is.na(preciom))

# 2. Corrección de inconsistencias lógicas (observadas en los outliers)
vivienda_limpia <- vivienda_limpia %>%
  filter(habitaciones > 0, banios > 0) 

# 3. Imputación de la variable 'parqueaderos' usando la mediana agrupada
vivienda_limpia <- vivienda_limpia %>%
  group_by(estrato, tipo) %>%
  mutate(
    parqueaderos = ifelse(is.na(parqueaderos), 
                          median(parqueaderos, na.rm = TRUE), 
                          parqueaderos)
  ) %>%
  ungroup()

# 4. Tratamiento de la variable categórica 'piso'
vivienda_limpia <- vivienda_limpia %>%
  mutate(
    piso = ifelse(is.na(piso) & tipo == "Casa", "No Aplica", piso),
    piso = ifelse(is.na(piso) & tipo == "Apartamento", "No Registrado", piso)
  )

# Verificación final de calidad de los datos
nulos_finales <- colSums(is.na(vivienda_limpia))
cat("Total de valores nulos restantes en variables cuantitativas (esperado 0):\n")
## Total de valores nulos restantes en variables cuantitativas (esperado 0):
print(nulos_finales[c("preciom", "areaconst", "habitaciones", "banios", "parqueaderos")])
##      preciom    areaconst habitaciones       banios parqueaderos 
##            0            0            0            0            0