1. Introducción

El mercado de bienes raíces en Cali ha experimentado un notable crecimiento en los últimos años, impulsado por diversos factores como el aumento de la población, la atracción de inversiones extranjeras directas y el desarrollo de nuevos proyectos inmobiliarios. En los años 2021 y 2022, las ventas en el sector alcanzaron cifras significativas de $6700 millones y $6100 millones, respectivamente. Se proyecta que este mercado continuará expandiéndose en el futuro, lo que generará un impacto dinámico en la economía regional. En el presente informe realizaremos un análisis descriptivo del mercado inmobiliario en Cali, que servirá de insumo para la toma de decisiones e identificación de oportunidades de negocio.

2. Objetivos

3. Métodos

3.1. Recopilación de datos

# Importación de datos
Data_Vivienda <- readRDS("C:\\Users\\sebas\\OneDrive\\Maestria\\Semestre 1\\Métodos y Simulación Estadística\\Actividad 1\\Evaluación 1\\data_vivienda_Cali.RDS")

3.2. Exploración de datos

# Vista global de las variables
glimpse(Data_Vivienda)
## 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, …

Observamos que la data cuenta con una dimensión de 13 variables y 8330 viviendas. Para las variables tenemos las siguientes:

  • id = identificador único del inmueble en la data.
  • zona = ubicación geográfica de la ciudad de Cali dividido por zonas.
  • piso = piso en el que se encuenta el inmueble.
  • estrato = clasificación utilizada para categorizar en base a factores socioeconómicos.
  • preciom = precio del inmueble en millones.
  • areaconst = superficie total del inmueble.
  • parquea = cantidad de parqueaderos por inmueble.
  • banios = cantidad de baños por inmueble.
  • habitac = número de habitaciones por inmueble.
  • tipo = clasificación categórica para el tipo de imnueble (casa / apto).
  • barrio = barrio en que se encuentra el inmueble de acuerdo a zona geográfica.
  • latitud = coordenada que indica la posición norte-sur de un punto respecto al ecuador terrestre.
  • longitud = coordenada que indica la posición este-oeste de un punto respecto al meridiano de greenwich.

Adicionalmente, notamos variables variables categóricas que no tienen el formato adecuado.

# Transformación de tipo de variables
Data_Vivienda %>% 
  mutate(zona = factor(zona),
         estrato = factor(estrato, levels = c(3,4,5,6), ordered = TRUE),
         tipo = factor(tipo))
## # A tibble: 8,330 × 13
##       id zona        piso estrato preciom areaconst parquea banios habitac tipo 
##    <dbl> <fct>      <dbl> <ord>     <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <fct>
##  1  8312 Zona Oeste     4 6          1300       318       2      4       2 Apar…
##  2  8311 Zona Oeste     1 6           480       300       1      4       4 Casa 
##  3  8307 Zona Oeste    NA 5          1200       800       4      7       5 Casa 
##  4  8296 Zona Sur       2 3           220       150       1      2       4 Casa 
##  5  8297 Zona Oeste    NA 5           330       112       2      4       3 Casa 
##  6  8298 Zona Sur      NA 5          1350       390       8     10      10 Casa 
##  7  8299 Zona Sur       2 6           305       125       2      3       3 Apar…
##  8  8300 Zona Oeste    NA 5           480       280       4      4       4 Apar…
##  9  8286 Zona Sur      NA 5           275        74       1      2       3 Apar…
## 10  8287 Zona Sur       2 5           285       120       2      4       3 Apar…
## # ℹ 8,320 more rows
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Enfoque detallado de la data
skimr::skim(Data_Vivienda)
Data summary
Name Data_Vivienda
Number of rows 8330
Number of columns 13
_______________________
Column type frequency:
character 3
numeric 10
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
zona 3 1 8 12 0 5 0
tipo 3 1 4 11 0 6 0
barrio 3 1 4 29 0 436 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 3 1.00 4163.99 2403.93 1.00 2082.50 4164.00 6245.50 8319.00 ▇▇▇▇▇
piso 2641 0.68 3.77 2.62 1.00 2.00 3.00 5.00 12.00 ▇▃▁▁▁
estrato 3 1.00 4.63 1.03 3.00 4.00 5.00 5.00 6.00 ▅▆▁▇▆
preciom 2 1.00 434.24 329.02 58.00 220.00 330.00 540.00 1999.00 ▇▂▁▁▁
areaconst 3 1.00 174.99 142.95 30.00 80.00 123.00 229.00 1745.00 ▇▁▁▁▁
parquea 1606 0.81 1.84 1.13 1.00 1.00 2.00 2.00 10.00 ▇▁▁▁▁
banios 3 1.00 3.11 1.43 0.00 2.00 3.00 4.00 10.00 ▇▇▃▁▁
habitac 3 1.00 3.61 1.46 0.00 3.00 3.00 4.00 10.00 ▂▇▂▁▁
longitud 3 1.00 -21845.13 34503.90 -76576.00 -76506.00 -76.54 -76.52 -76.46 ▃▁▁▁▇
latitud 3 1.00 970.37 1539.16 3.33 3.39 3.45 3367.00 3497.00 ▇▁▁▁▃

