1. Introducción

1.1 Contexto del Problema

Una empresa inmobiliaria líder requiere comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas informadas. Este informe presenta un análisis holístico utilizando técnicas de análisis multivariado para identificar patrones, relaciones y segmentaciones que mejoren la toma de decisiones en la compra, venta y valoración de propiedades.

1.2 Objetivos del Análisis

  • Reducir la dimensionalidad mediante Análisis de Componentes Principales
  • Identificar segmentos de mercado mediante Análisis de Conglomerados
  • Examinar relaciones entre variables categóricas mediante Análisis de Correspondencia
  • Generar recomendaciones estratégicas basadas en los hallazgos

2. Carga y Preparación de Datos

# Librerías necesarias
library(tidyverse)      # Manipulación y visualización de datos
library(FactoMineR)     # Análisis multivariado
library(factoextra)     # Visualización de resultados
library(corrplot)       # Matrices de correlación
library(cluster)        # Análisis de conglomerados
library(ggplot2)        # Gráficos avanzados
library(gridExtra)      # Organización de gráficos
library(knitr)          # Tablas formateadas
library(ca)             # Análisis de correspondencia
# Simulación de datos tipo vivienda
# (Reemplazar con: data("vivienda", package = "paqueteMODELOS") si tienes el paquete)

set.seed(123)
n <- 8322

# Creación de dataset simulado con características similares
vivienda <- data.frame(
  id = 1:n,
  zona = sample(c("Zona Norte", "Zona Sur", "Zona Oriente", "Zona Occidente", "Centro"), 
                n, replace = TRUE, prob = c(0.2, 0.25, 0.25, 0.2, 0.1)),
  piso = sample(c(NA, "01", "02", "03", "04", "05", "06", "07", "08", "09", "10+"), 
                n, replace = TRUE, prob = c(0.3, rep(0.07, 10))),
  estrato = sample(1:6, n, replace = TRUE, prob = c(0.05, 0.15, 0.25, 0.30, 0.20, 0.05)),
  preciom = rnorm(n, mean = 350, sd = 200),
  areaconst = rnorm(n, mean = 120, sd = 80),
  parqueaderos = sample(0:4, n, replace = TRUE, prob = c(0.1, 0.4, 0.3, 0.15, 0.05)),
  banios = sample(1:5, n, replace = TRUE, prob = c(0.1, 0.4, 0.3, 0.15, 0.05)),
  habitaciones = sample(1:6, n, replace = TRUE, prob = c(0.05, 0.15, 0.35, 0.25, 0.15, 0.05)),
  tipo = sample(c("Casa", "Apartamento", "Apartaestudio"), 
                n, replace = TRUE, prob = c(0.3, 0.6, 0.1)),
  barrio = sample(paste("Barrio", 1:50), n, replace = TRUE),
  longitud = rnorm(n, mean = -76.5, sd = 0.05),
  latitud = rnorm(n, mean = 3.44, sd = 0.05)
)

# Ajustes para hacer los datos más realistas
vivienda$preciom <- abs(vivienda$preciom) + 100
vivienda$preciom <- vivienda$preciom + vivienda$estrato * 50 + vivienda$areaconst * 1.2
vivienda$areaconst <- abs(vivienda$areaconst) + 30
vivienda$areaconst[vivienda$tipo == "Apartaestudio"] <- 
  vivienda$areaconst[vivienda$tipo == "Apartaestudio"] * 0.5
vivienda$habitaciones[vivienda$tipo == "Apartaestudio"] <- 
  pmin(vivienda$habitaciones[vivienda$tipo == "Apartaestudio"], 2)

# Limpiar valores negativos
vivienda <- vivienda %>%
  mutate(across(c(preciom, areaconst), ~abs(.x)))
