Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.
El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
Análisis de Componentes Principales: Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
Análisis de Conglomerados: Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.
Análisis de Correspondencia : Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Visualización de resultados: Presentar gráficos, mapas y otros recursos visuales para comunicar los hallazgos de manera clara y efectiva a la dirección de la empresa.
data("vivienda")
#Almacenar el dataset original en otro.
data_vivienda<-vivienda
write.xlsx(data_vivienda, file = "D://archivo.xlsx")
se inicia con la revisión del Dataset, asi como con el resumen estadistico
# Revisar la estructura del dataset
kable(head(data_vivienda), format = "markdown")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 01 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
# Resumen estadístico
summary(data_vivienda)
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
#Se realiza la verificación de valores nulos por cada una de las variables que conforman la data.
# Verificar valores nulos
sum(is.na(data_vivienda))
## [1] 4275
# Verificar la cantidad de valores nulos por columna
colSums(is.na(data_vivienda))
## id zona piso estrato preciom areaconst
## 3 3 2638 3 2 3
## parqueaderos banios habitaciones tipo barrio longitud
## 1605 3 3 3 3 3
## latitud
## 3
grafico_faltantes <-md.pattern(data_vivienda, rotate.names = TRUE)
la data tiene dos registros con valores nulos en todas las variables y
un registro que contiene únicamente la variable preciom
diligenciada.
# Ver la distribución de las variables categóricas
table(data_vivienda$zona)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 124 1920 1198 351 4726
table(data_vivienda$estrato)
##
## 3 4 5 6
## 1453 2129 2750 1987
table(data_vivienda$tipo)
##
## Apartamento Casa
## 5100 3219
table(data_vivienda$barrio)
##
## 20 de julio 3 de julio
## 3 1
## acopi agua blanca
## 158 1
## aguablanca aguacatal
## 2 109
## alameda alameda del rio
## 16 1
## alameda del río alamos
## 2 14
## alborada alcazares
## 1 2
## alférez real alferez real
## 5 2
## alfonso lopez alfonso lópez
## 1 21
## alfonso lópez i alto jordán
## 1 1
## altos de guadalupe altos de menga
## 4 3
## altos de santa antonio nariño
## 1 2
## aranjuez arboleda
## 15 5
## arboleda campestre candelaria arboledas
## 1 38
## atanasio girardot autopista sur
## 9 1
## bajo aguacatal barranquilla
## 1 6
## barrio 7de agosto barrio el recuerdo
## 1 1
## barrio eucarístico barrio obrero
## 1 1
## barrio tranquilo y base aérea
## 1 2
## belalcazar Belalcazar
## 3 1
## belisario caicedo bella suiza
## 2 18
## bella suiza alta bellavista
## 4 43
## benjamín herrera berlin
## 8 1
## bloques del limonar bochalema
## 1 33
## bolivariano bosques de alboleda
## 1 1
## bosques del limonar boyacá
## 21 1
## bretaña brisas de guadalupe
## 16 1
## brisas de los Brisas De Los
## 81 1
## brisas del guabito brisas del limonar
## 1 1
## Bueno Madrid buenos aires
## 1 7
## caldas Cali
## 1 37
## cali bella cali canto
## 1 1
## calibella calicanto
## 1 8
## calicanto viii calima
## 1 6
## calimio norte calipso
## 5 11
## cambulos camino real
## 3 35
## Camino Real campestre
## 1 1
## caney caney especial
## 88 5
## cañasgordas cañaveralejo
## 7 12
## cañaverales cañaverales los samanes
## 21 1
## capri cascajal
## 56 1
## cataya real ceibas
## 1 1
## centelsa centenario
## 1 15
## Centenario centro
## 1 4
## cerro cristales cerros de guadalupe
## 22 1
## champagnat chapinero
## 14 7
## chiminangos Chiminangos
## 17 1
## chiminangos 1 etapa chiminangos 2 etapa
## 1 2
## chipichape ciudad 2000
## 30 95
## Ciudad 2000 ciudad antejardin
## 1 1
## ciudad bochalema ciudad capri
## 48 13
## ciudad cordoba ciudad córdoba
## 20 15
## ciudad córdoba reservado ciudad country
## 1 1
## ciudad del campo ciudad jardin
## 1 22
## ciudad jardín Ciudad Jardín
## 516 2
## ciudad jardin pance ciudad los alamos
## 1 1
## ciudad los álamos ciudad mel√©ndez
## 25 1
## ciudad melendez ciudad modelo
## 1 7
## ciudad pacifica Ciudad Pacifica
## 2 1
## ciudad real ciudad talanga
## 3 1
## ciudad universitaria ciudadela comfandi
## 1 17
## ciudadela del río ciudadela melendez
## 1 1
## ciudadela paso ancho ciudadela pasoancho
## 1 21
## colinas de menga colinas del bosque
## 3 1
## colinas del sur colon
## 8 1
## colseguros colseguros andes
## 44 4
## Colseguros Andes comfenalco
## 1 1
## compartir conjunto gibraltar
## 1 1
## cristales cristobal colón
## 83 14
## cristóbal colón cuarto de legua
## 2 44
## departamental ed benjamin herrera
## 29 1
## el bosque El Bosque
## 49 1
## el caney El Caney
## 208 1
## el castillo el cedro
## 6 8
## el diamante el dorado
## 2 6
## el gran limonar el guabal
## 8 19
## el guabito el ingenio
## 1 202
## El Ingenio el ingenio 3
## 1 1
## el ingenio i el ingenio ii
## 19 21
## el ingenio iii el jardín
## 20 15
## el jordán el lido
## 1 59
## el limonar el nacional
## 135 1
## el paraíso el peñon
## 3 60
## el prado el refugio
## 2 120
## el rodeo el sena
## 1 1
## el trébol el troncal
## 5 19
## el vallado eucarístico
## 1 2
## evaristo garcía farrallones de pance
## 2 1
## fenalco kennedy fepicol
## 1 1
## flora flora industrial
## 1 16
## floralia fonaviemcali
## 6 1
## francisco eladio ramirez fuentes de la
## 1 1
## gaitan gran limonar
## 1 24
## granada guadalupe
## 15 21
## guadalupe alto guaduales
## 1 2
## guayaquil hacienda alferez real
## 16 1
## ingenio ingenio i
## 1 1
## ingenio ii jamundi
## 1 4
## jamundi alfaguara jorge eliecer gaitán
## 1 1
## jorge isaacs jose manuel marroquín
## 1 1
## juanamb√∫ juanambu
## 53 2
## junin junín
## 18 6
## la alborada la alianza
## 5 5
## la arboleda la base
## 18 15
## la buitrera la campiña
## 3 13
## la cascada la ceibas
## 7 1
## la esmeralda la flora
## 1 366
## La Flora la floresta
## 2 18
## la fortaleza la gran colombia
## 4 1
## la hacienda La Hacienda
## 164 2
## la independencia la libertad
## 12 2
## la luisa la merced
## 1 26
## la morada la nueva base
## 1 8
## la playa la portada al
## 1 1
## la primavera la reforma
## 1 1
## la rivera la rivera i
## 11 2
## la rivera ii la riverita
## 2 1
## la riviera la selva
## 1 11
## la villa del laflora
## 1 1
## lares de comfenalco las acacias
## 1 12
## las américas las camelias
## 3 1
## las ceibas las delicias
## 23 5
## las granjas las quintas de
## 10 1
## las vegas las vegas de
## 1 1
## libertadores los alamos
## 3 1
## los alcazares los alcázares
## 17 5
## los andes los cambulos
## 21 25
## los cámbulos los cristales
## 6 154
## los cristales club los farallones
## 1 4
## los guaduales Los Guaduales
## 25 1
## los guayacanes los jockeys
## 3 1
## los libertadores los parques barranquilla
## 4 6
## los robles lourdes
## 1 2
## mamellan manzanares
## 1 5
## mariano ramos marroquín iii
## 1 1
## mayapan las vegas meléndez
## 46 23
## melendez menga
## 52 23
## metropolitano del norte miradol del aguacatal
## 21 1
## miraflores Miraflores
## 25 1
## morichal de comfandi multicentro
## 3 27
## municipal napoles
## 3 2
## nápoles normandia
## 29 5
## normandía normandía west point
## 154 1
## norte norte la flora
## 9 1
## nueva base nueva floresta
## 1 15
## nueva tequendama oasis de comfandi
## 73 6
## oasis de pasoancho occidente
## 1 11
## pacara pacará
## 19 4
## palmas del ingenio pampa linda
## 1 26
## pampalinda panamericano
## 12 9
## pance Pance
## 409 3
## parcelaciones pance parque residencial el
## 61 1
## paseo de los paso del comercio
## 2 6
## pasoancho poblado campestre
## 6 2
## ponce popular
## 1 6
## portada de comfandi portales de comfandi
## 2 1
## porvenir prados de oriente
## 3 6
## prados del limonar Prados Del Limonar
## 20 1
## prados del norte Prados Del Norte
## 126 1
## prados del sur primavera
## 2 2
## primero de mayo primitivo crespo
## 37 3
## puente del comercio puente palma
## 6 1
## quintas de don Quintas De Don
## 72 1
## quintas de salomia rafael uribe uribe
## 4 1
## refugio rep√∫blica de israel
## 2 1
## rincon de la rincón de salomia
## 1 1
## riveras del valle rozo la torre
## 1 1
## saavedra galindo salomia
## 4 40
## samanes samanes de guadalupe
## 1 1
## sameco san antonio
## 1 24
## san bosco san carlos
## 8 4
## san cayetano san fernando
## 9 54
## San Fernando san fernando nuevo
## 1 10
## san fernando viejo san joaquin
## 18 4
## san joaquín san juan bosco
## 16 7
## san judas san judas tadeo
## 1 2
## san luis san luís
## 2 1
## san nicolas san nicolás
## 1 1
## san pedro san vicente
## 3 48
## santa santa anita
## 1 48
## Santa Anita santa anita sur
## 2 1
## santa bárbara santa elena
## 3 10
## santa fe santa helena de
## 8 1
## santa isabel Santa Isabel
## 63 1
## santa monica Santa Monica
## 51 1
## santa mónica santa mónica alta
## 3 1
## santa monica norte santa monica popular
## 2 2
## santa mónica popular santa monica residencial
## 7 5
## santa mónica residencial santa rita
## 39 45
## santa rosa santa teresita
## 1 262
## Santa Teresita Santafe
## 1 1
## santander santo domingo
## 1 5
## Santo Domingo sector aguacatal
## 1 1
## sector cañaveralejo guadalupe seminario
## 2 32
## sierras de normandía siete de agosto
## 1 8
## simón bolivar tejares cristales
## 1 4
## tejares de san templete
## 14 4
## tequendama tequendema
## 44 1
## terrón colorado torres de comfandi
## 1 57
## unicentro cali unión de vivienda
## 1 3
## urbanización barranquilla urbanización boyacá
## 4 1
## urbanización colseguros urbanizacion el saman
## 3 1
## urbanizacion gratamira urbanización la flora
## 1 83
## urbanización la merced urbanización la nueva
## 4 4
## urbanización las cascadas urbanizacion lili
## 1 2
## urbanización nueva granada urbanización pacara
## 3 1
## urbanización río lili urbanización san joaquin
## 5 4
## urbanización tequendama valle de lili
## 7 1
## valle del lili Valle Del Lili
## 1008 1
## valle grande versalles
## 1 71
## villa colombia villa de veracruz
## 6 6
## villa del lago villa del parque
## 10 1
## villa del prado Villa Del Prado
## 51 1
## villa del sol villa del sur
## 25 5
## villas de veracruz Villas De Veracruz
## 8 1
## vipasa zona centro
## 32 1
## zona norte zona norte los
## 32 1
## zona oeste zona oriente
## 26 18
## zona residencial zona sur
## 1 74
Resumen estadístico de las variables numéricas
# Resumen estadístico de las variables numéricas
summary(data_vivienda[c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "longitud", "latitud")])
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones longitud latitud
## Min. : 0.000 Min. :-76.59 Min. :3.333
## 1st Qu.: 3.000 1st Qu.:-76.54 1st Qu.:3.381
## Median : 3.000 Median :-76.53 Median :3.416
## Mean : 3.605 Mean :-76.53 Mean :3.418
## 3rd Qu.: 4.000 3rd Qu.:-76.52 3rd Qu.:3.452
## Max. :10.000 Max. :-76.46 Max. :3.498
## NA's :3 NA's :3 NA's :3
En esta etapa se inicia con la eliminación de los registros cuyo porcentaje en datos nulos es alto y la imputacion que se requiera para la demas data.
El grafico muestra que se deben eliminar tres registros e imputar los datos en la variable parqueaderos y piso
#Grafico con datos faltantes
grafico_faltantes <-md.pattern(data_vivienda, rotate.names = TRUE)
# Se inicia con la eliminacion de registros nulos.
# Tratamiento de Datos Faltantes
data_vivienda <- data_vivienda %>% filter(id != "NA")
# Se vuelve a graficar para verificar el borrado de registros
grafico_faltantes <-md.pattern(data_vivienda, rotate.names = TRUE)
Se debe cambiar el formato de caracter a numerico de la varibale
piso.
data_vivienda$piso <- as.numeric(data_vivienda$piso)
glimpse(data_vivienda)
## Rows: 8,319
## 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 <dbl> NA, NA, NA, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, …
## $ 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…
# Imputar los valores faltantes de "piso" con la mediana
data_vivienda$piso[is.na(data_vivienda$piso)] <- median(data_vivienda$piso, na.rm = TRUE)
# Imputar los valores faltantes de "parqueaderos" con la mediana
data_vivienda$parqueaderos[is.na(data_vivienda$parqueaderos)] <- median(data_vivienda$parqueaderos, na.rm = TRUE)
glimpse(data_vivienda)
## Rows: 8,319
## 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 <dbl> 3, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, …
## $ 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, 2, 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…
write.xlsx(data_vivienda, file = "D://archivo2.xlsx")
Se verifica que no existan datos faltantes
grafico_faltantes <-md.pattern(data_vivienda, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
El PCA (Análisis de Componentes Principales) es una técnica de reducción de dimensionalidad que transforma un conjunto de variables correlacionadas en un nuevo conjunto de variables no correlacionadas, denominadas componentes principales.
Se busca reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
Los modelos de machine learning y muchos algoritmos estadísticos requieren que los datos de entrada sean numéricos. Por lo tanto, es necesario convertir las variables categóricas a un formato numérico. Para lograr esto, una técnica comúnmente utilizada es one-hot encoding.
Estadisticas previo al analisis de componentes principales
kable(head(data_vivienda))
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | 3 | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | 3 | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | 3 | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 2 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 1 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 1 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
data_vivienda_num <- data_vivienda %>% dplyr::select(piso, preciom, areaconst, parqueaderos, banios, habitaciones, estrato, longitud, latitud)
head(data_vivienda_num)
## # A tibble: 6 × 9
## piso preciom areaconst parqueaderos banios habitaciones estrato longitud
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 3 250 70 1 3 6 3 -76.5
## 2 3 320 120 1 2 3 3 -76.5
## 3 3 350 220 2 2 4 3 -76.5
## 4 2 400 280 3 5 3 4 -76.5
## 5 1 260 90 1 2 3 5 -76.5
## 6 1 240 87 1 3 3 5 -76.5
## # ℹ 1 more variable: latitud <dbl>
En PCA es crucial estandarizar las variables para asegurar que todas tengan la misma escala, ya que las diferencias en unidades o magnitudes pueden afectar los resultados. Al aplicar la normalización (es decir, transformando las variables para que tengan media cero y desviación estándar uno), garantizamos que ninguna variable domine el análisis debido a su escala. Este proceso permite obtener resultados más precisos y representativos, mejorando la interpretación y la identificación de patrones en los datos.
data_vivienda_num_scal= scale(data_vivienda_num)
head(data_vivienda_num_scal)
## piso preciom areaconst parqueaderos banios habitaciones
## [1,] -0.2404274 -0.5595498 -0.7339949 -0.8559050 -0.07793773 1.6406840
## [2,] -0.2404274 -0.3465670 -0.3842568 -0.8559050 -0.77811479 -0.4147626
## [3,] -0.2404274 -0.2552886 0.3152194 0.1313764 -0.77811479 0.2703863
## [4,] -0.6968663 -0.1031580 0.7349051 1.1186578 1.32241640 -0.4147626
## [5,] -1.1533052 -0.5291236 -0.5940997 -0.8559050 -0.77811479 -0.4147626
## [6,] -1.1533052 -0.5899759 -0.6150839 -0.8559050 -0.07793773 -0.4147626
## estrato longitud latitud
## [1,] -1.5872276 0.9728466 0.3793708
## [2,] -1.5872276 0.9331875 0.3763219
## [3,] -1.5872276 0.7607566 0.4225243
## [4,] -0.6156201 -0.6549016 0.4070454
## [5,] 0.3559875 0.8682385 0.9678065
## [6,] 0.3559875 0.6670691 -1.1242009
prcomp(data_vivienda_num_scal)
## Standard deviations (1, .., p=9):
## [1] 1.8821921 1.2509915 1.0174882 0.8988556 0.8553510 0.7204725 0.6163550
## [8] 0.4853623 0.4277544
##
## Rotation (n x k) = (9 x 9):
## PC1 PC2 PC3 PC4 PC5
## piso 0.06761086 -0.34504258 0.68561965 0.58121411 0.13480126
## preciom -0.46885659 -0.10555353 0.16642405 -0.17050364 0.08359543
## areaconst -0.43195923 0.24021894 0.04774085 -0.01541155 0.03752082
## parqueaderos -0.37611337 0.03613013 0.10845049 -0.32936572 0.45731491
## banios -0.45164093 0.13875140 0.04373400 0.24753830 -0.08467593
## habitaciones -0.27217405 0.51133987 -0.06277374 0.48125292 -0.23481298
## estrato -0.32152552 -0.48174873 0.09557738 -0.15104571 -0.04941177
## longitud 0.22941885 0.43561391 0.22174553 -0.01101097 0.68201257
## latitud 0.11611336 0.32898603 0.65117487 -0.45670970 -0.48415480
## PC6 PC7 PC8 PC9
## piso 0.20327289 0.08640824 -0.026917178 -0.02842683
## preciom -0.12158818 0.23625931 0.169621364 0.77839691
## areaconst 0.01416938 0.73244614 -0.186324815 -0.42471934
## parqueaderos 0.59080901 -0.38687334 -0.106815057 -0.13310676
## banios -0.23732187 -0.29716204 0.688524320 -0.29617215
## habitaciones 0.04063724 -0.28233514 -0.481351437 0.24638801
## estrato -0.54558558 -0.26794418 -0.465548309 -0.20965496
## longitud -0.48861615 -0.04630484 -0.042808239 0.02125135
## latitud -0.01606112 -0.09279115 0.006704176 -0.04852252
Elección del número de componentes principales
res.pca <- prcomp(data_vivienda_num_scal)
fviz_eig(res.pca, addlabels = TRUE)
Al observar las contribuciones de cada variable en los componentes
principales, parece que el precio (preciom) es influenciado
principalmente por el área de construcción (areaconst), el número de
baños (banios) y el estrato socioeconómico, pero también por
características geográficas y de la distribución del mercado (como
latitud, longitud, y número de habitaciones). Además, las
características estructurales del inmueble, como el tipo de piso y la
cantidad de parqueaderos, también juegan un papel importante, pero con
un impacto no tan directo en comparación con otras variables.
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
se requiere agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.
data_vivienda_clusters <- data_vivienda_num %>% dplyr::select(piso, preciom, areaconst, parqueaderos, banios, habitaciones, estrato, longitud, latitud)
data_vivienda_clusters
## # A tibble: 8,319 × 9
## piso preciom areaconst parqueaderos banios habitaciones estrato longitud
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 3 250 70 1 3 6 3 -76.5
## 2 3 320 120 1 2 3 3 -76.5
## 3 3 350 220 2 2 4 3 -76.5
## 4 2 400 280 3 5 3 4 -76.5
## 5 1 260 90 1 2 3 5 -76.5
## 6 1 240 87 1 3 3 5 -76.5
## 7 1 220 52 2 2 3 4 -76.5
## 8 1 310 137 2 3 4 5 -76.5
## 9 2 320 150 2 4 6 5 -76.5
## 10 2 780 380 2 3 3 5 -76.5
## # ℹ 8,309 more rows
## # ℹ 1 more variable: latitud <dbl>
data_vivienda_clusters_scal =scale(data_vivienda_clusters)
data_vivienda_clusters_scal = as.data.frame(data_vivienda_clusters_scal)
wss <- vector("numeric", length = 15)
for (i in 1:15) {
kmeans_model <- kmeans(data_vivienda_clusters_scal, centers = i, nstart = 25)
wss[i] <- kmeans_model$tot.withinss
}
# Graficamos el codo
ggplot(data.frame(k = 1:15, wss = wss), aes(x = k, y = wss)) +
geom_line() +
geom_point() +
ggtitle("Método del Codo para seleccionar el número de clusters") +
theme_minimal()
# Suponiendo que el número óptimo de clusters es 4 (puedes cambiarlo según el análisis del Codo)
kmeans_model <- kmeans(data_vivienda_clusters_scal, centers = 3, nstart = 25)
# Agregamos los resultados del clustering al conjunto de datos original
data_vivienda_num$cluster <- kmeans_model$cluster
# Graficamos los clusters usando ggplot
ggplot(data_vivienda_num, aes(x = preciom, y = areaconst, color = as.factor(cluster))) +
geom_point() +
ggtitle("Clusters de Propiedades Residenciales") +
theme_minimal() +
labs(color = "Cluster")
Con base en los datos y la segmentación en clústeres, podemos ver que cada grupo refleja características socioeconómicas y geográficas distintivas:
Cluster 1: Propiedades de estrato medio-bajo, con precios moderados y ubicaciones periféricas o menos deseables. Cluster 2: Propiedades de estrato bajo, con precios bajos y ubicaciones más alejadas o menos accesibles. Cluster 3: Propiedades de estrato alto, con precios altos, áreas grandes y ubicaciones más centrales
# Ver las medias de cada cluster
aggregate(data_vivienda_clusters_scal, by = list(cluster = data_vivienda_num$cluster), FUN = mean)
## cluster piso preciom areaconst parqueaderos banios
## 1 1 0.13913996 -0.3461006 -0.4198380 -0.3421427 -0.3477887
## 2 2 -0.08980046 -0.5620510 -0.3099488 -0.2925765 -0.4898440
## 3 3 -0.18436157 1.3155881 1.1901405 1.0135239 1.2402262
## habitaciones estrato longitud latitud
## 1 -0.38984501 0.09962727 -0.2994646 -0.4436638
## 2 0.04272904 -0.87847894 1.0268719 0.9603003
## 3 0.74445910 0.75637255 -0.5127748 -0.1475240
Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
data_inm_categ <- data_vivienda %>% select(tipo,zona,estrato) %>% mutate(across(everything(),as.factor))
# Realizar el análisis de correspondencia múltiple (MCA)
m_result <- MCA(data_inm_categ, graph = FALSE)
# Graficar las variables del MCA
fviz_mca_var(m_result, repel = TRUE)+
ggtitle("Gráfico de Variables - Análisis de Correspondencia Múltiple (MCA)") +
theme_minimal()
# Coordenadas de las categorías
m_result$var$coord
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Apartamento -0.4055615 0.05557295 -0.2816905 0.04628692 0.4105620
## Casa 0.6425484 -0.08804661 0.4462943 -0.07333436 -0.6504710
## Zona Centro 2.7117940 0.97804319 1.1707605 7.16124468 -0.7122299
## Zona Norte 0.4493412 -0.25052479 -1.3777688 0.13735818 0.4175392
## Zona Oeste -1.0672172 1.76090682 -0.1535974 0.08305129 0.1143684
## Zona Oriente 3.0829751 1.42095660 0.7226742 -2.25815904 0.4693007
## Zona Sur -0.2121447 -0.47579177 0.5142812 -0.09703844 -0.2147898
## 3 1.7201002 0.61225468 -0.2377745 0.05114037 0.4441275
## 4 -0.1988436 -0.89358006 0.7020673 0.11075442 1.0771728
## 5 -0.2057802 -0.47096794 -0.7581495 -0.09398664 -0.9122967
## 6 -0.7599758 1.16154390 0.4709090 -0.02598885 -0.2163072
# Ver contribución de las categorías
m_result$var$contrib
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Apartamento 5.9798007 0.1392799 4.2711464 0.13130191 10.6539626
## Casa 9.4740551 0.2206671 6.7669607 0.20802725 16.8795306
## Zona Centro 6.5003725 1.0488880 1.7938569 76.41575957 0.7795530
## Zona Norte 2.7634837 1.0655995 38.4666050 0.43530584 4.1483877
## Zona Oeste 9.7267022 32.8489067 0.2983008 0.09929647 0.1942014
## Zona Oriente 23.7821076 6.2670058 1.9347381 21.50801811 0.9580608
## Zona Sur 1.5162161 9.4606051 13.1924332 0.53476817 2.7021201
## 3 30.6461768 4.8163850 0.8670143 0.04566438 3.5519304
## 4 0.6000703 15.0325950 11.0754942 0.31382103 30.6146984
## 5 0.8301244 5.3939478 16.6829286 0.29191016 28.3653673
## 6 8.1808907 23.7061201 4.6505220 0.01612710 1.1521877
Diferencias entre Apartamentos y Casas: Apartamento: Los apartamentos tienen valores negativos en varias dimensiones, particularmente en Dim 1 (-0.4055615) y Dim 3 (-0.2816905), lo que podría sugerir que tienden a tener características más pequeñas o diferentes en términos de estructura y tamaño en comparación con las casas. Casa: Las casas, en contraste, muestran valores positivos en Dim 1 (0.6425484) y Dim 3 (0.4462943), lo que sugiere que las casas pueden ser más grandes o tener características más marcadas en estas dimensiones. Conclusión:
La diferencia entre apartamentos y casas parece estar relacionada con el tamaño y la estructura, donde las casas tienden a ser más grandes o tener características distintivas en las dimensiones positivas, mientras que los apartamentos tienden a tener características más pequeñas en las dimensiones negativas.