1 Contexto

Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades. Por lo tanto, este estudio presenta el resumen integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo Análisis de Componentes Principales, Análisis de Conglomerados, Análisis de Correspondencia Y Visualización de resultados.

knitr::opts_chunk$set(message = FALSE, warning = FALSE)
# Escribir en español
Sys.setlocale("LC_ALL", "es_ES.UTF-8")
#Cargar paquetes----
library(e1071)         # Para calcular asimetría y curtosis
library(knitr)         # Para generar tablas con kable
library(kableExtra)    # Para mejorar el formato de las tablas
library(readxl)      # Para leer archivos Excel
library(dplyr)       # Para la manipulación de datos
library(tidyr)       # Para la manipulación de datos
library(expss)
library(summarytools)
library(ggplot2)
library(EnvStats)  
library(gridExtra)
library(naniar)
library(VIM)
library(UpSetR)
library(mice)
library(nortest)
library(tidyverse)
library(skimr)
library(GGally)
library(corrplot)
library(reshape2)
library(FactoMineR)
library(factoextra)
library(dplyr)

2 Análisis Exploratorio y Preprocesamiento de Datos

A continuación se presenta el análisis exploratorio de la base de datos, la cual está conformada por 13 atributos y 8322 observaciones.

library(paqueteMODELOS)
data("vivienda")

2.1 Dimensiones y estructura

# DIMENSIONES Y ESTRUCTURA
glimpse(vivienda)
## Rows: 8,322
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom      <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst    <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios       <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
# Conteo por tipo
table(sapply(vivienda, class))
## 
## character   numeric 
##         4         9

Respecto a su estructura, se identifica que cuatro atributos se clasifican como categóricos y nueve atributos como variables numéricas de doble precisión (dbl: número decimal), sin embargo la variable estrato en realidad corresponde a una variable categórica, por ello se realiza el ajuste correspondiente.

vivienda$estrato <- as.character(vivienda$estrato)
str(vivienda$estrato)
##  chr [1:8322] "3" "3" "3" "4" "5" "5" "4" "5" "5" "5" "6" "4" "5" "6" "4" ...

De esta manera se tiene obtiene el siguiente resumen de la base de datos:

# Resumen detallado
skim(vivienda)
Data summary
Name vivienda
Number of rows 8322
Number of columns 13
_______________________
Column type frequency:
character 5
numeric 8
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 3 1.00 8 12 0 5 0
piso 2638 0.68 2 2 0 12 0
estrato 3 1.00 1 1 0 4 0
tipo 3 1.00 4 11 0 2 0
barrio 3 1.00 4 29 0 436 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 3 1.00 4160.00 2401.63 1.00 2080.50 4160.00 6239.50 8319.00 ▇▇▇▇▇
preciom 2 1.00 433.89 328.65 58.00 220.00 330.00 540.00 1999.00 ▇▂▁▁▁
areaconst 3 1.00 174.93 142.96 30.00 80.00 123.00 229.00 1745.00 ▇▁▁▁▁
parqueaderos 1605 0.81 1.84 1.12 1.00 1.00 2.00 2.00 10.00 ▇▁▁▁▁
banios 3 1.00 3.11 1.43 0.00 2.00 3.00 4.00 10.00 ▇▇▃▁▁
habitaciones 3 1.00 3.61 1.46 0.00 3.00 3.00 4.00 10.00 ▂▇▂▁▁
longitud 3 1.00 -76.53 0.02 -76.59 -76.54 -76.53 -76.52 -76.46 ▁▅▇▂▁
latitud 3 1.00 3.42 0.04 3.33 3.38 3.42 3.45 3.50 ▃▇▅▇▅

Como puede observarse, en términos generales, la base presenta un alto nivel de completitud en la mayoría de variables. No obstante, se identifican algunos patrones relevantes:

  • piso presenta 2.638 valores faltantes (32% de la muestra).

  • parqueaderos presenta 1.605 valores faltantes (19%).

  • Las demás variables tienen niveles mínimos de ausencia (≤ 3 registros).

El porcentaje elevado de datos faltantes en piso sugiere un posible omisión sistemática (ej. casas sin piso definido). Esto lleva a la necesidad de evaluar si los NA son aleatorios (MCAR) o estructurales. En el caso de parqueaderos, el patrón podría indicar que algunos inmuebles no disponen de este atributo y no necesariamente un error de registro.

