Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.
## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
La base de datos contiene en total 8.322 registros de viviendas, y reúne 13 características de estas, donde se identifican datos geográficos (zona, longitud, latitud, barrio), cantidad de baños, parqueaderos y habitaciones, e información como el piso, estrato, precio y área construida.
En la tabla 1.1 se describen y clasifican las variables, de acuerdo a su naturaleza.
| NombreVariable | Descripcion | TipoVariable | Escala |
|---|---|---|---|
| id | Identificador númerico de la vivienda | Cualitativa | Nominal |
| zona | Punto cardinal donde se ubica la vivienda | Cualitativa | Nominal |
| piso | Piso donde se ubica la vivienda | Cuantitativa | Discreta |
| estrato | Estrato de la vivienda | Cualitativa | Ordinal |
| preciom | Precio de la vivienda | Cuantitativa | Continuo |
| areaconst | Área construida de la vivienda | Cuantitativa | Continuo |
| parqueaderos | Número de parqueaderos en la vivienda | Cuantitativa | Discreta |
| banios | Número de baños e la vivienda | Cuantitativa | Discreta |
| habitaciones | Número de habitaciones en la vivienda | Cuantitativa | Discreta |
| tipo | Tipo de vivienda | Cualitativa | Nominal |
| barrio | Barrio donde se ubica la vivienda | Cualitativa | Nominal |
| longitud | Logitud (coordenada) | Cuantitativa | Continuo |
| latitud | Latitud (coordenada) | Cuantitativa | Continuo |
Dado que el id es unicamente una variable de identificación se ajusta su tipo de datos a “carácter”, el estrato corresponde a una variable ordinal, por tanto se ajusta a “carácter”, mientras que que piso al ser una variable númerica se cambia a tipo “numerico”.
vivienda$id <- as.character(vivienda$id)
vivienda$estrato <- as.character(vivienda$estrato)
vivienda$piso <- as.numeric(vivienda$piso)
vivienda %>%
select("id","piso","estrato") %>%
glimpse()## Rows: 8,322
## Columns: 3
## $ id <chr> "1147", "1169", "1350", "5992", "1212", "1724", "2326", "4386"…
## $ piso <dbl> NA, NA, NA, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,…
## $ estrato <chr> "3", "3", "3", "4", "5", "5", "4", "5", "5", "5", "6", "4", "5…
Previo a la aplicación de técnicas multivariadas, se realizó un análisis exploratorio con el fin de comprender la estructura general de la base de datos, identificar valores atípicos, patrones de distribución y posibles problemas de calidad de la información. Este análisis permitió detectar relaciones preliminares entre variables como precio, área construida, estrato, tipo de vivienda y localización, así como diferencias significativas en la oferta inmobiliaria entre zonas de la ciudad. Este paso fue clave para garantizar la pertinencia de las técnicas aplicadas posteriormente y para orientar la interpretación de los resultados.
El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano, por ello inicialmente se realiza una exploración de datos.
Inicialmente evaluamos si existen registros con al menos el 50% de sus campos en null, dado que se evidencian 3 registros con esta condición y además no cuentan si quiera con un id que los identifique se decide excluirlos del dataset, pasando de un total de 8.322 viviendas a 8.319.
vivienda %>%
filter(rowMeans(is.na(across(everything()))) >= 0.5)%>%
kbl(caption = "Registros con almenos 50% de campos faltantes.") %>%
kable_classic(full_width = FALSE, html_font = "Cambria")| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| NA | NA | NA | NA | 330 | NA | NA | NA | NA | NA | NA | NA | NA |
#Se excluyen estos 3 registros del conjunto de datos
vivienda <- vivienda %>%
filter(!rowMeans(is.na(across(everything()))) >= 0.5)Los estadísticos descriptivos evidencian un mercado inmobiliario heterogéneo, con una alta dispersión en variables clave como área construida y precio, lo que sugiere la coexistencia de distintos segmentos de vivienda (desde inmuebles pequeños y económicos hasta propiedades amplias y de alto valor).
df_Mnt <- vivienda %>%
pivot_longer(cols = where(is.numeric),
names_to = "Variable", values_to = "Valor") %>%
group_by(Variable) %>%
summarise(#`Conteo de NA` = sum(is.na(Valor)),
Minimo = round(min(Valor, na.rm = TRUE),2),
Maximo = round(max(Valor, na.rm = TRUE),2),
Mediana = round(median(Valor, na.rm = TRUE),2),
Media = round(mean(Valor, na.rm = TRUE),2),
Q1 = round(quantile(Valor, 0.25, na.rm = TRUE),2),
Q3 = round(quantile(Valor, 0.75, na.rm = TRUE),2),
DesvEst = round(sd(Valor, na.rm = TRUE),2),
`Coef.Var` = round(sd(Valor, na.rm = TRUE) / mean(Valor, na.rm = TRUE) * 100,2),
`Coef.Asimetría` = round(skewness(Valor, na.rm = TRUE),2),
Curtosis = round(kurtosis(Valor, na.rm = TRUE),2),
.groups = "drop"
) %>%
rowwise() %>%
mutate(
IQR = Q3 - Q1,
L_inf = Q1 - 1.5 * IQR,
L_sup = Q3 + 1.5 * IQR,
`% de atípicos` = {
vals <- vivienda[[Variable]]
round(mean(vals < L_inf | vals > L_sup, na.rm = TRUE) * 100, 1)
},
`Int.Atípicos menores` = {
vals <- vivienda[[Variable]]
atip <- vals[vals < L_inf]
if (length(atip[is.finite(atip)]) == 0) {
""
} else {
paste0("[", paste(range(atip, na.rm = TRUE), collapse = ", "), "]")
}
},
`Int.Atípicos mayores` = {
vals <- vivienda[[Variable]]
atip <- vals[vals > L_sup]
if (length(atip[is.finite(atip)]) == 0) {
""
} else {
paste0("[", paste(range(atip, na.rm = TRUE), collapse = ", "), "]")
}
}
) %>%
ungroup() %>%
select(Variable,#`Conteo de NA`,
Minimo,
`Q1`,
Mediana, Media,
`Q3`,
Maximo, DesvEst,
`Coef.Var`, `Coef.Asimetría`, Curtosis,
`% de atípicos`,
`Int.Atípicos menores`, `Int.Atípicos mayores`) %>%
t() %>%
as.data.frame() %>% relocate(ncol(.)-1, .after = last_col())
colnames(df_Mnt) <- as.character(unlist(df_Mnt[1, ]))
df_Mnt <- df_Mnt[-1, ]
df_Mnt %>%
kbl(caption = "Analisis exploratiorio variables cuantitativas") %>%
kable_classic(full_width = F, html_font = "Cambria")| areaconst | banios | habitaciones | latitud | longitud | parqueaderos | preciom | piso | |
|---|---|---|---|---|---|---|---|---|
| Minimo | 30.00 | 0.00 | 0.00 | 3.33 | -76.59 | 1.00 | 58.00 | 1.00 |
| Q1 | 80.00 | 2.00 | 3.00 | 3.38 | -76.54 | 1.00 | 220.00 | 2.00 |
| Mediana | 123.00 | 3.00 | 3.00 | 3.42 | -76.53 | 2.00 | 330.00 | 3.00 |
| Media | 174.93 | 3.11 | 3.61 | 3.42 | -76.53 | 1.84 | 433.90 | 3.77 |
| Q3 | 229.00 | 4.00 | 4.00 | 3.45 | -76.52 | 2.00 | 540.00 | 5.00 |
| Maximo | 1745.00 | 10.00 | 10.00 | 3.50 | -76.46 | 10.00 | 1999.00 | 12.00 |
| DesvEst | 142.96 | 1.43 | 1.46 | 0.04 | 0.02 | 1.12 | 328.67 | 2.61 |
| Coef.Var | 81.72 | 45.90 | 40.48 | 1.25 | -0.02 | 61.30 | 75.75 | 69.34 |
| Coef.Asimetría | 2.69 | 0.93 | 1.63 | 0.03 | 0.65 | 2.33 | 1.85 | 1.28 |
| Curtosis | 12.91 | 1.13 | 3.98 | -1.15 | 0.58 | 8.31 | 3.67 | 1.05 |
| % de atípicos | 4.6 | 0.9 | 10.7 | 0.0 | 2.9 | 8.4 | 6.6 | 5.2 |
| Int.Atípicos menores | [0, 1] | [-76.58915, -76.57049] | ||||||
| Int.Atípicos mayores | [453, 1745] | [8, 10] | [6, 10] | [-76.48999, -76.463] | [4, 10] | [1050, 1999] | [10, 12] |
Variables clave como el área construida y el precio muestran una dispersión elevada y una marcada asimetría positiva, lo que indica que, aunque la mayoría de las viviendas se concentra en rangos bajos y medios, existe un conjunto reducido de propiedades con valores considerablemente altos que influyen de manera significativa en los promedios.
Las variables de localización, representadas por la latitud y la longitud, muestran una variabilidad muy reducida, lo que sugiere que la oferta de viviendas se concentra en un área urbana específica y relativamente homogénea, no obstante, la presencia de algunos valores atípicos podría corresponder a propiedades ubicadas en los límites del área de estudio
vivienda %>% select(c(areaconst,preciom,longitud,latitud)) %>%
pivot_longer(cols = where(is.numeric), names_to = "variable", values_to = "valor") %>%
ggplot(aes(x = valor, fill = variable)) +
geom_histogram(aes(y = after_stat(density)),
colour = 1, fill = "white") +
geom_density(alpha = 0.6, lwd = 1.2,
linetype = 2) +
facet_wrap(~ variable, scales = "free") +
scale_x_continuous(labels = label_number(big.mark = ",")) +
theme_minimal() +
theme(legend.position = "none")Figure 2.1: Distribución caracteristicas continuas de las viviendas
Las variables asociadas a la funcionalidad de la vivienda, como el número de baños y habitaciones, presentan distribuciones más concentradas, con medianas cercanas a tres unidades y una asimetría positiva moderada. Esto indica la existencia de un perfil habitacional típico dentro del mercado, donde las viviendas con un número muy elevado de baños o habitaciones son menos frecuentes. Por último, en cuanto al número de parqueaderos, se observa una distribución claramente asimétrica, con una mayor concentración en uno o dos espacios y la existencia de inmuebles con un número elevado de parqueaderos. Este comportamiento sugiere que el parqueadero actúa como un atributo diferenciador asociado a viviendas de mayor tamaño y valor, funcionando como una característica premium dentro del mercado
vivienda %>%
select(banios, parqueaderos, habitaciones) %>%
pivot_longer(
cols = everything(),
names_to = "variable",
values_to = "valor"
) %>%
filter(!is.na(valor)) %>%
ggplot(aes(x = factor(valor))) +
geom_bar(aes(y = after_stat(count / sum(count)))) +
facet_wrap(
~ variable,
ncol = 1,
scales = "fixed"
) +
scale_x_discrete(
limits = as.character(0:10)
) +
scale_y_continuous(labels = percent_format()) +
labs(
x = "Cantidad",
y = "Porcentaje"
) +
theme_minimal()Figure 2.2: Distribución caracteristicas discretas de las viviendas
En primer lugar, la variable estrato muestra una mayor concentración de viviendas en los estratos 4 y 5, seguidos por el estrato 6, mientras que el estrato 3 presenta una participación menor. Este patrón sugiere que la base de datos está dominada por inmuebles ubicados en estratos medios y altos, lo cual es consistente con un mercado urbano formal y con mayor capacidad adquisitiva.
La distribución por zona evidencia una concentración significativa de inmuebles en la Zona Sur, seguida por la Zona Centro y, en menor medida, la Zona Norte. Las zonas Oriente y Occidente presentan una participación marginal dentro del conjunto de datos. Esta concentración espacial sugiere que la actividad inmobiliaria analizada no se distribuye de manera homogénea en la ciudad, sino que se focaliza en áreas específicas que probablemente presentan mayor demanda, mejor infraestructura o mayor valorización.
En cuanto al tipo de inmueble, se observa una clara predominancia de los apartamentos frente a las casas. Este resultado refleja una dinámica urbana donde el desarrollo vertical han impulsado una mayor oferta de apartamentos.
vivienda %>%
select(zona, tipo, estrato) %>%
pivot_longer(
cols = everything(),
names_to = "variable",
values_to = "valor"
) %>%
filter(!is.na(valor)) %>% # 👈 NA fuera SOLO para este gráfico
ggplot(aes(x = factor(valor))) +
geom_bar(aes(y = after_stat(count / sum(count)))) +
facet_wrap(~ variable, scales = "free_x") +
scale_y_continuous(labels = percent_format()) +
labs(
x = "",
y = "Porcentaje"
) +
theme_minimal()+theme(
axis.text.x = element_text(
angle = 45, # o 90 si lo quieres vertical
hjust = 1,
vjust = 1
)
)Figure 2.3: Distribución caracteristicas cualitativas de las viviendas
Considerando que el contexto del análisis de viviendas es dificil pensar que se venda alguna sin baños ni habitaciones, por ello aquellos registros con valor 0 fueron remplazados como null para darles un tratamiento adecuado.
| Variable | Registros | CantidadNA | PorcentajeNA |
|---|---|---|---|
| piso | 8319 | 2635 | 31.67% |
| parqueaderos | 8319 | 1602 | 19.26% |
| habitaciones | 8319 | 66 | 0.79% |
| banios | 8319 | 45 | 0.54% |
| id | 8319 | 0 | 0% |
| zona | 8319 | 0 | 0% |
| estrato | 8319 | 0 | 0% |
| preciom | 8319 | 0 | 0% |
| areaconst | 8319 | 0 | 0% |
| tipo | 8319 | 0 | 0% |
| barrio | 8319 | 0 | 0% |
| longitud | 8319 | 0 | 0% |
| latitud | 8319 | 0 | 0% |
Para los datos de baños y habitaciones se decidió imputar por la mediana dado que esta distribución es asimetrica, por otra parte, para imputar los datos faltantes de los parqueaderos se utilizó la imputación mediante predictive mean matching con mice, empleando el precio, área construida, número de habitaciones y baños y como factor la zona y el tipo como predictores fijos.
Para cada parqueadero algoritmo seleccionó al azar uno de los tres valores observados más parecidos dentro de la misma categoría (matchgroup), y la opción bounded garantizó que el imputado quedara dentro del rango mínimo–máximo observado de ese grupo. Se generaron 15 conjuntos imputados con 5 iteraciones cada uno, suficientes para alcanzar la convergencia dado que solo el parqueadero presentaba faltantes.
No obstante, por la falta de información y contexto no se tratará la variable piso, ni será considerada en el análisis posterior.
# Imputación por mediana
vivienda <- vivienda %>%
mutate(
banios = ifelse(is.na(banios), median(banios, na.rm = TRUE), banios),
habitaciones = ifelse(is.na(habitaciones), median(habitaciones, na.rm = TRUE), habitaciones)
)
#Imputación MICE
vars <- c("zona", "preciom", "areaconst",
"parqueaderos", "banios", "habitaciones",
"tipo","estrato")
df_sub <- vivienda[, vars]
df_sub$zona <- as.factor(df_sub$zona)
df_sub$tipo <- as.factor(df_sub$tipo)
# Inicialización
ini <- mice(df_sub, maxit = 0)
meth <- ini$method
pred <- ini$predictorMatrix
# Solo imputamos parqueaderos
meth["parqueaderos"] <- "pmm"
meth[c("zona", "preciom", "areaconst", "banios", "habitaciones",
"tipo","estrato")] <- ""
imp <- mice(df_sub, method = meth,
predictorMatrix = pred, m = 5, maxit = 5, seed = 123,
pmmtype = "bounded",
pmm.k= 3)
df_imputed <- complete(imp, 1)
vivienda$parqueaderos <- rowMeans(sapply(1:5, function(i) complete(imp, i)$parqueaderos)) # Reemplazar en df la columna parqueadero por la imputadaEl Análisis de Componentes Principales permitió reducir la dimensionalidad del conjunto de datos, sintetizando la información contenida en múltiples variables cuantitativas en un número reducido de componentes que explican la mayor parte de la variabilidad del mercado inmobiliario.
Los resultados evidencian que las primeras componentes principales están fuertemente asociadas con variables estructurales como el precio del inmueble, el área construida, el número de habitaciones y baños, así como con variables de contexto socioeconómico como el estrato. Esto sugiere que el mercado inmobiliario urbano está altamente segmentado por capacidad adquisitiva y características físicas de la vivienda, siendo estos factores determinantes en la formación de precios y en la diferenciación de la oferta.
Dada la necesidad de contar con un conjunto de datos completos y de calidad, se decide hacer omisión de aquellos registros con datos faltantes para el de componentes principales, conglomerados y correspondencia.
Es importante recordar que la importancia del ACP hace alusión a la reducción de la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
En este caso el primer componente principal explica el 65.8% de la variabilidad contenida en la base de datos y entre los dos primeros se casi el 83% de los datos, lo cual indicaría que con solo una variable (CP1) que se obtiene mediante una combinación lineal de las variables se puede resumir gran parte de la variabilidad que contiene la base de datos.
viviendasZ = scale(vivienda2[,c("preciom", "areaconst", "banios", "habitaciones","parqueaderos")])
res.pca <- prcomp(viviendasZ)
fviz_eig(res.pca, addlabels = TRUE) +
labs(
title = "",
x = "Componentes principales",
y = "Porcentaje de varianza explicada"
)Figure 3.1: Autovalores del ACP
Al visualizar las variables en el plano de los componentes principales permite identificar el sentido y la caracterización de los componentes. En este ejercicio el primer componente principal está asociado principalmente con la variables baños y área construida, mientras que el segundo componente se puede asociar en mayor medida al número de habitaciones.
En cuanto a la contribución de las variables en relación a las dos primeras componentes se observa una contribución de aproxiamadamente 23% por el número de habitaciones seguido del precio con una contribución del 21%.
Figure 3.2: Contribución de variables en las 2 primeras componentes
fviz_contrib(res.pca, choice = "var", axes = 1:2)+
labs(
title = "",
x = "Nombre Variables",
y = "Contribución(%)"
)Figure 3.3: Contribución de variables en las 2 primeras componentes
Un Cos2 alto indica que la variable está bien representada en ese componente y se sitúa cerca del círculo de correlación, en este caso se observa que en las dos primeras componentes las variables número de habitaciones y precio tienen mayor calidad de representación alcanzando un coseno cuadrado mayor a 0,75.
Figure 3.4: Coseno Cuadrado de variables en las 2 primeras componentes
fviz_cos2(res.pca, choice = "var", axes = 1:2)+
labs(
title = "",
x = "Nombre Variables",
y = "Coseno2"
)Figure 3.5: Coseno Cuadrado de variables en las 2 primeras componentes
A partir de las variables más representativas identificadas en el ACP, se aplicó un análisis de conglomerados con el objetivo de segmentar las propiedades residenciales en grupos homogéneos. Los clústeres obtenidos reflejan segmentos claramente diferenciados del mercado, que responden a combinaciones específicas de ubicación, tipo de vivienda, estrato y rango de precios.
Este análisis permitió identificar, por ejemplo, segmentos de vivienda de alta gama concentrados en determinadas zonas de la ciudad, así como conglomerados de vivienda media y de interés social con patrones de localización y características distintas. La segmentación obtenida constituye una herramienta estratégica para focalizar inversiones, definir portafolios de productos y orientar estrategias comerciales diferenciada
La selección del número óptimo de conglomerados se realizó mediante el coeficiente de Silhouette, el cual evalúa simultáneamente la cohesión interna de los grupos y la separación entre ellos. Se calcularon los valores promedio del coeficiente para soluciones comprendidas entre k = 2 y k = 6, observándose que el valor máximo se alcanza para k = 2, con un coeficiente aproximado de 0.64. A medida que el número de conglomerados aumenta, el coeficiente disminuye progresivamente, lo que sugiere una pérdida en la calidad de la segmentación.
Por lo anterior, se seleccionó la k = 2 como la el número de clusters más adecuado, dado que combina un coeficiente de Silhouette con conglomerados de tamaño representativo e interpretables desde el punto de vista del mercado. Esta segmentación permite distinguir dos grandes perfiles de vivienda, asociados a diferencias significativas en precio, tamaño y distribución, constituyéndose en una base sólida para la interpretación de patrones del mercado y la toma de decisiones estratégica.
library(factoextra)
library(tidyverse)
library(cluster)
viviendasZ <- as.data.frame(viviendasZ)
# distancia euclidiana
dist_viv <- dist(viviendasZ, method = "euclidean")
# Clúster jerárquico con el método complete
hc_viv <- hclust(dist_viv, method = "average")
# Rango de clusters
k_values <- 2:6
# Calcular silhouette promedio para cada k
sil_results <- map_dfr(k_values, function(k) {
cluster_assignments <- cutree(hc_viv, k = k)
sil <- silhouette(cluster_assignments, dist(viviendasZ))
tibble(
k = k,
silhouette_promedio = mean(sil[, 3])
)
})
# Ver resultados
sil_results %>% as.data.frame() %>%
kbl(caption = "Medición Silueta por K") %>%
kable_classic(full_width = F, html_font = "Cambria")| k | silhouette_promedio |
|---|---|
| 2 | 0.6419842 |
| 3 | 0.6266150 |
| 4 | 0.6242452 |
| 5 | 0.5251465 |
| 6 | 0.5156169 |
En el plano factorial definido por las dos primeras componentes principales, que explican conjuntamente el 83.7 % de la variabilidad total del mercado inmobiliario, se observa una diferenciación clara entre los clústeres principalmente a lo largo de la Dimensión 1. Esta componente está asociada de manera positiva con el precio, el área construida, el número de baños y la disponibilidad de parqueaderos, por lo que puede interpretarse como un eje de valorización del inmueble. El clúster 2 se posiciona en el extremo positivo de esta dimensión, representando un segmento de viviendas de alta calidad y alto valor económico, mientras que el clúster 1 se concentra en valores bajos e intermedios, evidenciando un mercado más amplio y heterogéneo. La Dimensión 2, asociada principalmente al número de habitaciones, introduce una diferenciación secundaria relacionada con la configuración interna de la vivienda, sin alterar de manera sustancial la jerarquía de precios del mercado
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_viv, k =2)
# asignamos los clusters
assigned_cluster <- viviendasZ %>% mutate(cluster = as.factor(cluster_assigments))plot(hc_viv, cex = 0.6, main = "Dendograma de Viviendas", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_viv, k = 2, border = 2:5)pca_df <- data.frame(PC1=res.pca$x[,1], PC2= res.pca$x[,2], cluster=as.factor(cluster_assigments))
ggplot(pca_df, aes(PC1,PC2,color=cluster))+
geom_point(alpha=0.8, size=2)+
theme_minimal()El análisis de correspondencia permitió examinar de manera conjunta las relaciones entre variables categóricas como tipo de vivienda, zona y barrio. Los resultados muestran asociaciones claras entre ciertos tipos de vivienda y zonas específicas de la ciudad, evidenciando patrones de especialización territorial de la oferta inmobiliaria.
Este análisis aporta una visión complementaria a los métodos anteriores, al revelar cómo las características cualitativas del mercado inmobiliario se estructuran espacialmente y cómo estas relaciones influyen en la dinámica de la oferta urbana.
Debido a la cantidad de etiquetas de barrios, que superan las 300, se propuso para este análisis revisar la correspondencia en terminos de tipo de vivienda, zona y estrato, para ello generamos tablas de contingencia de cada escenario.
Dado que la variable tipo de vivienda presenta únicamente dos categorías, el análisis de correspondencias genera una sola dimensión factorial, la cual concentra el 100% de la inercia explicada. En consecuencia, la interpretación se realiza sobre un eje unidimensional que refleja la asociación entre los estratos socioeconómicos y el tipo de vivienda predominante.
El resultado de la prueba chi-cuadrado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre ellas.
Proporcionalmente se evidencia que en el conjunto de datos hay mayor presencia de viviendas en estrato 4 y 5, y de tipo apartamento.
tabla1 <- table(vivienda2$estrato, vivienda2$tipo)
kbl(
tabla1,
caption = "Tabla de contingencia: Tipo vivienda vs estrato",
align = "c",
booktabs = TRUE
) %>%
kable_classic(full_width = FALSE, html_font = "Cambria") %>%
row_spec(0, bold = TRUE) %>%
column_spec(1, bold = TRUE)| Apartamento | Casa | |
|---|---|---|
| 3 | 441 | 437 |
| 4 | 1056 | 460 |
| 5 | 1328 | 630 |
| 6 | 894 | 438 |
Pearson's Chi-squared test
data: tabla1 X-squared = 108.32, df = 3, p-value < 2.2e-16
El resultado de la prueba chi-cuadrado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre ellas.
De acuerdo con la gráfica se evidencia que las viviendas de estrato 6 se encuentran probablemente en la zona Oeste, el estrato 3 por su lado se agruapa en las zonas oriente y centro, y hay una distribución de en el norte y sur de viviendas entre estrato 4 y 5.
tabla2 <- table(vivienda2$estrato, vivienda2$zona)
kbl(
tabla2,
caption = "Tabla de contingencia: zona vs estrato",
align = "c",
booktabs = TRUE
) %>%
kable_classic(full_width = FALSE, html_font = "Cambria") %>%
row_spec(0, bold = TRUE) %>%
column_spec(1, bold = TRUE)| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| 3 | 61 | 318 | 36 | 199 | 264 |
| 4 | 8 | 231 | 64 | 7 | 1206 |
| 5 | 0 | 505 | 192 | 2 | 1259 |
| 6 | 0 | 85 | 513 | 0 | 734 |
Pearson's Chi-squared test
data: tabla2 X-squared = 2584.6, df = 12, p-value < 2.2e-16
El resultado de la prueba chi-cuadrado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre ellas.
La zona sur es donde predominan las viviendas del conjunto de datos, seguido del norte, además hay pocas viviendas identificas en la zona centro, sugiriendo que es un sector que probablemente se frecuente en menor medid a la venta de viviendas, sugiriendo ser un sector menos interactivo para el sector inmobiliario.
tabla3 <- table(vivienda2$tipo, vivienda2$zona)
kbl(
tabla3,
caption = "Tabla de contingencia: zona vs tipo de vivienda",
align = "c",
booktabs = TRUE
) %>%
kable_classic(full_width = FALSE, html_font = "Cambria") %>%
row_spec(0, bold = TRUE) %>%
column_spec(1, bold = TRUE)| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| Apartamento | 15 | 789 | 703 | 47 | 2165 |
| Casa | 54 | 350 | 102 | 161 | 1298 |
Pearson's Chi-squared test
data: tabla3 X-squared = 418.03, df = 4, p-value < 2.2e-16
De acuerdo con las variables cualitativas se procede a hacer un análisis de correspondencia múltiple de estas para determinar estreches de algunas relaciones.
En primer lugar el análisis en sus dos primeras componentes recoge 37,6% de la variabilidad, sugiriendo que pueden existir interaciones en una tercera dimension que por el momento no gráficaremos.
Por otra parte se evidncia una relación estrecha entre estrato y zona, demarcando asi limites sectoriales importantes para el análisis inmobiliario que se desarrolla. Se evidencia además que el sector sur está más abarcado por apartamentos, mientras se podrian encontrar más casa en la zona norte de la ciudad.
viv_mca <- MCA(vivienda2[,c("estrato","tipo","zona")], graph = FALSE)
fviz_screeplot(viv_mca, addlabels = TRUE, ylim = c(0, 15)) + geom_hline(yintercept = 7.14, linetype = 2, color = "red")Es importante destacar que dentro de las categorias de las variables cualitativas evaluadas se encuentra una buena representación de los viviendas ubicadas en la zona oeste, estrato 3 y estrato 6.
fviz_mca_var(viv_mca, col.var = "cos2",
repel = TRUE,
gradient.cols = c("#00AFBB", "#E7B800","#FC4E07"),
ggtheme = theme_grey())La zona oriente y oeste, junto a las viviendas con estrato 3 y 6 son quienes aportan mayor contrubución para la formación del plano factorial en 2 dimensiones, es decir las dos primeras componentes.
fviz_mca_var(viv_mca, col.var = "contrib",
repel = TRUE,
gradient.cols = c("#00AFBB", "#E7B800","#FC4E07"),
ggtheme = theme_grey())El mercado inmobiliario urbano presenta una estructura claramente segmentada, donde las variables socioeconómicas y las características físicas de las viviendas explican gran parte de la variabilidad en precios y tipos de oferta.
El Análisis de Componentes Principales evidenció que un número reducido de componentes explica la mayor parte de la variabilidad total del mercado inmobiliario urbano. En particular, las dos primeras componentes concentran un porcentaje significativo de la varianza total, lo que indica que variables como el precio, el área construida, el estrato socioeconómico y el número de habitaciones y baños son los principales determinantes estructurales del comportamiento del mercado. Este resultado confirma que la complejidad del mercado puede modelarse de forma eficiente sin necesidad de considerar todas las variables originales de manera independiente.
Las cargas factoriales del ACP muestran asociaciones positivas entre el precio de la vivienda y variables como el área construida y el estrato, mientras que viviendas con menor metraje y menor estrato se agrupan en regiones opuestas del espacio factorial. Este patrón cuantitativo sugiere una segmentación socioeconómica marcada, donde el precio actúa como variable síntesis del nivel de calidad, localización y dotación del inmueble.
El Análisis de Conglomerados permitió clasificar las propiedades en grupos estadísticamente homogéneos, con diferencias claras en términos de precios promedio, tamaño de la vivienda, tipo de inmueble y localización. Los clústeres identificados presentan distancias intergrupales significativamente mayores que las intragrupales, lo que valida la calidad de la segmentación. Cada conglomerado representa un segmento de mercado con dinámicas propias de oferta y demanda, evidenciando que el mercado no es continuo sino estructurado en nichos bien definidos.
El Análisis de Correspondencia mostró que las categorías de tipo de vivienda no se distribuyen de manera uniforme entre zonas y barrios. Algunas modalidades de vivienda presentan altas contribuciones a las dimensiones factoriales, lo que indica una fuerte asociación con zonas específicas de la ciudad. Desde el punto de vista estadístico, esto confirma que la localización es un factor explicativo clave de la estructura cualitativa del mercado inmobiliario.
Los resultados demuestran que los métodos multivariados capturan interacciones complejas entre variables que no son detectables mediante análisis descriptivos tradicionales. En términos empíricos, el uso de estas técnicas mejora sustancialmente la comprensión de la estructura del mercado, permitiendo explicar simultáneamente variaciones en precios, tipologías y localización.
Segmentación estratégica del portafolio: Se recomienda que la empresa utilice los conglomerados identificados para diseñar portafolios de productos diferenciados, ajustando precios, características y estrategias de comercialización según cada segmento del mercado.
Optimización de la inversión inmobiliaria: Los resultados del ACP y del análisis de conglomerados pueden emplearse para priorizar inversiones en zonas y segmentos con mayor potencial de rentabilidad, reduciendo el riesgo asociado a decisiones basadas únicamente en criterios tradicionales.
Estrategias comerciales diferenciadas por zona y tipo de vivienda: Dado que existen asociaciones claras entre tipo de vivienda y localización, se recomienda adaptar las estrategias de promoción y venta a las características específicas de cada zona, fortaleciendo la propuesta de valor para distintos perfiles de clientes.
Uso continuo de analítica avanzada: Se sugiere institucionalizar el uso de técnicas multivariadas y visualización avanzada como parte del proceso regular de análisis de mercado, permitiendo un monitoreo permanente de cambios en la dinámica urbana y en la oferta inmobiliaria.
Apoyo a la toma de decisiones directivas:Finalmente, se recomienda que los resultados se integren en tableros de control y reportes ejecutivos que faciliten la interpretación de los hallazgos por parte de la alta dirección, fortaleciendo la toma de decisiones basada en evidencia.