Informe Actividad 1: Evaluación de la oferta inmobiliaria urbana

Importación de Datos

library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Warning: package 'broom' was built under R version 4.3.1
## Loading required package: GGally
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: gridExtra
## Warning: package 'gridExtra' was built under R version 4.3.1
## Loading required package: knitr
## Warning: package 'knitr' was built under R version 4.3.2
## Loading required package: summarytools
## Warning: package 'summarytools' was built under R version 4.3.1
data(vivienda)
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>

Reto

El reto principal consiste en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano.

Análisis Exploratorio Inicial

Se cuantifican datos faltantes o NA

faltantes <- colSums(is.na(vivienda))
faltantes
##           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

Visualización de datos faltantes

library(naniar)
## Warning: package 'naniar' was built under R version 4.3.1
gg_miss_var(vivienda)

library(mice)
## Warning: package 'mice' was built under R version 4.3.1
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
grafico <-md.pattern(vivienda, rotate.names = TRUE)

De la última visualización se obtiene que existen 2 registros con sólo valores nulos y un registro que tiene solamente el precio, por lo anterior, se hace necesario eliminar esos 3 registros

vivienda <- vivienda %>%
  filter(id != "NA")
# Se vuelve a graficar para verificar el borrado de registros
grafico <-md.pattern(vivienda, rotate.names = TRUE)

Se realiza imputación de datos reemplazando los valores nulos por la moda

moda_parqueaderos <- as.numeric(names(sort(table(vivienda$parqueaderos), decreasing = TRUE)[1]))
moda_parqueaderos
## [1] 1
moda_piso <- as.numeric(names(sort(table(vivienda$piso), decreasing = TRUE)[1]))
moda_piso
## [1] 2
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- moda_parqueaderos
vivienda$piso[is.na(vivienda$piso)] <- moda_piso

