Contexto del Problema

Una empresa líder del mercado inmobiliario busca comprender en profundidad el mercado de viviendas urbanas. El objetivo de este reporte es realizar un análisis holístico para identificar patrones, relaciones y segmentaciones que optimicen la toma de decisiones en compra, venta y valoración.

Para alcanzar este objetivo se seguirá la siguiente estrategia:

  • Limpieza y Preprocesamiento de la base de datos
  • Análisis Exploratorio de Datos (EDA)
  • Análisis de Componentes Principales (PCA)
  • Análisis de Conglomerados (Clustering)
  • Análisis de Correspondencia

1. Carga y Limpieza de Datos

Iniciamos cargando el dataset desde el paqueteMODELOS y aplicando técnicas de limpieza de datos para asegurar la calidad de la información: eliminación de registros vacíos, imputación de datos y tratamiento de datos faltantes. Para este caso particular partimos de un dataset de 8322 observaciones y 13 variables (id, zona, piso, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, tipo, barrio, longitud, latitud).

A continuación se presentan el resumen estadístico de la base de datos inicial:

# 1. Cargar datos
data("vivienda")
summary(vivienda) %>%
  kable(caption = "Tabla 1. Resumen Estadístico del Dataset Vivienda") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), 
                full_width = F, 
                position = "left")
Tabla 1. Resumen Estadístico del Dataset Vivienda
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Min. : 1 Length:8322 Length:8322 Min. :3.000 Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000 Length:8322 Length:8322 Min. :-76.59 Min. :3.333
1st Qu.:2080 Class :character Class :character 1st Qu.:4.000 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.381
Median :4160 Mode :character Mode :character Median :5.000 Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000 Median : 3.000 Mode :character Mode :character Median :-76.53 Median :3.416
Mean :4160 NA NA Mean :4.634 Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111 Mean : 3.605 NA NA Mean :-76.53 Mean :3.418
3rd Qu.:6240 NA NA 3rd Qu.:5.000 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 4.000 NA NA 3rd Qu.:-76.52 3rd Qu.:3.452
Max. :8319 NA NA Max. :6.000 Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000 Max. :10.000 NA NA Max. :-76.46 Max. :3.498
NA’s :3 NA NA NA’s :3 NA’s :2 NA’s :3 NA’s :1605 NA’s :3 NA’s :3 NA NA NA’s :3 NA’s :3

Dentro del análisis inicial se identifican algunas filas que contienen datos NA en casi todos los atributos. Estas filas son eliminadas. Así mismo, se identifican valoes NA en el atributo parqueaderos; sin embargo, estos son remplazados por 0 debido a que implica que el inmueble no tiene parqueadero. Por su parte, la variable Piso tiene una gran cantidad de registros nulos y su imputación sería introducir mucho sesgo al análisis. En este caso, se decide eliminar este atributo debido a que las características espaciales de los inmuebles están definidos por las variables estrato, areaconst, tipo, y otras. También se elimina la variable id debido a que no es aportante al análisis.

# 2. Limpieza Básica
# Eliminar filas con ID nulo
vivienda_clean <- subset(vivienda, !is.na(id))

# Imputar ceros en Parqueaderos (NA = 0)
vivienda_clean$parqueaderos[is.na(vivienda_clean$parqueaderos)] <- 0

# Eliminar columna 'piso' (exceso de nulos) e 'id'
vivienda_clean <- vivienda_clean[, !(names(vivienda_clean) %in% c("piso", "id"))]

# Normalizar factores
vivienda_clean$zona <- as.factor(vivienda_clean$zona)
vivienda_clean$tipo <- as.factor(vivienda_clean$tipo)
vivienda_clean$barrio <- as.factor(vivienda_clean$barrio)

Tras realizar esta limpieza inicial del dataset, se identifican 8319 registros. Con esto se da paso al tratamiento de datos atípicos, para lo cual se utiliza el criterio de rango intercuartílico (IQR), y de esta manera eliminar los valores que se encuentren por debajo de Q1 - 1.5 x IQR o por encima de Q3 + 1.5 x IQR.

# 3. Tratamiento de Atípicos (Método IQR)
detectar_limites <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  return(c(Q1 - 1.5 * IQR, Q3 + 1.5 * IQR))
}

lim_precio <- detectar_limites(vivienda_clean$preciom)
lim_area <- detectar_limites(vivienda_clean$areaconst)

