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.

#devtools::install_github("centromagis/paqueteMODELOS") #descarga paquete
library(paqueteMODELOS)
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>

Descripción de la base de datos

La base de datos de Viviendas contiene 13 variables de las cuales 9 son de tipo numérico y 4 son categoricas. La base de datos contiene 8322 registros.

Retos

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.

Antes de iniciar con el desarrollo del reto, a través de la opción “Summary”, se obtienen las medidas de centralidad de cada una de las 13 variables, con sus valores máximos, mínimos, media aritmética, mediana; al igual que las medidas de dispersión.

##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        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  
##  NA's   :3                                            NA's   :3      
##     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 : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   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  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        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  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

Observaciones:

La base de datos tiene una cantidad considerable de valores nulos en la variable “parqueaderos” (1605 valores nulos).

Las variables “zona”, “piso”, “tipo” y “barrio” son de tipo carácter y no se resumen con medidas estadísticas, por lo que se indica solo su longitud.

Las variables numéricas como “preciom” y “areaconst” presentan una amplia variabilidad, lo cual es esperado en datos de bienes raíces.

Las coordenadas de longitud y latitud tienen un rango relativamente pequeño, lo que sugiere que los datos están geográficamente concentrados y puede que no aporten información significativa al análisis.

Por otra parte, la variable ID guarda un consecutivo de los registros y no aporta información relevante sobre las características o la relación entre los datos y sobre las propiedades de las viviendas.

Se procede entonces con el borrado de las variables id, longitud y latitud.

## # A tibble: 5 × 11
##      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
## # ℹ 2 more variables: tipo <chr>, barrio <chr>

Tratmiento de datos faltantes.

##                  variable faltantes
## id                     id         0
## zona                 zona         0
## piso                 piso      2635
## estrato           estrato         0
## preciom           preciom         0
## areaconst       areaconst         0
## parqueaderos parqueaderos      1602
## banios             banios         0
## habitaciones habitaciones         0
## tipo                 tipo         0
## barrio             barrio         0

Para tener una mejor visualización de los datos faltantes se construye el siguiente gráfico.

## Warning: package 'naniar' was built under R version 4.3.3

En este punto, se debe dar tratamiento a los datos faltantes de las variables piso y parqueaderos. Estos datos faltantes representan aproximadamente el 31.6% (piso) y el 19.2% (parqueaderos) del set de datos.

Al ser cada uno mayor al 15% de los datos registrados se puede considerar un conjunto de datos significativos, se procederá a imputar mediante el metodo del promedio partiendo del supuesto que los valores faltantes están distribuidos aleatoriamente y así evitar el sesgo.

##                  variable faltantes
## id                     id         0
## zona                 zona         0
## piso                 piso         0
## estrato           estrato         0
## preciom           preciom         0
## areaconst       areaconst         0
## parqueaderos parqueaderos         0
## banios             banios         0
## habitaciones habitaciones         0
## tipo                 tipo         0
## barrio             barrio         0

Ya con el set de datos sin faltantes se realiza un análisis de los datos que permitan comprender mejor la información contenida, como por ejemplo, la relación entre las zonas con los estratos socieconómicos y con el tipo de inmueble (Apartamento y Casa), entre otras.

Distribución por zonas

Según el diagráma circular, se visualiza que los registros de los inmuebles de la inmobialiraria en la Zona Sur de la ciudad representan el 56.8%, en la Zona Norte el 23.1%, en la Zona Oeste el 14.4%, 4.2% para la Zona Oriente y con la menor proporción de inmuebles para la Zona Centro con un 1.5%

Distribución por tipo de inmueble

##   Tipo de inmueble Total
## 1      Apartamento  5100
## 2             Casa  3219

En cuánto al tipo de inmueble, se tienen 5100 apartamentos y 3219 casas.

Distribución por estrato

En la distribución de los estratos socieconómicos de los inmubles de la inmobiliaria, se observa que el estrato 5 tiene la mayor representacipión con un 33.6%, el estrato 4 un 25.59%, el estrato 6 un 23.89% y con una menor representación el estrato 3 con un 17.47%.

Distribución de los inmuebles por zona en relación al precio

En el diagrama de BoxPlot, se puede inferir que en la Zona Norte, Zona Sur y Zona Oeste se encuentran los inmuebles con mayor costo, para la Zona Oriente y para la Zona Centro ocurre que los precios de las casas y los apartamentos se encuentran en precios menores a mil millones de pesos.

