Objetivo: Reducir las variables numéricas principales en factores que expliquen la mayor varianza (el “estilo” de la vivienda).
Se plantea utilizar las estimar entre las siguientes variables: “preciom”, “areaconst”, “parqueaderos”, “banios”, “habitaciones”, “estrato” cuales se podrían dejar
data("vivienda")
vivienda_num <- vivienda[c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "estrato")]
# omitir los na
vivienda_num <- na.omit(vivienda_num)
El dilema del “Estrato”: Como bien se datalla, es categórica ordinal. El ACP estándar está diseñado para variables continuas. Al meter el estrato (1 al 6) como número, el modelo asume que la distancia entre el estrato 1 y 2 es la misma que entre el 5 y 6, lo cual es aceptable en este contexto inmobiliario para capturar nivel socioeconómico.
correlaciones <- cor(vivienda_num)
corrplot(correlaciones, method = "circle", type= "upper")
En la interacción de las variables de “preciom”, “areaconst”, “banios” y “parqueaderos” los circulos son grandes y de azul oscuro fuerte una correlación cercana (0.65 -0.70) Esto confirma que estas variables crecen juntas: a más área, más baños y más precio.
La variable “Habitaciones”: Es la que tiene los círculos más pequeños y claros con respecto al precio (aprox. 0.26). Dice que en el mercado, tener más habitaciones no necesariamente sube el precio
correlación se ve claramente que aporta información que las otras no tienen. Si se mira la fila de estrato vs areaconst, el círculo es pequeño (0.25).
Que el estrato da información sobre la ubicación/estatus que el tamaño de la casa no explica. Hay apartamentos pequeños en estrato 6 que valen mucho, y casas enormes en estrato 2 que valen poco. Sin el estrato, el modelo no entendería esa diferencia.
El comportamiento del “estrato”: Tiene una correlación moderada-alta con el precio (0.58). Esto es una señal positiva para mantenerla.
curtosis_precio <- kurtosis(vivienda_num$preciom)
print(paste("Curtosis precio",round(curtosis_precio,2)))
## [1] "Curtosis precio 6.28"
# visualización outliyers y concentración
ggplot(vivienda_num, aes( y = preciom)) +
geom_boxplot(fill= "skyblue", outlier.color = "red" )+
theme_minimal()+
labs(title= "Detección Outliyers en Precios", y= "Precios (millones)")
El boxplot muestra que la mayoría de las viviendas están por debajo de los 600 millones, pero hay una densidad crítica de outliers (puntos rojos) a partir de los 1000 millones. La curtosis de “preciom” es leptocúrtica su valor es 6.28
curtosis_areaconst <- kurtosis(vivienda_num$areaconst)
print(paste("Curtosis Área construida: ",round(curtosis_areaconst,2)))
## [1] "Curtosis Área construida: 16.26"
ggplot(vivienda_num, aes(y=areaconst))+
geom_boxplot(fill="skyblue", outlier.color="red") +
theme_minimal()+
labs(title= "Detección de Outliers en Área construida", y= "Área en m^2")
La concentración masiva de datos en el rango de precios bajos y medios,
pero el boxplot de “areaconst” revela una “cola” de valores atípicos
(outliers) desde aprox. 400 m^2 llegando hasta por ensima de los 1500
m^2. la curtosis de de “areaconst” es 16.26
vivienda_num$preciom_log <- log(vivienda_num$preciom)
vivienda_num$areaconst_log <- log(vivienda_num$areaconst)
curtosis_precio_log <- kurtosis(vivienda_num$preciom_log)
print(paste("Curtosis precio transformado",round(curtosis_precio_log,2)))
## [1] "Curtosis precio transformado 2.7"
ggplot(vivienda_num, aes(y=preciom_log))+
geom_boxplot(fill="skyblue", outlier.color="red")+
theme_minimal()+
labs(title="Detección de outliers después de tranformar los datos de la variable preciom")
curtosis_areaconst_log <- kurtosis(vivienda_num$areaconst_log)
print(paste("Curtosis Área construida transformado:",round(curtosis_areaconst_log,2)))
## [1] "Curtosis Área construida transformado: 2.58"
ggplot(vivienda_num, aes(y=areaconst_log))+
geom_boxplot(fill= "skyblue", outlier.color="red")+
theme_minimal()+
labs(title="Detección de outliers después de tranformar los datos de la variable areaconst")
La variable original presentaba una curtosis de 6.28, lo que estadísticamente se traduce en una distribución leptocúrtica con una alta concentración de datos en el segmento económico y una “cola” muy larga de valores atípicos (mansiones/lotes de lujo) que superan los 1000 millones de pesos.
Esta variable era la más problemática, con una curtosis extrema de 16.26. El boxplot revelaba outliers severos por encima de los \(1500 m^2\) que “aplastaban” visualmente al 95% del resto de la oferta urbana.
vivienda_pca_input <- vivienda_num[, c("preciom_log", "areaconst_log", "estrato", "banios", "habitaciones")]
# scale.unit = TRUE es vital para que todas las variables pesen lo mismo
res_pca <- PCA(vivienda_pca_input, scale.unit = TRUE, graph = FALSE)
# 3. Visualización 1: Varianza explicada (Criterio de selección)
# Esto te dirá cuánta información capturan los primeros dos componentes
fviz_eig(res_pca, addlabels = TRUE, ylim = c(0, 70),
main = "Varianza Explicada por Componente")
Dimensión 1 (63.1%): Por sí sola, ya captura la mayoría de la información.
Acumulado (87%): Al sumar las dos primeras dimensiones, explicas el 87% de toda la variabilidad del mercado inmobiliario.
Has reducido 5 variables a solo 2 ejes sin perder casi nada de información.
# 4. Visualización 2: Círculo de Correlación (Las flechas)
# Aquí veremos si 'habitaciones' realmente apunta a otro lado
fviz_pca_var(res_pca, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE,
title = "Mapa de Variables (ACP)")
Todas las variables apuntan hacia la derecha, lo que significa que el eje X mide el “Nivel Socioeconómico y Tamaño”.
“estrato” vs “habitaciones”: Apuntan en direcciones opuestas en el eje vertical.
Interpretación:Hacia arriba (Estrato alto): Tendencia a viviendas de mayor estatus pero que no necesariamente maximizan el número de cuartos (ej. apartamentos de lujo con áreas sociales amplias).
fviz_nbclust(res_pca$ind$coord, kmeans, method = "wss") +
labs(title = "Método del Codo", subtitle = "Buscamos el 'punto de quiebre'")
gráfica de Método del Codo, se observa que el descenso más brusco en la suma de cuadrados (varianza interna) ocurre entre el cluster 1 y el 2, y se estabiliza significativamente a partir del cluster 3.
set.seed(123) #semilla
res_km <- kmeans(res_pca$ind$coord, centers = 3, nstart = 25)
vivienda_num$cluster <- as.factor(res_km$cluster)
fviz_cluster(res_km, data = res_pca$ind$coord,
palette = "jco",
geom = "point",
ellipse.type = "convex",
ggtheme = theme_minimal(),
main = "Segmentación del Mercado Inmobiliario (Clusters)")
Separación clara: Los grupos están bien definidos. El Cluster 2 (Amarillo) está notablemente separado del resto hacia la izquierda, lo que indica que tiene características muy distintas a los otros dos.
Solapamiento parcial: Los Clusters 1 (Azul) y 3 (Gris) comparten una frontera. Esto es normal en mercados inmobiliarios, donde algunas viviendas de “clase media-alta” pueden parecerse a las de “lujo”.
# Función para calcular la moda
get_mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
resumen_clusters <- vivienda_num %>%
group_by(cluster) %>%
summarise(
Cantidad = n(),
Precio_Medio = mean(preciom),
Area_Media = mean(areaconst),
# Usamos la función de moda aquí
Estrato_Predomina = get_mode(estrato),
Habitaciones_prom = round(mean(habitaciones), 1)
)
print(resumen_clusters)
## # A tibble: 3 × 6
## cluster Cantidad Precio_Medio Area_Media Estrato_Predomina Habitaciones_prom
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 990 556. 339. 5 6
## 2 2 3584 261. 96.9 5 3
## 3 3 2143 775. 249. 6 3.6
# 1. Sincronización exacta por nombres de fila
vivienda_ok <- vivienda[row.names(vivienda_num), ]
# 2. Limpieza de factores (Elimina zonas o niveles que ya no existen tras el na.omit)
vivienda_ok$zona <- droplevels(as.factor(vivienda_ok$zona))
vivienda_num$cluster <- droplevels(as.factor(vivienda_num$cluster))
# 3. Crear la tabla de contingencia y VERIFICARLA
tabla_zona <- table(vivienda_ok$zona, vivienda_num$cluster)
print("Revisando tabla de contingencia:")
## [1] "Revisando tabla de contingencia:"
print(tabla_zona)
##
## 1 2 3
## Zona Centro 12 81 28
## Zona Norte 190 864 484
## Zona Oeste 184 635 350
## Zona Oriente 52 138 120
## Zona Sur 552 1866 1161
res_ca_zona <- CA(tabla_zona, graph = FALSE)
# Visualización
fviz_ca_biplot(res_ca_zona, repel = TRUE,
col.row = "blue", col.col = "red",
arrow = c(TRUE, FALSE), # Flechas para las zonas
title = "Mapa de Correspondencia: Zonas de Cali vs Clusters")
El Mapa de Correspondencia revela una especialización geográfica clara: la Zona Oeste actúa como un imán para el segmento Premium (Cluster 3), mientras que la Zona Sur se consolida como el epicentro de la vivienda familiar de gran formato (Cluster 1). Por el contrario, la oferta de la Zona Norte es más heterogénea, alineándose con el modelo de vivienda estándar (Cluster 2) que domina el volumen del mercado.
Basado en el análisis multidimensional realizado (ACP, Clustering y Correspondencia), se presentan las siguientes conclusiones clave para la toma de decisiones.
Segmentación por Valor y Función: El mercado de Cali no es uniforme. se ha identificado que la Dimensión 1 del ACP (63.1% de varianza) separa las viviendas por poder adquisitivo y tamaño, mientras que la Dimensión 2 separa el estatus (estrato) de la densidad (habitaciones). Esto significa que un mayor precio no siempre implica más cuartos, sino que en ciertos sectores se paga por exclusividad y ubicación.
Especialización de Zonas: El Análisis de Correspondencia confirma que la Zona Sur es el epicentro de las “Grandes Viviendas Familiares” (Cluster 1), mientras que la Zona Oeste tiene una afinidad estadística única con el “Segmento Premium” (Cluster 3, Estrato 6).
Dominio del Mercado Masivo: El Cluster 2 representa la mayor oportunidad de volumen de ventas, concentrando el 53% de la oferta en estratos medios (Estrato 5) con áreas compactas.
Para optimizar la inversión y maximizar beneficios, se recomienda a la dirección:
Estrategia de Desarrollo en el Oeste: Dado que el Cluster 3 es el de mayor precio medio (775M) pero no el de mayor área, se sugiere desarrollar proyectos de apartamentos con acabados de alta gama y diseño arquitectónico superior, priorizando el estatus sobre el número de habitaciones.
Estrategia de Expansión en el Sur: El Sur demanda espacio. Los proyectos en esta zona deben mantener un promedio de 5 a 6 habitaciones o áreas flexibles (estudios/oficinas) para capturar al Cluster 1, que busca amplitud habitacional.
Eficiencia en el “Core Business”: Para el Cluster 2 (mercado masivo), la empresa debe enfocarse en la eficiencia de costos de construcción, ya que es un segmento altamente competitivo donde el precio medio de 261M es el principal factor de decisión de compra.
Este análisis proporciona una ventaja competitiva al permitir que no se invierta a ciegas. En lugar de construir el mismo tipo de vivienda en toda la ciudad, ahora se puede alinear el producto inmobiliario con la vocación estadística de cada zona, reduciendo el tiempo de inventario y optimizando el retorno de inversión (ROI) en un entorno de mercado cambiante.