Problema

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:

  1. Preprocesamiento de datos.

  2. 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.

  3. 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.

  4. 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.


Solución

1. Pre-procesamiento de datos

1.1 Revision de datos

# 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


1.2 Simplificación de base de datos: omision de variables

#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"


1.3 Imputación de NA

# 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


1.4 Análisis de correlación

# 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


1.5 Comentarios sección pre-procesamiento de datos

  • 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.


2. Análisis de componentes principales PCA

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


2.1 Porcentaje de varianza

# 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)


2.2 Contribuación de las varaibles

fviz_pca_var(pca_result,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00",  "#034D94"),
repel = TRUE     # Avoid text overlapping
)


2.3 Comentarios sección análisis de componentes principales PCA

  • 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.


3. Análisis de conglomerados

3.1 Selección número de clusters

# 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")


3.2 Análisis de conglomerados

# 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"


3.3 Análisis de varaibles por 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")


3.4 Comentarios sección análisis de conglomerados

  • 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


4. Análisis de correspondencia

4.1 Correspondencia entre Zona y estrato

# 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)


4.2 Comentarios sección análisis de correspondencia

  • 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.


5. conclusiones

  • 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.