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>
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.
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>
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.
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%.
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.
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
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.
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.
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.
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")
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.
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.
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.