Introducción.

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.

Retos

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:

- Análisis de Componentes Principales.

- Análisis de Conglomerados.

- Análisis de Correspondencia.

- Visualización de resultados.

Solucion

Descripción de los datos.

Iniciamos con la exploración de los datos proporcionada por la empresa inmobiliaria “vivienda” la cual se componen de 8.330 observaciones en 13 columnas, ahora daremos una breve descripción de los datos:

Nombre columna Descripción Tipo de dato
Id Identificador único de cada fila, no puede estar repetido. Numérico
zona Zona de que parte de la ciudad se encuentra inmueble. Carácter
piso Numero de pisos del inmueble. Numérico
Estrato Estrato social del inmueble. Numérico
Areaconst Area construida en metros cuadrados. Numérico
Parqueadero Numero de parqueaderos. Numérico
banios Número de baños del inmueble. Numérico
habitaciones Número de habitaciones. Numérico
Tipo Tipo de inmueble si es casa o apartamento. Carácter
Barrio Nombre de barrio del inmueble. Carácter
longitud y latitud Ubicación exacta de donde se encuentra el inmueble. Numérico

Resumen por cada variable

 summary(ExpViviendaAnalisis)
##        id           zona                piso           estrato     
##  Min.   :   1   Length:8013        Min.   : 1.000   Min.   :3.000  
##  1st Qu.:2080   Class :character   1st Qu.: 2.000   1st Qu.:4.000  
##  Median :4145   Mode  :character   Median : 3.000   Median :5.000  
##  Mean   :4157                      Mean   : 3.601   Mean   :4.658  
##  3rd Qu.:6250                      3rd Qu.: 5.000   3rd Qu.:5.000  
##  Max.   :8319                      Max.   :12.000   Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  79.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 120.0   Median : 1.000   Median : 3.000  
##  Mean   : 431.5   Mean   : 171.4   Mean   : 1.738   Mean   : 3.096  
##  3rd Qu.: 535.0   3rd Qu.: 222.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8013        Length:8013        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.571                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.380  
##  Median :3.414  
##  Mean   :3.417  
##  3rd Qu.:3.452  
##  Max.   :3.498

Limpieza, tratamiento descripción de los datos.

La limpieza y descripción de los datos se encuentra publicada en el siguiente enlace https://rpubs.com/Ablancosegura/Prueba2 en el cual realizamos el analisis EDA, corregimos valores atipicos, corregimos valores duplicados, imputamos variables categoricas que significaban lo mismo, y por ultimo borramos los valores NA´S que al final fueron un 4.8% de los datos todo lo realizamos en la primera actividad del semestre anterior. (metodos y simulación estadistica)

Resultados de la anterior limpieza de datos.

Análisis de Componentes Principales

Procederemos a codificar las variables zonas, tipo.

  ExpViviendaAnalisisMetodos <- ExpViviendaAnalisis

  ExpViviendaAnalisisMetodos$zona <- as.integer(as.factor(ExpViviendaAnalisisMetodos$zona))
  ExpViviendaAnalisisMetodos$tipo <- as.integer(as.factor(ExpViviendaAnalisisMetodos$tipo))

El anterior codigo asigna valores unicos a cada observacion de las variables.

la varible zona queda con los siguientes valores:

   - zona centro  -> 1
   - zona norte   -> 2
   - zona oeste   -> 3
   - zona oriente -> 4
   - zona sur     -> 5

la varible tipo queda con los siguientes valores:

   - apartamento  -> 1
   - casa         -> 2
  

Grafico de correlación general

Grafico de correlación por tipo inmuble (Casas y Apartamentos)

Procedemos a realizar el escalamiento de los datos con el fin de evitar valores grandes por variables que afecten nuestro analisis.

Escala = ExpViviendaAnalisisMetodos[4:9] %>%
scale()

head(Escala)
##         estrato    preciom  areaconst parqueaderos      banios habitaciones
## [1,] -0.6474473 -0.3714823 -0.1882171    1.1839048 -0.80358638    0.3179617
## [2,] -0.6474473 -0.2797869  0.5250418   -0.6929632 -0.07011586    0.3179617
## [3,]  1.3191923  1.2790357  2.5578297    2.1223388  0.66335466   -0.4229011
## [4,]  0.3358725  0.3620812  0.7033565    1.1839048  0.66335466    0.3179617
## [5,] -0.6474473 -0.6771338 -0.7588242   -0.6929632 -0.80358638   -0.4229011
## [6,]  1.3191923  0.1481252 -0.1525542    0.2454708  0.66335466   -0.4229011

Aplicamos la función prcomp para realizar análisis de componentes principales

  prcomp(Escala)
## Standard deviations (1, .., p=6):
## [1] 1.8866278 1.0915105 0.6959455 0.6009047 0.4711356 0.4264329
## 
## Rotation (n x k) = (6 x 6):
##                    PC1        PC2         PC3         PC4        PC5        PC6
## estrato      0.3156229 -0.6215902  0.52069952  0.06055274 -0.4724887  0.1263632
## preciom      0.4697867 -0.2298660 -0.09017785 -0.27720886  0.2807009 -0.7501282
## areaconst    0.4432474  0.2201215 -0.24986628 -0.68569627 -0.2497213  0.4001312
## parqueaderos 0.4251699 -0.1315577 -0.64824428  0.58852530 -0.1524661  0.1099749
## banios       0.4667843  0.1319196  0.36390337  0.19382538  0.6674502  0.3862978
## habitaciones 0.2907876  0.6911032  0.32505461  0.25569303 -0.4084912 -0.3160926