Respecto a las variables categóricas se tiene que: zona presneta 5 categorías, alta completitud y distribución aparentemente equilibrada. El estrato presenta 4 categorías, es importante resaltar que es una Variable ordinal relevante en el contexto colombiano como potencial predictor clave del precio. El tipo de vivienda presenta 2 categorías y es estructuralmente importante. El barrio presenta 436 categorías únicas. Piso presenta 12 categorías, una alta tasa de valores faltantes y puede ser relevante en apartamentos pero irrelevante en casas.

Respecto a las variables numéricas, el precio (preciom) con media: 433.89, mediana: 330 y máximo: 1999 presenta un histograma con fuerte asimetría positiva (cola hacia la derecha) típica en mercados inmobiliarios. Esto sugiere presencia de propiedades de alto valor que inflan la media. En el Área construida (areaconst) con media: 174.93, mediana: 123 y máximo: 1745 se observa alta dispersión (sd = 142.96), presencia de posibles valores atípicos extremos y la diferencia entre media y mediana confirma asimetría positiva. En el atributo Parqueaderos con media: 1.84, rango: 1 a 10 y 19% de datos faltantes, la distribución concentrada en 1–2 parqueaderos, con pocos valores altos. En el atributo Baños y Habitaciones con media baños: 3.11 y media habitaciones: 3.61 las distribuciones son relativamente simétricas y coherentes con vivienda urbana media, se observan valores mínimos en 0, lo que podría corresponder a registros especiales o errores de digitación.

Respecto a las Variables geográficas la longitud media: -76.53 (sd = 0.02) y la latitud media: 3.42 (sd = 0.04) presentan baja desviación estándar lo que indica que la muestra corresponde a una ciudad específica, existe concentración espacial y son variables adecuadas para análisis espacial o clustering geográfico.

2.2 Análisis de datos faltantes

Debido a la presencia de datos faltantes, se pasa a realizar un estudio más preciso al respecto y tomar decisiones en cuanto a dichos registros, de esta manera se tiene que:

# ANÁLISIS DE VALORES FALTANTES (ANTES DE ELIMINARLOS)

# Visualización patrón de NA
vis_miss(vivienda)

# Porcentaje de NA por variable
na_por_variable <- colSums(is.na(vivienda))
porcentaje_na <- (na_por_variable / nrow(vivienda)) * 100
round(porcentaje_na, 2)
##           id         zona         piso      estrato      preciom    areaconst 
##         0.04         0.04        31.70         0.04         0.02         0.04 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##        19.29         0.04         0.04         0.04         0.04         0.04 
##      latitud 
##         0.04
# Mapa de calor de NA
gg_miss_upset(vivienda)

Considerando que varias variables tienen 3 datos faltantes, se analizó los registros por filas, obteniendo que:

vivienda %>%
  mutate(
    fila = row_number(),                 # Número de fila original
    n_na = rowSums(is.na(.))             # Conteo de NA por fila
  ) %>%
  arrange(desc(n_na)) %>%                # Orden descendente
  select(fila, n_na, everything()) %>%   # Mostrar primero fila y n_na
  head(10)
## # A tibble: 10 × 15
##     fila  n_na    id zona    piso  estrato preciom areaconst parqueaderos banios
##    <int> <dbl> <dbl> <chr>   <chr> <chr>     <dbl>     <dbl>        <dbl>  <dbl>
##  1  8320    13    NA <NA>    <NA>  <NA>         NA        NA           NA     NA
##  2  8321    13    NA <NA>    <NA>  <NA>         NA        NA           NA     NA
##  3  8322    12    NA <NA>    <NA>  <NA>        330        NA           NA     NA
##  4    28     2   141 Zona N… <NA>  3           230       160           NA      2
##  5    29     2   238 Zona N… <NA>  5           430       105           NA      3
##  6    30     2   243 Zona N… <NA>  3           190       435           NA      0
##  7    31     2   504 Zona N… <NA>  3           180       120           NA      3
##  8    32     2   565 Zona N… <NA>  3           500       210           NA      6
##  9    33     2   567 Zona N… <NA>  3           199       176           NA      1
## 10    34     2   589 Zona N… <NA>  5           320       235           NA      4
## # ℹ 5 more variables: habitaciones <dbl>, tipo <chr>, barrio <chr>,
## #   longitud <dbl>, latitud <dbl>

