El presente informe es un análisis del mercado inmobiliario en
Cali, Colombia.
Este se realiza con el fin de estudiar el mercado y permitir desarrollar estrategias de marketing, establecer precios de venta y ofrecer servicios personalizados a los clientes de la Empresa B&C.
La investigación se ejecutó con un análisis descriptivo de la base de datos, esta base incluye características como preció, ubicación y parqueadero, entre otras. Dentro de la metodología utilizada se realizó la imputación de los datos para las variables piso y parqueadero, además, se realizó un análisis uni variado y bi variado con el fin de encontrar patrones, tendencias y características de las viviendas.
Realizar un análisis descriptivo del mercado inmobiliario en la
ciudad de Cali, identificando tendencias, características y patrones,
que permitan a los directivos de la Empresa B&C tomar decisiones
sobre su negocio.
Se utilizó la base de datos “vivienda_faltantes”, se realizó un
proceso de limpieza de los datos usando la imputación por media y moda,
los códigos utilizados en R, se pueden encontrar en los anexos el
informe. Los paquetes empleados fueron: mice, naniar, ggplot2,
tidyverse, tidyverse, dplyr, simputation, DescTools y tidyr.
Las variables identificadas en las bases de datos se clasificaron en cualitativas, cuantitativas y campos que no se analizan, ya que no son estadísticos.
Variables cualitativas: zona, piso, estrato, tipo, barrio
Variables cuantitativas: precio, areaconst, parquea, banios, habitac
Campos que no se analizan: id, longitud, latitud
El proceso de limpieza de los datos se lleva a cabo con el fin
de verificar, limpiar y combinar los datos para que sean útiles y menos
complejos de analizar. El objetivo es mejorar la calidad de los datos y
para esto se ejecutan una serie de fases que se presentan a
continuación.
En esta fase se examinará una muestra de la base de tamaño 1000
x 13.
## spc_tbl_ [1,000 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:1000] 122 190 880 1663 1401 ...
## $ zona : chr [1:1000] "Zona Norte" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : num [1:1000] 1 4 1 NA NA 1 7 NA 2 4 ...
## $ estrato : num [1:1000] 3 3 3 4 4 5 5 3 5 3 ...
## $ preciom : num [1:1000] 150 360 250 375 150 270 290 235 450 125 ...
## $ areaconst: num [1:1000] 93 420 210 74 57 75 93 122 252 72 ...
## $ parquea : num [1:1000] NA 1 NA 1 NA 1 1 1 2 NA ...
## $ banios : num [1:1000] 1 6 4 5 2 2 3 2 2 2 ...
## $ habitac : num [1:1000] 4 9 4 5 3 3 3 5 7 3 ...
## $ tipo : chr [1:1000] "Casa" "Casa" "Apartamento" "Casa" ...
## $ barrio : chr [1:1000] "la rivera" "las ceibas" "morichal de comfandi" "calicanto viii" ...
## $ longitud : num [1:1000] -76.5 -76.5 -76.5 -76517 -76.5 ...
## $ latitud : num [1:1000] 3.48 3.46 3.4 3373 3.38 ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_double(),
## .. zona = col_character(),
## .. piso = col_double(),
## .. estrato = col_double(),
## .. preciom = col_double(),
## .. areaconst = col_double(),
## .. parquea = col_double(),
## .. banios = col_double(),
## .. habitac = col_double(),
## .. tipo = col_character(),
## .. barrio = col_character(),
## .. longitud = col_double(),
## .. latitud = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Como se observa en la visualización de la muestra, las
variables que conforman la base de datos “piso” y “parqueadero”
contienen datos faltantes, adicionalmente se proyectan los primeros
valores.
Para conocer el número de datos faltantes por variable en el total de
la población, se presenta la siguiente tabla.
## id zona piso estrato preciom areaconst parquea banios
## 3 3 2641 3 2 3 1606 3
## habitac tipo barrio longitud latitud
## 3 3 3 3 3
Se comprueba que la variable “piso” es la que tiene un mayor
número de datos faltantes con 2641, la variable parqueadero sigue con
1606.
Dado que al eliminar los datos faltantes se perdería un
porcentaje significativo de la información, se determina que se
imputarán los datos de las variables cuantitativas por la media y de las
variables cualitativas por la moda.
Con la finalidad de no alterar la base de datos inicial y poder visualizar y comparar la información, se creó una copia de esta, en la cual se seguirá realizando la limpieza de los datos.
En la variable cuantitativa “parqueadero” se reemplazan los NA
por el valor de la media, que se presenta a continuación.
## [1] NA
Posteriormente se realiza la imputación.
Como se observa en el gráfico, ya no hay valores NA en la variable
parqueadero.
En la variable cualitativa “piso” se reemplazan los NA por el
valor de la moda, que se presenta a continuación.
## [1] 2
Para un mejor análisis se visualiza la moda de piso en el
siguiente gráfico.
Posteriormente se realiza la imputación.
Como se observa en el gráfico, ya no hay valores NA en la variable
piso. Aunque se observan 3 valores faltantes en algunas variables, no se
considera necesario realizar imputación.
En esta fase se estandarizan los nombres de las variables
cualitativas “tipo” y “barrio”, adicionalmente, se eliminan las
variables que no son requeridas para el análisis. Se crea una copia de
la base de datos adicional para no alterar las anteriores y facilitar su
comparación.
Como se observa en la tabla, en la variable tipo hay
diferencias en los nombres, ya que se encuentran en minúscula y
mayúscula, con respecto a “apartamento”, se requiere convertir “apto” en
la palabra “apartamento” con el fin de estandarizar.
##
## Apartamento APARTAMENTO apto casa Casa CASA
## 5032 61 13 14 3195 12
Se ha realizado la estandarización de “apartamento” y “casa”.
## [1] "apartamento" "casa" NA
Se puede comprobar la estandarización de la variable tipo en la siguienta tabla.
##
## apartamento casa
## 5106 3221
Como se observa en la tabla, en la variable barrio hay
diferencias en los nombres, ya que algunos se encuentran con los
pronombres “las, los, la, el” al inicio, con el fin de estandarizar,
estos serán eliminados.
## [1] "normandía" "normandía" "normandía" "granada" "normandía" "la flora"
A continuación se presenta la tabla después de eliminar los
pronombres de los barrios. Adicionalmente, se eliminaron las variables
que no son requeridas para el análisis de los datos, estas variables
son: id, longitud, y latitud.
Se presentarán y analizarán los resultados obtenidos en la base
de datos después de pasar por el proceso de limpieza.
Como se observa en el gráfico, los apartamentos corresponden al
61,3% y las casas al 38,7% de la variable tipo.
La zona sur tiene el mayor número de apartamentos con 2789, la
zona norte que cuenta con 1199 y la zona oeste con 1035. Con relación a
las casas, estas se encuentran en su mayoría en la zona sur con 1940, en
la zona norte hay 723 casas.
Como se observa en la tabla, la zona sur es la que cuenta con el
mayor número de apartamentos y casas con un total de 4726, por su parte,
la zona norte tiene 1922.
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 124 1922 1204 351 4726
La zona sur cuenta con el mayor número de viviendas en los estratos 5 y 6 con 1685 y 1616 respectivamente, la zona norte tiene el mayar número de viviendas en los estratos 5 y 3 con 770 y 572 respectivamente, por último, la zona oeste cuenta con 775 viviendas en el estrato 6.
La zona oeste cuenta con las casas que tienen un mayor precio, ubicándose entre 400 y 900 millones aproximadamente. La zona sur tiene viviendas con un rango de precio entre 300 y 500 millones, y tiene el mayor número de datos atípicos con precios por encima de los 1000 millones. La zona norte tiene datos atípicos por encima de los 900 millones de pesos.
Los apartamentos se encuentran en su mayoría ubicados en el
segundo piso con 1895, seguido del tercer piso con 573. Con respecto a
las casas, se asume que la variable piso está relacionada con el número
de pisos de la casa, teniendo en cuenta este supuesto, se observa que
2193 casas tienen dos pisos, seguido de tres pisos con 524 casas.
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## apartamento 431 1895 573 545 564 243 203 211 146 128 84 83
## casa 430 2193 524 62 4 2 4 0 0 2 0 0
Las casas y los apartamentos en su mayoría con un total de 2193 y 1895 viviendas tienen dos parqueaderos.
Aproximadamente 2500 apartamentos cuentan con dos baños, y 1250
con tres baños. En relación con las casas, aproximadamente 760 tienen 4
baños, seguida de 700 con 3 baños.
El número de habitaciones más buscado en los apartamentos es 3
y en las casas es 4 habitaciones.
Los apartamentos más vendidos tienen un precio entre 300 y 500
millones y las casas entre 400 y 600 millones. Los precios atípicos
llegan a los 2000 millones de pesos.
Como se puede observar en el gráfico de torta, el mayor número
de apartamentos se encuentran en los estratos 5 y 4 con el 35% y el 27%
respectivamente.
Las casas en su mayoría con el 30% se encuentran ubicadas en el
estrato 5.
Se evidencia que las viviendas de los estratos 6 y 5 tienen un mayor precio que las de los estratos 4 y 3.
Entre más baños tenga la vivienda el precio del inmueble tiende a aumentar, sin embargo, esto no ocurre en todas las ocasiones.
No se observa una relación directa entre el precio del inmueble y el número de habitaciones, ya que el precio no varía en gran cantidad.
No se observa una relación directa entre el precio y el piso de la vivienda.
Las casas tienen un área de construcción mayor que los apartamentos.
Al analizar los resultados obtenidos, se demuestra que en la ciudad de Cali, Colombia, el tipo de vivienda más vendido son los apartamentos con el 61% del total, estos se encuentran en su mayoría ubicados en la zona sur, en la cual predomina el estrato 4 y 5. Con respecto a las características de los apartamentos, 1895 de estos tienen 2 parqueaderos, y 573 tienen 3 parqueaderos, al interior en su mayoría cuentan con dos o tres baños y habitaciones, 1895 apartamentos se encuentran ubicados en el segundo piso. El precio del mayor número de apartamentos oscila entre los 200 y 500 millones de pesos. Los estratos que prefieren comprar apartamento son el 5 con el 35% y el 4 con el 27%.
Con respecto a las casas, que corresponden al 39% de las viviendas vendidas en Cali, en su mayoría se encuentran ubicadas en la zona sur, al igual que los apartamentos, 2193 de las casas tienen dos pisos, más de 2000 cuentan con dos parqueaderos y dos años, con respecto a las habitaciones, en su mayoría tienen 4 o 3. El precio de las casas predomina entre 300 y 600 millones de pesos. Los estratos que prefieren comprar casa son el 5 con el 30% y el 4 con el 22%.
Se establece que en la zona sur se encuentra mayor número de viviendas vendidas, el precio de mayor número de inmuebles en esta zona es entre 200 y 500 millones, algunos casos atípicos reportan viviendas vendidas con un precio de hasta 200 millones de pesos.
En relación con el precio y el estrato, a mayor estrato, mayor precio de la vivienda. En la mayoría de los casos, el número de baños incrementa el valor de la vivienda, por el contrario, no se evidencia una relación directa entre precio y número de habitaciones y el piso en el que se encuentra el apartamento o el número de pisos de la vivienda. Por último, se determinó que las casas tienen un área de construcción más grande que los apartamentos.
Se espera que con el presente informe, la empresa B&C pueda tomar decisiones con base en las tendencias, características y patrones definidos con respecto al mercado inmobiliario, además que le permita, desarrollar estrategias de marketing, establecer los precios de venta de las viviendas, definir el nicho de mercado y ofrecer una atención personalizada a sus clientes.
En el anexo se encuentran los códigos ejecutados en el programa R para la limpieza de los datos, estandarización y obtención de los resultados.
#visualización del número de datos faltantes por variable
faltantes <- colSums(is.na(vivienda_faltantes))
faltantes#creo una copia de la base de datos para no alterar la información inicial
vivienda_imputadas <- data.frame(vivienda_faltantes)#calculando la media a parqueadero
media_parquea <- mean(vivienda_imputadas$parquea)
print(media_parquea)#aplicando la media a parqueaero, imputación
media_parquea <- mean(vivienda_imputadas$parquea, na.rm = TRUE)
vivienda_imputadas$parquea[is.na(vivienda_imputadas$parquea)] <- media_parquea
grafico <- md.pattern(vivienda_imputadas, rotate.names = TRUE)#definir la fucnión moda
mode <- function(x) {
return(as.numeric(names(which.max(table(x)))))
}
#calcular la moda para la piso
moda_piso <- mode(vivienda_imputadas$piso)
print(moda_piso)barplot(table(vivienda_imputadas$piso), col = c(4, rep("gray", 4)))
legend("topright", "Moda", fill = 4)#aplicando la moda a piso, imputación
moda_piso <- mode(vivienda_imputadas$piso)
vivienda_imputadas$piso[is.na(vivienda_imputadas$piso)] <- moda_piso
grafico <- md.pattern(vivienda_imputadas, rotate.names = TRUE)#creo una copia de la base de datos para no alterar la información inicial
vivienda_estandarizadas <- data.frame(vivienda_imputadas)#tabla para visualizar los datos de una variable, con esta también puedo crear un gráfico
table(vivienda_imputadas$tipo)# Estandarizar los valores de la variable "tipo"
vivienda_estandarizadas <- vivienda_estandarizadas %>% mutate(tipo = recode(tipo, "Apartamento" = "apartamento", "APARTAMENTO" = "apartamento", "apto" = "apartamento", "Casa" = "casa", "casa" = "casa", "CASA" = "casa", "NA" = "NA"))
# Verificar los cambios de la variable tipo
unique(vivienda_estandarizadas$tipo)#tabla para visualizar los datos de una variable, con esta también puedo crear un gráfico
tail(vivienda_imputadas$barrio)#eliminar los pronombres de los barrios para estandarizar
vivienda_estandarizadas$barrio <- gsub("^(los|las|el|la)\\s+", "", vivienda_estandarizadas$barrio)
vivienda_estandarizadas#Eliminar variables
vivienda_estandarizadas$id <- NULL
vivienda_estandarizadas$longitud <- NULL
vivienda_estandarizadas$latitud <- NULL# Crear un data frame con la información proporcionada
data <- data.frame(
Tipo = c("Apartamento", "Casa"),
Cantidad = c(5106, 3221)
)
# Calcular los porcentajes
total <- sum(data$Cantidad)
data$Porcentaje <- (data$Cantidad / total) * 100
data$Etiqueta <- paste(data$Tipo, "\n", sprintf("%.1f%%", data$Porcentaje))
# Colores pasteles
colores <- c("#9EB9F3", "#FE88B1")
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data, aes(x = factor(1), y = Porcentaje, fill = Tipo)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = Etiqueta), position = position_stack(vjust = 0.5)) +
scale_fill_manual(values = colores) +
labs(title = "Distribución de Propiedades",
fill = "Tipo de Propiedad") +
theme_void() +
theme(legend.position = "bottom")
# Imprimir el gráfico
print(grafico)# Crea un marco de datos con la información
data <- data.frame(
Zona = rep(c("Zona Centro", "Zona Norte", "Zona Oeste", "Zona Oriente", "Zona Sur"), each = 2),
Tipo = rep(c("apartamento", "casa"), times = 5),
Cantidad = c(24, 1199, 1035, 62, 2786, 100, 723, 169, 289, 1940)
)# Crear un data frame con la información proporcionada
data <- data.frame(
Zona = c("Zona Centro", "Zona Norte", "Zona Oeste", "Zona Oriente", "Zona Sur"),
Apartamento = c(24, 1199, 1035, 62, 2786),
Casa = c(100, 723, 169, 289, 1940)
)
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data, aes(x = Zona)) +
geom_bar(aes(y = Apartamento, fill = "Apartamento"), stat = "identity", width = 0.5) +
geom_bar(aes(y = Casa, fill = "Casa"), stat = "identity", width = 0.5) +
scale_fill_manual(values = c("Apartamento" = "#CD0BBC", "Casa" = "#2297E6")) +
labs(title = "Distribución de Propiedades por Zona",
y = "Cantidad",
fill = "Tipo de Propiedad") +
theme_minimal() +
theme(legend.position = "top")
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Zona = rep(c("Zona Centro", "Zona Norte", "Zona Oeste", "Zona Oriente", "Zona Sur"), each = 4),
Estrato = rep(c(3, 4, 5, 6), times = 5),
Valor = c(105, 14, 4, 1,
572, 408, 770, 172,
54, 85, 290, 775,
340, 8, 2, 1,
382, 1616, 1685, 1043)
)
# Colores pasteles
colores <- c("#C9B4E2", "#F9CB9C", "#A2C7E5", "#F7A992", "#9CD1BB")
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data, aes(x = Estrato, y = Valor, color = Zona)) +
geom_point(size = 4, alpha = 0.7) +
scale_color_manual(values = colores) +
labs(title = "Gráfico de Dispersión por Zona y Estrato",
x = "Estrato",
y = "Valor",
color = "Zona") +
theme_minimal() +
theme(legend.position = "top")
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Mes = factor(1:12),
Apartamento = c(431, 1895, 573, 545, 564, 243, 203, 211, 146, 128, 84, 83),
Casa = c(430, 2193, 524, 62, 4, 2, 4, 0, 0, 2, 0, 0)
)
# Transformar los datos utilizando pivot_longer
data_long <- tidyr::pivot_longer(data, cols = c(Apartamento, Casa), names_to = "Tipo", values_to = "Cantidad")
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data_long, aes(x = Mes, y = Cantidad, fill = Tipo)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("Apartamento" = "#C9B4E2", "Casa" = "#F9CB9C")) +
labs(title = "Parqueadero",
x = "Número de parqueaderos",
y = "Cantidad de viviendas",
fill = "Tipo de vivienda") +
theme_minimal() +
theme(legend.position = "top")
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Habitaciones = factor(0:10),
Apartamento = c(14, 400, 2502, 1201, 639, 301, 40, 8, 1, 0, 0),
Casa = c(31, 97, 444, 793, 821, 590, 275, 99, 47, 15, 9)
)
# Transformar los datos utilizando pivot_longer
data_long <- tidyr::pivot_longer(data, cols = c(Apartamento, Casa), names_to = "Tipo", values_to = "Cantidad")
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data_long, aes(x = Habitaciones, y = Cantidad, fill = Tipo)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("Apartamento" = "#FFA07A", "Casa" = "#87CEEB")) +
labs(title = "Distribución de Propiedades por Número de Baños",
x = "Número de Baños",
y = "Cantidad de viviendas",
fill = "Tipo de Propiedad") +
theme_minimal() +
theme(legend.position = "top")
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Habitaciones = factor(0:10),
Apartamento = c(21, 49, 859, 3388, 716, 63, 8, 1, 0, 1, 0),
Casa = c(45, 10, 68, 713, 1015, 617, 310, 172, 138, 82, 51)
)
# Transformar los datos utilizando pivot_longer
data_long <- tidyr::pivot_longer(data, cols = c(Apartamento, Casa), names_to = "Tipo", values_to = "Cantidad")
# Crear el gráfico utilizando ggplot2
grafico <- ggplot(data_long, aes(x = Habitaciones, y = Cantidad, fill = Tipo)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("Apartamento" = "#FF9999", "Casa" = "#66CCCC")) +
labs(title = "Distribución de Propiedades por Número de Habitaciones",
x = "Número de Habitaciones",
y = "Cantidad",
fill = "Tipo de Propiedad") +
theme_minimal() +
theme(legend.position = "top")
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Estrato = factor(c(3, 4, 5, 6)),
Apartamento = c(639, 1404, 1767, 1296)
)
# Colores azules claros
colores <- c("#A2C7E5", "#B8D3E6", "#CDDFE8", "#E0EBEB")
# Calcular los porcentajes
total <- sum(data$Apartamento)
data$Porcentaje <- (data$Apartamento / total) * 100
# Crear el gráfico de torta utilizando ggplot2
grafico <- ggplot(data, aes(x = "", y = Porcentaje, fill = Estrato)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = colores) +
labs(title = "Distribución de Apartamentos por Estrato",
x = NULL,
y = NULL,
fill = "Estrato",
caption = paste("Total:", total)) +
theme_void() +
geom_text(aes(label = paste(round(Porcentaje), "%")), position = position_stack(vjust = 0.5))
# Imprimir el gráfico
print(grafico)# Crear un data frame con la información proporcionada
data <- data.frame(
Estrato = factor(c(3, 4, 5, 6)),
Casa = c(814, 727, 984, 696)
)
# Colores rosados pasteles
colores <- c("#F8B7C7", "#FAB8CB", "#FCC9D0", "#FED9D4")
# Calcular los porcentajes
total <- sum(data$Casa)
data$Porcentaje <- (data$Casa / total) * 100
# Crear el gráfico de torta utilizando ggplot2
grafico <- ggplot(data, aes(x = "", y = Porcentaje, fill = Estrato)) +
geom_bar(stat = "identity", width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = colores) +
labs(title = "Distribución de Casas por Estrato",
x = NULL,
y = NULL,
fill = "Estrato",
caption = paste("Total:", total)) +
theme_void() +
geom_text(aes(label = paste(round(Porcentaje, 1), "%")), position = position_stack(vjust = 0.5))
# Imprimir el gráfico
print(grafico)