INTRODUCCIÓN

Este informe estadístico se enfoca en el análisis del mercado de bienes raíces en Cali, Colombia, a través de la valiosa base de datos recopilada por B&C (Bines y Casas). Con una década de experiencia en el sector, B&C ha compilado datos clave que abarcan precios, ubicaciones, características y preferencias de viviendas, ofreciendo una perspectiva única sobre el mercado actual.

Este análisis permitirá a B&C comprender en profundidad las dinámicas del mercado en Cali y tomar decisiones estratégicas fundamentales. El informe abarca aspectos como los precios en distintas zonas, los tipos de viviendas más demandados y las características preferidas por los compradores, brindando información esencial para la definición de nichos de mercado, estrategias de marketing efectivas y la personalización de servicios.

A través de hallazgos clave, este informe ayudará a B&C a optimizar sus esfuerzos y seguir siendo un jugador influyente en el próspero mercado inmobiliario de Cali. Basado en datos sólidos, el análisis brindará una visión profunda que respaldará las decisiones empresariales en un entorno dinámico y en constante cambio.

OBJETIVOS

  1. Analizar la variabilidad de los precios de viviendas en diferentes zonas de Cali para identificar patrones geográficos y determinar áreas de oportunidad estratégica en el mercado inmobiliario local.

  2. Identificar los tipos de viviendas más demandados por los compradores en Cali, desglosando las preferencias por características como área construida, número de habitaciones, parqueaderos y baños, con el fin de orientar la estrategia de comercialización de B&C.

  3. Identificar y evaluar oportunidades de negocio óptimas en el mercado inmobiliario de Cali, basadas en las tendencias y preferencias identificadas, para guiar la expansión y diversificación de la cartera de propiedades de B&C y maximizar su rentabilidad.

MÉTODOS UTILIZADOS

En la realización de este análisis estadístico, se emplearon diversas técnicas y enfoques para obtener una comprensión profunda de los datos relacionados con el mercado inmobiliario en Cali. A continuación, se describen los principales métodos utilizados en este estudio:

DESARROLLO

## Installing package into 'C:/Users/PC/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'learnr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC\AppData\Local\Temp\RtmpmOl2e6\downloaded_packages
## Installing package into 'C:/Users/PC/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'devtools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC\AppData\Local\Temp\RtmpmOl2e6\downloaded_packages
## Skipping install of 'paqueteMET' from a github remote, the SHA1 (624823ee) has not changed since last install.
##   Use `force = TRUE` to force installation
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.4
## ✔ ggplot2   3.4.2     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## Attaching package: 'mice'
## 
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## 
## The following objects are masked from 'package:base':
## 
##     cbind, rbind

Limpieza de datos

Para esta parte del analisis, tenemos que obtener información sobre la composición de la base de datos a analizar:

str(vivienda_faltantes)
## spc_tbl_ [8,330 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id       : num [1:8330] 8312 8311 8307 8296 8297 ...
##  $ zona     : chr [1:8330] "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
##  $ piso     : num [1:8330] 4 1 NA 2 NA NA 2 NA NA 2 ...
##  $ estrato  : num [1:8330] 6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : num [1:8330] 1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num [1:8330] 318 300 800 150 112 390 125 280 74 120 ...
##  $ parquea  : num [1:8330] 2 1 4 1 2 8 2 4 1 2 ...
##  $ banios   : num [1:8330] 4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : num [1:8330] 2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr [1:8330] "Apartamento" "Casa" "Casa" "Casa" ...
##  $ barrio   : chr [1:8330] "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num [1:8330] -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num [1:8330] 3454 3454 3455 3417 3408 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   zona = col_character(),
##   ..   piso = col_double(),
##   ..   estrato = col_double(),
##   ..   preciom = col_double(),
##   ..   areaconst = col_double(),
##   ..   parquea = col_double(),
##   ..   banios = col_double(),
##   ..   habitac = col_double(),
##   ..   tipo = col_character(),
##   ..   barrio = col_character(),
##   ..   longitud = col_double(),
##   ..   latitud = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
Viviendas_Cali<-data(vivienda_faltantes)
Viviendas_Cali <- data.frame(vivienda_faltantes)
glimpse(Viviendas_Cali)
## Rows: 8,330
## Columns: 13
## $ id        <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona      <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso      <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato   <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom   <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea   <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, NA, 2, NA, 1, 2, 2, 2, 4, 1…
## $ banios    <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac   <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo      <chr> "Apartamento", "Casa", "Casa", "Casa", "Casa", "Casa", "Apar…
## $ barrio    <chr> "arboleda", "normandía", "miraflores", "el guabal", "bella s…
## $ longitud  <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud   <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …

Crearemos un dataset con la información de esta data llamado Viviendas_Cali

Viviendas_Cali <- data.frame(vivienda_faltantes)

Haremos algunos procedimientos de limpieza de datos para normalizar algunos campos

#Cambiar los datos a minusculas para los campos 'tipo' y 'barrio'
Viviendas_Cali$tipo=str_to_lower(Viviendas_Cali$tipo)
Viviendas_Cali$barrio=str_to_lower(Viviendas_Cali$barrio)

# Definir una función para reemplazar caracteres con tilde por sus equivalentes sin tilde
reemplazar_tildes <- function(texto) {
  texto <- iconv(texto, from = "UTF-8", to = "ASCII//TRANSLIT")
  return(texto)
}
#Aplicar la función a la columna "barrio" del data frame
Viviendas_Cali$barrio <- sapply(Viviendas_Cali$barrio, reemplazar_tildes)

#reemplazar el tipo apto por apartamento
Viviendas_Cali$tipo[Viviendas_Cali$tipo=="apto"]="apartamento"

#Creamos un grafico que nos permita identificar valores incluidos en cada campo

md.pattern(Viviendas_Cali,rotate.names = TRUE)

