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.
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:
El Análisis de Componentes Principales (ACP) es una técnica estadística de síntesis de la información, o reducción de la dimensión (número de variables). Es decir, ante un banco de datos con muchas variables, el objetivo será reducirlas a un menor número perdiendo la menor cantidad de información posible. Los nuevos componentes principales o factores serán una combinación lineal de las variables originales, y además serán independientes entre sí. Un aspecto clave en ACP es la interpretación de los factores, ya que ésta no viene dada a priori, sino que será deducida tras observar la relación de los factores con las variables iniciales (habrá, pues, que estudiar tanto el signo como la magnitud de las correlaciones).
Se instalan las librerias correspondientes
Se trae la información de las viviendas
## Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
##
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb4364c79d\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
✔ checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb4364c79d\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION'
##
─ preparing 'paqueteMODELOS':
## checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ building 'paqueteMODELOS_0.1.0.tar.gz'
##
##
## Installing package into 'C:/Users/mjreinat/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## Loading required package: boot
## Loading required package: broom
## Warning: package 'broom' was built under R version 4.3.2
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.2
## 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.2
## 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.2
## Warning: package 'mice' was built under R version 4.3.2
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
## Warning: package 'VIM' was built under R version 4.3.2
## Loading required package: colorspace
## Warning: package 'colorspace' was built under R version 4.3.2
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
## Warning: package 'tidyverse' was built under R version 4.3.2
## Warning: package 'tibble' was built under R version 4.3.2
## Warning: package 'tidyr' was built under R version 4.3.2
## Warning: package 'readr' was built under R version 4.3.2
## Warning: package 'purrr' was built under R version 4.3.2
## Warning: package 'dplyr' was built under R version 4.3.2
## Warning: package 'stringr' was built under R version 4.3.2
## Warning: package 'forcats' was built under R version 4.3.2
## Warning: package 'lubridate' was built under R version 4.3.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ── 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
## 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
## Warning: package 'FactoMineR' was built under R version 4.3.2
## 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")=
## .. cols(
## .. id = col_double(),
## .. zona = col_character(),
## .. piso = col_character(),
## .. estrato = col_double(),
## .. preciom = col_double(),
## .. areaconst = col_double(),
## .. parqueaderos = col_double(),
## .. banios = col_double(),
## .. habitaciones = col_double(),
## .. tipo = col_character(),
## .. barrio = col_character(),
## .. longitud = col_double(),
## .. latitud = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Revisión de datos faltantes:
md.pattern(df) # Revisión si existen datos faltantes
## 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
colSums(is.na(df)) # Cantidad de datos faltantes por columna
## 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
sum(is.na(df)) #Revisión del total de faltantes en todo el conjunto de datos
## [1] 4275
porcentajeMiss <- function(x) {sum(is.na(x)) / length(x)*100} #determinación del porcentaje de valores perdidos respecto del total de datos
apply(df, 2, porcentajeMiss) #por columna
## id zona piso estrato preciom areaconst
## 0.03604903 0.03604903 31.69911079 0.03604903 0.02403268 0.03604903
## parqueaderos banios habitaciones tipo barrio longitud
## 19.28622927 0.03604903 0.03604903 0.03604903 0.03604903 0.03604903
## latitud
## 0.03604903
aggr_plot <- aggr(df, col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, labels=names(data), cex.axis=.7, gap=3, ylab=c("Histograma de datos faltantes","Pattern"))
## Warning in plot.aggr(res, ...): not enough horizontal space to display
## frequencies
##
## Variables sorted by number of missings:
## Variable Count
## piso 0.3169911079
## parqueaderos 0.1928622927
## id 0.0003604903
## zona 0.0003604903
## estrato 0.0003604903
## areaconst 0.0003604903
## banios 0.0003604903
## habitaciones 0.0003604903
## tipo 0.0003604903
## barrio 0.0003604903
## longitud 0.0003604903
## latitud 0.0003604903
## preciom 0.0002403268
Se puede evidenciar que la columna piso tiene cerca de un 32% de datos perdidos y parqueaderos cerca de un 19%, por lo tanto se decide realizar la eliminación de datos faltantes. Se crea nuevo dataframe omitiendo los datos faltantes y se comprueba que se encuentre correcto
Se realiza la selección de los datos númericos y la estandarización de los datos:
df = na.omit(df) #Omitir datos faltantes
numeric_columns <- df[,unlist(lapply(df, is.numeric))] #Seleccionar las variables numericas
vivienda = scale(numeric_columns)#Estandarizar los datos
vivienda <- vivienda[, -1] #Eliminar columna ID
head(vivienda)
## estrato preciom areaconst parqueaderos banios habitaciones
## 4 -0.9046263 -0.1756310 0.7609789 1.0779092 1.3178809 -0.4241459
## 5 0.1749079 -0.6055839 -0.6129041 -0.7415001 -0.9022913 -0.4241459
## 6 0.1749079 -0.6670057 -0.6345970 -0.7415001 -0.1622339 -0.4241459
## 7 -0.9046263 -0.7284276 -0.8876807 0.1682046 -0.9022913 -0.4241459
## 8 0.1749079 -0.4520293 -0.2730489 0.1682046 -0.1622339 0.3272519
## 9 0.1749079 -0.4213184 -0.1790463 0.1682046 0.5778235 1.8300475
## longitud latitud
## 4 -0.57661599 0.4905916
## 5 1.05338647 1.0487875
## 6 0.83810312 -1.0336499
## 7 0.66956702 0.2867835
## 8 -0.02610573 -0.7243192
## 9 1.05892232 1.5336779
prcomp(vivienda) #Desviaciones estandar
## 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
Elección del número de componentes principales
res.pca <- prcomp(vivienda)
fviz_eig(res.pca, addlabels = TRUE)
Se puede evidenciar que el primer componente principal explica el 45.9 % de la variabilidad contenida en la base de datos. Ahora se relizará un análisis de contribución por dimensiones
fviz_contrib(res.pca,axes = 1, choice = "var", addlabels = TRUE) #Dimension 1
fviz_contrib(res.pca,axes = 2, choice = "var", addlabels = TRUE)#Dimensión 2
fviz_contrib(res.pca,axes = 3, choice = "var", addlabels = TRUE)#Dimensión 3
fviz_contrib(res.pca,axes = 4, choice = "var", addlabels = TRUE)#Dimensión 4
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
fviz_cos2(res.pca, choice = "var", axes = 1:2)
Se realiza un análisis con las variables categoricas de tipo y zona con el fin de tener una visión mas clara de la relación entre las variables
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = df$zona,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94") # Individuals color
)
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = df$tipo,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94") # Individuals color
)
Al visualizar las variables en el plano de los componentes principales, se pudieron identificar el sentido y la caracterización de los componentes (característica capturada por los vectores propios de Σ). En este caso existe una relación entre las variables baños y area construida, mientras que el segundo componente se puede asociar a la variable preciom. Además en el segundo gráfico se puede observar la contribución de cada una de las variables en las dimensiones,en este caso se puede evidenciar que los componentes principales están asociados con las variables precio,baños y areaconst, seguido de las variables estrato y habitaciones.
Por otro lado, los resultados obtenidos del análisis biplot ofrecieron una perspectiva más detallada sobre las relaciones entre las variables, con respecto a las áreas geográficas, se identificó una tendencia notable. La zona oeste sobresalió como la región con los estratos promedio más elevados, lo que sugiere una mayor concentración de propiedades de alto estatus. En contraste, las zonas oriental y central presentaron estratos promedio más bajos, lo que indica una distribución de viviendas con niveles socioeconómicos más diversos en esas áreas.
Por otro lado, al examinar minuciosamente los distintos tipos de viviendas, se pudo observar que las casas mostraron una fuerte asociación con precios más altos, mayor cantidad de habitaciones y una mayor superficie construida. Sin embargo, estas propiedades también revelaron un nivel de estrato relativamente bajo en comparación con otras categorías. Por otro lado, los apartamentos surgieron como la alternativa con precios más bajos, menor superficie construida y menos habitaciones, en promedio. Sin embargo, en términos de estrato, los apartamentos exhibieron un patrón inverso, con valores más altos en esta variable.
El análisis de conglomerados es una técnica multivariante utilizada para clasificar una muestra de elementos o individuos en grupos, de forma que las observaciones pertenecientes a un grupo sean similares entre sí (homogeneidad dentro los grupos) y diferentes del resto (heterogeneidad entre ellos) sobre la base de un conjunto definido de variables. En concreto, realiza una partición de los individuos en un conjunto de grupos de modo que un individuo pertenece solo a un grupo y la unión de dichos grupos contiene a todos los individuos. Estos grupos se denominan conglomerados.
Esta técnica puede emplearse, por ejemplo, para agrupar países, comunidades autónomas, regiones o provincias con características similares, en relación con el empleo, o con la composición de la población, etc. También puede usarse para formar grupos de consumidores teniendo en cuenta sus preferencias en nuevos productos, niveles de gasto, etc.
El análisis de conglomerados es un método basado en criterios geométricos y se utiliza fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa.
library(paqueteMODELOS)
data("vivienda") #base de datos
df = data.frame(vivienda)
vivienda2 = na.omit(df) #Omitir na
vivienda2 <- df[, c("id","zona", "estrato","preciom","banios","areaconst","habitaciones", "parqueaderos")] #Selección de caracteristicas a clasificar
vivienda2$zona <- factor(vivienda2$zona)# Convertir la columna categórica (Zona) en un factor
niveles <- levels(vivienda2$zona)# Guardar los niveles del factor (categorías)
vivienda2$zona <- as.integer(vivienda2$zona) # Asignar valores numéricos a cada nivel del factor
for (i in 1:length(niveles)) {
cat("Categoría:", niveles[i], " - Valor numérico asignado:", i, "\n")
} #Mostrar los niveles (categorías) y sus correspondientes valores numéricos
## Categoría: Zona Centro - Valor numérico asignado: 1
## Categoría: Zona Norte - Valor numérico asignado: 2
## Categoría: Zona Oeste - Valor numérico asignado: 3
## Categoría: Zona Oriente - Valor numérico asignado: 4
## Categoría: Zona Sur - Valor numérico asignado: 5
vivienda3 = scale(vivienda2, center = TRUE, scale = TRUE)
vivienda3 = na.omit(vivienda3)
vivienda3 = as.data.frame(vivienda3)
#id=rownames(vivienda3)
Optimización de Clusters utilizando el Metodo Elbow
fviz_nbclust(vivienda3, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
Con el método Elbow, se obtiene el número de Clusters que se utilizará, es decir, 4. Ahora se realizará un análisis de conglomerados a traves de el algoritmo kmeans y graficamos los cluster en funcion de las caracteristicas principales precio y area construida
kmcluster = kmeans(vivienda3,centers=4,nstart = 50)
kmcluster
## K-means clustering with 4 clusters of sizes 1246, 994, 2538, 1939
##
## Cluster means:
## id zona estrato preciom banios areaconst
## 1 -0.8197633 -1.31322438 -0.4651223 -0.4294328 -0.3634032 -0.26069799
## 2 0.4705011 0.21801313 0.7782555 1.7624666 1.5365551 1.73831062
## 3 -0.1183285 0.76819803 -0.2473433 -0.5280569 -0.4763048 -0.49882472
## 4 0.8055004 0.03473596 0.8861374 0.4324391 0.4189388 0.07959503
## habitaciones parqueaderos
## 1 -0.02764795 -0.4278228
## 2 1.00998865 1.5720629
## 3 -0.33593534 -0.5501621
## 4 -0.04727683 0.1891430
##
## Clustering vector:
## [1] 1 3 1 4 1 1 1 1 1 1 2 2 4 4 4 1 1 1 1 1 1 3 4 4 1 3 4 3 3 4 3 4 4 3 2 4 2
## [38] 4 3 3 4 1 2 2 2 3 3 3 4 4 4 3 4 3 4 4 4 3 4 4 4 4 3 4 4 4 4 4 3 4 2 2 4 4
## [75] 2 4 4 2 4 3 4 2 2 4 4 4 2 4 2 4 4 4 4 4 3 4 4 4 3 3 3 2 2 4 4 4 3 2 2 4 4
## [112] 4 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 3 1 3 4 4 4 4 1
## [149] 1 4 3 1 1 1 1 1 1 1 1 3 1 1 1 4 4 4 2 3 4 2 4 4 4 4 4 4 1 4 4 4 4 4 4 4 4
## [186] 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 1 1 1 1 1 2 4 1 3 1 1 1 1 3 3 3 3
## [223] 2 4 4 3 4 4 4 4 3 1 4 1 4 2 4 4 2 4 2 4 3 2 4 3 4 4 4 4 4 4 4 4 4 4 4 2 4
## [260] 4 4 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 3 1 3 3 3 3 3 3 3 3 3 3 3
## [297] 3 3 3 3 3 3 3 3 3 3 3 3 4 4 3 4 3 2 3 3 3 3 3 3 3 3 4 3 1 1 1 1 1 1 1 3 2
## [334] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
## [371] 3 3 3 3 3 3 4 2 2 4 4 4 4 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3
## [408] 3 3 3 1 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 2 3 4 3 3 4 4 4 3 3 3 3 3 3 3
## [445] 3 3 2 4 3 3 3 3 3 3 3 3 3 4 3 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [482] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 3 3 3 3 3 3
## [519] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 4 4 4 3 4 4 3 3 3 3 3 3 3
## [556] 3 3 3 3 3 2 3 3 4 3 3 4 4 3 3 3 3 3 3 3 3 3 3 2 3 3 4 4 3 3 3 3 2 4 1 1 3
## [593] 1 4 1 1 1 1 1 1 1 2 4 4 1 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 3 4 3
## [630] 3 3 2 3 2 3 4 3 3 4 4 1 1 1 1 4 1 1 4 1 1 1 1 4 1 1 1 1 1 4 2 1 1 4 1 1 1
## [667] 4 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [704] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3
## [741] 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [778] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 4 4 3 3 4 2 3 3 3 3 2 3 3 1 1 1 1 2
## [815] 3 3 2 4 2 3 3 4 3 4 2 3 4 4 4 4 4 2 4 2 3 3 3 2 2 2 2 4 4 2 4 2 4 2 2 4 2
## [852] 4 2 2 2 4 2 4 4 4 4 2 2 4 2 2 2 4 2 4 4 2 2 2 2 2 2 4 2 4 2 2 2 3 2 2 2 4
## [889] 4 4 4 4 2 4 4 2 2 4 2 4 2 2 2 2 2 4 2 2 2 4 2 2 2 4 2 2 4 2 4 2 4 2 4 4 2
## [926] 2 4 4 4 4 2 4 2 2 4 2 2 2 4 2 2 2 4 4 2 4 2 4 2 4 2 2 4 4 4 4 2 2 4 4 2 2
## [963] 2 4 2 4 4 2 2 2 2 2 2 4 2 2 2 4 2 2 2 2 4 2 2 2 2 2 2 4 4 2 4 4 3 2 2 4 4
## [1000] 2 2 4 2 2 4 2 4 4 4 4 4 3 4 4 4 4 2 3 4 4 2 2 3 4 4 2 4 2 4 4 4 4 4 2 4 4
## [1037] 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 2 2 2 4 4 4 4 2 4 2 2 4 4
## [1074] 4 2 4 2 4 4 3 3 3 4 4 4 3 3 4 2 3 4 4 3 4 3 4 3 4 4 2 4 4 4 4 2 4 3 4 3 4
## [1111] 2 4 3 3 3 4 4 3 4 4 4 3 3 4 4 3 4 4 4 4 3 4 4 4 4 2 4 4 3 3 4 3 4 2 4 3 4
## [1148] 4 4 3 4 2 2 2 4 4 2 4 4 3 3 3 3 4 4 3 3 2 4 2 3 3 3 3 4 4 4 4 3 3 3 4 4 3
## [1185] 4 4 4 4 2 4 3 2 4 2 4 4 4 3 3 3 2 4 4 3 3 4 3 3 3 3 3 3 4 3 3 3 4 4 2 4 2
## [1222] 4 3 2 4 4 2 2 4 4 2 2 2 4 2 2 2 2 2 2 4 2 4 2 4 2 2 2 2 2 2 2 4 2 4 2 2 2
## [1259] 4 4 4 4 4 4 4 2 2 2 2 2 4 2 4 4 2 2 4 4 3 4 4 2 4 4 4 2 2 4 4 2 4 2 2 4 2
## [1296] 4 4 2 2 4 4 4 2 2 4 4 2 2 4 4 2 2 2 4 2 2 2 2 4 3 4 3 2 2 2 3 3 3 3 2 4 1
## [1333] 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 4 2
## [1370] 2 4 2 4 4 2 4 2 2 2 2 2 4 4 4 2 4 2 2 1 3 3 2 3 3 3 3 4 3 3 3 3 2 2 3 3 2
## [1407] 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 1 3 3 3 3 3 3 2 3 3 1 3 1 3 4 4 2
## [1444] 4 4 4 4 4 4 2 4 4 2 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 2 4
## [1481] 4 4 4 4 4 4 4 1 4 4 1 4 4 2 2 4 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [1518] 4 3 3 3 3 3 3 4 3 4 4 4 4 4 3 4 2 3 4 4 4 3 4 3 3 3 3 3 3 3 3 4 3 3 4 3 4
## [1555] 4 3 3 4 4 4 3 2 4 4 2 4 3 3 3 2 2 4 3 2 3 3 3 2 2 2 4 1 1 1 1 4 1 1 1 1 4
## [1592] 1 4 1 1 1 2 1 1 2 1 4 1 1 1 1 1 1 4 4 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 4 4 3
## [1629] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [1666] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 4 3 3 3 3
## [1703] 2 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3
## [1740] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 4 3 3 4 3 3
## [1777] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 2 3 1 3 3 3 3 2 3 3 4 3 4 4
## [1814] 4 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 4 4 4 3 4 3 3 4 4 3 4 3 3 3 3 2 4 4 2 4
## [1851] 3 2 4 3 4 2 4 4 4 4 3 3 3 4 2 3 3 2 3 2 2 4 4 2 2 2 2 3 4 2 3 4 4 3 3 3 2
## [1888] 3 3 3 4 3 3 3 2 4 2 4 4 3 4 2 3 3 3 3 3 2 4 3 3 2 3 3 3 3 4 3 3 4 4 4 4 2
## [1925] 3 3 3 3 4 4 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 4 3 3 3 3 3 3
## [1962] 3 3 3 3 3 3 3 3 3 4 3 3 4 3 3 3 3 3 3 2 4 3 2 3 3 2 2 3 3 3 3 3 3 3 3 3 4
## [1999] 4 3 3 3 4 4 2 3 2 3 4 4 3 4 4 4 2 3 2 4 4 3 3 4 4 3 4 3 3 3 3 2 4 2 3 3 3
## [2036] 3 3 3 3 3 3 4 2 2 3 4 3 3 4 2 2 4 4 4 2 2 4 2 2 3 4 3 3 4 3 4 2 3 4 4 4 2
## [2073] 3 2 3 3 2 3 3 3 4 2 2 3 2 3 3 1 1 2 1 3 1 1 1 3 2 4 3 3 3 3 3 2 3 2 2 4 4
## [2110] 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 1 4 4 4 4 2 3 2 3
## [2147] 3 3 3 3 4 4 4 4 4 3 4 3 4 3 4 2 2 3 3 4 3 3 3 2 4 2 2 4 2 3 4 3 3 4 2 2 2
## [2184] 2 2 4 2 3 3 2 3 4 3 2 3 3 2 4 2 3 3 3 3 4 2 2 3 4 2 3 4 4 3 3 3 3 3 3 3 3
## [2221] 3 3 3 3 4 3 3 3 4 3 3 3 3 3 4 3 4 2 2 3 3 3 3 4 3 3 4 3 3 2 3 2 2 2 4 4 2
## [2258] 2 2 4 4 3 3 2 2 4 3 1 3 4 2 4 1 4 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4
## [2295] 4 3 4 3 2 4 4 4 4 2 1 1 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 2 3 3 3 3 4 3 3
## [2332] 4 4 4 3 3 3 3 3 4 3 4 4 4 3 3 3 3 4 4 3 3 4 3 2 3 3 4 3 3 3 3 3 4 4 4 3 3
## [2369] 4 3 3 4 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [2406] 3 3 4 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 4 4 4 3 3 4 4 3 3 3 4 3 1 1 1 1 1 2 1
## [2443] 3 1 1 1 1 1 2 1 3 1 4 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1 1 1 3 3 2 4 4 2 4 4
## [2480] 4 3 2 4 4 2 2 3 3 2 4 3 3 3 2 4 4 4 1 4 1 1 1 2 1 1 1 4 2 4 3 3 4 2 4 4 4
## [2517] 3 4 4 4 3 3 3 3 3 3 3 2 4 1 2 1 1 1 1 4 4 2 3 3 3 3 4 1 1 4 4 4 4 4 4 2 2
## [2554] 4 4 2 2 4 2 2 2 1 4 4 4 4 4 4 4 2 4 4 4 4 2 4 4 4 2 4 1 4 4 4 4 2 4 2 4 2
## [2591] 4 4 4 1 4 4 4 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 4 2 4 4 4 4 4 4 4 2 4 4 4 4
## [2628] 2 2 4 1 1 2 1 1 1 1 1 2 2 1 1 1 1 1 4 1 1 1 1 1 2 4 4 4 3 2 3 1 1 1 1 1 1
## [2665] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
## [2702] 1 2 1 1 4 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 2 2 1 1 2 4 1 1 1 1 2 1
## [2739] 1 2 1 1 2 2 1 1 1 1 1 1 1 2 2 4 1 1 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
## [2776] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [2813] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [2850] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1
## [2887] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [2924] 1 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [2961] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 4 1 1 1 1 1 1 1 1 2 2 2
## [2998] 1 1 1 1 4 1 1 1 1 1 4 4 4 2 2 1 1 2 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3
## [3035] 3 2 3 2 3 3 3 3 4 4 3 3 3 3 4 3 3 3 3 4 3 3 3 4 3 3 4 4 4 3 4 4 3 3 4 4 4
## [3072] 4 3 4 4 4 2 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [3109] 3 3 4 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [3146] 3 3 3 3 3 3 3 4 3 4 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 4 3 3 3 3 3 3 4 3 3 3
## [3183] 4 4 4 1 1 1 3 1 1 1 3 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
## [3220] 3 1 2 2 1 2 1 1 1 1 1 1 2 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 1 1 3
## [3257] 1 1 1 2 2 1 1 1 3 1 1 1 1 1 1 1 3 3 3 3 4 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [3294] 4 2 1 1 1 1 1 1 4 3 3 3 2 4 3 3 3 3 3 3 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 2 2
## [3331] 2 4 4 4 4 4 4 4 4 4 4 4 4 4 2 4 3 4 4 3 4 4 4 2 2 4 4 4 4 4 4 1 4 4 4 4 4
## [3368] 2 2 4 4 4 4 4 4 4 4 4 2 4 3 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 2 4 4 4 4 4 4 4
## [3405] 4 4 4 4 3 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 2 2 4 4 4 4 4 4 4 4 4 4
## [3442] 4 2 4 4 4 1 4 4 4 4 4 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [3479] 4 1 1 1 1 1 1 1 1 1 3 1 2 1 1 1 1 1 1 1 1 1 3 3 4 2 1 1 1 1 3 4 4 4 4 3 4
## [3516] 3 3 3 4 3 3 4 4 3 3 3 3 3 3 4 3 3 3 3 4 3 4 4 4 3 4 4 4 4 4 2 4 3 2 3 3 3
## [3553] 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3
## [3590] 3 3 3 3 3 3 2 4 1 2 1 1 4 4 4 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2
## [3627] 4 4 1 1 4 1 3 4 2 1 4 1 4 4 4 2 4 4 2 2 2 1 3 3 3 3 3 3 3 4 4 3 4 3 4 3 4
## [3664] 3 3 3 4 3 4 2 3 3 1 3 3 4 3 3 3 3 3 3 3 3 3 3 2 3 2 3 3 3 3 3 4 3 3 2 4 4
## [3701] 4 2 2 4 4 2 2 4 4 2 4 4 4 4 4 4 4 4 4 4 4 3 2 2 3 2 4 4 3 3 2 2 4 4 4 4 2
## [3738] 2 4 4 4 4 2 2 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 4 2 2 4 4 4 2 4 4 4 4 4 4 4
## [3775] 4 4 4 4 2 4 4 2 4 2 4 4 2 2 2 2 2 4 4 3 4 4 4 2 4 2 3 4 4 4 4 1 4 4 4 4 4
## [3812] 4 3 4 4 4 4 4 2 4 3 4 2 4 4 4 4 4 4 2 4 2 4 2 4 4 4 4 4 2 4 4 4 4 2 4 3 2
## [3849] 4 2 4 1 1 1 3 1 1 1 3 2 3 3 4 4 4 4 3 4 4 4 3 4 3 4 4 4 4 4 3 3 4 4 3 3 3
## [3886] 3 4 4 3 2 3 3 3 4 4 3 3 4 4 3 3 3 3 3 4 3 3 4 4 1 3 4 3 4 4 3 4 2 2 3 4 4
## [3923] 2 2 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 3 2 2 4 4 4
## [3960] 4 3 3 3 3 4 3 2 3 3 3 2 4 4 4 4 3 4 2 4 4 4 3 3 3 3 3 2 3 2 2 4 2 2 2 4 2
## [3997] 4 2 4 4 2 4 2 4 4 3 4 2 4 2 4 2 2 4 4 4 2 2 4 4 2 2 2 2 2 4 2 4 4 2 4 2 2
## [4034] 2 4 2 4 4 2 2 4 4 2 4 3 2 2 2 2 4 4 2 2 4 4 2 2 4 2 4 2 2 4 4 4 4 4 4 4 2
## [4071] 4 3 2 2 2 2 3 2 4 4 2 2 2 4 2 2 2 4 4 4 2 2 2 2 2 4 4 2 2 2 4 2 4 2 4 4 4
## [4108] 4 2 2 2 2 2 4 4 2 2 2 2 2 2 2 2 2 4 2 2 4 4 4 4 2 4 2 4 2 2 2 2 4 2 2 2 2
## [4145] 4 4 4 3 4 4 4 4 3 4 3 4 4 4 4 4 2 2 2 4 2 2 4 2 2 2 4 2 4 4 4 4 4 4 2 2 4
## [4182] 3 2 4 2 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4
## [4219] 4 4 4 4 4 4 4 3 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2
## [4256] 4 4 4 4 2 4 4 4 4 4 4 4 2 2 4 2 2 4 2 2 2 4 4 2 2 2 4 2 4 4 4 3 4 4 4 2 2
## [4293] 4 4 4 3 2 2 4 4 4 2 4 2 2 4 4 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 4 4 4
## [4330] 4 3 2 4 4 4 4 2 2 2 4 2 2 2 4 2 2 2 2 2 2 4 4 2 2 4 4 2 2 2 2 4 2 4 4 4 4
## [4367] 4 2 4 4 4 4 4 4 4 2 4 4 2 2 2 4 4 2 4 4 2 2 4 4 3 2 2 2 2 2 2 2 4 2 2 2 2
## [4404] 2 2 2 2 4 2 4 4 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 3 4 4 4 2 2 2 4 2 2 2
## [4441] 2 4 2 4 2 4 2 1 1 1 1 1 1 3 3 1 3 4 1 1 1 3 3 3 1 3 3 3 3 2 3 3 3 3 2 4 4
## [4478] 4 4 2 4 3 3 2 2 1 1 1 1 1 4 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1
## [4515] 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [4552] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1
## [4589] 1 3 3 1 3 3 4 4 4 3 2 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 4 3
## [4626] 3 3 3 3 4 3 3 4 4 3 4 3 4 3 4 4 4 2 3 3 4 3 3 4 4 3 4 3 3 3 3 3 3 3 3 4 3
## [4663] 3 3 3 4 3 3 3 3 3 4 4 3 3 3 3 3 4 4 4 4 3 4 4 2 3 3 4 4 3 3 3 3 1 1 3 2 4
## [4700] 4 1 3 1 3 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 4 2 1 1 4 4 1 1 1 1
## [4737] 3 1 1 2 1 4 1 1 3 3 3 4 4 2 3 2 2 3 4 3 4 2 2 3 4 4 4 3 3 4 3 4 4 3 4 4 4
## [4774] 3 3 4 3 4 1 3 1 4 4 4 2 2 4 4 4 3 4 4 2 4 4 3 2 4 4 2 2 4 4 3 4 3 1 4 2 2
## [4811] 4 4 4 3 4 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 3 1 1 1 2 1 2 1 1 1 1 1 1 2 1
## [4848] 2 2 1 2 1 2 1 1 4 2 2 2 1 1 1 1 1 1 1 1 2 2 1 1 1 2 4 2 3 3 3 3 4 3 3 4 3
## [4885] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 4
## [4922] 4 2 4 3 3 2 3 2 2 3 1 1 1 4 3 3 3 4 4 4 3 3 3 4 4 4 4 2 3 4 4 4 4 4 3 1 4
## [4959] 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 3 4 4 1 3 2 4 2 4 4 3 4 4 4 4 4 4 2
## [4996] 4 4 1 2 1 4 4 4 4 2 2 4 4 4 2 4 4 4 2 4 4 4 4 4 1 4 2 4 1 1 4 4 2 4 1 4 4
## [5033] 4 2 4 4 4 4 2 1 2 1 4 2 2 1 4 4 4 4 1 4 2 2 4 4 4 2 4 4 4 4 4 4 4 1 4 4 2
## [5070] 4 1 1 4 4 4 4 4 2 2 1 4 2 4 1 4 2 4 4 1 4 4 2 2 2 2 2 2 4 4 4 4 4 2 4 4 4
## [5107] 4 4 4 2 4 4 4 2 2 2 4 4 2 1 4 4 2 4 2 2 2 4 2 4 4 2 2 4 4 4 2 4 4 2 4 4 4
## [5144] 4 4 4 4 4 4 2 4 2 4 4 4 4 4 4 4 2 4 4 4 2 2 4 4 4 4 2 4 4 4 4 4 4 2 4 2 4
## [5181] 4 2 2 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 2 4 4 4 4 4 4
## [5218] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 4 4 2 2
## [5255] 2 3 2 4 2 4 4 2 4 2 2 2 2 4 2 4 2 2 4 2 2 4 4 2 4 4 4 2 2 4 4 4 4 1 4 4 2
## [5292] 4 4 2 2 4 4 2 2 2 1 2 4 1 1 4 2 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4
## [5329] 4 4 4 4 2 2 4 4 4 2 4 4 4 4 4 4 4 4 3 4 4 4 2 4 4 4 4 4 2 4 4 2 2 2 4 4 4
## [5366] 4 4 4 4 4 2 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 2 3 3 3 3 3 3 3 2 3 3 4 2 4 4 3
## [5403] 3 4 4 4 4 4 3 3 3 3 4 4 3 3 4 3 2 4 3 3 4 4 4 4 1 1 1 3 1 1 3 1 2 4 2 2 2
## [5440] 2 4 2 2 2 2 2 2 4 4 2 2 2 2 3 3 4 3 2 2 3 4 3 2 4 4 4 2 3 2 2 2 3 3 4 3 3
## [5477] 3 4 4 4 3 2 4 2 4 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [5514] 3 4 1 1 3 3 3 2 1 1 1 1 1 1 1 1 1 2 2 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [5551] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1
## [5588] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 4 2 3 1 4 4 3 4 3 4 4 4 4 2 4 3 3 2
## [5625] 2 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5662] 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5699] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5736] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5773] 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 2 2
## [5810] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3
## [5847] 3 3 3 4 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5884] 3 3 3 3 3 3 3 3 4 3 3 2 2 2 3 3 2 3 4 3 3 3 3 3 4 3 3 2 3 3 3 3 3 3 3 3 3
## [5921] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5958] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [5995] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6032] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6069] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3
## [6106] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6143] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6180] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6217] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6254] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6291] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3
## [6328] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3
## [6365] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6402] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [6439] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 2 1 4 2 2
## [6476] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 2 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1 4 1
## [6513] 1 4 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1
## [6550] 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 1 1 1 1 1 1
## [6587] 3 1 1 1 4 2 2 2 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 4 3 3
## [6624] 1 4 3 3 1 4 4 1 3 4 2 3 4 4 1 2 4 4 2 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2
## [6661] 4 3 3 2 4 3 3 3 3 2 4 3 2 4 4 2 4 2 3 3 3 3 3 3 4 3 3 3 4 3 4 2 3 3 3 3 3
## [6698] 3 3 3 3 4 3 3 3 4 3 3 3 3 3 4 2 3 2 4 4
##
## Within cluster sum of squares by cluster:
## [1] 4692.621 9380.587 5865.198 6475.589
## (between_SS / total_SS = 48.1 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
vivienda3 <- vivienda3 %>% mutate(cluster = kmcluster$cluster)
g1 <- ggplot(vivienda3, aes(x = as.factor(cluster), y = preciom)) +
geom_point(aes(color = as.factor(cluster)), size = 10) +
geom_text(aes(label = cluster), size = 5) +
theme_bw() +
theme(legend.position = "none") +
labs(title = "Kmeans con k = 4")
print(g1)
vivienda3 <- vivienda3 %>% mutate(cluster = kmcluster$cluster)
g1 <- ggplot(vivienda3, aes(x = as.factor(cluster), y = areaconst)) +
geom_point(aes(color = as.factor(cluster)), size = 10) +
geom_text(aes(label = cluster), size = 5) +
theme_bw() +
theme(legend.position = "none") +
labs(title = "Kmeans con k = 4")
print(g1)
Podemos evidenciar que estos dos gráficos muestran la relación entre el precio y el área construida de las viviendas y los diferentes clusters obtenidos mediante el algoritmo de K-means con k = 4. Cada punto en el gráfico representa una vivienda, donde el eje x representa el cluster al que pertenece y el eje y representa el precio y área construida respectivamente.
Podríamos inferir que el algoritmo de K-means ha identificado grupos distintos basados en estas caracteristicas, siendo el cluster no. 2 en ambas caracteristicas, el que presenta los valores mas elevados,es decir, aquel que tiene una mayor concentración de viviendas con precios y áreas construidas más grandes en comparación con los otros. Por lo tanto, este cluster puede ser de interés especial para análisis adicionales, ya que representa un subconjunto de viviendas con características específicas en términos de precio y su área construida.
Adicional, el clúster número 2 se destaca por exhibir los valores más elevados en la variable “preciom”. Además, se aprecia una correlación en este clúster entre los valores altos de “preciom” y la variable “areaconst”, lo que sugiere que las propiedades con precios superiores tienden también a tener una mayor área construida. Esta asociación brinda una perspectiva significativa sobre la relación entre estas dos variables y contribuye a una comprensión más profunda de la distribución de precios en los distintos clústeres.
Ahora,graficamos sus dos primeras componentes:
fviz_cluster(kmcluster, vivienda3)+
theme_minimal()
En este grafico podemos evidenciar que la primera dimensión explica un 40.3% de variabilidad y la segunda un 21.3%, lo que en total muestra un 61.3% de variabilidad en nuestros datos. Además, esta representación proporciona una visualización de los clusters en un espacio bidimensional y puede ayudar a comprender cómo se agrupan las observaciones en función de las variables utilizadas en el análisis de clustering. En el caso de su separación, se evidencia una clara separación entre ellos y una distribución especifica en el espacio. Con respecto a su densidad, el cluster no. 2 es el que mayor densidad presenta, seguido del no. 1.
Mostramos los centroides de cada cluster
print(kmcluster$centers)
## id zona estrato preciom banios areaconst
## 1 -0.8197633 -1.31322438 -0.4651223 -0.4294328 -0.3634032 -0.26069799
## 2 0.4705011 0.21801313 0.7782555 1.7624666 1.5365551 1.73831062
## 3 -0.1183285 0.76819803 -0.2473433 -0.5280569 -0.4763048 -0.49882472
## 4 0.8055004 0.03473596 0.8861374 0.4324391 0.4189388 0.07959503
## habitaciones parqueaderos
## 1 -0.02764795 -0.4278228
## 2 1.00998865 1.5720629
## 3 -0.33593534 -0.5501621
## 4 -0.04727683 0.1891430
Evaluamos la calidad del clustering
print(kmcluster$tot.withinss)
## [1] 26413.99
Este resultado sugiere que este clúster tiene una alta cohesión interna y una separación clara de los otros clústeres. Una calidad del clúster más alta indica que los puntos dentro de ese clúster son más similares entre sí en comparación con los puntos en otros clústeres.
Esto puede ser indicativo de una agrupación muy definida y homogénea de observaciones que comparten características similares en términos de las variables utilizadas para la agrupación. Por lo tanto, es probable que las propiedades o elementos dentro de este clúster compartan características distintivas y puedan ser fácilmente identificadas como parte de un grupo cohesivo en el conjunto de datos.
El análisis de correspondencia, también llamado promedio recíproco, es una técnica de visualización de la ciencia de datos útil para descubrir y mostrar la relación entre categorías. Utiliza un gráfico que traza datos, mostrando visualmente el resultado de dos o más puntos de datos.
Iniciamos con el analisis de la relacion entre las variables zona y estrato.
devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
## Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
##
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb446ffaa0\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
✔ checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb446ffaa0\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION'
##
─ preparing 'paqueteMODELOS':
## checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ building 'paqueteMODELOS_0.1.0.tar.gz'
##
##
## Warning: package 'paqueteMODELOS' is in use and will not be installed
library(paqueteMODELOS)
data("vivienda") #base de datos
data_3 = data.frame(vivienda)
data_subset <- data_3[, c("estrato", "zona", "tipo","barrio")]
# Crear la tabla de frecuencias para el análisis de correspondencia
tabla <- table(data_subset$estrato, data_subset$zona)
# Realizar el análisis de correspondencia
resultados_ac <- CA(tabla)
# Imprimir los resultados
print(resultados_ac)
## **Results of the Correspondence Analysis (CA)**
## The row variable has 4 categories; the column variable has 5 categories
## The chi square of independence between the two variables is equal to 3830.435 (p-value = 0 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
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")
En este grafico se puede observar el comportamiento de esta dos variables, demostrando lo siguiente:
El estrato 6 se encuentra en la zona Oeste
El estrato 3 se evidencia en la zona Oriente y en la zona centro.
El estrato 4 y 5 hacen parte de la zona sur.
En la zona norte no se relaciona ninguno de los estratos.
Ahora teniendo en cuenta los componentes princiaples (precio y area construida), se realizará el respectivo analisis, haciendo la conversión de estas variables numéricas a categóricasm iniciamos con el precio:
devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
## Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
##
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb47ba736b0\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb47ba736b0\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
✔ checking for file 'C:\Users\mjreinat\AppData\Local\Temp\RtmpqCTnRB\remotes6fb47ba736b0\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION'
##
─ preparing 'paqueteMODELOS':
## checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ building 'paqueteMODELOS_0.1.0.tar.gz'
##
##
## Warning: package 'paqueteMODELOS' is in use and will not be installed
library(paqueteMODELOS)
data("vivienda") #base de datos
data_3 = data.frame(vivienda)
data_3 = na.omit(data_3)
q1 <- quantile(data_3$preciom, c(0.25), type = 6)
q2 <- quantile(data_3$preciom, c(0.50), type = 6)
q3 <- quantile(data_3$preciom, c(0.75), type = 6)
data_3 <- data_3 %>% mutate(value = ifelse(preciom <= q1, "Precio Bajo", ifelse(preciom <= q2," Precio medio",ifelse(preciom <= q3,"Precio medio alto","Precio alto"))))
tabla <- table(data_3$zona, data_3$value)
chisq.test(tabla)
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 550.28, df = 12, p-value < 2.2e-16
resultados_ac <- CA(tabla)
valores_prop <-resultados_ac$eig ; valores_prop
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.106800906 93.315515 93.31551
## dim 2 0.005143908 4.494404 97.80992
## dim 3 0.002506579 2.190082 100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
En este grafico se puede observar el comportamiento de esta dos variables, demostrando lo siguiente:
- Las viviendas con precio “Medio alto” y “Alto” se encuentran en la zona Oeste.
- Las viviendas con precios “Medio” y “Bajo” se encuentran en la Zona Oriente, Zona Centro y Zona Sur.
- En la zona norte no se relaciona ninguno de los precios.
Continuamos con la variable Area construida:
q1 <- quantile(data_3$areaconst, c(0.25), type = 6)
q2 <- quantile(data_3$areaconst, c(0.50), type = 6)
q3 <- quantile(data_3$areaconst, c(0.75), type = 6)
data_3 <- data_3 %>% mutate(value = ifelse(preciom <= q1, "Pequena", ifelse(preciom <= q2,"Mediana",ifelse(preciom <= q3,"Grande","Muy grande"))))
tabla <- table(data_3$zona, data_3$value)
chisq.test(tabla)
## Warning in chisq.test(tabla): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 278.81, df = 12, p-value < 2.2e-16
resultados_ac <- CA(tabla)
valores_prop <-resultados_ac$eig ; valores_prop
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.041307688 71.234756 71.23476
## dim 2 0.014147995 24.398097 95.63285
## dim 3 0.002532426 4.367147 100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
En este grafico se puede observar el comportamiento de esta dos variables, demostrando lo siguiente:
- Las viviendas con un area grande y muy grande se encuentran en la Zona Sur.
- En la zona oeste se encuentran las casas con una dimensión muy grande.