Evaluación de la oferta inmobiliaria urbana

Problema

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.

1. Recolección de datos

#install.packages("devtools") 
#install.packages("dplyr")

devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
## vctrs       (0.6.1  -> 0.6.5 ) [CRAN]
## stringi     (1.7.12 -> 1.8.3 ) [CRAN]
## rlang       (1.1.0  -> 1.1.3 ) [CRAN]
## glue        (1.6.2  -> 1.7.0 ) [CRAN]
## cli         (3.6.1  -> 3.6.2 ) [CRAN]
## Rcpp        (1.0.10 -> 1.0.12) [CRAN]
## digest      (0.6.31 -> 0.6.34) [CRAN]
## plyr        (1.8.8  -> 1.8.9 ) [CRAN]
## curl        (5.0.0  -> 5.2.0 ) [CRAN]
## timechange  (0.2.0  -> 0.3.0 ) [CRAN]
## xfun        (0.39   -> 0.42  ) [CRAN]
## tzdb        (0.3.0  -> 0.4.0 ) [CRAN]
## vroom       (1.6.1  -> 1.6.5 ) [CRAN]
## readr       (2.1.4  -> 2.1.5 ) [CRAN]
## utf8        (1.2.3  -> 1.2.4 ) [CRAN]
## fansi       (1.0.4  -> 1.0.6 ) [CRAN]
## haven       (2.5.2  -> 2.5.4 ) [CRAN]
## tidyr       (1.3.0  -> 1.3.1 ) [CRAN]
## scales      (1.2.1  -> 1.3.0 ) [CRAN]
## purrr       (1.0.1  -> 1.0.2 ) [CRAN]
## dplyr       (1.1.2  -> 1.1.4 ) [CRAN]
## matrixStats (0.63.0 -> 1.2.0 ) [CRAN]
## magick      (2.7.4  -> 2.8.2 ) [CRAN]
## lubridate   (1.9.2  -> 1.9.3 ) [CRAN]
## htmltools   (0.5.5  -> 0.5.7 ) [CRAN]
## checkmate   (2.1.0  -> 2.3.1 ) [CRAN]
## yaml        (2.3.7  -> 2.3.8 ) [CRAN]
## 
##   There are binary versions available but the source versions are later:
##             binary source needs_compilation
## vctrs        0.6.1  0.6.5              TRUE
## stringi     1.7.12  1.8.3              TRUE
## rlang        1.1.0  1.1.3              TRUE
## glue         1.6.2  1.7.0              TRUE
## cli          3.6.1  3.6.2              TRUE
## Rcpp        1.0.10 1.0.12              TRUE
## digest      0.6.31 0.6.34              TRUE
## plyr         1.8.8  1.8.9              TRUE
## curl         5.0.0  5.2.0              TRUE
## timechange   0.2.0  0.3.0              TRUE
## xfun          0.39   0.42              TRUE
## tzdb         0.3.0  0.4.0              TRUE
## vroom        1.6.1  1.6.5              TRUE
## readr        2.1.4  2.1.5              TRUE
## utf8         1.2.3  1.2.4              TRUE
## fansi        1.0.4  1.0.6              TRUE
## haven        2.5.2  2.5.4              TRUE
## tidyr        1.3.0  1.3.1              TRUE
## scales       1.2.1  1.3.0              TRUE
## purrr        1.0.1  1.0.2              TRUE
## dplyr        1.1.2  1.1.4              TRUE
## matrixStats 0.63.0  1.2.0              TRUE
## magick       2.7.4  2.8.2              TRUE
## lubridate    1.9.2  1.9.3              TRUE
## htmltools    0.5.5  0.5.7              TRUE
## checkmate    2.1.0  2.3.1              TRUE
## yaml         2.3.7  2.3.8              TRUE
## 
##   Binaries will be installed
## package 'vctrs' successfully unpacked and MD5 sums checked
## package 'stringi' successfully unpacked and MD5 sums checked
## package 'rlang' successfully unpacked and MD5 sums checked
## package 'glue' successfully unpacked and MD5 sums checked
## package 'cli' successfully unpacked and MD5 sums checked
## package 'Rcpp' successfully unpacked and MD5 sums checked
## package 'digest' successfully unpacked and MD5 sums checked
## package 'plyr' successfully unpacked and MD5 sums checked
## package 'curl' successfully unpacked and MD5 sums checked
## package 'timechange' successfully unpacked and MD5 sums checked
## package 'xfun' successfully unpacked and MD5 sums checked
## package 'tzdb' successfully unpacked and MD5 sums checked
## package 'vroom' successfully unpacked and MD5 sums checked
## package 'readr' successfully unpacked and MD5 sums checked
## package 'utf8' successfully unpacked and MD5 sums checked
## package 'fansi' successfully unpacked and MD5 sums checked
## package 'haven' successfully unpacked and MD5 sums checked
## package 'tidyr' successfully unpacked and MD5 sums checked
## package 'scales' successfully unpacked and MD5 sums checked
## package 'purrr' successfully unpacked and MD5 sums checked
## package 'dplyr' successfully unpacked and MD5 sums checked
## package 'matrixStats' successfully unpacked and MD5 sums checked
## package 'magick' successfully unpacked and MD5 sums checked
## package 'lubridate' successfully unpacked and MD5 sums checked
## package 'htmltools' successfully unpacked and MD5 sums checked
## package 'checkmate' successfully unpacked and MD5 sums checked
## package 'yaml' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\cristian.ruizL\AppData\Local\Temp\RtmpSYU79t\downloaded_packages
## -- R CMD build -----------------------------------------------------------------
## * checking for file 'C:\Users\cristian.ruizL\AppData\Local\Temp\RtmpSYU79t\remotes7b5860e0125a\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ... OK
## * preparing 'paqueteMODELOS':
## * checking DESCRIPTION meta-information ... OK
## * checking for LF line-endings in source and make files and shell scripts
## * checking for empty or unneeded directories
## * building 'paqueteMODELOS_0.1.0.tar.gz'
## 
library(paqueteMODELOS)
head(vivienda,5)
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1147 Zona Oriente NA 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
1169 Zona Oriente NA 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
1350 Zona Oriente NA 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
5992 Zona Sur 02 4 400 280 3 5 3 Casa 3 de julio -76.54000 3.43500
1212 Zona Norte 01 5 260 90 1 2 3 Apartamento acopi -76.51350 3.45891