Las filas 8320, 8321 y 8322 tienen faltantes en todos o casi todos los atributos (incluyendo id), por esta razón se decide eliminar dichas observaciones de la base de datos.

vivienda <- vivienda[-c(8320, 8321, 8322), ]
nrow(vivienda)
## [1] 8319

Se verificó la unicidad de la variable id, al confirmar que se trata de un identificador único (secuencial), la variable es descartada del modelo.

sum(duplicated(vivienda$id))
## [1] 0
vivienda <- vivienda %>%
  select(-id)

Considerando que pisto presenta un porcentaje de 31.7% de valores pérdidos, se hace necesario establecer si si los NA son aleatorios (MCAR) o estructurales (dependen del tipo de inmueble).

table(vivienda$tipo, is.na(vivienda$piso))
##              
##               FALSE TRUE
##   Apartamento  3719 1381
##   Casa         1965 1254
library(naniar)
vis_miss(vivienda)

vivienda %>%
  mutate(piso_NA = is.na(piso)) %>%
  count(tipo, piso_NA) %>%
  group_by(tipo) %>%
  mutate(prop = n / sum(n))
## # A tibble: 4 × 4
## # Groups:   tipo [2]
##   tipo        piso_NA     n  prop
##   <chr>       <lgl>   <int> <dbl>
## 1 Apartamento FALSE    3719 0.729
## 2 Apartamento TRUE     1381 0.271
## 3 Casa        FALSE    1965 0.610
## 4 Casa        TRUE     1254 0.390
#Modelo logístico
vivienda$piso_NA <- as.numeric(is.na(vivienda$piso))

modelo_missing <- glm(piso_NA ~ preciom + areaconst + banios + habitaciones + tipo + estrato,
                      data = vivienda,
                      family = binomial)

summary(modelo_missing)
## 
## Call:
## glm(formula = piso_NA ~ preciom + areaconst + banios + habitaciones + 
##     tipo + estrato, family = binomial, data = vivienda)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.5599202  0.0864554  -6.476 9.39e-11 ***
## preciom       0.0003572  0.0001344   2.657  0.00788 ** 
## areaconst     0.0001393  0.0002704   0.515  0.60653    
## banios       -0.0822314  0.0284933  -2.886  0.00390 ** 
## habitaciones -0.0196334  0.0232916  -0.843  0.39926    
## tipoCasa      0.5502857  0.0640241   8.595  < 2e-16 ***
## estrato4     -0.3767814  0.0764270  -4.930 8.22e-07 ***
## estrato5     -0.3969932  0.0773842  -5.130 2.89e-07 ***
## estrato6     -0.2689436  0.1055865  -2.547  0.01086 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 10389  on 8318  degrees of freedom
## Residual deviance: 10203  on 8310  degrees of freedom
## AIC: 10221
## 
## Number of Fisher Scoring iterations: 4

El análisis mediante regresión logística evidencia que la probabilidad de ausencia de información en la variable piso depende significativamente de variables observadas como el tipo de inmueble, el precio y el estrato socioeconómico. En particular, los inmuebles clasificados como casas presentan una probabilidad significativamente mayor de tener el valor de piso faltante en comparación con apartamentos.

Dado que el mecanismo de ausencia está asociado a variables observadas y responde a la naturaleza estructural del atributo (el piso no aplica en casas), se concluye que el patrón de datos faltantes no es MCAR. En consecuencia, la ausencia en piso corresponde principalmente a un mecanismo estructural y no a un proceso aleatorio.

2.3 Análisis de valores atípicos

A continuación se observan los boxplot para las variables numéricas:

vivienda %>%
  select(where(is.numeric)) %>%
  pivot_longer(cols = everything(),
               names_to = "Variable",
               values_to = "Valor") %>%
  ggplot(aes(x = Variable, y = Valor)) +
  geom_boxplot(fill = "skyblue") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Boxplot de variables numéricas")

Precio y área construida presentan fuerte asimetría positiva y numerosos outliers, característica común en mercados inmobiliarios. ariables estructurales como baños y habitaciones muestran comportamiento estable.No se evidencian problemas en las variables geográficas. Existen valores extremos que podrían influir en modelos de regresión.

