library(readr)
Inmuebles_Disponibles_Para_La_Venta_20250509 <- read_csv("C:/Users/USUARIO/Documents/anlisisdedatos/Inmuebles_Disponibles_Para_La_Venta_20250515.csv")
## Rows: 448 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (8): Ciudad, Departamento, Barrio, Direccion, Detalle Disponibilidad, Es...
## dbl (4): Codigo, Area Terreno, Area Construida, Precio
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(Inmuebles_Disponibles_Para_La_Venta_20250509)
INMUEBLES <- Inmuebles_Disponibles_Para_La_Venta_20250509
nrow(INMUEBLES) # Número de filas (registros)
## [1] 448
ncol(INMUEBLES) # Número de columnas (variables)
## [1] 12
# - El dataset “Inmuebles_Disponibles_Para_La_Venta_20250509” cuenta con 448 registros que corresponden a las filas y con 12 columnas que corresponden a las variables.
# Ver estructura del dataset
str(INMUEBLES)
## spc_tbl_ [448 × 12] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Codigo : num [1:448] 17745 17778 17797 17798 12115 ...
## $ Ciudad : chr [1:448] "BOGOTA" "BOGOTA" "BOGOTA" "PEREIRA" ...
## $ Departamento : chr [1:448] "CUNDINAMARCA" "CUNDINAMARCA" "CUNDINAMARCA" "RISARALDA" ...
## $ Barrio : chr [1:448] NA NA NA NA ...
## $ Direccion : chr [1:448] "CALLE 22D NO. 120-19 -FONTIBÓN" "KR 77 H No. 65 C - 33 SUR" "CR 70 No. 49-77" "CALLES 18 Y 19 CARRERAS 5 Y 6 SALIDA CARRERA 5 No. 18 - 43 / CARRERA 5 CALLES 18 Y 19 No. 18 - 49 / CALLE "| __truncated__ ...
## $ Area Terreno : num [1:448] 0 0 0 0 6400000 ...
## $ Area Construida : num [1:448] 0 0 0 0 70000 ...
## $ Detalle Disponibilidad: chr [1:448] "COMERCIALIZABLE CON RESTRICCION" "COMERCIALIZABLE CON RESTRICCION" "COMERCIALIZABLE CON RESTRICCION" "COMERCIALIZABLE CON RESTRICCION" ...
## $ Estrato : chr [1:448] "INDUSTRIAL" "DOS" "CUATRO" "CINCO" ...
## $ Precio : num [1:448] 2.74e+14 2.71e+13 1.45e+13 4.33e+13 1.04e+13 ...
## $ Tipo de Inmueble : chr [1:448] "BODEGA" "LOTE CON CONSTRUCCION" "CASA" "CLINICA" ...
## $ Datos Adicionales : chr [1:448] NA NA NA NA ...
## - attr(*, "spec")=
## .. cols(
## .. Codigo = col_double(),
## .. Ciudad = col_character(),
## .. Departamento = col_character(),
## .. Barrio = col_character(),
## .. Direccion = col_character(),
## .. `Area Terreno` = col_double(),
## .. `Area Construida` = col_double(),
## .. `Detalle Disponibilidad` = col_character(),
## .. Estrato = col_character(),
## .. Precio = col_double(),
## .. `Tipo de Inmueble` = col_character(),
## .. `Datos Adicionales` = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
# Ver clases de cada columna
sapply(INMUEBLES, class)
## Codigo Ciudad Departamento
## "numeric" "character" "character"
## Barrio Direccion Area Terreno
## "character" "character" "numeric"
## Area Construida Detalle Disponibilidad Estrato
## "numeric" "character" "character"
## Precio Tipo de Inmueble Datos Adicionales
## "numeric" "character" "character"
# - Dentro del dataset encontramos 12 columnas, de las cuales 4 corresponden a datos numericos (Codigo, Area Terreno, Area Construida y Precio) y 8 a datos categoricos o variables cualitativas (Ciudad, Departamento, Barrio, Direccion, Detalle Disponibilidad, Estrato, Tipo de Inmueble y Datos adicionales).
colSums(is.na(INMUEBLES))
## Codigo Ciudad Departamento
## 0 0 0
## Barrio Direccion Area Terreno
## 389 0 0
## Area Construida Detalle Disponibilidad Estrato
## 0 0 0
## Precio Tipo de Inmueble Datos Adicionales
## 0 0 371
# Porcentaje de valores nulos por columna
round(colSums(is.na(INMUEBLES)) / nrow(INMUEBLES) * 100, 2)
## Codigo Ciudad Departamento
## 0.00 0.00 0.00
## Barrio Direccion Area Terreno
## 86.83 0.00 0.00
## Area Construida Detalle Disponibilidad Estrato
## 0.00 0.00 0.00
## Precio Tipo de Inmueble Datos Adicionales
## 0.00 0.00 82.81
# - Las columnas que poseen VALORES NULOS son: “Barrio” y “Datos Adicionales”, con un 86.63% y 82.81% respectivamente.
duplicados <- duplicated(INMUEBLES)
sum(duplicados)
## [1] 0
# - No, no existen registros duplicados.
names(INMUEBLES)
## [1] "Codigo" "Ciudad" "Departamento"
## [4] "Barrio" "Direccion" "Area Terreno"
## [7] "Area Construida" "Detalle Disponibilidad" "Estrato"
## [10] "Precio" "Tipo de Inmueble" "Datos Adicionales"
# Boxplot para precio
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(readr)
library(scales)
##
## Adjuntando el paquete: 'scales'
## The following object is masked from 'package:readr':
##
## col_factor
# Filtrar precios no nulos
precios <- INMUEBLES %>%
filter(!is.na(Precio))
# Boxplot
ggplot(precios, aes(y = Precio)) +
geom_boxplot(fill = "#2c7fb8", outlier.color = "red", outlier.shape = 16, outlier.size = 2) +
theme_minimal() +
labs(title = "Boxplot de Precios de Inmuebles",
y = "Precio") +
scale_y_continuous(labels = scales::comma_format(big.mark = ".", decimal.mark = ",")) +
theme(axis.text.y = element_text(size = 10))
# Boxplot para Área Terreno
options(scipen = 999)
boxplot(INMUEBLES$"Area Terreno", main = "Boxplot de Área Terreno", col = "lightgreen")
# Boxplot para Área Construida
options(scipen = 999)
boxplot(INMUEBLES$"Area Construida", main = "Boxplot de Área Construida", col = "lightcoral")
# - Si, existen valores atipicos, en los precios, entre 200000000000000 y 300000000000000, hay 3. y hay un punto atipico notablemente mas alto mayor a 400000000000000. # - Tambien podemos observar en el Boxplot de Area Terreno, dos valores atipicos y en el Boxplot de Area Construida podriamos considerar dos tambien, aunque uno mas notable que el otro.
# Ver valores únicos en Tipo de Inmueble
unique(INMUEBLES$"Tipo de Inmueble")
## [1] "BODEGA" "LOTE CON CONSTRUCCION" "CASA"
## [4] "CLINICA" "LOTE VIVIENDA" "LOTE MIXTO"
## [7] "LOTE COMERCIAL" "HOTEL" "FINCA"
## [10] "LOCAL" "LOTE INDUSTRIAL" "LOTE AGRICOLA"
## [13] "EDIFICIO VIVIENDA" "LOTE" "EDIFICIO"
## [16] "OFICINA" "APARTAMENTO" "GARAJE"
## [19] "LOTE NO URBANIZABLE"
table(INMUEBLES$"Tipo de Inmueble")
##
## APARTAMENTO BODEGA CASA
## 5 8 14
## CLINICA EDIFICIO EDIFICIO VIVIENDA
## 3 4 2
## FINCA GARAJE HOTEL
## 8 2 1
## LOCAL LOTE LOTE AGRICOLA
## 304 4 5
## LOTE COMERCIAL LOTE CON CONSTRUCCION LOTE INDUSTRIAL
## 3 8 4
## LOTE MIXTO LOTE NO URBANIZABLE LOTE VIVIENDA
## 6 1 38
## OFICINA
## 28
# - No, no existen errores en categorias.
library(e1071)
# Histograma
hist(INMUEBLES$Precio,
breaks = 30,
col = "lightblue",
main = "Distribución de Precios",
xlab = "Precio")
# Skewness (coeficiente de asimetría)
skewness(INMUEBLES$Precio)
## [1] 7.256093
options(scipen = 999)
# - La frecuencia de los precios disminuye drasticamente a medida que los precios aumentan. La distribucion de los precios no es normal; esta sesgada. Especificamente, presenta un sesgo positivo o hacia la derecha. La gran mayoria de los datos (Precios) se concentran en el rango inferior (cerca de cero).
# Tabla de frecuencias
tabla_inmuebles <- table(INMUEBLES$"Tipo de Inmueble")
# Gráfico de barras
barplot(tabla_inmuebles,
las = 2,
col = "coral",
main = "Frecuencia por Tipo de Inmueble",
ylab = "Cantidad")
# - El tipo de inmueble mas comun es el “LOCAL”, con una cantidad aproximadamente de 300.
# Estadísticas para PRECIO
options(scipen = 999)
mean(INMUEBLES$Precio, na.rm = TRUE)
## [1] 9372905838386
median(INMUEBLES$Precio, na.rm = TRUE)
## [1] 165205000000
sd(INMUEBLES$Precio, na.rm = TRUE)
## [1] 38179638410195
quantile(INMUEBLES$Precio, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0 125725000000 165205000000 1861440000000 452337898200000
cut_precio <- cut(INMUEBLES$Precio, breaks = 5)
table(cut_precio)
## cut_precio
## (-4.52e+11,9.05e+13] (9.05e+13,1.81e+14] (1.81e+14,2.71e+14]
## 435 9 0
## (2.71e+14,3.62e+14] (3.62e+14,4.53e+14]
## 3 1
# - MEDIA: 9372905838386 # - MEDIANA: 165205000000 # - DESVIACION ESTANDAR: 38179638410195
# - CUARTILES 0%: 0, 25%: 125725000000, 50% 165205000000, 75%: 1861440000000, 100%: 452337898200000 .
# De los datos anteriores, podeos decir, que la media está inflada por valores extremos, es decir, muy elevados, la mediana y los cuartiles muestran que la mayoría de los datos(Precios) son mucho más bajos que el promedio, y la gran desviación estándar confirma que hay una alta dispersión y probablemente outliers.
# Estadísticas para AREA CONSTRUIDA
mean(INMUEBLES$"Area Construida", na.rm = TRUE)
## [1] 11551.53
median(INMUEBLES$"Area Construida", na.rm = TRUE)
## [1] 0
sd(INMUEBLES$"Area Construida", na.rm = TRUE)
## [1] 128517.7
quantile(INMUEBLES$"Area Construida", na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0 0 0 0 2272400
cut_area_construida <- cut(INMUEBLES$"Area Construida", breaks = 5)
table(cut_area_construida)
## cut_area_construida
## (-2.27e+03,4.54e+05] (4.54e+05,9.09e+05] (9.09e+05,1.36e+06]
## 444 2 1
## (1.36e+06,1.82e+06] (1.82e+06,2.27e+06]
## 0 1
options(scipen = 999)
# - MEDIA: 11551.53 # - MEDIANA: 0 # - DESVIACION ESTANDAR: 128517.7
# - CUARTILES: 0%: 0, 25%: 0. 50%: 0, 75%: 0, y 100%: 2272400.
# - Estos datos nos dan a entender que hay una distribución altamente sesgada debido a que hay muchos ceros y pocos valores muy altos, la media no es representativa: Parece que sólo unos pocos datos (menos del 25%) tienen área construida no nula, pero esos pocos tienen valores tan altos que suben la media.
# Estadísticas para AREA TERRENO
mean(INMUEBLES$"Area Terreno", na.rm = TRUE)
## [1] 1619546
median(INMUEBLES$"Area Terreno", na.rm = TRUE)
## [1] 0
sd(INMUEBLES$"Area Terreno", na.rm = TRUE)
## [1] 18588576
quantile(INMUEBLES$"Area Terreno", na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0 0 0 0 321719700
cut_area_terreno <- cut(INMUEBLES$"Area Terreno", breaks = 5)
table(cut_area_terreno)
## cut_area_terreno
## (-3.22e+05,6.43e+07] (6.43e+07,1.29e+08] (1.29e+08,1.93e+08]
## 446 0 0
## (1.93e+08,2.57e+08] (2.57e+08,3.22e+08]
## 1 1
options(scipen = 999)
# - MEDIA: 1619546 # - MEDIANA: 0 # - DESVIACION ESTANDAR: 18588576 # - CUARTILES: 0%: 0, 25%: 0. 50%: 0, 75%: 0, y 100%: 321719700
# - El conjunto de datos para “AREA TERRENO” tiene un sesgo extremo: la mayoría de los registros tienen área 0, y unos pocos tienen áreas tan grandes que empujan la media a más de 1.6 millones, lo cual indica que la media no representa el comportamiento típico del conjunto
# Precio promedio por estrato
precio_por_estrato <- aggregate(Precio ~ Estrato, data = INMUEBLES, FUN = mean, na.rm = TRUE)
print(precio_por_estrato)
## Estrato Precio
## 1 CINCO 15974667112500
## 2 COMERCIAL 4148108896355
## 3 CUATRO 7842247833700
## 4 DOS 13018464040359
## 5 INDUSTRIAL 122124958169933
## 6 RURAL 30753696738056
## 7 SEIS 7057725237767
## 8 TRES 38728254529850
## 9 UNO 982368000000
# - “Los precios promedio por estrato muestra una relación parcialmente coherente entre mayor estrato y mayor precio, aunque no es lineal. Los estratos comerciales e industriales destacan con precios significativamente más altos, lo cual sugiere una fuerte inversión en estos sectores. Al excluir estos outliers (los sectores) y centrarse en los estratos residenciales (UNO a SEIS), se observa que el estrato TRES concentra una parte importante del valor total, probablemente por su volumen o por ubicaciones atractivas con desarrollos de nivel medio.”
# Precio promedio por ciudad
precio_por_ciudad <- aggregate(Precio ~ Ciudad, data = INMUEBLES, FUN = mean, na.rm = TRUE)
print(precio_por_ciudad)
## Ciudad Precio
## 1 AGUAZUL 13937726903333
## 2 ANGOSTURA 24581464440000
## 3 ARMERO 4733173390000
## 4 BARRANQUILLA 4876484814286
## 5 BITUIMA 4806000000000
## 6 BOGOTA 52663773505921
## 7 BOLIVAR - CAUCA 7378920000000
## 8 BUGA 96470765841600
## 9 CALI 3508177628586
## 10 CALIMA EL DARIEN 21904723093000
## 11 CARMEN DE BOLIVAR 982368000000
## 12 CARTAGENA 40772769510000
## 13 CAUCASIA 5821480000000
## 14 CHIA 16813545000000
## 15 CUCUTA 2477823111111
## 16 CURITI 55248601890000
## 17 DAGUA 1752778880000
## 18 EL AGUILA 3787282600000
## 19 EL PLAYON 3644256000000
## 20 EL ROSAL 109839864000000
## 21 ENVIGADO 17712098400000
## 22 FUNZA 21008906000000
## 23 GIRARDOT 43901185791250
## 24 IBAGUE 5177907200000
## 25 LA CALERA 5520000000000
## 26 LA DORADA 19356060000000
## 27 LA VIRGINIA 6329540900000
## 28 LOS PATIOS 1785606600000
## 29 MADRID 116565311500000
## 30 MANIZALES 6216929100000
## 31 MARSELLA 240000000000
## 32 MEDELLIN 4697335380000
## 33 MONTERIA 6648299151667
## 34 PEREIRA 6326790718967
## 35 PIEDRAS 68451105930000
## 36 PUERTO LOPEZ 41901550210000
## 37 RICAURTE 104073361725000
## 38 SAN ANTONIO DEL TEQUENDAMA 18333741240000
## 39 SANTANDER DE QUILICHAO 7251923930000
## 40 SOATA 6829888500000
## 41 SOGAMOSO 147133144000000
## 42 TARAZA 807621000000
## 43 TENJO 6369860000000
## 44 TIBU 5805937010000
## 45 TURBO 16957400000000
## 46 VILLA RICA 70903412109800
## 47 VILLAVICENCIO 176106709825
## 48 YUMBO 6882840000000
# - “Los precios promedio por ciudad revela una alta variabilidad, con algunas ciudades registrando cifras considerablemente elevadas que podrían indicar desarrollos urbanísticos de gran escala. Las ciudades más grandes como Bogotá o Medellín presentan precios altos, pero no necesariamente lideran el ranking, estas, están por debajo de otras ciudades más pequeñas como BUGA, RICAURTE, o SOGAMOSO. Esto puede indicar que en algunas ciudades más pequeñas hay proyectos de muy alto valor.
# Ordenar por precio promedio descendente
precio_por_estrato[order(-precio_por_estrato$Precio), ]
## Estrato Precio
## 5 INDUSTRIAL 122124958169933
## 8 TRES 38728254529850
## 6 RURAL 30753696738056
## 1 CINCO 15974667112500
## 4 DOS 13018464040359
## 3 CUATRO 7842247833700
## 7 SEIS 7057725237767
## 2 COMERCIAL 4148108896355
## 9 UNO 982368000000
precio_por_ciudad[order(-precio_por_ciudad$Precio), ]
## Ciudad Precio
## 41 SOGAMOSO 147133144000000
## 29 MADRID 116565311500000
## 20 EL ROSAL 109839864000000
## 37 RICAURTE 104073361725000
## 8 BUGA 96470765841600
## 46 VILLA RICA 70903412109800
## 35 PIEDRAS 68451105930000
## 16 CURITI 55248601890000
## 6 BOGOTA 52663773505921
## 23 GIRARDOT 43901185791250
## 36 PUERTO LOPEZ 41901550210000
## 12 CARTAGENA 40772769510000
## 2 ANGOSTURA 24581464440000
## 10 CALIMA EL DARIEN 21904723093000
## 22 FUNZA 21008906000000
## 26 LA DORADA 19356060000000
## 38 SAN ANTONIO DEL TEQUENDAMA 18333741240000
## 21 ENVIGADO 17712098400000
## 45 TURBO 16957400000000
## 14 CHIA 16813545000000
## 1 AGUAZUL 13937726903333
## 7 BOLIVAR - CAUCA 7378920000000
## 39 SANTANDER DE QUILICHAO 7251923930000
## 48 YUMBO 6882840000000
## 40 SOATA 6829888500000
## 33 MONTERIA 6648299151667
## 43 TENJO 6369860000000
## 27 LA VIRGINIA 6329540900000
## 34 PEREIRA 6326790718967
## 30 MANIZALES 6216929100000
## 13 CAUCASIA 5821480000000
## 44 TIBU 5805937010000
## 25 LA CALERA 5520000000000
## 24 IBAGUE 5177907200000
## 4 BARRANQUILLA 4876484814286
## 5 BITUIMA 4806000000000
## 3 ARMERO 4733173390000
## 32 MEDELLIN 4697335380000
## 18 EL AGUILA 3787282600000
## 19 EL PLAYON 3644256000000
## 9 CALI 3508177628586
## 15 CUCUTA 2477823111111
## 28 LOS PATIOS 1785606600000
## 17 DAGUA 1752778880000
## 11 CARMEN DE BOLIVAR 982368000000
## 42 TARAZA 807621000000
## 31 MARSELLA 240000000000
## 47 VILLAVICENCIO 176106709825
library(sf)
## Linking to GEOS 3.13.1, GDAL 3.10.2, PROJ 9.5.1; sf_use_s2() is TRUE
departamento_sf <- st_read("C:/Users/USUARIO/Documents/anlisisdedatos/gadm41_COL_1.json")
## Reading layer `gadm41_COL_1' from data source
## `C:\Users\USUARIO\Documents\anlisisdedatos\gadm41_COL_1.json'
## using driver `GeoJSON'
## Simple feature collection with 33 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -81.8412 ymin: -4.2284 xmax: -66.8377 ymax: 15.9125
## Geodetic CRS: WGS 84
# Cambiar el nombre de la columna de 'NAME_1' a 'Departamento'
names(departamento_sf)[names(departamento_sf) == "NAME_1"] <- "Departamento"
library(dplyr)
departamento_sf <- departamento_sf %>%
mutate(Departamento = recode(Departamento,
"Meta" = "META",
"Antioquia" = "ANTIOQUIA",
"NortedeSantander" = "NORTE DE SANTANDER",
"Cundinamarca" = "CUNDINAMARCA",
"Córdoba" = "CORDOBA",
"Bolívar" = "BOLIVAR",
"Boyacá" = "BOYACA",
"Caldas" = "CALDAS",
"Cauca" = "CAUCA",
"Casanare" = "CASANARE",
"Risaralda" = "RISARALDA",
"Santander"= "SANTANDER",
"Tolima" = "TOLIMA",
"ValledelCauca" = "VALLE DEL CAUCA"
))
library(sf)
library(dplyr)
library(readr)
# 2. Verifica el nombre del campo con los nombres de los departamentos en ambas bases
names(departamento_sf) # busca algo como "NAME_1"
## [1] "GID_1" "GID_0" "COUNTRY" "Departamento" "VARNAME_1"
## [6] "NL_NAME_1" "TYPE_1" "ENGTYPE_1" "CC_1" "HASC_1"
## [11] "ISO_1" "geometry"
names(INMUEBLES) # busca algo como "departamento" o similar
## [1] "Codigo" "Ciudad" "Departamento"
## [4] "Barrio" "Direccion" "Area Terreno"
## [7] "Area Construida" "Detalle Disponibilidad" "Estrato"
## [10] "Precio" "Tipo de Inmueble" "Datos Adicionales"
# 3. Unir por nombre del departamento (ajusta los nombres de columna según sea necesario)
inmuebles_geo <- INMUEBLES %>%
left_join(departamento_sf, by = c("Departamento" = "Departamento"))
# Mapa de precios de inmuebles por departamento
library(dplyr)
library(sf)
library(tmap)
library(stringr)
library(scales)
# Asegurar formato consistente
inmuebles_geo <- inmuebles_geo %>%
mutate(Departamento = str_to_upper(str_trim(Departamento)))
# 1. Calcular precios por departamento
precios_departamento <- inmuebles_geo %>%
group_by(Departamento) %>%
summarise(precio_promedio = mean(Precio, na.rm = TRUE))
# 2. Crear geometría única por departamento
geom_por_dpto <- inmuebles_geo %>%
group_by(Departamento) %>%
summarise(geometry = st_union(geometry)) %>%
st_as_sf()
# 3. Unir con precios
mapa_precios <- left_join(geom_por_dpto, precios_departamento, by = "Departamento")
# 4. Crear texto para tooltip
mapa_precios <- mapa_precios %>%
mutate(
tooltip = paste0(Departamento,
"💰 Precio promedio: $", comma(precio_promedio)
)
)
# 5. Activar modo vista interactiva
tmap_mode("view")
## ℹ tmap mode set to "view".
# 6. Mapa con tooltip en hover y etiquetas de nombre
tm_shape(mapa_precios) +
tm_polygons(
col = "precio_promedio",
palette = "YlOrRd",
style = "quantile",
title = "Precio promedio",
legend.format = list(fun = comma),
id = "tooltip" # 👈 Esto permite mostrar el tooltip al pasar el cursor
) +
tm_text("Departamento", size = 0.8, col = "black", shadow = TRUE) + # 👈 Mostrar nombre directamente
tm_layout(title = "Mapa de precios promedio de inmuebles por departamento en Colombia")
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'palette' (rename to 'values'),
## 'legend.format' (rename to 'label.format') to 'tm_scale_intervals(<HERE>)'[v3->v4] `tm_polygons()`: use 'fill' for the fill color of polygons/symbols
## (instead of 'col'), and 'col' for the outlines (instead of 'border.col').[v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title', 'legend.format' (rename to 'format') to
## 'fill.legend = tm_legend(<HERE>)'[v3->v4] `tm_text()`: migrate the layer options 'shadow' to 'options =
## opt_tm_text(<HERE>)'[v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`[cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "YlOrRd" is named
## "brewer.yl_or_rd"Multiple palettes called "yl_or_rd" found: "brewer.yl_or_rd", "matplotlib.yl_or_rd". The first one, "brewer.yl_or_rd", is returned.
# - Este mapa muestra el precio promedio de inmuebles por departamento en una selección de regiones de Colombia, principalmente la Andina, utilizando una escala de color para indicar rangos de precios extremadamente altos, donde departamentos como Antioquia, Cundinamarca y Valle del Cauca presentan los valores más elevados dentro de la muestra visualizada, lo que concuerda con su importancia económica y poblacional, mientras que departamentos como Meta y Casanare muestran precios inferiores; Sin embargo, una porción considerable del país no tiene datos representados, limitando la completitud del análisis nacional y la magnitud inusual de los precios sugiere la necesidad de verificar la unidad o metodología de cálculo.
# Quitar valores NA y filtrar precios válidos
INMUEBLES_filtrado <- INMUEBLES %>%
filter(!is.na(Precio) & !is.na(Ciudad) & Precio > 0)
# Crear el boxplot
ggplot(INMUEBLES_filtrado, aes(x = reorder(Ciudad, Precio, median), y = Precio)) +
geom_boxplot(fill = "skyblue", outlier.color = "red", alpha = 0.7) +
coord_flip() + # Gira para mejor lectura si hay muchas ciudades
labs(title = "Distribución de Precios por Ciudad",
x = "Ciudad",
y = "Precio (COP)") +
theme_minimal() + scale_y_log10(labels = scales::comma)
# - Si, hay diferencia de precio entre ciudades. lo que nos indica que tambien existen diferencias entre regiones o departamentos. # - Al observar la grafica se puede apreciar que: Las medianas de los precios varían considerablemente entre ciudades, la dispersión de los precios también difiere y algunas ciudades tienen rangos de precios significativamente más altos que otras.
library(dplyr)
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(ggplot2)
library(readr)
datos_cor <- INMUEBLES %>%
select(Precio, `Area Construida`) %>%
na.omit()
# Graficar relación entre Precio y Área Construida
ggpairs(datos_cor,
title = "Correlación: Precio vs Área Construida")
# - La magnitud del coeficiente (0.562) sugiere una correlación positiva moderada. Esto significa que el Área Construida tiene una influencia considerable en el Precio, pero no lo determina por completo.
library(dplyr)
library(GGally)
library(ggplot2)
library(readr)
# Seleccionar solo Precio y Área Terreno
datos_cor <- INMUEBLES %>%
select(Precio, `Area Terreno`) %>%
na.omit()
# Graficar relación entre Precio y Área Terreno
ggpairs(datos_cor,
title = "Correlación: Precio vs Área Terreno")
# - La magnitud del coeficiente (0.470) sugiere una correlación positiva moderada, ligeramente más débil que la observada con el Área Construida.
numericas <- select_if(INMUEBLES, is.numeric) #creamos un data frame con solo variables numericas
correlaciones <- cor(numericas, use = "complete.obs")
correlaciones_con_precio <- sort(correlaciones["Precio", ], decreasing = TRUE)
correlaciones_con_precio
## Precio Area Construida Area Terreno Codigo
## 1.0000000 0.5621413 0.4701345 -0.3018968
# - Dado que el valor absoluto del coeficiente de correlación entre Precio y Área Construida (0.5621413) es mayor que el del Área Terreno (0.4701345), podemos concluir que, en este conjunto de datos y en términos de una relación lineal, el Área Construida influye más en el Precio que el Área Terreno.
# - Esto significa que, en general, un cambio en el Área Construida está asociado con un cambio proporcionalmente mayor en el Precio que un cambio similar en el Área Terreno.
ggplot(INMUEBLES, aes(x = Estrato, y = Precio)) +
geom_jitter(width = 0.2, alpha = 0.5, color = "black") +
facet_wrap(~ "Tipo de Inmueble") +
labs(title = "Relacion entre Precio y Estrato por Tipo de Inmueble",
x = "Estrato",
y = "Precio en pesos") +
theme(axis.text.x = element_text(angle = 90, hjust= 1))
# - El precio de los inmuebles está fuertemente relacionado con el estrato socioeconómico, observándose una tendencia general a precios más altos en estratos superiores.
# - Aumenta generalmente con el estrato socioeconómico; por ejemplo, en la imagen se observa que los puntos de precio para el estrato ‘SEIS’ están significativamente más altos y dispersos que los del estrato ‘UNO’, indicando precios mayores y más variados en estratos superiores. Además, el tipo de inmueble también afecta el precio, con propiedades comerciales e industriales alcanzando valores altos independientemente del estrato residencial numérico.