## # 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>
## 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
#ESTADÍSTICOS
Se calculan algunos estadísticos de la variable a predecir
mean(vivienda$preciom)
## [1] NA
median(vivienda$preciom)
## [1] NA
sd(vivienda$preciom)
## [1] NA
Al analizar los resultados se evidencia que existen valores NA, dichos valores se eliminan suprimiento las columnas donde se encuentran
sum(is.na(vivienda$preciom))
## [1] 2
mean(vivienda$preciom, na.rm = TRUE)
## [1] 433.8919
median(vivienda$preciom, na.rm = TRUE)
## [1] 330
sd(vivienda$preciom, na.rm = TRUE)
## [1] 328.6472
vivienda <- vivienda[!is.na(vivienda$preciom), ]
dim(vivienda)
## [1] 8320 13
sum(is.na(vivienda$preciom))
## [1] 0
hist(vivienda$preciom)
La mayoría de las viviendas tienen precios moderados, pero existe un grupo pequeño de viviendas muy costosas que generan una cola derecha larga.
boxplot(vivienda$preciom, horizontal=TRUE)
quantile(vivienda$preciom, probs = c(0.75, 0.90, 0.95, 0.99), na.rm=TRUE)
## 75% 90% 95% 99%
## 540 870 1200 1650
Q1 <- quantile(vivienda$preciom, 0.25, na.rm = TRUE)
Q3 <- quantile(vivienda$preciom, 0.75, na.rm = TRUE)
IQR_val <- IQR(vivienda$preciom, na.rm = TRUE)
limite_superior <- Q3 + 1.5 * IQR_val
limite_inferior <- Q1 - 1.5 * IQR_val
limite_superior
## 75%
## 1020
limite_inferior
## 25%
## -260
limite_superior
## 75%
## 1020
max(vivienda$preciom, na.rm=TRUE)
## [1] 1999
La variable precio presenta asimetría positiva con presencia de valores elevados correspondientes al segmento de alta gama. Dado que estos representan características reales del mercado y no errores de medición, no fueron eliminados
aggregate(preciom ~ zona, data = vivienda, mean)
## zona preciom
## 1 Zona Centro 309.6935
## 2 Zona Norte 345.6083
## 3 Zona Oeste 677.5801
## 4 Zona Oriente 228.5299
## 5 Zona Sur 426.5184
El análisis territorial evidencia una marcada segmentación espacial del mercado inmobiliario. La Zona Oeste concentra los valores promedio más elevados, duplicando ampliamente a las zonas de menor valor como Oriente. Este patrón sugiere la existencia de diferenciación socioeconómica estructural en la ciudad.
colSums(is.na(vivienda))
## id zona piso estrato preciom areaconst
## 1 1 2636 1 0 1
## parqueaderos banios habitaciones tipo barrio longitud
## 1603 1 1 1 1 1
## latitud
## 1
round(colMeans(is.na(vivienda)) * 100, 2)
## id zona piso estrato preciom areaconst
## 0.01 0.01 31.68 0.01 0.00 0.01
## parqueaderos banios habitaciones tipo barrio longitud
## 19.27 0.01 0.01 0.01 0.01 0.01
## latitud
## 0.01
vivienda <- vivienda[complete.cases(vivienda$id), ]
2636 / nrow(vivienda) * 100
## [1] 31.6865
vivienda$piso[is.na(vivienda$piso)] <- "No especificado"
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
validación
colSums(is.na(vivienda))
## id zona piso estrato preciom areaconst
## 0 0 0 0 0 0
## parqueaderos banios habitaciones tipo barrio longitud
## 0 0 0 0 0 0
## latitud
## 0
vars_pca <- vivienda[, c("preciom",
"areaconst",
"estrato",
"parqueaderos",
"banios",
"habitaciones")]
vars_pca_scaled <- scale(vars_pca)
pca <- prcomp(vars_pca_scaled, center = TRUE, scale. = TRUE)
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 1.8481 1.1222 0.6780 0.65924 0.49098 0.43579
## Proportion of Variance 0.5692 0.2099 0.0766 0.07243 0.04018 0.03165
## Cumulative Proportion 0.5692 0.7791 0.8557 0.92817 0.96835 1.00000
biplot(pca, cex = 0.6)
El Análisis de Componentes Principales mostró que las dos primeras componentes explican el 77.9% de la variabilidad total del mercado inmobiliario. La primera componente (56.9%) representa principalmente características asociadas al tamaño y nivel de lujo del inmueble, mientras que la segunda (20.9%) refleja patrones de segmentación socioeconómica.
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(cluster)
set.seed(123)
kmeans_result <- kmeans(vars_pca_scaled, centers = 3, nstart = 25)
vivienda$cluster <- as.factor(kmeans_result$cluster)
fviz_cluster(kmeans_result, data = vars_pca_scaled)
aggregate(preciom ~ cluster, vivienda, mean)
## cluster preciom
## 1 1 482.7300
## 2 2 1071.1647
## 3 3 226.9308
aggregate(zona ~ cluster, vivienda, function(x) names(sort(table(x), decreasing=TRUE))[1])
## cluster zona
## 1 1 Zona Sur
## 2 2 Zona Sur
## 3 3 Zona Sur
El análisis de conglomerados permitió identificar tres segmentos diferenciados del mercado inmobiliario. La segmentación no estuvo determinada por la variable geográfica “zona”, sino por características estructurales de los inmuebles, principalmente precio, área construida y estrato socioeconómico.
library(FactoMineR)
# Limpiar variables
vivienda$zona <- trimws(vivienda$zona)
vivienda$tipo <- trimws(vivienda$tipo)
# Crear tabla
tabla <- table(vivienda$zona, vivienda$tipo)
# Eliminar filas y columnas con frecuencia 0
tabla <- tabla[rowSums(tabla) > 0, colSums(tabla) > 0]
print(tabla)
##
## Apartamento Casa
## Zona Centro 24 100
## Zona Norte 1198 722
## Zona Oeste 1029 169
## Zona Oriente 62 289
## Zona Sur 2787 1939
print(dim(tabla))
## [1] 5 2
# Ejecutar CA
ca_result <- CA(tabla, graph = TRUE)
El análisis de correspondencia produjo una única dimensión significativa, debido a que la variable tipo de vivienda contiene únicamente dos categorías. Esta dimensión representa la oposición estructural entre casas y apartamentos. Se observa una asociación fuerte de la Zona Oeste y Zona Norte con apartamentos, mientras que la Zona Centro y Zona Oriente muestran mayor asociación con casas. La Zona Sur presenta una distribución más equilibrada.