Ahora se describe cada una de las columnas de la tabla.

  • id: N° único para identificar la vivienda
  • zona: Zona vivienda: Zona Sur, Zona Norte, Zona Oeste, Zona Oriente, Zona Centro
  • piso: # Piso en que se encuentra la vivienda
  • estrato: Estrato socioeconómico: 3,4,5,6
  • preciom: Precio del inmueble en millones
  • areaconst: Área Construida en metros
  • parquea: # parqueaderos
  • banios: # baños
  • habitac: # habitaciones
  • tipo: Tipo de vivienda: Apartamento, apto, Casa
  • barrio: Barrrio en que se encuentra la vivienda
  • longitud: distancia en grados, minutos y segundos que hay con respecto al meridiano Greenwich
  • latitud: Distancia en grados, minutos y segundos que hay con respecto al ecuador

1.1 Limpieza de datos

El resumen de la base de datos:

#install.packages("skimr")
skimr::skim(vivienda)
Data summary
Name vivienda
Number of rows 8322
Number of columns 13
_______________________
Column type frequency:
character 4
numeric 9
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 3 1.00 8 12 0 5 0
piso 2638 0.68 2 2 0 12 0
tipo 3 1.00 4 11 0 2 0
barrio 3 1.00 4 29 0 436 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 3 1.00 4160.00 2401.63 1.00 2080.50 4160.00 6239.50 8319.00 ▇▇▇▇▇
estrato 3 1.00 4.63 1.03 3.00 4.00 5.00 5.00 6.00 ▅▆▁▇▆
preciom 2 1.00 433.89 328.65 58.00 220.00 330.00 540.00 1999.00 ▇▂▁▁▁
areaconst 3 1.00 174.93 142.96 30.00 80.00 123.00 229.00 1745.00 ▇▁▁▁▁
parqueaderos 1605 0.81 1.84 1.12 1.00 1.00 2.00 2.00 10.00 ▇▁▁▁▁
banios 3 1.00 3.11 1.43 0.00 2.00 3.00 4.00 10.00 ▇▇▃▁▁
habitaciones 3 1.00 3.61 1.46 0.00 3.00 3.00 4.00 10.00 ▂▇▂▁▁
longitud 3 1.00 -76.53 0.02 -76.59 -76.54 -76.53 -76.52 -76.46 ▁▅▇▂▁
latitud 3 1.00 3.42 0.04 3.33 3.38 3.42 3.45 3.50 ▃▇▅▇▅

