1. Introducción

El mercado inmobiliario urbano constituye un sistema complejo en el que intervienen múltiples factores estructurales, socioeconómicos y territoriales. El análisis multidimensional de este tipo de información permite identificar patrones latentes, segmentaciones naturales y relaciones estructurales entre variables que no son evidentes mediante análisis univariados.

El presente estudio tiene como objetivo realizar un análisis integral de la base de datos vivienda, empleando técnicas estadísticas multivariadas como el Análisis de Componentes Principales (ACP), el Análisis de Conglomerados y el Análisis de Correspondencia. Estas metodologías permiten reducir la dimensionalidad, identificar agrupaciones homogéneas y explorar asociaciones entre variables categóricas, respectivamente.

2. Marco Metodológico

El estudio se fundamenta en técnicas de análisis multivariado, las cuales permiten examinar simultáneamente múltiples variables y comprender la estructura subyacente del conjunto de datos.

  • El Análisis de Componentes Principales (ACP) se utiliza para reducir la dimensionalidad y detectar las combinaciones lineales que explican la mayor variabilidad del sistema.
  • El Análisis de Conglomerados permite identificar grupos homogéneos de observaciones con características similares.
  • El Análisis de Correspondencia se emplea para examinar la asociación entre variables categóricas y representar gráficamente dichas relaciones en un espacio factorial reducido.

3. Configuración del entorno de trabajo

Para el desarrollo del presente análisis se utilizaron diversas librerías especializadas en manipulación de datos y análisis multivariado.

  • paqueteMODELOS: Proporciona la base de datos de viviendas utilizada en el estudio.
  • tidyverse: Permite realizar limpieza y transformación eficiente de los datos.
  • FactoMineR y factoextra: Facilitan la implementación e interpretación del Análisis de Componentes Principales y el Análisis de Correspondencia.
  • cluster: Utilizada para el análisis de conglomerados.

A continuación, se cargan las librerías necesarias.

4. Descripción del conjunto de datos

La base de datos vivienda contiene información sobre propiedades residenciales urbanas, incluyendo variables estructurales, socioeconómicas y geográficas.

Entre las variables más relevantes se encuentran:

  • preciom: Precio de la vivienda en millones.
  • areaconst: Área construida.
  • habitaciones y banios: Características estructurales.
  • estrato: Nivel socioeconómico.
  • zona, tipo y barrio: Variables categóricas asociadas a la localización y tipología.

A continuación se presenta la estructura general del conjunto de datos:

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>
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
#colnames(vivienda)

5. Preparación y Transformación de los Datos

Antes de aplicar técnicas multivariadas, se realizó un proceso de depuración de las variables seleccionadas.

Se seleccionaron las variables numéricas estructurales relevantes para el análisis y posteriormente se eliminaron observaciones con valores faltantes, dado que técnicas como el ACP y el análisis de conglomerados no admiten valores NA.

Finalmente, las variables fueron estandarizadas para evitar que diferencias en las escalas de medición influyeran en los resultados.

# Conversión de variables categóricas
vivienda$zona <- as.factor(vivienda$zona)
vivienda$piso <- as.factor(vivienda$piso)
vivienda$tipo <- as.factor(vivienda$tipo)
vivienda$barrio <- as.factor(vivienda$barrio)

# Seleccionar todas las variables
vivienda_limpia <- vivienda %>%
  select(zona, piso, estrato, tipo, barrio,
         preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  na.omit()

# Variables numéricas para clustering
vivienda_num <- vivienda_limpia %>%
  select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones)

# Estandarización
vivienda_scaled <- scale(vivienda_num)

La estandarización se realizó mediante la transformación de las variables a media cero y desviación estándar uno. Este procedimiento evita que variables con mayor magnitud (por ejemplo, el precio o el área construida) dominen la construcción de las componentes principales.

6. Análisis de Componentes Principales (ACP)

El Análisis de Componentes Principales (ACP) se aplicó con el objetivo de reducir la dimensionalidad del conjunto de variables estructurales y detectar las combinaciones lineales que explican la mayor proporción de la variabilidad total del sistema.

Dado que las variables fueron previamente estandarizadas, el análisis se basa en la matriz de correlaciones.

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

# Varianza explicada
fviz_eig(pca_viv, addlabels = TRUE)

