Escoger Variables

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")

Análisis de la Matriz de correlacón

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

motivo para sostener la variable estrato

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.

Conclusión sobre qué variables dejar

Análisis de Curtosis y Concentración de las variables “preciom”

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

Análisis de Curtosis y Concentración de las variables “areaconst”

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

Transformación de las Variables “preciom” y “areaconst”

vivienda_num$preciom_log <- log(vivienda_num$preciom)
vivienda_num$areaconst_log <- log(vivienda_num$areaconst)

Análisis de Outliers y Concentración después de transformar

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")

Comparativa de Transformación de Variables

1. Análisis de Precios (preciom vs preciom_log)

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.

  • Resultado de la Transformación: Al aplicar el logaritmo, la curtosis se redujo a 2.7. Al acercarse al valor de 3 (distribución normal), se logro que el precio sea una variable más equilibrada.

2. Análisis de Área Construida (areaconst vs areaconst_log)

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.

  • Resultado de la Transformación: La curtosis cayó drásticamente a 2.58. Esta reducción de 13.68 puntos es el logro más significativo de la limpieza de datos, permitiendo una distribución mucho más simétrica y manejable.

Preparación del Dataframe para el PCA

vivienda_pca_input <- vivienda_num[, c("preciom_log", "areaconst_log", "estrato", "banios", "habitaciones")]

Ejecución del (PCA)

# 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")

Análisis de la Varianza Explicada

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)")

A. El Eje del Valor y Lujo (Dimensión 1 - Horizontal)

Todas las variables apuntan hacia la derecha, lo que significa que el eje X mide el “Nivel Socioeconómico y Tamaño”.

  • “preciom_log”, “areaconst_log” y “banios” están muy cerca entre sí. Esto confirma tu sospecha inicial: a más metros cuadrados y más baños, el precio sube de forma sistemática.

B. El Eje de la Configuración (Dimensión 2 - Vertical)

  • “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).

Determinar el número óptimo de grupos (Método del Codo)

fviz_nbclust(res_pca$ind$coord, kmeans, method = "wss") +
  labs(title = "Método del Codo", subtitle = "Buscamos el 'punto de quiebre'")

Análisis del Método del Codo

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.

Mapa de Clusters (Segmentación) K-means

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)")

Análisis del Mapa de Clusters (Segmentación)

  • 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”.

Tabla de resultados

# 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

Interpretación de la de la tabla de resultados

  • Cluster 1 Grandes Viviendas FamiliaresEl más espacioso (\(339\ m^2\)) y con más habitaciones (6). Es el mercado de casas grandes en Estrato 5.
  • Cluster 2 Vivienda Estándar/ApartamentosEl más masivo (3584 unidades). Áreas compactas (\(97\ m^2\)) y 3 habitaciones. Es el “corazón” del mercado en Estrato 5.
  • Cluster 3 Segmento Premium/Lujo El de mayor precio (775 millones) y Estrato 6 predominante. No son las más grandes en área, pero sí las más costosas.

Análisis de Correspondencia (AC)

# 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")

Interpretación del Gráfico de Correspondencia (Zonas 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.

Conclusiones Estratégicas y Recomendaciones

Basado en el análisis multidimensional realizado (ACP, Clustering y Correspondencia), se presentan las siguientes conclusiones clave para la toma de decisiones.

1. Conclusiones Clave del Mercado

  • 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.

2. Recomendaciones Estratégicas para la Inversión

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.

3. Ventaja Competitiva

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.