Distribución de los inmuebles por estrato en relación al precio

Como es de esperarse, a menor estrato, menor precio y viceversa.

Distribución de los inmuebles por tipo de inmueble en relación al precio

El gráfico muestra que, los inmuebles de tipo casa tienen un mayor precio en comparacion con los apartamentos.

Distribución de los inmuebles por tipo de inmueble en relación a la zona de ubicación

table_iz <- table(data_vivienda$tipo, data_vivienda$zona)
table_iz
##              
##               Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   Apartamento          24       1198       1029           62     2787
##   Casa                100        722        169          289     1939
barplot(table_iz, main="Inmuebles por zona", xlab = "Zonas", ylab = "Catidad de inmuebles", col = c("royalblue","grey"))
legend(x = "topleft", legend = c("Apartamento", "Casa"), fill = c("royalblue", "grey"), 
       title = "Tipo de Inmueble")

Del gráfico anterior se puede establecer que la zona sur es aquella en donde hay una mayor concentración de inmuebles con 2787 apartamentos y 1939 casas, seguido de la zona norte en donde hay total de 1922 propiedades de las cuales 1198 son apartamentos y 722 casas. El tercer lugar lo ocupa la zona oeste con 1029 apartamentos y 169 casas y por último se encuentra la zona centro con 100 casas y 24 apartamentos.

Ahora bien, se observa que en las zonas mencionadas anteriormente predomina el número de apartamentos sobre el número de casas a excepcion de la zona centro y oriente.

Distribución de los inmuebles en relación con el estrato

table_ie <- table(data_vivienda$tipo, data_vivienda$estrato)
table_ie
##              
##                  3    4    5    6
##   Apartamento  639 1404 1766 1291
##   Casa         814  725  984  696
barplot(table_ie, main="Inmuebles por estrato", xlab = "Estrato", ylab = "Catidad de inmuebles", col = c("royalblue","grey"))
legend(x = "topleft", legend = c("Apartamento", "Casa"), fill = c("royalblue", "grey"), 
       title = "Tipo de Inmueble")

Con respecto a la variable estrato, inicialmente no hay información para estratos 1 y 2.

Distribución de los inmuebles por rango de precios

orden_prec <- sort(data_vivienda$preciom)
nointervalos <- nclass.Sturges(orden_prec) 
tabla.intervalos <- transform(table(cut(orden_prec, breaks = nointervalos))) 
inmueble.precio=cut(data_vivienda$preciom, tabla.intervalos$Freq)
table_ip <- table(data_vivienda$tipo, inmueble.precio, useNA ='always')
table_ip2 <- table(inmueble.precio, data_vivienda$tipo, useNA ='always')
table_ip2
##                      
## inmueble.precio       Apartamento Casa <NA>
##   (16,33]                       0    0    0
##   (33,41]                       0    0    0
##   (41,71]                      10    0    0
##   (71,74]                       3    0    0
##   (74,105]                    166   16    0
##   (105,121]                   205   17    0
##   (121,173]                   868  172    0
##   (173,286]                  1400  514    0
##   (286,313]                   331  143    0
##   (313,652]                  1497 1532    0
##   (652,884]                   278  368    0
##   (884,1.65e+03]              315  403    0
##   (1.65e+03,1.66e+03]           0    0    0
##   (1.66e+03,2.24e+03]          27   54    0
##   <NA>                          0    0    0
barplot(table_ip, main = "Distribucion de inmuebles por rango de precios", col =c("red","grey"), xlab = "Rango de precios en millones", ylab = "Numero de Inmuebles")
legend(x = "topleft", legend = c("Apartamento", "Casa"), fill = c("red", "grey"), 
       title = "Tipo de Inmueble")

Los precios de los inmuebles con mayor número de concentración oscilan entre los 105 millones y los 884 millones.

Hay muy pocos inmuebles que superan los 900 millones de pesos.

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.

En el análisis de componentes principales o ACP, es necesario conocer la correlación de las variables, para este caso de precio, estrato, areaconst, habitaciones, banios, parqueaderos.

library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## The following object is masked from 'package:boot':
## 
##     logit
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.92 loaded
columnas_seleccionadas <- data_vivienda[, c("preciom","estrato", "areaconst", "habitaciones", "banios","parqueaderos")]
correlacion<-round(cor(columnas_seleccionadas), 1)
corrplot(correlacion, method="number", type="upper")

