Introducción

El presente análisis tiene como propósito explorar la oferta inmobiliaria urbana de la ciudad de Cali mediante técnicas estadísticas multivariadas. A partir de información sobre características físicas, económicas y geográficas de las viviendas ofertadas, se busca identificar patrones de comportamiento, reducir la dimensionalidad de los datos y reconocer segmentos de propiedades con características similares que puedan contribuir a la toma de decisiones en el mercado inmobiliario.

Preparación de los datos

Carga de la base de datos

La información analizada proviene de datos de ofertas inmobiliarias obtenidos mediante web scraping y contenidos en el paquete paqueteMODELOS.

data("vivienda", package = "paqueteMODELOS")

dim(vivienda)
## [1] 8322   13
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>

La base de datos está conformada por 8.322 registros de propiedades y 13 variables que describen características económicas, físicas, categóricas y geográficas de la oferta inmobiliaria.

Exploración inicial

Se realizó una exploración inicial de los datos con el propósito de reconocer su estructura, distribución y posibles problemas de calidad antes de aplicar las técnicas multivariadas.

head(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

Valores faltantes

Se evaluó la presencia de datos faltantes en cada una de las variables antes de realizar los análisis estadísticos.

tabla_faltantes <- data.frame(
  Variable = names(vivienda),
  Faltantes = unname(colSums(is.na(vivienda))),
  Porcentaje = unname(round(colMeans(is.na(vivienda)) * 100, 2))
)

knitr::kable(
  tabla_faltantes,
  row.names = FALSE,
  col.names = c("Variable", "Datos faltantes", "Porcentaje (%)"),
  align = c("l", "r", "r"),
  caption = "Valores faltantes en la base de datos"
)
Valores faltantes en la base de datos
Variable Datos faltantes Porcentaje (%)
id 3 0.04
zona 3 0.04
piso 2638 31.70
estrato 3 0.04
preciom 2 0.02
areaconst 3 0.04
parqueaderos 1605 19.29
banios 3 0.04
habitaciones 3 0.04
tipo 3 0.04
barrio 3 0.04
longitud 3 0.04
latitud 3 0.04

El análisis de completitud evidenció que la mayoría de las variables presentó una proporción mínima de datos faltantes, entre 0,02 % y 0,04 %. Las principales excepciones fueron piso y parqueaderos, con 31,70 % y 19,29 % de valores ausentes, respectivamente. Por esta razón, estas variables requieren una evaluación particular antes de su incorporación en los análisis multivariados.

Evaluación de los datos faltantes en piso y parqueaderos

Dado que las variables piso y parqueaderos presentaron las mayores proporciones de valores faltantes, se examinó si su ausencia estaba relacionada con el tipo de inmueble.

tabla_piso_tipo <- table(
  Tipo = vivienda$tipo,
  Piso_faltante = is.na(vivienda$piso)
)

tabla_parqueadero_tipo <- table(
  Tipo = vivienda$tipo,
  Parqueadero_faltante = is.na(vivienda$parqueaderos)
)

tabla_piso_tipo
##              Piso_faltante
## Tipo          FALSE TRUE
##   Apartamento  3719 1381
##   Casa         1965 1254
tabla_parqueadero_tipo
##              Parqueadero_faltante
## Tipo          FALSE TRUE
##   Apartamento  4231  869
##   Casa         2486  733
round(
  prop.table(tabla_piso_tipo, margin = 1) * 100,
  2
)
##              Piso_faltante
## Tipo          FALSE  TRUE
##   Apartamento 72.92 27.08
##   Casa        61.04 38.96
round(
  prop.table(tabla_parqueadero_tipo, margin = 1) * 100,
  2
)
##              Parqueadero_faltante
## Tipo          FALSE  TRUE
##   Apartamento 82.96 17.04
##   Casa        77.23 22.77

Análisis de Componentes Principales

El Análisis de Componentes Principales (ACP) se utilizó con el propósito de reducir la dimensionalidad de las características cuantitativas de las propiedades e identificar las principales dimensiones que explican la variabilidad de la oferta inmobiliaria.

Para este análisis se seleccionaron las variables preciom, areaconst, parqueaderos, banios y habitaciones, debido a que representan características económicas y físicas de los inmuebles y se encuentran expresadas numéricamente. La variable piso no fue incorporada debido a su naturaleza categórica y a su elevada proporción de datos faltantes.

Antes de realizar el ACP se seleccionaron únicamente los registros completos para las variables incluidas.

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

dim(datos_pca)
## [1] 6717    5
summary(datos_pca)
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 248.0   1st Qu.:  86.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 355.0   Median : 130.0   Median : 2.000   Median : 3.000  
##  Mean   : 468.9   Mean   : 181.1   Mean   : 1.835   Mean   : 3.255  
##  3rd Qu.: 580.0   3rd Qu.: 233.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##   habitaciones   
##  Min.   : 0.000  
##  1st Qu.: 3.000  
##  Median : 3.000  
##  Mean   : 3.611  
##  3rd Qu.: 4.000  
##  Max.   :10.000

Relación entre las variables cuantitativas

Antes de aplicar el Análisis de Componentes Principales se examinó la matriz de correlaciones entre las variables seleccionadas. Este procedimiento permite identificar el grado de asociación lineal existente entre las características de los inmuebles y valorar la pertinencia de resumir su información mediante componentes comunes.

matriz_cor <- cor(datos_pca)

round(matriz_cor, 2)
##              preciom areaconst parqueaderos banios habitaciones
## preciom         1.00      0.68         0.69   0.67         0.27
## areaconst       0.68      1.00         0.58   0.67         0.53
## parqueaderos    0.69      0.58         1.00   0.57         0.28
## banios          0.67      0.67         0.57   1.00         0.60
## habitaciones    0.27      0.53         0.28   0.60         1.00

La matriz de correlaciones evidenció asociaciones positivas de magnitud moderada a alta entre varias características de los inmuebles. El precio presentó correlaciones de 0,69 con el número de parqueaderos, 0,68 con el área construida y 0,67 con el número de baños. Asimismo, se observó una correlación de 0,67 entre el área construida y el número de baños, y de 0,60 entre baños y habitaciones. Estos resultados indican que varias de las características analizadas comparten información, lo que sustenta la aplicación del Análisis de Componentes Principales como estrategia de reducción de dimensionalidad.

Ejecución del Análisis de Componentes Principales

Debido a que las variables seleccionadas se encuentran expresadas en escalas diferentes, el Análisis de Componentes Principales se realizó sobre variables estandarizadas. Esto permite que cada variable contribuya al análisis independientemente de su unidad de medida y evita que variables de mayor magnitud, como el precio o el área construida, dominen la construcción de los componentes.

modelo_pca <- FactoMineR::PCA(
  datos_pca,
  scale.unit = TRUE,
  ncp = 5,
  graph = FALSE
)

modelo_pca$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## comp 1  3.2527065              65.054130                          65.05413
## comp 2  0.8612191              17.224382                          82.27851
## comp 3  0.3644694               7.289389                          89.56790
## comp 4  0.3285488               6.570975                          96.13888
## comp 5  0.1930562               3.861124                         100.00000

Varianza explicada por los componentes

A partir de los valores propios obtenidos se evaluó la proporción de variabilidad explicada por cada componente principal.

tabla_varianza <- data.frame(
  Componente = paste0("CP", 1:nrow(modelo_pca$eig)),
  Valor_propio = modelo_pca$eig[, 1],
  Varianza_explicada = modelo_pca$eig[, 2],
  Varianza_acumulada = modelo_pca$eig[, 3]
)

knitr::kable(
  tabla_varianza,
  digits = 2,
  row.names = FALSE,
  col.names = c(
    "Componente",
    "Valor propio",
    "Varianza explicada (%)",
    "Varianza acumulada (%)"
  ),
  caption = "Varianza explicada por los componentes principales"
)
Varianza explicada por los componentes principales
Componente Valor propio Varianza explicada (%) Varianza acumulada (%)
CP1 3.25 65.05 65.05
CP2 0.86 17.22 82.28
CP3 0.36 7.29 89.57
CP4 0.33 6.57 96.14
CP5 0.19 3.86 100.00

El primer componente principal explicó el 65,05 % de la variabilidad total de las características analizadas, mientras que el segundo explicó un 17,22 % adicional. En conjunto, los dos primeros componentes acumularon el 82,28 % de la variabilidad original, lo que indica que una representación bidimensional conserva una proporción considerable de la información contenida en las cinco variables estudiadas. Aunque únicamente el primer componente presentó un valor propio superior a 1 según el criterio de Kaiser, se conservaron los dos primeros componentes con fines interpretativos y de visualización, dada su elevada capacidad explicativa conjunta.

factoextra::fviz_eig(
  modelo_pca,
  addlabels = TRUE
)

El gráfico de sedimentación evidencia una marcada reducción de la varianza explicada después del primer componente. No obstante, la incorporación del segundo componente eleva la varianza acumulada hasta el 82,28 %, mientras que cada uno de los componentes restantes aporta individualmente menos del 8 % de la variabilidad total.

Interpretación de los componentes principales

Para interpretar el significado de los componentes principales se examinaron las coordenadas y las contribuciones de cada variable. Las coordenadas permiten identificar la dirección y magnitud de la asociación de cada variable con los componentes, mientras que las contribuciones muestran cuáles variables participan en mayor medida en su construcción.

round(modelo_pca$var$coord, 3)
##              Dim.1  Dim.2  Dim.3  Dim.4  Dim.5
## preciom      0.841 -0.385 -0.215 -0.111  0.293
## areaconst    0.870  0.046 -0.270  0.381 -0.155
## parqueaderos 0.785 -0.398  0.462  0.098 -0.049
## banios       0.876  0.152 -0.062 -0.398 -0.217
## habitaciones 0.637  0.728  0.169  0.054  0.183
round(modelo_pca$var$contrib, 2)
##              Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## preciom      21.74 17.21 12.71  3.76 44.58
## areaconst    23.25  0.24 19.99 44.15 12.37
## parqueaderos 18.95 18.41 58.46  2.92  1.27
## banios       23.59  2.68  1.05 48.28 24.40
## habitaciones 12.48 61.46  7.80  0.89 17.38

El primer componente principal presentó asociaciones positivas elevadas con todas las variables analizadas, destacándose el número de baños (0,876), el área construida (0,870), el precio (0,841) y el número de parqueaderos (0,785). Asimismo, estas variables realizaron las mayores contribuciones a su construcción. En consecuencia, el primer componente puede interpretarse como una dimensión de tamaño, valor y dotación del inmueble, en la cual valores elevados representan propiedades de mayor dimensión y nivel de equipamiento.

El segundo componente estuvo determinado principalmente por el número de habitaciones, cuya coordenada fue de 0,728 y cuya contribución alcanzó el 61,46 %. En sentido contrario se ubicaron el precio (-0,385) y el número de parqueaderos (-0,398). Por esta razón, el segundo componente puede interpretarse principalmente como una dimensión asociada con la configuración habitacional del inmueble, permitiendo diferenciar propiedades caracterizadas por un mayor número de habitaciones de aquellas con mayor peso relativo del valor económico y la disponibilidad de parqueaderos.

factoextra::fviz_pca_var(
  modelo_pca,
  axes = c(1, 2),
  col.var = "contrib",
  repel = TRUE
)

El círculo de correlaciones muestra que el precio, el área construida, el número de baños y los parqueaderos se proyectan principalmente sobre el primer componente y presentan orientaciones similares, lo que refleja las asociaciones positivas observadas entre estas características. Este patrón respalda la interpretación de la Dimensión 1 como una medida general de tamaño, valor y dotación del inmueble. Por su parte, el número de habitaciones presenta una mayor proyección sobre la segunda dimensión, confirmando que este componente representa principalmente diferencias relacionadas con la configuración habitacional de las propiedades.

Análisis de Conglomerados

El análisis de conglomerados se utilizó con el propósito de identificar grupos de propiedades con características similares en términos de precio, área construida, número de parqueaderos, baños y habitaciones. A diferencia del Análisis de Componentes Principales, cuyo objetivo es reducir la dimensionalidad, el análisis de conglomerados busca clasificar las observaciones en segmentos internamente homogéneos y diferenciados entre sí.

Preparación de los datos para el análisis de conglomerados

Debido a que las variables se encuentran expresadas en escalas diferentes, se realizó una estandarización previa. Esta transformación permite que todas las variables tengan una influencia comparable en la construcción de los conglomerados.

datos_cluster <- scale(datos_pca)

summary(datos_cluster)
##     preciom          areaconst        parqueaderos         banios       
##  Min.   :-1.2264   Min.   :-1.0488   Min.   :-0.7425   Min.   :-2.3587  
##  1st Qu.:-0.6593   1st Qu.:-0.6602   1st Qu.:-0.7425   1st Qu.:-0.9096  
##  Median :-0.3399   Median :-0.3549   Median : 0.1465   Median :-0.1851  
##  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.3317   3rd Qu.: 0.3599   3rd Qu.: 0.1465   3rd Qu.: 0.5394  
##  Max.   : 4.5669   Max.   :10.8526   Max.   : 7.2582   Max.   : 4.8866  
##   habitaciones    
##  Min.   :-2.6466  
##  1st Qu.:-0.4477  
##  Median :-0.4477  
##  Mean   : 0.0000  
##  3rd Qu.: 0.2852  
##  Max.   : 4.6831

Selección del número de conglomerados

Para orientar la selección del número de grupos se utilizó el método del codo (Elbow Method), basado en la variación de la suma de cuadrados dentro de los conglomerados para diferentes valores de \(K\).

set.seed(123)

factoextra::fviz_nbclust(
  datos_cluster,
  kmeans,
  method = "wss",
  k.max = 10,
  nstart = 25
)

Evaluación mediante el coeficiente silhouette

Como criterio complementario al método del codo, se evaluó el coeficiente silhouette promedio para soluciones de dos, tres y cuatro conglomerados. Debido al tamaño de la base de datos, esta evaluación se realizó sobre una muestra aleatoria reproducible de 1.500 observaciones.

set.seed(123)

muestra_cluster <- datos_cluster[
  sample(seq_len(nrow(datos_cluster)), 1500),
  ,
  drop = FALSE
]

dist_muestra <- dist(muestra_cluster)

sil_promedio <- function(k) {
  modelo <- kmeans(
    muestra_cluster,
    centers = k,
    nstart = 25
  )
  
  sil <- cluster::silhouette(
    modelo$cluster,
    dist_muestra
  )
  
  mean(sil[, 3])
}

resultado_silhouette <- data.frame(
  Conglomerados = 2:4,
  Silhouette_promedio = sapply(2:4, sil_promedio)
)

knitr::kable(
  resultado_silhouette,
  digits = 3,
  row.names = FALSE,
  col.names = c(
    "Número de conglomerados",
    "Silhouette promedio"
  ),
  caption = "Coeficiente silhouette promedio según número de conglomerados"
)
Coeficiente silhouette promedio según número de conglomerados
Número de conglomerados Silhouette promedio
2 0.515
3 0.386
4 0.375

La solución de dos conglomerados presentó el mayor coeficiente silhouette promedio (0,515), frente a 0,386 para tres conglomerados y 0,375 para cuatro. En conjunto con el comportamiento observado mediante el método del codo, estos resultados respaldan la selección de una solución de dos conglomerados, al presentar la mejor combinación de cohesión interna y separación entre grupos.

Construcción de los conglomerados

A partir de los resultados obtenidos en los procedimientos de selección, se aplicó el algoritmo k-means utilizando dos conglomerados. Se emplearon múltiples inicializaciones aleatorias para reducir la posibilidad de obtener una solución dependiente de centros iniciales desfavorables.

set.seed(123)

modelo_cluster <- kmeans(
  datos_cluster,
  centers = 2,
  nstart = 50
)

table(modelo_cluster$cluster)
## 
##    1    2 
## 4860 1857

Caracterización de los conglomerados

Para facilitar la interpretación de los segmentos identificados, los conglomerados obtenidos se incorporaron a los datos originales utilizados en el análisis y se calcularon los valores promedio de las características inmobiliarias para cada grupo.

resultados_cluster <- datos_pca %>%
  mutate(
    Cluster = factor(modelo_cluster$cluster)
  )

perfil_cluster <- resultados_cluster %>%
  group_by(Cluster) %>%
  summarise(
    n = n(),
    Precio_promedio = mean(preciom),
    Area_promedio = mean(areaconst),
    Parqueaderos_promedio = mean(parqueaderos),
    Banios_promedio = mean(banios),
    Habitaciones_promedio = mean(habitaciones)
  )

knitr::kable(
  perfil_cluster,
  digits = 2,
  row.names = FALSE,
  col.names = c(
    "Conglomerado",
    "n",
    "Precio promedio",
    "Área promedio (m²)",
    "Parqueaderos",
    "Baños",
    "Habitaciones"
  ),
  caption = "Características promedio de los conglomerados identificados"
)
Características promedio de los conglomerados identificados
Conglomerado n Precio promedio Área promedio (m²) Parqueaderos Baños Habitaciones
1 4860 321.40 118.96 1.41 2.64 3.16
2 1857 854.86 343.86 2.95 4.87 4.80

Los resultados evidencian dos segmentos claramente diferenciados de la oferta inmobiliaria. El Conglomerado 1, conformado por 4.860 propiedades, presenta un precio promedio de 321,40, un área construida media de 118,96 m², 1,41 parqueaderos, 2,64 baños y 3,16 habitaciones. Este grupo representa propiedades de menor tamaño, valor y dotación relativa dentro de la oferta analizada. En contraste, el Conglomerado 2, compuesto por 1.857 propiedades, presenta un precio promedio de 854,86, un área construida media de 343,86 m², 2,95 parqueaderos, 4,87 baños y 4,80 habitaciones, configurando un segmento de inmuebles de mayor tamaño, valor y dotación. Esta diferenciación es coherente con los resultados obtenidos mediante el Análisis de Componentes Principales, particularmente con la primera dimensión, asociada con el tamaño, valor y nivel de equipamiento de las propiedades.

Visualización de los conglomerados

Con el propósito de visualizar la separación entre los segmentos identificados, los conglomerados fueron proyectados sobre las dos primeras dimensiones del Análisis de Componentes Principales, las cuales representan conjuntamente el 82,28 % de la variabilidad de los datos.

cluster_pca <- data.frame(
  CP1 = modelo_pca$ind$coord[, 1],
  CP2 = modelo_pca$ind$coord[, 2],
  Cluster = factor(modelo_cluster$cluster)
)

ggplot(
  cluster_pca,
  aes(
    x = CP1,
    y = CP2,
    color = Cluster
  )
) +
  geom_point(
    alpha = 0.30,
    size = 0.8
  ) +
  stat_ellipse(
    linewidth = 0.8
  ) +
  labs(
    title = "Conglomerados de propiedades sobre los componentes principales",
    x = "CP1 (65,05 %)",
    y = "CP2 (17,22 %)",
    color = "Conglomerado"
  ) +
  theme_minimal()

La proyección de los conglomerados sobre los dos primeros componentes principales evidencia que la diferenciación entre los grupos ocurre principalmente a lo largo de la primera dimensión. El Conglomerado 1 se concentra en valores bajos de CP1, correspondientes a inmuebles de menor tamaño, valor y dotación relativa, mientras que el Conglomerado 2 se distribuye principalmente hacia valores más elevados de esta dimensión, asociados con propiedades de mayor área, precio y equipamiento. Aunque existe cierto solapamiento entre ambos segmentos, la distribución observada respalda la diferenciación obtenida mediante el algoritmo k-means y resulta coherente con la interpretación previa del primer componente principal.

Análisis de Correspondencias

El análisis de correspondencias se utilizó para explorar la relación entre variables categóricas de la oferta inmobiliaria. Inicialmente se examinó la asociación entre la zona de ubicación y el tipo de inmueble mediante una tabla de contingencia.

Relación entre zona y tipo de inmueble

tabla_zona_tipo <- table(
  Zona = vivienda$zona,
  Tipo = vivienda$tipo
)

tabla_zona_tipo
##               Tipo
## Zona           Apartamento Casa
##   Zona Centro           24  100
##   Zona Norte          1198  722
##   Zona Oeste          1029  169
##   Zona Oriente          62  289
##   Zona Sur            2787 1939

Evaluación de la asociación

Antes de realizar el análisis de correspondencias se evaluó si existía asociación estadística entre la zona y el tipo de inmueble mediante la prueba chi-cuadrado de independencia.

prueba_chi <- chisq.test(tabla_zona_tipo)

prueba_chi
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_zona_tipo
## X-squared = 690.93, df = 4, p-value < 2.2e-16

La prueba chi-cuadrado de independencia evidenció una asociación estadísticamente significativa entre la zona de ubicación y el tipo de inmueble ofertado (\(\chi^2 = 690,93\); gl = 4; p < 0,001). Por lo tanto, se rechaza la hipótesis de independencia, indicando que la distribución de casas y apartamentos difiere según la zona de la ciudad.

Análisis de correspondencias simple

Una vez evaluada la asociación entre las variables, se aplicó un análisis de correspondencias para identificar los patrones de proximidad entre las categorías de zona y tipo de inmueble.

modelo_ca <- FactoMineR::CA(
  tabla_zona_tipo,
  graph = FALSE
)

modelo_ca$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.08305442                    100                               100

El análisis de correspondencias generó una única dimensión, la cual explica el 100 % de la inercia total. Este resultado es esperado debido a que la variable tipo de inmueble posee únicamente dos categorías, por lo que la estructura de asociación entre zona y tipo puede representarse completamente mediante una sola dimensión.

Interpretación de las correspondencias entre zona y tipo

Para identificar las categorías que explican la asociación observada se examinaron las coordenadas, contribuciones y residuos estandarizados.

round(modelo_ca$row$coord, 3)
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##       -0.861        0.022        0.505       -0.896       -0.048
round(modelo_ca$col$coord, 3)
##               [,1]
## Apartamento  0.229
## Casa        -0.363
round(modelo_ca$row$contrib, 2)
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##        13.31         0.14        44.19        40.79         1.57
round(prueba_chi$stdres, 2)
##               Tipo
## Zona           Apartamento   Casa
##   Zona Centro        -9.66   9.66
##   Zona Norte          1.12  -1.12
##   Zona Oeste         18.89 -18.89
##   Zona Oriente      -17.15  17.15
##   Zona Sur           -5.01   5.01

La dimensión obtenida permitió identificar patrones diferenciados en la distribución de los tipos de inmueble según la zona. La Zona Oeste presentó una coordenada positiva de 0,505, ubicándose en la misma dirección que la categoría Apartamento (0,229), mientras que las zonas Oriente (-0,896) y Centro (-0,861) se localizaron en la dirección correspondiente a la categoría Casa (-0,363). Las mayores contribuciones a la construcción de la dimensión correspondieron a Zona Oeste (44,19 %) y Zona Oriente (40,79 %), seguidas por Zona Centro (13,31 %).

Los residuos estandarizados reforzaron esta interpretación. La combinación Zona Oeste–Apartamento presentó un residuo positivo de 18,89, indicando una frecuencia de apartamentos considerablemente mayor a la esperada bajo independencia. De forma complementaria, Zona Oriente–Casa presentó un residuo de 17,15 y Zona Centro–Casa de 9,66, evidenciando una mayor presencia relativa de casas en estas zonas. La Zona Sur también mostró una asociación positiva con casas (residuo = 5,01), mientras que la Zona Norte presentó residuos cercanos a cero, sugiriendo una distribución más próxima a la esperada bajo independencia.

Análisis de Correspondencias Múltiples

datos_acm <- vivienda %>%
  select(zona, tipo, barrio) %>%
  drop_na() %>%
  mutate(
    zona = factor(zona),
    tipo = factor(tipo),
    barrio = factor(barrio)
  )

dim(datos_acm)
## [1] 8319    3
modelo_acm <- FactoMineR::MCA(
  datos_acm,
  graph = FALSE
)

modelo_acm$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.7110099              0.4847794                         0.4847794
## dim 2  0.6602040              0.4501391                         0.9349185
## dim 3  0.6508372              0.4437526                         1.3786712
## dim 4  0.6231832              0.4248976                         1.8035688
## dim 5  0.4442429              0.3028929                         2.1064617

El Análisis de Correspondencias Múltiples evidenció una estructura categórica distribuida entre numerosas dimensiones, situación esperable dada la elevada cantidad de categorías contenidas en la variable barrio. Las dos primeras dimensiones explicaron conjuntamente el 0,93 % de la inercia total, por lo que su interpretación se realizó principalmente a partir de las categorías con mayor contribución.

La primera dimensión estuvo determinada principalmente por Zona Oeste (20,09 %) y Zona Oriente (16,96 %), junto con las categorías Casa (9,50 %) y Apartamento (6,00 %). Este patrón resulta coherente con el análisis de correspondencias simple realizado previamente, en el cual estas zonas mostraron una marcada diferenciación respecto al tipo de inmueble ofertado. También destacaron barrios como Santa Teresita, Normandía y Los Cristales.

La segunda dimensión estuvo explicada principalmente por Zona Norte (29,91 %) y Zona Sur (17,35 %), además de barrios como La Flora (5,87 %) y Valle del Lili (3,79 %). En consecuencia, esta dimensión refleja principalmente una diferenciación territorial adicional de la oferta inmobiliaria entre sectores de la ciudad.

factoextra::fviz_mca_var(
  modelo_acm,
  axes = c(1, 2),
  repel = TRUE,
  select.var = list(contrib = 20)
)

El mapa factorial del Análisis de Correspondencias Múltiples permitió identificar patrones territoriales en la distribución de las categorías analizadas. La Zona Oeste se ubicó próxima a la categoría Apartamento y a barrios como Los Cristales, Cristales, Normandía, Santa Teresita y Aguacatal. Por su parte, la Zona Norte presentó proximidad con La Flora, Acopi y Prados del Norte, mientras que la Zona Oriente se relacionó espacialmente con Ciudad Córdoba y Alfonso López. En la parte inferior del plano, la Zona Sur se ubicó próxima a Valle del Lili, Ciudad Jardín y Pance.

La disposición de las categorías Casa y Apartamento sobre la primera dimensión resulta consistente con el análisis de correspondencias simple, confirmando la existencia de diferencias territoriales en la composición de la oferta inmobiliaria. No obstante, debido a que las dos primeras dimensiones explican una proporción reducida de la inercia total, consecuencia de la elevada cantidad de categorías de la variable barrio, estas proximidades deben interpretarse principalmente como patrones exploratorios y no como asociaciones determinísticas.

Distribución espacial de los conglomerados

La disponibilidad de coordenadas geográficas permitió representar espacialmente los segmentos identificados y complementar la caracterización de la oferta inmobiliaria.

filas_cluster <- complete.cases(
  vivienda[, c(
    "preciom",
    "areaconst",
    "parqueaderos",
    "banios",
    "habitaciones"
  )]
)

datos_mapa <- vivienda[filas_cluster, ] %>%
  mutate(
    Cluster = factor(modelo_cluster$cluster)
  ) %>%
  filter(
    !is.na(longitud),
    !is.na(latitud)
  )

ggplot(
  datos_mapa,
  aes(
    x = longitud,
    y = latitud,
    color = Cluster
  )
) +
  geom_point(alpha = 0.35, size = 0.8) +
  coord_equal() +
  labs(
    title = "Distribución espacial de los conglomerados inmobiliarios",
    x = "Longitud",
    y = "Latitud",
    color = "Conglomerado"
  ) +
  theme_minimal()

La representación espacial permite complementar la segmentación obtenida mediante k-means al mostrar la localización de los dos conglomerados dentro de la ciudad. Esta visualización facilita reconocer la distribución territorial de propiedades con diferentes características de tamaño, valor y dotación, incorporando así el componente geográfico al análisis multivariado de la oferta inmobiliaria.

Integración de los resultados

Los diferentes procedimientos estadísticos utilizados proporcionaron una visión complementaria de la oferta inmobiliaria urbana. El Análisis de Componentes Principales mostró que el 82,28 % de la variabilidad de las cinco características cuantitativas consideradas puede representarse mediante los dos primeros componentes. La primera dimensión estuvo asociada principalmente con el tamaño, valor y dotación de los inmuebles.

De manera coherente con esta estructura, el análisis de conglomerados identificó dos segmentos claramente diferenciados. El primero agrupó 4.860 propiedades de menor tamaño, precio y dotación relativa, mientras que el segundo reunió 1.857 inmuebles caracterizados por mayores valores promedio de precio, área construida, parqueaderos, baños y habitaciones.

Desde la perspectiva categórica y territorial, la prueba chi-cuadrado y el análisis de correspondencias demostraron que el tipo de inmueble no se distribuye independientemente de la zona de la ciudad. La Zona Oeste presentó una mayor asociación relativa con apartamentos, mientras que las zonas Oriente y Centro mostraron mayor asociación con casas.

El Análisis de Correspondencias Múltiples amplió estos resultados al incorporar la variable barrio. El mapa factorial mostró agrupamientos territoriales reconocibles, como la proximidad de Zona Norte con La Flora, Acopi y Prados del Norte; Zona Oriente con Ciudad Córdoba y Alfonso López; Zona Sur con Valle del Lili, Ciudad Jardín y Pance; y Zona Oeste con barrios como Cristales, Normandía, Santa Teresita y Aguacatal. Debido al elevado número de categorías de barrio, estas relaciones se interpretaron con carácter exploratorio.

En conjunto, los resultados indican que la oferta inmobiliaria de Cali presenta una estructura heterogénea, determinada tanto por las características económicas y físicas de las propiedades como por su localización y composición territorial.

Conclusiones

  1. El Análisis de Componentes Principales permitió reducir satisfactoriamente la dimensionalidad de las características cuantitativas de los inmuebles. Los dos primeros componentes explicaron conjuntamente el 82,28 % de la variabilidad total.

  2. La principal dimensión de diferenciación de las propiedades estuvo asociada con su tamaño, valor y dotación, principalmente mediante el área construida, el precio, el número de baños y la disponibilidad de parqueaderos.

  3. El análisis de conglomerados permitió identificar dos segmentos de oferta claramente diferenciados: un grupo mayoritario de propiedades de menor tamaño, precio y dotación relativa y otro constituido por inmuebles de mayores dimensiones, valor y equipamiento.

  4. Se identificó una asociación estadísticamente significativa entre la zona de ubicación y el tipo de inmueble. La Zona Oeste presentó una mayor asociación con apartamentos, mientras que las zonas Oriente y Centro mostraron una presencia relativa mayor de casas.

  5. El análisis de correspondencias múltiples evidenció patrones adicionales relacionados con los barrios y las zonas de la ciudad, reforzando la importancia de incorporar la dimensión territorial en el estudio de la oferta inmobiliaria.

  6. En consecuencia, la oferta inmobiliaria analizada no constituye un mercado homogéneo, sino que presenta segmentos diferenciados por características físicas, económicas, categóricas y geográficas.

Recomendaciones

Los resultados obtenidos sugieren que las estrategias comerciales de la inmobiliaria deberían diferenciarse según las características de los segmentos identificados. Las propiedades del primer conglomerado pueden orientarse hacia compradores que prioricen accesibilidad económica y características residenciales convencionales, mientras que los inmuebles del segundo conglomerado pueden dirigirse hacia segmentos con mayor capacidad adquisitiva y preferencias por propiedades amplias y con mayor dotación.

Asimismo, la asociación observada entre zona y tipo de inmueble puede utilizarse para orientar estrategias de captación y promoción específicas. La mayor presencia relativa de apartamentos en la Zona Oeste y de casas en las zonas Oriente y Centro evidencia que una estrategia comercial homogénea para toda la ciudad podría desaprovechar diferencias relevantes del mercado.

Finalmente, se recomienda incorporar de manera sistemática información geográfica y técnicas de segmentación multivariada en los procesos de análisis de mercado. La combinación de precio, características físicas, tipo de inmueble y ubicación puede contribuir a una mejor identificación de oportunidades comerciales y a una focalización más eficiente de las estrategias de promoción.

Limitaciones

Los resultados deben interpretarse considerando algunas limitaciones de la información disponible. La variable piso presentó una proporción elevada de datos faltantes y no fue incorporada en los análisis cuantitativos, mientras que parqueaderos también presentó información faltante que redujo el número de registros disponibles para el ACP y el análisis de conglomerados.

Adicionalmente, la variable barrio contiene numerosas categorías y posibles variaciones en la denominación de algunos sectores, lo cual incrementa la dimensionalidad del Análisis de Correspondencias Múltiples. Por esta razón, las proximidades observadas en el mapa factorial fueron utilizadas principalmente con fines exploratorios.