1. Introducción

Este informe presenta un análisis exploratorio de datos realizado en el sector inmobiliario de Cali, abordando preguntas como: ¿cuál es la zona con mayor valoración?, ¿cuál es la relación entre el precio y el área construida?, ¿cómo se distribuyen las viviendas en las distintas zonas de la ciudad?, entre otros cuestionamientos. Para ilustrar los resultados, se emplean gráficos de dispersión, barras y tortas. Además, se emplea el lenguaje R para la manipulación de los datos y cálculos estadísticos requeridos

2. Objetivos

  • Realizar un análisis exploratorio de datos con el objetivo de descubrir tendencias y patrones latentes en la base de datos de propiedades residenciales en Cali, lo que permitirá tomar decisiones empresariales más informadas y estratégicas.

  • Identificar los tipos de viviendas que presentan un mayor valor en la ciudad, con el propósito de comprender las categorías de propiedades más valoradas en el mercado.

  • Analizar la relación existente entre las variables de precio y área construida en los distintos tipos de vivienda.

  • Localizar las áreas geográficas de mayor coste en la ciudad para obtener una visión clara de las zonas donde se encuentran las propiedades más caras.

  • Analizar la distribución espacial de las casas y los apartamentos en las distintas zonas de la ciudad, con el fin de entender cómo se distribuye la oferta inmobiliaria en cada área.

  • Reconocer las características comunes compartidas por las propiedades en función de su ubicación geográfica, lo que permitirá entender qué atributos tienden a agruparse en determinadas zonas.

3. Métodos

Para llevar a cabo el estudio, se implementaron los siguientes procedimientos:

  • Se efectuó la importación de las bibliotecas esenciales para la ejecución del código.

  • Se carga el Dataframe que contiene la información

  • Se llevó a cabo un proceso de depuración de los datos, que implicó la eliminación de valores ausentes, la estandarización de los valores en la columna ‘tipo’ y la eliminación de registros repetidos.

  • Se procedió a escribir el código destinado a abordar los objetivos establecidos.

4. Resultados

4.1. Importanción de librerías

Se procede a la importación de las librerías necesarias para la ejecución fluida del código.

library(dplyr)
library(ggplot2)
library(scales)
library(patchwork)
library(gridExtra)
library(tidyr)
library(dplyr)

Se realiza la carga del Dataframe sobre el cual se estará trabajando.  

ruta <- "vivienda.csv"
#Se carga los datos y se eliminan los valores faltantes
tablasDatos <- read.table(file = ruta, header = TRUE, sep = ',')

4.2. Limpieza de datos

Previo a la ejecución del proceso de limpieza, se realiza un análisis del dataframe en uso con el propósito de identificar las variables presentes y su naturaleza (si son cualitativas o cuantitativas).

str(tablasDatos)
## 'data.frame':    8322 obs. of  13 variables:
##  $ id       : int  8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
##  $ zona     : chr  "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
##  $ piso     : int  4 1 NA 2 NA NA 2 NA NA 2 ...
##  $ estrato  : int  6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : int  1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num  318 300 800 150 112 390 125 280 74 120 ...
##  $ parquea  : int  2 1 4 1 2 8 2 4 1 2 ...
##  $ banios   : int  4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : int  2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr  "Apartamento" "Casa" "Casa" "Casa" ...
##  $ barrio   : chr  "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num  -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num  3454 3454 3455 3417 3408 ...

Se muestran los valores únicos de las variables categóricas ‘zona’ y ‘tipo’, con el propósito de evaluar la necesidad de consolidar valores únicos.

print(unique(tablasDatos$zona))
## [1] "Zona Oeste"   "Zona Sur"     "Zona Norte"   "Zona Oriente" "Zona Centro" 
## [6] NA
print(unique(tablasDatos$tipo))
## [1] "Apartamento" "Casa"        "APARTAMENTO" "casa"        "CASA"       
## [6] "apto"        NA

Para la limpieza de los datos se procede a eliminar los valores faltantes, la estandarización de los valores en la columna ‘tipo’ y se elimina los registros repetidos.  

#Eliminando valores faltantes 
tablasDatos <- na.omit(tablasDatos)

#Unificando los valores de la columna tipo
tablasDatos$tipo[tablasDatos$tipo == "APARTAMENTO"] <- "apartamento"
tablasDatos$tipo[tablasDatos$tipo == "Apartamento"] <- "apartamento"
tablasDatos$tipo[tablasDatos$tipo == "apto"] <- "apartamento"
tablasDatos$tipo[tablasDatos$tipo == "CASA"] <- "casa"
tablasDatos$tipo[tablasDatos$tipo == "Casa"] <- "casa"

