La agencia de bienes raíces denominada B&C (Bines y Casas) de Cali-Colombia. Ha recopilado información relevante en torno al sector inmobiliario de la ciudad. Aplicando la estadística descriptiva como mecanismo para analizar las tendencias, oportunidades y patrones del mercado en busca de oportunidades comerciales.
El objetivo principal del estudio presentado está enfocado en determinar las tendencias y patrones en el mercado para:
• Definir su nicho de mercado.
• Desarrollar estrategias de marketing.
• Establecer precios de venta.
• Ofrecer servicios personalizados a sus clientes.
En primera instancia es importante resaltar, la aplicación de la estadística descriptiva como ruta para la presentación de las diferentes variables analizadas de la información suministrada del sector viviendas en Cali. A su vez, se busca sintetizar los datos más relevantes para la toma decisiones sobre inversión y nuevas oportunidades.
Para la primera fase del informe, se inicia con el procesamiento de la información en la base de datos data(vivienda_faltantes), la cual tiene 8330 registros de viviendas de la ciudad de Cali. Para lo cual, se genera un proceso de limpieza desde imputación por grupos para determinar los valores faltantes en las variables piso y parqueadero. A su vez, también se contempla la normalización y trasformación de las variables latitud y longitud necesarias para determinar la ubicación exacta de los inmuebles de la ciudad de Cali. Después del proceso de limpieza y transformación, se empieza con el proceso de visualización de los datos, mediante diferentes tipos de gráfica, como lo son, barras, puntos y mapa de ubicación geográfica.
A continuación se presentan los principales resultados con base a los objetivos planteados.
# Cargar paquetes necesarios
library(paqueteMETODOS)
library(dplyr)
library(tidyr)
library(leaflet)
library(ggplot2)
library(ggtext)
library(ggplot2)
library(leaflet)
library(htmlwidgets)
# Cargar datos desde el archivo limpio
vivienda_limpiada <- read.csv("C:/Users/ASUS/Desktop/Maestria ciencia de datos/Métodos y simulacion estadística/datafinalcali.csv")
# Gráfico de barras para distribución de tipo de vivienda
grafico_tipo <- ggplot(vivienda_limpiada, aes(x = tipo, fill = tipo)) +
geom_bar(position = "stack", stat = "count") +
geom_text(
aes(label = scales::percent((..count..)/sum(..count..))),
stat = "count",
position = position_stack(vjust = 0.5),
size = 3,
show.legend = FALSE
) +
labs(title = "Distribución de Tipo de Vivienda", x = "Tipo", y = "Cantidad") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
text = element_text(family = "Arial", color = "black"))
print(grafico_tipo)En la ciudad de Cali, el 61% de los inmuebles reportados, son de tipo Apartamento, y el 39% son casas, lo que nos indica la tendencia a vivir en conjuntos residenciales.
#Creacion gráfico zonas de cali
# Configuración del tema y colores
mi_tema <- theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
text = element_text(family = "Arial", color = "black"))
mis_colores <- scale_fill_manual(values = c("#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3", "#a6d854"))
# Gráfico combinado de zonas Cali y distribución general
grafico_combinado <- ggplot(vivienda_limpiada, aes(x = as.factor(zona))) +
geom_bar(aes(y = (..count..)/sum(..count..)), fill = "#66c2a5") + # Usa el mismo color para "Zonas Cali"
geom_text(
aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))),
stat = "count",
position = position_stack(vjust = -0.25),
size = 3
) +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "Distribución de Zonas en Cali", y = "Percent", x = "Zonas ") +
mi_tema +
mis_colores # Aplica los mismos colores del otro gráfico
# Imprime el gráfico combinado
print(grafico_combinado)La zona con mayor número de viviendas construidas es el sur de la ciudad con un 56.8%, seguidamente de la zona norte con 23.1%. La zona que presenta menor número construcción de viviendas es la zona de Cali con el 1.5%.
#Gráfico promedio área construida por zona y tipo
# Cargar paquete necesario
library(knitr)
# Suprimir decimales del promedio
vivienda_limpiada$areaconst <- as.numeric(vivienda_limpiada$areaconst)
promedio_areaconst <- vivienda_limpiada %>%
group_by(zona, tipo) %>%
summarise(promedio = round(mean(areaconst, na.rm = TRUE), 0))
# Generar el gráfico de promedio de área construida por zona y tipo
grafico_promedio_areaconst <- ggplot(promedio_areaconst, aes(x = zona, y = promedio, fill = tipo)) +
geom_bar(stat = "identity") +
geom_text(
aes(label = sprintf("%.0f", promedio)),
position = position_stack(vjust = 0.5),
size = 3,
show.legend = FALSE
) +
labs(title = "Promedio de Área Construida por Zona y Tipo", x = "Zona", y = "Promedio Área Construida") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Mostrar el gráfico
print(grafico_promedio_areaconst)En la zona oeste se encuentran los apartamentos y casa más grandes con 173 y 343 en área construida respectivamente. La zona con los inmuebles más pequeños es la zona oriente de Cali, con 94 en área construida para apartamentos y 213 para las casas.
# Gráfico de barras apiladas para tipos de vivienda por zonas con etiquetas
grafico_tipos_vivienda_zona <- ggplot(vivienda_limpiada, aes(x = zona, fill = tipo)) +
geom_bar(position = "stack", stat = "count") +
geom_text(
aes(label = scales::percent((..count..)/sum(..count..))),
stat = "count",
position = position_stack(vjust = 0.5),
size = 3,
show.legend = FALSE
) +
labs(title = "Distribución de Tipos de Vivienda por Zona", x = "Zona", y = "Cantidad") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(grafico_tipos_vivienda_zona)En la zona sur, el 33.47% son apartamentos y el 23.31% son casas, en lo que se relaciona con el 56.8% del total de viviendas en Cali. La zona Centro, presenta el 0,29% de apartamentos y las casas con el 1.18%.
# Configuración del tema y colores
mi_tema <- theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
text = element_text(family = "Arial", color = "black"))
mis_colores <- scale_fill_manual(values = c("#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3", "#a6d854"))
# Gráfico de barras para distribución de estratos en Cali
grafico_estratos_cali <- ggplot(vivienda_limpiada, aes(x = factor(estrato))) +
geom_bar(position = "stack", stat = "count", fill = "#66c2a5") +
geom_text(
aes(label = scales::percent((..count..)/sum(..count..))),
stat = "count",
position = position_stack(vjust = 0.5),
size = 3,
show.legend = FALSE
) +
labs(title = "Distribución de Estratos en Cali", x = "Estrato", y = "Cantidad") +
mi_tema +
mis_colores # Aplica los mismos colores y tema del otro gráfico
print(grafico_estratos_cali)En Cali, 33.0% de los inmuebles se encuentran en el estrato 5, seguidamente por el 25,6% se encuentran en estrato 4.
# Gráfico de barras para distribución de estratos por zona con etiquetas
grafico_estratos_zona <- ggplot(vivienda_limpiada, aes(x = zona, fill = factor(estrato))) +
geom_bar(position = "stack", stat = "count") +
geom_text(
aes(label = scales::percent((..count..)/sum(..count..))),
stat = "count",
position = position_stack(vjust = 0.5),
size = 3,
show.legend = FALSE
) +
labs(title = "Distribución de Estratos por Zona", x = "Zona", y = "Cantidad") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(grafico_estratos_zona)En la zona Sur se concentra, los estratos 3,4,5 y 6, teniendo mayor representatividad el estrato 5. En la zona Oriente, se concentra, 4.08% del estrato 3 y se tiene una mínima representación del estrato 5.
library(ggplot2)
library(scales)
# Gráfico de precios con puntos
grafico_precios_puntos <- ggplot(vivienda_limpiada, aes(x = zona, y = preciom, color = tipo)) +
geom_jitter(position = position_jitter(0.2), alpha = 0.7) +
labs(title = "Distribución de Precios por Zona y Tipo de Vivienda", x = "Zona", y = "Precio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(grafico_precios_puntos)Los precios más altos se encuentran en la zona Sur y la zona Oeste, siendo la zona Oriente más económica, al igual que la zona Centro. A continuación, se encuentra el detalle de precios, con la ubucación por barrios.
#mapa promedio de precio por barrio
library(leaflet)
df <- data.frame(
longitud = vivienda_faltantes$longitud,
latitud = vivienda_faltantes$latitud,
preciom = vivienda_faltantes$preciom,
zona = vivienda_faltantes$zona
)
# Calcular el precio promedio por zona
precio_promedio_por_zona <- df %>%
group_by(zona) %>%
summarise(precio_promedio = mean(preciom, na.rm = TRUE))
# Identificar observaciones sin decimal en longitud
sin_decimales <- df$longitud[!grepl("\\.", as.character(df$longitud))]
sin_decimales_divididos <- sin_decimales / 1000
# Reemplazar nuevos valores por antiguos
df$longitud[!grepl("\\.", as.character(df$longitud))] <- sin_decimales_divididos
# Identificar observaciones sin decimal en latitud
sin_decimales_latitud <- df$latitud[!grepl("\\.", as.character(df$latitud))]
sin_decimales_divididos_latitud <- sin_decimales_latitud / 100
# Reemplazar nuevos valores por antiguos
df$latitud[!grepl("\\.", as.character(df$latitud))] <- sin_decimales_divididos_latitud
precio_promedio_por_ubicacion <- df %>%
group_by(longitud, latitud) %>%
summarise(precio_promedio = mean(preciom, na.rm = TRUE))
# Crear el mapa
mapa <- leaflet(precio_promedio_por_ubicacion) %>%
addTiles() %>%
addCircleMarkers(
~longitud, ~latitud,
radius = 1,
color = "red",
fill = TRUE,
fillOpacity = 0.7,
popup = ~paste("Precio Promedio: $", round(precio_promedio, 2))
)
# Mostrar el mapa
mapaDe igual forma, se estable de forma detallada el análisis de precios por zona y ubicación en la ciudad de Cali
# Mapa precio por zona
library(leaflet)
# Función para limpiar y estandarizar los nombres de barrios
limpiar_barrios <- function(nombres) {
nombres <- tolower(trimws(iconv(nombres, from = "UTF-8", to = "ASCII//TRANSLIT")))
nombres <- gsub("[_ ]", "", nombres)
return(nombres)
}
# Función para limpiar y estandarizar los nombres de zonas
limpiar_zonas <- function(zonas) {
zonas <- tolower(trimws(iconv(zonas, from = "UTF-8", to = "ASCII//TRANSLIT")))
zonas <- gsub("[_ ]", "", zonas)
return(zonas)
}
df <- data.frame(
longitud = vivienda_faltantes$longitud,
latitud = vivienda_faltantes$latitud,
preciom = vivienda_faltantes$preciom,
zona = vivienda_faltantes$zona,
barrio = limpiar_barrios(vivienda_faltantes$barrio)
)
# Identificar observaciones sin decimales en longitud
sin_decimales <- df$longitud[!grepl("\\.", as.character(df$longitud))]
sin_decimales_divididos <- sin_decimales / 1000
# Reemplazar nuevos valores por antiguos
df$longitud[!grepl("\\.", as.character(df$longitud))] <- sin_decimales_divididos
# Identificar observaciones sin decimal en latitud
sin_decimales_latitud <- df$latitud[!grepl("\\.", as.character(df$latitud))]
sin_decimales_divididos_latitud <- sin_decimales_latitud / 100
# Reemplazar nuevos valores por antiguos
df$latitud[!grepl("\\.", as.character(df$latitud))] <- sin_decimales_divididos_latitud
# Calcular precio promedio por ubicación y zona
precio_promedio_por_ubicacion <- df %>%
group_by(longitud, latitud, zona, barrio) %>%
summarise(precio_promedio = mean(preciom, na.rm = TRUE))
# Asegurarse de que la columna 'zona' esté presente en df
df$zona <- vivienda_faltantes$zona
#library (forcast)
colores_zona <- colorFactor(palette = "Set1", # Cambié "Setl" por "Set1" ya que "Set1" es un nombre de paleta válido.
domain = precio_promedio_por_ubicacion$zona)
# Crear el mapa
mapa <- leaflet(precio_promedio_por_ubicacion) %>%
addTiles() %>%
addCircleMarkers(
~longitud, ~latitud,
radius = 3,
color = ~colores_zona(zona),
fill = TRUE,
fillOpacity = 0.7,
popup = ~paste("Zona:", zona, "<br>Barrio:", barrio, "<br>Precio Promedio: $", round(precio_promedio, 2))
) %>%
addLegend("bottomright", pal = colores_zona, values = ~zona, title = "Zona")
# Mostrar el mapa
mapaCon base en los resultados objetivos propuestos y a la información obtenida se puede inferir que:
Nicho de mercado: el sector inmobiliario en Cali evidencia una demanda significativa de apartamentos, principalmente en las zonas sur y norte. La agencia B&C podría enfocar sus esfuerzos en la venta y promoción de apartamentos.
Estrategias de marketing: el perfil socioeconómico de los posibles compradores se debe analizar desde la estratificación de los habitantes de la ciudad. La agencia puede diseñar estrategias de mercadeo específicas para atraer a clientes en los estratos 4 y 5, que son los más representados.
Precios de venta: es necesarios ajustar los precios por ubicación, esto debido al dinamismo en el valor de los predios en la misma zona. La zona sur y oeste pueden tener los valores más altos, mientras que en la zona oriente y centro es necesario ofrecer opciones más accesibles.
Servicios personalizados: la información detallada sobre la ubicación, precio de las viviendas y área construida, permitirá a la agencia B&C ofrecer servicios personalizados a sus clientes, con especificaciones relevantes para sus necesidades.
A continuación, se presenta el archivo de trabajo, con la depuración y limpieza de datos faltantes.
library(shiny)
# UI
ui <- fluidPage(
downloadButton(
"descargarBtn",
label = "Descargar Archivo R",
class = "btn-success",
style = "color: #fff; background-color: #5cb85c; border-color: #4cae4c;"
)
)
# Server
server <- function(input, output) {
output$descargarBtn <- downloadHandler(
filename = function() {
"vprof.R"
},
content = function(file) {
# Ruta del archivo existente
ruta_archivo <- "C:/Users/ASUS/Desktop/Maestria ciencia de datos/Métodos y simulacion estadística/vprof.R"
# Leer contenido del archivo
contenido <- readLines(ruta_archivo, warn = FALSE)
# Escribir contenido en el nuevo archivo
writeLines(contenido, file)
}
)
}
# Aplicación Shiny
shinyApp(ui, server)# Calcular los registros faltantes por variable
faltantes_por_variable <- colSums(is.na(vivienda_limpiada))
# Crear un data frame con la información
tabla_faltantes <- data.frame(
Variable = names(faltantes_por_variable),
Faltantes = faltantes_por_variable
)
# Imprimir la tabla en formato markdown
print(knitr::kable(tabla_faltantes, format = "markdown"))##
##
## | |Variable | Faltantes|
## |:---------|:---------|---------:|
## |id |id | 0|
## |zona |zona | 0|
## |piso |piso | 0|
## |estrato |estrato | 0|
## |preciom |preciom | 0|
## |areaconst |areaconst | 0|
## |parquea |parquea | 0|
## |banios |banios | 0|
## |habitac |habitac | 0|
## |tipo |tipo | 0|
## |barrio |barrio | 0|
## |longitud |longitud | 0|
## |latitud |latitud | 0|