En el presente documento realizaremos el analisis multivariado para una empresa de venta de inmuebles , en primera instancia debemos analisis el contexto del problema a resolver.
Ahora debemos entender el contexto con el cual debemos basarnos para obtener los resultados esperados
Una empresa inmobiliaria lider en una gran ciudad esta buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratagicas mas informadas. La empresa posee una base de datos extensa que contiene informacion detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un analisis holC-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 valoracion de propiedades.
El reto principal consiste en en realizar un analisis integral y multidimensional de la base de datos para obtener una comprension del mercado inmobiliario urbano. Se requiere aplicar diversas tecnicas de analisis de datos, incluyendo:
1.Analisis de Componentes Principales: Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar caracteristicas clave que influyen en la variacion de precios y oferta del mercado.
2. Analisis de Conglomerados: Agrupar las propiedades residenciales en segmentos homogeneos con caracteristicas similares para entender las dinimicas de las ofertas especificas en diferentes partes de la ciudad y en diferentes estratos socioeconomicos.
3. Analisis de Correspondencia : Examinar la relacion entre las variables categoricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
4. Visualizacion de resultados: Presentar graficos, mapas y otros recursos visuales para comunicar los hallazgos de manera clara y efectiva a la direccion de la empresa.
El informe final debe incluir analisis detallados de los resultados obtenidos, las conclusiones clave y las recomendaciones especificas para guiar las decisiones estrategicas de la empresa inmobiliaria. Se espera que este analisis de datos proporcione ventajas competitivas en el mercado, optimizando la inversion y maximizando los beneficios en un entorno altamente competitivo y en constante cambio.
Enlace de informe publicado en RPubs escrito en RMarkdown
Para dar comienzo con el informe primero debemos aclarar que este
documento estara dividido en 7 partes las cuales son:
1.
Analisis y limpieza de la informacion en este punto visualizaremos
los aspectos basicos de la informacion lidiaremos con datos atipicos,
nulos, faltantes y redundantes
2.Analisis de Componentes Principales
se llevara a
cabo el dise??o , analisis y desarrollo de un analisis de Componentes
Principales
3.Analisis de Conglomerados
se llevara a cabo el
dise??o , analisis y desarrollo de un analisis de Conglomerados
4.Analisis de Correspondencia
se llevara a cabo el
dise??o , analisis y desarrollo de un analisis de Correspondencia
5.VisualizaciC3n de resultados
se llevara a cabo
el dise??o , analisis y desarrollo de una Visualizacion de
resultados
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
Para dar inicio a el proceso de creaci??n de estos an??lisis primero debemos realizar una limpieza y entendimiento de la data para lo cual primero validaremos los tipos de adtos, cantidad de atributos y cantidad de registros validaremos si contamos con datos nullos, lo cual podemos ver en las siguientes graficas
dim(vivienda)
## [1] 8322 13
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>
Como podemos observar hay un total de 15 atributos con un total de 8322 registros adem??s que poseemos las columnas zona, piso, tipo y barrio como datos texto , mientras que todos los dem??s son de tipo num??rico
1.1. como segundo paso validaremos si contamos con datos nullos, lo cual podemos ver en las siguientes graficas
## # A tibble: 13 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 piso 2638 31.7
## 2 parqueaderos 1605 19.3
## 3 id 3 0.0360
## 4 zona 3 0.0360
## 5 estrato 3 0.0360
## 6 areaconst 3 0.0360
## 7 banios 3 0.0360
## 8 habitaciones 3 0.0360
## 9 tipo 3 0.0360
## 10 barrio 3 0.0360
## 11 longitud 3 0.0360
## 12 latitud 3 0.0360
## 13 preciom 2 0.0240
Como podemos darnos cuenta la data presenta datos faltantes en gran medida en los atributos de piso y parqueaderos, pero todos los dem??s presentan datos faltantes, realizando el an??lisis, podemos observar que un 31% de la data de piso esta nula y que un 19% de la data de parqueaderos esta nula.
Si bien la mayor??a de los datos nulos est??n en solo dos atributos, los dem??s presentan 3 registros nulos y esos tres registros pueden ser validados en la siguiente tabla
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NA <NA> <NA> NA NA NA NA NA NA
## 2 NA <NA> <NA> NA NA NA NA NA NA
## 3 NA <NA> <NA> NA 330 NA NA NA NA
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Ahora procedemos a realizar la eliminacion de estos registros debido a que no representan ninguna modificacion significativa de registros
## # A tibble: 8,319 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … <NA> 3 250 70 1 3 6
## 2 1169 Zona … <NA> 3 320 120 1 2 3
## 3 1350 Zona … <NA> 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Como siguiente paso eliminamos los datos duplicados de la siguiente forma
#prcedemos a dejar la base sin registros duplicados
#devtools::install_github("edzer/sp")
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
BaseLimpia = distinct(BaseLimpia)
BaseLimpia
## # A tibble: 8,319 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … <NA> 3 250 70 1 3 6
## 2 1169 Zona … <NA> 3 320 120 1 2 3
## 3 1350 Zona … <NA> 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Procedemos a volver las variables zona y tipo para que sean de tipo numerico, esto lo podemos visualizar en la siguiente tabla
BaseLimpia$zona_numero= case_when( BaseLimpia$zona=="Zona Centro" ~ '1',
BaseLimpia$zona=="Zona Norte" ~ '2',
BaseLimpia$zona=="Zona Oeste" ~ '3',
BaseLimpia$zona=="Zona Oriente" ~ '4',
BaseLimpia$zona=="Zona Sur" ~ '5')
BaseLimpia$Tipo_numero= case_when( BaseLimpia$tipo=="Casa" ~ '1',
BaseLimpia$tipo=="Apartamento" ~ '2')
BaseLimpia
## # A tibble: 8,319 × 15
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … <NA> 3 250 70 1 3 6
## 2 1169 Zona … <NA> 3 320 120 1 2 3
## 3 1350 Zona … <NA> 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 6 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # zona_numero <chr>, Tipo_numero <chr>
Luego de realizado todas estas modificaciones debemos ver todos los valores ingresados por atributo, tal y como se muestra en las siguientes tablas
library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
agrupacionzona=sqldf("SELECT zona, COUNT(*) as Freq FROM BaseLimpia GROUP BY zona")
agrupacionzona
## zona Freq
## 1 Zona Centro 124
## 2 Zona Norte 1920
## 3 Zona Oeste 1198
## 4 Zona Oriente 351
## 5 Zona Sur 4726
agrupacionPiso=sqldf("SELECT piso, COUNT(*) as Freq FROM BaseLimpia GROUP BY piso")
agrupacionPiso
## piso Freq
## 1 <NA> 2635
## 2 01 860
## 3 02 1450
## 4 03 1097
## 5 04 607
## 6 05 567
## 7 06 245
## 8 07 204
## 9 08 211
## 10 09 146
## 11 10 130
## 12 11 84
## 13 12 83
agrupacionparqueaderos=sqldf("SELECT parqueaderos, COUNT(*) as Freq FROM BaseLimpia GROUP BY parqueaderos")
agrupacionparqueaderos
## parqueaderos Freq
## 1 NA 1602
## 2 1 3155
## 3 2 2475
## 4 3 520
## 5 4 384
## 6 5 68
## 7 6 68
## 8 7 18
## 9 8 17
## 10 9 4
## 11 10 8
agrupacionbanios=sqldf("SELECT banios, COUNT(*) as Freq FROM BaseLimpia GROUP BY banios")
agrupacionbanios
## banios Freq
## 1 0 45
## 2 1 496
## 3 2 2946
## 4 3 1993
## 5 4 1456
## 6 5 890
## 7 6 314
## 8 7 107
## 9 8 48
## 10 9 15
## 11 10 9
agrupacionhabitaciones=sqldf("SELECT habitaciones, COUNT(*) as Freq FROM BaseLimpia GROUP BY habitaciones")
agrupacionhabitaciones
## habitaciones Freq
## 1 0 66
## 2 1 59
## 3 2 926
## 4 3 4097
## 5 4 1729
## 6 5 679
## 7 6 318
## 8 7 173
## 9 8 138
## 10 9 83
## 11 10 51
agrupaciontipo=sqldf("SELECT tipo, COUNT(*) as Freq FROM BaseLimpia GROUP BY tipo")
agrupaciontipo
## tipo Freq
## 1 Apartamento 5100
## 2 Casa 3219
agrupacionbarrio=sqldf("SELECT barrio, COUNT(*) as Freq FROM BaseLimpia GROUP BY barrio")
agrupacionbarrio=tail(agrupacionbarrio)
agrupacionbarrio
## barrio Freq
## 431 zona norte 32
## 432 zona norte los 1
## 433 zona oeste 26
## 434 zona oriente 18
## 435 zona residencial 1
## 436 zona sur 74
Ahora debemos arreglar los nombres de los barrios debido a que tiene inconsistencias de tildes , espacios y datos duplicados, de lo cual obtenemos el siguiente resultado:
library(stringi)
BaseLimpia$barrio= toupper(stri_trans_general(BaseLimpia$barrio,"Latin-ASCII"))
col_modi =c ("barrio")
#procedemos a unificar datos de barrios duplicados o mal creados
barrio = c("AGUA BLANCA")
#modificamos las diferentes variables de casa
BaseLimpia[col_modi] = sapply(BaseLimpia[col_modi], function(x) replace(x,x %in% barrio, "AGUABLANCA"))
#procedemos a unificar datos de barrios duplicados o mal creados
barrio = c("EL INGENIO 3")
#modificamos las diferentes variables de casa
BaseLimpia[col_modi] = sapply(BaseLimpia[col_modi], function(x) replace(x,x %in% barrio, " EL INGENIO III"))
#procedemos a unificar datos de barrios duplicados o mal creados
barrio = c("INGENIO","INGENIO I")
#modificamos las diferentes variables de casa
BaseLimpia[col_modi] = sapply(BaseLimpia[col_modi], function(x) replace(x,x %in% barrio, " EL INGENIO I"))
#procedemos a unificar datos de barrios duplicados o mal creados
barrio = c("INGENIO II")
#modificamos las diferentes variables de casa
BaseLimpia[col_modi] = sapply(BaseLimpia[col_modi], function(x) replace(x,x %in% barrio, " EL INGENIO II"))
#procedemos a unificar datos de barrios duplicados o mal creados
barrio = c("VALLE DE LILI")
#modificamos las diferentes variables de casa
BaseLimpia[col_modi] = sapply(BaseLimpia[col_modi], function(x) replace(x,x %in% barrio, "VALLE DEL LILI"))
agrupacionbarrio=sqldf("SELECT barrio, COUNT(*) as Freq FROM BaseLimpia GROUP BY barrio ")
agrupacionbarrio=head(agrupacionbarrio)
agrupacionbarrio
## barrio Freq
## 1 EL INGENIO I 2
## 2 EL INGENIO II 1
## 3 EL INGENIO III 1
## 4 20 DE JULIO 3
## 5 3 DE JULIO 1
## 6 ACOPI 158
Ahora debemos validar si las variables tiene correlaci??n entre si , pero solo se realizara con variables num??ricas y tenemos el siguiente resultado
#calculamos la matriz de correlaciom para los atributos
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## The following object is masked from 'package:boot':
##
## logit
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ✔ readr 2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ psych::alpha() masks ggplot2::alpha()
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter() masks 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
#generamos el dataframe solo con datos numericos
BaselimpiaNumericacor= BaseLimpia[, c(1, 3:9, 14, 15)]
BaselimpiaNumericacor$zona_numero=as.numeric(BaselimpiaNumericacor$zona_numero)
BaselimpiaNumericacor$piso =as.numeric(BaselimpiaNumericacor$piso)
BaselimpiaNumericacor$Tipo_numero =as.numeric(BaselimpiaNumericacor$Tipo_numero)
BaselimpiaNumericacor=subset( BaselimpiaNumericacor, !is.na(BaselimpiaNumericacor$piso))
BaselimpiaNumericacor=subset( BaselimpiaNumericacor, !is.na(BaselimpiaNumericacor$parqueaderos))
BaselimpiaNumericacor
## # A tibble: 4,808 × 10
## id piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5992 2 4 400 280 3 5 3
## 2 1212 1 5 260 90 1 2 3
## 3 1724 1 5 240 87 1 3 3
## 4 2326 1 4 220 52 2 2 3
## 5 4386 1 5 310 137 2 3 4
## 6 1209 2 5 320 150 2 4 6
## 7 1592 2 5 780 380 2 3 3
## 8 4460 2 4 625 355 3 5 5
## 9 6081 2 5 750 237 2 6 6
## 10 7497 2 6 520 98 2 2 2
## # ℹ 4,798 more rows
## # ℹ 2 more variables: zona_numero <dbl>, Tipo_numero <dbl>
str(BaselimpiaNumericacor)
## tibble [4,808 × 10] (S3: tbl_df/tbl/data.frame)
## $ id : num [1:4808] 5992 1212 1724 2326 4386 ...
## $ piso : num [1:4808] 2 1 1 1 1 2 2 2 2 2 ...
## $ estrato : num [1:4808] 4 5 5 4 5 5 5 4 5 6 ...
## $ preciom : num [1:4808] 400 260 240 220 310 320 780 625 750 520 ...
## $ areaconst : num [1:4808] 280 90 87 52 137 150 380 355 237 98 ...
## $ parqueaderos: num [1:4808] 3 1 1 2 2 2 2 3 2 2 ...
## $ banios : num [1:4808] 5 2 3 2 3 4 3 5 6 2 ...
## $ habitaciones: num [1:4808] 3 3 3 3 4 6 3 5 6 2 ...
## $ zona_numero : num [1:4808] 5 2 2 2 2 2 2 2 2 2 ...
## $ Tipo_numero : num [1:4808] 1 2 2 2 2 1 1 1 1 2 ...
corPlot(BaselimpiaNumericacor, cex = 1.2, main = "Matriz de correlaci??n", xsrt = 90 )
Luego de llevado acabo la identificaci??n de los nulos debemos cargar la data para lo cual en el caso del piso y los parqueaderos se cargaran con la moda de cada campo
#calculamos la moda del precio
frecuencia_piso = data.frame(table(BaseLimpia$piso))
modapiso = frecuencia_piso[which.max(frecuencia_piso$Freq),1]
modapiso
## [1] 02
## Levels: 01 02 03 04 05 06 07 08 09 10 11 12
#modificamos los valores nulos a piso por la moda
BaseLimpia$piso= case_when( is.na(BaseLimpia$piso) ~ modapiso,
!is.na(BaseLimpia$piso) ~ BaseLimpia$piso)
#calculamos la moda de los paqueaderos
frecuencia_parqueaderos = data.frame(table(BaseLimpia$parqueaderos))
modaparq = frecuencia_parqueaderos[which.max(frecuencia_parqueaderos$Freq),1]
modaparq
## [1] 1
## Levels: 1 2 3 4 5 6 7 8 9 10
#modificamos los valores nulos de parqueaderos
BaseLimpia$parqueaderos= case_when( is.na(BaseLimpia$parqueaderos) ~ 1 , !is.na(BaseLimpia$parqueaderos) ~ BaseLimpia$parqueaderos)
BaseLimpia
## # A tibble: 8,319 × 15
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … 02 3 250 70 1 3 6
## 2 1169 Zona … 02 3 320 120 1 2 3
## 3 1350 Zona … 02 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 6 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # zona_numero <chr>, Tipo_numero <chr>
Luego volveremos a valdiar los nulos y podemos observar en las siguientes tablas que ya no quedan datos nulos que tratar
#faltantesporcen=n_miss(vivienda_faltantes$id)
faltantesVar = naniar::miss_var_summary(BaseLimpia)
faltantesVar
## # A tibble: 15 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 id 0 0
## 2 zona 0 0
## 3 piso 0 0
## 4 estrato 0 0
## 5 preciom 0 0
## 6 areaconst 0 0
## 7 parqueaderos 0 0
## 8 banios 0 0
## 9 habitaciones 0 0
## 10 tipo 0 0
## 11 barrio 0 0
## 12 longitud 0 0
## 13 latitud 0 0
## 14 zona_numero 0 0
## 15 Tipo_numero 0 0
dim(BaseLimpia)
## [1] 8319 15
por ultimo validaremos los outliers de la informacion y podemos determinar que los atributos con mayor cantidad de datos atipicos son el areaconst y el preciom, por lo cual debemos crear rangos para manejar esta informacion
#generamos el dataframe solo con datos numericos
Base_cajas = BaseLimpia[, c(3:9 , 12: 15)]
Base_cajas$zona_numero=as.numeric(Base_cajas$zona_numero)
Base_cajas$piso =as.numeric(Base_cajas$piso)
Base_cajas$Tipo_numero =as.numeric(Base_cajas$Tipo_numero)
Base_cajas
## # A tibble: 8,319 × 11
## piso estrato preciom areaconst parqueaderos banios habitaciones longitud
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 3 250 70 1 3 6 -76.5
## 2 2 3 320 120 1 2 3 -76.5
## 3 2 3 350 220 2 2 4 -76.5
## 4 2 4 400 280 3 5 3 -76.5
## 5 1 5 260 90 1 2 3 -76.5
## 6 1 5 240 87 1 3 3 -76.5
## 7 1 4 220 52 2 2 3 -76.5
## 8 1 5 310 137 2 3 4 -76.5
## 9 2 5 320 150 2 4 6 -76.5
## 10 2 5 780 380 2 3 3 -76.5
## # ℹ 8,309 more rows
## # ℹ 3 more variables: latitud <dbl>, zona_numero <dbl>, Tipo_numero <dbl>
boxplot(Base_cajas$piso, horizontal = TRUE, main="Diagrama De Cajas de Piso")
boxplot(Base_cajas$estrato, horizontal = TRUE, main="Diagrama De Cajas de estrato")
boxplot(Base_cajas$preciom, horizontal = TRUE, main="Diagrama De Cajas de preciom")
boxplot(Base_cajas$areaconst, horizontal = TRUE, main="Diagrama De Cajas de areaconst")
boxplot(Base_cajas$parqueaderos, horizontal = TRUE, main="Diagrama De Cajas de parqueaderos")
boxplot(Base_cajas$banios, horizontal = TRUE, main="Diagrama De Cajas de banios")
boxplot(Base_cajas$habitaciones, horizontal = TRUE, main="Diagrama De Cajas de habitaciones")
boxplot(Base_cajas$zona_numero, horizontal = TRUE, main="Diagrama De Cajas de zona_numero")
boxplot(Base_cajas$Tipo_numero, horizontal = TRUE, main="Diagrama De Cajas de Tipo_numero")
como resultado final tendriamos esta base limpia y lista para procesamiento
BaseLimpia
## # A tibble: 8,319 × 15
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … 02 3 250 70 1 3 6
## 2 1169 Zona … 02 3 320 120 1 2 3
## 3 1350 Zona … 02 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 6 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # zona_numero <chr>, Tipo_numero <chr>
#generamos el dataframe solo con datos numericos
BaselimpiaNumerica= BaseLimpia[, c(1, 3:9, 12:15)]
BaselimpiaNumerica$zona_numero=as.numeric(BaselimpiaNumerica$zona_numero)
BaselimpiaNumerica$piso =as.numeric(BaselimpiaNumerica$piso)
BaselimpiaNumerica$Tipo_numero =as.numeric(BaselimpiaNumerica$Tipo_numero)
BaselimpiaNumerica
## # A tibble: 8,319 × 12
## id piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 2 3 250 70 1 3 6
## 2 1169 2 3 320 120 1 2 3
## 3 1350 2 3 350 220 2 2 4
## 4 5992 2 4 400 280 3 5 3
## 5 1212 1 5 260 90 1 2 3
## 6 1724 1 5 240 87 1 3 3
## 7 2326 1 4 220 52 2 2 3
## 8 4386 1 5 310 137 2 3 4
## 9 1209 2 5 320 150 2 4 6
## 10 1592 2 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 4 more variables: longitud <dbl>, latitud <dbl>, zona_numero <dbl>,
## # Tipo_numero <dbl>
Toda la informacion haste este momento fue depurada y limpiada para realizar cada uno de los analisis que se analizaran en los siguientes numerales
para el proceso de analisis de componentes poseemos una data numerica ya tratada la cual consta de 8319 registros, se quiere resumir las variables cuantitiativas (estrato, previom,areaconst,parqueaderos,banios y habitaciones) en por lo menos dos componentes principales y poder adicionar elelmentos al analisis
#generamoss la data con datos numericos a evaluar
BaselimpiaComponenetes= BaselimpiaNumerica[,3:8]
BasecasaZ= scale(BaselimpiaComponenetes) # datos estandarizados
#miramso como queda la base
str(BaselimpiaComponenetes)
## tibble [8,319 × 6] (S3: tbl_df/tbl/data.frame)
## $ estrato : num [1:8319] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8319] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8319] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8319] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8319] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8319] 6 3 4 3 3 3 3 4 6 3 ...
Ahora procederemos a verificar los nulos que posee el dataset a analizar
#paquere a instalar Mice
#validamos datos faltantes en el nuevo data frame
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
md.pattern(BaselimpiaComponenetes)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## estrato preciom areaconst parqueaderos banios habitaciones
## 8319 1 1 1 1 1 1 0
## 0 0 0 0 0 0 0
la grafica anterior nos demuestra que no se presentan datos faltantes, como paso siguiente y para evitar que variables como el precio o el area contruida las cuales tienen valores de escala mas grande procedemos a realizar la estandizacion de los valores, tal y como se muestra acontinuacion:
como siguiente paso del análisis debemos realizar un escalamiento de los datos ya que estos serán usados para el análisis de componentes
#escalamiento de atributos
BaselimpiaComponenetes2 = BaselimpiaComponenetes %>% scale()
head(BaselimpiaComponenetes2)
## estrato preciom areaconst parqueaderos banios habitaciones
## [1,] -1.5872276 -0.5595498 -0.7339949 -0.6343338 -0.07793773 1.6406840
## [2,] -1.5872276 -0.3465670 -0.3842568 -0.6343338 -0.77811479 -0.4147626
## [3,] -1.5872276 -0.2552886 0.3152194 0.3063120 -0.77811479 0.2703863
## [4,] -0.6156201 -0.1031580 0.7349051 1.2469577 1.32241640 -0.4147626
## [5,] 0.3559875 -0.5291236 -0.5940997 -0.6343338 -0.77811479 -0.4147626
## [6,] 0.3559875 -0.5899759 -0.6150839 -0.6343338 -0.07793773 -0.4147626
Luego procedemos a crear el análisis de componentes principales en el cual utilizaremos la función PRcomp y como resultado tendremos una representacion de la dimensionalidad, para este caso se muestra a 6 componentes, tal y como se muestra en la siguiente tabla
#Aplicamos el Analisis de componentes Principales
ComPrincipal = prcomp(BaselimpiaComponenetes2)
#vemos las desviaciones de los componentes
ComPrincipal$sdev
## [1] 1.8548043 1.1090285 0.7114871 0.6302098 0.4888810 0.4328671
# Vemos la matriz de rotación
ComPrincipal$rotation
## PC1 PC2 PC3 PC4 PC5
## estrato 0.3184736 -0.5997873 0.54963411 0.06730448 -0.44808657
## preciom 0.4774520 -0.2162015 -0.06330839 -0.30070063 0.20204960
## areaconst 0.4454028 0.2186747 -0.26369861 -0.66448034 -0.22628539
## parqueaderos 0.4158692 -0.2036540 -0.65206510 0.58065836 -0.09841455
## banios 0.4649822 0.1796409 0.36641820 0.19604360 0.69306968
## habitaciones 0.2882272 0.6869845 0.25476706 0.29650950 -0.46600247
## PC6
## estrato 0.1772588
## preciom -0.7681430
## areaconst 0.4376318
## parqueaderos 0.1163587
## banios 0.3138149
## habitaciones -0.2738521
como siguiente paso en el proceso debemos realizar la eleccion del numero de componentes principales
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#factoextra paquete a instalar
#BaselimpiaComponenetes2= scale(BaselimpiaComponenetes)
res.pca = ComPrincipal
fviz_eig(res.pca, addlabels = TRUE)
para nuestro caso puntual de viviendas y teniendo en cuenta que el primer componente explica el 57.9% de la variabilidad contenida en la base y además que la suma entre los dos primeros componentes suma 77% de los datos, nos indicaría que con solo una variable obtenida por una combinación lineal de las variables podríamos resumir en gran parte la variabilidad que contiene la base de datos.
En la siguiente grafica podemos visualizar cada uno de los comportamientos que posee los atributos de la base de datos estudiada
#vixualizamos las variables en un plano de componentes
GraficaVariavlePCA=fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
GraficaVariavlePCA
Ahora procederemos a generar los valores mínimos y máximos de cada uno de los atributos
# obtenemos los maximos y minimos de cada atributo
max_preciom = which.max(BaselimpiaComponenetes$preciom)
min_preciom = which.min(BaselimpiaComponenetes$preciom)
max_areaconst = which.max(BaselimpiaComponenetes$areaconst)
min_areaconst = which.min(BaselimpiaComponenetes$areaconst)
max_banios = which.max(BaselimpiaComponenetes$banios)
min_banios = which.min(BaselimpiaComponenetes$banios)
max_habita = which.max(BaselimpiaComponenetes$habitaciones)
min_habita = which.min(BaselimpiaComponenetes$habitaciones)
max_estrato = which.max(BaselimpiaComponenetes$estrato)
min_estrato = which.min(BaselimpiaComponenetes$estrato)
max_parqueo = which.max(BaselimpiaComponenetes$parqueaderos)
min_parqueo = which.min(BaselimpiaComponenetes$parqueaderos)
# generamos data frame para las coordenadas maximas
extremos <- data.frame(
PC1 = ComPrincipal$x[c(max_preciom, min_preciom, max_areaconst, min_areaconst,
max_banios, min_banios, max_habita, min_habita, max_estrato, min_estrato, max_parqueo, min_parqueo), 1],
PC2 = ComPrincipal$x[c(max_preciom, min_preciom, max_areaconst, min_areaconst,
max_banios, min_banios, max_habita, min_habita, max_estrato, min_estrato, max_parqueo, min_parqueo), 2],
label = c("Max Preciom", "Min Preciom", "Max Areaconst", "Min Areaconst",
"Max Banios", "Min Banios", "Max Habitaciones", "Min Habitaciones",
"Max Estrato","Min Estrato","Max Parqueaderos","Min Parqueaderos")
)
#generamos los registros con valores maximos de cada atributo
max_preciom
## [1] 5866
min_preciom
## [1] 326
max_areaconst
## [1] 3155
min_areaconst
## [1] 8192
max_banios
## [1] 461
min_banios
## [1] 30
max_habita
## [1] 280
min_habita
## [1] 30
max_estrato
## [1] 11
min_estrato
## [1] 1
max_parqueo
## [1] 1762
min_parqueo
## [1] 1
cómo podemos visualizar para este caso de viviendas el primer componente esta principalmente asociado a las habitaciones, mientras que el segundo componente se puede asociar a el estrato.
Conclusion:podemos observar que existen datos atipicos en los atributos de habitaciones,baños, precio y parqueaderoslibrary(ggplot2)
library(ggrepel)
library(tidyverse)
library(cluster)
library(tibble)
# Crear el gráfico de PCA con etiquetas para los puntos extremos
p <- fviz_pca_ind(ComPrincipal,
geom.ind = "point",
col.ind = "grey80",
alpha.ind = 0.5,
pointsize = 1,
repel = FALSE) +
geom_point(data = extremos, aes(x = PC1, y = PC2, color = label), size = 4) +
scale_color_manual(values = c("Max Preciom" = "blue", "Min Preciom" = "blue",
"Max Areaconst" = "red", "Min Areaconst" = "red",
"Max Banios" = "green", "Min Banios" = "green",
"Max Habitaciones" = "purple", "Min Habitaciones" = "purple", "Max Estrato"="yellow","Min Estrato"="yellow","Max Parqueaderos"="orange","Min Parqueaderos"="orange")) +
geom_label_repel(data = extremos, aes(x = PC1, y = PC2, label = label, fill = label),
size = 3.5, box.padding = 0.35, point.padding = 0.5,
segment.color = 'grey50') +
theme_minimal() +
theme(legend.position = "none")
p
En la siguiente grafica podemos observar el comportamiento de cada uno de los atributos con respecto a los estratos y podemos obtener la siguiente conclusion Conclusion:: el atributo de habitaciones es el asociado con el estrato 4, mientras que el área construida y los baños es muy buscada para el estrato 5 y por ultimo los parqueaderos y el precio es tienen un comportamiento negativo en el estrato 6
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = BaseLimpia$estrato,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94") # Individuals color
)
Conclusion: Como podemos darnos cuenta por la grafica podemos evidenciar que el primer componente esta influenciado por precio, baños y el área construida, el segundo componente podemos evidenciar que el estrato tiene una carga significativa negativa, mientras que las habitaciones tienes una alta carga positiva. Mientras que los demás componentes no serán estudiados debido a que su porcentaje de explicación es muy bajo
1.dentro del desarrollo de la estrategia de mercadeo de la empresa se debe tener en cuenta los atributos de precio, área construida y baños esto debido a que explica el 57.3% del primer componente.
se debe tener especial cuidado luego de tener en cuenta los atributos mencionados en el numeral 1, a los atributos de área construida y habitaciones , colocando especial énfasis en el segundo atributo esto debido a que posee una fuerte influencia en el segundo componente llegando a explicar el 20.5% del comportamiento
Las propiedades deben segmentarse no solo por precio y tamaño sino también por estrato para abordar de manera efectiva los diferentes segmentos del mercado.
# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# ----------------------------------------- Aqui termina el analisis de componentes e iniciamos con el analisis de conglomerados----------------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
para dar comienzo con el analsis de conglomerados debemos primero arrancar con la base escalonada que creamos en el analisis de componentes princiaples, esta se usara dentro de todo el proceso de analisis.
mestra= head(BaselimpiaComponenetes2)
mestra
## estrato preciom areaconst parqueaderos banios habitaciones
## [1,] -1.5872276 -0.5595498 -0.7339949 -0.6343338 -0.07793773 1.6406840
## [2,] -1.5872276 -0.3465670 -0.3842568 -0.6343338 -0.77811479 -0.4147626
## [3,] -1.5872276 -0.2552886 0.3152194 0.3063120 -0.77811479 0.2703863
## [4,] -0.6156201 -0.1031580 0.7349051 1.2469577 1.32241640 -0.4147626
## [5,] 0.3559875 -0.5291236 -0.5940997 -0.6343338 -0.77811479 -0.4147626
## [6,] 0.3559875 -0.5899759 -0.6150839 -0.6343338 -0.07793773 -0.4147626
ahora procederemos a validar la distancia euclidiana y generamos los cluster gerarquicos con le metodo complete
#euclidiana
Distancia_euclidiana =dist(BaselimpiaComponenetes2, method = "euclidean")
#manhatan
#Distancia_manhattan =dist(BaselimpiaComponenetes2, method = "manhattan")
#minkowski
#Distancia_minkowski =dist(BaselimpiaComponenetes2, method = "minkowski")
#clusteres jerarquicpos
hc_emp = hclust(Distancia_euclidiana, method = 'complete')
plot(hc_emp, cex = 0.6, main = "Dendograma de Empresas", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_emp, k = 2, border = 2:5)
debido a que no hay una forma sencilla de identificar los clusteres por el grafico de dendograma debemos realizar un análisis no jerárquico con K means e identificar el número de clusters por medio del método del codo
library(NbClust)
# Calculamos K-Means
wss = sapply(1:10, function(k){
kmeans(BaselimpiaComponenetes2, centers = k, nstart = 25)$tot.withinss
})
## Warning: did not converge in 10 iterations
# Graficamos el método del codo
plot(1:10, wss, type = "b", pch = 19, frame = FALSE,
xlab="Número de clústeres K",
ylab="Total dentro de la suma de cuadrados (WSS)")
# Usamos fviz_nbclust
grafica2=fviz_nbclust(BaselimpiaComponenetes2, FUNcluster =kmeans, method = "wss")
grafica2
grafica3=fviz_nbclust(BaselimpiaComponenetes2, FUNcluster =kmeans, method = "silhouette")
## Warning: did not converge in 10 iterations
grafica3
#resnumcluster= NbClust(BaselimpiaComponenetes2, distance= "euclidean", min.nc=2, max.nc=10 , method="kmeans", index="alllong")
#grafica4=fviz_nbclust(resnumcluster)
#grafica4
Luego de realizados los análisis de la función fvis podemos determinar que el número de clústeres apropiado para este dataset es de 2
Ahora procederemos a calcular las siluetas para todos las posibilidades de clústeres y también nos indica que la mejor es la distribución con 2 clústeres con un valor de 0.66
Calcula = function(datos,cluster){
library(tidyverse)
library(cluster)
# Ejecutar K-Means con I clústeres
set.seed(123) # Asegura la reproducibilidad
kmeans1 = kmeans(datos, centers = cluster, nstart = 25)
# Calcular los coeficientes de Silhouette
silhouette_scores = silhouette(kmeans1$cluster, dist(datos))
return(silhouette_scores)
}
#calculamos los indicadores para los 10 clusters
for (numero in 2:10) {
Resultado2=Calcula(BaselimpiaComponenetes,numero)
# Visualizar los coeficientes de Silhouette para N clústeres
graficaresultado=fviz_silhouette(Resultado2) + theme_minimal()
print(graficaresultado)
}
## cluster size ave.sil.width
## 1 1 1396 0.40
## 2 2 6923 0.72
## cluster size ave.sil.width
## 1 1 2155 0.37
## 2 2 591 0.45
## 3 3 5573 0.66
## cluster size ave.sil.width
## 1 1 2532 0.34
## 2 2 1173 0.35
## 3 3 4098 0.61
## 4 4 516 0.40
## cluster size ave.sil.width
## 1 1 404 0.34
## 2 2 2662 0.35
## 3 3 3137 0.61
## 4 4 708 0.35
## 5 5 1408 0.29
## cluster size ave.sil.width
## 1 1 2617 0.36
## 2 2 2965 0.60
## 3 3 180 0.30
## 4 4 1441 0.28
## 5 5 741 0.32
## 6 6 375 0.39
## cluster size ave.sil.width
## 1 1 2958 0.60
## 2 2 614 0.23
## 3 3 622 0.37
## 4 4 180 0.30
## 5 5 365 0.37
## 6 6 2581 0.37
## 7 7 999 0.44
## cluster size ave.sil.width
## 1 1 1034 0.39
## 2 2 2318 0.41
## 3 3 268 0.22
## 4 4 353 0.40
## 5 5 182 0.27
## 6 6 561 0.44
## 7 7 2783 0.57
## 8 8 820 0.31
## cluster size ave.sil.width
## 1 1 460 0.24
## 2 2 2318 0.41
## 3 3 149 0.46
## 4 4 826 0.44
## 5 5 555 0.40
## 6 6 100 0.19
## 7 7 2018 0.61
## 8 8 310 0.44
## 9 9 1583 0.27
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 415950)
## cluster size ave.sil.width
## 1 1 149 0.45
## 2 2 318 0.25
## 3 3 777 0.40
## 4 4 96 0.21
## 5 5 2063 0.60
## 6 6 310 0.43
## 7 7 2278 0.39
## 8 8 1111 0.41
## 9 9 510 0.42
## 10 10 707 0.31
Conclusión: 1. cómo podemos observar el primer clúster está definido por estratos 5 y 6 , que tienen una área promedio de 370 metros cuadrados con 4 habitaciones.
kmeans1 = kmeans(BaselimpiaComponenetes, centers = 2, nstart = 25)
kmeans1
## K-means clustering with 2 clusters of sizes 1396, 6923
##
## Cluster means:
## estrato preciom areaconst parqueaderos banios habitaciones
## 1 5.667622 1034.2923 370.3318 3.011461 4.847421 4.289398
## 2 4.425105 312.8382 135.5338 1.404738 2.761231 3.467427
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 1 1 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 1 2 1 1 1 2
## [112] 2 1 2 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1
## [149] 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 1 1 1 1 2
## [186] 2 2 1 2 2 1 1 1 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 1 1
## [223] 1 2 2 1 1 1 1 1 1 1 2 1 1 2 1 2 1 1 1 1 2 1 2 1 1 1 1 1 1 2 2 1 1 2 2 2 1
## [260] 2 1 2 1 1 1 2 1 1 1 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2
## [297] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [334] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
## [371] 1 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 1 1 1 1 2 2 1 1 1 2 2 1 2 2 2 1 2
## [408] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
## [445] 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 1 2 1 2 2 2 1 1 2 1 2 2 2 2 2 2 1 2
## [482] 2 2 2 2 2 1 2 2 2 1 1 1 1 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [519] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2
## [556] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [593] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [630] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [667] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [704] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1
## [741] 2 1 2 1 2 2 2 1 2 1 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [778] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [815] 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [852] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [889] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [926] 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2
## [963] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1
## [1000] 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1037] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1074] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1111] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1148] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1185] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1222] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1259] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1296] 2 2 2 1 2 2 1 2 1 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1 1 1 2 2 2 1 2
## [1333] 1 2 1 1 2 1 2 1 1 1 1 2 1 1 1 2 2 1 1 2 1 1 1 1 1 1 2 1 2 2 1 1 1 1 1 1 2
## [1370] 1 1 1 1 1 2 1 1 1 2 1 2 2 2 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 2 1 1
## [1407] 1 2 1 1 1 2 1 2 2 1 1 2 1 2 2 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 2 1 2 1 1
## [1444] 1 2 2 2 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1
## [1481] 1 1 1 1 2 2 2 1 1 1 2 1 1 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 1 2 2
## [1518] 2 1 1 1 2 2 2 2 2 1 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1
## [1555] 1 1 2 2 2 1 1 2 1 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 1
## [1592] 2 1 2 1 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [1629] 2 2 1 1 2 1 2 2 2 2 2 1 2 2 2 1 1 2 2 1 1 1 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2
## [1666] 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 1 1 2 1 2 1 2 1 1 1 1 2 2 2 1 2 2 2 2
## [1703] 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1 1 2 2 1 2 2 1 2 1 2 2 1 1 1 2 1 1 1 1 1 1
## [1740] 1 2 1 1 2 2 1 1 2 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 1 1
## [1777] 2 2 1 1 1 2 2 2 2 1 2 1 1 1 1 2 1 1 2 1 1 1 2 1 1 1 2 2 1 1 2 1 1 1 2 2 2
## [1814] 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2
## [1851] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1888] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 2
## [1925] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2
## [1962] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 1 1 2
## [1999] 2 2 2 1 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 1
## [2036] 1 1 2 1 2 1 2 1 2 2 2 2 1 1 1 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2
## [2073] 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2110] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [2147] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2184] 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
## [2221] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2258] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2295] 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2332] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2369] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2406] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2443] 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
## [2480] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 1 2 1 2 2 2 2 2 1 2 2 1 2 1 1 2
## [2517] 2 1 1 1 1 2 2 1 2 2 2 2 2 2 1 2 2 2 1 2 2 2 1 1 1 2 2 2 2 1 2 2 2 2 2 1 1
## [2554] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2591] 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
## [2628] 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 1 2 2 1 2 1 2
## [2665] 2 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 1 2 2 2 1
## [2702] 1 1 1 1 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 1 2 2 1 2 2 2 2 2 2
## [2739] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2
## [2776] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [2813] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 1
## [2850] 1 2 1 1 1 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 2 2
## [2887] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
## [2924] 2 2 1 2 1 1 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1
## [2961] 2 2 2 2 2 2 2 2 1 2 2 1 2 2 1 1 2 1 2 2 2 1 2 2 2 2 1 2 2 1 1 2 2 2 1 2 2
## [2998] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2
## [3035] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [3072] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3109] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [3146] 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3183] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2
## [3220] 2 1 2 1 2 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2
## [3257] 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1
## [3294] 1 2 1 1 1 2 2 2 1 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 2 2 2 1 2 1 2 1 2 1 1
## [3331] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3368] 2 2 2 2 2 1 1 2 1 2 1 2 1 1 2 1 1 2 1 1 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2
## [3405] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3442] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2
## [3479] 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2
## [3516] 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
## [3553] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3590] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3627] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3664] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3701] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2
## [3738] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2
## [3775] 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3812] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3849] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3886] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2
## [3923] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3960] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [3997] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4034] 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4071] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4108] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4145] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4182] 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2
## [4219] 2 2 1 2 2 2 2 2 1 2 2 1 1 2 2 2 1 2 2 2 2 2 1 2 2 1 1 2 1 1 1 2 2 2 2 2 2
## [4256] 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4293] 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 1 1 2 2 1 1 1 1 2 2 2 1
## [4330] 1 2 2 1 1 1 2 2 2 1 1 2 2 1 2 2 2 2 1 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2
## [4367] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
## [4404] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4441] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4478] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4515] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 1 2 2
## [4552] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [4589] 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4626] 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4663] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 1 1 2 1 1 1 2 2 1 2 2 1 2 1 2 2 1 2 2
## [4700] 2 2 1 1 2 1 2 2 2 2 1 1 2 2 1 2 1 1 2 1 2 1 1 1 2 2 2 2 1 2 2 2 2 1 2 2 2
## [4737] 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 1 2 2 1 2 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 1 2
## [4774] 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1 2 2 2 2 1 2 2 2 2 2 2
## [4811] 1 2 1 2 1 2 2 1 1 2 1 1 2 1 2 1 2 2 1 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4848] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2
## [4885] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [4922] 2 2 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
## [4959] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1
## [4996] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 1 2 1 2 1
## [5033] 2 1 2 2 2 2 2 1 2 1 1 1 1 2 2 1 1 1 2 2 1 1 1 1 1 2 1 1 2 1 2 1 1 1 1 1 2
## [5070] 2 2 1 1 2 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 2 1 2 1 1 2 2 2 2 1 1 1 1 2 2 1
## [5107] 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 2 2 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1 2 1 2
## [5144] 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 1 2 1 1 1 1 2 1 1 1 1 2
## [5181] 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 1 1 2 1 1 1 2 1 2 1 2 2 2 2 1 1 1 2
## [5218] 1 2 1 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 1
## [5255] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 1 2 1 2 2 2 2 1
## [5292] 1 2 1 2 1 2 2 2 2 2 2 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 2 1 2 2 2 2 2 1 1
## [5329] 2 2 2 2 1 1 1 2 2 2 1 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [5366] 2 2 2 1 2 1 2 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 2 2 1 1 1 2 2
## [5403] 1 1 2 1 1 2 1 1 1 2 1 1 1 2 1 1 2 1 1 1 2 2 1 2 1 1 1 2 2 1 2 1 1 1 1 1 1
## [5440] 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 2 2 2 1 1 2 2 2 1 2 2
## [5477] 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5514] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1
## [5551] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2
## [5588] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5625] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2
## [5662] 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2
## [5699] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5736] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5773] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5810] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [5847] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 1 1 2 1 2 1 1 2 2 2 2 2 2 1 2 1 2 2 2
## [5884] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2
## [5921] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2
## [5958] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2
## [5995] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2
## [6032] 2 2 2 2 2 1 2 2 1 2 2 2 2 2 1 2 1 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2
## [6069] 2 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6106] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6143] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2
## [6180] 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 1 1 2 1
## [6217] 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1 1 1 1 1 2 2 1 1 1 1 1 2 2 1 1 2 2 2 2 2 1
## [6254] 1 2 2 1 2 1 2 1 1 2 1 2 1 2 2 1 2 1 2 1 2 2 2 2 2 1 2 1 2 2 1 2 1 1 2 2 1
## [6291] 2 2 1 2 1 2 2 2 1 2 2 2 1 1 1 2 1 2 2 2 2 2 1 1 2 2 2 2 2 1 1 1 2 1 1 1 2
## [6328] 2 2 2 2 1 2 1 2 2 2 2 1 2 2 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 2 1 2 1 2 1 1
## [6365] 2 2 2 1 2 2 2 1 2 2 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 2 1 2 2 2 1 1 2 1 1
## [6402] 2 1 1 2 2 2 1 1 1 2 1 2 1 1 1 2 1 1 1 1 1 2 2 1 2 2 1 2 2 2 1 1 2 1 2 2 2
## [6439] 2 2 1 2 2 2 1 2 1 1 2 2 2 2 1 1 2 2 2 1 2 2 1 2 1 2 2 2 2 2 1 1 2 1 1 2 1
## [6476] 2 2 1 2 1 2 2 2 1 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 2 1
## [6513] 1 1 2 1 2 1 2 1 1 1 2 1 1 2 1 2 1 1 2 1 1 1 1 1 1 1 2 1 1 2 2 2 1 1 1 1 1
## [6550] 2 1 1 2 2 2 2 2 2 1 2 1 1 1 2 1 2 2 1 1 2 2 2 2 1 1 2 1 1 2 1 1 2 2 1 2 1
## [6587] 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 2 2 1 2 1 1 2 2 1 2 2 1 2 2 1 1
## [6624] 1 2 1 1 2 1 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6661] 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1
## [6698] 1 2 2 1 1 1 2 2 2 1 2 2 2 1 2 1 1 2 2 1 1 2 2 2 1 2 2 1 2 1 1 2 1 2 2 2 2
## [6735] 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6772] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6809] 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2
## [6846] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2
## [6883] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6920] 2 2 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6957] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [6994] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7031] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7068] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7105] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7142] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7179] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7216] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7253] 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7290] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7327] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7364] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7401] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7438] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7475] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7512] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7549] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7586] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7623] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7660] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7697] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7734] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7771] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7808] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7845] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7882] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7919] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1 1 2
## [7956] 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [7993] 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [8030] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [8067] 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [8104] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [8141] 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2
## [8178] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [8215] 1 2 2 2 2 2 1 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2
## [8252] 2 2 2 2 1 1 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2
## [8289] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1 1 2
##
## Within cluster sum of squares by cluster:
## [1] 193843244 205997370
## (between_SS / total_SS = 62.6 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
En la siguiente grafica veremos la distribución de los datos para dos clusteres
#install.packages("sf")
#creamos una copia de base limpia para trabajar
BaseLimpia3=BaseLimpia
# Elegir el número de clústeres que fueroon seleccionados del metodo del codo
num_clusters = 2
# Realizar el clustering K-Means
kmeans3 = kmeans(ComPrincipal$x[, 1:2], centers = num_clusters)
# Asignar las etiquetas de clúster al conjunto de datos original
BaseLimpia3$cluster = as.factor(kmeans3$cluster)
# Visualizar los resultados del clustering en un gráfico
fviz_cluster(kmeans3, data = ComPrincipal$x[, 1:2])
# Mostrar un resumen de los clústeres
summary(BaseLimpia3$cluster)
## 1 2
## 2611 5708
# Estadísticas para variables numéricas
estadisticas1 = BaseLimpia3 %>%
group_by(cluster) %>%
summarise(across(where(is.numeric), list(mean = mean, median = median, sd = sd)))
# Estadísticas para variables categóricas
estadisticas2= BaseLimpia3 %>%
group_by(cluster) %>%
summarise(across(where(is.character), ~names(sort(table(.)[length(table(.)):1])[1])))
# Mostrar resultados
print(estadisticas1)
## # A tibble: 2 × 28
## cluster id_mean id_median id_sd estrato_mean estrato_median estrato_sd
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 5287. 5622 2038. 5.36 6 0.865
## 2 2 3644. 3258. 2379. 4.30 4 0.921
## # ℹ 21 more variables: preciom_mean <dbl>, preciom_median <dbl>,
## # preciom_sd <dbl>, areaconst_mean <dbl>, areaconst_median <dbl>,
## # areaconst_sd <dbl>, parqueaderos_mean <dbl>, parqueaderos_median <dbl>,
## # parqueaderos_sd <dbl>, banios_mean <dbl>, banios_median <dbl>,
## # banios_sd <dbl>, habitaciones_mean <dbl>, habitaciones_median <dbl>,
## # habitaciones_sd <dbl>, longitud_mean <dbl>, longitud_median <dbl>,
## # longitud_sd <dbl>, latitud_mean <dbl>, latitud_median <dbl>, …
print(estadisticas2)
## # A tibble: 2 × 7
## cluster zona piso tipo barrio zona_numero Tipo_numero
## <fct> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 Zona Centro 12 Apartamento VILLA DEL SUR 1 2
## 2 2 Zona Centro 11 Casa ZONA RESIDENCIAL 1 1
# Calcular estadísticas descriptivas para variables numéricas
estadisticas1 = BaseLimpia3 %>%
group_by(cluster) %>%
summarise(across(where(is.numeric), list(mean = mean, median = median, sd = sd)))
# Calcular estadísticas descriptivas para variables categóricas
estadisticas2 = BaseLimpia3 %>%
group_by(cluster) %>%
summarise(across(where(is.character), ~names(sort(table(.)[length(table(.)):1])[1])))
# Combinar las estadísticas en una sola tabla
tabla_resumen = left_join(estadisticas1, estadisticas2, by = "cluster")
# Corregir el nombre de las columnas en 'select' si es necesario
tabla_final = tabla_resumen %>%
select(cluster, estrato_mean, preciom_mean, tipo, zona, barrio) %>%
rename("Estrato Medio" = estrato_mean,
"Precio Medio" = preciom_mean,
"Tipo de Propiedad Más Común" = tipo,
"Zona Más Común" = zona,
"Barrio Más Común" = barrio)
# Ver la tabla final
print(tabla_final)
## # A tibble: 2 × 6
## cluster `Estrato Medio` `Precio Medio` Tipo de Propiedad Má…¹ `Zona Más Común`
## <fct> <dbl> <dbl> <chr> <chr>
## 1 1 5.36 786. Apartamento Zona Centro
## 2 2 4.30 273. Casa Zona Centro
## # ℹ abbreviated name: ¹`Tipo de Propiedad Más Común`
## # ℹ 1 more variable: `Barrio Más Común` <chr>
BaseLimpia3
## # A tibble: 8,319 × 16
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … 02 3 250 70 1 3 6
## 2 1169 Zona … 02 3 320 120 1 2 3
## 3 1350 Zona … 02 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 7 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # zona_numero <chr>, Tipo_numero <chr>, cluster <fct>
conclusion como podemos darnos cuenta por las anteriroes tablas en el pimer cluster la propiedad mas comun son los apartamentos con un alto valor y un estrato alto y en el cluster 2 son las casas son un estrato de 4 y se buscan mas las casas
library(sf)
## Linking to GEOS 3.11.2, GDAL 3.7.2, PROJ 9.3.0; sf_use_s2() is TRUE
# Aquí se asume que las columnas se llaman 'latitud', 'longitud' y 'cluster'
ggplot(data = BaseLimpia3) +
geom_sf(data = st_as_sf(BaseLimpia3, coords = c("longitud", "latitud"), crs = 4326),
aes(color = factor(cluster))) +
theme_minimal() +
labs(title = "Distribución geografica de Clusters",
x = "Longitud",
y = "Latitud",
color = "Cluster") +
coord_sf() # Utiliza esto si tus datos ya están en un sistema de coordenadas geográficas
para el proceso de analisis de correspondencia tendremos en cuenta las variables tipo de vivienda, zona y barrio, para lo cual primero debemos ver la base de vivienda que poseemos actualemente:
BaseLimpia
## # A tibble: 8,319 × 15
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … 02 3 250 70 1 3 6
## 2 1169 Zona … 02 3 320 120 1 2 3
## 3 1350 Zona … 02 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 8,309 more rows
## # ℹ 6 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # zona_numero <chr>, Tipo_numero <chr>
de esta base convertiremos los datos estrato, zona y tipo a factores
# Convertir las variables en factores
BaseLimpia$estratoFactor <- as.factor(BaseLimpia$estrato)
BaseLimpia$zonaFactor <- as.factor(BaseLimpia$zona)
BaseLimpia$tipoFactor <- as.factor(BaseLimpia$tipo)
ahroa validamos los datos faltantes para los atributos y como podemos observar no posee datos faltantes
library(mice)
md.pattern(BaseLimpia, rotate.names = TRUE)
## /\ /\
## { `---' }
## { 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 barrio longitud latitud zona_numero Tipo_numero estratoFactor
## 8319 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0
## zonaFactor tipoFactor
## 8319 1 1 0
## 0 0 0
para poder trabajar con el analisis de corrspondencias debemos tener en cuenta que no podremos realizar un analsis de correspondencia simple debido a que contamos con mas de dos varaibles por lo cual se debera realizar un analisis de correspondencia multiple
# Realizar un Análisis de Correspondencia Múltiple
# Cargar los paquetes necesarios
library(FactoMineR)
library(factoextra)
# Realizar el Análisis de Correspondencia Múltiple
acm_resultados <- MCA(BaseLimpia[ , c(16, 17, 18)], graph = FALSE)
# Crear el gráfico
mca_biplot <- fviz_mca_biplot(acm_resultados,
col.var = "red", # Color para las categorías de las variables
col.ind = "grey", # Color para los individuos
alpha.ind = 0.5, # Transparencia para los individuos
repel = TRUE, # Evitar solapamiento de etiquetas
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # Colores para los ejes
theme = theme_minimal() # Tema minimalista para el gráfico
) +
theme(legend.position = "bottom") # Mover la leyenda abajo
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
mca_biplot
como podemos ibservar en el analisis de correspondencias multiple realizado podemos concluir los siguientes aspectos:
por otro lado si analizamos como se describe cada componente a las varaibles estudiadas podemos denotar que se divide en 8 componentes dodne el primer componente describe el 21.1% y el segundo componente describe el 17%, esto es muy comun en analisis de componentes multiples, esto lo podemos observar en la siguiente pantalla
fviz_screeplot(acm_resultados, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
1.la construccion de las campañas deben estar enfocadas en la zona esto debido a que la zona norte busca mas casas y la zona sur mas apartamentos, por otro lado los inmuebles para la zona oriente y centro mas deseados se enecuentran en estratos 3