#Eliminando registros repetidos
tablasDatos <- unique(tablasDatos)

4.3. Identificación del tipo de vivienda que presenta mayor valor en la ciudad

Se procede a crear el script necesario para identificar que tipo de vivienda presentar un mayor valor en la ciudad.

df_tipo <- tablasDatos %>% group_by(tablasDatos$tipo) %>% summarise(Precio_tipo_vivienda = median(preciom))

fig_barplot <- barplot(
  df_tipo$Precio_tipo_vivienda, 
  names.arg = df_tipo$`tablasDatos$tipo`,
  xlab = "Tipo de vivienda",
  ylab = "Precio",
  main = "Coparación del precio según el tipo de vivienda",
  ylim = c(0, 600)
)

text(
  x = fig_barplot,
  y = df_tipo$Precio_tipo_vivienda,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_tipo$Precio_tipo_vivienda
)

La gráfica exhibe la mediana de los precios de apartamentos y casas en la ciudad de Cali, dispuestos en orden ascendente de menor a mayor. La mediana de precios para las casas en Cali es de 470’000.000$, mientras que para los apartamentos es de 300’000.000$.

4.4. Relación entre el precio de las viviendas y el área construida según el tipo de vivienda

Se lleva a cabo un análisis de cómo se relaciona la variable precio con el área construida, según el tipo de vivienda.

Análisis de la relación entre el precio de la vivienda y el área construida en el contexto de las casas.

df_casas <- tablasDatos[tablasDatos$tipo == 'casa', ]
plot(
  df_casas$areaconst, 
  df_casas$preciom,
  xlab = "Área construida",
  ylab = "Precio de la vivienda",
  main = "Precio vs Área construida - casas"
)

#Coeficiente de relación lineal 
coef_corr <- cor(df_casas$areaconst, df_casas$preciom)
coef_corr
## [1] 0.6532514

Análisis de la relación entre el precio de la vivienda y el área construida en el contexto de los apartamentos.

df_apartamento <- tablasDatos[tablasDatos$tipo == 'apartamento', ]
plot(
  df_apartamento$areaconst, 
  df_apartamento$preciom,
  xlab = "Área construida",
  ylab = "Precio de la vivienda",
  main = "Precio vs Área construida - apartamentos"
) 

#Coeficiente de relación lineal 
coef_corr <- cor(df_apartamento$areaconst, df_apartamento$preciom)
coef_corr
## [1] 0.8184273

Las gráficas anteriores ilustran la forma en que se relacionan las variables de precio y área construida, tanto para casas como para apartamentos. En ambos casos, se presentan los coeficientes de correlación lineal para cuantificar la fuerza y la dirección de estas relaciones.

4.5. Identificación de las área geográficas de mayor coste en la ciudad

Mediante el siguiente código, se determinan las áreas geográficas que presentan un mayor costo en las viviendas, ya sean apartamentos o casas.

df_precio_zonas <- tablasDatos %>% group_by(tablasDatos$zona) %>% summarise(precioPorZona = median(preciom))

df_precio_zonas <- df_precio_zonas[order(df_precio_zonas$precioPorZona), ]

fig_barplot2 <- barplot(
  df_precio_zonas$precioPorZona,
  names.arg = df_precio_zonas$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Precios",
  main = "Precio de las viviendas por zonas",
  ylim = c(0, 700)
)

text(
  x = fig_barplot2,
  y = df_precio_zonas$precioPorZona,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_precio_zonas$precioPorZona
)

El gráfico presenta los precios de las viviendas en un diagrama de barras, dispuestos de forma ascendente desde los precios más bajos hasta los más altos.

4.6. Distribución espacial de las casas y los apartamentos en las distintas zonas de la ciudad

El propósito del siguiente script es determinar la cantidad de apartamentos y casas en cada zona de la ciudad. Esto se lleva a cabo con el objetivo de analizar la distribución de estas viviendas por zonas geográficas.

#función encargada de crear los piecharts
diagrama_pie <- function(cant_inmuebles, tipo_inmueble, titulo){
  grafico <- ggplot(
    df_zona_centro, 
    aes(x = "", y = cant_inmuebles, fill = tipo_inmueble)
  ) +
  geom_col() +
  geom_text(
    aes(label = cant_inmuebles),
    position = position_stack(vjust=0.5)
  ) +
  coord_polar(theta = 'y') + 
  theme_void() +
  labs(title = titulo) + 
  theme(legend.title = element_blank())
  
  return(grafico)
}
dfTipoViviendaZona <- tablasDatos %>% group_by(tablasDatos$zona, tablasDatos$tipo) %>% count(tablasDatos$tipo)