Se observa que para todas las variables se encuentran datos vacíos pero para las variables piso y parquea hay una cantidad considerable de variables nulas.

#install.packages("heatmaply")
apply(X= is.na(vivienda), 
      MARGIN = 2, 
      FUN = sum)
##           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
apply(X= is.na(vivienda), 
      MARGIN = 2, 
      FUN = mean)
##           id         zona         piso      estrato      preciom    areaconst 
## 0.0003604903 0.0003604903 0.3169911079 0.0003604903 0.0002403268 0.0003604903 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
## 0.1928622927 0.0003604903 0.0003604903 0.0003604903 0.0003604903 0.0003604903 
##      latitud 
## 0.0003604903

A partir de lo anteriormente expuesto, se evidencia que un 31.69% de los datos correspondientes a la variable “piso” se encuentran en estado de falta (Null), mientras que un 19.28% de los datos asociados a la variable “parquea” presentan la misma condición de ausencia.

Se sugiere que el responsable de la recolección de datos valide y describa la naturaleza de los valores faltantes (NA), así como proponga posibles métodos de imputación.

Para este caso no se van a utilizar las siguientes variables para el estudio

  • ID: Identificador de vivienda
  • piso: Datos faltantes
  • parqueaderos: Datos faltantes
  • barrio: Variabilidad en sus datos
  • latitud: Variabilidad en sus datos
  • longitud Variabilidad en sus datos
#Valores unicos variables.
V_Unicos_latitud <- length(unique(vivienda$latitud))
V_Unicos_longitud <- length(unique(vivienda$longitud))
V_Unicos_barrio <- length(unique(vivienda$barrio))

#Tabla para mostrar los datos
Tabla_Valores_Unicos <- data.frame(V_Unicos_barrio, 
                                   V_Unicos_latitud, 
                                   V_Unicos_longitud)

print(Tabla_Valores_Unicos)
##   V_Unicos_barrio V_Unicos_latitud V_Unicos_longitud
## 1             437             3680              2929

Nombraremos el nuevo data frame que se va a utilizar:

#Eliminando variables

vivienda_sin <- subset(vivienda, 
                       select = -c(id, 
                                   latitud, 
                                   longitud, 
                                   barrio, 
                                   piso,
                                   parqueaderos))


#eliminando filas que se tengan datos faltates
vivienda_OK <- na.omit(vivienda_sin)

head(vivienda_OK,5)
zona estrato preciom areaconst banios habitaciones tipo
Zona Oriente 3 250 70 3 6 Casa
Zona Oriente 3 320 120 2 3 Casa
Zona Oriente 3 350 220 2 4 Casa
Zona Sur 4 400 280 5 3 Casa
Zona Norte 5 260 90 2 3 Apartamento
#Validando nulos
library(mice)
md.pattern(vivienda_OK)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

zona estrato preciom areaconst banios habitaciones tipo
8319 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0

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

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

Se eliminan las variables categóricas para realizar el análisis de componentes principales

#Eliminando variables categóricas
vivienda_Num <- subset(vivienda_OK, 
                       select = -c(zona, tipo))
head(vivienda_Num)
estrato preciom areaconst banios habitaciones
3 250 70 3 6
3 320 120 2 3
3 350 220 2 4
4 400 280 5 3
5 260 90 2 3
5 240 87 3 3
#ACP
library(ade4)
ACPvivienda <- dudi.pca(vivienda_Num,
                        scannf=F,
                        nf=5) 

