Introducción

El mercado inmobiliario urbano presenta una alta complejidad debido a la diversidad de características físicas, económicas y espaciales que influyen en la oferta y valoración de las viviendas. En este contexto, el uso de modelos estadísticos multivariados permite analizar grandes volúmenes de información y extraer patrones relevantes que apoyen la toma de decisiones estratégicas.

El presente informe tiene como objetivo analizar la oferta inmobiliaria urbana a partir de una base de datos real, utilizando técnicas de análisis exploratorio de datos, análisis de componentes principales, análisis de conglomerados y análisis de correspondencia. Los resultados obtenidos buscan proporcionar información útil para la compra, venta y valoración de propiedades en un entorno urbano altamente competitivo.

Exploración inicial

Cantidad de atributos y registros del dataset

El dataset cuenta con 13 atributos y 8.322 registros.

dim(vivienda)
## [1] 8322   13

Estructura general de los datos

La base de datos contiene información de 8.322 viviendas, incluyendo variables numéricas como precio, área construida, número de habitaciones y baños, así como variables categóricas como zona, tipo de vivienda y barrio.

str(vivienda, give.attr = FALSE)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...

Análisis de valores faltantes

Se observa la presencia de valores faltantes principalmente en la variable piso y parqueaderos. Para los análisis multivariados se trabajará unicamente con las variables completas y relevantes.

data.frame(
  NAN = colSums(is.na(vivienda)),
  Percent = round(colSums(is.na(vivienda)) / nrow(vivienda) * 100, 2)
)
##               NAN Percent
## id              3    0.04
## zona            3    0.04
## piso         2638   31.70
## estrato         3    0.04
## preciom         2    0.02
## areaconst       3    0.04
## parqueaderos 1605   19.29
## banios          3    0.04
## habitaciones    3    0.04
## tipo            3    0.04
## barrio          3    0.04
## longitud        3    0.04
## latitud         3    0.04

Cantidad de datos duplicados en el dataset

sum(duplicated(vivienda))
## [1] 1

Resumen estadístico

El precio de las viviendas presenta una alta dispersión, lo cual sugiere heterogeneidad en la oferta inmobiliaria, posiblemente asociada a la ubicación, el estrato y las características físicas del inmueble.

summary(vivienda[, c("preciom","areaconst","parqueaderos","banios","habitaciones","estrato")])
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones       estrato     
##  Min.   : 0.000   Min.   :3.000  
##  1st Qu.: 3.000   1st Qu.:4.000  
##  Median : 3.000   Median :5.000  
##  Mean   : 3.605   Mean   :4.634  
##  3rd Qu.: 4.000   3rd Qu.:5.000  
##  Max.   :10.000   Max.   :6.000  
##  NA's   :3        NA's   :3

Análisis de correlación

Este análisis evidencia que el precio de la vivienda mantiene una relación positiva con el área construida, el número de parqueaderos, baños y habitaciones, lo que indica que mayores características físicas se asocian con valores más altos. Asimismo, el estrato socioeconómico influye de manera positiva en el precio, mientras que las variables geográficas muestran una relación débil o negativa, sugiriendo un efecto menos determinante en la valoración.

# Filtro de solo columnas numéricas
vivienda_num <- vivienda[, sapply(vivienda, is.numeric)]

matriz_cor <- cor(vivienda_num, use = "complete.obs")

#Graficar
corrplot(matriz_cor,
         method = "color",
         type = "full",
         col = colorRampPalette(c("blue", "white", "red"))(200),
         addCoef.col = "black",
         number.cex = 0.5,
         tl.col = "black",
         tl.srt = 45,
         diag = TRUE)

Boxplots de atributos numéricos

El análisis de los boxplots evidencia una alta dispersión y presencia de valores atípicos en las variables precio y área construida, lo que refleja la heterogeneidad del mercado inmobiliario urbano. En contraste, variables como número de parqueaderos, baños y habitaciones presentan distribuciones más concentradas, mientras que las variables geográficas muestran menor variabilidad. Estos resultados justifican la necesidad de aplicar técnicas de estandarización y análisis multivariado en etapas posteriores.