La gráfica indica una fuerte correlación entre las variables número de baños, el área construída y el precio del inmueble.

Las variables parqueadero y el estrato también estan correlacionadas en menor porcentaje.

Para realizar el análisis decomponentes principales, es necesario que los datos a tratar sean numéricos. Si hay variables categóricas, deben convertirse a números.

En este caso, convertimos las zonas a variables númericas.

library(dplyr)
data_vivienda <- data_vivienda %>% mutate(zona = case_when(
  zona == "Zona Centro" ~ 1,
  zona == "Zona Norte" ~ 2,
  zona == "Zona Oeste" ~ 3,
  zona == "Zona Oriente" ~ 4,
  zona == "Zona Sur" ~ 5,
  TRUE ~ as.numeric(as.character(zona))
))
print(class(data_vivienda$zona))
## [1] "numeric"
## # A tibble: 3 × 11
##      id  zona  piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <dbl> <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147     4  3.77       3     250        70            1      3            6
## 2  1169     4  3.77       3     320       120            1      2            3
## 3  1350     4  3.77       3     350       220            2      2            4
## # ℹ 2 more variables: tipo <chr>, barrio <chr>

Una vez las variables de la base de datos estan de tipo numericas se procede como sigue:

## # A tibble: 5 × 8
##    zona  piso estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1     4  3.77       3     250        70            1      3            6
## 2     4  3.77       3     320       120            1      2            3
## 3     4  3.77       3     350       220            2      2            4
## 4     5  2          4     400       280            3      5            3
## 5     2  1          5     260        90            1      2            3

Posteriormente se debe realizar el proceso de estandarización de variables, para tener escaladas las variables y que esten cercanas sus medias aritméticas a 0 y su desviación estándar a 1.

library(tidyverse)
## Warning: package 'readr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()     masks ggplot2::%+%()
## ✖ psych::alpha()   masks ggplot2::alpha()
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter()  masks 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
vivienda_std= data_vivienda_pca %>%
  scale()
head(vivienda_std)
##             zona       piso    estrato    preciom  areaconst parqueaderos
## [1,]  0.06192582  0.0000000 -1.5872276 -0.5595498 -0.7339949   -0.8262744
## [2,]  0.06192582  0.0000000 -1.5872276 -0.3465670 -0.3842568   -0.8262744
## [3,]  0.06192582  0.0000000 -1.5872276 -0.2552886  0.3152194    0.1630456
## [4,]  0.81508501 -0.8193786 -0.6156201 -0.1031580  0.7349051    1.1523656
## [5,] -1.44439256 -1.2820597  0.3559875 -0.5291236 -0.5940997   -0.8262744
## [6,] -1.44439256 -1.2820597  0.3559875 -0.5899759 -0.6150839   -0.8262744
##           banios habitaciones
## [1,] -0.07793773    1.6406840
## [2,] -0.77811479   -0.4147626
## [3,] -0.77811479    0.2703863
## [4,]  1.32241640   -0.4147626
## [5,] -0.77811479   -0.4147626
## [6,] -0.07793773   -0.4147626

Teniendo la estandarización de variables, se calculan los componentes principales para cada una.

prcomp(vivienda_std)
## Standard deviations (1, .., p=8):
## [1] 1.8445790 1.1596875 1.0162093 0.9211011 0.7543638 0.6183770 0.4864469
## [8] 0.4283215
## 
## Rotation (n x k) = (8 x 8):
##                      PC1         PC2           PC3         PC4         PC5
## zona         -0.04159405  0.04631784  0.9317185583  0.29272372  0.18209694
## piso          0.07239413  0.52601536 -0.3074032491  0.75456639  0.21943516
## estrato      -0.30231083  0.56346664  0.1414515270 -0.16640945 -0.50658652
## preciom      -0.47558262  0.23206986 -0.0517047401 -0.11557782 -0.01653358
## areaconst    -0.45470196 -0.17189472 -0.0829479873  0.01517301  0.09189395
## parqueaderos -0.39850120  0.10230987 -0.0467295261 -0.24264918  0.74773632
## banios       -0.46798574 -0.08869583 -0.0003536356  0.22303795 -0.26944188
## habitaciones -0.30148073 -0.54948100 -0.0752177744  0.44163025 -0.14708034
##                      PC6          PC7         PC8
## zona         -0.08692581  0.006215133 -0.03979860
## piso         -0.06510704 -0.028391549  0.03166925
## estrato       0.20987797 -0.443944620  0.21365249
## preciom      -0.25742981  0.166662051 -0.78077746
## areaconst    -0.72868520 -0.183947674  0.42816396
## parqueaderos  0.42500749 -0.111296725  0.13243594
## banios        0.27702606  0.700151342  0.28952044
## habitaciones  0.29921427 -0.487705462 -0.23972187