En el análisis de las variables de tipo carácter, se ha observado una cantidad inusualmente alta de valores únicos para la variable ‘tipo’, lo que sugiere la presencia de posibles inconsistencias en los datos. Por otro lado, al examinar las variables de tipo numérico, se destaca que ‘piso’ presenta un porcentaje significativo del 31% de datos faltantes, seguido de ‘parquea’ con un 20%. Además, se ha notado que en la mayoría de las variables existen tres registros con datos faltantes, lo cual podría indicar la presencia de información incompleta para ciertas viviendas.

3.3. Limpieza de datos

3.3.1 Estandarización
# Valores únicos para el tipo de vivienda
unique(Data_Vivienda$tipo)
## [1] "Apartamento" "Casa"        "APARTAMENTO" "casa"        "CASA"       
## [6] "apto"        NA
# Estandarización de variable 'tipo'
Data_Vivienda <- Data_Vivienda %>% 
  mutate(tipo = str_to_lower(tipo))
unique(Data_Vivienda$tipo)
## [1] "apartamento" "casa"        "apto"        NA
# Unificación de variable tipo apartamento
Data_Vivienda <- Data_Vivienda %>% 
  mutate(tipo = str_replace(tipo, "apto", "apartamento"))
unique(Data_Vivienda$tipo)
## [1] "apartamento" "casa"        NA
3.3.2 Filas Datos faltantes
# Contabilizar las filas con valores faltantes mayores al 77% o 10/13
filas_NA <- Data_Vivienda %>% 
  mutate(num_faltantes = rowSums(is.na(.))) %>% 
  filter(num_faltantes >= 10)
filas_NA
## # A tibble: 3 × 14
##      id zona   piso estrato preciom areaconst parquea banios habitac tipo 
##   <dbl> <chr> <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr>
## 1    NA <NA>     NA      NA      NA        NA      NA     NA      NA <NA> 
## 2    NA <NA>     NA      NA      NA        NA      NA     NA      NA <NA> 
## 3    NA <NA>     NA      NA     330        NA      NA     NA      NA <NA> 
## # ℹ 4 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>,
## #   num_faltantes <dbl>

Observamos que del conjunto de datos, las filas con una cantidad de faltantes mayor o igual al 77% corresponden a los tres elementos que no tienen valor en la variable ‘id’.