numericas <- vivienda %>% select(where(is.numeric))

categoricas <- vivienda %>%
  select(where(~ is.factor(.) | is.character(.)))
# DETECCIÓN FORMAL DE OUTLIERS (IQR)

outliers_detectados <- list()

for (var in names(numericas)) {
  Q1 <- quantile(numericas[[var]], 0.25, na.rm = TRUE)
  Q3 <- quantile(numericas[[var]], 0.75, na.rm = TRUE)
  IQR_val <- Q3 - Q1
  
  limite_inf <- Q1 - 1.5 * IQR_val
  limite_sup <- Q3 + 1.5 * IQR_val
  
  outliers <- numericas[[var]][numericas[[var]] < limite_inf | 
                                  numericas[[var]] > limite_sup]
  
  outliers_detectados[[var]] <- length(outliers)
}

outliers_detectados
## $preciom
## [1] 552
## 
## $areaconst
## [1] 382
## 
## $parqueaderos
## [1] 2169
## 
## $banios
## [1] 72
## 
## $habitaciones
## [1] 888
## 
## $longitud
## [1] 130
## 
## $latitud
## [1] 0
## 
## $piso_NA
## [1] 0

2.4 Relación entre variables numéricas

Con el propósito de examinar la estructura de dependencia entre las variables cuantitativas de la base de datos vivienda, se construyó una matriz de gráficos de dispersión mediante la función ggpairs(). Esta herramienta permitió analizar simultáneamente las distribuciones marginales, las relaciones bivariadas y los coeficientes de correlación lineal de Pearson.

# RELACIONES ENTRE VARIABLES NUMÉRICAS
if(ncol(numericas) <= 10){
  ggpairs(numericas)
}

Los resultados evidencian que el precio del inmueble (preciom) presenta correlaciones positivas moderadamente altas con variables asociadas a la dimensión física del inmueble:

  • Área construida (areaconst): r = 0.687

  • Número de parqueaderos (parqueaderos): r = 0.689

  • Número de baños (banios): r = 0.669

  • Número de habitaciones (habitaciones): r = 0.264

Estos valores sugieren que el precio se encuentra fuertemente influenciado por las características estructurales del inmueble. En particular, el área construida y el número de parqueaderos muestran la mayor asociación lineal, lo cual es consistente con la teoría económica del mercado inmobiliario, donde el tamaño y las comodidades adicionales incrementan el valor comercial.

Se observan correlaciones moderadas entre variables estructurales:

  • Área – Baños: r = 0.648

  • Área – Parqueaderos: r = 0.585

  • Baños – Habitaciones: r = 0.590

Las variables espaciales (longitud y latitud) muestran correlaciones negativas con el precio (-0.344 y -0.116, respectivamente), lo que indica que ciertas zonas geográficas presentan valores promedio inferiores. Aunque la magnitud de estas correlaciones es menor que la observada para las características físicas del inmueble, la ubicación continúa siendo un factor relevante en la determinación del precio.

Las distribuciones marginales evidencian asimetría positiva en el precio y en el área construida, característica común en datos inmobiliarios. Esta situación puede afectar los supuestos de normalidad en modelos paramétricos, por lo que podría evaluarse la aplicación de transformaciones logarítmicas sobre el precio antes de proceder con modelamiento estadístico.

3 Análisis de Componentes Principales

Se realizó el análisis de componentes principales para reducir la dimensionalidad e identificar las variables que explican la variabilidad del mercado inmobiliario. Se seleccionaron las variables numéricas de precio, área construida, parqueaderos, baños y habitaciones (la variable pisos no fue tomada en cuenta debido al alto porcentaje de valores faltantes los cuales son de comportamiento estructural como se observó en el análisis de datos atípicos).

vivienda <- vivienda %>%
  mutate(
    estrato = as.character(estrato),
    tipo = as.character(tipo),
    zona = as.character(zona)
  )


vars_num <- vivienda %>%
  select(preciom, areaconst, parqueaderos, banios, habitaciones)