# Filtrado final
vivienda_final <- subset(vivienda_clean,
                         preciom >= lim_precio[1] & preciom <= lim_precio[2] &
                         areaconst >= lim_area[1] & areaconst <= lim_area[2])

# Mostrar primeras filas
kable(head(vivienda_final), caption = "Tabla 2. Muestra de datos depurados") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tabla 2. Muestra de datos depurados
zona estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Zona Oriente 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
Zona Oriente 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
Zona Oriente 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
Zona Sur 4 400 280 3 5 3 Casa 3 de julio -76.54000 3.43500
Zona Norte 5 260 90 1 2 3 Apartamento acopi -76.51350 3.45891
Zona Norte 5 240 87 1 3 3 Apartamento acopi -76.51700 3.36971

Después de ejecutar este tratamiento a los datos atípicos, nuestra base de datos queda conformada por 7568 entradas.

2. Análisis Exploratorio de Datos (EDA)

Examinamos las variables críticas para el negocio: Precio, Área y Estrato.

2.1 Distribución del Precio

En la figura 1 es posible observar la distribución de precios de la vivienda para la ciudad estudiada. En este histograma es posible identificar que existe una cola hacia la derecha del gráfico, indicando que existen propiedades de alto costo que desvían el promedio del precio. Se observa también como hay un sesgo hacia la derecha, lo cual indica que la mayor cantidad de viviendas se concentran en el rango de 150 a 300 millones.

ggplot(vivienda_final, aes(x = preciom)) +
  geom_histogram(bins = 40, fill = "steelblue", color = "white") +
  theme_minimal() +
  labs(title = "Distribución de Precios de Vivienda", x = "Precio (Millones)", y = "Frecuencia")
Figura 1. Distribución de precio de viviendas

Figura 1. Distribución de precio de viviendas

2.2 Relación Precio vs. Área

En la figura 2 se analiza cómo afecta el área construida al precio de la propiedad. En este caso la línea de tendencia nos confirma que a mayor área, mayor es el precio de la vivienda. Este caso también nos muestra cómo en viviendas grandes, precio no sólo depende del tamaño sino de otros factores como ubicación, seguridad, exclusividad, entre otros, dada la dispersión de los puntos en estos valores de precio.

ggplot(vivienda_final, aes(x = areaconst, y = preciom)) +
  geom_point(alpha = 0.4, color = "darkgreen") +
  geom_smooth(method = "lm", color = "red") +
  theme_minimal() +
  labs(title = "Relación: Tamaño vs. Valor", x = "Área (m2)", y = "Precio")
Figura 2. Relación: Tamaño vs. Valor

Figura 2. Relación: Tamaño vs. Valor

2.3 Relación Precio vs. Zona

En la gráfica 3 vemos como se da la segmentación geográfica. La zona Oeste es la zona con los precios mas altos y la mayor variabilidad, llegando a superar los 1500 millones en varios casos. Por su parte la zona Oriente y Centro son las mas económicas, homogeneas y conprecios sostenidos en rangos mas estrechos accesibles. Finalmente la zona Norte y Sur presentan una variabilidad similar en precio. Es evidente como en todas las zonas se presentan valores excepcionalmente altos para su sector.

ggplot(vivienda_clean, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Distribución de Precios por Zona",
       x = "Zona",
       y = "Precio")
Figura 3. Distribución de Precios por Zona

Figura 3. Distribución de Precios por Zona

2.4 Matriz de Correlación

En la gráfica 4 podemos observar la matriz de correlación, la cual nos muestra la fuerza de las relaciones entre variables numéricas. En este gráfico se ve claramente cómo las variables que mas influyen en el precio son el área construida (0,67), el número de baños (0,67) y el estrato (0,65); todas con correlación positiva. De manera particular se observa como la correlación entre el número de habitaciones y el precio es baja (0,26), indicando que el mercado valora mas el área total y el estrato de la vivienda, que las habitaciones que esta tenga.

vars_num <- vivienda_final %>% select(preciom, areaconst, parqueaderos, banios, habitaciones, estrato)
corrplot(cor(vars_num), method = "color", type = "upper", addCoef.col = "black", tl.col="black", diag=FALSE)
Figura 4. Matriz de correlación

Figura 4. Matriz de correlación

Debido a que las variables areaconst, banios y preciom están tan correlacionadas, implica que para el análisis nos están entregando en cierta medida la misma información (tamaño/lujo). Para el siguiente paso, el Análisis de Componentes Principales será ideal reducir estas variables redundantes a un solo índice.

