Introducción

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.

Objetivo

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.

Métodos

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.

1. Datos iniciales

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.

  • id: Identificador único de la vivienda
  • zona: Zona de la ciudad (sur, norte, oriente, occidente)
  • piso: Piso en el que está ubicada la vivienda
  • estrato: Estrato socioeconómico
  • preciom: Precio en millones de pesos
  • areaconst: Área construida en metros cuadrados
  • parqueaderos: Número de parqueaderos
  • banios: Número de baños
  • habitaciones: Número de habitaciones
  • tipo: Tipo de vivienda (casa o apartamento)
  • barrio: Barrio
  • longitud: Coordenada de longitud
  • latitud: Coordenada de latitud
# 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, …

1.1 Limpieza de datos

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

1.2. Analisis datos faltantes

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")
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")
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.

2. Análisis descriptivo

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.

2.1. Análisis descriptivo univariable

Se proporciona una comprensión detallada de las variables de forma individual, lo que sirve como punto de partida.

Medidas tendencia central

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:

  • Area construida: Viviendas con un area construida entre 100m² y 200m².
  • Estrato: Viendas ubicadas en estratos 4 y 5 de la ciudad de Cali.
  • Pisos: La mayoría de las viviendas estan ubicadas entre los pisos 2 y 3.
  • Habitaciones: Viviendas en su mayoria con minimo 3 habitaciones.
  • Parqueadero: Viviendas cuentan con al menos un parqueadero.
  • Baños: Cuentan con 2 a 3 baños.
  • Precio: El precio medio es de 330 millones, con un valor maximo de 2000 millones.

Zona de residencia

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.

Tipo de vivienda

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.

2.2. Análisis descriptivo multivariable

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 de vivienda por zona

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%.

Venta promedio tipo de vivienda por zona

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.

Cantidad de viviendas por estrato segun su tipo

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.

3. Discusión y conclusiones

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.