str(vars_num)
## tibble [8,319 × 5] (S3: tbl_df/tbl/data.frame)
##  $ preciom     : num [1:8319] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8319] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8319] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8319] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8319] 6 3 4 3 3 3 3 4 6 3 ...
vars_num <- na.omit(vars_num)
vivienda_limpia <- vivienda[rownames(vars_num), ]

El gráfico de sedimentación (Scree Plot) presenta el porcentaje de varianza explicada por cada componente principal obtenido a partir de las variables numéricas del conjunto de datos vivienda. De acuerdo con la gráfica:

  • Componente 1 (Dim 1) explica aproximadamente 65–66% de la varianza total.

  • Componente 2 (Dim 2) explica cerca de 17–18%.

  • Componente 3 (Dim 3) alrededor de 7–8%.

  • Componente 4 (Dim 4) cerca de 6%.

  • Componente 5 (Dim 5) aproximadamente 4%.

Se observa una caída pronunciada entre el primer y el segundo componente, lo que indica que la mayor parte de la información del conjunto de datos está concentrada en la primera dimensión. Existe una fuerte estructura subyacente común entre las variables numéricas (probablemente asociada al tamaño y valor del inmueble). Además, el gráfico muestra un “punto de codo” claro después del segundo componente, lo cual sugiere que: A partir del tercer componente, la ganancia en varianza explicada es marginal. Los componentes 3, 4 y 5 aportan información adicional limitada.

Los dos primeros componentes explican aproximadamente el 82% (total al sumar las varianzas explicadas) de la variabilidad total del conjunto de datos, lo cual es un porcentaje alto en análisis multivariado. Desde una perspectiva estadística es razonable conservar solo los dos primeros componentes principales. La dimensionalidad del problema puede reducirse de cinco variables originales a dos dimensiones sintéticas sin perder información sustancial, esto facilita la visualización, interpretación y posibles análisis posteriores (clustering, modelos predictivos, segmentación).

library(FactoMineR)
library(factoextra)

pca_viv <- PCA(vars_num, scale.unit = TRUE, graph = FALSE)

fviz_eig(pca_viv)

fviz_pca_var(
  pca_viv,
  col.var = "contrib",
  gradient.cols = c("blue", "yellow", "red") #Azul=baja contribución, Amarillo=media, Rojo=alta contribución
)

El gráfico del círculo de correlaciones del PCA, donde se representan las variables originales proyectadas sobre los dos primeros componentes principales, evidencia que la primera dimensión representa un factor general de tamaño o capacidad del inmueble. A mayor número de habitaciones, baños, parqueaderos y mayor área construida, mayor será el valor en Dim1.Este componente puede interpretarse como un indicador global del tamaño o nivel estructural de la propiedad.

La Dim2 (17.2%) diferencia principalmente: Habitaciones (carga positiva alta), Parqueaderos (carga negativa), Área construida y baños con cargas cercanas a cero, por ello este eje distingue propiedades con más habitaciones (valores positivos en Dim2), más parqueaderos (valores negativos en Dim2), esto sugiere un contraste estructural entre distribución interna (habitaciones) y capacidad de estacionamiento.

Todos los vectores están cercanos al círculo unitario, lo que indica:

  • Alta calidad de representación en el plano Dim1–Dim2.

  • Las variables están bien explicadas por los dos primeros componentes.

  • No hay variables mal representadas en este espacio bidimensional.

Según la escala de color (contrib): habitaciones muestra la mayor contribución al modelo. Las demás variables presentan contribuciones similares (aproximadamente entre 19% y 22%). Esto indica que ninguna variable domina completamente la estructura, aunque habitaciones tiene una ligera mayor influencia.

Conclusión PCA

Existe un factor principal dominante (Dim1) asociado al tamaño y capacidad del inmueble. La segunda dimensión introduce una diferenciación secundaria entre número de habitaciones y parqueaderos. Las variables están fuertemente correlacionadas y bien representadas en el modelo. El modelo bidimensional es adecuado para describir la estructura de los datos.

En términos prácticos, el mercado analizado parece estar fuertemente determinado por el tamaño global de la propiedad, siendo esta la dimensión estructural más importante.

4 Análisis de Conglomerados

Para segmentar las viviendas en grupos homogéneos según sus características reales, ser realizó el análisis de conglomerados

# ANÁLISIS DE CONGLOMERADOS


# Librerías
library(tidyverse)
library(factoextra)
library(cluster)

