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.
# Especificar un mirror de CRAN
options(repos = c(CRAN = "https://cloud.r-project.org"))
# Instalar librerías si no están instaladas
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(dplyr)) install.packages("dplyr")
if (!require(factoextra)) install.packages("factoextra")
if (!require(FactoMineR)) install.packages("FactoMineR")
if (!require(ggcorrplot)) install.packages("ggcorrplot")
if (!require(ca)) install.packages("ca")
# Cargar librerías
library(ggplot2)
library(dplyr)
library(factoextra)
library(FactoMineR)
library(ggcorrplot)
library(paqueteMODELOS)
library(cluster)
library(ca)
# Cargar datos
data(vivienda)
str(vivienda)
## 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 ...
## - 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>
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. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
Reducir 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.
# Seleccionar variables numéricas
vivienda_num <- vivienda %>% select(preciom, areaconst, parqueaderos, banios, habitaciones)
# Estandarizar datos
vivienda_scaled <- scale(vivienda_num)
# Realizar PCA
pca_result <- PCA(vivienda_scaled, graph = FALSE)
## Warning in PCA(vivienda_scaled, graph = FALSE): Missing values are imputed by
## the mean of the variable: you should use the imputePCA function of the missMDA
## package
# Visualizar la varianza explicada por los componentes principales
fviz_screeplot(pca_result, addlabels = TRUE, ylim = c(0, 50))
# Visualizar variables en el plano de los dos primeros componentes principales
fviz_pca_var(pca_result, col.var = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)
Interpretación del Scree Plot * Eje X (Dimensiones): Representa los componentes principales. * Eje Y (Porcentaje de varianza explicada): Muestra el porcentaje de varianza que cada componente explica en los datos originales.
Observaciones del Scree Plot: * PC1 (Primer componente principal): Explica aproximadamente el 62.9% de la varianza total en los datos. * PC2 (Segundo componente principal): Explica alrededor del 17.7% de la varianza total. * PC3 (Tercer componente principal): Explica el 8.6% de la varianza total. Los componentes posteriores explican progresivamente menos varianza, con PC4 y PC5 explicando 6.9% y 3.9%, respectivamente.
Interpretación: * PC1 y PC2: Juntos, estos dos componentes explican aproximadamente el 80.6% de la varianza en los datos (62.9% + 17.7%). Esto sugiere que la mayor parte de la información en los datos originales puede ser capturada por solo dos componentes principales. * PC3 y posteriores: Los componentes adicionales explican mucho menos varianza individualmente, indicando que su contribución adicional a la interpretación de los datos es limitada.
Interpretación del Biplot de Variables (PCA) El biplot muestra cómo las variables originales se proyectan en el espacio de los primeros dos componentes principales (PC1 y PC2). A continuación se presenta la interpretación del gráfico:
Ejes del biplot:
Vectores de las variables:
Interpretación de las relaciones entre variables:
Relaciones y conclusiones adicionales:
Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.
# Seleccionar variables numéricas
vivienda_num <- vivienda %>% select(preciom, areaconst, parqueaderos, banios, habitaciones)
# Estandarizar datos
vivienda_scaled <- scale(vivienda_num)
# Verificar y eliminar filas con NA/NaN/Inf en los datos escalados
vivienda_scaled <- vivienda_scaled[complete.cases(vivienda_scaled), ]
# Determinar el número óptimo de clusters con el método del codo
fviz_nbclust(vivienda_scaled, kmeans, method = "wss")
# Aplicar K-means con el número óptimo de clusters
set.seed(123)
kmeans_result <- kmeans(vivienda_scaled, centers = 3, nstart = 25)
# Añadir los clusters a los datos originales
# Asegurarse de que las filas eliminadas en vivienda_scaled también se eliminen en vivienda original
vivienda <- vivienda[complete.cases(vivienda_num), ]
vivienda$cluster <- as.factor(kmeans_result$cluster)
# Visualizar los clusters
fviz_cluster(kmeans_result, data = vivienda_scaled, ellipse.type = "convex", geom = "point", stand = FALSE)
Interpretación del Método del Codo (Scree Plot para K-means)
El scree plot muestra la suma total de los cuadrados dentro del grupo (total within-cluster sum of squares) en función del número de clusters (k).
Puntos clave del scree plot:
Observaciones del scree plot:
Interpretación del Cluster Plot
La segunda gráfica muestra los resultados del análisis de conglomerados utilizando K-means con 3 clusters.
Puntos clave del cluster plot:
Ejes del gráfico:
Colores y formas:
Observaciones del cluster plot:
Implicaciones para la empresa inmobiliaria
Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Análisis de Correspondencia: Zona y Estrato
# Función para verificar y limpiar tablas de contingencia
limpiar_tabla_contingencia <- function(tabla) {
tabla <- tabla[rowSums(tabla) > 0, colSums(tabla) > 0]
return(tabla)
}
# Crear tabla de contingencia para 'zona' y 'estrato'
tabla_contingencia_zona_estrato <- table(vivienda$zona, vivienda$estrato)
# Verificar y limpiar la tabla de contingencia
tabla_contingencia_zona_estrato <- limpiar_tabla_contingencia(tabla_contingencia_zona_estrato)
# Verificar si la tabla de contingencia es válida para análisis
if (nrow(tabla_contingencia_zona_estrato) > 1 && ncol(tabla_contingencia_zona_estrato) > 1) {
# Realizar análisis de correspondencia
ca_result_zona_estrato <- ca(tabla_contingencia_zona_estrato)
# Visualizar resultados del análisis de correspondencia
fviz_ca_biplot(ca_result_zona_estrato, repel = TRUE)
} else {
print("Tabla de contingencia para 'zona' y 'estrato' no es válida para análisis de correspondencia.")
}
Interpretación del Biplot de Análisis de Correspondencia
Ejes del gráfico:
Puntos en el gráfico:
Análisis de Componentes Principales (PCA)
Varianza Explicada:
Relaciones entre Variables:
Análisis de Conglomerados (Clustering)
Número Óptimo de Clusters:
Segmentación del Mercado:
Análisis de Correspondencia: Zona y Tipo
Relación entre Categorías:
Asociaciones Específicas:
Zona Sur: Asociada con los estratos 4 y 5. Zona Oriente y Zona Centro: Mayor diversidad de estratos. Zona Oeste: Asociada con el estrato 6. Zona Norte: Asociada con el estrato 3.
Desarrollo y Promoción de Proyectos:
Estrategias de Marketing:
Decisiones de Inversión:
Diversificación de la Oferta:
Adaptación a la Demanda Local: Adaptar la oferta inmobiliaria según las características y demandas locales identificadas en el análisis de correspondencia y clustering.
Equilibrio entre Diversidad y Especificidad: Mantener un equilibrio entre proyectos diversos y específicos, según las zonas y clusters identificados.
Guia “Evaluación de la oferta inmobiliaria urbana” de la asignatura “Modelos Estadísticos para la toma de decisiones” de la Maestría en ciencia de datos de la Universidad Javeriana Sede Cali