# Eliminación de las filas
Data_Vivienda2 <- Data_Vivienda[complete.cases(Data_Vivienda$id),]
str(Data_Vivienda2)
## tibble [8,327 × 13] (S3: tbl_df/tbl/data.frame)
##  $ id       : num [1:8327] 8312 8311 8307 8296 8297 ...
##  $ zona     : chr [1:8327] "zona oeste" "zona oeste" "zona oeste" "zona sur" ...
##  $ piso     : num [1:8327] 4 1 NA 2 NA NA 2 NA NA 2 ...
##  $ estrato  : num [1:8327] 6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : num [1:8327] 1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num [1:8327] 318 300 800 150 112 390 125 280 74 120 ...
##  $ parquea  : num [1:8327] 2 1 4 1 2 8 2 4 1 2 ...
##  $ banios   : num [1:8327] 4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : num [1:8327] 2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr [1:8327] "apartamento" "casa" "casa" "casa" ...
##  $ barrio   : chr [1:8327] "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num [1:8327] -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num [1:8327] 3454 3454 3455 3417 3408 ...
3.3.4 Valores duplicados
# Valores duplicados
Valores_duplicados <- Data_Vivienda2$id[duplicated(Data_Vivienda2$id)]
Valores_duplicados
## [1] 8309 8310 8313 8314 8315 8316 8317 8318

Realizamos una identificación de valores duplicados donde encontramos una cantidad de 8 elementos para la variable ‘id’. Posteriormente, realizamos la eliminación de esos valores.

# Eliminación de valores duplicados
Data_Vivienda3 <- Data_Vivienda2 %>% 
  distinct(id, .keep_all = TRUE)
3.3.5 Columnas Datos faltantes
# Análisis de valores faltantes para 'piso'
Valores_NA_piso <- Vivienda %>% 
  filter(is.na(piso))

ggplot(Valores_NA_piso, aes(x = tipo)) +
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "white") +
  labs(title = "Valores NA 'piso'",
       x = "Tipo",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +
  theme_light()
## 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.

# Análisis valores faltantes para 'piso' por estrato
ggplot(Valores_NA_piso, aes(x = estrato, fill = tipo)) + 
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "White") +
  labs(title = "Valores NA Piso",
       x = "Estrato",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +
  theme_light()

Descubrimos que en relación a la variable ‘piso’, existe una ausencia de datos que equivale al 31.6%. Esta carencia es más pronunciada en las viviendas de tipo apartamento. Al considerar la estratificación, notamos que el estrato 5 exhibe la mayor cantidad de valores faltantes, seguido por el estrato 6. Por otro lado, el estrato más bajo (estrato 3) muestra la proporción más alta en lo que respecta a las viviendas de tipo casa.

# Análisis valores faltantes para 'parquea'
Valores_NA_parquea <- Vivienda %>% 
  filter(is.na(parquea))

ggplot(Valores_NA_parquea, aes(x = tipo)) +
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "white") +
  labs(title = "Valores NA Parqueadero",
       x = "Tipo",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +
  theme_light()

# Análisis valores faltantes de 'parquea' por estrato
ggplot(Valores_NA_parquea, aes(x = estrato, fill = tipo)) + 
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "white") +
  labs(title = "Valores NA Parqueadero",
       x = "Estrato",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +
  theme_light()

En relación con la variable ‘parquea’ obtuvimos un 19.2% de datos faltantes marcada por una mayor cantidad en las viviendas de tipo apartamento. En cuanto a la estratificación, se observa una tendencia descendente de los estratos más bajos hacia los altos. Para los dos casos (parqueadero y piso), se pueden aplicar estrategías para tratar datos faltantes, tales como, imputación, eliminación y entre otros.

3.4. Análisis descriptivo

3.4.1. Variables númericas

a) Precio

La variable ‘preciom’ representa el precio del inmueble en millones de pesos COP. Se realiza el cálculo de la mediana, rangos mínimos, máximos y la distribución de los precios mediante la visualización de un histograma . Adicionalmente, un diagrama de caja para observar posibles valores atípicos de forma visual y mediante el cálculo de IQR.

