En el siguiente informe se realizará el análisis de la oferta inmobiliaria de la ciudad de Cali, mediante un análisis exploratorio y descriptivo, cuyo fin es proporcionar una comprensión de las dinámicas que influyen en el mercado de vivienda en la ciudad. Este estudio se enfoca en variables clave como el tipo de vivienda, zona residencial, precio, estrato y otras que serán exploradas en su desarrollo.
Al examinar estas variables, se busca identificar patrones, tendencias y posibles relaciones que permitan entender mejor la oferta y la demanda de viviendas en Cali, así como las preferencias de los compradores y los factores que influyen en los precios.
Se inicia con una exploración a la base de datos, reconociendo sus variables y total de registros. Posteriormente, se realiza la limpieza de sus datos, encontrando registros duplicados, datos faltantes, se realiza estandarización a variables nominales y analisis de imputación de datos. Finalmente, se lleva a cabo un analisis descritivo univariado y multivariado, mostrando el comportamiento de cada variable.
Se inicia con la instalación y carga de paquetes, que contienen la base de datos “vivienda_faltantes”. Se cuenta con un total de 8,330 registros y 13 variables.
# Cargar los datos
data(vivienda_faltantes)
# Visión general de los datos
glimpse(vivienda_faltantes)
## Rows: 8,330
## Columns: 13
## $ id <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, NA, 2, NA, 1, 2, 2, 2, 4, 1…
## $ banios <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo <chr> "Apartamento", "Casa", "Casa", "Casa", "Casa", "Casa", "Apar…
## $ barrio <chr> "arboleda", "normandía", "miraflores", "el guabal", "bella s…
## $ longitud <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …
Se inicia identificando por cada variable el total de datos faltantes
md.pattern(vivienda_faltantes,rotate.names = TRUE)
## preciom id zona estrato areaconst banios habitac tipo barrio longitud
## 4812 1 1 1 1 1 1 1 1 1 1
## 1912 1 1 1 1 1 1 1 1 1 1
## 877 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 parquea piso
## 4812 1 1 1 0
## 1912 1 1 0 1
## 877 1 0 1 1
## 726 1 0 0 2
## 1 0 0 0 12
## 2 0 0 0 13
## 3 1606 2641 4279
Siendo la variable “id” un identificador unico, se procede a eliminar duplicados y NA de la variable “id”, obteniendo que las variables “piso” y “parquea” son las unicas con datos faltantes a tratar
# Contar el total de registros duplicados basados en la variable "id"
total_duplicados_id <- sum(duplicated(vivienda_faltantes$id))
# Eliminar registros duplicados basados en la variable "id"
id_sin_dup <- distinct(vivienda_faltantes, id, .keep_all = TRUE)
#Eliminar registros faltantes (NA) variable "id"
id_sin_dup_na <- id_sin_dup %>% filter(!is.na(id))
faltantes <- colSums(is.na(id_sin_dup_na)) %>% as.data.frame()
faltantes
cat("Total registros duplicados:", total_duplicados_id, "\n")
## Total registros duplicados: 10
cat("Total de registros:", nrow(id_sin_dup_na), "\n")
## Total de registros: 8319
cat("Total de variables:", ncol(id_sin_dup_na), "\n")
## Total de variables: 13
bd_sin_dup <- id_sin_dup_na
Se identifica que la variabl nominal “tipo” debe ser estandarizada
# Revisión variables nominales
table(bd_sin_dup$tipo)
##
## Apartamento APARTAMENTO apto casa Casa CASA
## 5025 61 13 14 3194 12
# Convertir la primera letra en mayúscula variable "tipo"
bd_sin_dup$tipo <- paste(toupper(substring(bd_sin_dup$tipo, 1, 1)),
tolower(substring(bd_sin_dup$tipo, 2)), sep = "")
# Cambiar "apto" por "Apartamento"
bd_sin_dup$tipo <- gsub("\\bapto\\b", "Apartamento",bd_sin_dup$tipo, ignore.case = TRUE)
table(bd_sin_dup$tipo)
##
## Apartamento Casa
## 5099 3220
bd_estand <- bd_sin_dup
Finalmente, se hace un analisis sobre las variables con datos faltantes:
plot_missing(bd_estand)
# Tabla pisos_tipo
pisos_tipo <- table1(~ piso | tipo, data = bd_estand)
kable(pisos_tipo, caption = "Tabla de distribución de pisos por tipo")
| Apartamento | Casa | Overall | |
|---|---|---|---|
| (N=5099) | (N=3220) | (N=8319) | |
| piso | |||
| Mean (SD) | 4.63 (2.81) | 2.14 (0.862) | 3.77 (2.61) |
| Median [Min, Max] | 4.00 [1.00, 12.0] | 2.00 [1.00, 10.0] | 3.00 [1.00, 12.0] |
| Missing | 1381 (27.1%) | 1254 (38.9%) | 2635 (31.7%) |
# Tabla parqueadero_tipo
parqueadero_tipo <- table1(~ parquea | tipo, data = bd_estand)
kable(parqueadero_tipo, caption = "Tabla de distribución de parqueaderos por tipo")
| Apartamento | Casa | Overall | |
|---|---|---|---|
| (N=5099) | (N=3220) | (N=8319) | |
| parquea | |||
| Mean (SD) | 1.57 (0.743) | 2.29 (1.47) | 1.84 (1.12) |
| Median [Min, Max] | 1.00 [1.00, 10.0] | 2.00 [1.00, 10.0] | 2.00 [1.00, 10.0] |
| Missing | 868 (17.0%) | 734 (22.8%) | 1602 (19.3%) |
De acuerdo con lo observado en las tablas desagregadas para el tipo de vivienda (apartamento o casa) en relación a las variables “piso” y “parqueadero”, se sugiere realizar una imputación basada en la mediana. Se emplearía la mediana calculada para cada tipo de vivienda para completar los valores faltantes en las variables correspondientes a ese tipo de vivienda. Los valores obtenidos no se alejan significativamente de la realidad, ya que en general una casa raramente supera los 2 pisos y suele disponer de espacio para parqueadero. Por otro lado, en el caso de los apartamentos, existe una mayor preferencia por los pisos más altos y la disponibilidad de parqueadero tiende a ser más limitada.
Durante esta etapa se lleva a cabo un analisis más detallado de las variables y cómo se relacionan entre si, mediante métodos que permiten resumir y presentar los datos de manera informativa, empleando medidas de tendencia central, dispersión, frecuencias y de distribución para comprender la naturaleza de los datos en profundidad y la identificación de posibles patrones o tendencias.
Se proporciona una comprensión detallada de las variables de forma individual, lo que sirve como punto de partida.
variables <- bd_estand[, c("preciom", "areaconst", "banios", "habitac",
"piso","parquea","estrato")]
describe(variables)
plot_histogram(variables)
De acuerdo con el análisis, se logra evidenciar que:
summarytools::freq(bd_estand$zona)
## Frequencies
## bd_estand$zona
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ------------------ ------ --------- -------------- --------- --------------
## Zona Centro 124 1.49 1.49 1.49 1.49
## Zona Norte 1920 23.08 24.57 23.08 24.57
## Zona Oeste 1198 14.40 38.97 14.40 38.97
## Zona Oriente 351 4.22 43.19 4.22 43.19
## Zona Sur 4726 56.81 100.00 56.81 100.00
## <NA> 0 0.00 100.00
## Total 8319 100.00 100.00 100.00 100.00
frecuencia_zona <- table(bd_estand$zona)
porcentajes <- prop.table(frecuencia_zona) * 100
pie(porcentajes, main = "Distribución de Zonas",
labels = paste(names(porcentajes), ": ",
format(porcentajes, digits = 2), "%"))
Aproximadamente el 57% de las viviendas vendidas se encuentran ubicadas
al sur de la ciudad de Cali.
summarytools::freq(bd_estand$tipo)
## Frequencies
## bd_estand$tipo
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------- ------ --------- -------------- --------- --------------
## Apartamento 5099 61.29 61.29 61.29 61.29
## Casa 3220 38.71 100.00 38.71 100.00
## <NA> 0 0.00 100.00
## Total 8319 100.00 100.00 100.00 100.00
frecuencia_tipo <- table(bd_estand$tipo)
porcentajes2 <- prop.table(frecuencia_tipo) * 100
pie(porcentajes2, main = "Distribución por tipo de vivienda",
labels = paste(names(porcentajes2), ": ",
format(porcentajes2, digits = 2), "%"),
col = c("#0d3b66", "#f4d35e"))
El 61% de las viviendas vendidas son apartamentos.
Se centra en el estudio de la relación entre dos o más variables al mismo tiempo. Durante este análisis, se exploran las interacciones y asociaciones entre las variables, lo que proporciona una comprensión más completa de los datos.
frecuencia_tipo_zona <- table(bd_estand$tipo, bd_estand$zona)
barplot(frecuencia_tipo_zona, beside = TRUE,
col = c("#0d3b66", "#f4d35e"), # Colores de las barras
main = "Total casas/apartamentos vendidos por zona",
xlab = "Zona", ylab = "Frecuencia",
ylim = c(0, 3500),
legend = rownames(frecuencia_tipo_zona))
El 57% de las viviendas vendidas han sido al sur de la ciudad, donde el
59% son apartamentos y el 41% son casas. La zona norte es la segunda con
mayor venta, llegando a un 23%.
precio_promedio <- tapply(bd_estand$preciom,
list(bd_estand$tipo, bd_estand$zona),
mean, na.rm = TRUE)
barplot(precio_promedio, beside = TRUE,
col = c("#0d3b66", "#f4d35e"), # Colores de las barras
main = "Precio promedio del tipo de vivienda según la zona",
xlab = "Zona", ylab = "Precio promedio",
ylim = c(0, 900),
legend = rownames(precio_promedio))
En cuanto al precio por zona, se evidencia que la zona Oeste es la más
costosa para la compra de vivienda, con un promedio de 669 millones en
aparatamentos y 736 millones para casas. En general, el valor de las
casas en todas las zonas residenciales es más elevado frente a los
apartamentos, principalmente en la zona sur donde esta por encima casi
el doble.
ggplot(bd_estand, aes(x = estrato, fill = tipo)) +
geom_bar(position = "stack") +
geom_text(aes(label = ..count..), stat = "count",
position = position_stack(vjust = 0.5)) +
labs(title = "Viviendas por estrato segun su tipo",
x = "Estrato",
y = "Cantidad") +
scale_fill_manual(values = c("#0d3b66","#f4d35e")) +
theme_minimal()
En los estratos más altos se evidencia una preferencia más marcada por
la compra de apartamentos.
El análisis de datos de vivienda proporciona información valiosa sobre las características y tendencias del mercado inmobiliario, lo que puede ser fundamental para tomar decisiones informadas en diversos contextos, como la compra, venta o inversión en propiedades. En este estudio, exploramos variables relacionadas con las viviendas, incluyendo el tipo de propiedad, el precio, la ubicación y las características físicas.
Al analizar la distribución de viviendas por zona, observamos que la Zona Sur tiene la mayor cantidad de unidades vendidas, con un total de 4,726, seguida de la Zona Norte con 1,920 unidades. Esto sugiere una mayor actividad en el mercado inmobiliario en estas áreas en particular, lo que podría estar relacionado con factores como la demanda de viviendas, la disponibilidad de infraestructura y servicios, y las oportunidades de desarrollo.
Los datos muestran una clara variación en los precios de las viviendas según la zona de la ciudad, con la zona oeste presentando los precios más altos y la zona oriente ofreciendo viviendas más económicas. Esto sugiere que la ubicación geográfica juega un papel crucial en la determinación de los precios de la vivienda.
Se evidencia una distribución significativa entre los diferentes tipos de viviendas, con una clara prevalencia de apartamentos sobre casas. Esto sugiere una preferencia generalizada por los apartamentos entre los propietarios o compradores de vivienda en nuestra área de estudio.por ejemplo en las zonas oeste y norte los apartamentos son más populares que las casas, representando el 86% y el 62% de las viviendas respectivamente.
En conclusión, los resultados destacan la importancia de considerar tanto el precio como la oferta de viviendas al tomar decisiones en el mercado inmobiliario. Además, resaltan la necesidad de un enfoque más detallado al evaluar las características específicas de la propiedad y su impacto en el precio y la disponibilidad.