1 INTRODUCCIÓN

Cali es una de las ciudades principales de Colombia, no solo atrae turistas, sino también a aquellos interesados en el mercado inmobiliario, por su clima tropical, su cultura y una economía en constante crecimiento. Esta ciudad se ha convertido en un punto focal para la inversión en bienes raíces en América Latina. En las últimas décadas, el mercado inmobiliario de Cali ha experimentado un notable auge, impulsado por varios factores clave. El crecimiento económico sostenido, el desarrollo de infraestructuras modernas, la inversión extranjera directa y una creciente clase media han generado una demanda creciente de viviendas, tanto para venta como para alquiler. En 2022, las ventas del sector en Cali llegaron a $6700 millones y en 2023 a $6100 mil millones. Se espera que este sector continúe creciendo durante los próximos años, permitiendo un desarrollo dinámico en la economía regional. La empresa B&C (Bines y Casas) es una de las agencias de bienes raíces que opera en la ciudad de Cali, Colombia. La empresa fue fundada por Sandra Milena hace 10 años y actualmente cuenta con ocho agentes de bienes raíces. El presente informe pretende hacer un análisis estadístico de la base de datos de ventas de la empresa, que le permita tomar decisiones estratégicas en su modelo de mercado.

2 OBJETIVOS

Realizar un análisis descriptivo de los datos, para identificar las tendencias y patrones que le permitan a la empresa B&C definir su nicho de mercado, desarrollar estrategias de marketing, establecer precios de venta y ofrecer servicios personalizados a sus clientes.

3 MÉTODOS

3.1 Área de Estudio

Santiago de Cali es la capital del departamento de Valle del Cauca y cuenta con una población de aproximadamente 2.280.522 habitantes; se destaca como la tercera ciudad más poblada de Colombia y un importante centro económico, reflejando la tendencia de crecimiento urbano en respuesta a situaciones adversas en las zonas rurales. La ciudad ha experimentado un notable aumento en su proporción poblacional, llegando a superar el 60% de la población total del Valle del Cauca, distribuida en 336 barrios y 22 comunas. Cali, en pleno auge, ofrece una combinación única de beneficios para quienes deciden adquirir una vivienda en esta ciudad. Entre estos beneficios se encuentran la constante valorización de las propiedades, respaldada por la creciente demanda en el mercado inmobiliario. Además, el clima ideal es un atributo valioso, facilitando un estilo de vida activo y saludable. Con temperaturas constantes y agradables, la ciudad propicia la planificación de actividades al aire libre y contribuye al bienestar de sus residentes. La rica vida cultural y de entretenimiento es otro punto a favor, con festivales de salsa, teatros, galerías de arte, restaurantes de alta calidad y diversas actividades recreativas disponibles para disfrutar. En cuanto al mercado inmobiliario, Cali ofrece una amplia variedad de opciones, desde casas de lujo hasta apartamentos vacacionales, adaptándose a los gustos y necesidades de cada comprador. La diversificación de la oferta, combinada con una demanda en constante aumento, brinda a los inversionistas la oportunidad de capitalizar en propiedades que experimentan un crecimiento constante en su valor, convirtiéndose en una excelente alternativa no solo para vivir sino como negocio.

library(sf)
library(leaflet)

#ruta_archivo <- "C:/Users/Laura Vasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/Barrios_Cali.gpkg"
ruta_archivo <- "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/Barrios_Cali.gpkg"
file.exists(ruta_archivo)
## [1] TRUE
Shape_BCali <- st_read(ruta_archivo) # fuente de datos secundaria (www.cali.gov.co)
## Reading layer `Barrios_Cali' from data source 
##   `C:\Users\lvasquez\OneDrive - PUJ Cali\2024_1\Metodos y simulacion estadistica\Unidad 1\Unidad 1\Barrios_Cali.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 336 features and 6 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.59078 ymin: 3.331802 xmax: -76.46124 ymax: 3.501895
## Geodetic CRS:  WGS 84
Shape_BCali <- st_transform(Shape_BCali, crs = '+proj=longlat +datum=WGS84')

leaflet() %>%
  addTiles() %>%
  setView(lng = -76.53, lat = 3.42, zoom = 11.2) %>%
  addPolygons(data = Shape_BCali, color = "gray",weight = 2,fillColor = "gray", stroke = 0.1, opacity = 0.9, popup = paste0("Barrio: ",Shape_BCali$barrio,"<br>","Comuna: ",Shape_BCali$comuna))

3.2 Fuentes de datos

Datos primarios

La base de datos empleada en el análisis del mercado inmobiliario en la ciudad de Cali, fue extraída del paquete METODOS de R. Este conjunto de datos cuenta con un total de 8327 registros y 15 atributos, de interés para el sector. Esta base de datos fue, transformada empleando técnicas estadísticas de limpieza e imputación y creando nuevas variables que serán útiles para analizar el nicho de mercado, objetivo esencial para la compañía. El proceso EDL puede consultarse a detalle en apartado ANEXOS.

if (!is.element("DT", installed.packages()[,1])){
  install.packages("DT", repos = "http://mirror.fcaglp.unlp.edu.ar/CRAN/")
}
library(DT)

#load("C:/Users/Laura Vasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")
load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")
datatable(BD_limpia, rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) ) %>% formatStyle(names(BD_limpia), backgroundColor = "lightgray") 

Datos secundarios

Como estrategia para la limpieza e imputación de datos, se consultó e incluyó en el proceso, como base de datos adicional, la capa geográfica de división político - administrativa de la ciudad de Cali, emitido por la página de la alcaldía www.cali.gov.co, basada en la información del censo del 2018. Esta capa cuenta con un total de 366 registros y 7 atributos.

datatable(Shape_BCali, filter="top", options = list(pageLength = 5, scrollX=T))%>%
  formatStyle(names(Shape_BCali), backgroundColor = "lightgray")

3.3 Análisis descriptivos

A continuación, se describirán estadísticamente las variables más representativas del conjunto de datos y que son de interés para establecer estrategias de mercadeo, por parte de la compañía B&C en la ciudad de

Distribución de Precio, zonas, tipo de inmueble y estrato

En el análisis de datos de inmuebles, se destaca que los precios más elevados se localizan principalmente en las zonas Oeste y Sur, según revelan tanto el mapa como los gráficos estadísticos. Además, se identifica que aproximadamente el 4% de los datos presentan valores faltantes en las variables Zona y Comuna. A pesar de esta pérdida de información, aún se dispone de una cantidad considerable de datos para el análisis. Por otro lado, se observa una preferencia notable por la adquisición de apartamentos, siendo los estratos 4 y 5 los más populares en las transacciones, lo que sugiere una posible tendencia en la oferta y la demanda dentro de estos estratos socioeconómicos.

library(naniar)
library(stringi)
library(gridExtra)
library(leaflet)
library(RColorBrewer)
library(ggplot2)


# Distribución Precio 
pal <- colorNumeric(palette = "YlOrBr", domain = BD_limpia$`Precio_(millones)`)
leaflet(BD_limpia) %>% addTiles() %>%
  setView(lng = -76.53, lat = 3.42, zoom = 11.2) %>%
  addPolygons(data = Shape_BCali, color = "gray",weight = 2,fillColor = "gray", stroke = 0.1, opacity = 0.9, popup = paste0("Barrio: ",Shape_BCali$Barrio_limpio,"<br>","Comuna: ",Shape_BCali$comuna)) %>%
  addCircleMarkers( lng = BD_limpia$Longitud, lat = BD_limpia$Latitud, radius = 3,
                    color = pal(BD_limpia$`Precio_(millones)`),  
                    fillColor = pal(BD_limpia$`Precio_(millones)`), fillOpacity = 0.5,
                    stroke = FALSE, popup = ~paste("Precio: ",BD_limpia$`Precio_(millones)`)
    
  ) %>%
  addLegend("bottomright",colors = brewer.pal(9,"YlOrBr"),  
            labels = round(seq(min(BD_limpia$`Precio_(millones)`), max(BD_limpia$`Precio_(millones)`), length.out = 9)), opacity = 0.8, 
            title = "Precio(millones)")  # Título de la leyenda