##      preciom id zona estrato areaconst banios habitac tipo barrio longitud
## 4812       1  1    1       1         1      1       1    1      1        1
## 1912       1  1    1       1         1      1       1    1      1        1
## 877        1  1    1       1         1      1       1    1      1        1
## 726        1  1    1       1         1      1       1    1      1        1
## 1          1  0    0       0         0      0       0    0      0        0
## 2          0  0    0       0         0      0       0    0      0        0
##            2  3    3       3         3      3       3    3      3        3
##      latitud parquea piso     
## 4812       1       1    1    0
## 1912       1       1    0    1
## 877        1       0    1    1
## 726        1       0    0    2
## 1          0       0    0   12
## 2          0       0    0   13
##            3    1606 2641 4279
#Reemplazamos los valores NA del campo parquea por 0
Viviendas_Cali <- Viviendas_Cali %>%
  mutate(parquea = ifelse(is.na(parquea), 0, parquea))

Para este analisis, se establece que no se tomaran en cuenta aquellos registros que no tengan un ID ya que el mayor cantidad solo tiene uno o dos campos sin información.

VivCali_ConID <- subset(Viviendas_Cali, !is.na(id))
glimpse(VivCali_ConID)
## Rows: 8,327
## Columns: 13
## $ id        <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona      <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso      <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato   <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom   <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea   <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, 0, 2, 0, 1, 2, 2, 2, 4, 1, …
## $ banios    <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac   <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo      <chr> "apartamento", "casa", "casa", "casa", "casa", "casa", "apar…
## $ barrio    <chr> "arboleda", "normandia", "miraflores", "el guabal", "bella s…
## $ longitud  <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud   <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …

ANALISIS DE DATOS

En esta etapa, es necesario comprender algunos datos importantes, teniendo en cuenta los campos disponibles en la base de datos. En primera medida, queremos saber cuantos inmuebles hay por tipo

##Queremos saber cuantos inmuebles hay por tipo
tabla_cantidad_tipo <- VivCali_ConID %>%
  group_by(tipo) %>%
  summarise(Cantidad = n()) %>%
  mutate(Porcentaje = scales::percent(Cantidad / sum(Cantidad)))
# Crear la gráfica de torta con etiquetas de datos (cantidad y porcentaje)
grafica_torta <- ggplot(tabla_cantidad_tipo, aes(x = "", y = Cantidad, fill = factor(tipo))) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Cantidad de Registros por Tipo de Inmueble",fill = "Tipo") +
  theme_minimal() +
  theme(legend.position = "right") +
  scale_fill_manual(values = c("casa" = "#3fbdc3", "apartamento" = "#f07b70")) +
  geom_text(aes(label = paste0(Cantidad, " (", Porcentaje, ")")), position = position_stack(vjust = 0.5)) +
  guides(fill = guide_legend(title = "Tipo", label = TRUE))
# Mostrar la gráfica de torta con etiquetas de datos
print(grafica_torta)

También, queremos saber cuantos inmuebles hay por estrato:

#Grafico de torta por estrato:
tabla_cantidad_estrato <- VivCali_ConID %>%
  group_by(estrato) %>%
  summarise(Cantidad = n()) %>%
  mutate(Porcentaje = scales::percent(Cantidad / sum(Cantidad)))
# Crear la gráfica de torta con etiquetas de datos (cantidad y porcentaje)
grafica_torta_estrato <- ggplot(tabla_cantidad_estrato, aes(x = "", y = Cantidad, fill = factor(estrato))) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Cantidad de Registros por Estrato", fill = "Estrato") +
  theme_minimal() +
  theme(legend.position = "right") +
  scale_fill_manual(values = c("3" = "#4BC0D9", "4" = "#76E5FC", "5" = "#9DACFF", "6" = "#6457A6")) +
  geom_text(aes(label = paste0(Cantidad, " (", Porcentaje, ")")), position = position_stack(vjust = 0.5)) +
  guides(fill = guide_legend(title = "Estrato", label = TRUE))
# Mostrar la gráfica de torta con etiquetas de datos
print(grafica_torta_estrato)

Ademas, es necesario saber cuantos inmuebles hay por zona

# Crear una tabla que cuente los inmuebles por zona
tabla_cantidad_zona <- VivCali_ConID %>%
  group_by(zona) %>%
  summarise(Cantidad = n()) %>%
  mutate(Porcentaje = scales::percent(Cantidad / sum(Cantidad))) %>%
  arrange(desc(Porcentaje))
# Crear la gráfica de torta por zona con colores personalizados y ordenada por porcentaje
grafica_torta_zona <- ggplot(tabla_cantidad_zona, aes(x = "", y = Cantidad, fill = zona)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(fill = "Zona") +
  theme_minimal() +
  theme(legend.position = "right") +
  scale_fill_manual(values = c("Zona Norte" = "#A6ECE0", "Zona Sur" = "#7ADFBB", "Zona Oriente" = "#4C8577", "Zona Oeste" = "#4E6E58", "Zona Centro" = "#544B3D")) +
  geom_text(aes(label = paste0(Cantidad, " (", Porcentaje, ")")), position = position_stack(vjust = 0.5)) +
  guides(fill = guide_legend(title = "Zona", label = TRUE))
# Mostrar la gráfica de torta por zona con colores personalizados y ordenada por porcentaje
print(grafica_torta_zona)

De igual manera, queremos saber cuantos inmuebles hay por zona en cada uno de los tipos de vivienda

#Se crea una grafica de barras por zona y por tipo de vivienda
grafica_barras_zona_tipo <- ggplot(data = VivCali_ConID, aes(x = zona, fill = tipo)) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..), position = position_dodge(width = 0.9), vjust = -0.5) +
  labs(title = "Cantidad de Registros por Tipo y Zona",
       x = "Zona",
       y = "Cantidad de Registros") +
  theme_minimal() +
  scale_fill_manual(values = c("casa" = "#3fbdc3", "apartamento" = "#f07b70"))