# --------------------------------
# Eliminar valores faltantes
# --------------------------------
vars_clean <- vars_num %>% drop_na()

# Guardar índice de filas completas
filas_completas <- complete.cases(vars_num)


# Estandarizar variables

datos_scaled <- scale(vars_clean)


# Determinar número óptimo (método del codo)

fviz_nbclust(datos_scaled, kmeans, method = "wss") +
  labs(title = "Método del Codo")

La evidencia gráfica sugiere que la base de datos presenta tres grupos naturales diferenciados, los cuales permiten reducir la heterogeneidad interna, mantener una estructura interpretable, evitar sobreajuste por exceso de conglomerados. En consecuencia, se adopta k = 3 como el número óptimo de clusters para el análisis posterior. Esto indica que la estructura natural de los datos de vivienda puede dividirse en tres grupos diferenciados, probablemente asociados a: Viviendas pequeñas, Viviendas medianas y Viviendas grandes.

# Clustering Jerárquico (Ward)

distancia <- dist(datos_scaled)
hc <- hclust(distancia, method = "ward.D2")

# Dendrograma
plot(hc, labels = FALSE, hang = -1)

El dendrograma evidencia la existencia de tres grupos claramente diferenciados, identificables mediante un corte horizontal antes del mayor incremento en la distancia de fusión. Esta solución coincide con la obtenida mediante el método del codo, lo que confirma la estabilidad y consistencia del número óptimo de conglomerados. En consecuencia, se adopta una partición en tres clusters, los cuales serán posteriormente caracterizados mediante el análisis de sus perfiles promedio.

# Cortar en 3 grupos (puedes cambiar el número)
k <- 3
grupos_hc <- cutree(hc, k = k)

# Visualización
fviz_cluster(list(data = datos_scaled, cluster = grupos_hc))

# K-means
set.seed(123)
kmeans_model <- kmeans(datos_scaled, centers = k, nstart = 25)

# Visualización
fviz_cluster(kmeans_model, data = datos_scaled)

# Agregar clusters a base original SIN ERROR

vars_num$cluster <- NA
vars_num$cluster[filas_completas] <- kmeans_model$cluster

# Perfil de conglomerados

perfil_clusters <- vars_num %>%
  group_by(cluster) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE))

print(perfil_clusters)
##   cluster   preciom areaconst parqueaderos   banios habitaciones
## 1       1 1129.8824 426.93775     3.929697 5.253333     4.606061
## 2       2  548.4504 231.90620     1.973227 4.123062     4.458901
## 3       3  278.9442  98.52281     1.297901 2.326601     2.912836
# Tamaño de cada cluster

table(vars_num$cluster)
## 
##    1    2    3 
##  825 2129 3763

Las figuras evidencian la aracterización de los conglomerados:

  • Cluster 1: Ubicado en valores intermedios–altos de Dim1. Representa viviendas de tamaño medio–grande. Presenta mayor dispersión vertical (Dim2), lo que indica heterogeneidad interna. Incluye algunos valores extremos (observaciones más alejadas).

Viviendas con mayor número de habitaciones, mayor área construida y más parqueaderos.

  • Cluster 2: Ubicado en valores intermedios de Dim1 y con tendencia negativa en Dim2. Grupo relativamente compacto. Representa viviendas de tamaño medio. Presenta menor variabilidad comparado con el cluster 1.

Propiedades de características intermedias en términos estructurales.

  • Cluster 3: Ubicado en valores bajos de Dim1. Grupo más homogéneo. Corresponde a viviendas de menor tamaño. Claramente diferenciado del cluster 1.

Viviendas pequeñas con menor número de habitaciones, baños y área construida.

5 Análisis de Correspondencia

Se realizó un Análisis de Correspondencia Múltiple (ACM) con las variables categóricas zona, estrato, tipo y barrio, y otro análisis sin contemplar el estrato, los resultados se presentan a continuación.

En el análisis de Correspondencia Múltiple (ACM) con las variables categóricas zona, estrato, tipo y barrio, las dos primeras dimensiones explican la mayor proporción de la inercia total, permitiendo identificar asociaciones entre categorías. Las categorías próximas en el plano factorial presentan patrones de asociación similares.

vars_cat <- vivienda_limpia %>%
  select(zona, estrato, tipo, barrio) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()