#Distribución Zona

tab_zona <-prop.table(table(BD_limpia$Zona_limpia))%>% data.frame()
tab_zona$proporcion <- tab_zona$Freq / sum(tab_zona$Freq)
graf1 <- ggplotGrob(ggplot(tab_zona, aes(x= "", y = proporcion, fill = Var1)) + geom_bar(stat = "identity", width = 1) + coord_polar(theta = "y") + labs(title = "Distribucion de la zona") +labs(fill = "Zonas") + theme(plot.title = element_text(hjust = 0.5)))

'/*
pal <- colorFactor(palette = "YlOrRd", domain = ventas_cali$Zona)
labels <- levels(pal)
colors <- pal(labels)

leaflet(BD_limpia) %>% addTiles() %>%
  enableMeasurePath() %>% setView(lng = -76.53, lat = 3.42, zoom = 11.2) %>%
  addPolygons(data = Shape_BCali, color = "gray",weight = 2,fillColor = "gray", stroke = 0.1, opacity = 0.9, popup = paste0("Barrio: ",Shape_BCali$barrio,"<br>","Comuna: ",Shape_BCali$comuna)) %>%
  addCircleMarkers( lng = BD_limpia$Longitud, lat = BD_limpia$Latitud, radius = 3,
                    color = pal(ventas_cali$Zona),  
                    fillColor = pal(ventas_cali$Zona), fillOpacity = 0.5,
                    stroke = FALSE, popup = ~paste("Barrio: ",BD_limpia$Barrio_limpio,"<br>","Zona: ",ventas_cali$Zona)
    
  ) %>%
  addLegend("bottomright",pal=pal,values = colors, labels = labels, opacity = 0.8, title = "Zona")  # Título de la leyenda