df_zona_centro   <- dfTipoViviendaZona[1:2, ]
df_zona_norte    <- dfTipoViviendaZona[3:4, ]
df_zona_oeste    <- dfTipoViviendaZona[5:6, ]
df_zona_oriente  <- dfTipoViviendaZona[7:8, ]
df_zona_sur      <- dfTipoViviendaZona[9:10, ]

#Pie zona centro
g1 <- diagrama_pie(
  df_zona_centro$n, 
  df_zona_centro$`tablasDatos$tipo`, 
  "Zona Centro"
)

g2 <- diagrama_pie(
  df_zona_norte$n, 
  df_zona_norte$`tablasDatos$tipo`, 
  "Zona Norte"
)

g3 <- diagrama_pie(
  df_zona_oeste$n, 
  df_zona_oeste$`tablasDatos$tipo`, 
  "Zona Oeste"
)

g4 <- diagrama_pie(
  df_zona_oriente$n, 
  df_zona_oriente$`tablasDatos$tipo`, 
  "Zona Oriente"
)

g5 <- diagrama_pie(
  df_zona_sur$n, 
  df_zona_sur$`tablasDatos$tipo`, 
  "Zona Sur"
)
  
g1 + g2 + g3 + g4 + g5

El gráfico previo muestra conjuntos de diagramas de pastel, cada uno correspondiente a una zona de la ciudad. En cada diagrama de pastel, se representa la cantidad de apartamentos en color rosa y de casas en color azul.

4.7. Características comunes compartidas por las propiedades en función de su ubicación geográfica

Se analiza como es la mediana del área construida, la cantidad de parqueaderos, la cantidad de los baños y habitaciones en casas y apartamentos, por cada zona de la ciudad.  

df_resum_zonas <- tablasDatos %>% group_by(tablasDatos$zona, tablasDatos$tipo) %>% summarise(area_contruida = median(areaconst), parqueadero = median(parquea), banios = median(banios), habitaciones = median(habitac))

4.7.1. Análisis de las características de las casas según las zonas geográficas

df_res_casas <- df_resum_zonas[df_resum_zonas$`tablasDatos$tipo` == "casa", ]

Mediana de la cantidad de parqueaderos de las casas por zonas.

#Graficando la mediana de parqueaderos en las casas, por zonas
fig_barplot3 <- barplot(
  df_res_casas$parqueadero,
  names.arg = df_res_casas$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de Parqueaderos",
  main = "Mediana de la cantidad de parqueaderos de las casas por zonas",
  ylim = c(0, 3)
)

text(
  x = fig_barplot3,
  y = df_res_casas$parqueadero,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_res_casas$parqueadero
)

Mediana de la cantidad de baños en las casas por zonas.

#Graficando la mediana de baños en las casas, por zonas
fig_barplot4 <- barplot(
  df_res_casas$banios,
  names.arg = df_res_casas$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de baños",
  main = "Mediana de la cantidad de baños en las casas por zonas",
  ylim = c(0, 5)
)

text(
  x = fig_barplot4,
  y = df_res_casas$banios,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_res_casas$banios
)

Mediana de la cantidad de habitaciones en las casas por zonas.

#Graficando la mediana de habitaciones en las casas, por zonas
fig_barplot4 <- barplot(
  df_res_casas$habitaciones,
  names.arg = df_res_casas$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de habitaciones",
  main = "Mediana de la cantidad de habitaciones en las casas por zonas",
  ylim = c(0, 7)
)

text(
  x = fig_barplot4,
  y = df_res_casas$habitaciones,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_res_casas$habitaciones
)

Mediana de la cantidad de área construida en las casas por zonas.

#Graficando la mediana de las áreas construidas en los apartamentos, por zonas
fig_barplot7 <- barplot(
  df_res_casas$area_contruida,
  names.arg = df_res_casas$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de área construida (m^2)",
  main = "Mediana de la cantidad de área construida en las casas por zonas",
  ylim = c(0, 350)
)

text(
  x = fig_barplot7,
  y = df_res_casas$area_contruida,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_res_casas$area_contruida
)

Las imágenes previas ilustran la mediana de la cantidad de parqueaderos, baños, habitaciones y área construida en las casas de cada zona de la ciudad.

4.7.2. Análisis de las características de los apartamentos según las zonas geográficas

df_resum_apart <- df_resum_zonas[df_resum_zonas$`tablasDatos$tipo` == "apartamento", ]

Mediana de la cantidad de parqueaderos en los apartamentos por zonas.

#Graficando la mediana de parqueaderos en los apartamentos, por zonas
fig_barplot5 <- barplot(
  df_resum_apart$parqueadero,
  names.arg = df_resum_apart$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de Parqueaderos",
  main = "Mediana de la cantidad de parqueaderos en los apartamentos por zonas",
  ylim = c(0, 3)
)