par(mar = c(8,4,4,2)) 

boxplot(vivienda_num,
        las = 2,
        main = "Boxplots de atributos numéricos",
        col = "blue",
        ylim = c(0, 2000))

# Preparación del dataset

Durante la etapa de preparación de los datos se realizaron transformaciones orientadas a mejorar la calidad y consistencia de la información. Se eliminó el identificador único, dado que no aporta valor analítico, y se transformó la variable estrato a formato categórico. Posteriormente, los valores nulos y atípicos inconsistentes fueron tratados mediante imputación con la mediana en variables numéricas y la moda en variables categóricas. Finalmente, se verificó la ausencia de valores faltantes y se eliminaron registros duplicados, garantizando un conjunto de datos limpio para los análisis posteriores.

#Eliminación del atributo id y transformación de la variable estrato
vivienda$id <- NULL

vivienda$estrato <- as.factor(vivienda$estrato)
#Imputación de valores nulos y atípicos con la mediana (reemplazamos los valores iguales a 0 en la variable habitaciones por el valor 3)
vivienda$habitaciones[vivienda$habitaciones == 0] <- 3

vivienda$banios[vivienda$banios == 0] <- 3  
# Identificar columnas categóricas y numéricas
categoricas <- c("piso", "zona", "tipo","barrio", "estrato")
numericas   <- sapply(vivienda, is.numeric)

# Función para calcular la moda
moda <- function(x) {
  ux <- unique(x[!is.na(x) & x != ""])
  ux[which.max(tabulate(match(x, ux)))]
}

# Reemplazar NA en columnas categóricas por la moda
vivienda[categoricas] <- lapply(vivienda[categoricas], function(x) {
  moda_valor <- moda(x)
  x[is.na(x) | x == ""] <- moda_valor
  return(x)
})

# Reemplazar NA en columnas numéricas por la mediana
vivienda[numericas] <- lapply(vivienda[numericas], function(x) {
  x[is.na(x)] <- median(x, na.rm = TRUE)
  return(x)
})


data.frame(
  NAN = colSums(is.na(vivienda))
)
##              NAN
## zona           0
## piso           0
## estrato        0
## preciom        0
## areaconst      0
## parqueaderos   0
## banios         0
## habitaciones   0
## tipo           0
## barrio         0
## longitud       0
## latitud        0
#Eliminación de valores duplicados
vivienda <- vivienda[!duplicated(vivienda), ]

Análisis

Análisis de Componentes Principales

El análisis de componentes principales permite identificar las variables que explican la mayor variabilidad del mercado inmobiliario. Los resultados muestran que el primer componente esta asociado principalmente al precio y al área construida, mientras que los componentes siguientes reflejan características estructurales de las viviendas.

vars_pca <- vivienda %>%
  select(preciom, areaconst, parqueaderos, banios, habitaciones)

vars_pca <- scale(vars_pca)

pca <- prcomp(vars_pca, center = TRUE, scale. = TRUE)

