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.
# 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")
# 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:
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)
| 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.
# 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
# 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 ...
# 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)
# 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.
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.
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.
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%.
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%.
# 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()
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()
# 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")
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)
ggplot(Habitaciones, aes(x = factor(habitac), fill = tipo)) +
geom_bar() +
labs(title = "",
x = "Habitaciones",
y = "") +
scale_fill_manual(values = Colors)