ACPok <- inertia.dudi(ACPvivienda,
                      row.inertia=T,
                      col.inertia=T)

plot(ACPvivienda$eig, 
     main = "Valores Propios")

screeplot(ACPvivienda, main = "Screeplot - Eigenvalues")

Se nota que los componentes principales 1 y 2 son los que mejor explican la variabilidad de los datos.

# % Factor de varianza
print(ACPok$tot.inertia,2 ) #valores propios - porcentaje de varianza de cada factor
##       inertia      cum    cum(%)
## Ax1 2.9331575 2.933158  58.66315
## Ax2 1.1883211 4.121479  82.42957
## Ax3 0.4453505 4.566829  91.33658
## Ax4 0.2416783 4.808507  96.17015
## Ax5 0.1914925 5.000000 100.00000

Los dos primeros componentes principales (Ax1 y Ax2) explican conjuntamente aproximadamente el 82.42% de la variabilidad en los datos.

print(ACPvivienda$c1) #vectores propios
##                     CS1        CS2        CS3        CS4        CS5
## estrato      -0.3300032  0.6744363 -0.4208934  0.4795545 -0.1706159
## preciom      -0.5068715  0.2807656  0.3015468 -0.2213868  0.7240921
## areaconst    -0.4940473 -0.1638135  0.6525373  0.2984641 -0.4628138
## banios       -0.5189619 -0.1092831 -0.3767649 -0.6647648 -0.3672488
## habitaciones -0.3475270 -0.6538568 -0.4051685  0.4359154  0.3122700
print(ACPvivienda$co) #coordenadas de las columnas
##                   Comp1      Comp2      Comp3      Comp4      Comp5
## estrato      -0.5651788  0.7352040 -0.2808814  0.2357528 -0.0746613
## preciom      -0.8680916  0.3060630  0.2012360 -0.1088355  0.3168617
## areaconst    -0.8461283 -0.1785733  0.4354681  0.1467273 -0.2025267
## banios       -0.8887982 -0.1191296 -0.2514325 -0.3268036 -0.1607076
## habitaciones -0.5951908 -0.7127702 -0.2703875  0.2142995  0.1366489
print(ACPok$col.abs/100)  #contribuciones de las columnas a los ejes
##                  Axis1      Axis2      Axis3      Axis4      Axis5
## estrato      0.1089021 0.45486434 0.17715123 0.22997252 0.02910980
## preciom      0.2569187 0.07882934 0.09093046 0.04901212 0.52430939
## areaconst    0.2440828 0.02683486 0.42580497 0.08908083 0.21419659
## banios       0.2693215 0.01194279 0.14195179 0.44191225 0.13487170
## habitaciones 0.1207750 0.42752867 0.16416155 0.19002228 0.09751252
library(factoextra)

fviz_pca_ind(ACPvivienda, geom.ind = "point", 
             col.ind = "gray", 
             axes = c(1, 2), 
             pointsize = 1.5)

#gráficos acp

fviz_eig(ACPvivienda, addlabels = TRUE,
         main= "Varianza Explicada por cada componente",
         ylab = "Varianza Explicada",
         barcolor = terrain.colors(5),
         barfill = topo.colors(5))

fviz_pca_var(ACPvivienda, 
             col.var = "contrib", 
             gradient.cols = c("#FF7F00",  "#034D94"),
             repel = TRUE     # Avoid text overlapping
)

#### Conclusiones ACP

Al realizar el Análisis de componentes principales se concluye que de las variables que se encuentran en el test los componentes 1 y 2 acumulan conjuntamente aproximadamente un 82.5% de la variabilidad de los datos, es decir, que al utilizar estos dos componentes para modelado se estaría representando la mayor parte de la información contenida en las variables originales, pero también estaríamos descartando alrededor del 17.5% de la variabilidad..