summary(pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5
## Standard deviation     1.7781 0.9335 0.66779 0.57615 0.43470
## Proportion of Variance 0.6323 0.1743 0.08919 0.06639 0.03779
## Cumulative Proportion  0.6323 0.8066 0.89582 0.96221 1.00000
fviz_eig(pca)

fviz_pca_biplot(pca, repel = TRUE)

Análisis de Conglomerados (Clustering)

Los clusters identificados permiten segmentar el mercado en viviendas de bajo, medio y alto valor, lo cual resulta útil para estrategias de inversión y comercialización diferenciadas.

set.seed(123)

datos_cluster <- vivienda %>%
  select(preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  scale()

# Metodo del codo
fviz_nbclust(datos_cluster, kmeans, method = "wss")

# K-means
km <- kmeans(datos_cluster, centers = 3, nstart = 25)

vivienda$cluster <- km$cluster
aggregate(vivienda[, c("preciom","areaconst","banios","habitaciones")],
          by = list(cluster = vivienda$cluster),
          mean)
##   cluster   preciom areaconst   banios habitaciones
## 1       1  257.0037  95.32271 2.235234     2.918913
## 2       2  530.8061 239.26463 4.118280     4.662684
## 3       3 1132.7508 429.82966 5.219978     4.600449

Análisis de Correspondencia

El análisis de correspondencia evidenció una asociación significativa entre la zona y el estrato socioeconómico, confirmando que la distribución de los estratos varía según la ubicación. Los primeros ejes factoriales concentran la mayor parte de la variabilidad, lo que permite identificar patrones claros de segmentación socioeconómica del mercado inmobiliario y aporta información relevante para la toma de decisiones estratégicas.

tabla <- table(vivienda$zona, vivienda$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
##               
##                Estrato3 Estrato4 Estrato5 Estrato6
##   Zona Centro       105       14        4        1
##   Zona Norte        567      406      763      172
##   Zona Oeste         54       83      289      769
##   Zona Oriente      339        8        2        1
##   Zona Sur          380     1594     1670     1040

La distribución de los estratos socioeconómicos varía de forma marcada entre las zonas, destacándose la Zona Sur y la Zona Norte por concentrar la mayor oferta en estratos altos, mientras que la Zona Centro y Oriente presentan una mayor presencia de estratos intermedios y bajos.

chisq.test(tabla)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 3802.6, df = 12, p-value < 2.2e-16

La prueba ji-cuadrado indica una asociación estadísticamente significativa entre la zona y el estrato socioeconómico (p-valor < 0.001), confirmando que ambas variables no son independientes.

resultados_ac <- CA(tabla)

El mapa factorail muestra asociaciones claras entre zonas y estratos socioeconómicos. La Zona Oeste se encuentra estrechamente relacionada con el estrato 6, lo que indica una mayor concentración de viviendas de alto nivel socioeconómico en esta zona. Por su parte, la Zona Sur se asocia principalmente con los estratos 4 y 5, reflejando una oferta predominante de estratos medio–altos. La Zona Norte presenta una relación más cercana con el estrato 5, mientras que la Zona Centro y la Zona Oriente se asocian con el estrato 3, evidenciando una mayor presencia de estratos intermedios en estas áreas. El primer eje explica la mayor parte de la variabilidad, lo que indica que estas asociaciones son relevantes para caracterizar la segmentación socioeconómica del mercado inmobiliario.

valores_prop <-resultados_ac$eig ; valores_prop
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32236431              70.032960                          70.03296
## dim 2 0.12732444              27.660964                          97.69392
## dim 3 0.01061495               2.306076                         100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")

Conclusiones

El análisis realizado permitió comprender que el mercado inmobiliario urbano es altamente heterogéneo y se encuentra fuertemente influenciado por las características físicas, socioeconómicas y espaciales de las viviendas. La distribución de la oferta varía significativamente entre zonas, lo que evidencia la existencia de segmentos claramente diferenciados dentro del mercado.

Los resultados muestran que el precio de la vivienda es explicado principalmente por variables como el área construida, el número de baños, habitaciones y parqueaderos, así como por el estrato socioeconómico, las cuales presentan asociaciones positivas con el valor del inmueble. Estas variables estructurales resultan determinantes en la valoración inmobiliaria.

La oferta inmobiliaria se segmenta en grupos bien definidos, asociados a diferentes niveles de precio y características del inmueble, así como a zonas específicas de la ciudad. Esta segmentación refleja la concentración de estratos altos en determinadas zonas y de estratos intermedios en otras, lo cual fue evidenciado mediante el análisis de conglomerados y el análisis de correspondencia.

Finalmente, los hallazgos obtenidos apoyan la toma de decisiones estratégicas al permitir identificar zonas y segmentos con mayor potencial de inversión, orientar estrategias de comercialización diferenciadas y ajustar la fijación de precios de acuerdo con el perfil socioeconómico y las características predominantes del mercado inmobiliario urbano.