# Mostrar la gráfica de torta con etiquetas de datos
print(grafica_barras_zona_tipo)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Y también, saber cuantos inmuebles hay por zona para cada uno de los estratos

#
#Creamos una grafica de barras por zona y por estrato
grafica_barras_zona_estrato <- ggplot(data = VivCali_ConID, aes(x = zona, fill = factor(estrato))) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..), position = position_dodge(width = 0.9), vjust = -0.5) +
  labs(title = "Cantidad de Registros por Zona y Estrato",
       x = "Zona",
       y = "Cantidad de Registros") +
  theme_minimal() +
  scale_fill_manual(values = c("3" = "#4BC0D9", "4" = "#76E5FC", "5" = "#9DACFF", "6" = "#6457A6"))
# Mostrar la gráfica de barras por zona y estrato con colores personalizados
print(grafica_barras_zona_estrato)

En este momento podemos establecer que: - En nuestra base contamos con mayor información de apartamentos que de casas, - En cuanto a cantidad de inmuebles, el estrato 5 cuenta con el mayor numero, el estrato 3 con el menor y los estratos 4 y 6 con una distribución similar - La cantidad de inmuebles por zona, la Zona Sur cuenta con la participación más grande, seguido de la Zona norte, Zona Oeste, Zona Oriente y Zona Centro respectivamente.

Ahora, considero que uno de los factores mas importantes a tener en cuenta dentro de este análisis es el precio del inmueble, por lo cual sería importante observar como varia este dato frente a datos tales como tipo, zona y estrato del inmueble

#Generar los indicadores de centro y el grafico boxplot por tipo de inmueble, basado en el dato precio
indicadores_centro_tipo <- VivCali_ConID %>%
  group_by(tipo) %>%
  summarise(Media = mean(preciom, na.rm = TRUE),
            Mediana = median(preciom, na.rm = TRUE),
            Cuartil1 = quantile(preciom, probs = 0.25, na.rm = TRUE),
            Cuartil3 = quantile(preciom, probs = 0.75, na.rm = TRUE),
            Minimo = min(preciom, na.rm = TRUE),
            Maximo = max(preciom, na.rm = TRUE))
# Mostrar la tabla de indicadores de centro
print(indicadores_centro_tipo)
## # A tibble: 2 × 7
##   tipo        Media Mediana Cuartil1 Cuartil3 Minimo Maximo
##   <chr>       <dbl>   <dbl>    <dbl>    <dbl>  <dbl>  <dbl>
## 1 apartamento  368.     280      175      430     58   1950
## 2 casa         540.     430      300      670     77   1999
#Generar el boxplot de precio por tipo
# Crear la gráfica de boxplots por tipo de inmueble con colores personalizados
grafica_boxplots_tipo <- ggplot(data = VivCali_ConID, aes(x = tipo, y = preciom, fill = tipo)) +
  geom_boxplot() +
  labs(title = "Distribucion de Precios de Inmuebles por Tipo",
       x = "Tipo de Inmueble",
       y = "Precio del Inmueble") +
  theme_minimal() +
  scale_fill_manual(values = c("casa" = "#3fbdc3", "apartamento" = "#f07b70"))

# Mostrar la gráfica de boxplots por tipo de inmueble con colores personalizados
print(grafica_boxplots_tipo)

La media del precio de los apartamentos es inferior en comparación a la de las casas. La agrupación de valores dentro del primer y el tercer quartil, basados en el precio del inmueble, es inferior a la media del precio del valor de una casa, por lo que podría ser posible que, tomando en cuenta la cantidad de inmuebles que hay bajo el tipo “apartamento” se encuentren mas posibilidades de negocio al rededor de este tipo.

#Generar los indicadores de centro y el grafico boxplot por zona de inmueble, basado en el dato precio
indicadores_centro_zona <- VivCali_ConID %>%
  group_by(zona) %>%
  summarise(Media = mean(preciom, na.rm = TRUE),
            Mediana = median(preciom, na.rm = TRUE),
            Cuartil1 = quantile(preciom, probs = 0.25, na.rm = TRUE),
            Cuartil3 = quantile(preciom, probs = 0.75, na.rm = TRUE),
            Minimo = min(preciom, na.rm = TRUE),
            Maximo = max(preciom, na.rm = TRUE))
