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.
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.
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.
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)
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.
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)
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)
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:
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.
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.
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.
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)
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())
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.
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())
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.