6.1 Varianza explicada

Las dos primeras componentes principales explican el 76.5% de la variabilidad total del conjunto de datos (56.4% la primera dimensión y 20.1% la segunda).

Este resultado indica que la estructura del mercado inmobiliario puede representarse adecuadamente en un espacio bidimensional, permitiendo una reducción sustancial de la dimensionalidad sin pérdida significativa de información.

La elevada proporción explicada por la primera componente sugiere la existencia de un eje dominante que estructura el comportamiento del mercado.

fviz_pca_var(pca_viv,
             col.var = "contrib",
             gradient.cols = c("darkorange", "yellow", "black"),
             repel = TRUE)

6.2 Interpretación de las Componentes Principales

El análisis de las cargas factoriales muestra que la Dimensión 1 está principalmente asociada con las variables habitaciones y estrato. Esto sugiere que esta componente representa un eje socio–estructural, en el cual el número de habitaciones y el nivel socioeconómico se combinan para diferenciar segmentos del mercado inmobiliario.

Por su parte, la Dimensión 2 se encuentra fuertemente asociada con las variables área construida, número de baños, parqueaderos y precio. Esta dimensión puede interpretarse como un eje de valorización estructural y equipamiento, ya que agrupa atributos físicos que incrementan el valor comercial de la vivienda.

En términos conceptuales, el mercado inmobiliario urbano parece estructurarse en torno a dos dimensiones principales:

  1. Una dimensión socioeconómica vinculada al estrato y la configuración interna de la vivienda.
  2. Una dimensión de valorización asociada al tamaño, equipamiento y precio.

Esta diferenciación sugiere que el precio no depende únicamente del estrato, sino también de atributos físicos que agregan valor funcional y comercial a la propiedad.

fviz_pca_ind(pca_viv,
             geom = "point",
             alpha.ind = 0.4
             )

La representación de los individuos en el plano factorial confirma la existencia de diferenciación estructural entre las observaciones, evidenciando dispersión significativa a lo largo de las dos dimensiones principales.

7. Análisis de Conglomerados

Con el fin de identificar segmentos homogéneos dentro del mercado inmobiliario, se aplicó un análisis de conglomerados sobre las variables estructurales previamente estandarizadas.

El análisis de conglomerados permite clasificar las observaciones en grupos internamente similares y externamente diferentes, facilitando la identificación de perfiles característicos dentro del mercado.

7.1 Determinación del número óptimo de conglomerados

Para determinar el número adecuado de clusters se utilizó el método del codo (Within-Cluster Sum of Squares, WSS). Este método evalúa la reducción de la variabilidad interna a medida que aumenta el número de grupos.

El punto donde la reducción comienza a estabilizarse indica un número óptimo de conglomerados, ya que añadir más grupos no produce mejoras sustanciales en la explicación de la variabilidad interna adicional se aplica el índice de silueta.

fviz_nbclust(vivienda_scaled, kmeans, method = "wss")

fviz_nbclust(vivienda_scaled, kmeans, method = "silhouette")

El método del codo mostró una reducción significativa de la variabilidad interna al pasar de uno a dos conglomerados. A partir de este punto, la disminución de la WSS se estabiliza.

De manera consistente, el índice de silueta indicó que la solución con dos grupos presenta una adecuada separación entre clusters.

Por lo tanto, se seleccionaron dos conglomerados como solución óptima.

7.2 Aplicación del modelo de K-means

Una vez determinado que el número óptimo de conglomerados es dos, se procedió a aplicar el algoritmo K-means sobre las variables previamente estandarizadas. Se utilizó una semilla fija para garantizar la reproducibilidad de los resultados y múltiples inicializaciones para evitar soluciones locales subóptimas.

set.seed(123)

kmeans_viv <- kmeans(vivienda_scaled, centers = 2, nstart = 25)

# Agregar cluster a la base limpia
vivienda_num$cluster <- factor(kmeans_viv$cluster)

7.3 Visualización de los conglomerados

Con el fin de analizar gráficamente la separación entre los grupos identificados, se realizó una visualización bidimensional de los clusters obtenidos.

#Visualización
fviz_cluster(kmeans_viv,
             data = vivienda_scaled,
             ellipse.type = "convex",
             geom = "point",
             ggtheme = theme_minimal())