# Mostrar la tabla de indicadores de centro
print(indicadores_centro_zona)
## # A tibble: 5 × 7
##   zona         Media Mediana Cuartil1 Cuartil3 Minimo Maximo
##   <chr>        <dbl>   <dbl>    <dbl>    <dbl>  <dbl>  <dbl>
## 1 Zona Centro   310.     297     189.     361.    100   1100
## 2 Zona Norte    346.     300     160      430      65   1940
## 3 Zona Oeste    679.     580     394.     900      85   1999
## 4 Zona Oriente  229.     210     145      290      58   1350
## 5 Zona Sur      427.     320     222      520      75   1900
# Crear la gráfica de boxplots por zona con colores personalizados
grafica_boxplots_zona <- ggplot(data = VivCali_ConID, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  labs(title = "Distribucion de Precios de Inmuebles por Zonas",
       x = "Zona",
       y = "Precio del Inmueble") +
  theme_minimal() +
  scale_fill_manual(values = c("Zona Norte" = "#A6ECE0", "Zona Sur" = "#7ADFBB", "Zona Oriente" = "#4C8577", "Zona Oeste" = "#4E6E58", "Zona Centro" = "#544B3D"))

# Mostrar la gráfica de boxplots por zona con colores personalizados
print(grafica_boxplots_zona)

Aqui podemos entender que los precios mas bajos los encontraremos en la Zona Oriente. Sin embargo, en esta zona solo hay un 4.2% de la cantidad de inmuebles disponibles, por lo que las posibilidades de negocio son reducidas. En la zona norte y la zona sur, tomando en cuenta la cantidad de inmuebles que tiene cada una y los resultados de distribucion de precios nos permite postularlas como las zonas donde mayor oportunidad de negocio podríamos encontrar (basados en los precios).

Queremos estimar el valor promedio de una casa y de un apartamento por cada una de las zonas:

#Generar los indicadores de centro y el grafico boxplot por tipo de inmueble 'casa', basado en el dato precio
indicadores_centro_casa_zona <- VivCali_ConID %>%
  filter(tipo == "casa")%>%
  group_by(zona) %>%
  summarise(Media = mean(preciom, na.rm = TRUE),
            Mediana = median(preciom, na.rm = TRUE),
            Cuartil1 = quantile(preciom, probs = 0.25, na.rm = TRUE),
            Cuartil3 = quantile(preciom, probs = 0.75, na.rm = TRUE),
            Minimo = min(preciom, na.rm = TRUE),
            Maximo = max(preciom, na.rm = TRUE))
# Filtrar los datos para inmuebles de tipo "casa"
casas <- VivCali_ConID %>% filter(tipo == "casa")
# Crear la gráfica de boxplots de precios de inmuebles tipo "casa" por zona con colores personalizados
grafica_boxplots_casas_zona <- ggplot(data = casas, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  labs(title = "Distribucion de Precios de Inmuebles tipo 'Casa' por Zona",
       x = "Zona",
       y = "Precio del Inmueble") +
  theme_minimal() +
  scale_fill_manual(values = c("Zona Norte" = "#A6ECE0", "Zona Sur" = "#7ADFBB", "Zona Oriente" = "#4C8577", "Zona Oeste" = "#4E6E58", "Zona Centro" = "#544B3D"))
# Mostrar la gráfica de boxplots de precios de inmuebles tipo "casa" por zona con colores personalizados
print(grafica_boxplots_casas_zona)

#Generar los indicadores de centro y el grafico boxplot por tipo de inmueble 'apartamento', basado en el dato precio
indicadores_centro_casa_apartamento <- VivCali_ConID %>%
  filter(tipo == "apartamento")%>%
  group_by(zona) %>%
  summarise(Media = mean(preciom, na.rm = TRUE),
            Mediana = median(preciom, na.rm = TRUE),
            Cuartil1 = quantile(preciom, probs = 0.25, na.rm = TRUE),
            Cuartil3 = quantile(preciom, probs = 0.75, na.rm = TRUE),
            Minimo = min(preciom, na.rm = TRUE),
            Maximo = max(preciom, na.rm = TRUE))
# Filtrar los datos para inmuebles de tipo "casa"
apartamentos <- VivCali_ConID %>% filter(tipo == "apartamento")
# Crear la gráfica de boxplots de precios de inmuebles tipo "casa" por zona con colores personalizados
grafica_boxplots_apartamentos_zona <- ggplot(data = apartamentos, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  labs(title = "Distribucion de Precios de Inmuebles tipo 'Apartamento' por Zona",
       x = "Zona",
       y = "Precio del Inmueble") +
  theme_minimal() +
  scale_fill_manual(values = c("Zona Norte" = "#A6ECE0", "Zona Sur" = "#7ADFBB", "Zona Oriente" = "#4C8577", "Zona Oeste" = "#4E6E58", "Zona Centro" = "#544B3D"))
# Mostrar la gráfica de boxplots de precios de inmuebles tipo "casa" por zona con colores personalizados
print(grafica_boxplots_apartamentos_zona)

Conforme a estos resultados, es importante resaltar que, independientemente del tipo del inmueble (casa o apartamento, en la Zona Oeste los precios no varian mucho entre uno u otro. Sin embargo, en las demas zonas se hace evidente el cambio de precio y es posible concluir que los apartamentos tienen un valor promedio inferior al de las casas.

Por ultimo, se busca analizar el comportamiento de los precios de los inmuebles de acuerdo al estrato, queriendo confirmar lo evidente (cuanto mas alto el estrato, mayor el precio del inmueble)

#Generar los indicadores de centro y el grafico boxplot por estrato, basado en el dato precio
indicadores_centro_estrato <- VivCali_ConID %>%
  group_by(estrato) %>%
  summarise(Media = mean(preciom, na.rm = TRUE),
            Mediana = median(preciom, na.rm = TRUE),
            Cuartil1 = quantile(preciom, probs = 0.25, na.rm = TRUE),
            Cuartil3 = quantile(preciom, probs = 0.75, na.rm = TRUE),
            Minimo = min(preciom, na.rm = TRUE),
            Maximo = max(preciom, na.rm = TRUE))
# Mostrar la tabla de indicadores de centro
print(indicadores_centro_estrato)
## # A tibble: 4 × 7
##   estrato Media Mediana Cuartil1 Cuartil3 Minimo Maximo
##     <dbl> <dbl>   <dbl>    <dbl>    <dbl>  <dbl>  <dbl>
## 1       3  210.     160      120      270     58   1600
## 2       4  275.     235      165      335     78   1800
## 3       5  410.     350      270      470     89   1999
## 4       6  801.     700      515      990    128   1950
# Crear la gráfica de boxplots por estrato con colores personalizados
grafica_boxplots_estrato <- ggplot(data = VivCali_ConID, aes(factor(estrato), y = preciom, group = factor(estrato))) +
  geom_boxplot() +
  labs(title = "Distribucion de Precios de Inmuebles por Estrato",
       x = "Estrato",
       y = "Precio del Inmueble") +
  theme_minimal() +
  scale_fill_manual(values = c("3" = "#4BC0D9", "4" = "#76E5FC", "5" = "#9DACFF", "6" = "#6457A6"))

# Mostrar la gráfica de boxplots por estrato con colores personalizados
print(grafica_boxplots_estrato)

Aqui evidentemente se puede contemplar que los precios aumentan conforme cambia el nivel del estrato socioeconomico.

TIPO DE VIVIENDAS MAS VENDIDAS EN CALI

Tomando en cuenta la base suministrada y los primeros análisis realizados, podemos establecer que los apartamentos son el tipo de vivienda mas vendida en la Ciudad de Cali. Sin embargo, para hacer un análisis mas profundo al respecto, podríamos analizar las características de los inmuebles dependiendo de sus características (area) y prestaciones (numero de habitaciones, baños, parqueaderos).

Primero, estableceremos un rango para clasificar los inmuebles por el área. Para ello, calcularemos los deciles dependiendo del precio del inmueble para así establecer 10 rangos posibles de área:

# Calcular los deciles
deciles_area <- quantile(VivCali_ConID$areaconst, probs = seq(0.1, 0.9, by = 0.1))
print(deciles_area)
##    10%    20%    30%    40%    50%    60%    70%    80%    90% 
##  60.00  73.00  86.48 102.00 123.00 153.00 200.00 258.00 350.00

Tomando en cuenta estos resultados, generaremos una columna adicional para clasificar cada registro dentro de estos rangos de area:

# Establecer los límites de los rangos de área por metro cuadrado
rangos_area <- c(0, 60, 73, 86.48, 102, 123, 153, 200, 258, 350, Inf)

# Crear una columna con los rangos de área
VivCali_ConID <- VivCali_ConID %>%
  mutate(rango_area = case_when(
    areaconst < 60.00 ~ "1 - Menor a 60",
    areaconst < 73.00 ~ "2 - 60 a 72.99",
    areaconst < 86.48 ~ "3 - 73 a 86.47",
    areaconst < 102.00 ~ "4 - 86.48 a 101.99",
    areaconst < 123.00 ~ "5 - 102 a 122.99",
    areaconst < 153.00 ~ "6 - 123 a 152.99",
    areaconst < 200.00 ~ "7 - 153 a 199.99",
    areaconst < 258.00 ~ "8 - 200 a 257.99",
    areaconst < 350.00 ~ "9 - 258 a 349.99",
    TRUE ~ "10 - Mayor o igual a 350"
  ))

# Crear el gráfico de barras con etiquetas de datos
ggplot(data = VivCali_ConID, aes(x = rango_area)) +
  geom_bar(fill = "#17255A") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, color = "black") +
  labs(title = "Cantidad de Inmuebles en Rangos de area por Metro Cuadrado",
       x = "Rango de area",
       y = "Cantidad de Inmuebles") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Ahora, conforme a este ejercicio de area, podríamos incluir un analisis por cada una de las prestaciones de los inmuebles.

Teniendo en cuenta que los datos de zona,estrato y tipo son variables con un peso importante dentro del análisis, no las incluiremos dentro del análisis por prestaciones ya que al incluirlas marcarían una preferencia por el grado de volumen de registros que se manejan en cada uno de estos datos.

Tendremos que encontrar los outliers dentro de las variables que usaremos para identificar las prestaciones:

  • Para la variable Habitaciones, estableceremos por defecto que los rangos seran: 1,2,3,4 o mayor a 4
#rango de habitaciones
VivCali_ConID <- VivCali_ConID %>%
  mutate(rango_habitaciones = case_when(
    habitac < 1 ~ "0 - Sin Info",
    habitac < 2 ~ "1",
    habitac < 3 ~ "2",
    habitac < 4 ~ "3",
    habitac < 5 ~ "4",
    TRUE ~ "5 - Mayor a 4"
  )) 

# Crear el gráfico de barras con etiquetas de datos
ggplot(data = VivCali_ConID, aes(x = rango_habitaciones)) +
  geom_bar(fill = "#F5E2C8") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, color = "black") +
  labs(title = "Cantidad de Inmuebles en Rangos de habitaciones",
       x = "Num. Habitaciones",
       y = "Cantidad de Inmuebles") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Para la variable Parqueadero, estableceremos por defecto que los rangos seran: 1,2,3 o mayor a 3
#rango de parqueaderos
VivCali_ConID <- VivCali_ConID %>%
  mutate(rango_parq = case_when(
    parquea < 1 ~ "0 - Sin Info",
    parquea < 2 ~ "1",
    parquea < 3 ~ "2",
    parquea < 4 ~ "3",
    TRUE ~ "4 - Mayor a 3"
  )) 

# Crear el gráfico de barras con etiquetas de datos
ggplot(data = VivCali_ConID, aes(x = rango_parq)) +
  geom_bar(fill = "#D88373") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, color = "black") +
  labs(title = "Cantidad de Inmuebles en Rangos de Parqueaderos",
       x = "Num. Parqueaderos",
       y = "Cantidad de Inmuebles") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Para la variable Baños, estableceremos por defecto que los rangos seran: 1,2,3 o mayor a 3
#rango de baños
VivCali_ConID <- VivCali_ConID %>%
  mutate(rango_banios = case_when(
    banios < 1 ~ "0 - Sin Info",
    banios < 2 ~ "1",
    banios < 3 ~ "2",
    banios < 4 ~ "3",
    TRUE ~ "4 - Mayor a 3"
  )) 

# Crear el gráfico de barras con etiquetas de datos
ggplot(data = VivCali_ConID, aes(x = rango_banios)) +
  geom_bar(fill = "#BD1E1E") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, color = "black") +
  labs(title = "Cantidad de Inmuebles en Rangos de Banios",
       x = "Num. Banios",
       y = "Cantidad de Inmuebles") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