Con respecto a la gráfica de Variables PCA, se pueden extraer algunas conclusiones adicionales. Por ejemplo, se puede deducir que las variables habitaciones y estrato tienen un ángulo cercano a 90° entre sí en el plano de los componentes principales. Esto sugiere que estas dos variables no están altamente correlacionadas; es decir, cambios en una variable no están fuertemente asociados con cambios en la otra. Por otro lado, al observar las variables baños y área construida, se nota un ángulo muy pequeño entre ellas, lo que sugiere una alta correlación. Este patrón indica que a medida que el área construida aumenta, también tiende a aumentar el número de baños. Esta relación podría tener implicaciones importantes en el diseño de espacios habitacionales o en la evaluación de la demanda de ciertos tipos de viviendas.

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

Para el análisis de conglomerados o clustering, se deben estandarizar los datos para que estas variables se encuentren en una escala comparable entre ellas, para este análisis se va utilizar las mismas variables que se utilizaron en el PCA

#Normalizando las variables
vivienda_CLST <-  scale(vivienda_Num)

summary(vivienda_CLST)
estrato preciom areaconst banios habitaciones
Min. :-1.5872 Min. :-1.1437 Min. :-1.0138 Min. :-2.17847 Min. :-2.4702
1st Qu.:-0.6156 1st Qu.:-0.6508 1st Qu.:-0.6640 1st Qu.:-0.77812 1st Qu.:-0.4148
Median : 0.3560 Median :-0.3161 Median :-0.3633 Median :-0.07794 Median :-0.4148
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.0000
3rd Qu.: 0.3560 3rd Qu.: 0.3228 3rd Qu.: 0.3782 3rd Qu.: 0.62224 3rd Qu.: 0.2704
Max. : 1.3276 Max. : 4.7620 Max. :10.9822 Max. : 4.82330 Max. : 4.3813

Como se nota en el summary, la estandarización logra llevar los datos a una media de 0 y una desviación estandar de 1

Escoger el número optimo de clusters

Para escoger el número óptimo de clusters, una de las metodologías es el método de codo (Elbow Method), en donde se busca el valor k que satisfaga que un incremento de k, no mejore sustancialmente la distancia media intra-cluster.

fviz_nbclust(vivienda_CLST, kmeans,method = "wss")+
  labs(title = "Número Óptimo de Clusters",
       subtitle = "Elbow Method", 
       x = "Número de Clusters", 
       y = "WSS")+ 
  theme_minimal() + 
  theme(plot.title = element_text(size = 14, face = "bold"))

Se puede ver en la gráfica del método “Elbow” (codo) que, a partir de cuatro grupos, el valor de la suma de cuadrados dentro de los grupos (WSS) empieza a disminuir significativamente. Esto indica que agregar más grupos no mejoraría significativamente la estructura de los datos. Por lo tanto, el número de grupos ideal para la segmentación de datos de vivienda es 4.

Grafico de cluster

Se realiza un gráfico de para 4 clusters.

#install.packages("fpc")
library(fpc)
#Semilla
set.seed(38)


k <- kmeansruns( vivienda_CLST, krange= 4, iter.max=100, runs=200)

fviz_cluster(k, data= vivienda_CLST, 
  geom = "point",          
  ellipse.type = "norm",   
  ellipse.level = 0.95,    
  palette = "jco",        
  ggtheme = theme_minimal(),  # Tema de la gráfica (minimal)
  main = "Gráfico de Clusters",  # Título principal
  xlab = "Componente Principal 1",  # Etiqueta del eje X
  ylab = "Componente Principal 2"   # Etiqueta del eje Y
)

Codigo K-Means para los clusters

# de cluster
K_Cluster <- 4 

model_kmean <- kmeans(vivienda_CLST, centers =K_Cluster , nstart = 20)

#visualización
head(model_kmean$centers)
estrato preciom areaconst banios habitaciones
0.6031181 -0.0966625 -0.2753263 -0.0919867 -0.3080176
-0.9857395 -0.7257399 -0.5914133 -0.7867433 -0.4676573
-0.6438532 0.0480854 0.8468814 0.9547884 1.9077411
1.1238308 1.9453677 1.4659867 1.3039121 0.3667627
#Agregando el cluster al DF 

vivienda_OK$cluster <- as.factor(model_kmean$cluster)