Se ejecuta la matriz de correlaciones para calcular la relación de las componentes estandarizadas.

##                      zona        piso     estrato     preciom    areaconst
## zona          1.000000000 -0.06122240  0.11097057  0.01609820  0.007948296
## piso         -0.061222404  1.00000000  0.10844710 -0.01186324 -0.164218775
## estrato       0.110970570  0.10844710  1.00000000  0.60980664  0.274323323
## preciom       0.016098198 -0.01186324  0.60980664  1.00000000  0.687351963
## areaconst     0.007948296 -0.16421878  0.27432332  0.68735196  1.000000000
## parqueaderos  0.019771642 -0.08198228  0.35029642  0.63082596  0.529677144
## banios        0.077544475 -0.07868405  0.42032178  0.66914558  0.648416477
## habitaciones  0.021593137 -0.18030170 -0.07137615  0.26409121  0.516912916
##              parqueaderos      banios habitaciones
## zona           0.01977164  0.07754447   0.02159314
## piso          -0.08198228 -0.07868405  -0.18030170
## estrato        0.35029642  0.42032178  -0.07137615
## preciom        0.63082596  0.66914558   0.26409121
## areaconst      0.52967714  0.64841648   0.51691292
## parqueaderos   1.00000000  0.49539954   0.23894397
## banios         0.49539954  1.00000000   0.58990641
## habitaciones   0.23894397  0.58990641   1.00000000

Posterior a esto, se cálcula el número de componentes con la libreria factoextra

library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
res.pca <- prcomp(vivienda_std)
fviz_eig(res.pca, addlabels = TRUE)

library(psych)
scree(vivienda_std,main ="Grafico de Sedimentacion")

De acuerdo con el gráfico de sedimentación, se recomienda que se tomen los componentes que esten por encima de la línea aceptable, en este caso serían 3 componentes que representan el 72.2% de la base de datos.

Con la Matriz de rotación varimax se espera que cada variable sea representativa en solo una de ellas, con el fin de minimizar al máximo el número de variables dentro de cada factor.

library(stats) 
factanal(vivienda_std, factors = 3, rotation = "varimax")
## 
## Call:
## factanal(x = vivienda_std, factors = 3, rotation = "varimax")
## 
## Uniquenesses:
##         zona         piso      estrato      preciom    areaconst parqueaderos 
##        0.963        0.928        0.286        0.105        0.296        0.538 
##       banios habitaciones 
##        0.222        0.232 
## 
## Loadings:
##              Factor1 Factor2 Factor3
## zona                          0.192 
## piso                 -0.240   0.118 
## estrato       0.626  -0.318   0.470 
## preciom       0.938                 
## areaconst     0.701   0.458         
## parqueaderos  0.664   0.144         
## banios        0.639   0.482   0.371 
## habitaciones  0.199   0.840   0.154 
## 
##                Factor1 Factor2 Factor3
## SS loadings      2.653   1.332   0.445
## Proportion Var   0.332   0.167   0.056
## Cumulative Var   0.332   0.498   0.554
## 
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 185.32 on 7 degrees of freedom.
## The p-value is 1.47e-36

Factores Identificados:

Factor 1 que representa el 42.5%. Parece estar relacionado con variables de tamaño y valor (estrato, preciom, areaconst, parqueaderos, banios).

Factor 2 que representa el 16.8%. Está más relacionado con la distribución interna de la vivienda (habitaciones, areaconst, banios).

Factor 3 que representa el 12.9%. No tiene una interpretación clara ya que los loadings son bajos en general, indicando que podría no ser un factor significativo.

Variables Explicadas:

Las variables “preciom”, “areaconst”, y “banios” están bien explicadas por los factores, mientras que “zona” y “piso” no lo están.

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.

El Análisis de Conglomerados (también conocido como Clustering) es una técnica de aprendizaje no supervisado utilizada para agrupar un conjunto de objetos en grupos, de tal manera que los objetos dentro de un mismo grupo (o clúster) sean más similares entre sí que aquellos en diferentes grupos