En relación a la variable Piso, no hay suficiente contexto para establecer a que hace referencia esta variable. Esto teniendo en cuenta que los valores de esta variable estan entre 1 y 12 y desconocemos si hace referencia a la cantidad de pisos con la que cuenta el inmueble o al numero de piso donde se encuentra ubicado.

#Relación entre las variables de area construida y piso
ggplot(VivCali_ConID, aes(y=areaconst , x=piso))+
facet_wrap(~ tipo)+ 
stat_smooth(method = "loess", formula =y ~ x)  # ajuste de modelo 
## Warning: Removed 2638 rows containing non-finite values (`stat_smooth()`).
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : pseudoinverse used at 0.955
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : neighborhood radius 2.045
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : reciprocal condition number 3.5619e-15
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric,
## : There are other near singularities as well. 1
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 0.955
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 2.045
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 3.5619e-15
## Warning in predLoess(object$y, object$x, newx = if (is.null(newdata)) object$x
## else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 1

Una vez establecidos los rangos, podríamos combinar estas variables para establecer cuales son los tipos de inmuebles mas vendidos conforme a estas prestaciones.

# Crear una nueva columna combinando los rangos de área, habitaciones, parqueaderos y baños
VivCali_ConID <- VivCali_ConID %>%
  mutate(combined_range = paste(rango_area, rango_habitaciones, rango_parq, rango_banios, sep = " | "))

