Este informe tiene como objetivo realizar un análisis integral y multidimensional del mercado inmobiliario urbano. Para ello, se aplicarán diversas técnicas de análisis de datos, incluyendo el Análisis de Componentes Principales (PCA), Análisis de Conglomerados, y Análisis de Correspondencia. Estos análisis permitirán identificar patrones, relaciones y segmentaciones clave en el mercado de viviendas, lo que facilitará la toma de decisiones estratégicas por parte de la empresa.
Primero, cargamos los datos y realizamos el preprocesamiento
necesario, que incluye la eliminación de las columnas
longitud, latitud y barrio, y la
conversión de la columna estrato a una variable
categórica.
# Cargar los paquetes necesarios
library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.3
## 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
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
library(tidyr)
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.3
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)
library(ca)
## Warning: package 'ca' was built under R version 4.3.3
# Cargar el conjunto de datos
data("vivienda")
# Preprocesamiento de datos
vivienda_clean <- vivienda %>%
# Eliminar las columnas 'longitud', 'latitud', y 'barrio'
select(-longitud, -latitud, -barrio) %>%
# Convertir 'estrato' en factor (categórica)
mutate(estrato = as.factor(estrato),
zona = as.factor(zona),
tipo = as.factor(tipo)) %>%
# Eliminar filas con valores faltantes en las columnas seleccionadas
drop_na()
# Verificar la estructura del conjunto de datos limpio
str(vivienda_clean)
## tibble [4,808 × 10] (S3: tbl_df/tbl/data.frame)
## $ id : num [1:4808] 5992 1212 1724 2326 4386 ...
## $ zona : Factor w/ 5 levels "Zona Centro",..: 5 2 2 2 2 2 2 2 2 2 ...
## $ piso : chr [1:4808] "02" "01" "01" "01" ...
## $ estrato : Factor w/ 4 levels "3","4","5","6": 2 3 3 2 3 3 3 2 3 4 ...
## $ 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 ...
## $ tipo : Factor w/ 2 levels "Apartamento",..: 2 1 1 1 1 2 2 2 2 1 ...
## - 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>
El Análisis de Componentes Principales se utilizará para reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables numéricas en componentes principales. Esto ayudará a identificar las características clave que influyen en la variación de precios y la oferta en el mercado.
# Seleccionar las variables numéricas
vivienda_numerica <- vivienda_clean %>%
select(preciom, areaconst, parqueaderos, banios, habitaciones) %>%
scale()
# Ejecutar PCA
pca_result <- PCA(vivienda_numerica, graph = FALSE)
# Visualizar la varianza explicada por cada componente
fviz_eig(pca_result, addlabels = TRUE, ylim = c(0, 60))
# Biplot de las dos primeras componentes principales
fviz_pca_biplot(pca_result, repel = TRUE, col.var = "red", col.ind = "blue")
El Análisis de Conglomerados se utilizará para agrupar las propiedades residenciales en segmentos homogéneos con características similares, lo que permitirá entender las dinámicas de las ofertas específicas en diferentes zonas y estratos socioeconómicos.
# Ejecutar k-means clustering en las primeras dos componentes principales
set.seed(123)
cluster_result <- kmeans(vivienda_numerica, centers = 3, nstart = 25)
# Visualización de los clusters
fviz_cluster(cluster_result, data = vivienda_numerica,
geom = "point", stand = FALSE,
ellipse = TRUE, show.clust.cent = TRUE)
El Análisis de Correspondencia se aplicará para examinar la relación
entre las variables categóricas zona, tipo y
estrato, con el fin de identificar patrones de
comportamiento en el mercado inmobiliario.
# Crear tabla de contingencia
tabla_contingencia <- table(vivienda_clean$zona, vivienda_clean$tipo, vivienda_clean$estrato)
# Colapsar la tabla a 2D combinando tipo y estrato
vivienda_clean$tipo_estrato <- interaction(vivienda_clean$tipo, vivienda_clean$estrato, sep = "_")
tabla_contingencia_2d <- table(vivienda_clean$zona, vivienda_clean$tipo_estrato)
# Ejecutar análisis de correspondencia
correspondencia_result <- tryCatch({
CA(tabla_contingencia_2d, graph = FALSE)
}, error = function(e) {
cat("Error en el análisis de correspondencia: ", e$message, "\n")
return(NULL)
})
# Verificar si el análisis fue exitoso
if (!is.null(correspondencia_result)) {
cat("Análisis de correspondencia completado exitosamente.\n")
# Mostrar los eigenvalues obtenidos
print("Eigenvalues:")
print(correspondencia_result$eig)
# Intentar generar el biplot si hay suficientes dimensiones
if (length(correspondencia_result$eig) >= 2) {
cat("Intentando generar el biplot...\n")
tryCatch({
fviz_ca_biplot(correspondencia_result, axes = c(1, 2), repel = TRUE)
}, error = function(e) {
cat("No se pudo generar el biplot: ", e$message, "\n")
})
} else {
cat("El análisis de correspondencia no generó dimensiones suficientes para un biplot significativo.\n")
}
} else {
cat("El análisis de correspondencia no se pudo completar de manera satisfactoria.\n")
}
## Análisis de correspondencia completado exitosamente.
## [1] "Eigenvalues:"
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.4129732796 57.03787200 57.03787
## dim 2 0.2464167374 34.03388795 91.07176
## dim 3 0.0639839175 8.83714922 99.90891
## dim 4 0.0006595281 0.09109083 100.00000
## Intentando generar el biplot...
En esta sección, se presentan gráficos adicionales que complementan los resultados obtenidos de los análisis anteriores, ayudando a visualizar los patrones y relaciones clave identificados.
# Gráfico de barras que muestra la distribución de tipos de vivienda por zona
library(ggplot2)
ggplot(vivienda_clean, aes(x = zona, fill = tipo)) +
geom_bar(position = "dodge") +
labs(title = "Distribución de Tipos de Vivienda por Zona",
x = "Zona",
y = "Número de Propiedades",
fill = "Tipo de Vivienda") +
theme_minimal()
# Boxplot para visualizar la distribución de precios por zona
ggplot(vivienda_clean, aes(x = zona, y = preciom, fill = zona)) +
geom_boxplot() +
labs(title = "Distribución de Precios de Vivienda por Zona",
x = "Zona",
y = "Precio de la Vivienda (millones)",
fill = "Zona") +
theme_minimal()
# Scatter plot para mostrar la relación entre área construida y precio, separado por tipo de vivienda
ggplot(vivienda_clean, aes(x = areaconst, y = preciom, color = tipo)) +
geom_point(alpha = 0.6) +
labs(title = "Relación entre Área Construida y Precio por Tipo de Vivienda",
x = "Área Construida (m²)",
y = "Precio de la Vivienda (millones)",
color = "Tipo de Vivienda") +
theme_minimal() +
facet_wrap(~ zona)
Este análisis ha permitido identificar varias características clave y patrones en el mercado inmobiliario urbano:
areaconst,
preciom, y parqueaderos.zona, tipo de
vivienda, y estrato, proporcionando información valiosa
para la toma de decisiones estratégicas.