CARGA Y PREPARACIÓN DE LOS DATOS
## [1] 8322 13
## 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>
## [1] "Dimension del arreglo después de la limpieza."
## [1] 6717 13
Exploración espacial de la oferta inmobiliaria
# 1. Selección de variables numéricas
vars_cuant <- df_clean %>%
select(preciom, areaconst, parqueaderos, banios, habitaciones)
# 2. Ejecución del ACP estandarizado
res_pca <- PCA(vars_cuant, scale.unit = TRUE, graph = FALSE)# Visualización 1: Sedimentación de Varianza
fviz_eig(res_pca, addlabels = TRUE, ylim = c(0, 80),
barfill = "#2c3e50", barcolor = "#2c3e50",
main = "Porcentaje de Varianza Explicada")
Varianza Explicada y Reducción de Dimensionalidad:
Las dos primeras componentes principales explican en conjunto más del 70% de la variabilidad total de los datos. Esto indica que se logra sintetizar eficazmente la información de las 5 variables continuas en solo dos dimensiones principales sin perder una cantidad significativa de información.
# Visualización 2: Círculo de Correlaciones
fviz_pca_var(res_pca, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE, title = "Círculo de Correlación de Variables")
Dimensión 1 (Eje de Magnitud y Valor Económico):
Presenta una correlación fuertemente positiva con el precio (preciom), el área construida (areaconst), el número de parqueaderos y los baños, es decir, el tamaño y nivel socioeconómico de la propiedad. Hacia el extremo derecho del eje se ubican los inmuebles de alta gama, caracterizados por áreas extensas, múltiples estacionamientos y precios elevados; mientras que a la izquierda se concentran las propiedades más pequeñas y de menor costo.
# Visualización 3: Contribución a Dim 1 y Dim 2
fviz_contrib(res_pca, choice = "var", axes = 1, fill = "#3498db", title = "Contribución a Dim 1")Dimensión 2 (Eje de Configuración y Densidad Habitacional):
Está asociada principalmente con el número de habitaciones (habitaciones). Esta gráfica evidencia la distribución del espacio interno. Permite diferenciar propiedades diseñadas para alojar familias numerosas (alto número de habitaciones) frente a inmuebles orientados a espacios sociales amplios o formatos de vivienda más ejecutivos (pocos dormitorios, pero mayor área social o comercial).
# Visualización 4: Biplot por Estrato
fviz_pca_biplot(res_pca, geom.ind = "point", col.ind = df_clean$estrato,
palette = "jco", addEllipses = TRUE, label = "var",
col.var = "black", repel = TRUE,
title = "Biplot del ACP según Estrato")
Correlación entre Variables:
Las variables preciom, areaconst y parqueaderos muestran un comportamiento altamente alineado (vectores apuntando en la misma dirección), confirmando que el metraje construido y la disponibilidad de parqueadero son los principales impulsores del valor comercial en el mercado inmobiliario urbano.
Para agrupar la oferta inmobiliaria en segmentos homogéneos de mercado, se aplica un algoritmo de Clustering Jerárquico sobre Componentes Principales (HCPC) combinando distancias euclidianas y el criterio de Ward.
Para garantizar la eficiencia computacional sobre las 8.322
observaciones, se utiliza una consolidación previa por \(K\)-means (kk = 100).
# 1. Aplicación optimizada de HCPC sobre el ACP (3 clusters)
res_hcpc <- HCPC(res_pca, nb.clust = 3, kk = 100, graph = FALSE)
# Asignación de los clusters a la base de datos limpia
df_clean$cluster <- as.factor(res_hcpc$data.clust$clust)
# --- GRÁFICA 1: Dendrograma de Clasificación ---
fviz_dend(res_hcpc,
rect = TRUE,
rect_fill = TRUE,
rect_border = "jco",
palette = "jco",
show_labels = FALSE,
main = "Dendrograma de Clasificación Jerárquica (HCPC)")
El salto de inercia en el árbol jerárquico confirma que dividir el
mercado en 3 grupos homogéneos optimiza la separación de perfiles y
minimiza la varianza dentro de cada segmento.
# --- GRÁFICA 2: Mapa por Cluster en el Plano Factorial ---
fviz_cluster(res_hcpc,
geom = "point",
ellipse.type = "convex",
palette = "jco",
ggtheme = theme_minimal(),
main = "Segmentación Inmobiliaria sobre el Plano Factorial")resumen_clusters <- df_clean %>%
group_by(cluster) %>%
summarise(
Proporcion = paste0(round(n() / nrow(df_clean) * 100, 1), "%"),
Precio_Mediana = median(preciom),
Precio_Prom = round(mean(preciom), 1),
Area_Prom = round(mean(areaconst), 1),
Parqueaderos_Prom = round(mean(parqueaderos), 1),
Banios_Prom = round(mean(banios), 1),
Habitaciones_Prom = round(mean(habitaciones), 1)
)
kable(resumen_clusters,
col.names = c("Cluster", "% Oferta", "Precio Mediana (M)", "Precio Prom (M)", "Área Prom (m²)", "Parqueaderos", "Baños", "Habitaciones"),
caption = "Caracterización de Perfiles de la Oferta Inmobiliaria") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Cluster | % Oferta | Precio Mediana (M) | Precio Prom (M) | Área Prom (m²) | Parqueaderos | Baños | Habitaciones |
|---|---|---|---|---|---|---|---|
| 1 | 56.9% | 265 | 289.9 | 99.1 | 1.3 | 2.3 | 2.9 |
| 2 | 27.7% | 490 | 526.6 | 228.7 | 1.8 | 4.2 | 4.6 |
| 3 | 15.5% | 980 | 1023.1 | 397.5 | 3.7 | 5.0 | 4.5 |
Cluster 1 (Vivienda Masiva / Gama de Entrada): Representa el volumen principal de la oferta urbana. Inmuebles compactos (áreas inferiores a 100 m²), precio promedio contenido, 1 parqueadero y de 2 a 3 habitaciones. Orientado a compradores de primer inmueble o mercado de renta tradicional.
Cluster 2 (Segmento Residencial Familiar): Propiedades de gama media-alta con áreas construidas que oscilan entre 120 y 200 m², 2 parqueaderos y 3 baños. Presenta un equilibrio óptimo entre espacio y precio.
Cluster 3 (Segmento Premium / Alta Gama): Grupo minoritario enfocado en inmuebles de gran extensión (más de 250 m²), más de 3 parqueaderos y precios situados en la cola superior del mercado. Representa propiedades de lujo concentradas en zonas de alta plusvalía.
El Análisis de Correspondencias Múltiples (ACM) permite examinar las
relaciones simultáneas entre las variables cualitativas de la base de
datos: la zona geográfica, el
estrato socioeconómico y el
tipo de propiedad (Casa vs. Apartamento).
Se prefiere esta al análisis de correspondecias simple, pues éste último
solo evalúa 2 variables categóricas, lo que implicaría desarrollar una
justificación y criterio adicional para sustentar que las variables
escogidas son las más relevantes.
# 1. Selección de variables cualitativas para el ACM
vars_cualitativas <- df_clean %>%
select(zona, estrato, tipo)
# 2. Ejecución del ACM con FactoMineR
res_mca <- MCA(vars_cualitativas, graph = FALSE)
# --- GRÁFICA 1: Porcentaje de Inercia Explicada por Dimensión ---
fviz_eig(res_mca, addlabels = TRUE, ylim = c(0, 50),
barfill = "#2980b9", barcolor = "#2980b9",
main = "Porcentaje de Inercia Explicada (ACM)")# --- GRÁFICA 2: Asociación de las Variables con los Ejes Factoriales ---
fviz_mca_var(res_mca,
choice = "mca.cor",
repel = TRUE,
ggtheme = theme_minimal(),
title = "Correlación de las Variables Categóricas con los Ejes")# --- GRÁFICA 3: Plano Factorial de Categorías (Biplot de Categorías) ---
fviz_mca_var(res_mca,
col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
shape.var = 15,
repel = TRUE,
ggtheme = theme_minimal(),
title = "Mapa Perceptual de Categorías (Zona, Estrato y Tipo)")# Extraer la contribución de las categorías a las dos primeras dimensiones
contrib_cat <- as.data.frame(res_mca$var$contrib) %>%
round(2) %>%
select(Dim.1 = `Dim 1`, Dim.2 = `Dim 2`)
kable(contrib_cat,
col.names = c("Contribución Dim 1 (%)", "Contribución Dim 2 (%)"),
caption = "Contribución Porcentual de las Categorías a los Ejes Factoriales") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Contribución Dim 1 (%) | Contribución Dim 2 (%) | |
|---|---|---|
| Zona Centro | 7.34 | 1.70 |
| Zona Norte | 1.97 | 1.92 |
| Zona Oeste | 10.87 | 30.28 |
| Zona Oriente | 24.84 | 9.00 |
| Zona Sur | 0.17 | 8.02 |
| 3 | 32.25 | 7.76 |
| 4 | 0.00 | 12.62 |
| 5 | 0.22 | 6.49 |
| 6 | 7.96 | 21.18 |
| Apartamento | 5.32 | 0.38 |
| Casa | 9.05 | 0.65 |
Estructura de las Dimensiones Factoriales:
Dimensión 1 (Eje de Nivel Socioeconómico y Verticalidad): Separa los estratos altos (5 y 6) ubicados en el sector positivo del eje, de los estratos medios-bajos (3 y 4) en el sector negativo.
Dimensión 2 (Eje de Tipología y Cobertura Espacial): Discrimina la oferta según la tipología arquitectónica (Casa vs. Apartamento) y su localización en las distintas zonas geográficas de la ciudad.
Asociación entre Categorías (Patrones de Mercado):
Nicho Premium de Vivienda Vertical: Se evidencia una fuerte proximidad categórica entre los estratos 5 y 6, el tipo Apartamento y la Zona Sur / Zona Oeste. Este patrón confirma la concentración de desarrollos residenciales de alta densidad y elevado valor comercial en dichos sectores.
Nicho Masivo y Suburbano / Horizontal: La categoría Casa se proyecta hacia la Zona Oriente y Zona Norte, cercana a los estratos 3 y 4, lo que refleja una oferta de desarrollo unifamiliar horizontal orientado a segmentos de mediana y menor gama económica.
Este tipo de asociaciones permite tomar deciciones respecto a campañas de comercialización, es decir, las campañas para apartamentos de estrato alto deben enfocar sus recursos en las Zonas Sur y Oeste. En cambio, los proyectos orientados al segmento familiar unifamiliar (casas) encuentran su principal demanda y alineación de oferta en las Zonas Oriente y Norte.
Conclusiones Clave Estructura del Mercado: La valoración económica de la propiedad está fuertemente determinada en un 70% por la escala global del inmueble (Área construida, Parqueaderos y Baños), mientras que la densidad de habitaciones opera como una dimensión independiente.
Segmentación de la Oferta: Se identificaron tres nichos claros de mercado: la oferta masiva/económica, el segmento familiar de clase media y el segmento Premium enfocado en la Zona Sur/Oeste.
Distribución Categórica Espacial: Los apartamentos concentran la oferta de estrato alto con valores por metro cuadrado superiores, mientras que las casas predominan en zonas con menor densidad vertical.
Recomendaciones Estratégicas para la Dirección. Estrategia de Adquisición y Compra: Concentrar las inversiones de desarrollo vertical en la Zona Sur/Oeste para inmuebles tipo Apartamento, donde el valor por metro cuadrado presenta las mayores márgenes de plusvalía.
Optimización del Portafolio: Diversificar el catálogo ofreciendo inmuebles del Cluster 2 (Gama Media Familiar), el cual presenta la mayor rotación de demanda en el mercado local.
Fijación de Precios (Pricing Algorítmico): Implementar modelos predictivos basados en las componentes principales identificadas para evitar sobreprecios en inmuebles con alto número de habitaciones pero bajos metros cuadrados construidos.