7.4 Perfilamiento de los conglomerados

Con el fin de caracterizar los segmentos identificados, se calcularon los promedios de las variables originales para cada conglomerado.

aggregate(vivienda_num[,1:6],
          by = list(Cluster = vivienda_num$cluster),
          mean)
##   Cluster estrato  preciom areaconst parqueaderos   banios habitaciones
## 1       1 4.58448 303.9734  115.3025     1.380381 2.573939     3.141435
## 2       2 5.45944 832.8019  320.5262     2.880833 4.801149     4.601579

Los resultados evidencian diferencias estructurales claras y consistentes entre ambos grupos.

El Cluster 1 presenta un precio promedio de 845.72, un área construida promedio de 328.35 metros cuadrados y un estrato socioeconómico promedio de 5.45. Estas características indican que este conglomerado agrupa viviendas de mayor tamaño, mayor valorización económica y ubicadas predominantemente en estratos socioeconómicos altos.

Por su parte, el Cluster 2 registra un precio promedio de 308.42, un área construida promedio de 118.45 metros cuadrados y un estrato promedio de 4.57. Este grupo representa viviendas de menor tamaño relativo y menor precio dentro del mercado analizado.

Las diferencias observadas permiten concluir que el mercado inmobiliario estudiado se segmenta principalmente en dos perfiles claramente diferenciados: un segmento de vivienda de alta gama y un segmento de vivienda de características intermedias. Se evidencia además una asociación estructural entre precio, área construida y estrato socioeconómico, lo cual resulta coherente con la lógica económica del mercado.

En consecuencia, el análisis de conglomerados permitió identificar patrones de segmentación relevantes que complementan y refuerzan los hallazgos obtenidos previamente mediante el Análisis de Componentes Principales.

8. Análisis de Correspondencia múltiple (ACM)

Con el fin de explorar la asociación entre las variables categóricas relevantes y validar los patrones identificados en el análisis de conglomerados, se aplicó un Análisis de Correspondencia Múltiple (ACM).

Esta técnica permite representar simultáneamente múltiples variables cualitativas en un espacio reducido de dimensiones, facilitando la identificación de patrones estructurales y asociaciones entre categorías dentro del mercado inmobiliario.

El análisis incluyó las variables zona, tipo de vivienda y barrio, sin embargo, debido al alto número de categorías en la variable barrio (273), se decidió no incluirla directamente en el ACM, ya que un elevado número de modalidades puede fragmentar la inercia y dificultar la interpretación del espacio factorial. En su lugar, se utilizó la variable zona, que sintetiza la dimensión territorial del mercado

tabla_barrios <- sort(table(vivienda_limpia$barrio), decreasing = TRUE)
head(tabla_barrios, 10)   
## 
## valle del lili  ciudad jardín          pance       la flora santa teresita 
##            635            373            275            265            162 
##     el ingenio       el caney    la hacienda  los cristales      normandía 
##            148            133            131            116            104
top_barrios <- names(tabla_barrios[1:10])
vivienda_limpia$barrio_top <- ifelse(
  vivienda_limpia$barrio %in% top_barrios,
  as.character(vivienda_limpia$barrio),
  "Otros"
)
vivienda_limpia$barrio_top <- factor(vivienda_limpia$barrio_top)
length(unique(vivienda_limpia$barrio_top))
## [1] 11
vivienda_cat <- vivienda_limpia[, c("zona","tipo","barrio_top")]
vivienda_cat[] <- lapply(vivienda_cat, factor)
acm_final <- MCA(vivienda_cat, graph = FALSE)
fviz_mca_biplot(acm_final,
                repel = TRUE,
                col.var = "cos2",   
                gradient.cols = c("darkorange", "yellow", "black"),
                ggtheme = theme_minimal())

9. Conclusiones

fviz_contrib(acm_final, choice = "var", axes = 1)

fviz_contrib(acm_final, choice = "var", axes = 2)

