#devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
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>
borrar <- c("barrio","longitud","latitud")
vivienda2 <- vivienda[ , !(names(vivienda) %in% borrar)]
head(vivienda2, n=9)
## # A tibble: 9 × 10
## 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
## 6 1724 Zona N… 01 5 240 87 1 3 3
## 7 2326 Zona N… 01 4 220 52 2 2 3
## 8 4386 Zona N… 01 5 310 137 2 3 4
## 9 1209 Zona N… 02 5 320 150 2 4 6
## # ℹ 1 more variable: tipo <chr>
library(mice)
md.pattern(vivienda2)
## preciom id zona estrato areaconst banios habitaciones tipo parqueaderos
## 4808 1 1 1 1 1 1 1 1 1
## 1909 1 1 1 1 1 1 1 1 1
## 876 1 1 1 1 1 1 1 1 0
## 726 1 1 1 1 1 1 1 1 0
## 1 1 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0
## 2 3 3 3 3 3 3 3 1605
## piso
## 4808 1 0
## 1909 0 1
## 876 1 1
## 726 0 2
## 1 0 9
## 2 0 10
## 2638 4266
vivienda2<-vivienda2[c(1:8319),]
md.pattern(vivienda2)
## id zona estrato preciom areaconst banios habitaciones tipo parqueaderos
## 4808 1 1 1 1 1 1 1 1 1
## 1909 1 1 1 1 1 1 1 1 1
## 876 1 1 1 1 1 1 1 1 0
## 726 1 1 1 1 1 1 1 1 0
## 0 0 0 0 0 0 0 0 1602
## piso
## 4808 1 0
## 1909 0 1
## 876 1 1
## 726 0 2
## 2635 4237
# Calcular la tabla de frecuencia
tabla_frecuencia <- table(vivienda2$piso)
# Encontrar el valor o los valores con la frecuencia máxima (moda)
moda <- names(tabla_frecuencia[tabla_frecuencia == max(tabla_frecuencia)])
# Imprimir la moda
cat("La moda es:", moda, "\n")
## La moda es: 02
#Reemplazar moda 02 para los N/A en variable piso
vivienda2$piso[is.na(vivienda2$piso)]<-"02"
# Calcular la tabla de frecuencia
tabla_frecuencia <- table(vivienda2$parqueaderos)
# Encontrar el valor o los valores con la frecuencia máxima (moda)
moda <- names(tabla_frecuencia[tabla_frecuencia == max(tabla_frecuencia)])
# Imprimir la moda
cat("La moda es:", moda, "\n")
## La moda es: 1
#Reemplazar moda 02 para los N/A en variable piso
vivienda2$parqueaderos[is.na(vivienda2$parqueaderos)]<-1
vivienda2$preciom<-vivienda2$preciom*1000000
vivienda2$piso <- as.numeric(vivienda2$piso)
md.pattern(vivienda2)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 8319 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0 0
## tipo
## 8319 1 0
## 0 0
borrar <- c("id","zona","estrato", "tipo")
viviendacategoricas <- vivienda2[ , !(names(vivienda2) %in% borrar)]
head(viviendacategoricas, n=9)
## # A tibble: 9 × 6
## piso preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 250000000 70 1 3 6
## 2 2 320000000 120 1 2 3
## 3 2 350000000 220 2 2 4
## 4 2 400000000 280 3 5 3
## 5 1 260000000 90 1 2 3
## 6 1 240000000 87 1 3 3
## 7 1 220000000 52 2 2 3
## 8 1 310000000 137 2 3 4
## 9 2 320000000 150 2 4 6
viviendaescalados= scale(viviendacategoricas)
prcomp(viviendaescalados)
## Standard deviations (1, .., p=6):
## [1] 1.7876260 1.0425150 0.8950690 0.6316520 0.5701043 0.4386390
##
## Rotation (n x k) = (6 x 6):
## PC1 PC2 PC3 PC4 PC5
## piso 0.1017998 -0.800271394 0.574890748 0.02933253 -0.1311150
## preciom -0.4700094 -0.288185116 -0.251236150 0.34105599 0.2366324
## areaconst -0.4831504 0.060931000 -0.003161386 0.54350252 -0.5640787
## parqueaderos -0.4171612 -0.304374739 -0.382312384 -0.70538969 -0.2792254
## banios -0.4863201 0.003284964 0.230949296 -0.04288848 0.6971766
## habitaciones -0.3532180 0.424438070 0.637864165 -0.29666713 -0.2112042
## PC6
## piso -0.02552613
## preciom 0.67868021
## areaconst -0.38634625
## parqueaderos -0.10783500
## banios -0.47143371
## habitaciones 0.39446169
library(FactoMineR)
library(tidyverse) # everything
library(readxl) # reading in excel sheets
library(factoextra) # easy PCA plotting
library(glue) # easy pasting
res.pca <- prcomp(viviendaescalados)
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
)
set.seed(123)
wss <- function(k) {
kmeans(viviendaescalados, k, nstart = 10)$tot.withinss
}
k.values <- 1:10
wss_values <- map_dbl(k.values, wss)
plot(k.values, wss_values, type = "b", pch = 19, frame = FALSE,
xlab = "Número de Clústeres K",
ylab = "Suma de las Distancias Cuadradas Dentro de los Clústeres (WSS)")
set.seed(0)
modelo_kmeans <- kmeans(viviendaescalados, 4) # Ajuste
vivienda_3_est <- data.frame(viviendaescalados,
modelo_kmeans$cluster) # Cluster
aggregate(viviendacategoricas,
by = list(vivienda_3_est$modelo_kmeans.cluster),
FUN = median) # Medianas
## Group.1 piso preciom areaconst parqueaderos banios habitaciones
## 1 1 2 2.3e+08 86 1 2 3
## 2 2 2 4.8e+08 228 2 4 4
## 3 3 8 3.3e+08 100 1 3 3
## 4 4 2 1.1e+09 370 4 5 4
fviz_cluster(list(data = vivienda_3_est[,1:6],
cluster = vivienda_3_est$modelo_kmeans.cluster),
palette = c("#2E9FDF", "#E7B800", "#FC4E07","#00AFBB"),
ellipse.type = "convex",repel = F,
show.clust.cent = FALSE, ggtheme = theme_minimal())
grupos<- data.frame(viviendacategoricas,
modelo_kmeans$cluster) # Cluster
Cluster1<-grupos%>%filter(grupos$modelo_kmeans.cluster==1)
Cluster2<-grupos%>%filter(grupos$modelo_kmeans.cluster==2)
Cluster3<-grupos%>%filter(grupos$modelo_kmeans.cluster==3)
Cluster4<-grupos%>%filter(grupos$modelo_kmeans.cluster==4)
options(scipen = 100, digits = 4)
summary(Cluster1)
## piso preciom areaconst parqueaderos
## Min. :1.00 Min. : 58000000 Min. : 30 Min. :1.00
## 1st Qu.:2.00 1st Qu.: 155000000 1st Qu.: 64 1st Qu.:1.00
## Median :2.00 Median : 230000000 Median : 86 Median :1.00
## Mean :2.57 Mean : 250277132 Mean : 98 Mean :1.21
## 3rd Qu.:3.00 3rd Qu.: 315000000 3rd Qu.:114 3rd Qu.:1.00
## Max. :6.00 Max. :1500000000 Max. :660 Max. :4.00
## banios habitaciones modelo_kmeans.cluster
## Min. :0.00 Min. :0.0 Min. :1
## 1st Qu.:2.00 1st Qu.:3.0 1st Qu.:1
## Median :2.00 Median :3.0 Median :1
## Mean :2.19 Mean :2.9 Mean :1
## 3rd Qu.:3.00 3rd Qu.:3.0 3rd Qu.:1
## Max. :4.00 Max. :7.0 Max. :1
summary(Cluster2)
## piso preciom areaconst parqueaderos
## Min. :1.00 Min. : 127000000 Min. : 61 Min. :1.00
## 1st Qu.:2.00 1st Qu.: 370000000 1st Qu.:170 1st Qu.:1.00
## Median :2.00 Median : 480000000 Median :228 Median :2.00
## Mean :2.27 Mean : 518061690 Mean :247 Mean :1.75
## 3rd Qu.:3.00 3rd Qu.: 650000000 3rd Qu.:300 3rd Qu.:2.00
## Max. :8.00 Max. :1350000000 Max. :932 Max. :4.00
## banios habitaciones modelo_kmeans.cluster
## Min. : 0.00 Min. : 0.00 Min. :2
## 1st Qu.: 4.00 1st Qu.: 4.00 1st Qu.:2
## Median : 4.00 Median : 4.00 Median :2
## Mean : 4.16 Mean : 4.84 Mean :2
## 3rd Qu.: 5.00 3rd Qu.: 6.00 3rd Qu.:2
## Max. :10.00 Max. :10.00 Max. :2
summary(Cluster3)
## piso preciom areaconst parqueaderos
## Min. : 5.00 Min. : 125000000 Min. : 45 Min. :1.00
## 1st Qu.: 6.00 1st Qu.: 240000000 1st Qu.: 77 1st Qu.:1.00
## Median : 8.00 Median : 330000000 Median :100 Median :1.00
## Mean : 8.12 Mean : 394567820 Mean :114 Mean :1.54
## 3rd Qu.:10.00 3rd Qu.: 460000000 3rd Qu.:135 3rd Qu.:2.00
## Max. :12.00 Max. :1500000000 Max. :660 Max. :4.00
## banios habitaciones modelo_kmeans.cluster
## Min. : 0.00 Min. :0.00 Min. :3
## 1st Qu.: 2.00 1st Qu.:3.00 1st Qu.:3
## Median : 3.00 Median :3.00 Median :3
## Mean : 2.79 Mean :2.95 Mean :3
## 3rd Qu.: 3.00 3rd Qu.:3.00 3rd Qu.:3
## Max. :10.00 Max. :6.00 Max. :3
summary(Cluster4)
## piso preciom areaconst parqueaderos
## Min. : 1.00 Min. : 190000000 Min. : 50 Min. : 1.00
## 1st Qu.: 2.00 1st Qu.: 850000000 1st Qu.: 290 1st Qu.: 3.00
## Median : 2.00 Median :1100000000 Median : 370 Median : 4.00
## Mean : 2.67 Mean :1125209040 Mean : 425 Mean : 3.83
## 3rd Qu.: 3.00 3rd Qu.:1398000000 3rd Qu.: 500 3rd Qu.: 4.00
## Max. :12.00 Max. :1999000000 Max. :1745 Max. :10.00
## banios habitaciones modelo_kmeans.cluster
## Min. : 0.00 Min. : 0.00 Min. :4
## 1st Qu.: 4.00 1st Qu.: 4.00 1st Qu.:4
## Median : 5.00 Median : 4.00 Median :4
## Mean : 5.17 Mean : 4.54 Mean :4
## 3rd Qu.: 6.00 3rd Qu.: 5.00 3rd Qu.:4
## Max. :10.00 Max. :10.00 Max. :4
borrar <- c("id","piso","preciom", "areaconst","parqueaderos","banios","habitaciones")
viviendacualitativas <- vivienda2[ , !(names(vivienda2) %in% borrar)]
head(viviendacualitativas, n=9)
## # A tibble: 9 × 3
## zona estrato tipo
## <chr> <dbl> <chr>
## 1 Zona Oriente 3 Casa
## 2 Zona Oriente 3 Casa
## 3 Zona Oriente 3 Casa
## 4 Zona Sur 4 Casa
## 5 Zona Norte 5 Apartamento
## 6 Zona Norte 5 Apartamento
## 7 Zona Norte 4 Apartamento
## 8 Zona Norte 5 Apartamento
## 9 Zona Norte 5 Casa
library(factoextra)
viviendacualitativas$estrato <- as.factor(viviendacualitativas$estrato)
viviendacualitativas$zona <- as.factor(viviendacualitativas$zona)
viviendacualitativas$tipo <- as.factor(viviendacualitativas$tipo)
tail(viviendacualitativas, n=9)
## # A tibble: 9 × 3
## zona estrato tipo
## <fct> <fct> <fct>
## 1 Zona Sur 4 Apartamento
## 2 Zona Sur 5 Casa
## 3 Zona Sur 3 Casa
## 4 Zona Sur 6 Apartamento
## 5 Zona Sur 6 Casa
## 6 Zona Sur 3 Casa
## 7 Zona Sur 6 Casa
## 8 Zona Sur 6 Apartamento
## 9 Zona Sur 5 Casa
tabla <- table(viviendacualitativas$zona, viviendacualitativas$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
##
## Estrato3 Estrato4 Estrato5 Estrato6
## Zona Centro 105 14 4 1
## Zona Norte 572 407 769 172
## Zona Oeste 54 84 290 770
## Zona Oriente 340 8 2 1
## Zona Sur 382 1616 1685 1043
chisq.test(tabla)
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 3830, df = 12, p-value <0.0000000000000002
resultados_ac <- CA(tabla)
valores_prop <-resultados_ac$eig ; valores_prop
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215 69.966 69.97
## dim 2 0.12745 27.680 97.65
## dim 3 0.01084 2.354 100.00
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
#### De acuerdo a la tabla y la imagen, podemos observar que con la
primer componente podemos obtener alrededor del 70% de la variabilidad,
por lo cual, solo con esta componente es suficente realizar este
proceso.
afcm <- MCA(viviendacualitativas, graph = FALSE)
afcm
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 8319 individuals, described by 3 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. of the categories"
## 4 "$var$cos2" "cos2 for the categories"
## 5 "$var$contrib" "contributions of the categories"
## 6 "$var$v.test" "v-test for the categories"
## 7 "$var$eta2" "coord. of variables"
## 8 "$ind" "results for the individuals"
## 9 "$ind$coord" "coord. for the individuals"
## 10 "$ind$cos2" "cos2 for the individuals"
## 11 "$ind$contrib" "contributions of the individuals"
## 12 "$call" "intermediate results"
## 13 "$call$marge.col" "weights of columns"
## 14 "$call$marge.li" "weights of rows"
eig.val<-get_eigenvalue(afcm)
eig.val
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 0.5621 21.078 21.08
## Dim.2 0.4531 16.992 38.07
## Dim.3 0.3796 14.237 52.31
## Dim.4 0.3334 12.504 64.81
## Dim.5 0.3233 12.124 76.94
## Dim.6 0.2718 10.192 87.13
## Dim.7 0.2014 7.551 94.68
## Dim.8 0.1419 5.322 100.00
fviz_screeplot(afcm, addlabels = TRUE)
fviz_mca_biplot(afcm,ggtheme = theme_minimal())
fviz_mca_var(afcm, axes = c(1, 2), col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE, # Avoid text overlapping
ggtheme = theme_minimal())