Se procede a graficar el numero de componentes para su reducción.

  graficoPCA <- prcomp(Escala)

  fviz_eig(graficoPCA, addlabels = TRUE, main = "Grafico PCA")



El primer componente principal (PC1) explica el 59.3% de la variabilidad de los datos, lo que representa la mayor parte de la misma. Sumando el segundo componente principal (PC2) con un 19.9% y el tercer componente principal (PC3) con un 8.1%, se explica un total del 87.3% de la variabilidad de los datos. Esto sugiere que los tres primeros componentes capturan una parte significativa de la variabilidad en los datos, lo que los convierte en componentes importantes para resumir la estructura de los datos.




Visualización de las variables en el plano.

fviz_pca_var(graficoPCA, col.var = “contrib”, gradient.cols = c(“#FF7F00”, “#034D94”), repel = TRUE
)

fviz_contrib(graficoPCA, choice = “var”, axes = 1, top = 10) # PC1



Segun lo observado en el grafico de planos de los valores PCAs vemos la gran contribución que tienen las variables preciom, banios, areaconst y parqueadero sobre el componente principal PC1



fviz_contrib(graficoPCA, choice = “var”, axes = 2, top = 10) # PC2

fviz_contrib(graficoPCA, choice = “var”, axes = 3, top = 10) # PC3

Para el componente PCA2 las variables con mayor constribucion son habitaciones y estrato, miesntras que para el componente PCA3 las variables con mayor contribución son parqueaderos y estrato.




DATOSPCA <- as.data.frame(graficoPCA$rotation)

colores <- c("red", "blue", "green", "orange", "purple", "yellow")


# Crear el gráfico 3D
fig <- plot_ly(DATOSPCA[1:3], x = ~PC1, y = ~PC2, z = ~PC3, type = "scatter3d", mode = "markers",
               marker = list(size = 10, color = colores))

fig <- fig %>% add_trace(text = row.names(DATOSPCA[1:3]), hoverinfo = "text")


fig <- fig %>% layout(title = "Ubicación de las variables en el espacio de componentes principales",
                      scene = list(xaxis = list(title = "PC1"),
                                   yaxis = list(title = "PC2"),
                                   zaxis = list(title = "PC3")))

# Mostrar el gráfico
fig

Grafico 3D de la contribución de las variables en los tres componentes PC 1,2,3

Conclusiones: Análisis de Componentes Principales (ACP)


  • El análisis de componentes principales (PCA) revela que los tres primeros componentes principales (PC1, PC2 y PC3) capturan una parte significativa de la variabilidad en los datos, explicando en conjunto el 87.3% de la variabilidad total. Esto sugiere que estos tres componentes son importantes para resumir la estructura de los datos.

  • PC1, que explica el 59.3% de la variabilidad, es el componente principal más importante y representa la mayor parte de la variabilidad en los datos. Las variables preciom, banios, areaconst y parqueadero tienen una gran contribución a PC1, lo que sugiere que estas variables son cruciales para entender la estructura subyacente de los datos.

  • PC2 y PC3, aunque explican una menor cantidad de variabilidad individualmente (19.9% y 8.1% respectivamente), siguen siendo importantes ya que en conjunto aportan significativamente a la explicación global de la variabilidad. Las variables habitaciones y estrato tienen una mayor contribución a PC2, mientras que parqueaderos y estrato son las variables que más contribuyen a PC3.





Análisis de Conglomerados (Clustering)

Para la realización del analisis de conglomerados (cluistering) tomaremos las mismas variables analizadas en PCA estrato, preciom, areaconst, parqueaderos,banios, habitaciones

head(ExpViviendaAnalisisMetodos[4:9])
## # A tibble: 6 × 6
##   estrato preciom areaconst parqueaderos banios habitaciones
##     <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1       4     310       145            3      2            4
## 2       4     340       245            1      3            4
## 3       6     850       530            4      4            3
## 4       5     550       270            3      4            4
## 5       4     210        65            1      2            3
## 6       6     480       150            2      4            3

Al observar la muestra de datos anterior, notamos que las variables tienen rangos distintos, lo que sugiere la necesidad de realizar un proceso de escalamiento de las variables. Una técnica común para esto es la estandarización, que implica restar la media y dividir el resultado por la desviación estándar de cada variable. En R, podemos realizar este proceso de manera sencilla utilizando la función scale()



  ExpViviendaAnalisisMetodosEscalada <- scale(ExpViviendaAnalisisMetodos[4:9])
  
  head(ExpViviendaAnalisisMetodosEscalada)
##         estrato    preciom  areaconst parqueaderos      banios habitaciones
## [1,] -0.6474473 -0.3714823 -0.1882171    1.1839048 -0.80358638    0.3179617
## [2,] -0.6474473 -0.2797869  0.5250418   -0.6929632 -0.07011586    0.3179617
## [3,]  1.3191923  1.2790357  2.5578297    2.1223388  0.66335466   -0.4229011
## [4,]  0.3358725  0.3620812  0.7033565    1.1839048  0.66335466    0.3179617
## [5,] -0.6474473 -0.6771338 -0.7588242   -0.6929632 -0.80358638   -0.4229011
## [6,]  1.3191923  0.1481252 -0.1525542    0.2454708  0.66335466   -0.4229011



Numero de clusters optimos - tecnica del codo.

X <-ExpViviendaAnalisisMetodosEscalada

sse <- numeric(10)  

for (k in 1:10) {
  km <- kmeans(X, centers = k)
  sse[k] <- km$tot.withinss  
}

plot(1:10, sse, type = "b", pch = 19, frame = FALSE, 
     xlab = "Número de clusters (k)", ylab = "SSE",
     main = "Método del codo")

abline(v = 4, col = "red", lty = 2) 

En este caso, la técnica del codo no muestra un punto de inflexión tan evidente en la curva de la suma de cuadrados dentro del cluster (SSE). Sin embargo, se observa un ligero cambio en la tendencia de los datos a partir del cluster 4, lo que podría sugerir un posible número óptimo de clusters. Es importante tener en cuenta que la interpretación del método del codo puede ser subjetiva y dependerá del contexto específico del problema y de la interpretación del analista.



La tecnica Kmeans

El objetivo de esta técnica es dividir un conjunto de datos en grupos o clusters, donde los puntos dentro de un mismo cluster son más similares entre sí que con los puntos de otros clusters. Esto se logra asignando cada punto a un cluster de manera que la similitud entre los puntos dentro del mismo cluster sea alta, mientras que la similitud entre puntos de diferentes clusters sea baja.


km <- kmeans(ExpViviendaAnalisisMetodosEscalada,4)


head(aggregate(ExpViviendaAnalisisMetodosEscalada, by=list(cluster= km$cluster), mean))
##   cluster    estrato     preciom    areaconst parqueaderos     banios
## 1       1 -0.5729996 -0.64765148 -0.586002863  -0.57826569 -0.7374414
## 2       2  1.0523393  2.13099481  1.724151785   1.95327090  1.4904953
## 3       3 -0.7023303  0.01499266  0.875148760  -0.01423534  0.8910717
## 4       4  0.7891151  0.25961559  0.001297602   0.22323859  0.3243608
##   habitaciones
## 1   -0.4922014
## 2    0.5882879
## 3    1.9771498
## 4   -0.1294505
fviz_cluster(km, data=ExpViviendaAnalisisMetodosEscalada)

Conclusiones: Análisis de Conglomerados (Clustering)

  • Cluster 1: Este cluster se caracteriza por tener valores relativamente bajos en estrato y parqueaderos, pero altos en areaconst, banios, y habitaciones. Esto podría indicar propiedades más grandes con un número considerable de habitaciones y baños, pero ubicadas en estratos más bajos.

  • Cluster 2: Este cluster tiene valores intermedios en todas las variables, con un estrato y parqueaderos moderados, pero no tan altos como en el Cluster 3. Las propiedades en este cluster podrían ser de tamaño y precio promedio.

  • Cluster 3: Este cluster se destaca por tener valores muy altos en todas las variables. Las propiedades en este cluster parecen ser grandes, con precios y características de lujo.

  • Cluster 4: Este cluster tiene valores bajos en todas las variables, lo que sugiere propiedades más pequeñas y posiblemente de menor valor.



Análisis de Correspondencia Simple (ACS)

El objetivo del Análisis de Correspondencia Simple (ACS) es descubrir relaciones entre variables categóricas en un conjunto de datos. En este caso, nos enfocaremos en las variables “zona” y “estrato”.


la varible zona:

   - zona centro  -> 1
   - zona norte   -> 2
   - zona oeste   -> 3
   - zona oriente -> 4
   - zona sur     -> 5

la varible tipo:

   - apartamento  -> 1
   - casa         -> 2


##   zona_centro zona_norte zona_oeste zona_oriente zona_ sur
## 3          71        527         39          316       352
## 4           7        382         76            3      1596
## 5           0        757        279            1      1670
## 6           0        143        759            0      1035


Se ejecuta la prueba Chi-Cuadrado para validar si las variables son independientes.

options(scipen = 999)
chisq.test(tabla2)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla2
## X-squared = 3852.4, df = 12, p-value < 0.00000000000000022


La prueba da como resultado que las variables zona y tipo no son independientes al dar un valor menor que 0.05 por tanto se rechza la hipotesis nula.
Procederemos a realizar el analsis de correspondencia.

  resultado_ac  <- ca(tabla2)
  #resultado_ac
  plot(resultado_ac)


se observan varios grupos.

  • zona_sur,5,4
  • zona_oeste,6
  • zona_norte
  • 3,zona_oriente, zona_centro

Este tipo de cercanias permite asociar las categorias.