acm <- MCA(vars_cat, graph = FALSE)
head(acm$eig)
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.6543307              0.6543307                         0.6543307
## dim 2  0.5613667              0.5613667                         1.2156975
## dim 3  0.5162097              0.5162097                         1.7319071
## dim 4  0.4698811              0.4698811                         2.2017882
## dim 5  0.3984383              0.3984383                         2.6002265
## dim 6  0.3837794              0.3837794                         2.9840059
fviz_mca_biplot(acm)

El Análisis de Correspondencia Múltiple muestra que la Dimensión 1 presenta el mayor valor propio (0.654), seguida de la Dimensión 2 (0.561), indicando que estas concentran la mayor parte de la inercia asociada a las variables categóricas analizadas. Por tanto, el plano formado por las dos primeras dimensiones resulta adecuado para la interpretación de las asociaciones entre categorías.

En el biplot se observa la formación de algunos grupos de barrios ubicados en posiciones próximas dentro del plano factorial, lo que sugiere relaciones o perfiles similares entre ellos. Sin embargo, las dos primeras dimensiones explican un porcentaje muy bajo de la variabilidad total, lo que indica que la estructura asociativa no se concentra de manera significativa en este plano bidimensional, sino que se distribuye en varias dimensiones adicionales. En consecuencia, aunque el gráfico permite visualizar ciertas tendencias de agrupación y diferenciación entre categorías, la capacidad explicativa global del modelo en las dos primeras dimensiones es limitada, por lo que se recomienda complementar la interpretación con el análisis de contribuciones y dimensiones adicionales.

En el análisis de Correspondencia Múltiple (ACM) con las variables categóricas zona, tipo y barrio se tiene que:

vars_cat1 <- vivienda_limpia %>%
  select(zona, tipo, barrio) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()
acm1 <- MCA(vars_cat1, graph = FALSE)
head(acm1$eig)
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.7255455              0.5482712                         0.5482712
## dim 2  0.6595351              0.4983893                         1.0466604
## dim 3  0.6504425              0.4915183                         1.5381787
## dim 4  0.6243135              0.4717734                         2.0099521
## dim 5  0.4267580              0.3224872                         2.3324393
## dim 6  0.3333333              0.2518892                         2.5843285
fviz_mca_biplot(acm1)

El Análisis de Correspondencia Múltiple muestra que la Dimensión 1 presenta el mayor valor propio (0.726), explicando el 54,8% de la inercia relativa, seguida de la Dimensión 2 con un valor propio de 0.660 y una explicación del 49,8%. En conjunto, las dos primeras dimensiones acumulan aproximadamente 1.05 de inercia, lo que indica que concentran una parte importante de la estructura asociativa entre las variables categóricas analizadas. Las dimensiones 3 y 4 también presentan valores propios relativamente cercanos, lo que sugiere que la variabilidad no se concentra exclusivamente en un solo eje, sino que se distribuye de manera moderada en varias dimensiones. En términos generales, las primeras dos dimensiones son adecuadas para la representación gráfica e interpretación inicial del modelo, aunque las dimensiones adicionales aportan información complementaria que podría enriquecer el análisis si se requiere una explicación más detallada de las asociaciones.

El biplot del Análisis de Correspondencia Múltiple muestra la distribución conjunta de las categorías de zona, estrato, tipo y barrio en el plano formado por las dos primeras dimensiones (Dim1 = 0,5% y Dim2 = 0,5%). Se observa la conformación de varios agrupamientos de barrios ubicados en posiciones próximas, lo que indica asociaciones entre ciertas categorías y la existencia de perfiles diferenciados de vivienda. En el lado derecho del eje Dim1 se concentran barrios que comparten características similares, mientras que en el lado izquierdo se agrupan otros con patrones distintos, evidenciando una separación estructural entre conjuntos de categorías. De manera similar, la Dimensión 2 permite distinguir agrupaciones en la parte superior e inferior del gráfico, sugiriendo contrastes adicionales en las características analizadas. No obstante, el bajo porcentaje de varianza explicada por ambas dimensiones indica que la representación bidimensional captura solo una fracción reducida de la estructura total de asociación, por lo que las relaciones observadas deben interpretarse como tendencias generales y no como separaciones fuertes o concluyentes.

