En el competitivo mundo de la industria inmobiliaria en Cali, donde la dinámica del mercado fluctúa constantemente, la capacidad de tomar decisiones estratégicas basadas en datos sólidos se convierte en un factor determinante para el éxito empresarial. En 2023, este sector representó una impresionante cifra de $6100 mil millones, reflejando su importancia económica y su papel crucial en el desarrollo de la región. Se espera que esta tendencia continúe en los próximos años, lo que no solo promoverá un crecimiento sostenido en la industria inmobiliaria, sino que también impulsará un desarrollo dinámico en la economía regional en su conjunto. El presente informe se centra en la utilización de la estadística como una herramienta fundamental para impulsar el crecimiento y la rentabilidad de B&C (Bines y Casas) inmobiliaria. A través de la aplicación de análisis estadístico, este informe tiene como finalidad definir el nicho de mercado específico al que la empresa debe dirigirse, identificar oportunidades y desafíos, con el propósito de desarrollar estrategias de marketing efectivas para llegar a su público objetivo. Asimismo, se explorará la importancia de establecer precios de venta competitivos, basados en la relación precio - ubicación, así como la necesidad de ofrecer servicios personalizados que satisfagan las necesidades individuales de los clientes.
Analizar y comparar el precio de las viviendas en diversas zonas de Cali, identificando las fluctuaciones y tendencias de mercado en cada área geográfica.
Determinar los tipos de viviendas más ofertadas en el mercado inmobiliario de Cali, examinando factores como tamaño, diseño, y comodidades ofrecidas para comprender las preferencias del público.
Identificar y destacar las características más relevantes de la oferta de vivienda en Cali, incluyendo aspectos como la ubicación, nivel socio económico y características arquitectónicas, con el fin de proporcionar una visión integral del panorama inmobiliario en la ciudad.
## [1] "Total de datos suministrados: 8330"
## [1] "Total de datos Null: 4279"
## [1] "Porcentaje de datos Null: 51%"
Los valores nulos se asignaron a cero para preservar la integridad y la cantidad significativa de datos disponibles. Eliminar el 51% de la data, como habría sido el caso si simplemente se hubieran excluido los registros con valores nulos, habría tenido un impacto devastador en el análisis subsiguiente.
## [1] "Total de datos limpios: 8260"
El análisis geoespacial revela que la mayoría de las agrupaciones se concentran en la zona suroeste de la ciudad de Cali.
|
|
La tabla de frecuencia y el diagrama de torta revelan una clara división de las zonas en Cali. La distribución porcentual muestra que la zona centro representa el 1.5%, la zona norte el 23.09%, la zona oeste el 14.47%, la zona oriente el 4.24%, y finalmente, la zona con mayor representación es la sur con un 56.71%.
|
|
|
|
En la zona centro de la ciudad de Cali, se observa el predominio del estrato socio económico tres, tanto para apartamentos como para casas, representando un 58% y un 91% respectivamente. Además, se destaca que el costo por metro cuadrado en promedio es de 1.949.520 pesos colombianos para los apartamentos y de 1.697.014 pesos colombianos para las casas.
|
|
|
|
En la zona norte de la ciudad de Cali, se observa el predominio del estrato socio económico cinco, tanto para apartamentos como para casas, representando un 41.8% y un 37.4% respectivamente. Además, se destaca que el costo por metro cuadrado en promedio es de 2.810.967 pesos colombianos para los apartamentos y de 1.847.137 pesos colombianos para las casas.
|
|
|
|
En la zona oeste de la ciudad de Cali, se observa el predominio del estrato socio económico seis, tanto para apartamentos como para casas, representando un 69.20% y un 34.91% respectivamente. Además, se destaca que el costo por metro cuadrado en promedio es de 3.852.246 pesos colombianos para los apartamentos y de 2.386.436 pesos colombianos para las casas.
|
|
|
|
En la zona oriente de la ciudad de Cali, se observa el predominio del estrato socio económico tres, tanto para apartamentos como para casas, representando un 93.44% y un 97.56% respectivamente. Además, se destaca que el costo por metro cuadrado en promedio es de 1.674.800 pesos colombianos para los apartamentos y de 1.388.767 pesos colombianos para las casas.
|
|
|
|
En la zona sur de la ciudad de Cali, se observa el predominio del estrato socio económico cuatro y cinco, tanto para apartamentos como para casas, representando para el estraro cuatro un 38.9% y un 27.1% respectivamente y para el estraro cinco un 37.1% y un 33.5% respectivamente. Además, se destaca que el costo por metro cuadrado en promedio es de 2.989.337pesos colombianos para los apartamentos y de 2.337.840 pesos colombianos para las casas.
| Zona | Tipo | PromedioBaños | PromedioParqueadero | PromedioHabitacion | PromedioPecioArea |
|---|---|---|---|---|---|
| zona centro | apartamento | 2 | 0 | 3 | 1.949.520 |
| zona centro | casa | 3 | 1 | 5 | 1.697.014 |
| zona norte | apartamento | 2 | 1 | 3 | 2.810.967 |
| zona norte | casa | 4 | 1 | 5 | 1.847.137 |
| zona oeste | apartamento | 3 | 2 | 3 | 3.852.246 |
| zona oeste | casa | 4 | 2 | 5 | 2.386.436 |
| zona oriente | apartamento | 2 | 0 | 3 | 1.674.800 |
| zona oriente | casa | 3 | 1 | 5 | 1.388.767 |
| zona sur | apartamento | 2 | 1 | 3 | 2.989.337 |
| zona sur | casa | 4 | 2 | 5 | 2.337.840 |
En el análisis de datos por zona y tipo de vivienda en Cali, se han obtenido los siguientes promedios:
Apartamento: Promedio de 2 baños, sin parqueadero, 3 habitaciones,
con un precio promedio por área de 1.949.520 pesos.
Casa: Promedio
de 3 baños, 1 parqueadero, 5 habitaciones, con un precio promedio por
área de 1.697.014 pesos.
Apartamento: Promedio de 2 baños, 1 parqueadero, 3 habitaciones, con
un precio promedio por área de 2.810.967 pesos.
Casa: Promedio de 4
baños, 1 parqueadero, 5 habitaciones, con un precio promedio por área de
1.847.137 pesos.
Apartamento: Promedio de 3 baños, 2 parqueaderos, 3 habitaciones, con
un precio promedio por área de 3.852.246 pesos.
Casa: Promedio de 4
baños, 2 parqueaderos, 5 habitaciones, con un precio promedio por área
de 2.386.436 pesos.
Apartamento: Promedio de 2 baños, sin parqueadero, 3 habitaciones,
con un precio promedio por área de 1.674.800 pesos.
Casa: Promedio
de 3 baños, 1 parqueadero, 5 habitaciones, con un precio promedio por
área de 1.388.767 pesos.
Apartamento: Promedio de 2 baños, 1 parqueadero, 3 habitaciones, con
un precio promedio por área de 2.989.337 pesos.
Casa: Promedio de 4
baños, 2 parqueaderos, 5 habitaciones, con un precio promedio por área
de 2.337.840 pesos.
El análisis exhaustivo del mercado inmobiliario en Cali revela una
serie de tendencias significativas que proporcionan una visión clara del
panorama actual. Destaca la marcada división geográfica, con la zona sur
emergiendo como el epicentro de la actividad inmobiliaria, lo que
sugiere un interés sustancial por parte de compradores e inversores en
esta área en particular.
Al profundizar en las preferencias de los
compradores, se observa una variedad de características en las viviendas
ofertadas, desde el número de baños y habitaciones hasta la
disponibilidad de parqueaderos. Este análisis subraya la importancia de
comprender las necesidades y preferencias del público objetivo al
desarrollar nuevos proyectos o establecer precios competitivos.
Además, la distribución del estrato socioeconómico en cada zona ofrece
información valiosa sobre las dinámicas demográficas y económicas
locales. Por ejemplo, la predominancia de estratos cuatro y cinco en la
zona sur puede indicar un mayor poder adquisitivo en comparación con
otras áreas de la ciudad.
En resumen, estos hallazgos son
esenciales tanto para los actores del mercado inmobiliario como para los
compradores potenciales. Para los agentes inmobiliarios, proporcionan
una guía clave para la toma de decisiones estratégicas, mientras que los
inversionistas pueden utilizar esta información para tomar decisiones
informadas y encontrar la vivienda que mejor se adapte a sus necesidades
y presupuesto en la ciudad de Cali.
comparto el codigo desarrollado:
#Importar Librerias
#devtools::install_github("dgonxalex80/paqueteMETODOS") #instalar el paquete de metodos
#install.packages("devtools")
#install.packages("stringdist")
#devtools::install_github("ropensci/skimr")
#install.packages("leaflet") #Mapas
#Install.packages("kableExtra")
#install.packages("reshape")
#install.packages("ggplot2")
#install.packages("tidyverse")
library(paqueteMETODOS) # usar las librerias del paquete de metodos
library(dplyr)
library(reshape)
library(stringdist)
library(ggplot2)
library(scales)
#Cargar Datos
#data(vivienda_faltantes) # trae la base de datos
#saveRDS(vivienda_faltantes, file = "vivienda_faltantes.RDS") # Guardamos los datos para no tener que descargarlos nuevamente para eventos futuros
vivienda_faltantes<- readRDS("vivienda_faltantes.RDS") # abre la base de datos guardada en la linea anterior
#rm(Ana) # elimina los datos de memoria
#renombrar las columnas
names(vivienda_faltantes)
vivienda_faltantes = rename(vivienda_faltantes, c( id ="Id"))
vivienda_faltantes = rename(vivienda_faltantes, c( zona ="Zona"))
vivienda_faltantes = rename(vivienda_faltantes, c( piso ="Piso"))
vivienda_faltantes = rename(vivienda_faltantes, c( estrato ="Estrato"))
vivienda_faltantes = rename(vivienda_faltantes, c( preciom ="Precio"))
vivienda_faltantes = rename(vivienda_faltantes, c( areaconst ="AreaConstruida"))
vivienda_faltantes = rename(vivienda_faltantes, c( parquea ="Parqueadero"))
vivienda_faltantes = rename(vivienda_faltantes, c( banios ="Ba?o"))
vivienda_faltantes = rename(vivienda_faltantes, c( habitac ="Habitacion"))
vivienda_faltantes = rename(vivienda_faltantes, c( tipo ="Tipo"))
vivienda_faltantes = rename(vivienda_faltantes, c( barrio ="Barrio"))
vivienda_faltantes = rename(vivienda_faltantes, c( longitud ="Longitud"))
vivienda_faltantes = rename(vivienda_faltantes, c( latitud ="Latitud"))
#Limpieza de datos
#round(sum(is.na(vivienda_faltantes)) *100/(count(vivienda_faltantes)))
#colSums(sapply(vivienda_faltantes, is.na)) #Validar numero de columnas nulas
vivienda_faltantes <- vivienda_faltantes[!is.na(vivienda_faltantes$Id),] # Sobre escribir la base de datos para eliminar los nullos
#unificacion informacion cuantitativa
vivienda_faltantes$Piso=as.integer(vivienda_faltantes$Piso) # Convertir a valor entero
vivienda_faltantes$Piso[is.na(vivienda_faltantes$Piso)] <- 0 # convertir piso en 0
table(vivienda_faltantes$Piso)
sin_decimales <- vivienda_faltantes$Longitud[!grepl("\\.", as.character(vivienda_faltantes$Longitud))]
sin_decimales_divididos <- sin_decimales / 1000
vivienda_faltantes$Longitud[!grepl("\\.", as.character(vivienda_faltantes$Longitud))] <- sin_decimales_divididos
sin_decimales <- vivienda_faltantes$Latitud[!grepl("\\.", as.character(vivienda_faltantes$Latitud))]
sin_decimales_divididos <- sin_decimales / 1000
vivienda_faltantes$Latitud[!grepl("\\.", as.character(vivienda_faltantes$Latitud))] <- sin_decimales_divididos
vivienda_faltantes$Parqueadero=as.integer(vivienda_faltantes$Parqueadero) # Convertir a valor entero
vivienda_faltantes$Parqueadero[is.na(vivienda_faltantes$Parqueadero)] <- 0 # convertir piso en 0
table(vivienda_faltantes$Parqueadero)
table(vivienda_faltantes$Estrato)
table(vivienda_faltantes$Precio)
table(vivienda_faltantes$AreaConstruida)
table(vivienda_faltantes$Ba?o)
table(vivienda_faltantes$Habitacion)
# unificacion de informacion cualitativa
vivienda_faltantes$Zona=tolower(vivienda_faltantes$Zona) # Minuscula
table(vivienda_faltantes$Zona)
vivienda_faltantes$Tipo =tolower(vivienda_faltantes$Tipo ) # Miniscula
vivienda_faltantes$Tipo [vivienda_faltantes$Tipo =="apto"]="apartamento"
table(vivienda_faltantes$Tipo )
limpiar_barrios <- function(nombres) {
nombres <- tolower(trimws(iconv(nombres, from = "UTF-8", to = "ASCII//TRANSLIT")))
nombres <- gsub("[_ ]", "", nombres)
return(nombres) }
vivienda_faltantes$Barrio <- limpiar_barrios(vivienda_faltantes$Barrio)
#table(vivienda_faltantes$Barrio)
#Eliminar duplicados
#sin_duplicados <- vivienda_faltantes %>% group_by(Zona,Piso,Estrato,Precio,AreaConstruida,Parqueadero,Ba?o,Habitacion,Tipo,Barrio,Longitud,Latitud) %>% filter (! duplicated(Zona,Piso,Estrato,Precio,AreaConstruida,Parqueadero,Ba?o,Habitacion,Tipo,Barrio,Longitud,Latitud))
#Eliminar duplicados teniendo en cuenta barrios
sin_duplicados <- vivienda_faltantes %>% group_by(Zona,Piso,Estrato,Precio,AreaConstruida,Parqueadero,Ba?o,Habitacion,Tipo,Longitud,Latitud) %>% filter (! duplicated(Zona,Piso,Estrato,Precio,AreaConstruida,Parqueadero,Ba?o,Habitacion,Tipo,Barrio,Longitud,Latitud))
#table(vivienda_faltantes$Tipo, vivienda_faltantes$Piso)
# Analisis de Valores Univariados
vivienda_normalizada <- sin_duplicados
################################################################################
##GRAFICOS
#Install.packages("kableExtra")
#install.packages("reshape")
library(kableExtra)
library(formattable)
library(tidyverse)
library(tidyr)
library(dplyr)
library(readr)
library(reshape)
#Creación tabla de Frecuencia de Zona
tablaZona <- as.data.frame(table(Zona = vivienda_normalizada$Zona))
tablaZona = rename(tablaZona, c( Freq ="Conteo"))#Renombrar la frecuencia por conteo para el usuario Zona
tablaZona <- transform(tablaZona,
# Porcentaje = (round( (Freq/ sum(Freq))*100, 2)),
Porcentaje= paste0((round( (Conteo/ sum(Conteo))*100, 2)),"%"))
#Creación de la Tabla
tablaZonaT <- tablaZona %>%
kbl(align="cr") %>% #Centrar la info
kable_paper(full_width = FALSE) %>%
row_spec(0, bold = TRUE) %>%
column_spec(1:1,bold = T, width = "2.2cm",color = "black", background= "#2B8CBE") %>%
column_spec(3:3, width = "2.1cm") %>%
row_spec(0, bold = T, color = "black", background = "#045A8D",align = "center")
tablaZonaT # Mostrar la tabla formateada
tablaZona <- transform(tablaZona,
Porcentaje = (round( (Conteo/ sum(Conteo))*100, 2)))
#Porcentaje= paste0((round( (Freq/ sum(Freq))*100, 2)),"%"))
library(ggrepel)
library(ggplot2)
library(tidyverse)
library(tidyr)
library(dplyr)
library(tidytext)
GraficoTorta <- tablaZona
GraficoTorta2 <- GraficoTorta %>%
mutate(csum = rev(cumsum(rev(Porcentaje))),
pos = Porcentaje/2 + lead(csum, 1),
pos = if_else(is.na(pos), Porcentaje/2, pos))
ggplot(GraficoTorta, aes(x = "" , y = Porcentaje, fill = Zona)) +
geom_col(width = 1, color = 1) +
coord_polar(theta = "y", start = 3) +
scale_fill_brewer(palette = "PuBu") +
geom_label_repel(data = GraficoTorta2,
aes(y = pos, label = paste0(Porcentaje, "%")),
size = 4.5, nudge_x = 1, show.legend = FALSE) +
guides(fill = guide_legend(title = "Zonas")) +
ggtitle("Porcentaje Por Zona")+
theme_void()
###########################################################################
vivienda_normalizadaPrecio <- vivienda_normalizada
vivienda_normalizadaPrecio <- transform(vivienda_normalizadaPrecio,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
###########################################################################
ZonaCentro=subset(vivienda_normalizadaPrecio, vivienda_normalizadaPrecio$Zona=="zona centro")
ZonaNorte=subset(vivienda_normalizadaPrecio, vivienda_normalizadaPrecio$Zona=="zona norte")
ZonaOeste=subset(vivienda_normalizadaPrecio, vivienda_normalizadaPrecio$Zona=="zona oeste")
ZonaOriente=subset(vivienda_normalizadaPrecio, vivienda_normalizadaPrecio$Zona=="zona oriente")
ZonaSur=subset(vivienda_normalizadaPrecio, vivienda_normalizadaPrecio$Zona=="zona sur")
ZonaCentroEstratoTipo=subset(ZonaCentro,select =c(Estrato,Tipo))
ZonaNorteEstratoTipo=subset(ZonaNorte,select =c(Estrato,Tipo))
ZonaOesteEstratoTipo=subset(ZonaOeste,select =c(Estrato,Tipo))
ZonaOrienteEstratoTipo=subset(ZonaOriente,select =c(Estrato,Tipo))
ZonaSurEstratoTipo=subset(ZonaSur,select =c(Estrato,Tipo))
ZonaCentroPrecioArea <- ZonaCentro
ZonaCentroPrecioArea <- transform(ZonaCentroPrecioArea,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
ZonaNortePrecioArea <- ZonaNorte
ZonaNortePrecioArea <- transform(ZonaNortePrecioArea,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
ZonaOestePrecioArea <- ZonaOeste
ZonaOestePrecioArea <- transform(ZonaOestePrecioArea,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
ZonaOrientePrecioArea <- ZonaOriente
ZonaOrientePrecioArea <- transform(ZonaOrientePrecioArea,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
ZonaSurPrecioArea <- ZonaSur
ZonaSurPrecioArea <- transform(ZonaSurPrecioArea,
PreciocxArea = round(((Precio*1000000)/AreaConstruida)))
library(ggplot2)
library(dplyr)
library(tidyverse)
library(dplyr)
library(tidytext)
library(dplyr)
ZonaCentroEstratoTipo %>% group_by(Tipo,Estrato) %>%
summarise(count = n()) %>%
mutate(cut.count = sum(count),
PorcentajeEstrato = count/sum(count)) %>%
ungroup() %>%
ggplot(aes(x = Tipo, y = PorcentajeEstrato, width = cut.count, fill = Estrato)) +
geom_bar(stat = "identity", position = "fill", colour = "black") +
geom_text(aes(label = paste0(scales::percent(PorcentajeEstrato))), position = position_stack(vjust = 0.5)) + # if labels are desired
facet_grid(~Tipo, scales = "free_x", space = "free_x")+
ggtitle("Zona Centro Estrato-Tipo")+
theme(strip.background = element_blank(),strip.text = element_blank())
ZonaNorteEstratoTipo %>% group_by(Tipo,Estrato) %>%
summarise(count = n()) %>%
mutate(cut.count = sum(count),
PorcentajeEstrato = count/sum(count)) %>%
ungroup() %>%
ggplot(aes(x = Tipo, y = PorcentajeEstrato, width = cut.count, fill = Estrato)) +
geom_bar(stat = "identity", position = "fill", colour = "black") +
geom_text(aes(label = paste0(scales::percent(PorcentajeEstrato))), position = position_stack(vjust = 0.5)) + # if labels are desired
facet_grid(~Tipo, scales = "free_x", space = "free_x")+
ggtitle("Zona Norte Estrato-Tipo")+
theme(strip.background = element_blank(),strip.text = element_blank())
ZonaOesteEstratoTipo %>% group_by(Tipo,Estrato) %>%
summarise(count = n()) %>%
mutate(cut.count = sum(count),
PorcentajeEstrato = count/sum(count)) %>%
ungroup() %>%
ggplot(aes(x = Tipo, y = PorcentajeEstrato, width = cut.count, fill = Estrato)) +
geom_bar(stat = "identity", position = "fill", colour = "black") +
geom_text(aes(label = paste0(scales::percent(PorcentajeEstrato))), position = position_stack(vjust = 0.5)) + # if labels are desired
facet_grid(~Tipo, scales = "free_x", space = "free_x")+
ggtitle("Zona Oeste Estrato-Tipo")+
theme(strip.background = element_blank(),strip.text = element_blank())
ZonaOrienteEstratoTipo %>% group_by(Tipo,Estrato) %>%
summarise(count = n()) %>%
mutate(cut.count = sum(count),
PorcentajeEstrato = count/sum(count)) %>%
ungroup() %>%
ggplot(aes(x = Tipo, y = PorcentajeEstrato, width = cut.count, fill = Estrato)) +
geom_bar(stat = "identity", position = "fill", colour = "black") +
geom_text(aes(label = paste0(scales::percent(PorcentajeEstrato))), position = position_stack(vjust = 0.5)) + # if labels are desired
facet_grid(~Tipo, scales = "free_x", space = "free_x")+
ggtitle("Zona Oriente Estrato-Tipo")+
theme(strip.background = element_blank(),strip.text = element_blank())
ZonaSurEstratoTipo %>% group_by(Tipo,Estrato) %>%
summarise(count = n()) %>%
mutate(cut.count = sum(count),
PorcentajeEstrato = count/sum(count)) %>%
ungroup() %>%
ggplot(aes(x = Tipo, y = PorcentajeEstrato, width = cut.count, fill = Estrato)) +
geom_bar(stat = "identity", position = "fill", colour = "black") +
geom_text(aes(label = paste0(scales::percent(PorcentajeEstrato))), position = position_stack(vjust = 0.5)) + # if labels are desired
facet_grid(~Tipo, scales = "free_x", space = "free_x")+
ggtitle("Zona Sur Estrato-Tipo")+
theme(strip.background = element_blank(),strip.text = element_blank())
#############################################################################
#CARACTERISTICAS
ZonaCentroCaracteristicas=subset(ZonaCentro,select =c(Estrato,Tipo))
ZonaCentroCaracteristicas<- ZonaCentro %>%
group_by(Tipo,Ba?o,Habitacion,Piso) %>%
summarise(meanprecio = mean(preciom))
table(ZonaCentro$Ba?o,ZonaCentro$Ba?o)
#############################################################################
#MAPA
library(leaflet)
mapa <- leaflet(vivienda_faltantes,options = leafletOptions(minZoom = 11, maxZoom = 40)) %>%
addTiles() %>%
addCircleMarkers(
~Longitud, ~Latitud,
color = "#034A94",
clusterOptions = markerClusterOptions(spiderfyDistanceMultiplier=1.5)
)
mapa
###############################################################################