# Contar los registros por cada combinación de rangos y ordenar de manera descendente
tabla_combinada <- VivCali_ConID %>%
  group_by(combined_range) %>%
  summarise(cantidad = n()) %>%
  arrange(desc(cantidad))

# Mostrar la tabla combinada
print(tabla_combinada)
## # A tibble: 497 × 2
##    combined_range                                                       cantidad
##    <chr>                                                                   <int>
##  1 2 - 60 a 72.99 | 3 | 1 | 2                                                442
##  2 3 - 73 a 86.47 | 3 | 1 | 2                                                433
##  3 4 - 86.48 a 101.99 | 3 | 1 | 2                                            212
##  4 5 - 102 a 122.99 | 3 | 2 | 3                                              193
##  5 2 - 60 a 72.99 | 2 | 1 | 2                                                167
##  6 4 - 86.48 a 101.99 | 3 | 1 | 3                                            166
##  7 10 - Mayor o igual a 350 | 5 - Mayor a 4 | 4 - Mayor a 3 | 4 - Mayo…      165
##  8 6 - 123 a 152.99 | 3 | 2 | 3                                              158
##  9 2 - 60 a 72.99 | 3 | 0 - Sin Info | 2                                     145
## 10 7 - 153 a 199.99 | 4 | 2 | 4 - Mayor a 3                                  138
## # ℹ 487 more rows

Como resultado de este ejercicio, podemos identificar que los apartamentos que mas se venden en Cali son aquellos que tienen un area entre 60 y 73 metros cuadrados, 3 habitaciones, 1 parqueadero y dos baños (442) registros. Sin embargo, si revisamos con detalle esta información y tomaramos rangos de área más amplios, podríamos identificar que el grupo de viviendas con áreas menores a 86 metros cuadrados son los que mas se venden en la ciudad.

Ahora, teniendo en cuenta esta información, podríamos generar análisis por zona de estos resultados, para encontrar el detalle del tipo de viviendas que más se vende por zona:

###Zona Norte
# Filtrar los datos para la Zona Norte
datos_norte <- VivCali_ConID %>%
filter(zona == "Zona Norte")

# Contar el número de registros por rango combinado
conteo_por_rango <- datos_norte %>%
  group_by(combined_range) %>%
  summarize(Cantidad = n()) %>%
  arrange(desc(Cantidad)) %>%
  top_n(10, wt = Cantidad)