6 Mapa

Las variables latitud y longitud no fueron incluidas en los análisis de componentes principales ni en el análisis de conglomerados, dado que su incorporación no aporta información relevante para la reducción de dimensionalidad ni para la segmentación basada en características estructurales de las viviendas. No obstante, estas variables resultan fundamentales para la visualización espacial de los inmuebles, como se evidencia en el mapa de distribución geográfica presentado en el estudio.

ggplot(vivienda, aes(x = longitud, y = latitud)) +
  geom_point(alpha = 0.4) +
  theme_minimal()

El mapa de dispersión geográfica muestra la ubicación de las viviendas según coordenadas de latitud y longitud, evidenciando una concentración significativa de propiedades en la zona central y nororiental del área urbana, donde se observa una mayor densidad de puntos. También se identifican núcleos secundarios de concentración hacia el sur, lo que sugiere focos específicos de desarrollo inmobiliario o alta actividad comercial. En contraste, las áreas periféricas presentan menor densidad de oferta, indicando posibles oportunidades de expansión o menor penetración del mercado. La distribución no es homogénea, sino claramente agrupada en clústeres espaciales, lo que sugiere segmentación territorial del mercado inmobiliario y permite identificar zonas estratégicas tanto para fortalecimiento de inventario como para análisis de oportunidades de crecimiento.

7 Conclusiones

La proyección de los conglomerados sobre los dos primeros componentes principales evidencia una segmentación bien definida en tres grupos, principalmente diferenciados por el tamaño estructural de la vivienda. En consecuencia, el análisis confirma la existencia de tres perfiles estructurales de vivienda: pequeñas, medianas y grandes.

A partir del análisis estadístico realizado, se evidencia que las primeras dimensiones obtenidas concentran la mayor proporción de la variabilidad explicada en los datos. Esto indica que existen factores subyacentes que estructuran de manera significativa el comportamiento del mercado inmobiliario analizado. Dichos factores permiten sintetizar múltiples variables en componentes interpretables, reduciendo la complejidad de la información sin perder capacidad explicativa.

Así mismo, se observa que no todas las variables aportan el mismo nivel de contribución a la explicación del fenómeno estudiado. Algunas presentan mayor peso dentro de las dimensiones principales, lo que sugiere que determinados atributos como la ubicación, características del inmueble o condiciones del entorno influyen de manera más determinante en la dinámica del mercado.

El análisis también revela patrones diferenciados entre zonas geográficas y tipos de propiedades, lo cual permite identificar segmentos claramente definidos dentro del mercado inmobiliario. Esta segmentación constituye un insumo fundamental para la formulación de estrategias comerciales y de inversión más eficientes.

En conjunto, los resultados obtenidos demuestran que el modelo aplicado es adecuado para identificar estructuras internas en los datos y proporcionar evidencia empírica que respalde la toma de decisiones estratégicas dentro de la empresa inmobiliaria.

En conclusión, el análisis realizado constituye una herramienta valiosa para comprender la estructura del mercado inmobiliario estudiado. La adecuada interpretación de las dimensiones principales permite orientar decisiones estratégicas con mayor precisión, optimizando recursos y fortaleciendo la competitividad de la empresa en un entorno dinámico y altamente competitivo.

8 Recomendaciones estratégicas

Con base en los hallazgos del análisis, se plantean las siguientes recomendaciones:

  • La empresa debería priorizar aquellos atributos que presentan mayor peso en las dimensiones principales, orientando su estrategia comercial hacia los factores que realmente influyen en la decisión de compra o arriendo.

  • Se recomienda diseñar estrategias diferenciadas para cada grupo identificado, ajustando precios, promociones y canales de comunicación según las características predominantes de cada segmento.

  • Los resultados permiten identificar zonas con mayor potencial de valorización y demanda. En consecuencia, la empresa debería concentrar sus recursos en áreas estratégicas y evaluar el desempeño de propiedades ubicadas en sectores con menor dinamismo.

  • La utilización de mapas y análisis espaciales facilitará la identificación de patrones territoriales, permitiendo una mejor planificación de expansión y desarrollo de nuevos proyectos.

  • Se sugiere integrar estos resultados en los procesos de planeación estratégica, fortaleciendo la cultura organizacional orientada al análisis de datos.