Introducción

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 exploratorio

#librerías
library(paqueteMODELOS)
library(modeest)
library(dummy)
library(mice)
library(factoextra)

# descargar la data
devtools::install_github("dgonxalex80/paqueteMODELOS")

data(vivienda)

Exploración de los datos

#explorar datos

#Muestra que el dataframe vivienda tiene 8322 observaciones (filas) y 13 variables (columnas)
dimension <- dim(vivienda)
dimension 
## [1] 8322   13
#Muestra que el dataframe vivienda tiene 8322 observaciones (filas) y 13 variables (columnas), muestra los nombres de las variables, los tipos de datos y ejemplos de los valores que contienen.
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>
#se  hace una  copia del dataframe antrs de realizar ajustes
vivienda_df <- vivienda
#observar gráficamente valores nulos
md.pattern(vivienda_df, rotate.names = TRUE)

##      preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
## 4808       1  1    1       1         1      1            1    1      1        1
## 1909       1  1    1       1         1      1            1    1      1        1
## 876        1  1    1       1         1      1            1    1      1        1
## 726        1  1    1       1         1      1            1    1      1        1
## 1          1  0    0       0         0      0            0    0      0        0
## 2          0  0    0       0         0      0            0    0      0        0
##            2  3    3       3         3      3            3    3      3        3
##      latitud parqueaderos piso     
## 4808       1            1    1    0
## 1909       1            1    0    1
## 876        1            0    1    1
## 726        1            0    0    2
## 1          0            0    0   12
## 2          0            0    0   13
##            3         1605 2638 4275
# Verificar cantidad de valores faltantes en cada variable
sapply(vivienda_df, function(x) sum(is.na(x)))
##           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
vivienda_df <- na.omit(vivienda_df)
grafico <-md.pattern(vivienda_df, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

# Verificar cantidad de valores faltantes en cada variable
sapply(vivienda_df, function(x) sum(is.na(x)))
##           id         zona         piso      estrato      preciom    areaconst 
##            0            0            0            0            0            0 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##            0            0            0            0            0            0 
##      latitud 
##            0
dimension <- dim(vivienda_df)
dimension 
## [1] 4808   13
unique(vivienda_df$tipo)
## [1] "Casa"        "Apartamento"

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.

El método de componentes principales (PCA) se utiliza principalmente para analizar variables cuantitativas y reducir la dimensionalidad de los datos. Por lo tanto es necesario no tener en cuenta las variables cualitativas

columnas_chr <- sapply(vivienda_df, is.character)
vivienda_componentes <- vivienda_df[, !columnas_chr]
head(vivienda_componentes)
## # A tibble: 6 × 9
##      id estrato preciom areaconst parqueaderos banios habitaciones longitud
##   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>    <dbl>
## 1  5992       4     400       280            3      5            3    -76.5
## 2  1212       5     260        90            1      2            3    -76.5
## 3  1724       5     240        87            1      3            3    -76.5
## 4  2326       4     220        52            2      2            3    -76.5
## 5  4386       5     310       137            2      3            4    -76.5
## 6  1209       5     320       150            2      4            6    -76.5
## # ℹ 1 more variable: latitud <dbl>

Ahora, se procede a estandarizar las variables cuantitativas con el objetivo de evitar sesgos en las estimaciones:

vivienda_componentes = vivienda_componentes[2:9] %>%
scale()
head(vivienda_componentes)
##         estrato    preciom  areaconst parqueaderos     banios habitaciones
## [1,] -0.9046263 -0.1756310  0.7609789    1.0779092  1.3178809   -0.4241459
## [2,]  0.1749079 -0.6055839 -0.6129041   -0.7415001 -0.9022913   -0.4241459
## [3,]  0.1749079 -0.6670057 -0.6345970   -0.7415001 -0.1622339   -0.4241459
## [4,] -0.9046263 -0.7284276 -0.8876807    0.1682046 -0.9022913   -0.4241459
## [5,]  0.1749079 -0.4520293 -0.2730489    0.1682046 -0.1622339    0.3272519
## [6,]  0.1749079 -0.4213184 -0.1790463    0.1682046  0.5778235    1.8300475
##         longitud    latitud
## [1,] -0.57661599  0.4905916
## [2,]  1.05338647  1.0487875
## [3,]  0.83810312 -1.0336499
## [4,]  0.66956702  0.2867835
## [5,] -0.02610573 -0.7243192
## [6,]  1.05892232  1.5336779

Después de estandarizar los datos se procede a estimar los componentes principales

#estimar componentes principales
prcomp(vivienda_componentes)
## Standard deviations (1, .., p=8):
## [1] 1.9152720 1.1866124 0.9705950 0.8673136 0.6792254 0.5830531 0.4961147
## [8] 0.4265783
## 
## Rotation (n x k) = (8 x 8):
##                      PC1         PC2         PC3         PC4         PC5
## estrato       0.30771722  0.50056407 -0.24584930  0.19906424  0.59798057
## preciom       0.46187937  0.09751481 -0.18593609  0.17191067 -0.07143064
## areaconst     0.43220755 -0.25531365  0.01706766  0.03400749 -0.21476392
## parqueaderos  0.42053095  0.02720378 -0.10639674  0.25061507 -0.58673691
## banios        0.45277351 -0.15245991  0.09104367 -0.05357758  0.33211529
## habitaciones  0.28596367 -0.53145975  0.29517459 -0.36180188  0.29176111
## longitud     -0.18758306 -0.49481354 -0.01079590  0.81744852  0.22271806
## latitud      -0.07975864 -0.35137933 -0.89321933 -0.25468113  0.04364306
##                      PC6         PC7         PC8
## estrato       0.09520170  0.41086898  0.13863560
## preciom      -0.30423296 -0.23196248 -0.74937720
## areaconst    -0.65275333  0.30003693  0.42933804
## parqueaderos  0.60950874  0.14202805  0.11114150
## banios        0.15365382 -0.71001485  0.35008781
## habitaciones  0.27045713  0.40303533 -0.31150857
## longitud      0.02854252  0.01974904 -0.02873110
## latitud       0.05674423 -0.01540700  0.04588967

Análisis de las Componentes Principales:

Gráficos

resultado.pca <- prcomp(vivienda_componentes)
fviz_eig(resultado.pca, addlabels = TRUE)

Se puede observar que la primera dimensión explica el 45.9% de la variabilidad contenida en la base datos, es decir, esta dimensión explica la mayor parte de la varianza de los datos. Entre las dos primeras dimensiones se explica un 63.5% y si se agrega la tercera dimensión se explica un 75.3% de la variabilidad de los datos. Estos nos indica que aplicando el método de Componentes Principales a esta base de datos compuesta por 8 variables de tipo cuantitativas se logro reducir su dimensionalidad a 3 componentes con un porcentaje de explicacion de las variables del 75.3%.

Ahora se analizará la contribución de cada variable original a las componentes principales y también la varianza explicada por cada componente, para esto se utilizará la siguiente función:

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

Con la ayuda del gráfico de Variables - PCA se observa que las variables estrato, preciom, areaconst, habitaciones, parqueaderos y banios contribuyen a la conformación de la primera dimension, la cual tiene una varianza explicada de 45.9%. Si analizamos la dimensión número dos se observa que las variables que contribuye a esta componente son longitud y latitud.

También se puede observar que la dirección del conjunto de variables de la primera componente es ortogonal a la dirección del conjunto de variables que conforman la segunda componente, esto garantiza que no exista redundacia de los datos y que cada componente capture o agrupe información única.

Por otro lado, se logra el objetivo de reducir la dimensionalidad de los datos, pasando de 8 variables correlacionadas a 2 variables no correlacionadas, es decir, las 2 componentes principales.

Como conclusión, se puede decir que con las dos primeras dimensiones estimadas por el método de Componentes Principales se logra explicar las 8 variables cuantitativas de la base de datos con una varianza explicada que alcanza el 63.5%.

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.