Introducción

Este informe tiene como objetivo realizar un análisis integral y multidimensional del mercado inmobiliario urbano. Para ello, se aplicarán diversas técnicas de análisis de datos, incluyendo el Análisis de Componentes Principales (PCA), Análisis de Conglomerados, y Análisis de Correspondencia. Estos análisis permitirán identificar patrones, relaciones y segmentaciones clave en el mercado de viviendas, lo que facilitará la toma de decisiones estratégicas por parte de la empresa.

Carga y Preprocesamiento de Datos

Primero, cargamos los datos y realizamos el preprocesamiento necesario, que incluye la eliminación de las columnas longitud, latitud y barrio, y la conversión de la columna estrato a una variable categórica.

# Cargar los paquetes necesarios
library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.3
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(cluster)
library(ca)
## Warning: package 'ca' was built under R version 4.3.3
# Cargar el conjunto de datos
data("vivienda")

# Preprocesamiento de datos
vivienda_clean <- vivienda %>%
  # Eliminar las columnas 'longitud', 'latitud', y 'barrio'
  select(-longitud, -latitud, -barrio) %>%
  # Convertir 'estrato' en factor (categórica)
  mutate(estrato = as.factor(estrato),
         zona = as.factor(zona),
         tipo = as.factor(tipo)) %>%
  # Eliminar filas con valores faltantes en las columnas seleccionadas
  drop_na()

# Verificar la estructura del conjunto de datos limpio
str(vivienda_clean)
## tibble [4,808 × 10] (S3: tbl_df/tbl/data.frame)
##  $ id          : num [1:4808] 5992 1212 1724 2326 4386 ...
##  $ zona        : Factor w/ 5 levels "Zona Centro",..: 5 2 2 2 2 2 2 2 2 2 ...
##  $ piso        : chr [1:4808] "02" "01" "01" "01" ...
##  $ estrato     : Factor w/ 4 levels "3","4","5","6": 2 3 3 2 3 3 3 2 3 4 ...
##  $ preciom     : num [1:4808] 400 260 240 220 310 320 780 625 750 520 ...
##  $ areaconst   : num [1:4808] 280 90 87 52 137 150 380 355 237 98 ...
##  $ parqueaderos: num [1:4808] 3 1 1 2 2 2 2 3 2 2 ...
##  $ banios      : num [1:4808] 5 2 3 2 3 4 3 5 6 2 ...
##  $ habitaciones: num [1:4808] 3 3 3 3 4 6 3 5 6 2 ...
##  $ tipo        : Factor w/ 2 levels "Apartamento",..: 2 1 1 1 1 2 2 2 2 1 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>

Análisis de Componentes Principales (PCA)

El Análisis de Componentes Principales se utilizará para reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables numéricas en componentes principales. Esto ayudará a identificar las características clave que influyen en la variación de precios y la oferta en el mercado.

# Seleccionar las variables numéricas
vivienda_numerica <- vivienda_clean %>%
  select(preciom, areaconst, parqueaderos, banios, habitaciones) %>%
  scale()

# Ejecutar PCA
pca_result <- PCA(vivienda_numerica, graph = FALSE)

# Visualizar la varianza explicada por cada componente
fviz_eig(pca_result, addlabels = TRUE, ylim = c(0, 60))

# Biplot de las dos primeras componentes principales
fviz_pca_biplot(pca_result, repel = TRUE, col.var = "red", col.ind = "blue")

Análisis de Conglomerados

El Análisis de Conglomerados se utilizará para agrupar las propiedades residenciales en segmentos homogéneos con características similares, lo que permitirá entender las dinámicas de las ofertas específicas en diferentes zonas y estratos socioeconómicos.

# Ejecutar k-means clustering en las primeras dos componentes principales
set.seed(123)
cluster_result <- kmeans(vivienda_numerica, centers = 3, nstart = 25)

# Visualización de los clusters
fviz_cluster(cluster_result, data = vivienda_numerica,
             geom = "point", stand = FALSE,
             ellipse = TRUE, show.clust.cent = TRUE)

Análisis de Correspondencia