# Crear el gráfico de barras
grafico_barras <- ggplot(conteo_por_rango, aes(x = reorder(combined_range, Cantidad), y = Cantidad)) +
  geom_bar(stat = "identity", fill = "#A6ECE0") +
  labs(title = "Top 10 de tipo de viviendas en Zona Norte",
       x = "Rango Combinado",
       y = "Cantidad de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras)

###Zona Sur
# Filtrar los datos para la Zona Norte
datos_sur <- VivCali_ConID %>%
  filter(zona == "Zona Sur")

# Contar el número de registros por rango combinado
conteo_por_rango <- datos_sur %>%
  group_by(combined_range) %>%
  summarize(Cantidad = n()) %>%
  arrange(desc(Cantidad)) %>%
  top_n(10, wt = Cantidad)

# Crear el gráfico de barras
grafico_barras_sur <- ggplot(conteo_por_rango, aes(x = reorder(combined_range, Cantidad), y = Cantidad)) +
  geom_bar(stat = "identity", fill = "#7ADFBB") +
  labs(title = "Top 10 de tipo de viviendas en Zona Sur",
       x = "Rango Combinado",
       y = "Cantidad de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras_sur)

###Zona Oeste
# Filtrar los datos para la Zona Norte
datos_Oeste <- VivCali_ConID %>%
  filter(zona == "Zona Oeste")

# Contar el número de registros por rango combinado
conteo_por_rango <- datos_Oeste %>%
  group_by(combined_range) %>%
  summarize(Cantidad = n()) %>%
  arrange(desc(Cantidad)) %>%
  top_n(10, wt = Cantidad)

# Crear el gráfico de barras
grafico_barras_Oeste <- ggplot(conteo_por_rango, aes(x = reorder(combined_range, Cantidad), y = Cantidad)) +
  geom_bar(stat = "identity", fill = "#4E6E58") +
  labs(title = "Top 10 de tipo de viviendas en Zona Oeste",
       x = "Rango Combinado",
       y = "Cantidad de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras_Oeste)

###Zona Oriente
# Filtrar los datos para la Zona Norte
datos_Oriente <- VivCali_ConID %>%
  filter(zona == "Zona Oriente")

# Contar el número de registros por rango combinado
conteo_por_rango <- datos_Oriente %>%
  group_by(combined_range) %>%
  summarize(Cantidad = n()) %>%
  arrange(desc(Cantidad)) %>%
  top_n(10, wt = Cantidad)

# Crear el gráfico de barras
grafico_barras_Oriente <- ggplot(conteo_por_rango, aes(x = reorder(combined_range, Cantidad), y = Cantidad)) +
  geom_bar(stat = "identity", fill = "#4C8577") +
  labs(title = "Top 10 de tipo de viviendas en Zona Oriente",
       x = "Rango Combinado",
       y = "Cantidad de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras_Oriente)

###Zona Centro
# Filtrar los datos para la Zona Norte
datos_Centro <- VivCali_ConID %>%
  filter(zona == "Zona Centro")

# Contar el número de registros por rango combinado
conteo_por_rango <- datos_Centro %>%
  group_by(combined_range) %>%
  summarize(Cantidad = n()) %>%
  arrange(desc(Cantidad)) %>%
  top_n(10, wt = Cantidad)

# Crear el gráfico de barras
grafico_barras_Centro <- ggplot(conteo_por_rango, aes(x = reorder(combined_range, Cantidad), y = Cantidad)) +
  geom_bar(stat = "identity", fill = "#544B3D") +
  labs(title = "Top 10 de tipo de viviendas en Zona Centro",
       x = "Rango Combinado",
       y = "Cantidad de Registros") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras_Centro)

ANALISIS DE PRECIOS RESPECTO A LAS CUALIDADES DEL INMUEBLE

Teniendo en cuenta que el área de los inmuebles es importante para establecer un precio de venta adecuado, es necesario contar con información que nos permita conocer el precio promedio de los inmuebles, teniendo en cuenta sus características. Para ello, construiremos un conjunto de visuales que nos permita conocer estos datos.

Por ejemplo, es importante conocer el precio promedio de los inmuebles, dependiendo del tipo, respecto al área disponible:

# Definir colores por tipo de inmueble
colores_tipo <- c("casa" = "#3fbdc3", "apartamento" = "#f07b70")

# Calcular el precio promedio por rango de áreas y tipo de inmueble
precio_promedio_por_area_tipo <- VivCali_ConID %>%
  group_by(rango_area, tipo) %>%
  summarize(PrecioPromedio = mean(preciom, na.rm = TRUE))
## `summarise()` has grouped output by 'rango_area'. You can override using the
## `.groups` argument.
# Crear el gráfico de barras con etiquetas de datos y colores
grafico_barras <- ggplot(precio_promedio_por_area_tipo, aes(x = reorder(rango_area, PrecioPromedio), y = PrecioPromedio, fill = tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("$%.2f", PrecioPromedio)), position = position_dodge(width = 0.9), vjust = -0.3, size = 3) +
  labs(title = "Precio Promedio del Inmueble por Rango de Áreas y Tipo",
       x = "Rango de Áreas",
       y = "Precio Promedio del Inmueble") +
  scale_fill_manual(values = colores_tipo) +  # Asignar colores por tipo de inmueble
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras
print(grafico_barras)

Además, podemos generar este mismo tipo de gráfico dependiendo de la zona en la que quisieramos conocer este análisis. A manera de ejemplo, utilizaremos la Zona Norte:

# Definir colores por tipo de inmueble
colores_tipo <- c("casa" = "#3fbdc3", "apartamento" = "#f07b70")

# Filtrar los datos para la Zona Norte
datos_zona_norte <- VivCali_ConID %>% 
  filter(zona == "Zona Norte")

# Calcular el precio promedio por rango de áreas y tipo de inmueble para la Zona Norte
precio_promedio_por_area_tipo_norte <- datos_zona_norte %>%
  group_by(rango_area, tipo) %>%
  summarize(PrecioPromedio = mean(preciom, na.rm = TRUE))
## `summarise()` has grouped output by 'rango_area'. You can override using the
## `.groups` argument.
# Crear el gráfico de barras con etiquetas de datos y colores para la Zona Norte
grafico_barras_norte <- ggplot(precio_promedio_por_area_tipo_norte, aes(x = reorder(rango_area, PrecioPromedio), y = PrecioPromedio, fill = tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("$%.2f", PrecioPromedio)), position = position_dodge(width = 0.9), vjust = -0.3, size = 3) +
  labs(title = "Precio Promedio del Inmueble por Rango de Áreas y Tipo (Zona Norte)",
       x = "Rango de Áreas",
       y = "Precio Promedio del Inmueble") +
  scale_fill_manual(values = colores_tipo) +  # Asignar colores por tipo de inmueble
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Mostrar el gráfico de barras para la Zona Norte
print(grafico_barras_norte)

La compañia podría tomar como ejemplo este análisis para realizar este estudio a un nivel de detalle de Barrio, dependiendo de sus necesidades.

Al igual que es importante conocer la cantidad de inmuebles por las prestaciones de cada uno, también es importante conocer el precio promedio para cada uno de ellos. Por lo que también es posible generar una tabla con esta información que puede servir a manera de guia para establecer un precio aproximado para los inmuebles, dependiendo de sus características (solo mostraremos el top 10):

# Calcular el número de inmuebles, precio promedio y agrupar por combined_range
tabla_resumen <- VivCali_ConID %>%
  group_by(combined_range) %>%
  summarize(NumInmuebles = n(),
            PrecioPromedio = mean(preciom, na.rm = TRUE)) %>%
  arrange(desc(NumInmuebles)) %>%  # Ordenar de mayor a menor por número de inmuebles
  head(10)  # Mostrar solo el top 10

# Mostrar la tabla resumen
print(tabla_resumen)
## # A tibble: 10 × 3
##    combined_range                                    NumInmuebles PrecioPromedio
##    <chr>                                                    <int>          <dbl>
##  1 2 - 60 a 72.99 | 3 | 1 | 2                                 442           181.
##  2 3 - 73 a 86.47 | 3 | 1 | 2                                 433           240.
##  3 4 - 86.48 a 101.99 | 3 | 1 | 2                             212           276.
##  4 5 - 102 a 122.99 | 3 | 2 | 3                               193           392.
##  5 2 - 60 a 72.99 | 2 | 1 | 2                                 167           205.
##  6 4 - 86.48 a 101.99 | 3 | 1 | 3                             166           286.
##  7 10 - Mayor o igual a 350 | 5 - Mayor a 4 | 4 - M…          165          1119.
##  8 6 - 123 a 152.99 | 3 | 2 | 3                               158           463.
##  9 2 - 60 a 72.99 | 3 | 0 - Sin Info | 2                      145           150.
## 10 7 - 153 a 199.99 | 4 | 2 | 4 - Mayor a 3                   138           571.

Esta misma información la podemos mostrar por tipo de inmueble y por zona geográfica. Podríamos añadir el barrio, pero la información estaría muy granulada para esta revisión:

# Calcular el número de inmuebles, precio promedio y agrupar por tipo, zona y combined_range
tabla_resumen_tipo_zona <- VivCali_ConID %>%
  group_by(tipo, zona, combined_range) %>%
  summarize(NumInmuebles = n(),
            PrecioPromedio = mean(preciom, na.rm = TRUE)) %>%
  arrange(desc(NumInmuebles)) %>%  # Ordenar de mayor a menor por número de inmuebles
  head(10)  # Mostrar solo el top 10
## `summarise()` has grouped output by 'tipo', 'zona'. You can override using the
## `.groups` argument.
# Mostrar la tabla resumen con el orden de columnas especificado
print(tabla_resumen_tipo_zona)
## # A tibble: 10 × 5
## # Groups:   tipo, zona [3]
##    tipo        zona       combined_range             NumInmuebles PrecioPromedio
##    <chr>       <chr>      <chr>                             <int>          <dbl>
##  1 apartamento Zona Sur   2 - 60 a 72.99 | 3 | 1 | 2          329           188.
##  2 apartamento Zona Sur   3 - 73 a 86.47 | 3 | 1 | 2          315           239.
##  3 apartamento Zona Sur   4 - 86.48 a 101.99 | 3 | …          139           275.
##  4 casa        Zona Sur   10 - Mayor o igual a 350 …          126          1169.
##  5 apartamento Zona Sur   4 - 86.48 a 101.99 | 3 | …          114           283.
##  6 apartamento Zona Sur   2 - 60 a 72.99 | 2 | 1 | 2          111           200.
##  7 apartamento Zona Norte 3 - 73 a 86.47 | 3 | 1 | 2          102           244.
##  8 apartamento Zona Sur   5 - 102 a 122.99 | 3 | 2 …           96           374.
##  9 apartamento Zona Norte 2 - 60 a 72.99 | 3 | 1 | 2           91           165.
## 10 apartamento Zona Sur   2 - 60 a 72.99 | 3 | 0 - …           81           157.

RESULTADOS

La revisión de los resultados obtenidos a partir del análisis estadístico brinda una visión integral y valiosa sobre el mercado inmobiliario en Cali. A continuación, se presentan los principales hallazgos y conclusiones derivados de este estudio:

CONCLUSIONES

Este análisis estadístico detallado proporciona una visión valiosa y detallada del mercado inmobiliario en la ciudad de Cali. Las conclusiones extraídas de este estudio ofrecen información crucial para la toma de decisiones estratégicas por parte de la empresa B&C (Bines y Casas). A continuación, se presentan las principales conclusiones obtenidas:

  1. Segmentación Geográfica Significativa: Se evidenció una variación sustancial en los precios de las viviendas entre diferentes zonas de Cali. La Zona Norte destaca por sus precios promedio más elevados, mientras que la Zona Sur registra valores más bajos. Esta segmentación geográfica proporciona a B&C una base sólida para adaptar su enfoque de marketing y estrategia de precios según la demanda específica de cada zona.

  2. Dinamismo en la Demanda de Propiedades: El análisis de preferencias de tipo de vivienda reveló una mayor inclinación hacia los apartamentos en comparación con las casas. Esta tendencia sugiere que B&C puede beneficiarse al dirigir sus esfuerzos hacia la promoción y venta de apartamentos, aprovechando la demanda predominante en el mercado.

  3. Características Clave en la Toma de Decisiones: La presencia de características como parqueaderos y baños adicionales influye de manera significativa en el precio de las propiedades. Esta conclusión subraya la importancia de considerar estas comodidades al establecer precios y estrategias de comercialización, permitiendo a B&C satisfacer las necesidades y deseos de sus clientes de manera más efectiva.

  4. Identificación de Oportunidades de Negocio: El análisis de segmentación y agrupación identificó nichos de mercado específicos que podrían haber pasado desapercibidos. Esta información brinda a B&C la oportunidad de enfocar sus recursos en áreas y tipos de propiedades con potencial de crecimiento y demanda latente, lo que podría impulsar su participación en el mercado.

  5. Relación Entre Área y Precio: Se estableció una relación directa entre el área construida y el precio de las viviendas. A medida que el área aumenta, el precio promedio también tiende a aumentar. Esta relación es esencial para la estrategia de fijación de precios de B&C, permitiéndoles tomar decisiones informadas al valorar propiedades de diferentes tamaños.

En conclusión, este informe estadístico brinda a la empresa B&C una visión integral y fundamentada sobre el mercado inmobiliario en Cali. Las conclusiones obtenidas a partir del análisis de datos permiten a la empresa adaptar su enfoque estratégico, identificar oportunidades de negocio y ofrecer servicios personalizados a sus clientes. Con esta información en mano, B&C está en una posición sólida para tomar decisiones informadas y alcanzar el éxito en el competitivo entorno del mercado inmobiliario.