/*'
## [1] "/*\npal <- colorFactor(palette = \"YlOrRd\", domain = ventas_cali$Zona)\nlabels <- levels(pal)\ncolors <- pal(labels)\n\nleaflet(BD_limpia) %>% addTiles() %>%\n  enableMeasurePath() %>% setView(lng = -76.53, lat = 3.42, zoom = 11.2) %>%\n  addPolygons(data = Shape_BCali, color = \"gray\",weight = 2,fillColor = \"gray\", stroke = 0.1, opacity = 0.9, popup = paste0(\"Barrio: \",Shape_BCali$barrio,\"<br>\",\"Comuna: \",Shape_BCali$comuna)) %>%\n  addCircleMarkers( lng = BD_limpia$Longitud, lat = BD_limpia$Latitud, radius = 3,\n                    color = pal(ventas_cali$Zona),  \n                    fillColor = pal(ventas_cali$Zona), fillOpacity = 0.5,\n                    stroke = FALSE, popup = ~paste(\"Barrio: \",BD_limpia$Barrio_limpio,\"<br>\",\"Zona: \",ventas_cali$Zona)\n    \n  ) %>%\n  addLegend(\"bottomright\",pal=pal,values = colors, labels = labels, opacity = 0.8, title = \"Zona\")  # Título de la leyenda\n/*"
# Distribción de Tipo de Inmueble

tab_tipo <-table(BD_limpia$Tipo_inmueble)%>% data.frame()
graf2 <- ggplotGrob(ggplot(tab_tipo, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity", fill = c("#f95738","#ee964b") )+
  labs(title = "Distribucion de tipo de inmueble", x = "Tipo", y = "frecuencia") + theme(plot.title = element_text(hjust = 0.5)))

# Datos faltates 
graf3 <- ggplotGrob(gg_miss_var(BD_limpia)+ labs(title = "Datos faltantes")+ theme(plot.title = element_text(hjust = 0.5)))


# Distribción de Estrato

tabla2<- table(BD_limpia$Estrato)%>% as.data.frame()
graf4 <- ggplotGrob(ggplot(tabla2, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity", fill = c("#f95738","#ee964b", "#f4d35e", "#0d3b66") )+
  labs(title = "Distribucion de tipo de estratos", x = "Estrato", y = "frecuencia") + theme(plot.title = element_text(hjust = 0.5)))

grid.arrange(graf3, graf1, graf2,graf4, nrow = 2, ncol = 2)

4 RESULTADOS Y DISCUCIÓN

4.1 Análisis de precio de los inmuebles por zona y estrato

El análisis de precios promedio de propiedades en Cali, revela patrones significativos en el mercado inmobiliario de la ciudad. Se destaca una marcada variación en los precios entre diferentes zonas geográficas y estratos socioeconómicos. Las zonas oeste y sur muestran los precios promedio más altos, superando los 600 millones de pesos en estratos elevados, lo que sugiere una alta demanda en áreas bien ubicadas y con acceso a servicios y comercios. Por otro lado, las zonas periféricas del norte y oriente exhiben precios promedio más bajos, rondando entre los 150 y 300 millones de pesos, reflejando posiblemente una menor valorización. En términos de estratificación socioeconómica, se observa un patrón general de aumento en los precios promedio a medida que se incrementa el estrato. Sin embargo, esta tendencia no es uniforme en todas las zonas, lo que indica la influencia de otros factores como la ubicación específica y las características del inmueble en la fijación de precios. Es importante destacar, se identifican registros sin especificación de zona geográfica, con precios que varían ampliamente entre los 200 y 800 millones de pesos en diferentes estratos, lo cual está afectado por la mala calidad de los datos y por la desactualización de la capa de barrios emitida por la fuente oficial, toda vez que fue l insumo principal para la limpieza, lo cual podría afectar los valores estimados. Esto subraya la importancia de la ubicación en la valoración de las propiedades y la necesidad de considerar este aspecto al evaluar el mercado inmobiliario en Cali.

library(naniar)
library(stringi)
library(gridExtra)
library(leaflet)
library(RColorBrewer)
library(ggplot2)
library(dplyr)

load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")

# Calcula el precio promedio por zona y estrato
precio_promedio <- BD_limpia %>%
  group_by(Zona_limpia, Estrato) %>%
  summarize(Precio_promedio = mean(`Precio_(millones)`, na.rm = TRUE))
# Gráfico de barras
palette <- brewer.pal(n = 5, name = "Set3")  # Puedes cambiar "Set1" por otro nombre de paleta
ggplot((precio_promedio), aes(x = factor(Estrato), y = Precio_promedio, fill = Zona_limpia)) +
     geom_bar(stat = "identity", position = "dodge") +
  scale_fill_manual(values = palette) +  # Usa la paleta de colores definida
  labs(title = "Precio promedio de propiedades por zona y estrato",
       x = "Estrato", y = "Precio promedio (millones de pesos)")+ theme(plot.title = element_text(hjust = 0.5))

4.2 Distribución del tipo de inmueble por zona

El análisis de la distribución de tipos de inmuebles por zona muestra una perspectiva de las preferencias y características del mercado inmobiliario en la ciudad. Al examinar los datos, se observa una variación notable en la composición de los tipos de inmuebles entre las diferentes zonas geográficas de la ciudad. En zonas como el oeste y el sur, predominan los apartamentos, posiblemente debido a la densidad poblacional, la disponibilidad de terrenos para la construcción vertical y expansión metropolitana. Por otro lado, en zonas periféricas como el centro y el oriente, se aprecia una mayor proporción de casas, indicando una preferencia por viviendas multifamiliares o la disponibilidad de espacio para construcciones horizontales. Este análisis resalta la importancia de considerar las preferencias del mercado y las características específicas de cada zona al desarrollar estrategias de comercialización y oferta de inmuebles en Cali.

library(naniar)
library(stringi)
library(gridExtra)
library(leaflet)
library(RColorBrewer)
library(ggplot2)
library(dplyr)

load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")
ggplot(na.omit(BD_limpia), aes(x = Zona_limpia, fill = Tipo_inmueble)) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de tipos de inmueble por zona")+ theme(plot.title = element_text(hjust = 0.5))

4.3 Dispersión del precio por metro cuadrado comparado con el área construida

La distribución sesgada hacia la derecha en los precios por metro cuadrado en el mercado inmobiliario de Cali tiene implicaciones significativas. La concentración de datos entre 0 y 200 metros cuadrados, con precios que varían desde 500,000 hasta 7.5 millones por metro cuadrado, sugiere una fuerte demanda de apartamentos con áreas construidas más pequeñas. Este fenómeno puede atribuirse a factores como la densidad poblacional y la preferencia por viviendas más compactas en áreas urbanas. Sin embargo, es importante destacar que, aunque las propiedades sean más pequeñas, su precio por metro cuadrado puede verse influenciado por una serie de factores, como la ubicación, la calidad de la construcción, las características del inmueble y el estrato socioeconómico o la zona en la que se encuentre. Por ejemplo, propiedades ubicadas en la zona sur o zona estratégicas pueden tener precios más altos debido a la conveniencia y la accesibilidad a servicios y comercios. Por lo tanto, esta distribución sesgada hacia la derecha refleja una interacción compleja entre la oferta y la demanda, así como una variedad de factores que influyen en la fijación de precios en el mercado inmobiliario de Cali.

library(naniar)
library(stringi)
library(gridExtra)
library(leaflet)
library(RColorBrewer)
library(ggplot2)
library(dplyr)

load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")
ggplot(BD_limpia, aes(x = Area_construida, y = Precio_metro2)) +
  geom_point(aes(color = Zona_limpia)) + scale_color_brewer(palette = "Dark2") +
  labs(title = "Precio por metro cuadrado (millones) vs. Área construida (m2)")+ theme(plot.title = element_text(hjust = 0.5))

4.4 Relación del precio por número de piso y zona

El análisis detallado de la relación entre el precio de los inmuebles y sus distintas características revela patrones significativos en el mercado inmobiliario. Al considerar el precio en relación con el piso y el tipo de inmueble, se observa una tendencia inusual donde los apartamentos tienden a disminuir su precio en los pisos superiores, mientras que las casas muestran precios más altos en los pisos inferiores, siguiendo una lógica convencional. Es importante destacar que los apartamentos de mayor costo se concentran mayormente entre el tercer y sexto piso. Por otro lado, al analizar la relación entre el precio y el número de baños, se evidencia un aumento en el costo para casas y apartamentos, indicando que los inmuebles con más baños tienden a tener precios más elevados. De manera similar, al considerar el número de habitaciones, se observa un incremento en el precio a medida que aumenta este número, siendo común encontrar propiedades con 2 a 4 habitaciones tanto en apartamentos como en casas. Respecto al número de parqueaderos, se destaca que la mayoría de los apartamentos cuentan con 1 o 2 parqueaderos, mientras que las casas suelen ofrecer en su mayoría 4. Es importante señalar la presencia de valores nulos en las características de baños y habitaciones, lo que podría sugerir datos faltantes o mal registrados en la base de datos.

graf1<-ggplotGrob(ggplot(data = BD_limpia, aes(x = Ubicacion_piso_limpio, y = BD_limpia$`Precio_(millones)`, color = Tipo_inmueble)) +
  geom_jitter(width = 0.2, height = 0, alpha = 0.7) +
  labs(x = "Piso", y = "Precio (millones)",
       title = "Precio vs piso y tipo de inmueble") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)))

graf2<-ggplotGrob(ggplot(data = BD_limpia, aes(x = BD_limpia$No_baños, y = BD_limpia$`Precio_(millones)`, color = Tipo_inmueble)) +
  geom_jitter(width = 0.2, height = 0, alpha = 0.7) +
  labs(x = "No.Baños", y = "Precio (millones)",
       title = "Precio vs No. baños y tipo de inmueble") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)))

graf3<-ggplotGrob(ggplot(data = BD_limpia, aes(x = BD_limpia$No_habitaciones, y = BD_limpia$`Precio_(millones)`, color = Tipo_inmueble)) +
  geom_jitter(width = 0.2, height = 0, alpha = 0.7) +
  labs(x = "No.Habitaciones", y = "Precio (millones)",
       title = "Precio vs No. habitacioes y tipo de inmueble") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)))

graf4<-ggplotGrob(ggplot(data = BD_limpia, aes(x = BD_limpia$No_parqueaderos_imputado, y = BD_limpia$`Precio_(millones)`, color = Tipo_inmueble)) +
  geom_jitter(width = 0.2, height = 0, alpha = 0.7) +
  labs(x = "No.Parqueadero", y = "Precio (millones)",
       title = "Precio vs No. parqueadero y tipo de inmueble") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)))


grid.arrange(graf1, graf2, graf3,graf4, nrow = 2, ncol = 2)

5 CONCLUSIONES

  • La relación entre el precio y las características específicas de los inmuebles, como el número de habitaciones, baños y parqueaderos, sugiere que la empresa B&C puede implementar estrategias de precios diferenciadas según las características de cada propiedad. Por ejemplo, propiedades con más baños y habitaciones pueden justificar precios más altos, mientras que aquellas con menos comodidades pueden ofrecerse a precios más accesibles.

  • La observación de que los apartamentos tienden a disminuir su precio en los pisos superiores mientras que las casas muestran precios más altos en los pisos inferiores sugiere la oportunidad de segmentar el mercado según el tipo de propiedad y su ubicación en el edificio. La compañía B&C puede adaptar sus estrategias de marketing y precios para cada segmento de manera más efectiva.

  • El análisis revela que los inmuebles con mayor cantidad de habitaciones y baños tienden a tener precios más altos, lo que indica una demanda por propiedades más espaciosas. B&C podría enfocarse en la adquisición y comercialización de propiedades que cumplan con estas características para aprovechar esta demanda y maximizar los ingresos.

  • La presencia de valores nulos en los diferentes registros en la base de datos y la cantidad de datos erróneos, resalta la importancia de mantener una base de datos precisa y completa. Se sugiere a la empresa B&C implementar medidas para mejorar la calidad de sus datos, como procesos de verificación y actualización regular, para garantizar la precisión de los análisis futuros y la toma de decisiones informadas.

6 ANEXO

El proceso de limpieza de datos se llevó a cabo de manera general, abordando diferentes aspectos para garantizar la integridad y la calidad de los datos. Inicialmente, se realizó la limpieza de las coordenadas geográficas, seguida por la corrección y estandarización de la información de la zona y los barrios. Posteriormente, se procedió a segmentar los datos por barrio y se aplicaron técnicas estadísticas para identificar el mejor enfoque de imputación de valores faltantes en las variables parqueaderos y ubicación de pisos. Estas variables son de particular relevancia en el contexto actual del mercado inmobiliario, ya que influyen directamente en la comercialización y el valor de los inmuebles. El objetivo final fue asegurar que los datos utilizados en el análisis fueran lo más precisos y completos, lo que permitirá obtener resultados más confiables y significativos en la evaluación y la toma de decisiones relacionadas con la venta de inmuebles. A continuación se muestran los pasos implementados.

6.1 Identificación del tipo de variable

Identificar el tipo de variable al iniciar un análisis estadístico, permite determinar el enfoque metodológico adecuado y las herramientas estadísticas apropiadas a utilizar. Las variables pueden clasificarse como cualitativas (categóricas) o cuantitativas (numéricas), y esta distinción es fundamental para elegir las técnicas estadísticas adecuadas. Las variables cualitativas requieren métodos distintos de análisis, como pruebas de frecuencia y proporción, mientras que las variables cuantitativas se analizan mediante técnicas estadísticas como la media, la mediana y la desviación estándar.

library(paqueteMETODOS)

data(vivienda_faltantes)  # Se cargan los datos 
ventas_cali=vivienda_faltantes # Se asigna una copia de la base de datos a una variable

datos1 <- data.frame(
      variable=c("id","zona","piso","preciom","areaconst","parquea","banios","habitac", "tipo","barrio","estrato"," longitud","latitud"),
  clase=c(class(vivienda_faltantes$id),
          class(vivienda_faltantes$zona),
          class(vivienda_faltantes$piso),
          class(vivienda_faltantes$estrato),
          class(vivienda_faltantes$preciom),
          class(vivienda_faltantes$areaconst),
          class(vivienda_faltantes$parquea),
          class(vivienda_faltantes$banios),
          class(vivienda_faltantes$habitac),
          class(vivienda_faltantes$tipo),
          class(vivienda_faltantes$barrio),
          class(vivienda_faltantes$longitud),
          class(vivienda_faltantes$latitud))
)
datatable(datos1, filter="top", options = list(pageLength = 5, scrollX=T))%>%
  formatStyle(names(datos1), backgroundColor = "lightgray")

Exploración visual

Los gráficos estadísticos realizados facilitaron una exploración rápida del estado inicial de la base de datos, lo que nos permitió identificar áreas clave para la transformación de los datos, incluyendo procesos de limpieza e imputación. En particular, observamos una presencia significativa de datos faltantes en las variables relacionadas con los pisos y los parqueaderos (31.7% y 19.3% respectivamente). Además, se detectaron registros con errores en casi todas las variables. Estas observaciones resaltan la importancia de abordar la calidad de los datos antes de realizar cualquier análisis o interpretación, y nos orientan hacia las estrategias necesarias para garantizar la integridad y la confiabilidad de los resultados finales.

library(naniar)
library(stringi)
library(gridExtra)
library(paqueteMETODOS)

data(vivienda_faltantes)  # Se cargan los datos 

graf1 <- ggplotGrob(gg_miss_var(vivienda_faltantes)+ labs(title = "Datos faltantes")+ theme(plot.title = element_text(hjust = 0.5)))

tab_tipo <-table(vivienda_faltantes$tipo)%>% data.frame()
graf2 <- ggplotGrob(ggplot(tab_tipo, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Distribución de tipo de inmueble", x = "Categoría", y = "frecuencia") + theme(plot.title = element_text(hjust = 0.5)))

tab_zona <-prop.table(table(vivienda_faltantes$zona))%>% data.frame()
tab_zona$proporcion <- tab_zona$Freq / sum(tab_zona$Freq)
graf3<- ggplotGrob(ggplot(tab_zona, aes(x= "", y = proporcion, fill = Var1)) + geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") + labs(title = "Distribución de la zona") +labs(fill = "Zonas") + theme(plot.title = element_text(hjust = 0.5)))

tab_lat<- subset(vivienda_faltantes,!is.na(vivienda_faltantes$latitud))
graf4 <- ggplotGrob(ggplot(tab_lat, aes(x = latitud)) + geom_histogram(binwidth = 100, fill = "blue", color = "black") +
  labs(title = "Distribución de la latitud", x = "Valor", y = "Frecuencia")+ theme(plot.title = element_text(hjust = 0.5)))

grid.arrange(graf1, graf2, graf3, graf4, nrow = 2, ncol = 2)

6.2 Limpieza e imputación de datos

Durante el proceso de limpieza de los datos de tipo de inmueble, longitud y latitud, se llevó a cabo una estandarización de la escritura. Esto implicó principalmente la corrección de errores como variaciones en mayúsculas y minúsculas, así como la corrección de unidades inconsistentes. Al estandarizar la escritura, se garantizó una representación coherente y uniforme de estos datos, lo que facilitará su análisis y procesamiento posterior.

load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/ventas_cali.RData")

##  Correccion del tipo de inmueble

ventas_cali<- ventas_cali%>% mutate(Tipo_inmueble = ifelse(Tipo_inmueble %in% c("APARTAMENTO", "apto","casa","CASA"), c("Apartamento","Casa"), Tipo_inmueble))
base::levels(as.factor(ventas_cali$Tipo_inmueble))  
## [1] "1" "2"
tab_tipo1<-prop.table(table(ventas_cali$Tipo_inmueble))%>% data.frame()
tab_tipo1$proporcion <- tab_tipo1$Freq / sum(tab_tipo1$Freq)
ggplot(tab_tipo1, aes(x= "", y = proporcion, fill = Var1)) + geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") + labs(title = "Distribución de tipo de inmueble") +labs(fill = "Tipo") + theme(plot.title = element_text(hjust = 0.5))

## Correccion de la longitud 

for (i in 1:length(ventas_cali$Longitud)) {
  if(is.na(ventas_cali$Longitud[i])=="FALSE"){
    if (ventas_cali$Longitud[i]<(-100)){
      ventas_cali$Longitud[i]=ventas_cali$Longitud[i]/1000
    }
  }
}

## Correccion de la latitud 

for (i in 1:length(ventas_cali$Latitud)) {
  if(is.na(ventas_cali$Latitud[i])=="FALSE"){
    if (ventas_cali$Latitud[i]>10){
      ventas_cali$Latitud[i]=ventas_cali$Latitud[i]/1000
    }
  }
}

Durante la limpieza de la variable de barrios, se utilizó una base de datos secundaria que contenía información geográfica oficial de los barrios como referencia. Esta capa geográfica sirvió como patrón principal para la corrección de los nombres de los barrios en la base de datos original. En primer lugar, se estandarizaron los nombres de los barrios en ambas bases de datos, eliminando acentos, tildes y convirtiendo todo a mayúsculas. Luego, se compararon los nombres de los barrios en ambas bases de datos y se identificaron aquellos que coincidían. Los barrios que no coincidían se corrigieron manualmente, utilizando la información de la capa geográfica como guía. Este proceso también se validó utilizando google maps para identificar cualquier discrepancia entre los nombres de los barrios en las dos fuentes de datos. Es importante destacar que la base de datos de la alcaldía no estaba actualizada, por lo que los barrios que no se encontraron en el patrón se asignaron como NA en la base de datos limpiada.

library(RColorBrewer)
library(paqueteMETODOS)
library(readr)
library(dplyr) 
library(ggplot2)
library(tidyverse)
library(leaflet)
library(sf)
library(leaflet.extras)
library(stringi)
library(gridExtra)
library(naniar)

load("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/ventas_cali.RData")

ruta_archivo <- "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/Barrios_Cali.gpkg"
file.exists(ruta_archivo)
Shape_BCali <- st_read(ruta_archivo) # fuente de datos secundaria (www.cali.gov.co)
Shape_BCali <- st_transform(Shape_BCali, crs = '+proj=longlat +datum=WGS84')

## Correccion del Barrio

ventas_cali$Barrio<-toupper(stringi::stri_trans_general(ventas_cali$Barrio,"Latin-ASCII")) # estadarizacion de los nombres (eliminar tildes, etc.) y trasformados a mayúsculas 
levels(as.factor(ventas_cali$Barrio))

lista_Barrios<-vector("list", length = 2) # Crea una lista de dos columnas para almacenar los barrios de la fuente de datos primaria y secundaria

lista_Barrios[[1]]<-as.list(levels(as.factor(ventas_cali$Barrio))) # Almacena en la primera lista lo correspondiente a la fuente de datos primaria 
lista_Barrios[[2]]<-as.list(levels(as.factor(Shape_BCali$barrio))) # Almacena en la primera lista lo correspondiente a la fuente de datos secundaria
names(lista_Barrios) <- c('Originales','Shape_Cali') # les asigna nombres a las listas 

intersect(lista_Barrios[[1]], lista_Barrios[[2]]) # Busca los barrios de cada una de las listas que cumplen con al interseccion (comunes en ambos)
setdiff(lista_Barrios[[1]], lista_Barrios[[2]]) # Busca los elementos que estan en la primera pero no en la segunda lista

lista_Barrios[[3]]<-as.list(toupper(stringi::stri_trans_general(lista_Barrios[[1]],"Latin-ASCII"))) 
lista_Barrios[[4]]<-as.list(toupper(stringi::stri_trans_general(lista_Barrios[[2]],"Latin-ASCII")))
names(lista_Barrios) <- c('Originales','Saape', 'ORG_homo', 'Shape_homo')

intersect(lista_Barrios[[3]], lista_Barrios[[4]])
setdiff(lista_Barrios[[3]], lista_Barrios[[4]])

ventas_cali$Barrio_limpio<-dplyr::recode_factor(ventas_cali$Barrio,
                                                  "ACOPI" = "BRISAS DE LOS ALAMOS",
                                                  "AGUA BLANCA" = "AGUABLANCA", 
                                                  "ALAMOS" = "CIUDAD DE LOS ALAMOS",
                                                  "ALBORADA" = "LA ALBORADA",
                                                  "ALCAZARES" = "LOS ALCAZARES",
                                                  "ALF√(C)REZ REAL" = "ALFEREZ REAL",
                                                  "ALFONSO LOPEZ" = "ALFONSO LOPEZ P. 1A ETAPA",
                                                  "ALFONSO LOPEZ I" = "ALFONSO LOPEZ P. 1A ETAPA",
                                                  "ALTO JORDAN" = "SECTOR ALTO JORDAN",
                                                  "ALTOS DE GUADALUPE" = "SECTOR CANAVERALEJO GUADALUPE",
                                                  "ALTOS DE SANTA" = "SECTOR ALTOS DE SANTA ISABEL",
                                                  "ALAMEDA DEL RIO" = "CIUDAD DE LOS ALAMOS",
                                                  "ARBOLEDA" = "ARBOLEDAS",
                                                  "ARBOLEDA CAMPESTRE CANDELARIA" = "NA",
                                                  "AUTOPISTA SUR" = "NA",
                                                  "BAJO AGUACATAL" = "AGUACATAL",
                                                  "BARRANQUILLA" = "LOS PARQUES BARRANQUILLA",
                                                  "BARRIO 7DE AGOSTO" = "SIETE DE AGOSTO",
                                                  "BARRIO EL RECUERDO" = "EL RECUERDO",
                                                  "BARRIO EUCARISTICO" = "EUCARISTICO",
                                                  "BARRIO TRANQUILO Y" = "NA",
                                                  "BASE A√(C)REA" = "BASE AEREA",
                                                  "BELLA SUIZA" = "CANAVERAL",
                                                  "BELLA SUIZA ALTA" = "CANAVERAL",
                                                  "BERLIN" = "SULTANA - BERLIN - SAN FRANCISCO",
                                                  "BLOQUES DEL LIMONAR" = "EL LIMONAR",
                                                  "BOCHALEMA" = "BOCHALEMA",
                                                  "CIUDAD BOCHALEMA" = "BOCHALEMA",
                                                  "BOSQUES DE ALBOLEDA" = "SANTA TERESITA",
                                                  "BOYACA" = "URBANIZACION BOYACA",
                                                  "BRISAS DE GUADALUPE" = "SECTOR CANAVERALEJO GUADALUPE",
                                                  "BRISAS DE LOS" = "BRISAS DE LOS ALAMOS",
                                                  "BRISAS DEL GUABITO" = "VILLA DEL PRADO - EL GUABITO",
                                                  "BUENO MADRID" = "UNIDAD RESIDENCIAL BUENO MADRID",
                                                  "CALI" = "NA",
                                                  "CALI BELLA" = "FEPICOL",
                                                  "CALI CANTO" = "LILI",
                                                  "CALIBELLA" = "FEPICOL",
                                                  "CALICANTO" = "LILI",
                                                  "CALICANTO VIII" = "LILI",
                                                  "CALIMIO NORTE" = "URBANIZACION CALIMIO",
                                                  "CAMBULOS" = "LOS CAMBULOS",
                                                  "CAMINO REAL" = "CAMINO REAL - LOS FUNDADORES",
                                                  "CAMPESTRE" = "CLUB CAMPESTRE",
                                                  "CANEY ESPECIAL" = "CANEY",
                                                  "CANASGORDAS" = "URBANIZACION RIO LILI",
                                                  "CANAVERALEJO" = "CANAVERALEJO - SEGUROS COLPATRIA",
                                                  "CANAVERALES" = "CANAVERALES - LOS SAMANES",
                                                  "CANAVERALES LOS SAMANES" = "CANAVERALES - LOS SAMANES",
                                                  "CAPRI" = "CIUDAD CAPRI",
                                                  "CASCAJAL" = "NA",
                                                  "CATAYA REAL" = "PARCELACIONES PANCE",
                                                  "CEIBAS" = "LAS CEIBAS",
                                                  "CENTELSA" = "MENGA",
                                                  "CENTRO" = "NA",
                                                  "CERRO CRISTALES" = "SECTOR ALTOS DE SANTA ISABEL",
                                                  "CERROS DE GUADALUPE" = "SECTOR CANAVERALEJO GUADALUPE",
                                                  "CHIMINANGOS" = "CHIMINANGOS I",
                                                  "CHIMINANGOS 1 ETAPA" = "CHIMINANGOS I",
                                                  "CHIMINANGOS 2 ETAPA" = "CHIMINANGOS II",
                                                  "CIUDAD ANTEJARDIN" = "URBANIZACION CIUDAD JARDIN",
                                                  "CIUDAD CORDOBA RESERVADO" = "CIUDAD CORDOBA",
                                                  "CIUDAD COUNTRY" = "NA",
                                                  "CIUDAD DEL CAMPO" = "NA",
                                                  "CIUDAD JARDIN" = "URBANIZACION CIUDAD JARDIN",
                                                  "CIUDAD JARDIN PANCE" = "PARCELACIONES PANCE",
                                                  "CIUDAD LOS ALAMOS" = "CIUDAD DE LOS ALAMOS",
                                                  "CIUDAD MEL√(C)NDEZ" = "MELENDEZ",
                                                  "CIUDAD MELENDEZ" = "MELENDEZ",
                                                  "CIUDAD MODELO" = "LOS SAUCES",
                                                  "CIUDAD PACIFICA" = "NA",
                                                  "CIUDAD REAL" = "NA",
                                                  "CIUDADELA DEL RIO" = "CIUDADELA DEL RIO - CVC",
                                                  "CIUDADELA MELENDEZ" = "SECTOR MELENDEZ",
                                                  "CIUDADELA PASO ANCHO" = "CIUDADELA PASOANCHO",
                                                  "COLINAS DE MENGA" = "ALTOS DE MENGA",
                                                  "COLINAS DEL BOSQUE" = "EL BOSQUE",
                                                  "COLON" = "CRISTOBAL COLON",
                                                  "COLSEGUROS" = "COLSEGUROS ANDES",
                                                  "COMFENALCO" = "PASO DEL COMERCIO",
                                                  "CONJUNTO GIBRALTAR" = "EL TRONCAL",
                                                  "CRISTALES" = "TEJARES - CRISTALES",
                                                  "CUARTO DE LEGUA" = "CUARTO DE LEGUA - GUADALUPE",
                                                  "ED BENJAMIN HERRERA" = "SAN PEDRO",
                                                  "EL CANEY" = "CANEY",
                                                  "EL CASTILLO" = "PANAMERICANO",
                                                  "EL GUABITO" = "VILLA DEL PRADO - EL GUABITO",
                                                  "EL INGENIO 3" = "EL INGENIO",
                                                  "EL INGENIO I" = "EL INGENIO",
                                                  "EL INGENIO II" = "EL INGENIO",
                                                  "EL INGENIO III" = "EL INGENIO",
                                                  "EL TR√(C)BOL" = "EL TREBOL",
                                                  "FARRALLONES DE PANCE" = "PARCELACIONES PANCE",
                                                  "FLORA" = "LA FLORA",
                                                  "FLORALIA" = "CIUDADELA FLORALIA",
                                                  "FUENTES DE LA" = "NA",
                                                  "GAITAN" = "JORGE ELIECER GAITAN",
                                                  "GRAN LIMONAR" = "EL GRAN LIMONAR",
                                                  "GUADALUPE" = "CUARTO DE LEGUA - GUADALUPE",
                                                  "GUADALUPE ALTO" = "SECTOR CANAVERALEJO GUADALUPE",
                                                  "GUADUALES" = "LOS GUADUALES",
                                                  "HACIENDA ALFEREZ REAL" = "ALFEREZ REAL",
                                                  "INGENIO" = "EL INGENIO",
                                                  "INGENIO I" = "EL INGENIO",
                                                  "INGENIO II" = "EL INGENIO",
                                                  "JAMUNDI" = "NA",
                                                  "JAMUNDI ALFAGUARA" = "NA",
                                                  "JOSE MANUEL MARROQUIN" = "JOSE MANUEL MARROQUIN I",
                                                  "JUANAMB√∫" = "JUANAMBU",
                                                  "LA ARBOLEDA" = "ARBOLEDAS",
                                                  "LA BUITRERA" = "NA",
                                                  "LA CEIBAS" = "LAS CEIBAS",
                                                  "LA LUISA" = "SECTOR ALTO LOS CHORROS",
                                                  "LA MORADA" = "NA",
                                                  "LA NUEVA BASE" = "URBANIZACION LA NUEVA BASE",
                                                  "LA PORTADA AL" = "SANTA TERESITA",
                                                  "LA PRIMAVERA" = "PRIMAVERA",
                                                  "LA REFORMA" = "NA",
                                                  "LA RIVERA" = "LA RIVERA I",
                                                  "LA RIVERA II" = "LA RIVERA I",
                                                  "LA RIVERITA" = "PARCELACIONES PANCE",
                                                  "LA RIVIERA" = "LOS ANDES B - LA RIVIERA",
                                                  "LA VILLA DEL" = "NA",
                                                  "LAFLORA" = "LA FLORA",
                                                  "LARES DE COMFENALCO" = "SECTOR PUENTE DEL COMERCIO",
                                                  "LAS AM√(C)RICAS" = "LAS AMERICAS",
                                                  "LAS CAMELIAS" = "CANAVERALES - LOS SAMANES",
                                                  "LAS QUINTAS DE" = "LAS QUINTAS DE DON SIMON",
                                                  "LAS VEGAS" = "MAYAPAN - LAS VEGAS",
                                                  "LAS VEGAS DE" = "EL CANEY",
                                                  "LIBERTADORES" = "LOS LIBERTADORES",
                                                  "LOS ALAMOS" = "CIUDAD LOS ALAMOS",
                                                  "LOS CRISTALES" = "TEJARES - CRISTALES",
                                                  "LOS CRISTALES CLUB" = "ALTOS DE SANTA ISABEL",
                                                  "LOS JOCKEYS" = "URBANIZACION CIUDAD JARDIN",
                                                  "MAMELLAN" = "BELLAVISTA",
                                                  "MAYAPAN LAS VEGAS" = "MAYAPAN - LAS VEGAS",
                                                  "MEL√(C)NDEZ" = "MELENDEZ",
                                                  "MIRADOL DEL AGUACATAL" = "AGUACATAL",
                                                  "MORICHAL DE COMFANDI" = "SECTOR ALTO JORDAN",
                                                  "MULTICENTRO" = "UNICENTRO CALI",
                                                  "NORMANDIA WEST POINT" = "NORMANDIA",
                                                  "NORTE" = "PRADOS DEL NORTE",
                                                  "NORTE LA FLORA" = "LA FLORA",
                                                  "NUEVA BASE" = "URBANIZACION NUEVA BASE",
                                                  "OASIS DE COMFANDI" = "LOS GUADUALES",
                                                  "OASIS DE PASOANCHO" = "COLSEGUROS ANDES",
                                                  "OCCIDENTE" = "NA",
                                                  "PACARA" = "LA MERCED",
                                                  "PALMAS DEL INGENIO" = "EL INGENIO",
                                                  "PAMPALINDA" = "PAMPA LINDA",
                                                  "PANCE" = "PARCELACIONES PANCE",
                                                  "PARQUE RESIDENCIAL EL" = "EL BOSQUE",
                                                  "POBLADO CAMPESTRE" = "NA",
                                                  "PONCE" = "PARCELACIONES PANCE",
                                                  "PORTADA DE COMFANDI" = "LOS ALCAZARES",
                                                  "PORTALES DE COMFANDI" = "NA",
                                                  "PUENTE DEL COMERCIO" = "SECTOR PUENTE DEL COMERCIO",
                                                  "PUENTE PALMA" = "CUARTO DE LEGUA - GUADALUPE",
                                                  "PASEO DE LOS" = "LOS PARQUES BARRANQUILLA",
                                                  "QUINTAS DE DON" = "LAS QUINTAS DE DON SIMON",
                                                  "QUINTAS DE SALOMIA" = "JORGE ELIECER GAITAN",
                                                  "REFUGIO" = "EL REFUGIO",
                                                  "REP√∫BLICA DE ISRAEL" = "REPUBLICA DE ISRAEL",
                                                  "RINCON DE LA" = "UNIDAD RESIDENCIAL BUENO MADRID",
                                                  "RINCON DE SALOMIA" = "SALOMIA",
                                                  "RIVERAS DEL VALLE" = "EL CANEY",
                                                  "ROZO LA TORRE" = "NA",
                                                  "SAMANES" = "CANAVERALES - LOS SAMANES",
                                                  "SAMANES DE GUADALUPE" = "CANAVERALES - LOS SAMANES",
                                                  "SAMECO" = "URBANIZACION LA FLORA",
                                                  "SAN BOSCO" = "SAN JUAN BOSCO",
                                                  "SAN FERNANDO" = "SAN FERNANDO NUEVO",
                                                  "SAN JOAQUIN" = "URBANIZACION SAN JOAQUIN",
                                                  "SAN JUDAS" = "SAN JUDAS TADEO I",
                                                  "SAN JUDAS TADEO" = "SAN JUDAS TADEO II",
                                                  "SANTA" = "SANTA TERESITA",
                                                  "SANTA ANITA" = "SANTA ANITA - LA SELVA",
                                                  "SANTA ANITA SUR" = "SANTA ANITA - LA SELVA",
                                                  "SANTA HELENA DE" = "SANTA ELENA",
                                                  "SANTA MONICA ALTA" = "SANTA MONICA",
                                                  "SANTA MONICA NORTE" = "SANTA MONICA",
                                                  "SANTA MONICA RESIDENCIAL" = "SANTA MONICA",
                                                  "SANTAFE" = "SANTA FE",
                                                  "SECTOR AGUACATAL" = "AGUACATAL",
                                                  "SEMINARIO" = "PAMPA LINDA",
                                                  "SIERRAS DE NORMANDIA" = "NORMANDIA",
                                                  "TEJARES CRISTALES" = "TEJARES - CRISTALES",
                                                  "TEJARES DE SAN" = "MIRAFLORES",
                                                  "TEMPLETE" = "EUCARISTICO",
                                                  "TEQUENDAMA" = "URBANIZACION TEQUENDAMA",
                                                  "TEQUENDEMA" = "NUEVA TEQUENDAMA",
                                                  "UNION DE VIVIENDA" = "UNION DE VIVIENDA POPULAR",
                                                  "URBANIZACION BARRANQUILLA" = "LOS PARQUES BARRANQUILLA",
                                                  "URBANIZACION EL SAMAN" = "CANAVERALES - LOS SAMANES",
                                                  "URBANIZACION GRATAMIRA" = "LA SELVA",
                                                  "URBANIZACION LA NUEVA" = "NUEVA FLORESTA",
                                                  "URBANIZACION LAS CASCADAS" = "CUARTO DE LEGUA - GUADALUPE",
                                                  "URBANIZACION LILI" = "URBANIZACION RIO LILI",
                                                  "URBANIZACION PACARA" = "CIUDAD LOS ALAMOS",
                                                  "VALLE DE LILI" = "LILI",
                                                  "VALLE DEL LILI" = "LILI",
                                                  "VILLA DE VERACRUZ" = "SALOMIA",
                                                  "VILLA DEL PARQUE" = "LOS PARQUES BARRANQUILLA",
                                                  "VILLA DEL PRADO" = "VILLA DEL PRADO - EL GUABITO",
                                                  "VILLAS DE VERACRUZ" = "SALOMIA",
                                                  "ZONA CENTRO" = "NA",
                                                  "ZONA NORTE" = "NA",
                                                  "ZONA NORTE LOS" = "NA",
                                                  "ZONA OESTE" = "NA",
                                                  "ZONA ORIENTE" = "NA",
                                                  "ZONA RESIDENCIAL" = "NA",
                                                  "ZONA SUR" = "NA"
) # se reescriben los barrios que no coinciden con el shape, que en este caso serian la fuente oficial

ventas_cali$Barrio_limpio<-as.factor(ventas_cali$Barrio_limpio) # se crea una nueva variable con los barrios limpios dentro del data frame original 
boxplot(ventas_cali$`Precio_(millones)` ~ ventas_cali$Barrio_limpio)
write.csv2(ventas_cali, "venta_cali.csv") # Guardo una copia de la base de datos en .csv

ventas_cali$Comuna <- NA # Creo una nueva variable comuna que se llenara a partir del vector comuna del shape


'/*
for (i in 1:length(Shape_BCali$Barrio_limpio)) {
    idx <- which(grepl(fixed(Shape_BCali$Barrio_limpio[i], ventas_cali$Barrio_limpio)))
    if(!is.null(idx)){
      ventas_cali$Comuna[idx] <- Shape_BCali$comuna[i]
    }
}
/*'

Las zonas fueron corregidas basándose en la información de las comunas de los barrios, lo que implicó reclasificar los datos según la distribución de las comunas.

# Correccion de zona 

ventas_cali$Zona_limpia<- NA  # Creo una variable nueva para la limepza de la zona de acuerdo a las comunas 

zona_limpia <- function(palabra) {
  
  palabra <- gsub("01", "Zona Oeste", palabra)
  palabra <- gsub("02", "Zona Oeste", palabra)
  palabra <- gsub("03", "Zona Centro", palabra)
  palabra <- gsub("04", "Zona Norte", palabra)
  palabra <- gsub("05", "Zona Norte", palabra)
  palabra <- gsub("06", "Zona Norte", palabra)
  palabra <- gsub("07", "Zona Norte", palabra)
  palabra <- gsub("08", "Zona Norte", palabra)
  palabra <- gsub("09", "Zona Centro", palabra)
  palabra <- gsub("10", "Zona Sur", palabra)
  palabra <- gsub("11", "Zona Oriente", palabra)
  palabra <- gsub("12", "Zona Oriente", palabra)
  palabra <- gsub("13", "Zona Oriente", palabra)
  palabra <- gsub("14", "Zona Oriente", palabra)
  palabra <- gsub("15", "Zona Oriente", palabra)
  palabra <- gsub("16", "Zona Oriente", palabra)
  palabra <- gsub("17", "Zona Sur", palabra)
  palabra <- gsub("18", "Zona Sur", palabra)
  palabra <- gsub("19", "Zona Sur", palabra)
  palabra <- gsub("20", "Zona Sur", palabra)
  palabra <- gsub("21", "Zona Oriente", palabra)
  palabra <- gsub("22", "Zona Sur", palabra)
  return(palabra)
  }  # Se crea una funcion para correguir la zona 
ventas_cali$Zona_limpia<- sapply(ventas_cali$Comuna, zona_limpia) # se aplica la correccion 

Teniendo en cuenta que el porcentaje de datos faltantes es bastante representativo, eliminarlos podría resultar en la pérdida de información valiosa. Por lo tanto, se optó por realizar una agrupación por barrios y calcular los principales indicadores estadísticos para establecer la distribución de los datos y su simetría. Este enfoque nos permitió identificar la mejor medida para la imputación de los datos faltantes. En este caso, dado que las variables de piso y parqueadero presentaban una distribución sesgada hacia la derecha, utilizar la media para la imputación no era la opción más adecuada. Por lo tanto, se extrajo la mediana por barrio y se completaron los datos originales con esta medida, asegurando así una imputación más robusta y representativa de los datos faltantes.Se puede observar que las distribuciones no se alteraron, conservaron su sesgo, quedando la base de datos lista para el análisis.

require(dplyr)
library(ggplot2)
library(gridExtra)

# IMPUTACION  DE LOS DATOS
par(mfrow=c(2,2))

## Imputacion de piso

ventas_cali$Ubicacion_piso<-as.numeric(ventas_cali$Ubicacion_piso)  # Verificamos el tiempo de dato para poder operar
ventas_cali$Barrio_limpio<-as.factor(ventas_cali$Barrio_limpio)
ventas_cali$Tipo_inmueble<-as.factor(ventas_cali$Tipo_inmueble)
hist(ventas_cali$Ubicacion_piso, ylim=c(0,2500),main = "Distribucion de pisos",      
                                     xlab="No. piso", ylab = "Frecuencia", col ="Violet")


# calculo de estadisticos para piso, agrupados por barrios 
Barrios_Piso<-ventas_cali%>%group_by(Barrio_limpio)%>%summarise(
  media = mean(Ubicacion_piso, na.rm = TRUE),
  mediana = round(median(Ubicacion_piso, na.rm = TRUE), digits = 0),
  IQR = IQR(Ubicacion_piso, na.rm = TRUE ),
  Q1 =quantile(Ubicacion_piso, 0.25, na.rm = TRUE),
  Q3 =quantile(Ubicacion_piso, 0.75, na.rm = TRUE),
  VarCoef = sd(Ubicacion_piso, na.rm = TRUE) / mean(Ubicacion_piso, na.rm = TRUE),
  sd = sd(Ubicacion_piso, na.rm = TRUE),
  #sd_med = abs(Ubicacion_piso - mediana)
)

Barrio_piso_sin_repetidos <- dplyr::distinct(Barrios_Piso,Barrio_limpio, .keep_all = TRUE)  # Se crea un vector que no tenga barrios repetidos 

# imputacion de pisos en el archivo original a partir de la mediana 

ventas_cali$Ubicacion_piso_limpio <- ventas_cali$Ubicacion_piso # creo una nueva columna para piso 
pos_na_piso<- which(is.na(ventas_cali$Ubicacion_piso_limpio)) # identifico las posiciones que tienen NA
barrio_na_piso <- ventas_cali$Barrio_limpio[pos_na_piso] # identifico a que Barrios corresponden los NA de piso 
medianas_para_na_piso <- Barrio_piso_sin_repetidos$mediana[match(barrio_na_piso, Barrio_piso_sin_repetidos$Barrio_limpio)] # Extreare las medianas de los barrio que tiene NA en piso 
ventas_cali$Ubicacion_piso_limpio[pos_na_piso] <- medianas_para_na_piso

hist(ventas_cali$Ubicacion_piso_limpio, ylim=c(0,3500),main = "Distribucion de pisos_imputados",    
     xlab="No. piso", ylab = "Frecuencia", col ="Violet")


## Imputacion de Numero de parqueadero

ventas_cali$No_Parqueaderos<-as.numeric(ventas_cali$No_Parqueaderos)  # Verificamos el tiempo de dato para poder operar
ventas_cali$Barrio_limpio<-as.factor(ventas_cali$Barrio_limpio)
hist(ventas_cali$No_Parqueaderos,xlim = c(0,10), ylim=c(0,3500),main = "Distribucion de No. parqueaderos",      
     xlab="No. parqueadero", ylab = "Frecuencia", col ="Violet")

# calculo de estadisticos para piso, agrupados por barrios 
Barrios_Parqueadero<-ventas_cali%>%group_by(Barrio_limpio)%>%summarise(
  media = mean(No_Parqueaderos, na.rm = TRUE),
  mediana = round(median(No_Parqueaderos, na.rm = TRUE), digits = 0),
  IQR = IQR(No_Parqueaderos, na.rm = TRUE ),
  Q1 =quantile(No_Parqueaderos, 0.25, na.rm = TRUE),
  Q3 =quantile(No_Parqueaderos, 0.75, na.rm = TRUE),
  VarCoef = sd(No_Parqueaderos, na.rm = TRUE) / mean(No_Parqueaderos, na.rm = TRUE),
  sd = sd(No_Parqueaderos, na.rm = TRUE),
  #sd_med = abs(No_Parqueaderos - mediana)
)

Barrio_parqueadero_sin_repetidos <- dplyr::distinct(Barrios_Parqueadero,Barrio_limpio, .keep_all = TRUE)  # Se crea un vector que no tenga barrios repetidos 

# imputacion de pisos en el archivo original a partir de la mediana 

ventas_cali$No_parqueaderos_imputado <- ventas_cali$No_Parqueaderos # creo una nueva columna para parqueadero
pos_na_praqueadero<- which(is.na(ventas_cali$No_parqueaderos_imputado)) # identifico las posiciones que tienen NA
barrio_na_parqueadero <- ventas_cali$Barrio_limpio[pos_na_praqueadero] # identifico a que Barrios corresponden los NA de parequeadero 
medianas_para_na_parqueadero <- Barrio_parqueadero_sin_repetidos$mediana[match(barrio_na_parqueadero, Barrio_parqueadero_sin_repetidos$Barrio_limpio)] # Extreare las medianas de los barrio que tiene NA en parqueadero 
ventas_cali$No_parqueaderos_imputado[pos_na_praqueadero] <- medianas_para_na_parqueadero

hist(ventas_cali$No_parqueaderos_imputado, xlim=c(1,10),ylim=c(0,5000),main = "Distribucion de parqueadero_imputado",       # se verifica la distribucion de la variable para identificar que etadisticos son adecuados 
     xlab="No. parqueadero", ylab = "Frecuencia", col ="Violet")

save(ventas_cali, file = "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1//ventas_cali.RData")

# EXTRACCION DE BASE DE DATOS LIMPIA 
'/*
BD_limpia <- subset(ventas_cali, select = c(id,Longitud,Latitud,Zona_limpia,Comuna,Barrio_limpio,Estrato,`Precio_(millones)`,Tipo_inmueble,Area_construida,Ubicacion_piso_limpio,No_parqueaderos_imputado,No_habitaciones,No_baños))
BD_limpia<- subset(BD_limpia, !is.na(Longitud) & !is.na(Latitud))
BD_limpia$Area_construida<-as.numeric(BD_limpia$Area_construida) 
BD_limpia$Precio_metro2 <- (BD_limpia$`Precio_(millones)`)/BD_limpia$Area_construida
BD_limpia$Precio_metro2 <- round(BD_limpia$Precio_metro2,digits = 3) 

/*'
## [1] "/*\nBD_limpia <- subset(ventas_cali, select = c(id,Longitud,Latitud,Zona_limpia,Comuna,Barrio_limpio,Estrato,`Precio_(millones)`,Tipo_inmueble,Area_construida,Ubicacion_piso_limpio,No_parqueaderos_imputado,No_habitaciones,No_baños))\nBD_limpia<- subset(BD_limpia, !is.na(Longitud) & !is.na(Latitud))\nBD_limpia$Area_construida<-as.numeric(BD_limpia$Area_construida) \nBD_limpia$Precio_metro2 <- (BD_limpia$`Precio_(millones)`)/BD_limpia$Area_construida\nBD_limpia$Precio_metro2 <- round(BD_limpia$Precio_metro2,digits = 3) \n\n/*"
# Graficos finales

load( "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_1/Metodos y simulacion estadistica/Unidad 1/Unidad 1/BD_limpia.RData")


graf1 <- ggplotGrob(gg_miss_var(BD_limpia)+ labs(title = "Datos faltantes")+ theme(plot.title = element_text(hjust = 0.5)))

tab_tipo <-table(BD_limpia$Tipo_inmueble)%>% data.frame()
graf2 <- ggplotGrob(ggplot(tab_tipo, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Distribucion de tipo de inmueble", x = "Tipo", y = "frecuencia") + theme(plot.title = element_text(hjust = 0.5)))

tab_zona1<-prop.table(table(BD_limpia$Zona_limpia))%>% data.frame()
tab_zona1$proporcion <- tab_zona1$Freq / sum(tab_zona1$Freq)

graf3<- ggplotGrob(ggplot(tab_zona1, aes(x= "", y = proporcion, fill = Var1)) + 
                     geom_bar(stat = "identity", width = 0.2) +
  coord_polar(theta = "y") + labs(title = "Distribucion de la zona") +
    labs(fill = "Zonas") + theme(plot.title = element_text(hjust = 0.5)))

tab_lat<- subset(BD_limpia,!is.na(BD_limpia$Latitud))
graf4 <- ggplotGrob(ggplot(tab_lat, aes(x = Latitud) ) + geom_histogram(bins =  30, color="black",fill="blue") +
  labs(title = "Distribucion de la latitud", x = "Valor", y = "Frecuencia")+ theme(plot.title = element_text(hjust = 0.5)))


gridExtra::grid.arrange(graf1, graf2, graf3, graf4, nrow = 2, ncol = 2)

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.