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:
Preprocesamiento de datos.
Análisis de Componentes Principales: 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.
Análisis de Conglomerados: 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.
Análisis de Correspondencia : 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.
Visualización de resultados: Presentar gráficos, mapas y otros recursos visuales para comunicar los hallazgos de manera clara y efectiva a la dirección de la empresa.
# Visualizacion inicial de datos
head(vivienda)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Conteo de NA por variables
na_x_columna <- colSums(is.na(vivienda))
print(na_x_columna)
## id zona piso estrato preciom areaconst
## 3 3 2638 3 2 3
## parqueaderos banios habitaciones tipo barrio longitud
## 1605 3 3 3 3 3
## latitud
## 3
#Se omite variables piso y parqueadero por alto contenido de NA
#Se omite variable barrio por extension de subniveles
#Se omite varibles latitud y longitud por no considerar varaibles de interes
viviendaM <- subset(vivienda, select = -c(piso, parqueaderos, barrio, latitud, longitud))
colnames(viviendaM)
## [1] "id" "zona" "estrato" "preciom" "areaconst"
## [6] "banios" "habitaciones" "tipo"
# Imputar NA en todas las columnas numéricas con la mediana
# y en las columnas categóricas con la moda
vivienda_completa <- viviendaM %>%
mutate(across(where(is.numeric), ~coalesce(., median(., na.rm = TRUE))),
across(where(is.character), ~coalesce(., names(which.max(table(.))))))
# Contar NA por columna después de la imputación
na_x_columna_imp <- colSums(is.na(vivienda_completa))
print(na_x_columna_imp)
## id zona estrato preciom areaconst banios
## 0 0 0 0 0 0
## habitaciones tipo
## 0 0
# Analisis de correlacion para varibles numericas
variables_numericas <- c("estrato", "preciom", "areaconst", "banios", "habitaciones")
matriz_correlacion <- cor(vivienda_completa[, variables_numericas])
print(matriz_correlacion)
## estrato preciom areaconst banios habitaciones
## estrato 1.00000000 0.6097412 0.2742639 0.4203017 -0.07142553
## preciom 0.60974115 1.0000000 0.6873646 0.6691417 0.26412553
## areaconst 0.27426391 0.6873646 1.0000000 0.6484105 0.51693891
## banios 0.42030171 0.6691417 0.6484105 1.0000000 0.58989913
## habitaciones -0.07142553 0.2641255 0.5169389 0.5898991 1.00000000
De la matriz de correlacion se destaca fuerte correlación positiva entre estrato y precio de la vivienda, así como entre el precio y el área construida.
También se observa una relación positiva sólida entre el área construida y el número de baños, y entre el número de baños y habitaciones.
La correlación negativa débil entre el estrato y el número de habitaciones sugiere una leve tendencia a tener menos habitaciones en estratos más altos.
# estandarizacion a varaibles numericas
vivienda_est = scale(vivienda_completa[,3:7])
# Realizar PCA
prcomp(vivienda_est)
## Standard deviations (1, .., p=5):
## [1] 1.7126347 1.0901132 0.6673537 0.4916007 0.4376109
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## estrato 0.3299652 -0.6744869 0.4208590 -0.4795581 0.1705640
## preciom 0.5068734 -0.2807375 -0.3016301 0.2213704 -0.7240720
## areaconst 0.4940549 0.1638222 -0.6524775 -0.2984460 0.4628987
## banios 0.5189655 0.1092286 0.3768305 0.6647601 0.3672011
## habitaciones 0.3475441 0.6538236 0.4051776 -0.4359394 -0.3122752
# Resumen PCA
pca_result <- prcomp(vivienda_est)
summary(pca_result)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 1.7126 1.0901 0.66735 0.49160 0.4376
## Proportion of Variance 0.5866 0.2377 0.08907 0.04833 0.0383
## Cumulative Proportion 0.5866 0.8243 0.91337 0.96170 1.0000
#visualizacion de de componenetes principales
fviz_eig(pca_result, addlabels = TRUE)
fviz_pca_var(pca_result,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
El primer componente principal (PC1) es especialmente importante al explicar el 58.66% de la variabilidad en los datos, seguido por el segundo componente (PC2) con un 23.77%.
La acumulación del 82.43% de la variabilidad en los dos primeros componentes sugiere que estos capturan la mayoría de la información significativa en el conjunto de datos. Para el siguiente analisis de conglomerados se empelaran solo PC1 y PC2.
# Obtener las puntuaciones de los componentes principales
pca_scores <- pca_result$x
# Calcular la suma de las distancias cuadradas intra-cluster para diferentes valores de k
wss <- numeric(10)
for (i in 1:10) {
kmeans_model <- kmeans(pca_scores, centers = i)
wss[i] <- sum(kmeans_model$withinss)
}
# Método del codo: Graficar la suma de las distancias cuadradas intra-cluster
plot(1:10, wss, type = "b", main = "Método del Codo", xlab = "Número de Clusters (k)", ylab = "Suma de Distancias Cuadradas Intra-Cluster")
# Realizar el análisis de conglomerados con k-means
num_clusters <- 3
kmeans_result <- kmeans(pca_result$x[, 1:2], centers = num_clusters)
# Agregar la información de los clusters al conjunto de datos original
vivienda_completa$cluster <- as.factor(kmeans_result$cluster)
# Visualizar los resultados
library(ggplot2)
# Graficar las puntuaciones de los componentes principales coloreadas por cluster
ggplot(vivienda_completa, aes(x = pca_result$x[, 1], y = pca_result$x[, 2], color = cluster)) +
geom_point() +
labs(title = "Resultados del Análisis de Conglomerados")
colnames(vivienda_completa)
## [1] "id" "zona" "estrato" "preciom" "areaconst"
## [6] "banios" "habitaciones" "tipo" "cluster"
# Analizar la distribución de clusters en diferentes estratos socioeconómicos
ggplot(vivienda_completa, aes(x = factor(cluster), fill = factor(estrato))) +
geom_bar(position = "stack") +
labs(title = "Distribución de Clusters por Estrato")
# Box plot para area construida y Clusters
ggplot(vivienda_completa, aes(x = factor(cluster), y = areaconst, fill = factor(cluster))) +
geom_boxplot() +
labs(title = "Distribución de area construida por Clusters")
# Box plot para Precio y Clusters
ggplot(vivienda_completa, aes(x = factor(cluster), y = preciom, fill = factor(cluster))) +
geom_boxplot() +
labs(title = "Distribución de Precio por Clusters")
# Box plot para area construida y Clusters
ggplot(vivienda_completa, aes(x = factor(cluster), y = areaconst, fill = factor(cluster))) +
geom_boxplot() +
labs(title = "Distribución de Are construida por Clusters")