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:
#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"
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%.
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.