Ejercicio 1:

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.

Retos:

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:

  1. 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 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.

  1. 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.

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.

  1. Analisis de correspondencia: Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.

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:

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.