El Análisis de Correspondencia se aplicará para examinar la relación entre las variables categóricas zona, tipo y estrato, con el fin de identificar patrones de comportamiento en el mercado inmobiliario.

# Crear tabla de contingencia
tabla_contingencia <- table(vivienda_clean$zona, vivienda_clean$tipo, vivienda_clean$estrato)

# Colapsar la tabla a 2D combinando tipo y estrato
vivienda_clean$tipo_estrato <- interaction(vivienda_clean$tipo, vivienda_clean$estrato, sep = "_")
tabla_contingencia_2d <- table(vivienda_clean$zona, vivienda_clean$tipo_estrato)

# Ejecutar análisis de correspondencia
correspondencia_result <- tryCatch({
  CA(tabla_contingencia_2d, graph = FALSE)
}, error = function(e) {
  cat("Error en el análisis de correspondencia: ", e$message, "\n")
  return(NULL)
})

# Verificar si el análisis fue exitoso
if (!is.null(correspondencia_result)) {
  cat("Análisis de correspondencia completado exitosamente.\n")
  
  # Mostrar los eigenvalues obtenidos
  print("Eigenvalues:")
  print(correspondencia_result$eig)
  
  # Intentar generar el biplot si hay suficientes dimensiones
  if (length(correspondencia_result$eig) >= 2) {
    cat("Intentando generar el biplot...\n")
    tryCatch({
      fviz_ca_biplot(correspondencia_result, axes = c(1, 2), repel = TRUE)
    }, error = function(e) {
      cat("No se pudo generar el biplot: ", e$message, "\n")
    })
  } else {
    cat("El análisis de correspondencia no generó dimensiones suficientes para un biplot significativo.\n")
  }
} else {
  cat("El análisis de correspondencia no se pudo completar de manera satisfactoria.\n")
}
## Análisis de correspondencia completado exitosamente.
## [1] "Eigenvalues:"
##         eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.4129732796            57.03787200                          57.03787
## dim 2 0.2464167374            34.03388795                          91.07176
## dim 3 0.0639839175             8.83714922                          99.90891
## dim 4 0.0006595281             0.09109083                         100.00000
## Intentando generar el biplot...

Visualización de Resultados

En esta sección, se presentan gráficos adicionales que complementan los resultados obtenidos de los análisis anteriores, ayudando a visualizar los patrones y relaciones clave identificados.

1. Distribución de Tipos de Vivienda por Zona

# Gráfico de barras que muestra la distribución de tipos de vivienda por zona
library(ggplot2)

ggplot(vivienda_clean, aes(x = zona, fill = tipo)) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de Tipos de Vivienda por Zona",
       x = "Zona",
       y = "Número de Propiedades",
       fill = "Tipo de Vivienda") +
  theme_minimal()

2. Distribución de Precios por Zona

# Boxplot para visualizar la distribución de precios por zona
ggplot(vivienda_clean, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios de Vivienda por Zona",
       x = "Zona",
       y = "Precio de la Vivienda (millones)",
       fill = "Zona") +
  theme_minimal()

3. Relación entre Área Construida y Precio por Tipo de Vivienda

# Scatter plot para mostrar la relación entre área construida y precio, separado por tipo de vivienda
ggplot(vivienda_clean, aes(x = areaconst, y = preciom, color = tipo)) +
  geom_point(alpha = 0.6) +
  labs(title = "Relación entre Área Construida y Precio por Tipo de Vivienda",
       x = "Área Construida (m²)",
       y = "Precio de la Vivienda (millones)",
       color = "Tipo de Vivienda") +
  theme_minimal() +
  facet_wrap(~ zona)

Conclusiones y Recomendaciones

Este análisis ha permitido identificar varias características clave y patrones en el mercado inmobiliario urbano:

Recomendaciones

  • Segmentación del mercado: Implementar estrategias de marketing específicas para cada segmento identificado en el análisis de conglomerados.
  • Optimización de la oferta: Ajustar la oferta inmobiliaria según las características clave que influyen en los precios.
  • Toma de decisiones estratégicas: Usar los patrones identificados en el análisis de correspondencia para guiar las decisiones sobre la oferta en diferentes zonas y tipos de vivienda.

Referencias