3. Análisis de Componentes Principales (PCA)

Reducimos la dimensionalidad para entender la estructura latente del mercado, a través de la reducción a dos componentes principales. Para este caso específico identificamos cómo los 2 primeros componentes explican el 78,1% de la información (la primera componente explica el 55,17% y la segunda componente explica el 22,93%). Esto significa que se ha simplificado el mercado de 6 variables complejas a solo 2 dimensiones clave sin perder casi nada de información.

# Selección de variables activas
datos_pca <- vivienda_final[, c("areaconst", "parqueaderos", "banios", "habitaciones", "estrato", "preciom")]

# Ejecución del PCA
res_pca <- prcomp(datos_pca, scale = TRUE)
summary(res_pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6
## Standard deviation     1.8194 1.1730 0.71651 0.62205 0.50672 0.39592
## Proportion of Variance 0.5517 0.2293 0.08556 0.06449 0.04279 0.02612
## Cumulative Proportion  0.5517 0.7810 0.86659 0.93108 0.97388 1.00000

La figura 5 nos muestra el análisis de componentes principales, el cual sigue a continuación:

# Visualización
fviz_pca_var(res_pca,
             col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE) +
  labs(title = "Mapa de Variables: Dimensiones del Mercado")
Figura 5. Análisis de componentes principales: mapa de variables

Figura 5. Análisis de componentes principales: mapa de variables

En la dimensión 1 (Eje Horizontal - 55,17%) tenemos la representación de “Magnitud y lujo”, donde todas las flechas apuntan hacia la derecha, implicando que si una propiedad está hacia este lado, tiene más de todo. Es decir, es más cara, más grande, tiene más baños, más parqueaderos y es de un estrato mas alto. De forma análoga, si una propiedad tiene las flechas hacia la izquierda, estará en la sección de viviendas econóicas. Por su parte, la dimensión 2 (Eje Vertical - 22.93%) representa el estilo de vida. En este caso tenemos flechas que apuntan tanto hacia arriba como hacia abajo. Aquellas que apuntan hacia arriba (habitaciones, areaconst) son aquellas viviendas donde se prioriza el espacio para habitar. Viviendas con muchos cuartos, posiblemente para familias grandes sin que correspondan al estrato mas alto. Aquellas que apuntan hacia abajo son propiedades que apunttan el estatus y la comodidad, donde se tiene espacio para varios vehículos pero que posiblemente no tienen tantas habitaciones, quizá apartamentos tipo lofts de lujo o apartamentos exclusivos.

4. Análisis de Conglomerados (Clustering)

Agrupamos las propiedades en 4 segmentos homogéneos para estrategias diferenciadas. Para esto utilizamos el algoritmo K-means, para agrupar las viviendas en segmentos homogéneos.

# Preparar datos
datos_scale <- scale(datos_pca)

# Determinar el número óptimo de clusters (Método del Codo)
# Buscamos el punto donde la curva se "dobla" drásticamente
fviz_nbclust(datos_scale, kmeans, method = "wss") +
  labs(title = "Método del Codo: Dónde se aplana la curva")
Figura 6. Método del codo

Figura 6. Método del codo

Primero revisaremos en la gráfica del método del codo en qué punto se observa el cambio mas drástico en la curva, el cual podemos identificar en el valor de K=4, lo cula implicaría realizar una segmentación en cuatro grupos (posiblemente 4 estrategias de marketing para la agencia inmobiliaria).

# Ejecutar K-Means (k=4 basado en análisis previo del codo)
set.seed(123)
km_res <- kmeans(datos_scale, centers = 4, nstart = 25)

# Visualizar Clusters
fviz_cluster(km_res, data = datos_pca,
             palette = "jco",
             ellipse.type = "convex",
             ggtheme = theme_minimal(),
             main = "Clusterización de Viviendas")
Figura 7. Segmentación del mercado inmobiliario

Figura 7. Segmentación del mercado inmobiliario

Basados en la segmentación realizada por el algoritmo de K-means, podemos identificar entonces cuatro grandes clusters, los cuales tienen las siguientes características: - Cluster 1 (azul con círculos): Corresponde al segmento familiar tradicional/Espacioso (arriba). Tienen valores altos en la dimensión 2 (hacia donde apunta la flecha habitaciones). Nos da a entender que son casas grandes, con muchos cuartos, pero posiblemente no tan costosas o exclusivas. Posiblemente sean casas grandes y tradicionales, antiguas y en estratos medios. Podrían ser la opción para familias numerosas que valoran el número de habitaciones sobre los acabados de lujo. - Cluster 2 (amarillo con triangulos): Corresponde al segmento de vivienda funcional/apartamentoe modernos (abajo/centro). Tienen menos habitaciones (flecha habitaciones apunta arriba), pero mantienen buen estrato y parqueaderos (flechas que apuntaban abajo). Posiblemente sean para jóvenes, personas solteras o estudiantes, que necesiten una buena ubicación y parqueadero, pero posiblemente no necesiten muchas habitaciones. - Cluster 3 (Gris con cuadrados): Corresponde al segmento de viviendas de lujo y gran formato (Derecha). Son las propiedades ubicadas más a la derecha (máximo valor en Dimensión 1). Tienen el mayor precio, mayor área construida, mayor estrato (5 y 6) y más parqueaderos.Posiblemente son para personas o familias de altos ingresos que busquen seguridad, exclusividad y espacio. - Cluster 4 (Rojo con cruces): Corresponde al segmento de viviendas de interés social/Económicas. Son las propiedades ubicadas al extremo izquierdo, relacionando menores áreas, menores precios y subsecuentemente menores estratos. Posiblemente sean para personas o familias que tengan presupuestos ajustados.

5. Análisis de Correspondencia

Para esta parte del ejercicio nos interesa saber dónde están estos inmuebles y qué tipo de inmuebles son. Para eso se cruzan los segmentos que identificamos en el apartado anterior con las variables categóricas originales (zona, tipo, barrio)

5.1 Relación Clusters vs. Zonas

En este gráfico podemos observar qué producto domina en cada zona, donde los cuadros azules indican una presencia fuerte mientras que los rojos indican que el conglomerado casi no se presenta ahí.

# Asignar cluster al dataset original
vivienda_final$cluster <- as.factor(km_res$cluster)

# Tabla de contingencia
tabla_zona <- table(vivienda_final$cluster, vivienda_final$zona)

# Gráfico de Mosaico
mosaicplot(tabla_zona, shade = TRUE, main = "Distribución de Clusters por Zona", las=1)
Figura 8. Clusters por Zona

Figura 8. Clusters por Zona

El cluster 3, que asocia las viviendas de lujo, tiene un bloque azul grande en la zona Oeste, implicando que en esta ciudad el lujo se encuentra en esta zona. El cluster 4 de vivienda económica es el cluster dominante en la zona sur y la zona norte, mientras que el cluster 1 de vivienda grande y de muchas habitaciones es que que domina en la zona centro y oriente.

5.2 Mapa de Correspondencia

res.ca <- CA(tabla_zona, graph = FALSE)
fviz_ca_biplot(res.ca, repel = TRUE, title = "Mapa de Correspondencia")
Figura 9. Mapa de correspondencia

Figura 9. Mapa de correspondencia

En el gráfico 9 vemos el mapa de correspondencias, donde es posible identificar claramente 3 regiones: El cluster 3 (viviendas de lujo) directamente relacionado con la zona oeste, el cluster 1 (viviendas tradicionales) relacionadas a la zona centro y zona oriente, mientras que la zona norte y zona sur correspondientes a los clusters 2 y 4 (viviendas funcionales y económicas, respectivamente)

6. Conclusiones y Recomendaciones

Basado en el análisis de datos realizado, donde se pudo ejecutar un análisis de componentes princpicales, un análisis de conglomerados y un análisis de correspondencia, se identifican 4 productos estratégicos para la compañía:

  1. Producto Premium (Cluster 3 - Zona Oeste): Apartamentos de lujo con altos precios y múltiples parqueaderos, donde se puede vender la exclusividad y la seguridad como banderas de las campañas de marketing

  2. Producto Tradicional (Cluster 1 - Centro/Oriente): Casas de gran área pero menor precio por m2, donde la premisa podría ser la Oportunidad de compra para remodelación.

  3. Producto Inversión (Cluster 4 - Sur/Norte): Apartamentos funcionales de rotación rápida, quizá para rentas cortas que ahora están de moda.

  4. Producto Ejecutivo (Cluster 2 - Norte/Oeste): Vivienda moderna balanceada y de interés social, compradas como inversión o para familias de presupuestos mas limitados.