head(vivienda_OK)
zona estrato preciom areaconst banios habitaciones tipo cluster
Zona Oriente 3 250 70 3 6 Casa 3
Zona Oriente 3 320 120 2 3 Casa 2
Zona Oriente 3 350 220 2 4 Casa 2
Zona Sur 4 400 280 5 3 Casa 1
Zona Norte 5 260 90 2 3 Apartamento 1
Zona Norte 5 240 87 3 3 Apartamento 1
#convertir variable a #

vivienda_OK$cluster <- as.numeric(as.character(vivienda_OK$cluster))

#c("#0073C2FF", "#EFC000F", "#868686FF", "#CD534CFF")


barplot(table(vivienda_OK$cluster),
        main = "# de viviendas por clusters",
        xlab = "Cluster",
        ylab = "Cantidad de viviendas",
        col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
          )

T.Cluster<- table(vivienda_OK$cluster)
Porcentajes <- round(x=prop.table(T.Cluster)*100,digits = 2)

Tabla_Resultado <- data.frame(Valor = names(T.Cluster),
                              Valores = as.vector(T.Cluster),
                              Porcentaje = Porcentajes)
print(Tabla_Resultado)
##   Valor Valores Porcentaje.Var1 Porcentaje.Freq
## 1     1    3389               1           40.74
## 2     2    2759               2           33.17
## 3     3     998               3           12.00
## 4     4    1173               4           14.10

Como se observa en la tabla previa, de un total de 8,319 viviendas en la base de datos, 3,389 (40.74%) están ubicadas en el cluster 2, mientras que 2,759 (33.17%) se encuentran en el cluster 4. El restante 26% está distribuido entre el cluster 1 y cluster 3, siendo el cluster 3 el de de menor representación con 12%.

Cluster_Zona <- table(vivienda_OK$cluster, vivienda_OK$zona)

barplot(Cluster_Zona,
        main= "Cluster por Zona",
        ylab = "Cantidad de viviendas",
        ylim = c(0, 5000),
        legend = rownames(Cluster_Zona),
        args.legend = list(x= "top", horiz = TRUE),
        col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
                )

# Tabla Viviendas por cluster y Zona
Num_Viv_cluster <- print(table(vivienda_OK$cluster, vivienda_OK$zona))
##    
##     Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   1           5        745        654            0     1985
##   2          70        803        110          200     1576
##   3          49        233         52          149      515
##   4           0        139        382            2      650
print ('Total')
## [1] "Total"
print(table(vivienda_OK$zona))
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##          124         1920         1198          351         4726
#Tabla % Vivienda por cluster y Zona
Tabla_porc_vivienda_cluster <- round(x= table(vivienda_OK$cluster, vivienda_OK$zona)%>%
 prop.table(.,2)*100, digits = 2)

print(Tabla_porc_vivienda_cluster)
##    
##     Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   1        4.03      38.80      54.59         0.00    42.00
##   2       56.45      41.82       9.18        56.98    33.35
##   3       39.52      12.14       4.34        42.45    10.90
##   4        0.00       7.24      31.89         0.57    13.75

Como se nota en la gráfica la ZOna es es la zona predominante en la presencia de viviendas para la ciudad de Cali, * ZOna Centro: De las 124 viviendas que se encuentran en esta zona el 56.45% se ecuentran clasificadas en el cluster 4, y el 39.5% en el cluster #3

  • ZOna Norte: En esta zona se encuentran 1920 viviendas, de las cuales se encuentran distribuidas con mayor presencia en los clusters #2 y #4, con un 38.8% y 41.8% respectivamente

  • Zona Oeste: En esta zona se tienen 1198 viviendas con un 54.59 de las viviendas en el cluster #2 y con un 31.89% en el cluster #1

  • Zona Oriente: De las 351 viviendas que se encuentran en esta zona, se tiene una distribución del 56.98% para el cluster #4 y 42.45% para el culster #3

  • ZOna Sur: Esta es la zona con más presencia de viviendas con un total de 4720 viviendas, de las cuales el 42% se encuentran segmentadas en el cluster #2 y el 33.35% en el cluster #4.

Cluster_Estrato <- table(vivienda_OK$cluster, vivienda_OK$estrato)