# Se grafica de nuevo para verificar la noexistencia de valores nulos
grafico <-md.pattern(vivienda, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

Resumen de Análisis exploratorio

summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8319        Length:8319        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         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.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 1.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.674   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.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:8319        Length:8319        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.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498
# Se revisa el tipo de dato de la columna "piso" y se cambia a numérico
print(class(vivienda$piso))
## [1] "character"
vivienda$piso <- as.numeric(vivienda$piso)
print(class(vivienda$piso))
## [1] "numeric"
str(vivienda)
## spc_tbl_ [8,319 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8319] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8319] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : num [1:8319] 2 2 2 2 1 1 1 1 2 2 ...
##  $ estrato     : num [1:8319] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8319] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8319] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8319] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8319] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8319] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8319] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8319] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8319] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8319] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>

Análisis de Componentes Principales

Se convierten las variables categóricas usando one-hot encoding

encoded_zona <- as.data.frame(model.matrix(~ zona - 1, data = vivienda))
encoded_tipo <- as.data.frame(model.matrix(~ tipo - 1, data = vivienda))
encoded_vivienda <- cbind(vivienda, encoded_tipo, encoded_zona)

Se crea un nuevo Set de Datos con los atributos numéricos que harán parte del PCA

vivienda_num <- data.frame(encoded_vivienda[c("preciom", "areaconst", "piso", "estrato", "parqueaderos", "banios", "habitaciones", "tipoApartamento", "tipoCasa", "zonaZona Centro", "zonaZona Norte", "zonaZona Oeste", "zonaZona Oriente", "zonaZona Sur")])

Se estandarizan los datos

vivienda_numZ= as.data.frame(scale(vivienda_num))      

Se realiza la Estimación de Componentes Principales

library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
prcomp(vivienda_numZ)
## Standard deviations (1, .., p=14):
##  [1] 2.047198e+00 1.601823e+00 1.308569e+00 1.076836e+00 1.010984e+00
##  [6] 9.468369e-01 8.088197e-01 7.656961e-01 6.545454e-01 6.069396e-01
## [11] 4.879161e-01 4.210435e-01 2.211818e-15 6.755511e-16
## 
## Rotation (n x k) = (14 x 14):
##                          PC1         PC2           PC3          PC4
## preciom           0.36624501  0.31409609  0.0767100804  0.011496294
## areaconst         0.41603834  0.02904697  0.0745590177  0.046551216
## piso             -0.14147821  0.25725638  0.0129539949 -0.007900327
## estrato           0.17276331  0.47922969 -0.0497144492  0.093870019
## parqueaderos      0.32227602  0.24800324  0.0004322952  0.078056377
## banios            0.40485457  0.12413314  0.0115216927  0.028743365
## habitaciones      0.32547918 -0.20798470  0.0431994404 -0.087562569
## tipoApartamento  -0.36074823  0.34711906  0.0199570403 -0.035052521
## tipoCasa          0.36074823 -0.34711906 -0.0199570403  0.035052521
## zonaZona.Centro   0.01453309 -0.14252486  0.0787266773 -0.230270821
## zonaZona.Norte   -0.07903949 -0.13840075  0.5186115175  0.622174629
## zonaZona.Oeste    0.02981721  0.35445180  0.3400235429 -0.470286093
## zonaZona.Oriente  0.01970038 -0.27960387  0.1375909452 -0.550847581
## zonaZona.Sur      0.03454707  0.01482973 -0.7572439603  0.083995809
##                           PC5          PC6         PC7          PC8
## preciom           0.013326677  0.013644709  0.19140066  0.028066610
## areaconst        -0.010299394 -0.070942047  0.08623306  0.006859765
## piso             -0.039073607 -0.821545123 -0.10351126  0.474378992
## estrato          -0.008031947  0.137162000  0.05351272  0.011897179
## parqueaderos     -0.019338708 -0.007004573  0.50903825  0.032665071
## banios           -0.017084189 -0.201515416 -0.18521856 -0.291407634
## habitaciones     -0.027042306 -0.341285258 -0.38582975 -0.509116333
## tipoApartamento  -0.012217652 -0.100558132  0.12036135 -0.441665694
## tipoCasa          0.012217652  0.100558132 -0.12036135  0.441665694
## zonaZona.Centro   0.885764908 -0.149733306  0.25507420 -0.055042023
## zonaZona.Norte   -0.050050240 -0.067938531  0.07818130 -0.057579380
## zonaZona.Oeste    0.033129752  0.265088724 -0.42273270  0.165335935
## zonaZona.Oriente -0.456171013 -0.159837593  0.46990453 -0.064582017
## zonaZona.Sur     -0.012462236 -0.028608033 -0.01997311 -0.028537585
##                           PC9         PC10         PC11         PC12
## preciom          -0.115697661  0.285669225  0.202559806 -0.766408892
## areaconst         0.012343753  0.742132711 -0.212797359  0.457738155
## piso              0.007621713 -0.012978447 -0.033661024  0.000331814
## estrato          -0.614544112 -0.319418140 -0.454516027  0.145080406
## parqueaderos      0.636080152 -0.371393595 -0.100468391  0.123711433
## banios           -0.176926398 -0.221087399  0.693944769  0.312822989
## habitaciones      0.150015556 -0.140327820 -0.462181733 -0.245342218
## tipoApartamento   0.060542920  0.151202516  0.014772850  0.034345013
## tipoCasa         -0.060542920 -0.151202516 -0.014772850 -0.034345013
## zonaZona.Centro  -0.133353354 -0.045359399 -0.012248659  0.027368684
## zonaZona.Norte   -0.065254567 -0.042177856 -0.006377742 -0.025470240
## zonaZona.Oeste    0.225765949 -0.001352193 -0.001291759  0.057342959
## zonaZona.Oriente -0.262292114 -0.062984693  0.003086996  0.021478019
## zonaZona.Sur      0.034553834  0.073493257  0.008084148 -0.034391187
##                           PC13          PC14
## preciom          -9.962293e-16  1.221420e-16
## areaconst         1.872211e-15 -3.913715e-16
## piso             -1.267490e-16  8.152208e-17
## estrato           5.047862e-16  1.083487e-16
## parqueaderos     -2.727497e-16 -6.921992e-17
## banios            5.469672e-16 -7.143197e-18
## habitaciones     -3.661115e-16 -2.509484e-16
## tipoApartamento  -4.057555e-02  7.059417e-01
## tipoCasa         -4.057555e-02  7.059417e-01
## zonaZona.Centro  -1.560155e-01 -8.967333e-03
## zonaZona.Norte   -5.424866e-01 -3.118061e-02
## zonaZona.Oeste   -4.520445e-01 -2.598226e-02
## zonaZona.Oriente -2.588276e-01 -1.487669e-02
## zonaZona.Sur     -6.377607e-01 -3.665671e-02
res.pca <- prcomp(vivienda_numZ)
fviz_eig(res.pca, addlabels = TRUE)

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

### Análisis de Resultados de PCA En este análisis de PCA el primer componente principal (CP) explica el 29.9% de la variabilidad contenida en la base de datos, el segundo CP explica el 18.3%, el CP3 el 12.2%, el cuarto CP el 8.3%, el CP5 el 7.3% y el CP6 el 6.4%, entre estos seis primeros CP se explica más del 80% de la variabilidad de los datos, lo cual indica que se requieren de al menos estos 6 CP para resumir gran parte de la variabilidad que contiene la base de datos. La visualización de las variables en el plano de componentes principales permite identificar que el CP1 está asociado principalmente a los atributos de área construida y número de baños, así como el CP2 está asociado mayormente al estrato y tipo de vivienda. También se puede apreciar en la grafica la relación entre las variables de precio y número de parqueaderos, entre el número de baños y el área construida, y entre el número de habitaciones con las viviendas tipo casa.

Conclusiones del Análisis de PCA

Se requiere para reducir el númer de variables por analizar considerar al menos las primeras 6 componentes principales, con el fin de explicar la variabilidad de los datos con un porcentaje superior al 80%.

Recomendaciones producto del Análisis de PCA para la inmobiliaria

Se recomienda para estimar los precios de las viviendas considerar no sólo la relación esta variable con el estrato, se debe analizar la relación entre con atributos de número de parqueaderos, número de baños y área construida, con el fin de que los precios estimados sean acordes a las características del mercado inmobiliario.

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 agrupar los registros de vivienda considerando la ubicación se selecciona el atributo o campos de zona.

Se convierte la zona a un factor con niveles específicos

vivienda$zona <- factor(vivienda$zona, levels = c("Zona Oriente", "Zona Sur", "Zona Norte", "Zona Oeste", "Zona Centro"))
# Se convierte el factor a numérico 
vivienda$zona_encoded <- as.numeric(vivienda$zona)

Se crea un nuevo Set de Datos con los atributos numéricos que harán parte del análisis de conglomerados

vivienda_clusters <- data.frame(vivienda[c("estrato", "zona_encoded")])
# Se estandarizan los datos
vivienda_clustersZ= as.data.frame(scale(vivienda_clusters))# datos estandarizados
str(vivienda_clustersZ)
## 'data.frame':    8319 obs. of  2 variables:
##  $ estrato     : num  -1.587 -1.587 -1.587 -0.616 0.356 ...
##  $ zona_encoded: num  -1.804 -1.804 -1.804 -0.618 0.567 ...

Distribución de las viviendas por distancias

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.1
## Warning: package 'tidyr' was built under R version 4.3.1
## Warning: package 'readr' was built under R version 4.3.2
## Warning: package 'purrr' was built under R version 4.3.1
## Warning: package 'stringr' was built under R version 4.3.2
## Warning: package 'forcats' was built under R version 4.3.1
## Warning: package 'lubridate' was built under R version 4.3.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter()  masks mice::filter(), stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
## ✖ tibble::view()   masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# distancia euclidiana
dist_viv <- dist(vivienda_clustersZ, method = 'euclidean')
# Cluster jerárquico con el método complete
hc_viv <- hclust(dist_viv, method = 'complete')

Se determina a dónde pertenece cada observación o vivienda. Se toman k = 5 como aproximación con el criterio del número de zonas. Se realiza el ejercicio con k = 4 y k = 6 con fines de comparación de resultados.

cluster_assigments <- cutree(hc_viv, k = 5)
cluster_assigments2 <- cutree(hc_viv, k = 4)
cluster_assigments3 <- cutree(hc_viv, k = 6)

Se asignan los clusters

assigned_cluster <- vivienda_clustersZ %>% mutate(cluster = as.factor(cluster_assigments))
# Gráfico de puntos
ggplot(assigned_cluster, aes(x = estrato, y = zona_encoded, color = cluster)) +
  geom_point(size = 10) +
  geom_text(aes(label = cluster), vjust = -.8) + # Agregar etiquetas del clúster
  theme_classic()

# Dendograma
plot(hc_viv, cex = 0.6, main = "Dendograma de Viviendas", las=1,
     ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_viv, k = 5, border = 2:5)

Clasificación de las viviendas

dendograma <- hclust(dist_viv, method = "average")
grp <- cutree(dendograma, k = 5)

Elección del número de conglomerados

dist_viv <- dist(vivienda_clustersZ, method = "euclidean")
dendograma <- hclust(dist_viv, method = "average")

Índice de Silhouette promedio

library(cluster)
# Para k =5
sil <- silhouette(cluster_assigments, dist(vivienda_clustersZ))
sil_avg <- mean(sil[,3])
sil_avg
## [1] 0.5915985
# Para k =4
sil2 <- silhouette(cluster_assigments2, dist(vivienda_clustersZ))
sil_avg2 <- mean(sil2[,3])
sil_avg2
## [1] 0.5771272
# Para k =6
sil3 <- silhouette(cluster_assigments3, dist(vivienda_clustersZ))
sil_avg3 <- mean(sil3[,3])
sil_avg3
## [1] 0.5598762
# Se imprime el coeficiente de Silhouette promedio para la k con mejor resultado
cat("Coeficiente de Silhouette promedio k=5 : ", sil_avg)
## Coeficiente de Silhouette promedio k=5 :  0.5915985

Análisis de Resultados Conglomerados

De los resultados obtenidos se puede apreciar que el mayor coeficiente de Silhoutte se obtuvo con k = 5, por lo que la mejor agrupación se daría con 5 conglomerados.

Conclusiones del Análisis de Conglomerados

La agrupación de los registros de viviendas para obtener segmentos homogéneos con características similares de estrato y zona se debe realizar con un k = 5.

Recomendaciones producto del Análisis de Conglomerados para la inmobiliaria

Para entender las características del mercado inmobiliario respecto a la relación entre estrato y zona se reocmienda realizar agrupación de los datos, esto con el fin de entender las características que presentan viviendas de diferentes estratos en una misma zona de la ciudad.

Análisis de Correspondencia

Se Examina la relación entre las variables categóricas de estrato y zona, para identificar patrones de comportamiento de la oferta en mercado inmobiliario

library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.2
# Se crea copia del conjunto de datos
vivienda2 = vivienda
# se crea la tabla de contingencia
tabla <- table(vivienda2$zona, vivienda2$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
##               
##                Estrato3 Estrato4 Estrato5 Estrato6
##   Zona Oriente      340        8        2        1
##   Zona Sur          382     1616     1685     1043
##   Zona Norte        572      407      769      172
##   Zona Oeste         54       84      290      770
##   Zona Centro       105       14        4        1

Se aplica Test Chi-cuadrado

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

El resultado indica que se rechaza la hipótesis de independencia de las variables

library(ade4)
## Warning: package 'ade4' was built under R version 4.3.2
## 
## Attaching package: 'ade4'
## The following object is masked from 'package:FactoMineR':
## 
##     reconst
library(factoextra)
library(gridExtra)
resultados_ac <- CA(tabla)

Valores de la varianza acumulada utilizando los valores propios de la matriz de discrepancias

valores_prop <-resultados_ac$eig ; valores_prop
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215213              69.965515                          69.96551
## dim 2 0.12745096              27.680002                          97.64552
## dim 3 0.01084108               2.354483                         100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
  ylab("Porcentaje de varianza explicado") + xlab("Ejes")

Análisis de Resultados de Correspondencia

Del mapa de factores de CA se puede distinguir la ubicación de los estratos por zonas, teniendo que en las zonas norte y sur se presentan los estratos 4 y 5, y en la zona oeste el estrato 6. De los valores propios de la matriz de discrepancias se puede apreciar que la primera componente resume el 70% de la varianza explicada y que los dos primeros ejes explican el 97.7% de los datos.

Conclusiones del Análisis de Correspondencia

El análisis de correspondencia permite validar hipótesis de relaciones entre variables, en este caso, lo ocurrido entre las variables de estrato y zona.

Recomendaciones producto del Análisis de Correspondencia para la inmobiliaria

Se recomienda que las relaciones entre variables o característica ntre viviendas que la inmobiliaria tenga identificadas se validen a través de una análisis de correspondencia.