El presente documento es un informe estadístico presentado a una empresa inmobiliaria líder en la ciudad de Cali. EL informe se construye a partir de la base de datos de propiedades inmobiliarias en la ciudad, recogida por la misma empresa. El objetivo de este informe es comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas y hacer recomendaciones de mercado según los hayazgos orientadas a optimizar los recursos de campañas de mercadeo para que su alcance sea más eficiente y llegue los clientes adecuados. La base de datos aquí trabajada cuenta con 8.322 observaciones o propiedades descritas, que luego de eliminar 3 casos donde el registro de datos fue nulo quedó en 8.319 observaciones, y 13 variables que se dividen en:
ID: Número único para cada propiedad.
Zona: Sector cardinal de la ciudad en la que se encuentra la propiedad.
Estrato: Estrato socioeconómico de la propiedad.
Precio: Valor en millones de pesos colombianos de la propiedad.
Área construida en metros cuadrados.
Parqueaderos: Número de estacionamientos con que cuenta la propiedad.
Baños: Número de baños con los que cuenta la propiedad.
Habitaciones: Número de habitaciones de la propiedad.
Tipo: Si la vivienda es una Casa o un Apartamento. No se incluyen propiedades comerciales.
Barrio donde se ubica la propiedad.
Longitud.
Latitud.
Aunque este informe no trabaja directamente con las coordenadas (Longitud y Latitud) estas variables no fueron eliminadas para que sean utilizadas en futuras labores de mapeo y cartografía. El ejercicio de análisis fue realizado utilizando el lenguaje de programación R y el programa R-Studio, ambas herramientas especializadas en el manejo de datos y el análisis estadístico. A continuación, se presenta la estructura del informe: (1) Objetivos, donde se delimitan tres objetivos claros del informe, (2) Presentación general de los los datos y limpieza de los mismos, (3) Análisis de Componentes Principales, técnica estadística para el análisis de los datos, (4) Análisis de Conglomerados, (6) Análisis de correspondencia.
devtools::install_github("dgonxalex80/paqueteMETODOS")
library(paqueteMETODOS)
#install.packages("cluster")
#install.packages("janitor")
#install.packages("MASS")
library(janitor)
#install.packages("tidyverse")
library(tidyverse)
library(dplyr)
library(mice)
library(factoextra)
library(FactoMineR)
library(cluster)
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
#Generamos el DS con el que vamos a trabajar
data(viviendas)
data1 = vivienda
En esta sección se presentan los tres objetivos concretos con los que se desarrolló el análisis de los datos. Este no se trata de un informe especializado en mercadeo, sin embargo sus hallazgos son insumo para esta tarea y se realizan sugerencias en ese sentido.
Describir el comportamiento general de los valores de las viviendas en la ciudad de Cali, relacionando el dato con la ubicación de la propiedad.
Generar un análisis más profundo mediante el uso de las técnicas de Análisis de Componentes Principales, Análisis de Conglomerados y Análisis de correspondencia.
Generar sugerencias generales de mercadeo como la definición de un nicho de mercado, posibles estrategias de marketing y sugerencias de servicios especializados a clientes.
En la primera etapa del proceso de datos se exploraron de manera preliminar los datos, reconociendo el tipo y número de variables, algunos de los datos que contiene e identificar si las variables categóricas estaban estandarizadas:
#Examinamos la generalidad de los datos
dim(data1)
## [1] 8322 13
str(data1)
## 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>
glimpse(data1)
## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
head(data1)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
tail(data1)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6417 Zona S… <NA> 6 1800 400 3 6 5
## 2 6998 Zona S… <NA> 6 1000 189 3 5 4
## 3 8139 Zona S… <NA> 5 530 142 2 4 4
## 4 NA <NA> <NA> NA NA NA NA NA NA
## 5 NA <NA> <NA> NA NA NA NA NA NA
## 6 NA <NA> <NA> NA 330 NA NA NA NA
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#Verificamos que las variables tipo texto etén estandarizadas.
unique(data1$tipo)
## [1] "Casa" "Apartamento" NA
unique(data1$barrio)
## [1] "20 de julio" "3 de julio"
## [3] "acopi" "agua blanca"
## [5] "aguablanca" "aguacatal"
## [7] "alameda" "alameda del río"
## [9] "alameda del rio" "alamos"
## [11] "alborada" "alcazares"
## [13] "alférez real" "alferez real"
## [15] "alfonso lópez" "alfonso lópez i"
## [17] "alfonso lopez" "alto jordán"
## [19] "altos de guadalupe" "altos de menga"
## [21] "altos de santa" "antonio nariño"
## [23] "aranjuez" "arboleda"
## [25] "arboleda campestre candelaria" "arboledas"
## [27] "atanasio girardot" "autopista sur"
## [29] "bajo aguacatal" "barranquilla"
## [31] "barrio 7de agosto" "barrio el recuerdo"
## [33] "barrio eucarístico" "barrio obrero"
## [35] "barrio tranquilo y" "base aérea"
## [37] "belalcazar" "Belalcazar"
## [39] "belisario caicedo" "bella suiza"
## [41] "bella suiza alta" "bellavista"
## [43] "benjamín herrera" "berlin"
## [45] "bloques del limonar" "bochalema"
## [47] "bolivariano" "bosques de alboleda"
## [49] "bosques del limonar" "boyacá"
## [51] "bretaña" "brisas de guadalupe"
## [53] "brisas de los" "Brisas De Los"
## [55] "brisas del guabito" "brisas del limonar"
## [57] "Bueno Madrid" "buenos aires"
## [59] "cañasgordas" "cañaveralejo"
## [61] "cañaverales" "cañaverales los samanes"
## [63] "caldas" "Cali"
## [65] "cali bella" "cali canto"
## [67] "calibella" "calicanto"
## [69] "calicanto viii" "calima"
## [71] "calimio norte" "calipso"
## [73] "cambulos" "camino real"
## [75] "Camino Real" "campestre"
## [77] "caney" "caney especial"
## [79] "capri" "cascajal"
## [81] "cataya real" "ceibas"
## [83] "centelsa" "centenario"
## [85] "Centenario" "centro"
## [87] "cerro cristales" "cerros de guadalupe"
## [89] "champagnat" "chapinero"
## [91] "chiminangos" "Chiminangos"
## [93] "chiminangos 1 etapa" "chiminangos 2 etapa"
## [95] "chipichape" "ciudad 2000"
## [97] "Ciudad 2000" "ciudad antejardin"
## [99] "ciudad bochalema" "ciudad córdoba"
## [101] "ciudad córdoba reservado" "ciudad capri"
## [103] "ciudad cordoba" "ciudad country"
## [105] "ciudad del campo" "ciudad jardín"
## [107] "Ciudad Jardín" "ciudad jardin"
## [109] "ciudad jardin pance" "ciudad los álamos"
## [111] "ciudad los alamos" "ciudad meléndez"
## [113] "ciudad melendez" "ciudad modelo"
## [115] "ciudad pacifica" "Ciudad Pacifica"
## [117] "ciudad real" "ciudad talanga"
## [119] "ciudad universitaria" "ciudadela comfandi"
## [121] "ciudadela del río" "ciudadela melendez"
## [123] "ciudadela paso ancho" "ciudadela pasoancho"
## [125] "colinas de menga" "colinas del bosque"
## [127] "colinas del sur" "colon"
## [129] "colseguros" "colseguros andes"
## [131] "Colseguros Andes" "comfenalco"
## [133] "compartir" "conjunto gibraltar"
## [135] "cristóbal colón" "cristales"
## [137] "cristobal colón" "cuarto de legua"
## [139] "departamental" "ed benjamin herrera"
## [141] "el bosque" "El Bosque"
## [143] "el caney" "El Caney"
## [145] "el castillo" "el cedro"
## [147] "el diamante" "el dorado"
## [149] "el gran limonar" "el guabal"
## [151] "el guabito" "el ingenio"
## [153] "El Ingenio" "el ingenio 3"
## [155] "el ingenio i" "el ingenio ii"
## [157] "el ingenio iii" "el jardín"
## [159] "el jordán" "el lido"
## [161] "el limonar" "el nacional"
## [163] "el paraíso" "el peñon"
## [165] "el prado" "el refugio"
## [167] "el rodeo" "el sena"
## [169] "el trébol" "el troncal"
## [171] "el vallado" "eucarístico"
## [173] "evaristo garcía" "farrallones de pance"
## [175] "fenalco kennedy" "fepicol"
## [177] "flora" "flora industrial"
## [179] "floralia" "fonaviemcali"
## [181] "francisco eladio ramirez" "fuentes de la"
## [183] "gaitan" "gran limonar"
## [185] "granada" "guadalupe"
## [187] "guadalupe alto" "guaduales"
## [189] "guayaquil" "hacienda alferez real"
## [191] "ingenio" "ingenio i"
## [193] "ingenio ii" "jamundi"
## [195] "jamundi alfaguara" "jorge eliecer gaitán"
## [197] "jorge isaacs" "jose manuel marroquín"
## [199] "juanamb√∫" "juanambu"
## [201] "junín" "junin"
## [203] "la alborada" "la alianza"
## [205] "la arboleda" "la base"
## [207] "la buitrera" "la campiña"
## [209] "la cascada" "la ceibas"
## [211] "la esmeralda" "la flora"
## [213] "La Flora" "la floresta"
## [215] "la fortaleza" "la gran colombia"
## [217] "la hacienda" "La Hacienda"
## [219] "la independencia" "la libertad"
## [221] "la luisa" "la merced"
## [223] "la morada" "la nueva base"
## [225] "la playa" "la portada al"
## [227] "la primavera" "la reforma"
## [229] "la rivera" "la rivera i"
## [231] "la rivera ii" "la riverita"
## [233] "la riviera" "la selva"
## [235] "la villa del" "laflora"
## [237] "lares de comfenalco" "las acacias"
## [239] "las américas" "las camelias"
## [241] "las ceibas" "las delicias"
## [243] "las granjas" "las quintas de"
## [245] "las vegas" "las vegas de"
## [247] "libertadores" "los alamos"
## [249] "los alcázares" "los alcazares"
## [251] "los andes" "los cámbulos"
## [253] "los cambulos" "los cristales"
## [255] "los cristales club" "los farallones"
## [257] "los guaduales" "Los Guaduales"
## [259] "los guayacanes" "los jockeys"
## [261] "los libertadores" "los parques barranquilla"
## [263] "los robles" "lourdes"
## [265] "mamellan" "manzanares"
## [267] "mariano ramos" "marroquín iii"
## [269] "mayapan las vegas" "meléndez"
## [271] "melendez" "menga"
## [273] "metropolitano del norte" "miradol del aguacatal"
## [275] "miraflores" "Miraflores"
## [277] "morichal de comfandi" "multicentro"
## [279] "municipal" "nápoles"
## [281] "napoles" "normandía"
## [283] "normandía west point" "normandia"
## [285] "norte" "norte la flora"
## [287] "nueva base" "nueva floresta"
## [289] "nueva tequendama" "oasis de comfandi"
## [291] "oasis de pasoancho" "occidente"
## [293] "pacará" "pacara"
## [295] "palmas del ingenio" "pampa linda"
## [297] "pampalinda" "panamericano"
## [299] "pance" "Pance"
## [301] "parcelaciones pance" "parque residencial el"
## [303] "paseo de los" "paso del comercio"
## [305] "pasoancho" "poblado campestre"
## [307] "ponce" "popular"
## [309] "portada de comfandi" "portales de comfandi"
## [311] "porvenir" "prados de oriente"
## [313] "prados del limonar" "Prados Del Limonar"
## [315] "prados del norte" "Prados Del Norte"
## [317] "prados del sur" "primavera"
## [319] "primero de mayo" "primitivo crespo"
## [321] "puente del comercio" "puente palma"
## [323] "quintas de don" "Quintas De Don"
## [325] "quintas de salomia" "rafael uribe uribe"
## [327] "refugio" "rep√∫blica de israel"
## [329] "rincón de salomia" "rincon de la"
## [331] "riveras del valle" "rozo la torre"
## [333] "saavedra galindo" "salomia"
## [335] "samanes" "samanes de guadalupe"
## [337] "sameco" "san antonio"
## [339] "san bosco" "san carlos"
## [341] "san cayetano" "san fernando"
## [343] "San Fernando" "san fernando nuevo"
## [345] "san fernando viejo" "san joaquín"
## [347] "san joaquin" "san juan bosco"
## [349] "san judas" "san judas tadeo"
## [351] "san luís" "san luis"
## [353] "san nicolás" "san nicolas"
## [355] "san pedro" "san vicente"
## [357] "santa" "santa anita"
## [359] "Santa Anita" "santa anita sur"
## [361] "santa bárbara" "santa elena"
## [363] "santa fe" "santa helena de"
## [365] "santa isabel" "Santa Isabel"
## [367] "santa mónica" "santa mónica alta"
## [369] "santa mónica popular" "santa mónica residencial"
## [371] "santa monica" "Santa Monica"
## [373] "santa monica norte" "santa monica popular"
## [375] "santa monica residencial" "santa rita"
## [377] "santa rosa" "santa teresita"
## [379] "Santa Teresita" "Santafe"
## [381] "santander" "santo domingo"
## [383] "Santo Domingo" "sector aguacatal"
## [385] "sector cañaveralejo guadalupe" "seminario"
## [387] "sierras de normandía" "siete de agosto"
## [389] "simón bolivar" "tejares cristales"
## [391] "tejares de san" "templete"
## [393] "tequendama" "tequendema"
## [395] "terrón colorado" "torres de comfandi"
## [397] "unión de vivienda" "unicentro cali"
## [399] "urbanización barranquilla" "urbanización boyacá"
## [401] "urbanización colseguros" "urbanización la flora"
## [403] "urbanización la merced" "urbanización la nueva"
## [405] "urbanización las cascadas" "urbanización nueva granada"
## [407] "urbanización pacara" "urbanización río lili"
## [409] "urbanización san joaquin" "urbanización tequendama"
## [411] "urbanizacion el saman" "urbanizacion gratamira"
## [413] "urbanizacion lili" "valle de lili"
## [415] "valle del lili" "Valle Del Lili"
## [417] "valle grande" "versalles"
## [419] "villa colombia" "villa de veracruz"
## [421] "villa del lago" "villa del parque"
## [423] "villa del prado" "Villa Del Prado"
## [425] "villa del sol" "villa del sur"
## [427] "Villas De Veracruz" "villas de veracruz"
## [429] "vipasa" "zona centro"
## [431] "zona norte" "zona norte los"
## [433] "zona oeste" "zona oriente"
## [435] "zona residencial" "zona sur"
## [437] NA
unique(data1$zona)
## [1] "Zona Oriente" "Zona Sur" "Zona Norte" "Zona Oeste" "Zona Centro"
## [6] NA
De este primer análisis también se encontraron algunos datos faltantes y se reconoce la posibilidad de que existan datos duplicados, para lo que se generan dos vectores que resuman estos dos grupos de datos:
#Estandarizar valores de tipo character
data1$tipo <- tolower(data1$tipo)#Pasamos todas las observaciones a minúscula
data1$barrio <- tolower(data1$barrio)
data1$barrio <- tolower(data1$zona)
unique(data1$tipo)
## [1] "casa" "apartamento" NA
unique(data1$barrio)
## [1] "zona oriente" "zona sur" "zona norte" "zona oeste" "zona centro"
## [6] NA
unique(data1$zona)
## [1] "Zona Oriente" "Zona Sur" "Zona Norte" "Zona Oeste" "Zona Centro"
## [6] NA
Datos Faltantes:
#Manejo de observaciones faltantes y duplicadas
faltantes <- colSums(is.na(data1)) %>% #Analizamos las variables faltantes
as.data.frame()
md.pattern(data1) %>%
show()
## 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
#Tenemos 3 casos de datos faltantes para todas las variables (ya identificado)
#También hay 2638 observaciones que no tienen el dato piso y 1605 que no tienen
#el dato parqueadero
Con estos datos organizados se reconocen 3 registros completamente vacíos y la falta de datos en dos variables específicas; en el número de pisos faltan 2.635 datos y en el número de parqueaderos faltan 1.602 datos. Adicionalmente, se identifican 8 observaciones repetidas, sin tener en cuenta los datos faltantes. En la siguiente etapa se propone una estrategia para manejar este problema.
Para iniciar el proceso de limpieza se crea una nueva base que será manipulada para tener los datos listos para el análisis, esta nueva base se organiza teniendo en cuenta el ID de manera y se limpia la base de datos duplicados y filas completamente vacías.
#Organizamos los datos según el id
data1 <- arrange(data1,id)
#Corrección variables repetidas
get_dupes(data1,id)
## # A tibble: 3 × 14
## id dupe_count zona piso estrato preciom areaconst parqueaderos banios
## <dbl> <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NA 3 <NA> <NA> NA NA NA NA NA
## 2 NA 3 <NA> <NA> NA NA NA NA NA
## 3 NA 3 <NA> <NA> NA 330 NA NA NA
## # ℹ 5 more variables: habitaciones <dbl>, tipo <chr>, barrio <chr>,
## # longitud <dbl>, latitud <dbl>
duplicados <- data1[duplicated(data1), ] #Creamos un vector sólo con las observaciones repetidas
data1<- unique(data1) #Se excluyen las observaciones duplicadas
#Se identifica que es necesario eliminar las que no tienen datos en la variable ID pues están vacías
#Se eliminan las variables de la base principal
data1 <- data1 %>%
drop_na(id)
Como recomendación de manejo de los datos se pide a la empresa designar personal que verifique de manera periódica la existencia de valores duplicados o registros que hayan quedado guardados sin datos.
Después de la limpieza de las observaciones sin ningún registro queda pendiente el manejo de los datos faltantes en las variables “piso” y “parqueaderos”.
Para la variable parqueaderos se explora más en detalle los casos en que este dato falta en el dataset, son 869 apartamentos y 733 casas sin el dato del parqueadero, dado el elevado número de casos no se puede sólo eliminar los registros donde falten. En ese sentido se plantea una imputación de datos usando el dato más común de los parqueaderos faltantes.
#El siguiente caso de datos faltantes es en "piso" y "parqueaderos"
unique(data1$parqueaderos)
## [1] 2 3 NA 4 1 6 5 10 8 7 9
#Exploramos cuántas casas y apartamentos no tienen el dato "parqueaderos"
apto_sin_parqueo = data1 %>%
dplyr::select(tipo, parqueaderos) %>%
filter(tipo == "apartamento", is.na(parqueaderos))
dim(apto_sin_parqueo) # 869 apartamentos no tienen el dato "parqueaderos"
## [1] 869 2
casa_sin_parqueo = data1 %>%
dplyr::select(tipo, parqueaderos) %>%
filter(tipo == "casa", is.na(parqueaderos))
dim(casa_sin_parqueo) # 733 casas no tienen el dato "parqueaderos"
## [1] 733 2
Para encontrar el dato más común en cada caso se generaron vectores separados para las casas y los apartamentos y a cada uno se le aplicó la función Mode que encuentra el dato que tiene la mayor frecuencia en el conjunto, el resultado es que en el conjunto de casas hay más de ellas con 2 parqueaderos, en el caso de los apartamentos es 1. Se usan estos datos para imputar la base principal.
casa_parqueo <- data1 %>%
dplyr::select(tipo, parqueaderos) %>%
filter(tipo == "casa")
apto_parqueo <- data1 %>%
dplyr::select(tipo, parqueaderos) %>%
filter(tipo == "apartamento")
Mode(casa_parqueo$parqueaderos) # Dato más común 2
## [1] 2
Mode(apto_parqueo$parqueaderos) # Dato más común 1
## [1] 1
data1 <- data1 %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos) & tipo == "casa", 2,
ifelse(is.na(parqueaderos) & tipo == "apartamento", 1,
parqueaderos)))
#Verificamos que se haya hecho el reemplazo
faltantes <- colSums(is.na(data1)) %>%
as.data.frame() %>%
show()
## .
## id 0
## zona 0
## piso 2635
## estrato 0
## preciom 0
## areaconst 0
## parqueaderos 0
## banios 0
## habitaciones 0
## tipo 0
## barrio 0
## longitud 0
## latitud 0
Una vez manejado el caso de la variable parqueaderos, se debe abordar la variable piso. Se hace un tratamiento similar de los casos, generando dos vectores que permitan conocer los casos de casas y apartamentos sin el dato “piso”. En este caso se asume que los casos en los que faltan datos y el tipo de vivienda es una casa, se trata de casas de un solo piso, por lo que los datos faltantes se reemplazan por 1. Para los apartamentos se reemplaza nuevamente por el dato más común.
#Puede ser que en los casos sin "Piso" se trate de casas de un sólo piso
casa_sin_piso = data1 %>% #Verificamos que todos los NA de piso sean casas. No lo son
dplyr::select(piso,tipo) %>%
filter(tipo=="casa", is.na(piso))
dim(casa_sin_piso) #1254 casas sin dato "piso"
## [1] 1254 2
apto_sin_piso = data1 %>% #Verificamos que todos los NA de piso sean casas. No lo son
dplyr::select(piso,tipo) %>%
filter(tipo=="apartamento", is.na(piso))
dim(apto_sin_piso) #1381 apartamentos sin dato "piso"
## [1] 1381 2
#Encontrar el dato más frecuente de piso en conjunto de datos correspondiente a "apartamento"
apto_piso <- data1 %>%
dplyr::select(tipo, piso) %>%
filter(tipo == "apartamento", !is.na(piso))
dim(apto_piso)
## [1] 3719 2
Mode(apto_piso$piso) # Dato más común "03"
## [1] "03"
#Imputación de datos
data1 <- data1 %>%
mutate(piso = ifelse(is.na(piso) & tipo == "casa", 1,
ifelse(is.na(piso) & tipo == "apartamento", "03",
piso)))
#Verificamos que se haya hecho el reemplazo
faltantes <- colSums(is.na(data1)) %>%
as.data.frame() %>%
show()
## .
## id 0
## zona 0
## piso 0
## estrato 0
## preciom 0
## areaconst 0
## parqueaderos 0
## banios 0
## habitaciones 0
## tipo 0
## barrio 0
## longitud 0
## latitud 0
Después de realizar este procedimiento el dataset quedó sin datos faltantes.
Para finalizar el proceso de limpieza se examinarán los datos atípicos o outliers en lo referente a los valores de las propiedades, con este fin se genera un gráfico de caja y alambres o boxplot como estrategia para visualizar los casos más extremos.
#Limpieza de datos atípicos (Outliers)
data1 %>%
ggplot(aes(preciom)) +
geom_boxplot() +
theme_bw()+
scale_x_continuous(breaks = seq(0, 2000, by = 250))+
labs(x = "Valor de las propiedades en millones",
y = NULL,
title = "Distribución del valor de las propiedades")
Al ver este gráfico es claro que los precios atípicos en la base se encuentran más allá de los 1.000 millones COP. Para el manejo de estos datos se hace el cálculo del rango intercuartilico para la variable “preciom” y se excluyen los datos atípicos.
#Exploración de los rangos del gráfico
summary(data1$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 58.0 220.0 330.0 433.9 540.0 1999.0
ric <- 540-220 #Rango intercuartil 320
lim_sup <- 540 +1.5*ric #Límite superior 1020
#Filtramos dataset con sólo los valores inferiores al límite superior
data_clean = data1 %>%
filter(preciom <= 1020)
head(data_clean)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 Zona S… 02 6 880 237 2 5 4
## 2 3 Zona S… 03 5 250 86 1 2 3
## 3 6 Zona S… 03 6 513 160 2 4 4
## 4 7 Zona S… 02 6 870 490 3 6 5
## 5 8 Zona S… 05 5 310 82.5 1 2 3
## 6 9 Zona S… 09 4 240 80 1 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
dim(data_clean)
## [1] 7767 13
Con este último proceso tenemos el dataset final con 7767 entradas y las mismas 13 variables, sin datos faltantes, duplicados o atípicos.
Adicionalmente, con el objetivo de que la empresa inmoviliaria explore un mercado de propiedades de lujo, se genera un dataset con los outliers para su análisis.
#Creación de df de outliers o valores atípicos
base_outliers = data1 %>%
filter(preciom > 1020)
base_outliers %>%
ggplot(aes(preciom)) +
geom_boxplot() +
theme_bw()+
scale_x_continuous(breaks = seq(0, 2000, by = 250))+
labs(x = "Valor de las propiedades en millones",
y = NULL,
title = "Distribución del valor de las propiedades de lujo")
Esta nueva base tiene 552 entradas y puede ser considerada una fuente de información para clientes VIP.
Dado que el siguiente paso es realizar análisis más profundo de los datos mediante el Análisis de Componentes Principales, de Conglomerados y de correspondencia, se prepara el dataset limpio para estos procesos. En primer lugar se excluye la variable ID del dataset en tanto no aporta al análisis, en seguida se codifican las variables de tipo categórico para poder emplearlas dentro del proceso de análisis. Después de haber realizado el ejercicio con las 5 variables categóricas (piso. Finalmente se estandarizan los datos.
#Primero se elimina la variable ID
data_clean <- data_clean %>%
dplyr::select(-id)
#Codificación transformación de variables categóricas más relevantes
data_clean <- data_clean %>%
mutate(across(tipo, as.factor))
data_clean <- data_clean %>%
mutate(across(piso, as.numeric))
str(data_clean)
## tibble [7,767 × 12] (S3: tbl_df/tbl/data.frame)
## $ zona : chr [1:7767] "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" ...
## $ piso : num [1:7767] 2 3 3 2 5 9 6 4 3 3 ...
## $ estrato : num [1:7767] 6 5 6 6 5 4 6 5 5 5 ...
## $ preciom : num [1:7767] 880 250 513 870 310 240 690 220 230 160 ...
## $ areaconst : num [1:7767] 237 86 160 490 82.5 80 150 92 70 63 ...
## $ parqueaderos: num [1:7767] 2 1 2 3 1 1 2 2 1 1 ...
## $ banios : num [1:7767] 5 2 4 6 2 2 5 3 2 2 ...
## $ habitaciones: num [1:7767] 4 3 4 5 3 3 4 3 2 2 ...
## $ tipo : Factor w/ 2 levels "apartamento",..: 2 1 2 2 1 1 1 1 1 1 ...
## $ barrio : chr [1:7767] "zona sur" "zona sur" "zona sur" "zona sur" ...
## $ longitud : num [1:7767] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:7767] 3.43 3.43 3.43 3.43 3.43 ...
# Convertimos la variable tipo y eliminamos variables que no aportan al análisis y están repetidas
data_encoded <- data_clean %>%
bind_cols(model.matrix(~ tipo - 1, data = data_clean)) %>%
dplyr::select(-c(zona, tipo, barrio, longitud, latitud, ))
#Estandarización
data_acp <- as.data.frame(scale(data_encoded))
El resultado final es el dataset data_acp con el que se realizará el análisis de componentes principales. Tiene los mismos 7767 puntos de datos y 9 variables incluyendo las variables originalmente numéricas y la codificación de la variable tipo.
Primero, se calculan los componentes principales, que explican la mayor parte de la variabilidad en los datos con el objetivo de reducir la dimencionalidad del conjunto, reducir su complejidad y preparar los datos para otros procesos de análisis.
#Calculo de componentes principales
resultados_acp <- prcomp(data_acp, scale = FALSE)
fviz_eig(resultados_acp,
addlabels = TRUE,
ylim = c(0,70))
## I. Cargas de las variables
- PC1 Explica 47.6% de la variabilidad: Fundamentalmente influenciado por el area construída, el tipo de inmueble (casa o apartamento) y el número de baños, sugiriendo que gran parte del comportamiento del mercado inmobiliario puede ser interpretado desde las características físicas de las viviendas, como su tamaño. - PC2 Explica 22.7% de la variabilidad: La principal influencia del segundo componente eel estrato y los precios, que complementan las variables del componente 1.Sin embargo el tipo de vivienda conserva una influencia significativa en el conjunto, después se verá esto con más detalle. - PC3 en adelante Explican en conjunto el 29.7% de la variabilidad: Un aspecto a resaltar es el gran peso que tiene el piso además de las habitaciones en el tercer componente.
prcomp(data_acp)
## Standard deviations (1, .., p=9):
## [1] 2.068707e+00 1.429838e+00 8.990333e-01 7.646328e-01 7.002565e-01
## [6] 6.113955e-01 5.008194e-01 4.100093e-01 3.100318e-15
##
## Rotation (n x k) = (9 x 9):
## PC1 PC2 PC3 PC4 PC5
## piso 0.2128528 -0.33911512 0.6455814 0.538528410 0.35983449
## estrato -0.1060791 -0.58640990 -0.2877821 -0.246852466 0.31141295
## preciom -0.3388690 -0.42609178 -0.1083605 -0.053907427 0.10946697
## areaconst -0.4056860 -0.06261473 0.1109715 0.005931512 0.06448613
## parqueaderos -0.3165025 -0.24073553 -0.2040737 0.612890275 -0.61675561
## banios -0.3814678 -0.21199069 0.2877461 -0.287027171 -0.02531634
## habitaciones -0.3390516 0.16073156 0.5749446 -0.298387707 -0.31200221
## tipoapartamento 0.3894740 -0.33683918 0.1033060 -0.222548319 -0.37351429
## tipocasa -0.3894740 0.33683918 -0.1033060 0.222548319 0.37351429
## PC6 PC7 PC8 PC9
## piso 0.04305109 -0.03946425 0.003843194 1.436249e-15
## estrato 0.26189357 -0.44855941 0.366529853 1.179738e-15
## preciom -0.17463054 0.05493146 -0.802165362 -1.775942e-16
## areaconst -0.82080447 -0.02466121 0.375049027 -1.347149e-15
## parqueaderos 0.16186106 -0.04811982 0.125259676 -5.644145e-16
## banios 0.32286573 0.69812945 0.228236558 -6.263767e-16
## habitaciones 0.16949221 -0.54764219 -0.116738411 -7.399611e-16
## tipoapartamento -0.18189786 0.04471680 0.007081159 7.071068e-01
## tipocasa 0.18189786 -0.04471680 -0.007081159 7.071068e-01
fviz_pca_biplot(resultados_acp,
label = "var")
El gráfico Biplot nos da un primer acercamiento al comportamiento de los
datos y muestra una clara separación entre ellos. Esto se explora en
detalle en el análisis de conjuntos.
fviz_pca_var(resultados_acp,
col.var = "contrib",
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE
)
La visualización de la contribución de las variables, sin los puntos de
los datos, nos ayuda a interpretar mucho mejor la influencia de cada
variable en los componentes. Nuevamente son el tipo de vivienda y el
precio los que tienen mayor contribución, sin embargo es su relación la
que resulta interesante. En primer lugar, los apartamentos y casas
tienen una correlación “negativa” lo que se explica fácilmente por el
hecho de que son una variable binaria, y un inmueble puede ser o
apartamento o casa. Pero es su relación con la variable precio la que
resulta más interesante pues al tener un ángulo de 90° indicaría que no
están correlacionadas. Más bien, según lo expuesto en el gráfico, el
precio tiene una relación más cercana con características del inmueble
como el número de parqueaderos, de baños y el área construída.
Es de resaltar también que, según el análisis de componentes, el piso en que se encuentre un inmueble no tiene relación con su precio, pero puede tenerla con el número de habitaciones que tenga la propiedad. Además, como es de esperarse, el número de habitaciones si tiene una relación cercana con las propiedades de tipo casa. Estas dos variables (piso y número de habitaciones) parecen tener una influencia baja en los componentes.
Antes de implementar las técnicas de agrupamiento propias del análisis de clusters, vale la pena observar el agrupamiento en el Biplot del ACP usando las categorías de Tipo de vivienda y estrato. Primero, el tipo de vivienda genera una división clara en el conjunto de variables, esta primera visualización nos ayuda a distinguir cuál es cada grupo.
fviz_pca_biplot(resultados_acp,
label = "var",
habillage = data_clean$tipo)
Al hacer el mismo gráfico, esta vez con la distinción de los estratos,
encontramos también una distribución interesante, reconociendo, por
ejemplo, un mayor número de casas que apaetamentos en el estrato 3,
situación contraria para el estrato 6. También se identifica que la
mayoría de los datos en la base de la empresa pertenesen a inmuebles en
el estrato 5.
fviz_pca_biplot(resultados_acp,
label = "var",
habillage = data_clean$estrato)
## I. Método Jerarquico de clasificación
Empezamos el análisis de conjuntos implementando el método jerariquico. Primero se calcula la distancia euclidiana entre los datos y luego se utiliza el cálculo en el algoritmo de clasificación jerarquica hclust usando el método ward que minimiza la varianza dentro de los clusters. Finalmente se grafíca el dendograma correspondiente.
# Paso 1: Cálculo de Distancias
dist_data <- dist(data_acp, method = 'euclidean')
# Paso 2: Clustering Jerárquico
clust_jer <- hclust(dist_data, method = "ward.D2")
# Visualización del dendrograma
plot(clust_jer, cex = 0.6, main = "Dendrograma de clasificación Inmuebles")
rect.hclust(clust_jer, k = 4, border = 2:5)
El dendograma deja ver dos cortes muy marcados, en la altura 100
(probablemente el tipo de vivienda) y se alcanzan a reconocer otros 4 en
el orden inmediatamente anterior.
##. Método no jerarquico de clasificación
Para esta sección se aplicará el método de K-means clustering, donde se le indica al algorítmo el número de clusters que se busca conformar. Para este caso servirán los análisis ya realizados pensando en una clasificación por 4 clusters. Sin embargo, se implementa el método del codo en primera instancia para corroborar esta intuición.
wss <- (nrow(data_acp)-1)*sum(apply(data_acp, 2, var))
for (i in 2:15) wss[i] <- sum(kmeans(data_acp, centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Número de Clústeres", ylab="Suma de Cuadrados Internos", main="Método del Codo")
El codo no es del todo marcado pero puede trabajarse con un k=4
set.seed(123)
k <- 4
kmeans_result <- kmeans(data_acp, centers = k, nstart = 25)
# Revisión de los componentes de los cluster
print(kmeans_result$centers) # Centros de los clústeres
## piso estrato preciom areaconst parqueaderos banios
## 1 -0.6248738 0.4784081 1.3215557 1.677304473 1.27435548 1.47977217
## 2 -0.6681239 -0.6040152 -0.1979189 0.209768233 -0.01524418 0.03223213
## 3 0.5971127 1.0490338 0.8164265 -0.003312548 0.45927403 0.39774062
## 4 0.2878839 -0.3307012 -0.7216094 -0.667771623 -0.63434661 -0.69857739
## habitaciones tipoapartamento tipocasa
## 1 1.2353883 -1.2865317 1.2865317
## 2 0.4057266 -1.2961126 1.2961126
## 3 -0.2318019 0.7714386 -0.7714386
## 4 -0.5203232 0.7708072 -0.7708072
print(kmeans_result$cluster) # Asignación de clústeres a cada observación
## [1] 1 4 2 1 4 4 3 4 4 4 4 4 4 1 4 3 4 2 2 1 3 4 2 4 4 4 4 4 4 1 3 3 3 3 4 4 4
## [38] 4 2 3 2 4 4 4 4 4 4 1 2 1 3 3 4 4 1 4 1 2 1 2 4 4 2 2 2 3 2 2 4 2 2 2 4 2
## [75] 1 2 2 2 2 4 2 2 2 2 2 4 2 2 2 2 2 3 3 2 4 2 2 2 4 2 2 4 2 2 2 4 4 3 2 4 4
## [112] 4 2 4 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 4 4 4 4 4 4 4 2 4 4 2 4 2 2 2 2
## [149] 2 4 2 4 4 4 4 4 2 4 2 4 4 2 4 2 2 2 2 2 2 2 2 2 3 4 4 4 4 2 4 1 2 4 4 2 1
## [186] 3 4 4 2 2 4 2 2 2 2 2 1 1 2 1 3 4 2 4 4 2 4 2 2 4 4 2 4 2 4 2 2 4 3 2 2 2
## [223] 2 2 4 4 4 1 4 2 2 2 4 2 2 4 4 4 2 4 4 2 2 2 2 2 2 1 2 2 4 4 3 4 4 2 4 4 4
## [260] 2 4 4 4 4 4 4 4 4 2 2 2 2 1 4 4 4 2 2 4 4 2 2 2 2 4 4 4 4 4 4 4 2 2 4 4 2
## [297] 4 2 4 4 2 2 4 2 2 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 2 2 4 4 4 4 2 2 4 2 2 4 4
## [334] 2 2 2 2 2 1 2 2 2 2 2 4 4 4 3 4 4 4 2 2 4 2 4 4 4 4 4 2 1 2 4 4 4 4 3 4 4
## [371] 2 2 3 2 4 4 2 2 2 2 2 2 2 2 4 4 4 4 4 1 1 4 4 2 2 2 4 2 2 4 4 2 4 4 4 2 2
## [408] 2 2 4 4 1 2 4 4 2 4 2 4 2 2 4 4 4 4 4 4 4 2 2 2 2 1 2 4 4 4 4 3 2 4 2 2 4
## [445] 2 4 4 4 4 2 4 2 4 4 4 4 4 4 3 4 4 2 2 2 2 2 2 3 4 4 4 4 2 4 4 4 4 2 2 2 4
## [482] 2 2 2 2 1 2 2 2 4 2 4 4 3 4 2 4 3 2 2 4 4 2 2 2 1 1 2 1 4 3 4 4 4 4 4 4 4
## [519] 1 2 2 4 2 4 4 2 1 2 4 1 2 3 4 2 4 4 4 4 2 4 4 2 2 2 2 2 2 4 4 1 4 4 1 2 2
## [556] 2 1 2 4 4 4 4 4 4 4 4 3 4 4 4 4 2 4 3 4 2 2 4 4 2 2 2 4 4 2 4 2 4 1 1 4 4
## [593] 4 4 2 1 2 4 4 4 4 1 2 2 1 2 1 2 2 2 2 2 2 2 4 4 4 4 3 4 4 4 4 4 4 4 4 4 3
## [630] 4 3 4 4 4 2 4 4 4 2 2 4 2 4 2 4 4 4 4 4 4 4 2 4 4 4 4 1 4 1 1 1 2 2 4 3 4
## [667] 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 2 4 4 4 2 4 4 2 4 4 4 1 4 1 4 2 4 4 4 2 2 2
## [704] 2 4 2 2 2 2 1 2 2 2 4 4 4 3 4 4 4 3 2 4 4 2 2 2 2 2 2 1 4 2 4 4 4 2 3 4 3
## [741] 2 4 2 4 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 3 4 4 3 4 3 4 4 4 4 4 4 4 2 4 2
## [778] 4 4 2 1 4 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 2 1 4 4 2 4 2 4 4 2 4 2 4 4 4 2 4
## [815] 4 3 4 1 4 4 2 1 2 2 2 2 2 2 2 1 1 2 4 4 4 4 3 4 4 4 4 4 2 2 4 4 4 4 4 4 4
## [852] 4 2 2 2 4 2 4 4 4 2 4 4 4 4 4 4 2 4 4 4 2 2 2 2 2 4 4 4 3 4 4 4 4 4 4 2 2
## [889] 2 4 4 2 2 4 4 1 4 2 1 4 1 2 2 2 1 2 2 2 2 4 4 4 4 4 2 4 2 2 4 4 4 2 2 3 4
## [926] 4 4 4 4 2 4 2 3 4 2 4 2 2 2 2 4 4 4 4 4 4 2 4 2 4 2 2 2 4 1 2 1 2 2 4 4 4
## [963] 2 2 2 2 2 3 2 4 2 4 4 4 4 4 4 1 2 4 2 2 2 2 2 2 2 2 2 4 4 1 1 1 2 2 2 2 2
## [1000] 2 4 3 4 4 4 4 1 2 4 4 4 2 2 4 4 2 2 4 4 2 1 4 4 3 2 2 4 2 4 2 2 2 2 4 2 4
## [1037] 4 2 4 1 1 2 4 4 4 2 2 2 2 4 4 2 2 2 2 4 4 4 4 4 4 4 2 2 2 2 4 4 4 4 4 4 4
## [1074] 3 4 4 4 4 4 2 1 2 2 4 1 2 4 2 2 1 2 2 2 2 1 1 1 2 2 2 2 2 4 3 4 4 4 4 4 1
## [1111] 4 4 4 4 2 3 1 4 2 2 2 2 2 4 2 2 1 2 2 4 4 4 4 4 2 4 2 2 1 4 4 2 2 2 4 2 2
## [1148] 3 2 2 4 2 2 2 2 4 2 4 2 1 2 1 1 2 2 2 2 4 4 4 3 2 4 2 2 2 4 2 2 4 1 2 2 2
## [1185] 4 3 2 2 2 4 2 1 2 1 2 4 4 2 2 2 1 2 2 1 2 3 4 4 4 3 4 4 4 4 2 2 4 4 2 1 4
## [1222] 4 4 4 2 2 2 2 2 2 4 2 4 4 4 4 4 4 4 2 2 4 2 2 4 4 1 4 2 2 2 4 2 2 4 2 4 4
## [1259] 4 2 4 4 4 2 2 4 4 4 4 1 1 2 2 2 2 2 1 1 2 2 2 1 1 4 4 4 4 4 4 4 4 4 3 4 4
## [1296] 4 4 2 3 2 2 2 2 4 2 4 4 4 4 4 2 4 4 4 2 1 2 4 2 4 4 2 4 2 4 4 4 4 2 4 2 2
## [1333] 2 4 4 4 4 4 4 4 4 4 4 4 2 2 3 2 4 4 4 4 4 2 4 4 4 4 4 3 4 4 4 2 3 3 4 4 2
## [1370] 4 4 4 4 4 4 2 4 4 4 4 4 1 2 1 2 1 2 2 2 1 2 2 2 2 1 2 2 2 4 4 4 4 4 4 4 4
## [1407] 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 3 4 4 4 4 4 4 4 4
## [1444] 4 4 4 4 4 4 2 4 4 4 3 2 2 4 4 2 2 4 4 2 4 2 4 1 4 2 4 4 3 4 2 4 4 2 1 1 1
## [1481] 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 4 4 1 2 4 4 4 4 4 2 2 2 2 2 2 2 2 2
## [1518] 2 2 2 1 4 3 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 4 3 4 4 4 4 4 2 4 4 4 4
## [1555] 1 4 4 4 4 4 1 4 1 4 4 2 4 4 4 4 4 3 4 2 2 2 2 4 4 2 4 4 4 4 4 4 4 4 4 4 4
## [1592] 4 4 4 4 4 4 2 4 4 4 1 2 2 2 4 4 4 4 4 4 2 4 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2
## [1629] 2 1 2 2 2 1 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 3 4 4 4 4 4 4 4 4 4 4
## [1666] 4 4 3 4 4 4 4 3 3 3 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 4 4 4
## [1703] 2 4 2 4 4 2 3 4 4 4 4 4 4 4 4 1 2 4 2 4 2 2 1 4 2 4 2 2 4 4 4 4 1 4 4 4 2
## [1740] 4 2 2 1 4 4 4 2 2 4 2 4 4 4 4 3 4 2 2 3 4 2 4 4 4 4 3 4 1 4 2 2 1 4 3 4 4
## [1777] 4 4 4 4 3 2 1 4 4 2 3 4 4 1 2 2 1 2 2 2 4 4 2 4 4 4 2 4 2 1 1 4 1 2 2 2 1
## [1814] 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [1851] 4 4 2 2 4 4 2 2 2 4 4 2 1 2 4 4 2 4 1 4 4 4 4 2 4 4 4 4 2 4 4 2 4 1 4 2 2
## [1888] 1 2 4 4 4 2 2 1 4 4 4 4 4 4 2 2 2 2 4 4 4 4 4 4 2 2 2 2 2 4 4 4 4 4 4 4 4
## [1925] 2 2 2 2 2 3 4 3 2 2 4 4 4 4 2 2 4 4 4 1 4 2 4 4 4 4 4 2 4 4 4 4 2 4 2 4 4
## [1962] 4 4 4 2 4 4 4 2 2 4 4 4 4 4 4 4 4 2 2 4 4 2 2 3 4 4 4 1 2 2 4 4 4 4 4 4 2
## [1999] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [2036] 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 4 4 4 4 4 4 4 4 4 4 4
## [2073] 4 4 4 4 4 4 4 4 4 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 2 4 2
## [2110] 2 4 4 4 4 4 3 2 2 2 4 2 4 4 2 1 1 1 1 2 2 1 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4
## [2147] 4 4 4 4 3 3 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 2 1 4 4 4 4
## [2184] 4 4 4 4 4 4 4 4 3 4 4 4 2 4 4 4 3 3 2 3 2 4 3 2 2 1 3 1 1 2 4 2 4 4 2 4 2
## [2221] 4 2 4 2 4 4 4 2 2 2 2 2 4 4 2 2 2 4 4 4 4 3 4 4 1 1 4 2 2 2 2 2 4 4 4 3 4
## [2258] 4 4 4 4 4 4 1 2 1 2 2 2 2 2 4 4 4 4 4 4 3 4 4 4 3 3 3 3 3 4 4 4 4 4 4 3 3
## [2295] 4 4 2 4 4 4 4 2 2 4 2 2 2 2 2 2 2 4 4 2 2 2 4 1 4 2 2 4 4 1 4 4 4 2 1 1 2
## [2332] 2 1 2 2 2 2 2 2 2 2 2 2 4 3 4 3 4 4 3 4 4 4 4 4 4 4 4 3 4 4 4 3 3 3 4 3 4
## [2369] 4 3 4 4 4 4 4 4 4 4 4 3 4 4 2 3 4 1 2 4 4 4 1 4 4 4 2 3 3 4 3 3 3 4 2 1 4
## [2406] 4 4 4 2 4 4 4 4 3 1 3 4 2 3 4 3 3 2 4 4 4 4 1 1 4 2 3 3 4 4 4 1 2 2 4 4 2
## [2443] 4 4 4 4 4 4 4 2 4 4 4 4 4 4 4 4 4 4 2 2 4 3 2 4 4 4 4 4 4 4 4 2 4 4 4 4 4
## [2480] 2 3 4 4 4 3 3 2 4 2 4 4 4 4 3 4 3 2 4 4 1 4 4 4 4 4 4 4 4 2 4 4 3 3 2 1 4
## [2517] 2 3 4 4 2 2 2 2 2 1 1 1 1 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 3 4 4
## [2554] 4 4 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 2 2 2 4 2 4 4
## [2591] 3 4 4 4 4 2 2 1 4 3 4 4 4 4 4 4 4 4 4 4 4 3 4 2 4 3 4 4 1 2 4 4 3 2 2 4 4
## [2628] 2 4 2 2 3 1 3 4 4 4 4 4 4 2 2 4 4 4 1 4 4 4 2 2 2 4 3 4 1 4 4 4 2 4 3 4 4
## [2665] 3 3 2 4 3 4 4 4 4 4 4 2 2 4 4 4 4 4 3 2 4 4 4 2 2 2 4 4 2 4 4 2 4 2 1 2 2
## [2702] 2 2 4 4 2 2 4 2 2 2 2 2 1 2 2 2 2 2 2 1 1 2 2 1 1 1 2 2 1 2 2 2 2 2 2 3 4
## [2739] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 3 4 3 3 3 4 4 4 4 4 4 2 2 2 2 4 4 1 2 2
## [2776] 4 4 4 1 2 2 2 2 4 2 4 4 4 4 4 4 4 4 4 4 4 2 3 2 3 4 2 2 3 3 2 3 4 2 2 2 2
## [2813] 2 3 2 1 4 4 4 4 4 1 1 4 2 4 4 2 4 2 4 4 4 3 4 4 2 2 1 1 2 2 4 2 1 1 4 4 3
## [2850] 3 4 4 4 4 1 2 4 2 2 1 4 4 2 4 2 1 4 2 2 4 4 1 4 1 2 4 2 4 2 2 2 2 2 2 1 1
## [2887] 1 1 2 1 2 1 1 1 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 3
## [2924] 3 4 4 4 3 3 3 4 4 4 4 4 4 3 4 4 4 4 4 2 4 4 4 4 4 4 2 2 2 2 4 2 4 2 2 2 4
## [2961] 2 2 2 3 4 4 2 4 4 4 4 4 4 4 4 2 4 4 2 2 4 4 4 4 3 3 3 4 4 4 4 4 4 4 4 2 4
## [2998] 4 4 4 3 4 2 2 1 4 2 4 2 3 4 4 4 4 2 2 2 1 1 1 2 2 1 2 1 4 4 4 4 3 4 3 4 4
## [3035] 4 3 4 4 4 4 3 4 4 4 4 4 3 1 3 4 4 4 2 2 4 1 3 4 4 2 4 4 4 4 1 2 2 3 4 3 4
## [3072] 3 4 4 1 2 3 4 4 2 2 2 2 2 1 1 1 2 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4
## [3109] 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 2 4 4 4 4 4 2 4 1 3
## [3146] 2 4 4 2 1 4 4 4 2 1 2 2 2 2 2 1 1 4 2 4 4 2 4 4 1 3 2 4 4 2 4 4 3 1 3 4 4
## [3183] 2 1 4 2 2 1 1 1 2 2 2 1 2 2 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 3 4 4 4 4 4 3 4
## [3220] 4 4 4 4 4 1 4 3 2 4 4 2 4 4 2 4 2 3 4 4 4 4 4 4 4 4 2 4 2 1 1 4 1 4 2 4 4
## [3257] 4 2 2 4 4 2 1 4 4 4 4 4 4 3 4 4 4 4 2 4 4 4 4 2 1 1 1 1 1 1 2 2 2 2 2 1 1
## [3294] 1 2 2 2 2 2 1 2 2 1 2 2 1 2 4 3 4 4 4 4 4 4 4 3 3 3 4 3 4 4 4 4 4 4 4 4 4
## [3331] 3 3 4 4 4 4 4 4 3 3 4 4 3 4 4 4 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 3 2 1 4 4 1
## [3368] 4 2 1 4 1 4 2 2 4 4 4 4 4 4 4 4 4 2 1 2 1 1 4 3 4 4 4 3 3 4 4 3 4 4 4 1 4
## [3405] 4 1 4 3 1 4 4 1 4 3 2 2 4 4 4 2 4 3 1 1 4 4 4 3 3 3 3 4 1 1 1 2 4 2 2 4 4
## [3442] 4 1 2 2 4 3 4 1 3 1 2 1 4 4 1 2 2 1 2 2 2 1 1 1 2 2 2 1 1 1 1 1 2 1 4 3 4
## [3479] 3 4 4 3 3 3 4 4 4 4 4 4 3 4 4 4 4 4 3 4 4 3 4 4 3 4 3 4 3 3 4 3 4 4 3 3 3
## [3516] 3 4 3 4 3 4 3 2 4 1 2 3 2 2 4 2 2 4 2 2 1 1 1 1 3 1 3 2 3 3 1 1 3 4 1 1 3
## [3553] 3 2 1 4 4 4 4 4 4 1 3 4 4 3 3 2 3 3 2 2 4 4 4 1 2 2 2 2 2 3 3 4 2 4 4 4 1
## [3590] 4 3 4 2 3 4 2 2 4 3 3 4 2 4 4 4 4 2 2 4 4 4 2 4 4 4 3 3 3 3 2 1 1 4 1 2 1
## [3627] 2 1 2 2 2 1 1 1 2 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 3 3 4 4 4 4 4 4 3 4 4 4
## [3664] 4 4 3 4 4 4 4 3 3 3 3 4 4 3 4 4 4 4 4 1 3 2 1 1 2 4 4 3 4 1 4 2 2 2 4 1 3
## [3701] 4 2 4 2 2 4 3 4 3 4 4 1 2 4 1 1 1 3 2 3 3 3 3 2 3 4 4 4 4 4 2 1 4 1 3 3 3
## [3738] 1 3 4 3 4 2 3 4 1 3 3 3 4 4 3 3 3 3 4 2 3 4 4 3 4 3 3 4 3 2 2 2 4 3 3 3 4
## [3775] 4 4 4 2 1 4 4 4 4 4 3 4 3 2 3 2 2 1 1 2 2 2 2 2 2 2 2 1 2 2 1 1 2 1 2 2 2
## [3812] 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 1 2 1 2 1 1 2 2 2 2 2 2 2 2 1 2 4 4 3 3 4
## [3849] 4 4 4 4 4 4 4 4 3 3 4 4 4 4 3 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4
## [3886] 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 3 4 3 3 3 4 3 4 4 4 4 4 4 4 4 4 1
## [3923] 4 4 4 3 3 4 3 4 3 4 2 2 4 4 4 1 4 4 1 3 4 3 3 4 1 2 3 1 1 2 4 3 3 3 4 3 4
## [3960] 4 3 3 3 3 3 1 1 1 2 3 4 4 2 4 3 4 1 4 1 3 2 2 3 4 4 4 1 1 1 1 4 3 3 4 4 4
## [3997] 4 2 3 4 4 4 4 2 3 1 2 1 2 1 1 3 3 4 1 4 3 4 3 4 2 2 1 4 2 4 4 4 3 1 4 2 3
## [4034] 4 4 3 4 3 1 4 2 4 4 1 2 4 4 3 3 4 3 3 4 1 2 1 3 4 3 2 1 2 2 1 1 1 1 1 2 2
## [4071] 2 1 2 1 1 4 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 4 4 4 3 4 3 3 3 4 4 3
## [4108] 4 4 2 2 2 4 4 3 4 4 4 4 4 3 3 3 2 4 3 3 3 1 1 2 4 2 4 2 1 2 3 3 4 2 4 4 4
## [4145] 4 4 4 2 2 2 1 4 2 1 4 4 4 1 1 2 1 1 2 1 2 3 4 4 3 4 4 4 4 3 3 4 3 4 2 4 4
## [4182] 4 2 2 3 2 4 2 1 4 4 2 2 2 3 3 2 4 4 3 3 2 4 4 1 2 4 1 3 1 2 3 4 4 4 3 2 3
## [4219] 2 4 2 1 4 2 2 2 2 2 2 2 4 3 4 3 1 4 4 3 4 1 4 3 2 2 2 1 2 1 2 1 2 1 2 1 1
## [4256] 2 1 2 2 4 4 4 4 4 3 3 3 3 3 3 3 4 3 3 4 4 4 4 3 4 3 3 4 4 3 2 3 3 2 2 3 1
## [4293] 2 4 4 4 4 2 3 4 4 4 4 2 4 1 2 4 1 4 4 1 4 4 3 2 1 1 4 3 4 1 3 3 3 2 2 3 3
## [4330] 2 3 3 3 2 2 3 3 1 1 1 1 3 3 3 1 1 2 3 4 3 3 4 1 2 2 1 4 4 4 2 1 3 4 2 4 4
## [4367] 3 3 1 2 2 4 4 4 1 1 3 3 2 2 2 2 2 2 2 2 1 2 1 1 2 2 2 2 2 1 2 2 1 1 1 2 2
## [4404] 2 2 1 1 1 2 1 1 4 4 4 4 4 4 4 3 3 4 4 4 3 4 4 4 4 4 4 4 4 3 4 4 3 3 4 2 1
## [4441] 1 2 1 1 2 1 1 1 1 2 2 1 1 1 1 2 2 2 2 1 1 2 1 1 1 2 2 2 2 2 2 2 2 1 1 1 2
## [4478] 2 2 2 1 2 1 2 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 3 3 3 3 4 4
## [4515] 3 4 4 4 4 3 3 3 4 3 4 4 3 4 4 4 3 3 4 4 3 2 2 4 3 3 4 3 4 4 1 3 2 1 3 1 1
## [4552] 1 2 1 2 1 2 2 2 1 1 2 1 1 2 1 2 1 4 3 3 2 2 4 1 4 3 3 4 2 2 3 2 4 1 1 1 4
## [4589] 4 2 2 2 4 1 4 4 3 3 4 2 1 1 3 4 4 4 2 4 4 2 4 2 4 4 4 4 2 4 4 4 4 2 2 2 4
## [4626] 2 4 1 3 4 1 1 1 3 4 3 1 3 2 4 4 4 4 4 1 2 4 3 1 2 2 1 1 1 1 1 1 1 1 2 2 1
## [4663] 2 2 2 2 4 4 4 3 3 4 3 4 4 4 4 3 4 3 4 4 4 3 3 4 3 4 4 2 2 1 1 1 1 2 4 1 1
## [4700] 1 1 4 4 2 4 2 3 2 1 4 1 2 1 3 3 3 3 2 3 3 4 3 4 3 2 2 4 4 2 1 3 3 4 1 1 2
## [4737] 1 4 4 4 2 4 4 3 3 4 4 4 2 3 4 3 2 3 4 4 2 2 3 3 2 2 4 4 2 2 2 1 2 1 4 2 1
## [4774] 4 3 4 3 4 1 1 2 1 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 2 1 3 3 3 4 4 4 1 3 4 4 3
## [4811] 4 3 3 3 4 3 3 3 4 4 4 2 3 3 4 2 4 1 3 2 3 1 2 4 1 3 1 4 2 3 1 3 4 1 1 4 2
## [4848] 3 3 1 1 2 4 4 3 1 3 3 4 1 3 4 1 1 3 2 4 2 1 1 2 2 2 1 1 1 2 2 1 2 1 2 2 1
## [4885] 1 1 1 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 3 3 3 3 4 4 3 3 3 3 3 3 4 3 3 3 3 4
## [4922] 3 4 3 4 3 3 4 4 4 4 4 3 4 4 4 4 1 1 2 1 2 4 4 4 1 3 3 3 4 4 3 2 3 4 2 3 3
## [4959] 2 4 3 3 4 1 4 4 1 1 3 1 4 4 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3
## [4996] 3 4 3 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 3 1 1 2 2 1 2 3 1 3 1 2 2 1 4 4 2 3 1
## [5033] 2 2 2 1 2 4 3 4 1 1 3 3 2 1 2 2 4 4 4 4 4 4 4 4 4 4 4 3 4 4 3 4 3 4 3 3 3
## [5070] 3 4 3 3 1 2 4 4 4 4 3 4 4 2 3 3 3 1 2 1 3 3 2 4 1 1 1 3 4 4 1 4 4 3 2 4 4
## [5107] 3 4 4 1 2 4 4 2 2 2 1 1 4 3 2 2 3 1 4 4 4 3 4 1 1 1 3 3 2 2 2 3 4 2 3 1 2
## [5144] 2 1 1 4 1 3 3 3 4 4 3 2 1 2 2 1 1 1 2 2 1 4 3 3 3 3 3 4 4 3 4 3 3 4 3 3 3
## [5181] 3 4 4 3 4 4 4 4 4 2 3 1 4 1 1 3 4 4 1 4 4 4 4 3 1 1 1 1 3 3 3 3 1 2 4 2 4
## [5218] 4 3 3 4 4 2 3 4 4 1 1 2 1 3 4 4 3 1 4 3 1 3 3 3 1 4 1 1 2 4 4 3 1 1 3 4 4
## [5255] 3 4 3 3 4 1 3 3 3 2 2 2 2 1 1 1 1 1 2 2 2 1 1 1 1 2 2 1 2 2 4 4 3 4 4 4 4
## [5292] 3 4 1 3 4 4 3 3 3 3 4 4 4 4 4 4 3 4 4 3 3 3 3 3 4 1 4 1 3 3 3 3 2 3 3 4 4
## [5329] 2 4 4 4 4 4 3 3 3 1 3 3 3 3 3 3 3 3 3 4 1 3 3 3 3 3 3 3 3 2 1 4 2 4 3 1 2
## [5366] 4 1 3 3 3 1 1 3 3 3 1 4 2 1 1 4 1 1 1 2 2 3 4 4 4 4 1 4 3 3 3 4 3 2 3 1 4
## [5403] 2 2 2 3 4 3 1 4 2 4 1 1 3 2 3 4 4 4 1 1 1 1 1 3 4 1 1 1 1 1 1 1 2 1 1 1 1
## [5440] 1 1 2 1 1 2 2 2 2 1 1 1 1 1 4 3 3 3 3 3 3 4 3 3 3 3 3 3 4 3 3 3 3 3 2 1 1
## [5477] 2 2 1 2 2 1 2 1 2 1 2 1 1 1 1 1 1 2 1 1 2 1 1 1 2 2 4 4 4 4 4 4 4 4 3 3 3
## [5514] 3 3 4 4 1 1 1 4 4 4 3 1 2 1 1 2 3 1 1 1 1 1 1 2 4 4 4 3 4 4 3 3 1 3 3 1 3
## [5551] 3 3 3 2 2 3 4 4 4 4 1 3 3 4 3 4 1 2 3 3 3 2 4 3 1 3 1 4 4 3 2 3 4 4 4 2 4
## [5588] 4 2 2 2 2 1 2 3 3 3 3 2 3 4 4 1 1 1 2 2 1 2 2 2 1 2 4 4 3 3 4 4 4 4 4 4 4
## [5625] 3 3 3 3 3 3 4 1 1 4 4 1 3 1 4 2 2 1 4 4 3 3 2 1 2 3 2 1 2 1 3 2 3 2 4 3 4
## [5662] 4 3 4 2 1 2 1 1 4 1 1 1 4 4 4 3 3 3 1 4 4 4 1 3 2 2 1 4 4 1 1 2 4 3 1 4 4
## [5699] 1 2 2 1 3 1 4 1 1 1 2 1 1 1 2 1 4 3 4 4 4 1 4 4 2 1 1 2 2 2 1 2 1 1 1 1 2
## [5736] 1 1 1 1 1 1 1 4 4 4 4 4 3 4 4 3 3 4 4 4 4 3 3 3 4 3 4 4 2 1 1 1 4 1 3 3 4
## [5773] 2 2 1 1 2 3 3 1 1 1 3 1 4 2 1 4 1 4 3 4 4 2 1 4 4 3 4 4 1 3 3 4 1 3 2 3 1
## [5810] 4 3 1 1 1 1 2 4 4 2 1 3 2 2 2 4 4 3 3 3 1 3 4 3 4 3 4 4 2 3 3 3 4 2 4 4 4
## [5847] 4 4 3 4 4 4 4 4 3 1 4 3 4 4 1 3 4 1 1 2 2 2 1 1 1 1 2 2 1 4 3 3 3 3 3 4 3
## [5884] 4 4 4 4 4 4 3 3 4 3 3 3 4 3 2 1 2 2 3 1 1 2 2 4 4 4 4 1 3 1 1 1 2 3 2 4 4
## [5921] 3 4 4 2 2 3 4 4 2 2 4 4 4 2 3 3 4 3 4 1 3 3 1 1 3 4 3 3 4 3 3 3 4 3 3 4 4
## [5958] 2 2 2 1 1 4 2 3 1 1 2 3 4 3 4 4 4 2 3 2 3 4 2 4 2 1 1 4 2 1 4 1 1 4 3 4 2
## [5995] 4 1 3 4 4 4 2 1 1 4 1 3 3 2 4 3 4 4 4 3 3 3 3 3 3 3 4 3 1 1 1 1 1 1 1 1 2
## [6032] 2 2 1 1 1 1 1 1 1 4 4 3 3 4 4 4 3 3 3 3 4 3 3 3 3 3 3 3 4 4 3 4 4 3 3 2 2
## [6069] 3 1 3 2 3 3 4 2 2 4 3 3 2 3 2 3 3 4 4 2 2 1 4 1 3 2 4 1 4 3 3 3 3 1 4 2 1
## [6106] 3 4 3 1 2 3 3 1 1 1 4 1 4 2 2 2 1 2 2 2 4 3 3 1 1 3 3 4 2 1 1 3 1 1 1 1 1
## [6143] 1 1 1 3 3 3 3 3 3 3 3 3 3 1 4 1 1 2 3 2 1 1 1 2 1 2 1 1 2 1 2 2 1 2 1 2 2
## [6180] 1 1 1 1 1 1 2 1 3 3 3 3 3 3 4 4 4 3 3 4 3 4 4 4 3 3 3 2 3 4 1 2 3 4 4 3 3
## [6217] 3 4 3 4 4 3 2 4 3 2 2 1 1 4 4 3 3 4 4 4 3 2 1 2 1 3 3 4 4 4 4 1 2 3 2 4 4
## [6254] 4 1 4 3 2 1 2 2 1 4 1 4 1 1 1 4 4 1 2 1 1 3 4 3 4 4 2 3 3 3 3 1 2 4 4 4 3
## [6291] 1 1 1 3 4 4 4 3 1 3 3 4 4 4 1 1 2 2 2 1 2 4 4 4 4 1 2 2 1 1 1 1 1 2 1 2 1
## [6328] 1 1 2 1 1 2 1 2 1 3 4 3 3 3 3 3 3 3 3 4 4 3 3 3 3 4 4 4 3 4 4 3 4 4 4 4 4
## [6365] 4 3 3 2 4 2 3 3 2 4 2 3 2 3 3 1 1 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 4 1 3 3 3
## [6402] 2 2 4 1 1 2 4 4 2 3 2 2 2 1 1 1 1 4 4 3 3 1 3 4 2 3 2 2 2 3 4 4 3 1 3 4 3
## [6439] 4 4 4 4 4 4 4 4 3 3 3 1 1 2 2 4 4 1 1 2 2 1 1 1 2 3 3 3 3 3 3 4 3 3 3 3 3
## [6476] 4 4 2 2 3 3 2 4 3 1 2 4 3 4 4 4 1 3 3 1 4 4 4 4 4 4 1 2 2 1 2 4 4 4 4 1 1
## [6513] 2 2 2 1 3 3 3 4 4 3 2 2 1 3 1 3 3 3 3 3 3 4 3 3 4 3 1 1 2 1 1 1 1 1 1 2 2
## [6550] 1 1 1 4 3 4 3 3 3 3 3 3 3 4 4 4 4 4 4 3 3 4 1 3 3 4 4 4 1 3 3 1 1 3 3 2 3
## [6587] 4 4 4 4 4 4 3 3 3 4 4 2 3 3 1 2 4 3 1 1 3 1 3 3 3 1 3 4 3 1 3 3 3 3 3 3 3
## [6624] 4 4 2 1 1 4 3 3 3 4 3 3 3 3 3 4 4 1 4 4 3 3 2 2 1 1 1 1 2 1 2 2 1 1 1 1 2
## [6661] 2 1 1 4 4 4 4 4 4 4 3 3 4 3 4 4 4 4 3 3 4 3 3 3 3 3 3 3 3 4 4 3 3 4 3 3 4
## [6698] 4 4 1 4 4 3 1 3 3 3 4 3 4 4 4 3 3 1 4 3 3 2 4 2 2 3 3 1 1 3 3 4 3 1 1 3 3
## [6735] 3 2 4 3 4 4 3 3 3 3 4 1 2 4 2 3 4 1 3 4 3 2 1 1 1 1 1 2 1 4 3 3 3 3 3 3 4
## [6772] 4 4 4 3 3 3 3 4 4 4 4 1 4 4 4 3 3 3 3 3 3 3 3 3 4 3 2 1 2 4 1 4 4 3 4 3 3
## [6809] 3 1 4 3 4 4 2 2 2 2 2 1 4 3 1 4 4 4 3 3 4 3 4 3 3 3 1 1 3 2 3 3 4 2 1 3 3
## [6846] 3 3 3 3 3 2 2 2 3 3 3 3 4 3 4 3 4 4 2 3 1 3 4 3 1 3 3 4 4 3 4 3 3 3 3 1 3
## [6883] 3 4 3 3 4 3 3 4 1 1 2 1 3 4 3 3 2 2 3 3 3 3 3 1 3 3 3 2 4 3 3 1 3 3 2 2 2
## [6920] 1 4 3 3 3 3 3 3 4 3 3 4 4 3 4 4 4 4 3 3 4 3 4 3 4 4 3 3 3 4 3 4 3 3 4 3 3
## [6957] 3 3 3 4 3 4 3 1 3 4 3 1 4 3 4 4 4 4 4 3 3 2 3 4 3 4 3 4 4 3 4 3 3 3 2 4 1
## [6994] 3 3 4 3 2 2 2 2 2 1 2 2 2 1 2 2 2 1 1 1 2 2 4 4 3 4 4 4 4 4 4 4 3 3 4 4 3
## [7031] 4 4 4 4 4 4 4 4 3 1 1 2 4 2 3 3 2 3 4 4 3 4 2 2 2 2 2 4 4 4 4 3 4 4 3 2 2
## [7068] 1 2 2 2 2 1 2 2 1 3 4 4 4 3 4 3 3 4 4 4 4 4 3 3 3 3 4 3 3 4 3 3 4 4 4 4 3
## [7105] 4 4 2 4 3 3 3 1 4 4 4 3 4 4 4 4 4 2 3 1 3 3 3 3 3 4 4 3 2 3 3 2 3 1 4 4 2
## [7142] 1 2 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 1 2 4 3 3 3 3 3 4 4 3 3 4 4 2 2 2 2
## [7179] 1 1 2 1 4 3 4 3 4 4 4 3 4 4 4 4 4 3 3 3 3 3 3 3 3 2 3 3 4 2 2 4 3 4 2 1 3
## [7216] 1 3 3 4 3 3 4 4 2 3 2 3 4 4 4 3 4 3 1 4 3 3 3 3 3 4 3 3 3 3 4 2 4 4 4 3 4
## [7253] 4 4 1 2 1 4 4 4 4 4 2 1 2 1 1 1 4 4 4 4 3 4 3 3 4 3 4 3 3 3 3 3 4 4 3 4 1
## [7290] 1 4 4 2 3 4 4 3 1 3 2 2 1 2 1 1 2 2 2 2 2 2 2 1 3 3 3 3 3 4 3 3 4 4 3 3 4
## [7327] 4 4 3 3 3 4 3 3 3 4 3 3 3 3 3 3 3 2 4 3 2 2 3 1 1 3 2 4 3 4 2 4 4 4 3 2 4
## [7364] 3 4 4 4 4 2 4 1 3 2 2 2 4 2 4 3 4 3 3 3 3 4 4 4 4 3 4 3 3 1 4 4 3 3 4 4 4
## [7401] 3 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 2 2 2 1 1 2 3 3 3 3 3 3 3 3 4 4 4 4 3 3 3
## [7438] 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 3 3 2 3 3 3 4 4 2 3 3 3 3 4 2 3 4 1 4 3 3
## [7475] 3 3 3 3 3 4 3 3 3 3 3 3 4 1 3 1 2 3 3 4 3 2 1 1 4 4 4 3 3 2 2 4 4 3 3 3 3
## [7512] 3 3 4 3 3 3 4 4 4 4 3 3 3 4 3 4 1 3 4 4 4 4 4 3 3 3 3 3 3 3 4 3 3 2 4 4 4
## [7549] 4 4 4 3 2 3 4 1 3 4 3 3 2 4 1 3 4 3 3 3 3 3 4 2 2 2 2 2 2 4 4 3 4 3 3 4 3
## [7586] 3 4 3 4 4 3 3 4 4 4 2 3 3 4 4 3 3 4 3 3 4 3 4 4 4 1 4 4 1 4 4 2 2 2 4 4 4
## [7623] 4 4 4 2 1 1 2 2 2 3 3 3 3 3 3 4 4 4 3 3 4 1 4 1 3 2 4 4 3 4 4 3 1 2 2 3 3
## [7660] 3 3 4 4 4 4 3 3 4 4 1 3 2 3 4 4 4 2 2 1 2 4 1 4 2 3 4 4 4 4 4 4 2 4 4 3 3
## [7697] 3 3 4 4 1 3 4 4 4 1 4 3 4 3 3 3 1 4 4 4 3 3 3 3 1 1 4 4 4 4 4 2 3 4 3 3 3
## [7734] 4 4 4 2 3 4 4 4 3 3 4 2 1 1 4 4 4 2 2 3 3 4 4 4 2 2 3 3 4 2 3 3 3 1
table(kmeans_result$cluster) # Número de observaciones por clúster
##
## 1 2 3 4
## 1079 1823 1590 3275
Finalmente se visualiza la clasificación en 4 clusters.
# Visualización
fviz_cluster(kmeans_result, data = data_acp, ellipse.type = "convex", main = "Visualización de Clústeres K-means")
En primera instancia es clara la influencia del tipo de vivienda, sin
embargo la subdivisión dentro de esos dos grandes grupos puede estar
explicada por el precio del inmueble siendo los clusters 1 y 3 los que
corresponden a las viviendas más costosas.
Finalmente el análisis de correspondencia se utiliza para analizar las variables categóricas del dataset y explorar sus relaciones. Primero generamos una tabla de contigencia con los datos categoricos incorporados a los datos preparados.
data_clean$estrato <- factor(data_clean$estrato)
tabla_contingencia <- table(data_clean$zona, data_clean$estrato)
print(tabla_contingencia)
##
## 3 4 5 6
## Zona Centro 105 13 4 1
## Zona Norte 571 404 754 151
## Zona Oeste 53 82 266 571
## Zona Oriente 340 8 2 0
## Zona Sur 380 1610 1654 798
ac_result <- CA(tabla_contingencia, graph = FALSE)
# Paso 3: Visualizar los resultados con un biplot
fviz_ca_biplot(ac_result, repel = TRUE)
El g´rafico Biplot nos permite visualizar la correspondencia entre los
estratos 5 y 4 con la zona sur y un poco con la zona norte. Además
también es claro que en las zonas centro y oriente predominan las
propiedades de estrato 3.