## # A tibble: 8,319 × 8
##     zona  piso estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1     4  3.77       3     250        70            1      3            6
##  2     4  3.77       3     320       120            1      2            3
##  3     4  3.77       3     350       220            2      2            4
##  4     5  2          4     400       280            3      5            3
##  5     2  1          5     260        90            1      2            3
##  6     2  1          5     240        87            1      3            3
##  7     2  1          4     220        52            2      2            3
##  8     2  1          5     310       137            2      3            4
##  9     2  2          5     320       150            2      4            6
## 10     2  2          5     780       380            2      3            3
## # ℹ 8,309 more rows
vivienda_Cluster <- scale(vivienda_Cluster)
vivienda_Cluster <- as.data.frame(vivienda_Cluster)
head(vivienda_Cluster)
##          zona       piso    estrato    preciom  areaconst parqueaderos
## 1  0.06192582  0.0000000 -1.5872276 -0.5595498 -0.7339949   -0.8262744
## 2  0.06192582  0.0000000 -1.5872276 -0.3465670 -0.3842568   -0.8262744
## 3  0.06192582  0.0000000 -1.5872276 -0.2552886  0.3152194    0.1630456
## 4  0.81508501 -0.8193786 -0.6156201 -0.1031580  0.7349051    1.1523656
## 5 -1.44439256 -1.2820597  0.3559875 -0.5291236 -0.5940997   -0.8262744
## 6 -1.44439256 -1.2820597  0.3559875 -0.5899759 -0.6150839   -0.8262744
##        banios habitaciones
## 1 -0.07793773    1.6406840
## 2 -0.77811479   -0.4147626
## 3 -0.77811479    0.2703863
## 4  1.32241640   -0.4147626
## 5 -0.77811479   -0.4147626
## 6 -0.07793773   -0.4147626

Evaluación del número del cluster, por diferentes métodos:

a) Usando el criterio del Gráfico de Silueta: Utiliza el criterio del gráfico que reduce el número de cluster.

set.seed(123)
fviz_nbclust(vivienda_Cluster, kmeans, method = "silhouette") +
  labs(subtitle = "Silhouette method")

Segun el grafico, deberían hacerse 2 cluster para agrupamiento que involucren las características del las zonas de la ciudad en relación a las ofertas inmobiliarias

b) Usando el criterio de Suma de Cuadrados dentro de clusters.

set.seed(123)
wss <- numeric()
for(h in 1:10){
  b<-kmeans(vivienda_Cluster,h)
  wss[h]<-b$tot.withinss #scintra
}
wss 
##  [1] 66544.00 47649.23 41998.76 37095.22 32473.81 28908.44 27745.76 25365.97
##  [9] 24233.52 23497.22
wss1 <- data.frame(cluster=c(1:10),wss)
wss1
##    cluster      wss
## 1        1 66544.00
## 2        2 47649.23
## 3        3 41998.76
## 4        4 37095.22
## 5        5 32473.81
## 6        6 28908.44
## 7        7 27745.76
## 8        8 25365.97
## 9        9 24233.52
## 10      10 23497.22
ggplot(wss1) + aes(cluster,wss) + geom_line(color="blue") + 
  geom_point(color="blue") +
  geom_vline(xintercept = 3, linetype = 2, col="red") +
  labs(title = "Método Elbow") + 
  scale_x_continuous(breaks=1:10) +
  theme_classic()

Según este método se deben tener 3 cluster para agrupar las propiedades y similitudes de la oferta inmobiliaria con base a la ubicación de las zonas de la ciudad.

c) Usando Método de particion: K-means: Para el método de K-means, se realiza la división del conjunto de datos inicial en K clústeres distintos y garantizando que ningún registro se sobreponga sobre otro o solo pertenezca a un solo clúster.

set.seed(123)
km <- kmeans(vivienda_Cluster, 
             centers=3,      # Número de Cluster
             iter.max = 100, # Número de iteraciones máxima
             nstart = 1,     # Número de puntos iniciales 
             algorithm = "Lloyd")
sample(km$cluster, 10)
##  [1] 2 2 1 1 2 1 2 1 2 3
clusters1 = km$cluster
km$size
## [1] 2379 4951  989
# Visualización de las soluciones usando ACP
library(factoextra)
fviz_cluster(km,data=vivienda_Cluster,ellipse.type = "convex") + 
  theme_classic()