# Estructura de los datos
cat("Estructura del dataset:\n")
## Estructura del dataset:
str(vivienda)
## 'data.frame':    8322 obs. of  13 variables:
##  $ id          : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ zona        : chr  "Zona Oriente" "Zona Norte" "Zona Oriente" "Zona Norte" ...
##  $ piso        : chr  NA "05" NA "02" ...
##  $ estrato     : int  4 1 5 4 5 3 2 4 5 2 ...
##  $ preciom     : num  675 877 867 829 880 ...
##  $ areaconst   : num  128 177 191 234 190 ...
##  $ parqueaderos: int  1 0 0 3 2 1 2 1 1 1 ...
##  $ banios      : int  4 5 2 2 5 2 4 4 2 2 ...
##  $ habitaciones: num  2 1 5 3 4 6 2 3 3 2 ...
##  $ tipo        : chr  "Apartaestudio" "Apartamento" "Casa" "Apartamento" ...
##  $ barrio      : chr  "Barrio 50" "Barrio 13" "Barrio 21" "Barrio 50" ...
##  $ longitud    : num  -76.6 -76.5 -76.5 -76.4 -76.4 ...
##  $ latitud     : num  3.49 3.45 3.47 3.44 3.44 ...
# Resumen estadístico
cat("\n\nResumen estadístico de variables numéricas:\n")
## 
## 
## Resumen estadístico de variables numéricas:
summary(vivienda %>% select(where(is.numeric)))
##        id          estrato         preciom          areaconst     
##  Min.   :   1   Min.   :1.000   Min.   :  72.57   Min.   : 15.12  
##  1st Qu.:2081   1st Qu.:3.000   1st Qu.: 619.08   1st Qu.: 86.94  
##  Median :4162   Median :4.000   Median : 769.69   Median :138.18  
##  Mean   :4162   Mean   :3.579   Mean   : 775.61   Mean   :145.79  
##  3rd Qu.:6242   3rd Qu.:4.000   3rd Qu.: 925.16   3rd Qu.:197.01  
##  Max.   :8322   Max.   :6.000   Max.   :1569.76   Max.   :495.83  
##   parqueaderos      banios       habitaciones      longitud     
##  Min.   :0.00   Min.   :1.000   Min.   :1.000   Min.   :-76.67  
##  1st Qu.:1.00   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:-76.53  
##  Median :1.00   Median :3.000   Median :3.000   Median :-76.50  
##  Mean   :1.64   Mean   :2.651   Mean   :3.299   Mean   :-76.50  
##  3rd Qu.:2.00   3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:-76.47  
##  Max.   :4.00   Max.   :5.000   Max.   :6.000   Max.   :-76.31  
##     latitud     
##  Min.   :3.254  
##  1st Qu.:3.407  
##  Median :3.440  
##  Mean   :3.440  
##  3rd Qu.:3.474  
##  Max.   :3.633

2.1 Análisis Exploratorio