# Rangos minimo, máximos y mediana
summary(Vivienda$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   220.0   330.0   433.9   540.0  1999.0
# Histograma de los precios
Preciom_hist <- Vivienda %>% 
  ggplot(aes(preciom)) +
  geom_histogram() + 
  labs(title = "Distribución Precio",
       y = "Densidad",
       x = "Precio en millones (COP)")
Preciom_hist
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Se identifican posibles valores atípicos

# Identificación de valores atípicos mediante IQR
iqr_precio <- quantile(Vivienda$preciom, 0.75) - quantile(Vivienda$preciom, 0.25)
umbral_inferior_precio <- quantile(Vivienda$preciom, 0.25) - 1.5 * iqr_precio
umbral_superior_precio <- quantile(Vivienda$preciom, 0.75) + 1.5 * iqr_precio
outliers_precio <- Vivienda %>% 
  filter(preciom < umbral_inferior_precio | preciom > umbral_superior_precio)
summary(outliers_precio$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1050    1200    1300    1371    1500    1999

Se identifica que para los valores atipicos con respecto a los precios tienen un rango de $1.050 millones a $1.999 millones de pesos COP.

# Diagrama Caja con IQR
ggplot(Vivienda, aes(x = "", y = preciom)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_point(data = outliers_precio, aes(x = 1, y = preciom), color = "black", size = 3) +
  geom_hline(yintercept = c(umbral_inferior_precio, umbral_superior_precio), 
             linetype = "dashed", color = "red", size = 1) +
  labs(title = "Valores Atípicos",
       x = "",
       y = "Precio en millones (COP)") +
  theme_minimal() +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Se presentan una cantidad de 552 observaciones como datos atípicos, debido a la cantidad, dispersión y representatividad de los mismos, se opta por no excluir ningún elemento para el precio de las viviendas.

# Histograma con densidad
Preciom_hist2 <- Vivienda %>% 
  ggplot(aes(preciom)) + 
  geom_histogram(aes(y = ..density..),fill = "yellow", color = "red") +
  geom_density(kernel = "gaussian") + 
  labs(title = "",
       x = "Precio en millones (COP)",
       y = "Densidad")
ggplotly(Preciom_hist2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Observamos en la distribucón de los precios una asimetría o sesgo positiva, es decir, muchos obtuvieron resultados bajos y unos pocos resultados altos. Por ende, la mejor forma de establecer su valor de centralidad es la mediana debido a que es menos sensible a valores extremos. Los precios presentan un rango entre los $58 y $1.999 millones de pesos, con un precio mediano de $330 millones de pesos y picos de frecuencia entre $230 y $300 millones de pesos.

# Diagrama caja según estrato
ggplot(Vivienda, aes(x = factor(estrato), y = preciom)) + 
  geom_boxplot() + 
  labs(title = "Según Estrato",
       x = "Estrato",
       y = "Precio en millones (COP)")

El precio mediano de las viviendas incrementa con respecto a la estratificación, sin embargo, el rango máximo es muy grande donde incluso el estrato 5 supera al estrato 6.

b) Área Construida

La variable ‘areaconst’ representa el área construida de las viviendas en metros cuadrados. Se realiza el cálculo de la mediana, rangos mínimos, máximos y la distribución del área mediante la visualización de un histograma. Adicionalmente, un diagrama de caja para observar posibles valores atípicos de forma visual y mediante el cálculo de IQR.

# Rangos minimo, máximos, media y mediana
summary(Vivienda$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    30.0    80.0   123.0   174.9   229.0  1745.0
# Histograma de área construida
areaconst_hist <- Vivienda %>% 
  ggplot(aes(areaconst)) +
  geom_histogram() + 
  labs(title = "Distribución Área Construida",
       y = "Densidad",
       x = "Metro cuadrado")
areaconst_hist
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Se identifican posibles valores atípicos

# Identificando valores atipicos
iqr_area <- quantile(Vivienda$areaconst, 0.75) - quantile(Vivienda$areaconst, 0.25)
umbral_inferior_area <- quantile(Vivienda$areaconst, 0.25) - 1.5 * iqr_area
umbral_superior_area <- quantile(Vivienda$areaconst, 0.75) + 1.5 * iqr_area
outliers_areaconst <- Vivienda %>% 
  filter(areaconst < umbral_inferior_area | areaconst > umbral_superior_area)
summary(outliers_areaconst$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   453.0   500.0   550.0   620.4   660.0  1745.0

Se identifica que para los valores atipicos con respecto al área construida, tienen un rango de $453 metros cuadrados a $1745 metros cuadrados.

# Diagrama Caja con IQR
ggplot(Vivienda, aes(x = "", y = areaconst)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_point(data = outliers_areaconst, aes(x = 1, y = areaconst), color = "black", size = 3) +
  geom_hline(yintercept = c(umbral_inferior_area, umbral_superior_area), 
             linetype = "dashed", color = "red", size = 1) +
  labs(title = "Valores Atípicos",
       x = "",
       y = "Metros cuadrados") +
  theme_minimal() +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

De acuerdo con lo anterior, identificamos los valores atípicos y determinamos los umbrales inferior y superior para la variable areaconst. Se encontraron 382 observaciones como valores atípicos. Se opta por no excluir ninguna observación debido a la posible relación del área construida, el precio de la vivienda y su estrato socieconómico.

# Histograma con densidad
areaconst_hist2 <- Vivienda %>% 
  ggplot(aes(areaconst)) + 
  geom_histogram(aes(y = ..density..),fill = "yellow", color = "red") +
  geom_density(kernel = "gaussian") +
  labs(title = "",
       x = "Metros cuadrados",
       y = "Densidad")
ggplotly(areaconst_hist2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Observamos en la distribucón de los precios una asimetría o sesgo positiva, es decir, muchos obtuvieron resultados bajos y unos pocos resultados altos. Por ende, la mejor forma de establecer su valor de centralidad es la mediana debido a que es menos sensible a valores extremos. El Área construida presentan un rango entre los 30 y 1.749 metros cuadrados, con un área mediana de 123 metros cuadrados y picos de frecuencia entre 30 y 140 metros cuadrados.

# Diagrama caja según estrato
ggplot(Vivienda, aes(x = factor(estrato), y = areaconst)) + 
  geom_boxplot() + 
  labs(title = "Según Estrato",
       x = "Estrato",
       y = "Metros Cuadrados")

El área mediana de las viviendas incrementa con respecto a la estratificación con excepción del estrato 3 al estrato 4. Asimismo, la desagregación por estrato nos permite ver posibles valores atípicos para cada uno de los niveles que antes de excluirlos es importante mirar su correlación con el precio de dicha vivienda.

# Correlación entre Precio y Área construida
Cor_Precio_area <- Vivienda %>% 
  select(preciom, areaconst) %>%
  cor() %>% 
  round(2)
Cor_Precio_area
##           preciom areaconst
## preciom      1.00      0.69
## areaconst    0.69      1.00
# Gráfico correlación 
ggplot(Vivienda, aes(x = areaconst, y = preciom)) +
  geom_point(color = "blue", alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Correlación Precio y Área Construida",
       x = "Metros Cuadrados",
       y = "Precio en millones (COP)") +
  theme_light()
## `geom_smooth()` using formula = 'y ~ x'

Como resultado tenemos un correlación de 0.69 entre el precio de la vivienda y área construida; indica una correlación positiva relativamente fuerte y se puede inferir que, en general, a medida que aumenta el área construida, tiende a aumentar su precio y viceversa. Para determinar causalidad implicaría análisis adicionales que no implican dentro de los objetivos del presente informe.

3.4.2. Variables cualitativas

a) Zona Geográfica

La variable ‘zona’ representa la ubicación de las viviendas de acuerdo con las zonas definidas para la ciudad de Cali.

zona_tabla <- table(Vivienda$zona) %>% 
  prop.table()*100 
round(zona_tabla, 2)
## 
##  zona centro   zona norte   zona oeste zona oriente     zona sur 
##         1.49        23.08        14.40         4.22        56.81

Observamos una proporción del 56.81% para la zona sur seguido de la zona norte con el 23.08%.

b) Tipo

La variable ‘tipo’ discrimina las viviendas entre apartamento y casa.

tipo_tabla <- table(Vivienda$tipo) %>% 
  prop.table()*100
round(tipo_tabla, 2)
## 
## apartamento        casa 
##       61.29       38.71

Dentro de las viviendas ofertadas se tiene una proporción mayor para los apartamentos con 61.29%.

4. Resultados

4.1. Distribución vivienda por estrato socieconómico

# Proporción de las viviendas
Vivienda %>% 
  count(estrato, tipo) %>%
  group_by(estrato) %>% 
  mutate(proporcion = n / sum(n) * 100) %>%
ggplot(aes(x = estrato, y = proporcion, fill = tipo)) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = scales::percent(proporcion / 100)), 
            position = position_stack(vjust = 0.5),
            color = "white") +
  labs(title = "Según Estrato",
       x = "Estrato",
       y = "%") +
  scale_fill_manual(values = Colors) + 
  theme_light()

# Cantidad de las viviendas
ggplot(Vivienda, aes(x = estrato, fill = tipo)) +
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "white") +
  labs(title = "Según Estrato",
       x = "Estrato",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +
  theme_light()

4.2. Distribución vivienda por zona geográfica

ggplot(Vivienda, aes(x = zona, fill = tipo)) +
  geom_bar(position = "stack") + 
  labs(title = "Según Zona Geográfica",
       x = "Zona",
       y = "Cantidad") +
  scale_fill_manual(values = Colors) +  
  theme_light()

4.3. Precio metro cuadrado

# Nueva variable metro cuadrado
Vivienda <- Vivienda %>% 
  mutate(metro_cuadrado = preciom / areaconst)

ggplot(Vivienda, aes(x = tipo, y = metro_cuadrado, fill = tipo)) +
  geom_bar(stat = "summary", fun = "median", position = "stack") +
  geom_text(stat = "summary", fun = "median", aes(label = scales::dollar(..y..)),
            position = position_stack(vjust = 0.5), color = "white") +
  labs(title = "Precio Mediano m^2",
       x = "Tipo",
       y = "Precio en millones (COP)") +
  scale_fill_manual(values = Colors) +
  theme_light()

# Según zona geográfica
ggplot(Vivienda, aes(x = tipo, y = metro_cuadrado, fill = zona)) +
  geom_bar(stat = "summary", fun = "median", position = "dodge") +
    geom_text(stat = "summary", fun = "median", aes(label = scales::dollar(..y..)),
            position = position_dodge(width = 0.9), vjust = -0.1) +
  labs(title = "Precio Mediano m^2",
       x = "Tipo",
       y = "Precio en millones (COP)",
       fill = "Zona Geográfica") +
  scale_fill_manual(values = Colors) +
  theme_light() + 
  theme(legend.position = "top")

# Según estrato
ggplot(Vivienda, aes(x = tipo, y = metro_cuadrado, fill = factor(estrato))) +
  geom_bar(stat = "summary", fun = "median", position = "dodge") +
  geom_text(stat = "summary", fun = "median", aes(label = scales::dollar(..y..)),
            position = position_dodge(width = 0.9), vjust = -0.1) +
  labs(title = "Precio Mediano m^2",
       x = "Tipo",
       y = "Precio en millones (COP)",
       fill = "Estrato") +
  scale_fill_manual(values = Colors) +
  theme_update() +
  theme(legend.position = "top")

4.4 Distribución de las viviendas según piso

ggplot(Piso, aes(x = factor(piso), fill = tipo)) + 
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..), position = position_stack(vjust = 0.5), color = "white", size = 2.5) + 
  labs(title = "",
       x = "Piso",
       y = "") +
  scale_fill_manual(values = Colors)

4.5 Distribucón de las viviendas según habitaciones

ggplot(Habitaciones, aes(x = factor(habitac), fill = tipo)) +
  geom_bar() + 
  labs(title = "",
       x = "Habitaciones",
       y = "") +
  scale_fill_manual(values = Colors)

5. Conclusiones