acm_final$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.60273122              12.054624                          12.05462
## dim 2  0.53483670              10.696734                          22.75136
## dim 3  0.43531189               8.706238                          31.45760
## dim 4  0.35135799               7.027160                          38.48476
## dim 5  0.33333333               6.666667                          45.15142
## dim 6  0.33333333               6.666667                          51.81809
## dim 7  0.33333333               6.666667                          58.48476
## dim 8  0.33333333               6.666667                          65.15142
## dim 9  0.33333333               6.666667                          71.81809
## dim 10 0.33333333               6.666667                          78.48476
## dim 11 0.33333333               6.666667                          85.15142
## dim 12 0.28284374               5.656875                          90.80830
## dim 13 0.23381111               4.676222                          95.48452
## dim 14 0.13173563               2.634713                          98.11923
## dim 15 0.09403838               1.880768                         100.00000

Dimensión 1

La primera dimensión está fuertemente determinada por la categoría Zona Oeste (34.36%) y por barrios específicos como Santa Teresita (14.14%), Los Cristales (10.38%) y Normandía (9.63%). Asimismo, contribuyen Zona Sur (9.42%) y el tipo Casa (7.77%).

Este eje representa una diferenciación territorial clara asociada a sectores urbanos consolidados, evidenciando que el mercado inmobiliario se estructura principalmente en función de la concentración espacial en áreas específicas de alto posicionamiento dentro de la ciudad.

Dimensión 2

La segunda dimensión del ACM está fuertemente determinada por la Zona Norte y el barrio La Flora, indicando que este eje representa una diferenciación espacial clara del sector norte frente al resto de la ciudad, más que una distinción por tipo de vivienda

acm_final$var$contrib[order(acm_final$var$contrib[,1], decreasing = TRUE),1]
##     Zona Oeste santa teresita  los cristales      normandía       Zona Sur 
##     34.3637868     14.1431191     10.3783022      9.6300078      9.4235511 
##           Casa    Apartamento  ciudad jardín          pance valle del lili 
##      7.7670325      3.9689487      3.3148363      1.9390438      1.4154580 
##       el caney     el ingenio    la hacienda       la flora   Zona Oriente 
##      0.9064931      0.6672307      0.5995335      0.4833456      0.4307715 
##     Zona Norte    Zona Centro          Otros 
##      0.3435330      0.2021177      0.0228886
acm_final$var$contrib[order(acm_final$var$contrib[,2], decreasing = TRUE),2]
##     Zona Norte       la flora       Zona Sur valle del lili     Zona Oeste 
##   39.311692244   32.029552736    6.818341624    3.996412616    3.393360512 
##          Otros  ciudad jardín santa teresita          pance  los cristales 
##    2.807404936    2.162714673    2.034119853    1.662195563    1.469439894 
##      normandía     el ingenio    la hacienda       el caney   Zona Oriente 
##    1.322672428    0.911355413    0.806223264    0.805160140    0.332286322 
##    Zona Centro           Casa    Apartamento 
##    0.124835039    0.008095796    0.004136947

El análisis del mercado inmobiliario permitió identificar patrones estructurales claros mediante la aplicación conjunta del Análisis de Correspondencias Múltiples (ACM) y el Análisis de Conglomerados.

En primer lugar, el ACM evidenció que la principal fuente de diferenciación del mercado es de carácter territorial. La Dimensión 1 refleja una organización urbana amplia, donde ciertas zonas y barrios específicos estructuran el espacio factorial, indicando que la localización es un factor determinante en la configuración del mercado.

Por su parte, la Dimensión 2 mostró una fuerte concentración en la Zona Norte y particularmente en el barrio La Flora, lo que sugiere la existencia de un segmento geográfico claramente diferenciado dentro de la ciudad. Esta dimensión no está asociada al tipo de vivienda (casa o apartamento), sino a una identidad territorial específica.

El análisis de conglomerados confirmó estos hallazgos al identificar grupos de viviendas con características similares, los cuales se distribuyen de manera coherente en el plano factorial del ACM. Esto evidencia que los segmentos encontrados no son aleatorios, sino que responden a patrones espaciales consistentes.

En conjunto, los resultados permiten concluir que:

  • El mercado inmobiliario presenta una segmentación espacial marcada.

  • La localización geográfica es el principal factor estructurador del sistema.

  • Existen submercados con identidad territorial definida, especialmente en el sector Norte.

  • El tipo de vivienda tiene menor capacidad explicativa frente a la variable zona.

En términos generales, el mercado no se organiza primordialmente por tipología habitacional, sino por dinámicas territoriales, lo que refleja la importancia de la ubicación como elemento central en la diferenciación inmobiliaria.