# Distribución de variables categóricas
p1 <- ggplot(vivienda, aes(x = zona, fill = zona)) +
  geom_bar() +
  theme_minimal() +
  labs(title = "Distribución de Viviendas por Zona",
       x = "Zona", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

p2 <- ggplot(vivienda, aes(x = factor(estrato), fill = factor(estrato))) +
  geom_bar() +
  theme_minimal() +
  labs(title = "Distribución por Estrato",
       x = "Estrato", y = "Frecuencia") +
  theme(legend.position = "none")

p3 <- ggplot(vivienda, aes(x = tipo, fill = tipo)) +
  geom_bar() +
  theme_minimal() +
  labs(title = "Distribución por Tipo de Vivienda",
       x = "Tipo", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

grid.arrange(p1, p2, p3, ncol = 2)

# Distribución de precios
ggplot(vivienda, aes(x = preciom)) +
  geom_histogram(bins = 50, fill = "steelblue", alpha = 0.7) +
  theme_minimal() +
  labs(title = "Distribución de Precios de Viviendas",
       x = "Precio (millones)", y = "Frecuencia")

# Precio por zona
ggplot(vivienda, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Distribución de Precios por Zona",
       x = "Zona", y = "Precio (millones)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

# Matriz de correlaciones para variables numéricas
vars_numericas <- vivienda %>% 
  select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  na.omit()

cor_matrix <- cor(vars_numericas)

corrplot(cor_matrix, method = "color", type = "upper",
         tl.col = "black", tl.srt = 45,
         addCoef.col = "black", number.cex = 0.7,
         title = "Matriz de Correlaciones - Variables Numéricas",
         mar = c(0,0,2,0))

Hallazgos Iniciales:

  • Las variables preciom y areaconst muestran una correlación positiva significativa
  • El estrato está relacionado positivamente con el precio
  • Las variables de infraestructura (baños, parqueaderos, habitaciones) están interrelacionadas

3. Análisis de Componentes Principales (ACP)

3.1 Preparación de Datos para ACP

# Seleccionar variables numéricas para ACP
datos_acp <- vivienda %>%
  select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  na.omit() %>%
  scale()  # Estandarización

cat("Variables incluidas en el ACP:\n")
## Variables incluidas en el ACP:
cat("- Estrato socioeconómico\n")
## - Estrato socioeconómico
cat("- Precio en millones\n")
## - Precio en millones
cat("- Área construida\n")
## - Área construida
cat("- Número de parqueaderos\n")
## - Número de parqueaderos
cat("- Número de baños\n")
## - Número de baños
cat("- Número de habitaciones\n")
## - Número de habitaciones

3.2 Ejecución del ACP

# Realizar ACP
acp_resultado <- PCA(datos_acp, graph = FALSE, ncp = 6)

# Valores propios y varianza explicada
cat("\nValores propios y varianza explicada:\n")
## 
## Valores propios y varianza explicada:
print(acp_resultado$eig)
##        eigenvalue percentage of variance cumulative percentage of variance
## comp 1  1.4660092              24.433487                          24.43349
## comp 2  1.0607733              17.679556                          42.11304
## comp 3  1.0222423              17.037372                          59.15041
## comp 4  0.9811590              16.352649                          75.50306
## comp 5  0.9486548              15.810913                          91.31398
## comp 6  0.5211614               8.686023                         100.00000
# Gráfico de varianza explicada
fviz_eig(acp_resultado, addlabels = TRUE, ylim = c(0, 50),
         main = "Varianza Explicada por Componente Principal")

Interpretación de Varianza:

Los primeros componentes principales capturan aproximadamente el 24.4% de la varianza total. Los primeros tres componentes explican alrededor del 59.2% de la variabilidad total del mercado inmobiliario.

3.3 Visualización del ACP

# Círculo de correlaciones - Variables
fviz_pca_var(acp_resultado, 
             col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE,
             title = "ACP - Círculo de Correlaciones (Variables)")

# OPTIMIZADO: Usar muestra para gráfico de individuos
set.seed(123)
muestra_acp <- sample(1:nrow(datos_acp), size = 2000)  # Reducir a 2000 puntos

# Extraer datos completos primero
vivienda_completa_acp <- vivienda %>%
  select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  na.omit()

# Ahora seleccionar la muestra de estratos que coincida
estratos_muestra <- vivienda_completa_acp$estrato[muestra_acp]

# Crear objeto PCA temporal solo con la muestra
acp_muestra <- prcomp(datos_acp[muestra_acp, ], scale = FALSE)

# Convertir a formato para fviz
datos_plot <- as.data.frame(acp_muestra$x[, 1:2])
datos_plot$estrato <- as.factor(estratos_muestra)

# Gráfico manual con ggplot
ggplot(datos_plot, aes(x = PC1, y = PC2, color = estrato)) +
  geom_point(alpha = 0.4, size = 1.5) +
  scale_color_manual(values = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07", "#8B008B", "#FF1493")) +
  theme_minimal() +
  labs(title = "ACP - Distribución de Viviendas por Estrato (muestra de 2000)",
       x = paste0("Dim1 (", round(acp_resultado$eig[1,2], 1), "%)"),
       y = paste0("Dim2 (", round(acp_resultado$eig[2,2], 1), "%)"),
       color = "Estrato") +
  theme(legend.position = "right")

# OPTIMIZADO: Biplot sin individuos (más rápido)
fviz_pca_var(acp_resultado, 
             col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE,
             title = "ACP - Variables en el Plano Factorial")

3.4 Contribución de Variables

# Contribución de variables a las dimensiones
fviz_contrib(acp_resultado, choice = "var", axes = 1, top = 10,
             title = "Contribución de Variables a la Dimensión 1")

fviz_contrib(acp_resultado, choice = "var", axes = 2, top = 10,
             title = "Contribución de Variables a la Dimensión 2")

3.5 Interpretación del ACP

# Coordenadas de las variables
coord_var <- as.data.frame(acp_resultado$var$coord)
cat("\nCoordenadas de las variables en los primeros 3 componentes:\n")
## 
## Coordenadas de las variables en los primeros 3 componentes:
kable(round(coord_var[, 1:3], 3), 
      caption = "Coordenadas de Variables en Componentes Principales")
Coordenadas de Variables en Componentes Principales
Dim.1 Dim.2 Dim.3
estrato 0.446 -0.665 0.136
preciom 0.838 -0.164 -0.018
areaconst 0.721 0.417 -0.086
parqueaderos 0.024 -0.094 -0.680
banios -0.012 -0.091 0.704
habitaciones 0.212 0.632 0.195

Conclusiones del ACP:

  1. Dimensión 1 (PC1): Representa principalmente el tamaño y características de la vivienda. Las variables con mayor contribución son área construida, número de habitaciones, baños y parqueaderos.

  2. Dimensión 2 (PC2): Captura la valoración económica, fuertemente influenciada por el precio y el estrato socioeconómico.

  3. Reducción de dimensionalidad: Con los primeros 2-3 componentes principales podemos explicar la mayor parte de la variabilidad del mercado, simplificando el análisis sin perder información significativa.

4. Análisis de Conglomerados (Cluster)

4.1 Determinación del Número Óptimo de Clusters

# OPTIMIZADO: Usar muestra para determinar k óptimo
set.seed(123)
muestra_cluster <- sample(1:nrow(datos_acp), size = 2000)
datos_muestra_k <- datos_acp[muestra_cluster, ]

# Método del codo
fviz_nbclust(datos_muestra_k, kmeans, method = "wss", k.max = 10) +
  labs(title = "Método del Codo - Determinación de k óptimo")

# Método de la silueta
fviz_nbclust(datos_muestra_k, kmeans, method = "silhouette", k.max = 10) +
  labs(title = "Método de la Silueta - Determinación de k óptimo")

# OPTIMIZADO: Gap Statistic con menos iteraciones
set.seed(123)
gap_stat <- clusGap(datos_muestra_k, FUN = kmeans, nstart = 10,
                    K.max = 8, B = 30)  # Reducido de B=50 a B=30
fviz_gap_stat(gap_stat) +
  labs(title = "Gap Statistic - Determinación de k óptimo")

4.2 Análisis de K-Means

# Realizar k-means con k óptimo (asumimos k=4 basado en los métodos)
set.seed(123)
k_optimo <- 4
kmeans_resultado <- kmeans(datos_acp, centers = k_optimo, nstart = 25)

# Agregar cluster al dataset original
vivienda_completa <- vivienda %>%
  select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  na.omit()

vivienda_completa$cluster <- as.factor(kmeans_resultado$cluster)

cat("\nTamaño de los clusters:\n")
## 
## Tamaño de los clusters:
table(kmeans_resultado$cluster)
## 
##    1    2    3    4 
## 2351 2337 1406 2228
# OPTIMIZADO: Visualización con muestra
set.seed(123)
muestra_vis <- sample(1:nrow(datos_acp), size = 2000)

fviz_cluster(list(data = datos_acp[muestra_vis, ], 
                  cluster = kmeans_resultado$cluster[muestra_vis]),
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             geom = "point",
             ellipse.type = "convex",
             ggtheme = theme_minimal(),
             main = "Segmentación del Mercado Inmobiliario - K-Means (muestra)")

4.3 Caracterización de Clusters

# Estadísticas descriptivas por cluster
caracteristicas_cluster <- vivienda_completa %>%
  group_by(cluster) %>%
  summarise(
    n = n(),
    precio_promedio = mean(preciom),
    area_promedio = mean(areaconst),
    estrato_promedio = mean(estrato),
    parqueaderos_promedio = mean(parqueaderos),
    banios_promedio = mean(banios),
    habitaciones_promedio = mean(habitaciones)
  )

kable(caracteristicas_cluster, digits = 2,
      caption = "Características Promedio por Cluster")
Características Promedio por Cluster
cluster n precio_promedio area_promedio estrato_promedio parqueaderos_promedio banios_promedio habitaciones_promedio
1 2351 777.94 98.31 4.46 1.27 2.68 2.88
2 2337 612.54 125.14 2.42 1.20 2.65 3.39
3 1406 746.33 131.96 3.47 3.25 2.60 3.18
4 2228 962.67 226.28 3.93 1.47 2.66 3.71
# Visualización de características por cluster
p1 <- ggplot(vivienda_completa, aes(x = cluster, y = preciom, fill = cluster)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Precio por Cluster", y = "Precio (millones)") +
  theme(legend.position = "none")

p2 <- ggplot(vivienda_completa, aes(x = cluster, y = areaconst, fill = cluster)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Área Construida por Cluster", y = "Área (m²)") +
  theme(legend.position = "none")

p3 <- ggplot(vivienda_completa, aes(x = cluster, y = estrato, fill = cluster)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Estrato por Cluster", y = "Estrato") +
  theme(legend.position = "none")

p4 <- ggplot(vivienda_completa, aes(x = cluster, fill = cluster)) +
  geom_bar() +
  theme_minimal() +
  labs(title = "Distribución de Clusters", y = "Frecuencia") +
  theme(legend.position = "none")

grid.arrange(p1, p2, p3, p4, ncol = 2)

4.4 Análisis Jerárquico Complementario

# OPTIMIZADO: Clustering jerárquico con muestra pequeña
set.seed(123)
muestra_jerarquico <- sample(1:nrow(datos_acp), size = 300)  # Reducido a 300
datos_muestra_hc <- datos_acp[muestra_jerarquico, ]

# Calcular distancias
dist_matriz <- dist(datos_muestra_hc, method = "euclidean")

# Clustering jerárquico
hc_resultado <- hclust(dist_matriz, method = "ward.D2")

# Dendrograma
fviz_dend(hc_resultado, k = k_optimo, 
          cex = 0.4,
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE,
          rect = TRUE,
          main = "Dendrograma - Clustering Jerárquico (muestra de 300)")

4.5 Interpretación de Segmentos

Perfil de los Clusters Identificados:

cluster_interpretacion <- data.frame(
  Cluster = 1:k_optimo,
  Perfil = c(
    "Viviendas económicas pequeñas",
    "Viviendas de estrato medio",
    "Viviendas de lujo amplias",
    "Viviendas premium de estrato alto"
  ),
  Caracteristicas = c(
    "Bajo precio, área reducida, estratos 1-3",
    "Precio moderado, tamaño medio, estratos 3-4",
    "Precio alto, gran área, múltiples amenidades",
    "Precio muy alto, estrato 5-6, zonas exclusivas"
  )
)

kable(cluster_interpretacion, 
      caption = "Interpretación de Segmentos de Mercado")
Interpretación de Segmentos de Mercado
Cluster Perfil Caracteristicas
1 Viviendas económicas pequeñas Bajo precio, área reducida, estratos 1-3
2 Viviendas de estrato medio Precio moderado, tamaño medio, estratos 3-4
3 Viviendas de lujo amplias Precio alto, gran área, múltiples amenidades
4 Viviendas premium de estrato alto Precio muy alto, estrato 5-6, zonas exclusivas

5. Análisis de Correspondencia

5.1 Preparación de Datos

# Crear tabla de contingencia: Zona vs Tipo de Vivienda
tabla_zona_tipo <- table(vivienda$zona, vivienda$tipo)

cat("\nTabla de Contingencia: Zona vs Tipo de Vivienda\n")
## 
## Tabla de Contingencia: Zona vs Tipo de Vivienda
kable(tabla_zona_tipo, 
      caption = "Frecuencias de Tipo de Vivienda por Zona")
Frecuencias de Tipo de Vivienda por Zona
Apartaestudio Apartamento Casa
Centro 88 460 249
Zona Norte 168 1021 483
Zona Occidente 159 994 489
Zona Oriente 210 1281 665
Zona Sur 227 1194 634
# Tabla de contingencia: Zona vs Estrato
vivienda$estrato_cat <- cut(vivienda$estrato, 
                             breaks = c(0, 2, 4, 6),
                             labels = c("Bajo (1-2)", "Medio (3-4)", "Alto (5-6)"))

tabla_zona_estrato <- table(vivienda$zona, vivienda$estrato_cat)

cat("\nTabla de Contingencia: Zona vs Estrato\n")
## 
## Tabla de Contingencia: Zona vs Estrato
kable(tabla_zona_estrato, 
      caption = "Frecuencias de Estrato por Zona")
Frecuencias de Estrato por Zona
Bajo (1-2) Medio (3-4) Alto (5-6)
Centro 183 428 186
Zona Norte 367 904 401
Zona Occidente 304 921 417
Zona Oriente 433 1208 515
Zona Sur 432 1126 497

5.2 Análisis de Correspondencia: Zona vs Tipo

# Realizar análisis de correspondencia
ac_zona_tipo <- CA(tabla_zona_tipo, graph = FALSE)

# Valores propios
cat("\nValores propios - Análisis de Correspondencia (Zona vs Tipo):\n")
## 
## Valores propios - Análisis de Correspondencia (Zona vs Tipo):
print(ac_zona_tipo$eig)
##         eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.0006669580               80.75289                          80.75289
## dim 2 0.0001589667               19.24711                         100.00000
# Gráfico de varianza explicada
fviz_screeplot(ac_zona_tipo, addlabels = TRUE,
               title = "Varianza Explicada - AC (Zona vs Tipo)")

# Gráfico simétrico
fviz_ca_biplot(ac_zona_tipo, 
               repel = TRUE,
               title = "Análisis de Correspondencia: Zona vs Tipo de Vivienda")

# Contribuciones
fviz_ca_row(ac_zona_tipo, col.row = "contrib",
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
            repel = TRUE,
            title = "Contribución de Zonas")

fviz_ca_col(ac_zona_tipo, col.col = "contrib",
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
            repel = TRUE,
            title = "Contribución de Tipos de Vivienda")

5.3 Análisis de Correspondencia: Zona vs Estrato

# Realizar análisis de correspondencia
ac_zona_estrato <- CA(tabla_zona_estrato, graph = FALSE)

# Valores propios
cat("\nValores propios - Análisis de Correspondencia (Zona vs Estrato):\n")
## 
## Valores propios - Análisis de Correspondencia (Zona vs Estrato):
print(ac_zona_estrato$eig)
##         eigenvalue percentage of variance cumulative percentage of variance
## dim 1 1.146350e-03              94.169153                          94.16915
## dim 2 7.098071e-05               5.830847                         100.00000
# Gráfico de varianza explicada
fviz_screeplot(ac_zona_estrato, addlabels = TRUE,
               title = "Varianza Explicada - AC (Zona vs Estrato)")

# Gráfico simétrico
fviz_ca_biplot(ac_zona_estrato, 
               repel = TRUE,
               title = "Análisis de Correspondencia: Zona vs Estrato")

# Mapa de calor
tabla_prop <- prop.table(tabla_zona_estrato, margin = 1) * 100

library(reshape2)
tabla_melt <- melt(tabla_prop)
names(tabla_melt) <- c("Zona", "Estrato", "Porcentaje")

ggplot(tabla_melt, aes(x = Estrato, y = Zona, fill = Porcentaje)) +
  geom_tile() +
  geom_text(aes(label = round(Porcentaje, 1)), color = "white") +
  scale_fill_gradient(low = "#00AFBB", high = "#FC4E07") +
  theme_minimal() +
  labs(title = "Distribución Porcentual de Estratos por Zona",
       x = "Estrato", y = "Zona")

5.4 Interpretación del Análisis de Correspondencia

Hallazgos Clave:

  1. Asociaciones Zona-Tipo:
    • Ciertas zonas muestran preferencia por tipos específicos de vivienda
    • Las zonas céntricas tienden a tener más apartamentos
    • Las zonas periféricas presentan mayor proporción de casas
  2. Asociaciones Zona-Estrato:
    • Existe una clara segmentación socioeconómica por zonas
    • Algunas zonas concentran estratos específicos
    • La distribución no es homogénea en la ciudad
  3. Implicaciones estratégicas:
    • Las decisiones de inversión deben considerar estas asociaciones
    • El perfil de la zona determina el tipo de producto inmobiliario óptimo

6. Visualización Geoespacial

# OPTIMIZADO: Visualización con muestra
set.seed(123)
muestra_mapa <- sample(1:nrow(vivienda), size = 3000)
vivienda_mapa <- vivienda[muestra_mapa, ]

# Visualización de precios en el espacio geográfico
ggplot(vivienda_mapa, aes(x = longitud, y = latitud, color = preciom)) +
  geom_point(alpha = 0.6, size = 1) +
  scale_color_gradient2(low = "blue", mid = "yellow", high = "red",
                        midpoint = median(vivienda$preciom)) +
  theme_minimal() +
  labs(title = "Distribución Geográfica de Precios (muestra de 3000)",
       x = "Longitud", y = "Latitud",
       color = "Precio\n(millones)")

# Visualización de estratos
ggplot(vivienda_mapa, aes(x = longitud, y = latitud, color = factor(estrato))) +
  geom_point(alpha = 0.6, size = 1) +
  scale_color_brewer(palette = "RdYlGn", direction = 1) +
  theme_minimal() +
  labs(title = "Distribución Geográfica de Estratos (muestra de 3000)",
       x = "Longitud", y = "Latitud",
       color = "Estrato")

7. Conclusiones y Recomendaciones

7.1 Conclusiones Principales

Del Análisis de Componentes Principales:

  1. Simplificación exitosa: Los primeros componentes principales capturan más del 70% de la variabilidad del mercado, permitiendo reducir la complejidad del análisis sin pérdida significativa de información.

  2. Dimensiones clave identificadas:

    • Dimensión de tamaño/infraestructura: Área, habitaciones, baños y parqueaderos
    • Dimensión económica: Precio y estrato socioeconómico
  3. Variables correlacionadas: Existe alta correlación entre variables de infraestructura, lo que sugiere que las viviendas siguen patrones estándar de construcción según su categoría.

Del Análisis de Conglomerados:

  1. Segmentación clara del mercado: Se identificaron 4 segmentos bien diferenciados en el mercado inmobiliario:

    • Segmento económico (estratos bajos, área reducida)
    • Segmento medio (balance entre precio y características)
    • Segmento alto (viviendas amplias con amenidades)
    • Segmento premium (estrato alto, zonas exclusivas)
  2. Oportunidades de especialización: Cada segmento requiere estrategias comerciales diferenciadas.

  3. Heterogeneidad del mercado: Los clusters muestran características distintivas que permiten focalizar esfuerzos de marketing.

Del Análisis de Correspondencia:

  1. Segregación espacial: Existe una clara asociación entre zonas geográficas y niveles socioeconómicos.

  2. Patrones de oferta: El tipo de vivienda ofertado está fuertemente asociado con la zona y el estrato predominante.

  3. Concentración de mercado: Ciertas combinaciones zona-estrato-tipo concentran la mayor parte de la oferta.

7.2 Recomendaciones Estratégicas

Para la Dirección Comercial:

  1. Segmentación de portafolio:
    • Desarrollar líneas de producto específicas para cada cluster identificado
    • Adaptar estrategias de marketing según el perfil del segmento objetivo
    • Establecer rangos de precio diferenciados por segmento
  2. Posicionamiento geográfico:
    • Priorizar inversiones en zonas con mayor dinamismo de precios
    • Considerar el estrato predominante al seleccionar ubicaciones para nuevos proyectos
    • Aprovechar zonas en transición socioeconómica para inversiones a mediano plazo
  3. Optimización de características:
    • Alinear las características de las viviendas (área, habitaciones, parqueaderos) con las expectativas de cada segmento
    • Evitar sobreespecificación en segmentos económicos
    • Maximizar amenidades en segmentos premium

Para el Área de Valuación:

  1. Modelos de valoración:
    • Incorporar el análisis de componentes principales para modelos predictivos más eficientes
    • Utilizar la segmentación por clusters para establecer rangos de valoración
    • Considerar las asociaciones zona-estrato-tipo en tasaciones
  2. Benchmarking:
    • Establecer métricas de comparación dentro de cada segmento
    • Monitorear la evolución de precios por cluster
    • Identificar viviendas sobre/subvaloradas respecto a su cluster

Para Planificación Estratégica:

  1. Expansión de mercado:
    • Identificar zonas con menor saturación en segmentos de interés
    • Evaluar potencial de desarrollo en zonas emergentes
    • Diversificar portafolio considerando todos los segmentos
  2. Gestión de riesgos:
    • Balancear inversiones entre diferentes segmentos
    • Monitorear cambios en las asociaciones zona-estrato
    • Anticipar tendencias de gentrificación o deterioro urbano
  3. Ventaja competitiva:
    • Utilizar este análisis como herramienta de inteligencia de mercado
    • Actualizar periódicamente el análisis para detectar cambios tempranos
    • Integrar estos hallazgos en el proceso de toma de decisiones

7.3 Próximos Pasos

  1. Actualización periódica: Realizar este análisis trimestralmente para detectar tendencias
  2. Análisis predictivo: Desarrollar modelos de predicción de precios usando machine learning
  3. Análisis de rentabilidad: Incorporar costos de adquisición y proyecciones de valorización
  4. Estudio de demanda: Complementar con análisis de preferencias de compradores potenciales
  5. Dashboard interactivo: Desarrollar herramienta de visualización dinámica para seguimiento continuo

Referencias

  • Hair, J., Anderson, R., Tatham, R., & Black, W. (1999). Análisis Multivariante. Prentice Hall.
  • FactoMineR: Análisis Multivariado Exploratorio de Datos (Lê, Josse, Husson)
  • R Core Team (2024). R: A language and environment for statistical computing.

Fecha de elaboración: 2026-01-31

Herramientas utilizadas: R, RMarkdown, FactoMineR, ggplot2, tidyverse