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.
# Visualizar 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>
# Contar 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
#Omitir variables piso y parqueadero por alto contenido de NA
#Omitir variable barrio por extension de subniveles
viviendaM <- subset(vivienda, select = -c(piso, parqueaderos, barrio))
colnames(viviendaM)
## [1] "id" "zona" "estrato" "preciom" "areaconst"
## [6] "banios" "habitaciones" "tipo" "longitud" "latitud"
# 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 longitud latitud
## 0 0 0 0
# Analisis de correlacion para varibles
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.
set.seed(123)
# 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" "longitud" "latitud"
## [11] "cluster"
# Graficar la distribución de ofertas en el mapa, coloreadas por estrato
ggplot(vivienda_completa, aes(x = longitud, y = latitud, color = factor(estrato))) +
geom_point() +
labs(title = "Distribución de Ofertas por Estrato") +
theme_minimal()
# 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 estrato y Clusters
ggplot(vivienda_completa, aes(x = factor(cluster), y = estrato, fill = factor(cluster))) +
geom_boxplot() +
labs(title = "Distribución de estrato 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")
Al analizar número de cluster por coeficiente de Silhouette se evidencia que se tiene valor más alto al seleccionar dos cluster, sin embargo al graficar por el método de codo y revisar los datos se decide seleccionar 3 cluster
Se evidencia que en el cluster 2 se encuentran las viviendas de mayor estrato, de igual forma en el cluster 2 estan las viviendas de mayor precio.
Se evidencia que las viviendas de mayor estratao y precio 6 se encutran hacia el sectorr oriente del mapa
# tabala cruzada
tabla <- table(vivienda_completa$zona, vivienda_completa$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
##
## Estrato3 Estrato4 Estrato5 Estrato6
## Zona Centro 105 14 4 1
## Zona Norte 572 407 769 172
## Zona Oeste 54 84 290 770
## Zona Oriente 340 8 2 1
## Zona Sur 382 1616 1688 1043
#hipótesis de independencia de las variables
chisq.test(tabla)
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 3831.8, df = 12, p-value < 2.2e-16
#análisis de correspondencia
resultados_ac <- CA(tabla)
Las viviendas de esetrato 6 estan ubicadas en la zona oeste
Las viviendas de estratao 4 y 5 estan ubicadas en la zona sur
Las viviendas de estrato 3 estan ubicadas hacia el cento.
Existe una correlación significativa entre las variables “estrato” y “preciom” (0.61), indicando que a medida que el estrato aumenta, el precio de la vivienda tiende a aumentar.
La correlación entre “preciom” y “areaconst” es fuerte (0.69), sugiriendo que el precio de la vivienda está relacionado positivamente con el área construida.
La variable “banios” muestra una correlación positiva considerable con “preciom” (0.67) y “areaconst” (0.65).
Las variables “habitaciones” y “areaconst” también tienen una correlación positiva (0.52).
El análisis de componentes principales revela que la mayor parte de la varianza en los datos se explica por la primera componente principal (PC1)..
La prueba de chi-cuadrado indica que hay una asociación significativa entre la zona y el estrato de las viviendas, con un valor de p < 0.05. Esto sugiere que la distribución de estratos no es uniforme en todas las zonas.
Dada la asociación significativa entre la zona y el estrato, se recomienda realizar un análisis más profundo para entender los factores que influyen en esta variación geográfica. Podría ser beneficioso considerar variables adicionales, como características socioeconómicas, servicios cercanos, o políticas urbanas, para obtener una comprensión más completa de las diferencias en la distribución de estratos en cada zona.