En el dinámico y competitivo mercado inmobiliario en Cali(Colombia), el acceso a información detallada y un análisis riguroso de los datos emergen como recursos esenciales para aquellas empresas enfocadas en sostener su competitividad y descubrir nuevas oportunidades para el crecimiento y el desarrollo estratégico. Dentro de este marco, se presenta un análisis estadístico , diseñado para servir como una herramienta escencial para la empresa B&C. Este análisis promete ofrecer una plataforma robusta para la toma de decisiones fundamentadas, permitiendo a la empresa navegar con confianza en un entorno de mercado en constante cambio.
Proporcionar insights clave y un entendimiento profundo del mercado inmobiliario local.
Evaluar los precios promedio de vivienda en diferentes zonas de Cali, identificando las áreas con mayor potencial de inversión y aquellas que presentan opciones más accesibles para diversos segmentos del mercado.
Analizar la oferta de tipos de vivienda (, determinando cuáles son las preferencias predominantes en el mercado y cómo varían estas preferencias entre las diferentes zonas de la ciudad.
Estudiar las características más valoradas en las viviendas ofertadas, como el número de habitaciones, baños, área en metros cuadrados, y otros factores que influyen en el precio y la demanda.
Fomular recomendaciones estratégicas para B&C, basadas en el análisis de datos, que le permitan posicionarse de manera óptima en el mercado, ya sea mediante la inversión en zonas de alto potencial, la diversificación de su oferta de vivienda, o el desarrollo de campañas de marketing dirigidas
El Dataset Vivienda_faltantes, contiene:
# Número de registros
num_filas <- nrow(vivienda_faltantes)
cat("Número de registros:", num_filas)
## Número de registros: 8330
# Número de columnas
num_columnas <- ncol(vivienda_faltantes)
cat("Número de columnas:", num_columnas)
## Número de columnas: 13
A continuación, se describen cada una de las variables encontradas en el dataset.
# DataFrame Descripción de Variables
DescripcionVariables <- data.frame(
Variable = c("Id", "Zona", "Piso", "Estrato", "Precio M2", "Área M2","Parqueaderos", "Baños", "Habitaciones","Tipo","Barrio","Longitud", "Latitud"),
Tipo_Variable = c("Numérica", "Caracter", "Numérica", "Carácter", "Numérica", "Numérica","Numérica","Numérica","Numérica","Carácter","Carácter","Numérica","Numérica"),
Descripcion = c("Identificador de registro", "Zona geográfica donde se encuentra el inmueble", "Número de pisos del predio", "Estrato socioeconómico donde está el inmueble","Precio en Millones de Pesos Colombianos", "Area del inmueble M2", "Número de Parqueaderos", "Número de Baños", "Número de Habitaciones", "Tipo de Inmueble si es Casa o Apartamento", "Barrio donde se ubica el inmueble", "Logitud geográfica de ubicación del inmueble", "Latitud geográfica del inmueble"))
knitr::kable(DescripcionVariables)
| Variable | Tipo_Variable | Descripcion |
|---|---|---|
| Id | Numérica | Identificador de registro |
| Zona | Caracter | Zona geográfica donde se encuentra el inmueble |
| Piso | Numérica | Número de pisos del predio |
| Estrato | Carácter | Estrato socioeconómico donde está el inmueble |
| Precio M2 | Numérica | Precio en Millones de Pesos Colombianos |
| Área M2 | Numérica | Area del inmueble M2 |
| Parqueaderos | Numérica | Número de Parqueaderos |
| Baños | Numérica | Número de Baños |
| Habitaciones | Numérica | Número de Habitaciones |
| Tipo | Carácter | Tipo de Inmueble si es Casa o Apartamento |
| Barrio | Carácter | Barrio donde se ubica el inmueble |
| Longitud | Numérica | Logitud geográfica de ubicación del inmueble |
| Latitud | Numérica | Latitud geográfica del inmueble |
En esta etapa se realizó un análisis general, para determinar las reglas o criterios que se tomaron para transformar los datos en un formato más estándar que permitieran tener un análisis más consistente. Las transfromaciones realizadas fueron:
#Transformación Tipo de Vivienda
vivienda_faltantes$tipo = str_to_lower(vivienda_faltantes$tipo) #Cambio por minúsculas
vivienda_faltantes$tipo = ifelse(vivienda_faltantes$tipo == "casa", "Casa",vivienda_faltantes$tipo)
vivienda_faltantes$tipo = ifelse(vivienda_faltantes$tipo == "apartamento", "Apartamento",vivienda_faltantes$tipo)
vivienda_faltantes$tipo = ifelse(vivienda_faltantes$tipo == "apto", "Apartamento",vivienda_faltantes$tipo)
data=vivienda_faltantes
t1 = table(data$tipo)
t2=table(data$barrio)
# Convertir a minúscules
vivienda_faltantes$barrio = str_to_lower(vivienda_faltantes$barrio) #Cambio por minúsculas
# Eliminar espacios al inicio y al final
vivienda_faltantes$barrio = str_trim(vivienda_faltantes$barrio)
# Reemplazar múltiples espacios por un único espacio
vivienda_faltantes$barrio = str_replace_all(vivienda_faltantes$barrio, "\\s+", " ")
# Normalizar caracteres especiales, como convertir "á" en "a"
vivienda_faltantes$barrio = stringi::stri_trans_general(vivienda_faltantes$barrio, "Latin-ASCII")
#summarytools::freq(data$barrio, cumul = FALSE) # tabla
# Nombres de barrios normalizados y únicos
nombres_barrios_unicos = c("20 De Julio","Acopi","Aguablanca","Aguacatal","Alameda","Alameda Del Rio","Alamos","Alborada","Alcazares","Alferez Real","Alfonso Lopez","Alto Jordán","Altos De Guadalupe","Altos De Menga","Altos De Santa","Antonio Nariño","Aranjuez","Arboleda","Arboledas","Atanasio Girardot","Autopista Sur","Bajo Aguacatal","Barranquilla","Barrio 7 De Agosto","Barrio El Recuerdo","Barrio Eucarístico","Barrio Obrero","Barrio Tranquilo Y","Belalcazar","Belisario Caicedo","Bella Suiza","Bella Suiza Alta","Bellavista","Benjamín Herrera","Berlin","Bloques Del Limonar","Bochalema","Bolivariano","Bosques De Alboleda","Bosques Del Limonar","Boyacá","Bretaña","Brisas De Guadalupe","Brisas De Los","Brisas Del Guabito","Brisas Del Limonar","Bueno Madrid","Buenos Aires","Caldas","Cali","Calibella","Calicanto","Calima","Calimio Norte","Calipso","Cambulos","Camino Real","Campestre","Caney","Cañasgordas","Cañaveralejo","Cañaverales","Capri","Cascajal","Cataya Real","Ceibas","Centelsa","Centenario","Centro","Cerro Cristales","Cerros De Guadalupe","Champagnat","Chapinero","Chiminangos","Chipichape","Ciudad 2000","Ciudad Antejardin","Ciudad Bochalema","Ciudad Capri","Ciudad Cordoba","Ciudad Country","Ciudad Del Campo","Ciudad Jardin","Ciudad Jardin Pance","Ciudad Los Alamos","Ciudad Melendez","Ciudad Modelo","Ciudad Pacifica","Ciudad Real","Ciudad Talanga","Ciudad Universitaria","Ciudadela Comfandi","Ciudadela Del Río","Ciudadela Melendez","Ciudadela Paso Ancho","Ciudadela Pasoancho","Colinas De Menga","Colinas Del Bosque","Colinas Del Sur","Colon","Colseguros","Comfenalco","Compartir","Conjunto Gibraltar","Cristales","Cristobal Colón","Cuarto De Legua","Departamental","Ed Benjamin Herrera","El Bosque","El Caney","El Castillo","El Cedro","El Diamante","El Dorado","El Gran Limonar","El Guabal","El Guabito","El Ingenio I","El Ingenio Ii","El Ingenio Iii","El Jardín","El Jordán","El Lido","El Limonar","El Nacional","El Paraíso","El Peñon","El Prado","El Refugio","El Rodeo","El Sena","El Troncal","El Vallado","Eucarístico","Evaristo García","Farrallones De Pance","Fenalco Kennedy","Fepicol","Flora","Flora Industrial","Floralia","Fonaviemcali","Francisco Eladio Ramirez","Fuentes De La","Gaitan","Gran Limonar","Granada","Guadalupe","Guadalupe Alto","Guaduales","Guayaquil","Hacienda Alferez Real","Ingenio","Ingenio I","Ingenio Ii","Jamundi","Jamundi Alfaguara","Jorge Eliecer Gaitán","Jorge Isaacs","Jose Manuel Marroquín","Juanambu","Junin","La Alborada","La Alianza","La Arboleda","La Base","La Buitrera","La Campiña","La Cascada","La Ceibas","La Esmeralda","La Flora","La Floresta","La Fortaleza","La Gran Colombia","La Hacienda","La Independencia","La Libertad","La Luisa","La Merced","La Morada","La Nueva Base","La Playa","La Portada Al","La Primavera","La Reforma","La Rivera","La Rivera I","La Rivera Ii","La Riverita","La Selva","La Villa Del","Laflora","Lares De Comfenalco","Las Acacias","Las Camelias","Las Ceibas","Las Delicias","Las Granjas","Las Quintas De","Las Vegas","Libertadores","Los Alamos","Los Alcazares","Los Andes","Los Cambulos","Los Cámbulos","Los Cristales","Los Farallones","Los Guaduales","Los Guayacanes","Los Jockeys","Los Libertadores","Los Parques Barranquilla","Los Robles","Lourdes","Mamellan","Manzanares","Mariano Ramos","Marroquín Iii","Mayapan Las Vegas","Melendez","Menga","Metropolitano Del Norte","Miradol Del Aguacatal","Miraflores","Morichal De Comfandi","Multicentro","Napoles","Normandia","Normandía","Norte","Norte La Flora","Nueva Base","Nueva Floresta","Nueva Tequendama","Oasis De Comfandi","Oasis De Pasoancho","Occidente","Pacara","Palmas Del Ingenio","Pampa Linda","Panamericano","Pance","Parque Residencial El","Paseo De Los","Paso Del Comercio","Pasoancho","Poblado Campestre","Popular","Portada De Comfandi","Portales De Comfandi","Porvenir","Prados De Oriente","Prados Del Limonar","Prados Del Norte","Prados Del Sur","Primavera","Primero De Mayo","Primitivo Crespo","Puente Del Comercio","Puente Palma","Quintas De Don","Quintas De Salomia","Rafael Uribe Uribe","Refugio","Rincon De La","Rincón De Salomia","Riveras Del Valle","Rozo La Torre","Saavedra Galindo","Salomia","Samanes","Sameco","San Antonio","San Bosco","San Carlos","San Cayetano","San Fernando","San Fernando Nuevo","San Fernando Viejo","San Joaquín","San Juan Bosco","San Judas","San Luis","San Nicolas","San Pedro","San Vicente","Santa Anita","Santa Bárbara","Santa Elena","Santa Fe","Santa Isabel","Santa Monica","Santa Mónica Alta","Santa Monica Norte","Santa Monica Popular","Santa Monica Residencial","Santa Rita","Santa Rosa","Santa Teresita","Santo Domingo","Sector Aguacatal","Sector Cañaveralejo Guadalupe","Seminario","Sierras De Normandía","Siete De Agosto","Simón Bolivar","Tejares Cristales","Tequendema","Terrón Colorado","Torres De Comfandi","Unicentro Cali","Unión De Vivienda","Urbanización Barranquilla","Urbanización Boyacá","Urbanización Colseguros","Urbanizacion El Saman","Urbanizacion Gratamira","Urbanización La Flora","Urbanización La Merced","Urbanización La Nueva","Urbanización Las Cascadas","Urbanización Nueva Granada","Urbanización Pacara","Urbanización Río Lili","Urbanización San Joaquin","Urbanización Tequendama","Valle Del Lili","Valle Grande","Versalles","Villa Colombia","Villa De Veracruz","Villa Del Lago","Villa Del Parque","Villa Del Prado","Villa Del Sol","Villa Del Sur","Villas De Veracruz","Vipasa","Zona Centro","Zona Norte","Zona Norte Los","Zona Oeste","Zona Oriente","Zona Residencial","Zona Sur")
# Amatch para encontrar la mejor coincidencia para cada barrio en tus datos
vivienda_faltantes$barrio_normalizado <- nombres_barrios_unicos[stringdist::amatch(vivienda_faltantes$barrio, nombres_barrios_unicos, maxDist = Inf)]
#table(vivienda_faltantes$barrio_normalizado)
#summarytools::freq(vivienda_faltantes$barrio_normalizado, cumul = FALSE) # tabla
#Cantidad de Parqueaderos
#vivienda_faltantes$parquea[is.na(vivienda_faltantes$parquea)] <- 0 #Imputación NA por 0
# Ajustar los valores de longitud
vivienda_faltantes$longitud_normalizada <- ifelse(vivienda_faltantes$longitud > 10000 | vivienda_faltantes$longitud < -10000, vivienda_faltantes$longitud / 1000, vivienda_faltantes$longitud)
# Ajustar los valores de latitud y logitud
vivienda_faltantes$latitud_normalizada <- ifelse(vivienda_faltantes$latitud > 10000 | vivienda_faltantes$latitud > 100, vivienda_faltantes$latitud / 1000, vivienda_faltantes$latitud)
#summarytools::freq(vivienda_faltantes$longitud_normalizada, cumul = FALSE) # tabla
#summarytools::freq(vivienda_faltantes$latitud_normalizada, cumul = FALSE) # tabla
Como primer criterio para los datos faltantes, se determina que cuando un registro tiene más del 50% de sus datos en NA, esos registros no se tentrán en cuenta. El Dataset queda con un total:
# Índice lógico para filas con más del 50% de NA en esas columnas
indice_filas_a_eliminar <- rowSums(is.na(vivienda_faltantes[, 1:13])) > (13/ 2)
# Filtrar el dataframe para excluir las filas con más del 50% de NA
vivienda_faltantesClean = vivienda_faltantes[!indice_filas_a_eliminar, ]
# Número de registros
num_filas <- nrow(vivienda_faltantesClean)
cat("Número de registros:", num_filas, "\n")
## Número de registros: 8327
Se realiza el análisis de los datos faltantes por cada una de las variables,a través del paquete VIM. Para el Caso del número pisos del inmueble, se evidencia que el 31,6% de los registro no cuentan con información y para el caso del número de parqueaderos el 19,3% de los registros no cuentan la información. Aunque el número de parqueaderos puede ser representativo para el valor del inmueble se decide eliminar la columna, junto con la de número de pisos, porque esta dos variables, en el momento de iniciar un proyecto se deberá revisar el Plan de Ordenamiento territorial de cada zona, para validar el máximo de pisos permito y el número mínimo de parqueaderos. Estas dos variables se pueden considerar como un valor agregado en el precio del inmueble.
Se realiza la eliminación a nivel columnas y no de registros porque se considera que los demás datos de los inmuebles son de gran valor en el análisis.
VIM::aggr(vivienda_faltantesClean, cex.axis = 0.5, cex.lab= 0.8) # graficos de datos faltantes
sapply(vivienda_faltantesClean, function(x) sum(is.na(x)))
## id zona piso
## 0 0 2638
## estrato preciom areaconst
## 0 0 0
## parquea banios habitac
## 1603 0 0
## tipo barrio longitud
## 0 0 0
## latitud barrio_normalizado longitud_normalizada
## 0 0 0
## latitud_normalizada
## 0
#Se eliminan las columnas de piso y parqueadero y
vivienda_faltantesClean$piso = NULL
vivienda_faltantesClean$parquea = NULL
vivienda_faltantes_Depurada <- na.omit(vivienda_faltantesClean)
Se decide crear una Variable que represente el precio por metro cuadrado para cada uno de los inmuebles, tomando la columna Area Construida/ Precio del Inmueble.
#Variable precio metro cuadrado
vivienda_faltantes_Depurada$preciomt = vivienda_faltantes_Depurada$preciom / vivienda_faltantes_Depurada$areaconst
A continuación, se realiza un análisis descriptivo de cada uno de los datos que les permitirá tomar decisiones informadas y formular su estrategia de mercado inmobiliario más sólida y efectiva.
Se observa que en la ciudad de Cali, tiene mayor incursión los apartamentos con un 61,3%, en comparación a las casas con un 38.7%.
#Diagram de Torta por Tipo de Apartamento
ViviendaTipo=table(vivienda_faltantes_Depurada$tipo)
ViviendaZona=table(vivienda_faltantes_Depurada$zona)
# Gráfico Pie Tipo de Vivienda
porcentajes <- prop.table(ViviendaTipo) * 100
labels <- paste(names(ViviendaTipo), ": ", round(porcentajes, 1), "%")
pie(ViviendaTipo,labels = labels, main = "Tipo de Viviendas", col=c("#FFBF69","#034A94"))
En la zona Sur se concentra el mayor número de viviendas ofertadas con un 56,8% del total, donde la preferencia entre casa o apartamento no tiene un gran diferenciador, seguida de la zona Norte con un 23,1%. En la Zona oriente predomina la oferta de casas con un 82.34%
En la zona Sur se observa la mayor oferta de viviendas, representando el 56.8% del total, donde la elección entre casas o apartamentos muestra poca diferencia en preferencia. Por otro lado, la zona Norte sigue en importancia con el 23.1% de las ofertas. Se destaca la zona Oriente, donde las casas constituyen el 82.34% de la oferta en la zona.
# Gráfico Pie Tipo de Vivienda
porcentajes <- prop.table(ViviendaZona) * 100
labels <- paste(names(ViviendaZona), ": ", round(porcentajes, 1), "%")
pie(ViviendaZona,labels = labels, main = "Zona de las Viviendas", col=palette("Alphabet"))
#Gráfico de Barras por Zonas y Tipo de Vivienda
counts <- table(vivienda_faltantes_Depurada$tipo, vivienda_faltantes_Depurada$zona)
barplotZonaTipo <- barplot(counts,
beside = TRUE,
xlab="Zona",
ylab="Cantidad de Viviendas",
col=c("#FFBF69","#034A94"),
ylim=c(0,4500),main="Tipo de Viviendas por Zonas",
legend = rownames(counts),
)
# Añadir etiquetas de datos sobre cada barra
num_bars <- nrow(counts) * ncol(counts) # Total de barras
bar_heights <- as.vector(counts) # Alturas de las barras
for(i in 1:num_bars) {
if(bar_heights[i] > 0) { # Solo añadir etiquetas a barras no vacías
text(barplotZonaTipo[i], bar_heights[i] + 50, labels = bar_heights[i], cex = 0.6, pos = 3)
}
}
# Tabla de Viviendas por Zonas y Tipo de Vivienda
counts <- table(vivienda_faltantes_Depurada$zona,vivienda_faltantes_Depurada$tipo)
# Convertimos 'counts' a un data frame para facilitar el cálculo de porcentajes
counts_df <- as.data.frame.matrix(counts)
# Calculamos los totales por zona (fila)
totals_per_zone <- rowSums(counts_df)
# Calculamos los porcentajes
percent_counts_df <- sweep(counts_df, 1, totals_per_zone, FUN="/") * 100
# Aplicamos 'sprintf' para formatear los números como porcentajes
percent_counts_df[] <- lapply(percent_counts_df, function(x) sprintf("%.2f%%", x))
# Recalcularte después de convertir a porcentajes.
percent_counts_df <- rbind(percent_counts_df)
# Usando 'knitr' para mostrar la tabla como HTML en R Markdown
knitr::kable(percent_counts_df)
| Apartamento | Casa | |
|---|---|---|
| Zona Centro | 19.35% | 80.65% |
| Zona Norte | 62.38% | 37.62% |
| Zona Oeste | 85.96% | 14.04% |
| Zona Oriente | 17.66% | 82.34% |
| Zona Sur | 58.95% | 41.05% |
Un análisis focalizado exclusivamente en los precios revela que estos varían significativamente, desde los $58 millones hasta alcanzar los $2.000 millones de pesos. Con una mediana situada en $434 millones, se evidencia que la mayor parte de las propiedades se agrupa en el segmento de precios más bajos.”
summary(vivienda_faltantes_Depurada$preciom)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 58.0 220.0 330.0 434.3 540.0 1999.0
hist(vivienda_faltantes_Depurada$preciom, prob = TRUE, main = "Histograma precio de Viviendas", ylab = "Frecuencia", ylim=c(0, 0.003), xlab="")
# Extremos de la curva normal
x <- seq(min(vivienda_faltantes_Depurada$preciom), max(vivienda_faltantes_Depurada$preciom), length = 40)
f <- dnorm(x, mean = mean(vivienda_faltantes_Depurada$preciom), sd = sd(vivienda_faltantes_Depurada$preciom))
lines(x, f, col = "red", lwd = 2)
Como segunda instancia se analiza la correlación entre el precio del
inmueble con el área en metros cuadrados,encontrano una correlación de
0,69, que indica una relación positiva moderada entre ambas variables.
Esto sugiere que, a medida que el área en metros cuadrados de un
inmueble aumenta, su precio también tiende a aumentar. Este hallazgo es
consistente con la expectativa de que propiedades más grandes
generalmente tienen un valor de mercado más alto. Sin embargo, es
importante tener en cuenta que aunque existe una correlación positiva,
no implica causalidad directa y pueden existir otros factores que
influyan en el precio de los inmuebles, como la zona, estrato, número de
habitaciones, número de baños.
cor(vivienda_faltantes_Depurada$preciom, vivienda_faltantes_Depurada$areaconst)
## [1] 0.6872452
Se llevó a cabo un análisis exhaustivo de las características principales de los inmuebles en relación con sus precios, con el objetivo de identificar los factores clave que influyen en el valor de mercado de estas propiedades.
Como parte de este estudio, se examinó la correlación entre cada variable numérica, permitiendo identificar patrones de interés significativo. Los resultados revelan que aspectos como el estrato social, el número de baños y la cantidad de habitaciones muestran una correlación positiva con el precio de los inmuebles. Esto indica que dichas características son determinantes importantes en la evaluación del valor de una propiedad.
vivienda_numerica <- select_if(vivienda_faltantes_Depurada, is.numeric)
c = cor(vivienda_numerica)
corrplot::corrplot(c, method = "color")
Evidentemente, el precio de las viviendas aumenta conforme se asciende en el estrato socioeconómico, lo que refleja la correlación directa entre la categorización socioeconómica de las zonas y el valor de mercado de los inmuebles situados en ellas.
boxplot(formula = preciom ~ estrato, data = vivienda_faltantes_Depurada, ylab = "Precio MCOP", xlab = "Estrato", col="blue")
En el análisis realizado sobre el conjunto de datos, se observa que la relación entre el precio de las viviendas y el número de baños no muestra una correlación fuerte. Este hallazgo puede atribuirse a la inclusión de propiedades atípicas dentro del conjunto de datos, como bodegas, cuyo valor de mercado puede ser significativamente alto a pesar de no contar con baños.
boxplot(formula = preciom ~ banios, data = vivienda_faltantes_Depurada,ylab = "Precio MCOP", xlab = "Número de Baños", col="green")
La cantidad de habitaciones en una vivienda no se correlaciona directamente con su precio de manera uniforme. Esto se debe a que existen propiedades con múltiples habitaciones situadas en zonas de estratos socioeconómicos más bajos, donde el valor por metro cuadrado tiende a ser menor. Así, el número de habitaciones no constituye un indicador determinante del precio por sí solo, ya que la ubicación y el estrato socioeconómico de la propiedad influyen significativamente en su valoración en el mercado.
boxplot(formula = preciom ~ habitac, data = vivienda_faltantes_Depurada, ylab = "Precio MCOP", xlab = "Número de Habitaciones", col="orange")
Se llevó a cabo una evaluación del precio promedio por metro cuadrado en las distintas zonas de Cali, revelando que la Zona Oeste se destaca por tener el valor más elevado, alcanzando los $3.85 millones de COP por metro cuadrado en apartamentos y $2.39 millones de COP en casas, posicionándose así por encima de la Zona Sur en términos de costos. Por otro lado, la Zona Oriente presenta el valor por metro cuadrado más accesible, coincidiendo además con la mayor concentración de propiedades en el área. Este análisis destaca las variaciones significativas en el valor del mercado inmobiliario a lo largo de la ciudad, subrayando la Zona Oeste como la más exclusiva en términos de precio, mientras que la Zona Oriente emerge como la opción más económica y con alta disponibilidad de inmuebles
Prom_Precio_Zona_Tipo = vivienda_faltantes_Depurada %>%
group_by(zona, tipo) %>% # Agrupar por zona y tipo de vivienda
summarize(Precio_Promedio = round(mean(preciomt), digits = 2), .groups = 'drop') # Calcular precio promedio y redondear
#Gráfico ggplot
ggplot(Prom_Precio_Zona_Tipo, aes(x = zona, y = Precio_Promedio, fill = tipo)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.75)) +
geom_text(aes(label = Precio_Promedio),
position = position_dodge(width = 0.75),
vjust = -0.25, # Ajusta para mover el texto arriba de las barras
size = 3) +
theme_minimal() +
labs(x = "Zona", y = "Precio Promedio por m2", title = "Precio Promedio por m2") +
scale_fill_manual(values = c("#FFBF69", "#034A94")) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
#Gráfico ggplot
promedio_barrios <- vivienda_faltantes_Depurada %>%
group_by(barrio_normalizado) %>%
summarize(Precio_Promedio_mt2 = mean(preciom, na.rm = TRUE)) %>%
arrange(desc(Precio_Promedio_mt2)) %>%
top_n(10, Precio_Promedio_mt2)
Se realiza también el análisis del Top de barrios con el promedio de precios, sirviendo como referente para identificar las áreas de mayor valor dentro de la ciudad: La portada al Mar, la Riverita, Unicentro Cali, Ingenio y Arboleda.
# Gráfico de barras con ggplot2
ggplot(promedio_barrios, aes(x = reorder(barrio_normalizado, Precio_Promedio_mt2), y = Precio_Promedio_mt2, fill = barrio_normalizado)) +
geom_bar(stat = "identity") +
coord_flip() + # Voltear las coordenadas para mejor visualización
labs(title = "Top 10 Barrios por Precio Promedio",
x = "Barrio",
y = "Precio Promedio") +
theme_minimal() +
theme(legend.title = element_blank(), legend.position = "none") # Eliminar leyenda
En el análisis efectuado, se destaca que la zona oriente de Cali presenta el metro cuadrado más accesible, principalmente en viviendas tipo casa. Este hallazgo sugiere una oportunidad de mercado potencialmente para la inmobiliaria B&C. Dicho sector podría beneficiarse de una estrategia de inversión enfocada en la adquisición de propiedades residenciales con el objetivo de desarrollar proyectos de apartamentos. Esta táctica permitiría capitalizar el bajo costo del terreno en comparación con otras zonas de la ciudad.
Una aproximación innovadora para maximizar la rentabilidad sería considerar el desarrollo de un modelo constructivo estandarizado, especialmente en situaciones donde sea posible la compra de una o más propiedades contiguas. Tal enfoque no solo facilitaría la optimización de los recursos al minimizar los gastos asociados al diseño arquitectónico, sino que también podría acelerar los tiempos de construcción y mejorar la eficiencia en la gestión de proyectos.
La zona oriente de Cali emerge como un área de significativo interés para la inversión inmobiliaria, destacándose por ofrecer el metro cuadrado más accesible. Esta zona representa una oportunidad excepcional para el desarrollo de proyectos residenciales, especialmente para la construcción de apartamentos que respondan a la creciente demanda por viviendas asequibles. La posibilidad de adquirir propiedades a menor costo abre un amplio abanico de oportunidades para maximizar la rentabilidad de los proyectos inmobiliarios en esta área.
El análisis de precios revela una amplia gama de valores, con una mediana establecida en $434 millones de pesos. Este dato sugiere que, a pesar de la variabilidad en el mercado, existe una concentración significativa de inmuebles en un rango de precio que podría considerarse accesible para un segmento considerable de la población. Tal diversidad en la estructura de precios subraya la importancia de estrategias de segmentación del mercado para dirigir eficazmente las ofertas inmobiliarias
En el análisis centrado en las características de los inmuebles, se observó que la cantidad de baños y habitaciones no constituye, por sí sola, un predictor confiable del precio de un inmueble. En contraste, factores como la zona, el barrio y el estrato socioeconómico demostraron tener una relación más directa y significativa con el valor del mercado. Esto sugiere que, aunque las características internas son importantes, la ubicación y el contexto socioeconómico desempeñan un papel más determinante en la valoración de las propiedades
corrplot::corrplot(c, method = "number", tl.cex=0.6)
# Moda utilizando funciones básicas dentro de summarise
# Definir una función para calcular la moda
moda <- function(x) {
tabla <- table(x) # Crear una tabla de frecuencias
moda <- names(tabla)[which.max(tabla)] # Encontrar el valor con la mayor frecuencia
return(moda)
}
# Calcular la moda para la variable baños por zona
moda_baños <- moda(vivienda_faltantes_Depurada$banios)
moda_por_zona <- vivienda_faltantes_Depurada %>%
group_by(zona) %>%
summarise(moda_baños = {
tbl <- table(banios) # Crea una tabla de frecuencia de baños
max_freq <- max(tbl) # Encuentra la frecuencia máxima
moda <- names(tbl)[tbl == max_freq] # Encuentra los valores de bañoss con esa máxima frecuencia
paste(moda, collapse = ", ") # Si hay múltiples modas, las une con coma. Ajusta según necesites.
}) %>%
ungroup()
# Moda de número de baños por zona
knitr::kable(moda_por_zona)
| zona | moda_baños |
|---|---|
| Zona Centro | 2 |
| Zona Norte | 2 |
| Zona Oeste | 4 |
| Zona Oriente | 2 |
| Zona Sur | 2 |
# Moda utilizando funciones básicas dentro de summarise
# Definir una función para calcular la moda
moda <- function(x) {
tabla <- table(x) # Crear una tabla de frecuencias
moda <- names(tabla)[which.max(tabla)] # Encontrar el valor con la mayor frecuencia
return(moda)
}
# Calcular la moda para la variable habitaciones
moda_habitaciones <- moda(vivienda_faltantes_Depurada$habitac)
moda_por_zona <- vivienda_faltantes_Depurada %>%
group_by(zona) %>%
summarise(habitac = {
tbl <- table(habitac) # Crea una tabla de frecuencia de habitaciones
max_freq <- max(tbl) # Encuentra la frecuencia máxima
moda <- names(tbl)[tbl == max_freq] # Encuentra los valores de parqueaderos con esa máxima frecuencia
paste(moda, collapse = ", ") # Si hay múltiples modas, las une con coma. Ajusta según necesites.
}) %>%
ungroup()
# Moda de número de habiaciones por zona
knitr::kable(moda_por_zona)
| zona | habitac |
|---|---|
| Zona Centro | 3 |
| Zona Norte | 3 |
| Zona Oeste | 3 |
| Zona Oriente | 3 |
| Zona Sur | 3 |