text(
  x = fig_barplot5,
  y = df_resum_apart$parqueadero,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_resum_apart$parqueadero
)

Mediana de la cantidad de baños en los apartamentos por zonas.

#Graficando la mediana de baños en los apartamentos, por zonas
fig_barplot6 <- barplot(
  df_resum_apart$banios,
  names.arg = df_resum_apart$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de baños",
  main = "Mediana de la cantidad de baños en los apartamentos por zonas",
  ylim = c(0, 5)
)

text(
  x = fig_barplot6,
  y = df_resum_apart$banios,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_resum_apart$banios
)

Mediana de la cantidad de habitaciones en las casas por zonas.

#Graficando la mediana de habitaciones en los apartamentos, por zonas
fig_barplot7 <- barplot(
  df_resum_apart$habitaciones,
  names.arg = df_resum_apart$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de habitaciones",
  main = "Mediana de habitaciones por apartamento, por zona",
  ylim = c(0, 7)
)

text(
  x = fig_barplot7,
  y = df_resum_apart$habitaciones,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_resum_apart$habitaciones
)

Mediana de la cantidad de habitaciones en las casas por zonas.

#Graficando la mediana de las áreas construidas en los apartamentos, por zonas
fig_barplot7 <- barplot(
  df_resum_apart$area_contruida,
  names.arg = df_resum_apart$`tablasDatos$zona`,
  xlab = "Zonas",
  ylab = "Mediana de área construida",
  main = "Mediana de área construida por apartamento, por zona",
  ylim = c(0, 170)
)

text(
  x = fig_barplot7,
  y = df_resum_apart$area_contruida,
  pos = 3,
  cex = 0.8,
  col = 'red',
  labels = df_resum_apart$area_contruida
)

Las imágenes previas ilustran la mediana de la cantidad de parqueaderos, baños, habitaciones y área construida en los apartamentos de cada zona de la ciudad.

5. Conclusiones

  • De acuerdo con el análisis realizado, las viviendas tipo casa presentan un valor superior en comparación con las viviendas tipo apartamento.

  • Se observa una relación lineal entre el precio y el área construida en las viviendas, con un coeficiente de correlación lineal de 0.65 para las casas y 0.82 para los apartamentos. Esto indica que el precio de los apartamentos tiene una fuerte dependencia del área construida. En el caso de las casas, aunque el precio también muestra una relación lineal con el área construida, es posible que esté influenciado de manera más significativa por otras variables.

  • La zona más costosa corresponde al Oeste, mientras que la menos costosa se encuentra en el Oriente. Por otro lado, las zonas Norte y Sur presentan valores prácticamente idénticos.

  • En la zona Sur, sobresale una notoria presencia tanto de casas como de apartamentos en comparación con las demás zonas, lo que podría sugerir un floreciente desarrollo inmobiliario en esta parte en la actualidad. Por otro lado, en las zonas Oeste y Norte se percibe una marcada disparidad, donde la cantidad de apartamentos supera ampliamente a la de casas. Este hecho apunta a la importancia de concentrar los esfuerzos en la promoción y venta de apartamentos en estas localidades. Por último, en las zonas Centro y Oriente se aprecia una menor densidad de viviendas, tanto casas como apartamentos, lo que podría indicar una relativa debilidad en las operaciones comerciales de bienes raíces en dichas zonas.

  • Al analizar la mediana de la cantidad de parqueaderos, baños y habitaciones en las casas de Cali, se destaca una sorprendente uniformidad en estos valores, independientemente de la ubicación geográfica de las propiedades. Al examinar las representaciones gráficas, se evidencia que la mediana para el número de parqueaderos por casa oscila entre 1 y 2, mientras que para los baños, el rango se sitúa entre 3 y 4. En cuanto al número de habitaciones, la mediana se encuentra en el intervalo de 4 a 5. La única característica que presenta una diferencia notable es el área construida; se observa que las casas en las zonas Oeste y Norte de la ciudad tienen una mayor superficie construida, mientras que en las zonas Centro y Oriente presentan un área menor.

  • De manera similar a las casas, se evidencia el mismo patrón en la mediana de la cantidad de parqueaderos, baños, habitaciones y área construida de los apartamentos. Sin embargo, en la zona Oeste de la ciudad, se observa un fenómeno de duplicación de estas cantidades. A modo de ejemplo, la mediana en cuanto a la cantidad de estacionamientos por apartamento en las zonas Centro, Norte, Oriente y Sur se sitúa en 1, mientras que en la zona Oeste se eleva a 2. Este patrón también se hace presente en las demás características estudiadas, a excepción del número de habitaciones por apartamento, la cual se mantiene en 3 en todas las zonas.