barplot(Cluster_Estrato,
        main= "Cluster por Estrato",
        ylab = "Cantidad de viviendas",
        ylim = c(0, 3500),
        legend = rownames(Cluster_Zona),
        args.legend = list(x= "top", horiz = TRUE),
        col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
                )

# Tabla Viviendas por cluster y Estrato
table(vivienda_OK$cluster, vivienda_OK$estrato)
/ 3 4 5 6
1 1 165 2194 1029
2 1091 1628 40 0
3 358 320 311 9
4 3 16 205 949
#Tabla % Vivienda por cluster y Estrato
round(x= table(vivienda_OK$cluster, vivienda_OK$estrato)%>%
 prop.table(.,2)*100, digits = 2)
/ 3 4 5 6
1 0.07 7.75 79.78 51.79
2 75.09 76.47 1.45 0.00
3 24.64 15.03 11.31 0.45
4 0.21 0.75 7.45 47.76

Se puede observar las características de cada uno de los clusters predominantes.

  • CLuster #2: Es un cluster que tiene mayor predominancia en estratos altos de la ciudad de Cali, es decir, para los estratos 5 y 6

  • Cluster #4: En este cluster tiene predominancia en presencia para los estratos medios altos.

Recomendaciones:

El cluster número dos parece estar relacionado con características que pertenecen a grupos socioeconómicos superiores en la ciudad de Cali. La empresa podría enfocarse en este grupo de personas para vender productos o servicios específicos que satisfagan sus necesidades y preferencias, como seguridad, comodidades de lujo y un estilo de vida sofisticado.

El cluster número tres, por otro lado, la mayoría de las propiedades del cluter #4 pertenecen a estratos medios altos. La empresa podría adaptar sus estrategias de marketing para este grupo ofreciendo opciones de vivienda que se ajusten a las necesidades de aquellos que buscan un nivel de vida cómodo y accesible, pero con ciertas comodidades y prestigio asociados con los estratos medios altos.

2.2 Análisis de correspondencia:

Examinar la relación entre las variables categóricas (tipo de vivienda, zona y estrato), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.

El análisis de es una herramienta estadistica fundamental para exploarar las relaciones que existen entre variables categóricas. Este método nos permite examinar cómo las variables como la zona y el estrato se relacionan entre sí. Podemos visualizar y comprender mejor los patrones de comportamiento subyacentes en el mercado inmobiliario al crear una tabla cruzada que relaciona la zona y el estrato con estas variables. Esto nos permite tomar decisiones más informadas y estratégicas.

No se tienen en cuenta las variables categoricas como el barrio por su alto # de variables unicas y el tipo de vivienda por su poca variabilidad solo dos variables.

Lo primero que se realiza es la creación de la tabla:

#Tabla Analisis Correspondencia

Zona <- vivienda_OK$zona
Estrato <- vivienda_OK$estrato

Tabla_Zona_Estrato <- table(Zona, Estrato)

print(Tabla_Zona_Estrato)
##               Estrato
## Zona              3    4    5    6
##   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 1685 1043

Para evaluar la independencia de las variables se aplica el test de chi-cuadrado

chisq.test(Tabla_Zona_Estrato)
## 
##  Pearson's Chi-squared test
## 
## data:  Tabla_Zona_Estrato
## X-squared = 3830.4, df = 12, p-value < 2.2e-16

Dado el valor del test se puede concluir que existe una realación significativa entre las variables zona y el estrato, es decir que se descarta independencia.

library(FactoMineR)
CA_Grafico <- CA(Tabla_Zona_Estrato)

Este análisis revela una relación notable y una presencia predominante entre la zona Oeste y el estrato 6. Además, se observa una asociación marcada entre el estrato 5 y el estrato 4 en las zonas Sur y Norte. Aunque la relación entre la zona Oriente y Centro con el estrato 3 no es tan pronunciada como las anteriores, aún se evidencia una conexión significativa.Este patrón indica una distribución geográfica específica de los estratos socioeconómicos en la ciudad, con áreas específicas que tienden a albergar ciertos estratos con mayor frecuencia que otros.