1 A. Analisis inicial y Limpieza

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)

1.1 1 Importación y estructura

1.1.1 1.1 Registros y columnas que posee el dataset

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.

1.1.2 1.2 Tipos de datos que hay (numéricos, categóricos, texto)

# 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).

1.2 2. Valores nulos y duplicados

1.2.1 2.1 Columnas que tienen valores nulos y el porcentaje que representan

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.

1.2.2 2.2 Existencia de registros duplicados

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"

1.3 3. Depuración de datos

1.3.1 3.1 Valores atípicos (outliers) en precios o áreas (boxplots).

# 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.

1.3.2 3.1 Existencia de errores en categorías (ej: “aparatmento” en lugar de “apartamento”)?

# 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.

2 B. Análisis Descriptivo

2.1 4. Distribuciones

2.1.1 4.1. Distribucion de los precios ¿Es normal o sesgada? (Histogramas)

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).

2.1.2 4.2 Tipo de inmueble que es más común? (Gráfico de barras)

# 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.

2.2 5. Media, mediana, desviación estándar, cuartiles y tablas de frecuencias

# 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

2.3 6. Precio promedio por estrato Y por ciudad

# 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

3 C. Análisis Espacial (Geográfico)

3.1 7. Mapas y geolocalización: Analisis de precios por departamento/ciudad

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.

3.2 8. Patrones geográficos

3.2.1 8.1 Diferencias de precios entre regiones o departamentos (Boxplot por ciudad) botplox por ciudad

# 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.

4 D. Relaciones entre Variables

4.1 9. Correlaciones

4.1.1 9.1 Matriz de correlación

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.

4.1.2 9.2 Area que influye mas

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.

4.2 10. Análisis multivariable

4.2.1 9.1 Relacion entre el precio con el estrato y el tipo de inmueble

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.