Con este tipo de gráficos, se sustentan los análisis realizados por medio de los métodos expuestos, en donde aconsejan que se agrupen los datos de las ofertas inmobiliarias en 3 Clúster, esto con la finalidad de que puedan tener propiedades similares entre cada uno de estos y sea más estructurado el análisis por grupos.

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

El Análisis de Correspondencia (AC) es una técnica estadística multivariante utilizada para explorar y visualizar las relaciones entre variables categóricas en una tabla de contingencia. Es particularmente útil para analizar tablas grandes con muchas categorías y para encontrar asociaciones entre filas y columnas.

Para identificar estos patrones, se hará con la variable zona y estrato socieconómico con el propósito de verificar su relación de dependencia.

vivienda_corr <- data_vivienda[, c(2, 4)]
head(vivienda_corr,5)
## # A tibble: 5 × 2
##    zona estrato
##   <dbl>   <dbl>
## 1     4       3
## 2     4       3
## 3     4       3
## 4     5       4
## 5     2       5
library(FactoMineR) 
## Warning: package 'FactoMineR' was built under R version 4.3.3
tabla <- table(data_vivienda$zona, data_vivienda$estrato)
tabla 
##    
##        3    4    5    6
##   1  105   14    4    1
##   2  572  407  769  172
##   3   54   84  290  770
##   4  340    8    2    1
##   5  382 1616 1685 1043

Posterioremente se realizar una prueba de independencia, identificando si realmente existen asociaciones entre las categorías con respecto a la zona residencial y las categorías del estrato socioeconómico,

Se procede a comprobar esta hipótesis con la prueba de independencia Ji cuadrado, la cuál se ilustra a continuación:

## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
## [1] 9.487729

El estadístico de prueba tiene un valor es de 3830.4 resulta ser mayor al estadístico de contraste (9.487), esto quiere decir que existe suficiente evidencia estadística para rechazar la hipótesis nula y aceptar la alterna que indica presencia de asociaciones entre las zonas residencial y el estrato socieconomico, por lo tanto, resulta conveniente hacer uso de la técnica de correspondencia simple.

ACS <- CA(tabla, graph = FALSE)
#% de varianza explicado 
  valores_propios=ACS$eig; valores_propios
##       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
#Gráfica del porcentaje de varianza explicado
library(factoextra) 
fviz_screeplot(ACS, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
  ylab("Porcentaje de varianza explicado") + xlab("Ejes")

Se hará uso de los ejes obtenidos, para este caso 3, los que representan el 100% de la muestra.

fviz_ca_biplot(ACS, repel = TRUE)+ggtitle("")+ylab("Eje 2(27.7%)")+xlab("Eje 1(70)")+ylim(-0.6,1.6)+xlim(-1.2,1.5)

De la gráfica de representación simultánea se puede observar que hay una relación entre la Zona Residencial Sur (5) y los estratos socioeconómicos 4 y 5. Esto sugiere que los inmuebles en esta zona tienen características que corresponden a estos estratos, influyendo directamente en el área construida y en el valor de las propiedades.

De manera similar, en la Zona Residencial Oeste (3), se encuentra predominantemente el estrato socioeconómico 6, debido a características constructivas como el número de baños, habitaciones, así como el área construida y el precio. Estas dos zonas son donde los inmuebles son más costosos en comparación con otras zonas residenciales y los estratos socioeconómicos por debajo de 4.

Por lo tanto, se concluye que existe una relación de dependencia entre la zona residencial y el estrato socioeconómico. Es decir, los estratos socioeconómicos más altos se encuentran en las zonas residenciales más costosas o donde los inmuebles tienen un valor más elevado en promedio.

Con esto en mente, las decisiones estratégicas que debe tomar la inmobiliaria deberían alinearse con la relación de dependencia entre el estrato socioeconómico y las zonas residenciales. Esto incluye considerar el área construida y el precio de los inmuebles. La finalidad es optimizar la inversión en las zonas residenciales con estratos socioeconómicos por encima de 3, ya que son los que tienen mejores garantías en ventas. Sin embargo, también es importante no subestimar el potencial de los estratos socioeconómicos 3 en la Zona Norte, que pueden convertirse en áreas estratégicas para la venta de inmuebles a precios intermedios para los estratos medios de la ciudad.