Análisis descriptivo del Mercado Inmobiliario en Cali - Empresa B&C
1. Introducción
La empresa B&C (Bienes y Casas) es una agencia de bienes raíces con sede en la ciudad de Cali, Colombia. Fundada por Sandra Milena hace 10 años, la empresa cuenta actualmente con ocho agentes de bienes raíces. El mercado de bienes raíces en Cali ha experimentado un crecimiento significativo en los últimos años debido al aumento de la población, la inversión extranjera directa y el desarrollo de nuevos proyectos inmobiliarios.
El propósito del informe es a partir de una análisis decriptivo de una base suministrada por la empresa, examinar aspectos relevantes como la variación de precios de las viviendas en distintas zonas de la ciudad, los tipos de propiedades más ofertados y las características que se destacan en la oferta inmobiliaria actual. Se pretende que este análisis apoye la toma de decisiones del equipo estrátegico para emprender acciones efectivas, definir su nicho de mercado, desarrollar estrategias de marketing eficaces y fijar precios de venta competitivos, consolidando así su posición en el sector de bienes raíces en la ciudad de Cali.
2. Objetivos
Realizar un análisis descriptivo de los datos para la empresa B&C con el fin de identificar las tendencias y patrones en los mismos que permitar soportar la toma de decisiones sobre el negocio inmobiliario.
3. Métodos
Se detallan los métodos utilizados para el análisis estadístico de los datos de viviendas en la ciudad de Cali. Se describirán las técnicas y estrategias aplicadas en la extracción y preparación de datos, previo al análisis descriptivo de las variables clave.
Se utiliza el software R Studio con el fin de realizar una analisis descriptivo y modelar los datos que se obtuvieron del paquete METODOS y de la data denominada viviendas faltantes.
3.1 Importanción de Librerias
Para realizar la exploración de datos, se procede a importar las librerías que serán utilizadas en el análisis (Previa instalación de las mismas)
3.2 Importación de datos
Los datos utilizados en este informe fueron proporcionados por la
empresa B&C a partir de una extracción mediante web scraping donde
se extraen las caracteristicas de viviendas de Cali; su nombre base es
vivienda_faltantes
. Este dataset fue importado y se
estableció como la base principal para llevar a cabo el análisis
estadístico presentado en este informe.
La base de datos consta de 13 variables con 8330 resgitros. Se presenta una definición detallada de cada una de las variales dentro del conjunto de datos con su respectiva descripción (tomada del la información asociada a la base):
- id: Identificador único de la vivienda..
- zona: Zona de la ciudad.
- piso: Piso en la que está ubicada la
vivienda.
- estrato: Estrato.
- 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.
- barrio: Barrio.
- longitud: Coordenada de longitud.
- latitud: Coordenada de latitud.
3.3 Limpieza de los datos
La preparación de los datos es un paso fundamental para garantizar la integridad y confiabilidad de cualquier análisis que se realice en estapas posteriores. En esta sección, se abordan diferentes aspectos, desde la identificación de datos faltantes, la estandarización de varialbes, la eliminación de registros duplicados. Por último se toman unas decisoines deimputación de valores para garantizar un conjunto de datos más homogéneo en su contenido.
3.3.1 Estandarización de variables
Realizando un barrido sobre la base se identifican que la variable
tipo
cuenta con observaciones variadas, lo que dificulta
cualquier análisis posterior.
## [1] "Apartamento" "Casa" "APARTAMENTO" "casa" "CASA"
## [6] "apto" NA
Por lo anterior se procede a realizar la estandarización:
#Convertir en minusculas todos los registros de la columna "tipo"
vivienda_faltantes$tipo=tolower(vivienda_faltantes$tipo)
# Convertir el valor "apto" a "apartamento"
vivienda_faltantes= vivienda_faltantes %>%
mutate(tipo=ifelse(tipo=="apto","apartamento",tipo))
print(unique(vivienda_faltantes$tipo))
## [1] "apartamento" "casa" NA
3.3.2 Eliminación de datos nulos y duplicados
Se identificaron tres observaciones que una notable falta de información. Dos de ellas presentaban valores nulos en todas las variables, mientras que una contenía únicamente datos en la variable de precio. Por lo tanto, se tomó la decisión de eliminar estas observaciones del conjunto de datos.
Tras esta acción, se observó una notable limpieza en los datos, donde únicamente persistían nulos en las variables de parqueadero y piso.
Realizando el análisis sobre el dataframe base se identificó la presencia de 8 registros duplicados. Por lo tanto, se realiza a la eliminación de estos registros conservando los valores únicos.
######Eliminar duplicados#####
#Se eliminan duplicados completos
duplicados = duplicated(vivienda_faltantes)
sum(duplicados)
## [1] 9
vivienda_faltantes=distinct(vivienda_faltantes)
sum(duplicated(vivienda_faltantes)) #Para verificar que ya no se cuentan con duplicados.
## [1] 0
######Eliminar registros nulos o N/A#####
#Se eliminan los registros de una fila completa conforme a una columna en específico.
#Se toma de referencia la columna Id.
#Se cuenta la cantidad de nulos de la base
sapply(vivienda_faltantes,function(x) sum(is.na(x)))
## id zona piso estrato preciom areaconst parquea banios
## 2 2 2637 2 1 2 1604 2
## habitac tipo barrio longitud latitud
## 2 2 2 2 2
vivienda_faltantes = vivienda_faltantes[!is.na(vivienda_faltantes$id),]
# Validar los datos faltantes de la base por columna
colSums(is.na(vivienda_faltantes))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 2635 0 0 0 1602 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
3.3.2 Imputación de datos
Al analizar la información de datos faltantes, se observa que las variables piso y parquea presentan una alta proporción de datos ausentes. Eliminar estos registros de manera arbitraria podría resultar en una pérdida significativa de información. Por lo aterior se toma la decisión de realizar un método de imputación de datos para estas dos variables que se explica a continuación.
# determinación del porcentaje de valores perdidos respecto del total de datos
# para cada columna
porcentajeMiss <- function(x) {sum(is.na(x)) / length(x)*100}
# por columna
apply(vivienda_faltantes, 2, porcentajeMiss)
## id zona piso estrato preciom areaconst parquea banios
## 0.00000 0.00000 31.67448 0.00000 0.00000 0.00000 19.25712 0.00000
## habitac tipo barrio longitud latitud
## 0.00000 0.00000 0.00000 0.00000 0.00000
#Se representa de igual forma de manera gráfica
library(naniar)
gg_miss_var(vivienda_faltantes) # grafico de datos faltantes
3.3.2.1 Imputación de datos a la variable parquea
Considerando la información que se cuenta a través de las observaciones y variables en la base, se identifican algunas caracteristicas que permiten agrupar la información y lograr inferir algunos datos faltantes a partir de los datos existentes.Por lo tanto, para este ejercicio se realizan algunas aproximaciones agrupando información por las variables de tipo, la zona y el estrato. A partir de esto se calcula la mediana por cada unos de las subagrupaciones para hacer una estimación del número de parqueaderos con las características agrupadas. Este ejercicio se realiza ya que no se dispone de información detallada sobre cada propiedad y funciona como un método de imputación de datos basándose en patrones de un conjunto de datos que pueda describir con mayor certeza un dato faltante.
#Se crea tabla resumen con el cálculo de la mediana por grupo (zona, tipo, estrato), se excluyen valores vacios
mediatable=vivienda_faltantes %>%
group_by(zona, tipo, estrato) %>%
summarise_at(vars(parquea),list(mediana=~round(median(., na.rm = TRUE))))
# Se crea una columna nueva clave (En tabla resumen) que permita hacer un leftjoin para los vacios.
mediatable$clave=paste(mediatable$zona, mediatable$tipo, mediatable$estrato)
# Se crea una columna nueva clave (En dataframe de vivienda_faltantes) que permita hacer un leftjoin para los vacios.
vivienda_faltantes$clave=paste(vivienda_faltantes$zona, vivienda_faltantes$tipo, vivienda_faltantes$estrato)
# Se realiza cruce con la función left_join()
vivienda_faltantes=vivienda_faltantes %>%
left_join(mediatable, by="clave") %>%
mutate(
parquea = ifelse(is.na(parquea), mediana, parquea),
mediana=NULL
)
vivienda_faltantes=vivienda_faltantes %>%
select(-zona.y, -tipo.y, -estrato.y)
# Definición como dataframe, ya que lo detecta como tibble
vivienda_faltantes <- as.data.frame(vivienda_faltantes)
# Opción para restaurar las columnas a su nombre original, retirando los duplicados con .x o .y
vivienda_faltantes=vivienda_faltantes%>%
rename_with(~ gsub("\\.x|\\.y", "", .x), contains(".x") | contains(".y"))
# Validar los datos faltantes de la base por columna
colSums(is.na(vivienda_faltantes))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 2635 0 0 0 3 0
## habitac tipo barrio longitud latitud clave
## 0 0 0 0 0 0
De la base resultante se identifican 3 observaciones donde no se logra obtener una estimación del valor, por lo que se decide retirar.
# Se identifican 3 observaciones faltantes que no cumplen con la condición por las 3 variables cruzadas anteriormente, se deciden retirar.
vivienda_faltantes = vivienda_faltantes[!is.na(vivienda_faltantes$parquea),]
colSums(is.na(vivienda_faltantes))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 2633 0 0 0 0 0
## habitac tipo barrio longitud latitud clave
## 0 0 0 0 0 0
3.3.2.2 Imputación de datos a la variable piso
Siguiendo el mismo método aplicado a la variable “parquea” se logra extender el análisis al número de pisos. Por lo tanto, de igual manera se calcula la mediana por subagrupaciones de variables las variables tipo, zona y estrato para imputar los datos faltantes en la variable piso.
#####Imputación variable piso######
#Se crea tabla resumen con el cálculo de la mendiana por grupo (zona, tipo, estrato), se excluyen valores vacios
mediatablep=vivienda_faltantes %>%
group_by(zona, tipo, estrato) %>%
summarise_at(vars(piso),list(mediana=~round(median(., na.rm = TRUE))))
# Se crea una columna nueva clave (En tabla resumen) que permita hacer un leftjoin para los vacios.
mediatablep$clave=paste(mediatablep$zona, mediatablep$tipo, mediatablep$estrato)
# Se realiza cruce con la función left_join()
vivienda_faltantes=vivienda_faltantes %>%
left_join(mediatablep, by="clave") %>%
mutate(
piso = ifelse(is.na(piso), mediana, piso),
mediana=NULL
)
vivienda_faltantes=vivienda_faltantes %>%
select(-zona.y, -tipo.y, -estrato.y)
# Definición como dataframe, ya que lo detecta como tibble
vivienda_faltantes <- as.data.frame(vivienda_faltantes)
# Opción para restaurar las columnas a su nombre original, retirando los duplicados con .x o .y
vivienda_faltantes=vivienda_faltantes%>%
rename_with(~ gsub("\\.x|\\.y", "", .x), contains(".x") | contains(".y"))
# Validar los datos faltantes de la base por columna
colSums(is.na(vivienda_faltantes))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 4 0 0 0 0 0
## habitac tipo barrio longitud latitud clave
## 0 0 0 0 0 0
De la base resultante se identifican 4 observaciones donde no se logra obtener una estimación del valor, por lo que se decide retirar.
# Se identifican 4 observaciones faltantes donde no se encuentra coincidencia con la condición de las 3 variables cruzadas anteriormente, se deciden retirar.
vivienda_faltantes = vivienda_faltantes[!is.na(vivienda_faltantes$piso),]
colSums(is.na(vivienda_faltantes))
## id zona piso estrato preciom areaconst parquea banios
## 0 0 0 0 0 0 0 0
## habitac tipo barrio longitud latitud clave
## 0 0 0 0 0 0
4. Resultados
4.1 Análisis sobre variables clave
La revisión general muestra que la variable precio
contempla un amplio rango que inicia desde los 58 millones hasta 1999
millones, con una mediana de 330 millones y una media de 433.8
millones.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 58.0 220.0 330.0 433.8 540.0 1999.0
Por medio de un histograma se muestra la concentración de precios de manera general
Además, se analiza la dispersión de los precios en función del área construida y el número de habitaciones por estrato. Posteriormente, se profundiza en el análisis espacial de la variable precio, uno de los objetivos específicos de este informe.
#Histograma de precios
ggplot(vivienda_faltantes,aes(x=preciom)) +
geom_histogram(binwidth = 35, fill = "#51bd9c", color = "black") +
labs(title = "Distribución de precios de Viviendas",
x = "Precio (Millones de COP)",
y = "Frecuencia")
El histograma de precios permite evidenciar la concentración del precio de los inmuebles se ubica por debajo de los 500 millones.
Realizamos un diagrama de cajas que representa la distribución de los precios por estrato.
# Boxplot de Estratos
ggplot(vivienda_faltantes, aes(x = factor(estrato), y = preciom, fill = factor(estrato))) +
geom_boxplot(color = "black", fill = "#69b3a2", alpha = 0.7) + # Color de borde negro, relleno con color verde azulado y transparencia
geom_jitter(shape = 16, position = position_jitter(0.2), color = "darkgreen", alpha = 0.1) + # Puntos jitter con color verde oscuro y transparencia
labs(title = "Distribución de Precios por Estrato",
x = "Estrato",
y = "Precio (millones de COP)") +
theme_minimal() +
theme(legend.position = "none", # Elimina la leyenda
plot.title = element_text(size = 14, hjust = 0.5, face = "bold"), # Ajusta el tamaño y alineación del título
axis.title.x = element_text(size = 12, face = "bold"), # Ajusta el tamaño y peso de la etiqueta del eje x
axis.title.y = element_text(size = 12, face = "bold"), # Ajusta el tamaño y peso de la etiqueta del eje y
axis.text = element_text(size = 10), # Ajusta el tamaño del texto en los ejes
strip.text = element_text(size = 12, face = "bold", color = "black")) # Ajusta el tamaño y peso del texto en los ejes
*El gráfico de cajas ilustra claramente la relación directamente proporcional entre la variable de precio y estrato. Se puede evidenciar como a medida que aumenta el estrato, también la concentración del precio en su mediana.
*Se observa que la variabilidad en los precios del estrato 6 es considerablemente más alta debido al tamaño de las cajas en los cuartiles 2 y 3. Así mismo, la distribución de los datos que se ven a través de la sombra verde que demuestra que los datos se encuentran más dispersos.
# Distribución de precio por zona
ggplotly(
ggplot(vivienda_faltantes, aes(x = zona, y = preciom)) +
geom_boxplot(color = "black", fill = "#69b3a2", alpha = 1.0) + # Ajustes de color y transparencia
labs(title = "Distribución de Precio por Zona",
x = "Zona",
y = "Precio en Millones COP") +
theme_minimal() +
theme(plot.title = element_text(size = 16, hjust = 0.5, face = "bold"), # Ajustes de tamaño y alineación del título
axis.title.x = element_text(size = 14, face = "bold"), # Ajustes de tamaño y peso de etiquetas del eje x
axis.title.y = element_text(size = 14, face = "bold"), # Ajustes de tamaño y peso de etiquetas del eje y
axis.text.x = element_text(size = 12), # Ajustes de tamaño de texto en el eje x
axis.text.y = element_text(size = 12), # Ajustes de tamaño de texto en el eje y
legend.position = "none") # Elimina la leyenda
)
El gráfico permite afirmar cómo que la Zona Oeste tiene precios más altos en su concetración de datos, su contraparte es la Zona Oriente que tiene precios más bajos con un tope de 500 millones.
En la Zona Oeste, los precios tienen un rango más amplio, indicando una mayor diversidad de valores de propiedad. Por otro lado, en la Zona Oriente, los precios están más concentrados en un rango más cerrado.
Se intuye que las diferencias tan marcadas pueden estar ocasionadas por factores como la demanda y oferta del sector, la distribución de estratificación, la reputación de la zona, el desarrollo urbano y las características propias del sector.
# Gráfico de cajas distribución del precio por tipo de vivienda
ggplot(vivienda_faltantes, aes(x = zona, y = preciom, fill = tipo)) +
geom_boxplot(position = position_dodge(width = 0.8), width = 0.5, color = "black", alpha = 1.0) + # Ajustes de posición, ancho, color y transparencia
labs(title = "Distribución del precio según el tipo de vivienda y zona",
x = "Zona",
y = "Precio (Millones de COP)",
fill = "Tipo de Vivienda") +
theme_minimal() +
theme(plot.title = element_text(size = 16, hjust = 0.5, face = "bold"), # Ajustes de tamaño y alineación del título
axis.title.x = element_text(size = 14, face = "bold"), # Ajustes de tamaño y peso de etiquetas del eje x
axis.title.y = element_text(size = 14, face = "bold"), # Ajustes de tamaño y peso de etiquetas del eje y
axis.text.x = element_text(size = 12), # Ajustes de tamaño de texto en el eje x
axis.text.y = element_text(size = 12), # Ajustes de tamaño de texto en el eje y
legend.position = "bottom", # Posiciona la leyenda en la parte inferior
legend.title = element_text(size = 12, face = "bold"), # Ajustes de tamaño y peso del título de la leyenda
legend.text = element_text(size = 12)) # Ajustes de tamaño de texto en la leyenda
Del gráfico se destaca que los precios de las casas son mayores comparados con los apartamentos en todas las zonas, esta diferencia está mucho más marcada incluso en la Zona Sur. Adicionalmente, en las Zonas Centro, Oriente y Sur se identifica una mayor variabilidad en los precios de las casas en comparación con los apartamentos. Por último se destaca una alta variabilidad en precios de la Zona Oeste tanto para apartarmentos como para casas
Este comportamiento basado en la distribución de precios según el tipo de vivienda y la zona que correponden pueden llevar a argumentaciones relevantes sobre las preferencias del mercado y las dinámicas locales de acuerdo a la zonificación establecida en la ciudad.
Se ilustra la distribución según el tipo de vivienda
#Torta con al distribución porcentual del tipo
# Calcula las frecuencias y porcentajes de cada tipo de inmueble
frecuencias <- vivienda_faltantes %>%
count(tipo) %>%
mutate(pct = n / sum(n) * 100, # Calcula los porcentajes
label = paste0(n, " (", round(pct, 1), "%)")) # Combina las frecuencias y los porcentajes en las etiquetas
# Crea el gráfico de torta con los valores absolutos y porcentuales
ggplot(frecuencias, aes(x = "", y = pct, fill = tipo)) +
geom_bar(width = 1, stat = "identity") + # Gráfico de barras con los porcentajes
coord_polar("y") + # Coordenadas polares para convertir en gráfico de torta
geom_text(aes(label = label), # Etiquetas con los valores absolutos y porcentuales
position = position_stack(vjust = 0.5), # Ajuste de posición
size = 5, color = "white") + # Ajustes de tamaño y color de texto
labs(title = "Distribución por tipo de vivienda",
fill = "Tipo de vivienda",
x = NULL, # Elimina etiqueta del eje x
y = NULL) + # Elimina etiqueta del eje y
theme_minimal() + # Tema minimalista
theme(legend.position = "bottom", # Mueve la leyenda a la parte inferior
plot.background = element_rect(fill = "lightgray"), # Cambia el color de fondo
axis.text = element_blank(), # Elimina texto del eje
axis.ticks = element_blank(), # Elimina las marcas del eje
panel.grid = element_line(color = "black")) # Añade líneas de guía en blanco
# Calcular la frecuencia de cada zona
frecuencia_zona <- table(vivienda_faltantes$zona)
# Ordenar las zonas por frecuencia descendente
frecuencia_zona <- sort(frecuencia_zona, decreasing = TRUE)
# Crear el gráfico de barras
barplot(frecuencia_zona,
main = "Distribución de la variable zona",
ylab = "Frecuencia", # Etiqueta del eje y
col = "#51bd9c", # Color de las barras
border = "black", # Color del borde de las barras
ylim = c(0, max(frecuencia_zona) * 1.1), # Ampliar el límite del eje y
horiz = FALSE, # Mostrar el gráfico verticalmente
las = 1, # Orientación de las etiquetas del eje x
space = 0.5, # Espacio entre las barras
cex.axis = 0.8, # Tamaño de las etiquetas del eje y
cex.names = 0.8) # Tamaño de las etiquetas del eje x
Se genera un diagrama de barras para evidenciar la distribución del tipo de vivienda por estrato
# Calcular el número total de viviendas
total_viviendas <- nrow(vivienda_faltantes)
# Calcular el número de viviendas por estrato y tipo
viviendas_por_estrato_tipo <- vivienda_faltantes %>%
group_by(estrato, tipo) %>%
summarise(count = dplyr::n()) %>%
ungroup() # Desagrupar los datos
## `summarise()` has grouped output by 'estrato'. You can override using the
## `.groups` argument.
# Calcular la participación porcentual
viviendas_por_estrato_tipo <- viviendas_por_estrato_tipo %>%
mutate(participacion = (count / total_viviendas) * 100)
# Crear etiquetas para las barras
etiquetas <- viviendas_por_estrato_tipo %>%
mutate(etiqueta = paste0("Abs: ", count, ", %: ", round(participacion, 1), "%"))
# Crear el gráfico de barras con ggplot
plot_barras <- ggplot(etiquetas, aes(x = factor(estrato), y = count, fill = tipo)) +
geom_bar(stat = "identity", color = "black", width = 0.7) +
geom_text(aes(label = etiqueta),
position = position_stack(vjust = 0.5),
size = 3.5,
color = "black",
hjust = 0.5, # Ajuste para centrar horizontalmente las etiquetas
vjust = 0.5) + # Ajuste para centrar verticalmente las etiquetas
labs(title = "Número de Viviendas por Estrato y Tipo",
x = "Estrato",
y = "Número de Viviendas") +
theme_minimal()
# Mostrar el gráfico de barras con etiquetas centradas
print(plot_barras)
Se puede evidenciar que la mayor cantidad de viviendas se encuentran en el estrato 5; en segundo lugar se identifica al estrato 4 y por último el estrato 6 predominando en todos los casos el número de apartamentos. El estrato 3 tiene un comportamieto distinto predominando las casas y teniendo la menor participación de las viviendas en general.
#Relación enttre area construida y precio
# Crea un gráfico de dispersión entre areaconst y preciom
plot(vivienda_faltantes$areaconst, vivienda_faltantes$preciom,
xlab = "Área Construida (m²)",
ylab = "Precio (millones de COP)",
main = "Relación entre Área Construida y Precio",
col = "blue",
pch = 16) # Define el tipo de punto
# Agrega una línea de regresión lineal
abline(lm(vivienda_faltantes$preciom ~ vivienda_faltantes$areaconst), col = "red")
El gráfico de dispersión general permite evidenciar la relación directamente proporcional entre el área construida y el precio. Al trazar una recta de la regresión se ve una tendencia creciente.
# Gráfico de Dispersión Precio vs Área Construida vs estrato
ggplot(vivienda_faltantes, aes(x = areaconst, y = preciom)) +
geom_point(aes(color = factor(estrato))) + geom_smooth(aes(color = factor(estrato), group = factor(estrato)), method= "lm", se=FALSE)+
labs(title = "Relación entre Área Construida y Precio ",
x = "Área Construida (m²)",
y = "Precio (en millones de COP)") +
theme_minimal()+
ylim(0, 2500)
Ahora dando un mayor detalle agrupando el estrato, se puede ver de manera visual la correspondencia según el estrato y el precio mucho más alto, lo cual es lo esperado. Las lineas de tendencias permiten evidenciar como según el estrato la pendiente de la recta es mucho mayor. Un punto a destacar es la proximidad de los valores de los estratos 4 y 5 lo que se evnidencia en al linea de tendencia que al parecer tienen una pendiente similar.
4.1 Analisis general de la oferta de vivienda
# Histograma de las áreas en metros cuadrados
histograma_areas <- ggplot(data = vivienda_faltantes, aes(x = areaconst)) +
geom_histogram(binwidth = 80, fill = "#51bd9c", color = "black") +
labs(title = "Distribución de áreas en metros cuadrados",
x = "Área",
y = "Frecuencia") +
theme_minimal()+
theme(plot.title = element_text(size = 10))
# Gráfico de Barras para Habitaciones
grafico_habitaciones <- ggplot(vivienda_faltantes, aes(x = factor(habitac))) +
geom_bar(fill = "#51bd9c", color = "black") +
labs(title = "Distribución de Viviendas por N° de habitaciones",
x = "Habitaciones",
y = "Cantidad") +
theme_minimal()+
theme(plot.title = element_text(size = 10))
# Gráfico de Barras para Baños
grafico_banios <- ggplot(vivienda_faltantes, aes(x = factor(banios))) +
geom_bar(fill = "#51bd9c", color = "black") +
labs(title = "Distribución de Viviendas por N° de Baños",
x = "Baños",
y = "Cantidad") +
theme_minimal()+
theme(plot.title = element_text(size = 10))
# Gráfico de Barras para Parqueaderos Disponibles
grafico_parqueaderos <- ggplot(vivienda_faltantes, aes(x = factor(parquea))) +
geom_bar(fill = "#51bd9c", color = "black") +
labs(title = "Distribución de Viviendas por N°de Parqueaderos",
x = "Número de Parqueaderos",
y = "Cantidad") +
theme_minimal()+
theme(plot.title = element_text(size = 10))
# Combinar los gráficos en un solo gráfico 2x2
graficos_combinados <- plot_grid(grafico_habitaciones, grafico_banios,
grafico_parqueaderos,histograma_areas,
labels = c("A", "B", "C", "D"),
label_size = 8,
ncol = 2)
# Mostrar el gráfico combinado
graficos_combinados
De forma general se agrupan 4 gráficos que permiten evidenciar el
comportamiento de las variables de acuerdo a la oferta actual de
viviendas y lo que los datos nos permiten analizar.
En cuanto a las habitaciones se puede observar que alrededor de 4000 registros (48%) cuentan con 3 habitaciones. Lo que es una característica clave en la demanda de inmuelbles.
A nivel de cantidad de baños, la mayor cantidad de datos está representado en 2 y 3 baños.
Del gráfico de parqueaderos se afirma que la gran mayoria de viviendas cuentan con al menos de un parqueadero.
5. Discusión
El análisis exploratorio realizado a partir de la información suministrada permite llegar a conclusiones relevantes a pesar de las fallas de calidad de los datos que se lograron solventar a partir de algunos ajustes que se deben asumir desde el análisis de datos, pero que hacen parte del proceso natural de limpieza de información y estandarización de variables que siempre se debe realizar en este tipo de ejercicios.
Si bien el ejercicio es meramente descriptivo y exploratorio, se destacan de forma general la posibilidad de llegar a realizar análisis sobre variables clave que permiten identificar entre varias puntos: la preferencia sobre la tipologia de vivienda, Su distribución por zonas, el comportamiento de los precios de las viviendas por zona, por estrato y demás cruces relevantes que pemirten perfilar y caracterizar la necesidad de clientes que buscan viviendas en la ciudad de Cali.
También se destacan análisis descriptivos más generales y sencillos obtenidos a partir de las variables que puedan parecer no tan relevantes inicialmente, pero que pueden resultar útiles desde la visión de negocios y que pueden apoyar las decisiones estratégicas futuras según se requieran. Con esto se hace referencia al análisis de la oferta de variables como el número de habitaciones, baños,parqueaderos o la distribución de áreas que se dan de acuerdo a datos históricos.
6. Conclusiones
En la ciudad de Cali existe una mayor preferencia por apartamentos (61,3%) en comparación delas casas (38,7%), por lo cual se sugiere dirigir la estrategia de negocio enfocada a este tipo de preferencia marcada por este tipo de inmueble, resaltando los beneficios que brindan ese tipo de inmuebles, como la seguridad, y espacios de esparcimiento para niños y adultos. Este tipo de estrategias puede estar enfocada en vivienda tipo VIS, en las zonas Centro y Oriente que son donde se encuentran oportunidades en volumen de ofertas.
Es evidente a partir del análisis realizado una variación notable en los precios de las viviendas entre las diferentes zonas de la ciudad. Las zonas sur y oeste muestran los rangos de precios más altos, mientras que las zonas del Centro y Oriente presentan precios más bajos. Esta tipo de información es clave para llevar estrategias desde la segmentación de mercado ya sea que se inclinen por la punta o la base de la píramide.
Considerando la oferta actual, La zona Oriente es la que menos volumen presenta a pesar de que los precios tambien son los menores. Pueda ser que se requiera contemplar una diversificación de la oferta para aumentar la participación dentro de la zona, ya sea evaluando si la zona se considera altamente comercial, o quizas son barrios de tipo popular que no se pudieran contemplar desde este estudio.
Se han logrado identificar las variables más relevantes y demandadas de las viviendas en venta en Cali a partir de variables como el área construida, la cantidad de habitaciones, de baños y la disponibilidad de parqueaderos por inmueble. Estas caracteristicas identificadas sobre las variables permiten perfilar la demanda y preferencias de los de potenciales compradores, lo que permite al negocio adaptar su oferta en proyectos futuros que se piensen desarrollar.
Es posible concluir que la Zona Sur tiene un gran potencial como nicho de mercado, debido a su oferta superior, la recomendación es desarrollar estrategias para negociar a un precio superior y fortalecer el plan de ventas, ya que se encuentra en segunda posición con respecto a la variable de precio, donde es superada por la Zona Oeste.
Existe un potencial de dearrollar nuevos proyectos enfocados a la base de la piramide, esto considerando que no se cuenta con información para estratos 1 y 2, puede ser un posible nicho de mercado por explorar especialmente en las zonas donde se cuenta con menor oferta.