En lo corrido del presente año, el sector inmobiliario en Cali ha evidenciado una disminución significativa en las ventas de bienes raíces. Este comportamiento se ha visto influenciado por factores políticos y sociales que han generado incertidumbre en los inversionistas y compradores. Paralelamente, varias entidades bancarias de ahorro y vivienda han mantenido su apoyo a la industria de la construcción, otorgando créditos en montos relevantes tanto para proyectos comerciales como residenciales. Este panorama permite proyectar que, una vez disminuyan las tensiones actuales, la actividad económica en el sector inmobiliario tenderá a reactivarse de manera progresiva. En este contexto, se recibió una solicitud por parte de una compañía internacional interesada en adquirir dos viviendas en Cali, con el propósito de ubicar a dos de sus empleados y a sus respectivas familias.
Se realizó la validación de las variables a estudiar del dataset, las cuales se encuentran visualizadas en la tabla 1. A partir de esta información, se llevará a cabo un proceso exhaustivo de limpieza y preparación de datos, con el objetivo de garantizar un análisis exploratorio coherente y confiable que permita establecer bases sólidas para la elaboración del resumen ejecutivo presentado en este documento.
Es importante resaltar que varios de los estudios y resultados obtenidos se incluyen como anexos, con el fin de no entorpecer la lectura del documento principal. Si bien dichos anexos son indispensables para justificar las acciones adoptadas, la información detallada se encuentra al final del presente resumen ejecutivo.
# ---- 1. Se carga el dataset en una variable para ser usada y procesada en R
data("vivienda")
# --- 2. Se preparan los datos para la tabla resumen inicial ---
# Se obtiene la estructura del dataframe
col_names <- names(vivienda)
col_types <- sapply(vivienda, class)
col_counts <- sapply(vivienda, function(x) sum(!is.na(x)))
# Se calcula la cantidad y el porcentaje de valores faltantes por columna
total_faltantes <- sapply(vivienda, function(x) sum(is.na(x)))
porcentaje_faltantes <- sapply(vivienda, function(x) round(mean(is.na(x)) * 100, 2))
# Se consolida la informacion en un dataframe
tabla_final <- data.frame(
Nombre = c("id", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones",
"tipo", "estrato", "piso", "barrio", "zona","longitud","latitud"),
Naturaleza = c("Identificador", "Cuantitativa", "Cuantitativa", "Cuantitativa",
"Cuantitativa", "Cuantitativa", "Cualitativa", "Cualitativa Ordinal",
"Cuantitativa", "Cualitativa", "Cualitativa","cuantitativas continuas",
"cuantitativas continuas"),
Justificacion = c(
"Identificador único. No se usa para el análisis.",
"Representa una magnitud medible.",
"Representa una magnitud medible.",
"Es un conteo, pero se trata como cuantitativa.",
"Es un conteo, pero se trata como cuantitativa.",
"Es un conteo, pero se trata como cuantitativa.",
"Representa una categoría (ej. apartamento, casa).",
"Es una categoría con un orden (del 1 al 6). Inapropiada para PCA.",
"Representa una magnitud medible.",
"Representa una categoría.",
"Representa una categoría.",
"Representa una categoría.",
"Representa una categoría."
),
Conteo = col_counts,
Total_Faltantes = total_faltantes,
Porcentaje_Faltantes = porcentaje_faltantes
)
# --- 3. Se visualiza la tabla con kable y ajuste de estilo ---
kable(
tabla_final,
caption = "Tabla 1. Información de columnas Dataset Vivienda",
col.names = c("Nombre", "Naturaleza", "Justificacion","Conteo", "Total Faltantes", "Porcentaje (%)"),
format = "html",
align = c("l", "l", "l", "c", "c", "c"),
row.names = FALSE
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("striped", "hover", "responsive"),
position = "center",
font_size = 12,
row_label_position = "c"
) %>%
column_spec(1, width = "1in") %>%
column_spec(2, width = "1in") %>%
column_spec(3, width = "3in") %>%
column_spec(4, width = "1in") %>%
column_spec(5, width = "1in") %>%
column_spec(6, width = "1in") %>%
row_spec(0, bold = TRUE, color = "white", background = "#2C3E50")
Nombre | Naturaleza | Justificacion | Conteo | Total Faltantes | Porcentaje (%) |
---|---|---|---|---|---|
id | Identificador | Identificador único. No se usa para el análisis. | 8319 | 3 | 0.04 |
preciom | Cuantitativa | Representa una magnitud medible. | 8319 | 3 | 0.04 |
areaconst | Cuantitativa | Representa una magnitud medible. | 5684 | 2638 | 31.70 |
parqueaderos | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8319 | 3 | 0.04 |
banios | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8320 | 2 | 0.02 |
habitaciones | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8319 | 3 | 0.04 |
tipo | Cualitativa | Representa una categoría (ej. apartamento, casa). | 6717 | 1605 | 19.29 |
estrato | Cualitativa Ordinal | Es una categoría con un orden (del 1 al 6). Inapropiada para PCA. | 8319 | 3 | 0.04 |
piso | Cuantitativa | Representa una magnitud medible. | 8319 | 3 | 0.04 |
barrio | Cualitativa | Representa una categoría. | 8319 | 3 | 0.04 |
zona | Cualitativa | Representa una categoría. | 8319 | 3 | 0.04 |
longitud | cuantitativas continuas | Representa una categoría. | 8319 | 3 | 0.04 |
latitud | cuantitativas continuas | Representa una categoría. | 8319 | 3 | 0.04 |
El proceso de limpieza del conjunto de datos. Se identificaron los siguientes desafíos de calidad de datos, que se abordaron con los siguientes métodos:
Tratamiento de valores faltantes: En el análisis preliminar se evidenció que en la mayoría de los campos hacen falta únicamente tres registros. Tal como se observa en la Tabla 1, estos registros representan un 0.04% del total. Dado que este porcentaje es insignificante y no afecta la representatividad de la muestra, se decidió proceder con su eliminación. Por otro lado, se identificó que existen dos campos con un porcentaje considerable de valores faltantes: areaconst y tipo, con 31.7% y 19.29% de datos ausentes, respectivamente. Debido a la magnitud de estas ausencias, no resulta adecuado eliminarlos, ya que se perdería información relevante para el análisis. Para abordar este caso se aplicó la metodología MICE (Multiple Imputation by Chained Equations), la cual permite imputar valores faltantes de manera iterativa a partir de la relación entre variables. Se seleccionó el valor de la tercera iteración, garantizando así una estimación más estable y precisa para dichos campos.
Problemas de Estandarización: Se detectaron problemas de digitación y formato, como el uso de caracteres especiales y mayúsculas inconsistentes. Para estandarizar los datos, se eliminaron los caracteres especiales, se unificó la escritura a minúsculas y se corrigieron los nombres de los barrios con un alto porcentaje de similitud para consolidar registros (ej. alférez y alferez).
Este proceso de limpieza y preparación aseguró la integridad del conjunto de datos, permitiendo que los siguientes análisis sean fiables y robustos.
# --- 1. Se limpia el dataset y el resultado se guarda en el dataset vivienda_post_limp ---
# Se elimina filas duplicadas
vivienda_post_limp <- vivienda[!duplicated(vivienda), ]
# Se Elimina filas con valores faltantes en columnas con pocos datos perdidos
vivienda_post_limp <- vivienda_post_limp %>%
filter(!is.na(id))
# --- 2. Se inicia con el tratamiento de los datos ---
# --- 2.1. Normalización de caracteres para disminuir el error tipografico y humano ---
# Se realiza eliminación de caracteres especiales y normalización de tildes
vivienda_post_limp$barrio <- gsub("[^a-zA-ZáéíóúÁÉÍÓÚñÑ ]", "", vivienda_post_limp$barrio)
vivienda_post_limp$barrio <- chartr("áéíóúÁÉÍÓÚ", "aeiouAEIOU", vivienda_post_limp$barrio)
# Se transformar la columna piso de tipo caracter a tipo númerica
vivienda_post_limp <- vivienda_post_limp %>%
# Se hace uso de la función as.numeric()
mutate(piso = as.numeric(piso))
# Se Identificar las columnas de tipo carácter y se convierte a minúsculas todos los caracteres
chr_cols <- sapply(vivienda_post_limp, is.character)
vivienda_post_limp[chr_cols] <- lapply(vivienda_post_limp[chr_cols], tolower)
# ===============================================================================================================
# Posterior de tener todos los campos con un estandar de digitación. Se decidé que se van a unificar barrios
# por similitud se van a tratar los barrios que tengan menos de 5 valores y se reemplazara el barrio con el texto
# más parecido, por ejemplo si tenemos alfrez sera reemplazado por alferez
# --- 2.2. Unificación de barrios con pocos registros ---
# Se calcula el conteo de cada barrio
barrio_counts <- vivienda_post_limp %>%
group_by(barrio) %>%
summarise(conteo = n())
# Se divide los barrios en dos grupos: con conteo bajo y con conteo alto
low_count_barrios <- barrio_counts %>%
filter(conteo < 5) %>%
pull(barrio)
high_count_barrios <- barrio_counts %>%
filter(conteo >= 5) %>%
pull(barrio)
# Se registran los cambios en el siguiente dataframe
cambios_registrados <- data.frame(
barrio_original = character(),
barrio_unificado = character(),
distancia = numeric()
)
# Se inicia con la iteración de los barrios con conteo bajo y se busca el más similar
# Iterar sobre los barrios con conteo bajo y buscar el más similar
for (low_barrio in low_count_barrios) {
# Calcular la distancia de Levenshtein a todos los barrios de conteo alto
distancias <- stringdist(low_barrio, high_count_barrios, method = "lv")
# Encontrar el índice del barrio con la distancia mínima
min_dist_index <- which.min(distancias)
# Obtener el nombre del barrio más similar
similar_barrio <- high_count_barrios[min_dist_index]
# Registrar el cambio
cambios_registrados <- cambios_registrados %>%
add_row(barrio_original = low_barrio,
barrio_unificado = similar_barrio,
distancia = min(distancias))
# Unificar el nombre del barrio en el dataframe principal
vivienda_post_limp$barrio[vivienda_post_limp$barrio == low_barrio] <- similar_barrio
}
# --- 3. Se realiza la imputación de datos faltantes con la metodología MICE ---
# Se debe tener en cuenta que las variables de tipo 'object' en python, son 'character' en R.
# Sin embargo, mice requiere que las variables sean factores.
vivienda_post_limp$zona <- as.factor(vivienda_post_limp$zona)
vivienda_post_limp$tipo <- as.factor(vivienda_post_limp$tipo)
vivienda_post_limp$barrio <- as.factor(vivienda_post_limp$barrio)
# Se ejecuta el algoritmo MICE (genera 5 imputaciones por defecto)
# Se usa un seed para asegurar la reproducibilidad de los resultados
set.seed(123)
imputacion_mice <- mice(vivienda_post_limp, m = 5, method = 'cart', printFlag = FALSE)
Warning: Number of logged events: 50
# Se completa el dataframe con la tercera imputación
vivienda_mice <- complete(imputacion_mice, 3)
# --- 4. Se preparan los datos para la tabla resumen procesado 1 ---
# Se obtiene la estructura del dataframe
col_names <- names(vivienda_mice)
col_types <- sapply(vivienda_mice, class)
col_counts <- sapply(vivienda_mice, function(x) sum(!is.na(x)))
# Se calcula la cantidad y el porcentaje de valores faltantes por columna
total_faltantes <- sapply(vivienda_mice, function(x) sum(is.na(x)))
porcentaje_faltantes <- sapply(vivienda_mice, function(x) round(mean(is.na(x)) * 100, 2))
# Se consolida la informacion en un dataframe
tabla_final <- data.frame(
Nombre = c("id", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones",
"tipo", "estrato", "piso", "barrio", "zona","longitud","latitud"),
Naturaleza = c("Identificador", "Cuantitativa", "Cuantitativa", "Cuantitativa",
"Cuantitativa", "Cuantitativa", "Cualitativa", "Cualitativa Ordinal",
"Cuantitativa", "Cualitativa", "Cualitativa","cuantitativas continuas",
"cuantitativas continuas"),
Justificacion = c(
"Identificador único. No se usa para el análisis.",
"Representa una magnitud medible.",
"Representa una magnitud medible.",
"Es un conteo, pero se trata como cuantitativa.",
"Es un conteo, pero se trata como cuantitativa.",
"Es un conteo, pero se trata como cuantitativa.",
"Representa una categoría (ej. apartamento, casa).",
"Es una categoría con un orden (del 1 al 6). Inapropiada para PCA.",
"Representa una magnitud medible.",
"Representa una categoría.",
"Representa una categoría.",
"Representa una categoría.",
"Representa una categoría."
),
Conteo = col_counts,
Total_Faltantes = total_faltantes,
Porcentaje_Faltantes = porcentaje_faltantes
)
# --- 5. Se visualiza la tabla con kable y ajuste de estilo ---
kable(
tabla_final,
caption = "Tabla 2. Información de columnas Dataset Vivienda después de la limpieza",
col.names = c("Nombre", "Naturaleza", "Justificacion","Conteo", "Total Faltantes", "Porcentaje (%)"),
format = "html",
align = c("l", "l", "l", "c", "c", "c"),
row.names = FALSE
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("striped", "hover", "responsive"),
position = "center",
font_size = 12,
row_label_position = "c"
) %>%
column_spec(1, width = "1in") %>%
column_spec(2, width = "1in") %>%
column_spec(3, width = "3in") %>%
column_spec(4, width = "1in") %>%
column_spec(5, width = "1in") %>%
column_spec(6, width = "1in") %>%
row_spec(0, bold = TRUE, color = "white", background = "#2C3E50")
Nombre | Naturaleza | Justificacion | Conteo | Total Faltantes | Porcentaje (%) |
---|---|---|---|---|---|
id | Identificador | Identificador único. No se usa para el análisis. | 8319 | 0 | 0 |
preciom | Cuantitativa | Representa una magnitud medible. | 8319 | 0 | 0 |
areaconst | Cuantitativa | Representa una magnitud medible. | 8319 | 0 | 0 |
parqueaderos | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8319 | 0 | 0 |
banios | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8319 | 0 | 0 |
habitaciones | Cuantitativa | Es un conteo, pero se trata como cuantitativa. | 8319 | 0 | 0 |
tipo | Cualitativa | Representa una categoría (ej. apartamento, casa). | 8319 | 0 | 0 |
estrato | Cualitativa Ordinal | Es una categoría con un orden (del 1 al 6). Inapropiada para PCA. | 8319 | 0 | 0 |
piso | Cuantitativa | Representa una magnitud medible. | 8319 | 0 | 0 |
barrio | Cualitativa | Representa una categoría. | 8319 | 0 | 0 |
zona | Cualitativa | Representa una categoría. | 8319 | 0 | 0 |
longitud | cuantitativas continuas | Representa una categoría. | 8319 | 0 | 0 |
latitud | cuantitativas continuas | Representa una categoría. | 8319 | 0 | 0 |
Posterior al proceso de normalización, imputación y eliminación de datos faltantes en el dataset, se procedió a la ejecución del Análisis Exploratorio de Datos (EDA).
El objetivo de esta etapa es identificar patrones, relaciones y posibles anomalías en las variables, lo que permitirá contar con una visión más clara de la estructura del conjunto de datos. Este análisis constituye la base para la formulación de conclusiones sólidas y la generación de insumos confiables para la toma de decisiones estratégicas en el mercado inmobiliario.
vivienda_mice$preciom=log(vivienda_mice$preciom)
vivienda_mice$areaconst=log(vivienda_mice$areaconst)
GGally::ggpairs(vivienda_mice[,4:8], title=" Grafica 1. Correlaciones de campos en el dataset ")
Se observa una correlación fuerte y positiva entre el precio (preciom) y las siguientes variables:
Área construida (areaconst): Con un coeficiente de correlación de 0.807, esta es la relación más fuerte. Esto es lógico, ya que a mayor tamaño de una propiedad, mayor es su valor.
Número de baños (banios), estrato: Con un coeficiente de 0.721, existe una correlación muy sólida. Un mayor número de baños y un estrato alto se percibe como una característica de lujo o confort, lo que aumenta el precio.
Número de parqueaderos (parqueaderos): El coeficiente de 0.654 indica una correlación moderadamente fuerte. Tener espacio para estacionar vehículos es una amenidad valiosa que influye positivamente en el precio.
Es importante notar que las variables predictoras también están fuertemente correlacionadas entre sí. Por ejemplo:
areaconst y precio tienen una correlación de 0.807.
areaconst y banios tienen una correlación de 0.736.
precio y banios tienen una correlación de 0.721.
Estas altas correlaciones entre las variables predictoras se conocen como multicolinealidad. La multicolinealidad puede dificultar la interpretación de los coeficientes en un modelo de regresión lineal múltiple, ya que el efecto de una variable puede ser difícil de separar del de otra. Por ejemplo, si una propiedad tiene un área grande, es muy probable que también tenga más baños y parqueaderos, lo que hace que sus efectos individuales en el precio sean menos claros en el modelo.
En conclusión, el precio de la vivienda está principalmente determinado por su tamaño, las amenidades asociadas (baños y parqueaderos) y el estrato. Las altas correlaciones entre estas variables sugieren que el valor de una propiedad se puede percibir como un factor de “lujo y tamaño” en el mercado inmobiliario.
Con el dataset previamente depurado, se procede a realizar la verificación detallada de cada uno de los puntos mencionados en el Resumen Ejecutivo. Este proceso tiene como finalidad validar que las conclusiones y recomendaciones planteadas cuenten con un sustento técnico sólido, apoyado en los análisis efectuados. De esta manera, se asegura la coherencia entre los hallazgos del Análisis Exploratorio de Datos (EDA) y las propuestas presentadas en el documento principal.
# -------------------------------------------------------------------------
# Solicitud de Compra 1 (Zona Norte)
# -------------------------------------------------------------------------
# Paso 1: Filtrar la base de datos para casas en la Zona Norte
df_norte <- vivienda_mice %>%
filter(tipo == "casa", zona == "zona norte")
# Presentar los primeros 3 registros
print("Primeros 3 registros de casas en la zona norte:")
[1] "Primeros 3 registros de casas en la zona norte:"
print(head(df_norte, 3))
id zona piso estrato preciom areaconst parqueaderos banios
1 1209 zona norte 2 5 5.768321 5.010635 2 4
2 1592 zona norte 2 5 6.659294 5.940171 2 3
3 4057 zona norte 2 6 6.620073 6.098074 2 7
habitaciones tipo barrio longitud latitud
1 6 casa acopi -76.51341 3.47968
2 3 casa acopi -76.51674 3.48721
3 6 casa acopi -76.52950 3.38527
# Preparar los datos para el mapa
# Convierte el dataframe a un objeto sf (simple features) para georreferenciar
sf_norte <- st_as_sf(df_norte, coords = c("longitud", "latitud"), crs = 4326)
# Crear un mapa interactivo con leaflet
mapa_norte <- leaflet(data = sf_norte) %>%
addTiles() %>%
addMarkers(
popup = ~paste0(
"<b>Tipo:</b> ", tipo, "<br>",
"<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> $", preciom * 1000000, "<br>",
"<b>Área:</b> ", areaconst, " m²"
)
)
# Guardar el mapa como un archivo HTML (opcional)
htmlwidgets::saveWidget(mapa_norte, "mapa_zona_norte.html")
Los puntos de la “zona norte” se extienden más allá de los límites esperados, probablemente se debe a errores de digitación o etiquetado en el dataset. A pesar de que el filtro inicial se aplicó correctamente para la variable zona (que en teoría solo debería incluir registros de la zona norte), la columna barrio o la geolocalización (latitud, longitud) podría tener información errónea, lo que resulta en puntos que se ubican en otras zonas.
Implicaciones de los Errores de Georreferenciación
Resultados de Predicción Inexactos: Las predicciones para la primera solicitud de compra podrían ser menos precisas, ya que el modelo se basó en una muestra que no era puramente de la zona norte.
Decisiones Comerciales Erróneas: Al sugerir ofertas potenciales a los clientes, la empresa podría estar recomendando propiedades que, aunque etiquetadas como “norte”, no se encuentran en la zona de interés del cliente. Esto podría llevar a una mala experiencia para el comprador.
# Paso 2: Análisis Exploratorio de Datos (EDA)
# Variables de interés
vars_interes <- df_norte %>%
select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
# Matriz de correlación
cor_matrix <- cor(vars_interes)
print("Matriz de correlación:")
[1] "Matriz de correlación:"
print(round(cor_matrix, 2))
preciom areaconst estrato banios habitaciones parqueaderos
preciom 1.00 0.81 0.70 0.59 0.35 0.51
areaconst 0.81 1.00 0.55 0.51 0.38 0.43
estrato 0.70 0.55 1.00 0.41 0.11 0.36
banios 0.59 0.51 0.41 1.00 0.58 0.41
habitaciones 0.35 0.38 0.11 0.58 1.00 0.25
parqueaderos 0.51 0.43 0.36 0.41 0.25 1.00
# Gráfico de correlación interactivo con plotly
plot_corr <- corrplot(cor_matrix, method = "color", addCoef.col = "black", tl.col = "black")
print(plot_corr)
$corr
preciom areaconst estrato banios habitaciones parqueaderos
preciom 1.0000000 0.8088396 0.7045695 0.5869642 0.3496520 0.5096692
areaconst 0.8088396 1.0000000 0.5465287 0.5149420 0.3822592 0.4296504
estrato 0.7045695 0.5465287 1.0000000 0.4083039 0.1073141 0.3649908
banios 0.5869642 0.5149420 0.4083039 1.0000000 0.5755314 0.4115063
habitaciones 0.3496520 0.3822592 0.1073141 0.5755314 1.0000000 0.2491588
parqueaderos 0.5096692 0.4296504 0.3649908 0.4115063 0.2491588 1.0000000
$corrPos
xName yName x y corr
1 preciom preciom 1 6 1.0000000
2 preciom areaconst 1 5 0.8088396
3 preciom estrato 1 4 0.7045695
4 preciom banios 1 3 0.5869642
5 preciom habitaciones 1 2 0.3496520
6 preciom parqueaderos 1 1 0.5096692
7 areaconst preciom 2 6 0.8088396
8 areaconst areaconst 2 5 1.0000000
9 areaconst estrato 2 4 0.5465287
10 areaconst banios 2 3 0.5149420
11 areaconst habitaciones 2 2 0.3822592
12 areaconst parqueaderos 2 1 0.4296504
13 estrato preciom 3 6 0.7045695
14 estrato areaconst 3 5 0.5465287
15 estrato estrato 3 4 1.0000000
16 estrato banios 3 3 0.4083039
17 estrato habitaciones 3 2 0.1073141
18 estrato parqueaderos 3 1 0.3649908
19 banios preciom 4 6 0.5869642
20 banios areaconst 4 5 0.5149420
21 banios estrato 4 4 0.4083039
22 banios banios 4 3 1.0000000
23 banios habitaciones 4 2 0.5755314
24 banios parqueaderos 4 1 0.4115063
25 habitaciones preciom 5 6 0.3496520
26 habitaciones areaconst 5 5 0.3822592
27 habitaciones estrato 5 4 0.1073141
28 habitaciones banios 5 3 0.5755314
29 habitaciones habitaciones 5 2 1.0000000
30 habitaciones parqueaderos 5 1 0.2491588
31 parqueaderos preciom 6 6 0.5096692
32 parqueaderos areaconst 6 5 0.4296504
33 parqueaderos estrato 6 4 0.3649908
34 parqueaderos banios 6 3 0.4115063
35 parqueaderos habitaciones 6 2 0.2491588
36 parqueaderos parqueaderos 6 1 1.0000000
$arg
$arg$type
[1] "full"
# Gráfico de dispersión interactivo (Precio vs. Área Construida)
plot_scatter <- plot_ly(
data = df_norte,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers",
text = ~paste0("Área: ", areaconst, "m²", "<br>Precio: ", preciom, "M"),
hoverinfo = "text"
) %>%
layout(
title = "Precio vs. Área Construida (Zona Norte)",
xaxis = list(title = "Área Construida ($m^2$)"),
yaxis = list(title = "Precio (Millones COP)")
)
print(plot_scatter)
De la grafica de correlaciones (Modelo para la Zona Norte)
Variables y Coeficientes: Los resultados indican que todas las variables del modelo (areaconst, estrato, banios, habitaciones y parqueaderos) son estadísticamente significativas para predecir el precio. Esto se puede ver porque sus valores P (columna Pr(>|t|)) son muy cercanos a cero (representados como 2e-16), lo cual es mucho menor que el umbral de 0.05.
Área Construida (areaconst): El coeficiente de 0.81 es el más alto, lo que significa que el área construida es la variable que más influye en el precio. Por cada unidad adicional de área, el precio de la casa aumenta en 1.15 millones de pesos, de acuerdo a la grafica plotly que el precio está en millones y el área en unidades normalizadas de m2.
# Paso 3: Estimar el modelo de regresión lineal múltiple
modelo_norte <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = df_norte)
print("Resumen del modelo de regresión para la Zona Norte:")
[1] "Resumen del modelo de regresión para la Zona Norte:"
print(summary(modelo_norte))
Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
parqueaderos, data = df_norte)
Residuals:
Min 1Q Median 3Q Max
-0.78271 -0.17675 -0.01861 0.15585 1.07145
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.336046 0.092608 25.225 < 2e-16 ***
areaconst 0.463692 0.021637 21.430 < 2e-16 ***
estrato 0.190777 0.012697 15.025 < 2e-16 ***
banios 0.051602 0.009103 5.669 2.09e-08 ***
habitaciones 0.004371 0.006872 0.636 0.525
parqueaderos 0.049962 0.008924 5.599 3.07e-08 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.265 on 716 degrees of freedom
Multiple R-squared: 0.7834, Adjusted R-squared: 0.7819
F-statistic: 517.8 on 5 and 716 DF, p-value: < 2.2e-16
# Paso 4: Validación de supuestos del modelo
# Gráficos de diagnóstico para validar supuestos
par(mfrow = c(2, 2))
plot(modelo_norte)
par(mfrow = c(1, 1))
# Paso 5: Predecir el precio para la Solicitud 1
# Características de la solicitud 1
solicitud1 <- data.frame(
areaconst = 1.8, # Asumimos que la imagen proporcionada usa un valor normalizado
estrato = 4,
parqueaderos = 2,
banios = 3,
habitaciones = 4
)
# Predecir el precio
prediccion_norte <- predict(modelo_norte, newdata = solicitud1)
print(paste("El precio predicho para la solicitud 1 es:", round(prediccion_norte, 2), "millones de pesos"))
[1] "El precio predicho para la solicitud 1 es: 4.21 millones de pesos"
# Paso 6: Sugerir ofertas potenciales
# Filtrar ofertas que cumplan con el presupuesto
presupuesto_norte <- 350
ofertas_potenciales_norte <- df_norte %>%
filter(preciom <= presupuesto_norte / 1000000) %>% # Normalizar el presupuesto
select(preciom, areaconst, banios, habitaciones) %>%
head(5) # Seleccionar las primeras 5 ofertas
print("Ofertas potenciales para la solicitud 1 (Presupuesto $350 millones):")
[1] "Ofertas potenciales para la solicitud 1 (Presupuesto $350 millones):"
print(ofertas_potenciales_norte)
[1] preciom areaconst banios habitaciones
<0 rows> (or 0-length row.names)
# Crear un mapa con las ofertas potenciales
sf_potenciales_norte <- df_norte %>%
filter(preciom <= presupuesto_norte / 1000000) %>%
head(5) %>%
st_as_sf(coords = c("longitud", "latitud"), crs = 4326)
Warning in min(cc[[1]], na.rm = TRUE): no non-missing arguments to min;
returning Inf
Warning in min(cc[[2]], na.rm = TRUE): no non-missing arguments to min;
returning Inf
Warning in max(cc[[1]], na.rm = TRUE): no non-missing arguments to max;
returning -Inf
Warning in max(cc[[2]], na.rm = TRUE): no non-missing arguments to max;
returning -Inf
mapa_potenciales_norte <- leaflet(data = sf_potenciales_norte) %>%
addTiles() %>%
addCircleMarkers(
color = "blue",
radius = 5,
popup = ~paste0(
"<b>Tipo:</b> ", tipo, "<br>",
"<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> $", preciom * 1000000, "<br>",
"<b>Área:</b> ", areaconst, " m²"
)
)
htmlwidgets::saveWidget(mapa_potenciales_norte, "mapa_ofertas_norte.html")
Con el dataset previamente depurado, se procede a realizar la verificación detallada de cada uno de los puntos mencionados en el Resumen Ejecutivo. Este proceso tiene como finalidad validar que las conclusiones y recomendaciones planteadas cuenten con un sustento técnico sólido, apoyado en los análisis efectuados. De esta manera, se asegura la coherencia entre los hallazgos del Análisis Exploratorio de Datos (EDA) y las propuestas presentadas en el documento principal.
# -------------------------------------------------------------------------
# Solicitud de Compra 2 (Zona Sur)
# -------------------------------------------------------------------------
# Repetir los pasos 1 a 6 para la zona sur
df_sur <- vivienda_mice %>%
filter(tipo == "casa", zona == "zona sur")
print("Primeros 3 registros de casas en la zona sur:")
[1] "Primeros 3 registros de casas en la zona sur:"
print(head(df_sur, 3))
id zona piso estrato preciom areaconst parqueaderos banios
1 5992 zona sur 2 4 5.991465 5.634790 3 5
2 5157 zona sur 2 3 6.214608 5.869297 1 2
3 5501 zona sur 2 3 5.164786 4.624973 1 2
habitaciones tipo barrio longitud latitud
1 3 casa el lido -76.540 3.435
2 4 casa alameda -76.535 3.437
3 4 casa alameda -76.537 3.435
# Paso 2: Análisis Exploratorio de Datos (EDA)
# Variables de interés
vars_interes <- df_sur %>%
select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
# Matriz de correlación
cor_matrix <- cor(vars_interes)
print("Matriz de correlación:")
[1] "Matriz de correlación:"
print(round(cor_matrix, 2))
preciom areaconst estrato banios habitaciones parqueaderos
preciom 1.00 0.74 0.70 0.62 0.18 0.68
areaconst 0.74 1.00 0.38 0.56 0.38 0.53
estrato 0.70 0.38 1.00 0.41 -0.13 0.50
banios 0.62 0.56 0.41 1.00 0.49 0.46
habitaciones 0.18 0.38 -0.13 0.49 1.00 0.13
parqueaderos 0.68 0.53 0.50 0.46 0.13 1.00
# Gráfico de correlación interactivo con plotly
plot_corr <- corrplot(cor_matrix, method = "color", addCoef.col = "black", tl.col = "black")
print(plot_corr)
$corr
preciom areaconst estrato banios habitaciones parqueaderos
preciom 1.0000000 0.7389099 0.7029473 0.6207693 0.1781872 0.6778166
areaconst 0.7389099 1.0000000 0.3751482 0.5604822 0.3802726 0.5322119
estrato 0.7029473 0.3751482 1.0000000 0.4149569 -0.1304175 0.4984704
banios 0.6207693 0.5604822 0.4149569 1.0000000 0.4937376 0.4648849
habitaciones 0.1781872 0.3802726 -0.1304175 0.4937376 1.0000000 0.1297777
parqueaderos 0.6778166 0.5322119 0.4984704 0.4648849 0.1297777 1.0000000
$corrPos
xName yName x y corr
1 preciom preciom 1 6 1.0000000
2 preciom areaconst 1 5 0.7389099
3 preciom estrato 1 4 0.7029473
4 preciom banios 1 3 0.6207693
5 preciom habitaciones 1 2 0.1781872
6 preciom parqueaderos 1 1 0.6778166
7 areaconst preciom 2 6 0.7389099
8 areaconst areaconst 2 5 1.0000000
9 areaconst estrato 2 4 0.3751482
10 areaconst banios 2 3 0.5604822
11 areaconst habitaciones 2 2 0.3802726
12 areaconst parqueaderos 2 1 0.5322119
13 estrato preciom 3 6 0.7029473
14 estrato areaconst 3 5 0.3751482
15 estrato estrato 3 4 1.0000000
16 estrato banios 3 3 0.4149569
17 estrato habitaciones 3 2 -0.1304175
18 estrato parqueaderos 3 1 0.4984704
19 banios preciom 4 6 0.6207693
20 banios areaconst 4 5 0.5604822
21 banios estrato 4 4 0.4149569
22 banios banios 4 3 1.0000000
23 banios habitaciones 4 2 0.4937376
24 banios parqueaderos 4 1 0.4648849
25 habitaciones preciom 5 6 0.1781872
26 habitaciones areaconst 5 5 0.3802726
27 habitaciones estrato 5 4 -0.1304175
28 habitaciones banios 5 3 0.4937376
29 habitaciones habitaciones 5 2 1.0000000
30 habitaciones parqueaderos 5 1 0.1297777
31 parqueaderos preciom 6 6 0.6778166
32 parqueaderos areaconst 6 5 0.5322119
33 parqueaderos estrato 6 4 0.4984704
34 parqueaderos banios 6 3 0.4648849
35 parqueaderos habitaciones 6 2 0.1297777
36 parqueaderos parqueaderos 6 1 1.0000000
$arg
$arg$type
[1] "full"
# Gráfico de dispersión interactivo (Precio vs. Área Construida)
plot_scatter <- plot_ly(
data = df_sur,
x = ~areaconst,
y = ~preciom,
type = "scatter",
mode = "markers",
text = ~paste0("Área: ", areaconst, "m²", "<br>Precio: ", preciom, "M"),
hoverinfo = "text"
) %>%
layout(
title = "Precio vs. Área Construida (Zona Norte)",
xaxis = list(title = "Área Construida ($m^2$)"),
yaxis = list(title = "Precio (Millones COP)")
)
print(plot_scatter)
# Paso 3: Estimar el modelo de regresión lineal para la zona sur
modelo_sur <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = df_sur)
print("Resumen del modelo de regresión para la Zona Sur:")
[1] "Resumen del modelo de regresión para la Zona Sur:"
print(summary(modelo_sur))
Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
parqueaderos, data = df_sur)
Residuals:
Min 1Q Median 3Q Max
-1.02277 -0.15770 -0.02537 0.14596 1.42785
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.523409 0.066980 37.674 <2e-16 ***
areaconst 0.417276 0.013734 30.382 <2e-16 ***
estrato 0.221714 0.007851 28.241 <2e-16 ***
banios 0.057857 0.005637 10.264 <2e-16 ***
habitaciones -0.011501 0.004787 -2.403 0.0164 *
parqueaderos 0.075295 0.004961 15.177 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2514 on 1933 degrees of freedom
Multiple R-squared: 0.7993, Adjusted R-squared: 0.7987
F-statistic: 1539 on 5 and 1933 DF, p-value: < 2.2e-16
# Paso 4: Validación de supuestos (similar al anterior)
plot(modelo_sur)
# Paso 5: Predecir el precio para la Solicitud 2
# Características de la solicitud 2
solicitud2 <- data.frame(
areaconst = 3.5, # Asumimos que la imagen proporcionada usa un valor normalizado
estrato = 6,
parqueaderos = 3,
banios = 5,
habitaciones = 6
)
# Predecir el precio
prediccion_sur <- predict(modelo_sur, newdata = solicitud2)
print(paste("El precio predicho para la solicitud 2 es:", round(prediccion_sur, 2), "millones de pesos"))
[1] "El precio predicho para la solicitud 2 es: 5.76 millones de pesos"
# Paso 6: Sugerir ofertas potenciales
# Filtrar ofertas que cumplan con el presupuesto
presupuesto_sur <- 850
ofertas_potenciales_sur <- df_sur %>%
filter(preciom <= presupuesto_sur / 1000000) %>%
select(preciom, areaconst, banios, habitaciones) %>%
head(5)
print("Ofertas potenciales para la solicitud 2 (Presupuesto $850 millones):")
[1] "Ofertas potenciales para la solicitud 2 (Presupuesto $850 millones):"
print(ofertas_potenciales_sur)
[1] preciom areaconst banios habitaciones
<0 rows> (or 0-length row.names)
# Crear un mapa con las ofertas potenciales para la zona sur
sf_potenciales_sur <- df_sur %>%
filter(preciom <= presupuesto_sur / 1000000) %>%
head(5) %>%
st_as_sf(coords = c("longitud", "latitud"), crs = 4326)
Warning in min(cc[[1]], na.rm = TRUE): no non-missing arguments to min;
returning Inf
Warning in min(cc[[2]], na.rm = TRUE): no non-missing arguments to min;
returning Inf
Warning in max(cc[[1]], na.rm = TRUE): no non-missing arguments to max;
returning -Inf
Warning in max(cc[[2]], na.rm = TRUE): no non-missing arguments to max;
returning -Inf
mapa_potenciales_sur <- leaflet(data = sf_potenciales_sur) %>%
addTiles() %>%
addCircleMarkers(
color = "red",
radius = 5,
popup = ~paste0(
"<b>Tipo:</b> ", tipo, "<br>",
"<b>Barrio:</b> ", barrio, "<br>",
"<b>Precio:</b> $", preciom * 1000000, "<br>",
"<b>Área:</b> ", areaconst, " m²"
)
)
htmlwidgets::saveWidget(mapa_potenciales_sur, "mapa_ofertas_sur.html")
Anexo 1. Resultados iniciales de la función summary
Como primer anexo, se presentan los resultados obtenidos a partir de la función summary. En este análisis preliminar se identificó que varios campos contienen valores faltantes, lo cual requiere un tratamiento adecuado para evitar sesgos en el análisis posterior.
Adicionalmente, se evidenció la ausencia de estandarización en el campo Barrio, ya que el mismo sector aparece representado con categorías distintas debido a errores de digitación, faltas de ortografía y contracciones de palabras. Esta inconsistencia genera dispersión en los datos y dificulta la correcta agrupación y análisis de la información, por lo que será necesario aplicar un proceso de normalización y depuración.
#apartamentos=subset(vivienda, tipo=="Apartamento")
#vivienda$zona = as.factor(vivienda$zona)
summarytools::freq(vivienda)
Frequencies
vivienda$zona
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
------------------ ------ --------- -------------- --------- --------------
Zona Centro 124 1.491 1.491 1.490 1.490
Zona Norte 1920 23.080 24.570 23.071 24.561
Zona Oeste 1198 14.401 38.971 14.396 38.957
Zona Oriente 351 4.219 43.190 4.218 43.175
Zona Sur 4726 56.810 100.000 56.789 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$piso
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
----------- ------ --------- -------------- --------- --------------
01 860 15.13 15.13 10.33 10.33
02 1450 25.51 40.64 17.42 27.76
03 1097 19.30 59.94 13.18 40.94
04 607 10.68 70.62 7.29 48.23
05 567 9.98 80.59 6.81 55.05
06 245 4.31 84.90 2.94 57.99
07 204 3.59 88.49 2.45 60.44
08 211 3.71 92.21 2.54 62.98
09 146 2.57 94.77 1.75 64.73
10 130 2.29 97.06 1.56 66.29
11 84 1.48 98.54 1.01 67.30
12 83 1.46 100.00 1.00 68.30
<NA> 2638 31.70 100.00
Total 8322 100.00 100.00 100.00 100.00
vivienda$estrato
Type: Numeric
Freq % Valid % Valid Cum. % Total % Total Cum.
----------- ------ --------- -------------- --------- --------------
3 1453 17.466 17.466 17.460 17.460
4 2129 25.592 43.058 25.583 43.043
5 2750 33.057 76.115 33.045 76.087
6 1987 23.885 100.000 23.876 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$parqueaderos
Type: Numeric
Freq % Valid % Valid Cum. % Total % Total Cum.
----------- ------ --------- -------------- --------- --------------
1 3155 46.970 46.970 37.912 37.912
2 2475 36.847 83.817 29.740 67.652
3 520 7.742 91.559 6.248 73.901
4 384 5.717 97.276 4.614 78.515
5 68 1.012 98.288 0.817 79.332
6 68 1.012 99.300 0.817 80.149
7 18 0.268 99.568 0.216 80.365
8 17 0.253 99.821 0.204 80.570
9 4 0.060 99.881 0.048 80.618
10 8 0.119 100.000 0.096 80.714
<NA> 1605 19.286 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$banios
Type: Numeric
Freq % Valid % Valid Cum. % Total % Total Cum.
----------- ------ --------- -------------- --------- --------------
0 45 0.541 0.541 0.541 0.541
1 496 5.962 6.503 5.960 6.501
2 2946 35.413 41.916 35.400 41.901
3 1993 23.957 65.873 23.949 65.850
4 1456 17.502 83.375 17.496 83.345
5 890 10.698 94.074 10.695 94.040
6 314 3.774 97.848 3.773 97.813
7 107 1.286 99.135 1.286 99.099
8 48 0.577 99.712 0.577 99.676
9 15 0.180 99.892 0.180 99.856
10 9 0.108 100.000 0.108 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$habitaciones
Type: Numeric
Freq % Valid % Valid Cum. % Total % Total Cum.
----------- ------ --------- -------------- --------- --------------
0 66 0.793 0.793 0.793 0.793
1 59 0.709 1.503 0.709 1.502
2 926 11.131 12.634 11.127 12.629
3 4097 49.249 61.882 49.231 61.860
4 1729 20.784 82.666 20.776 82.636
5 679 8.162 90.828 8.159 90.795
6 318 3.823 94.651 3.821 94.617
7 173 2.080 96.730 2.079 96.696
8 138 1.659 98.389 1.658 98.354
9 83 0.998 99.387 0.997 99.351
10 51 0.613 100.000 0.613 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$tipo
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
----------------- ------ --------- -------------- --------- --------------
Apartamento 5100 61.305 61.305 61.283 61.283
Casa 3219 38.695 100.000 38.681 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000
vivienda$barrio
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
----------------------------------- ------ --------- -------------- --------- --------------
20 de julio 3 0.036 0.036 0.036 0.036
3 de julio 1 0.012 0.048 0.012 0.048
acopi 158 1.899 1.947 1.899 1.947
agua blanca 1 0.012 1.959 0.012 1.959
aguablanca 2 0.024 1.983 0.024 1.983
aguacatal 109 1.310 3.294 1.310 3.292
alameda 16 0.192 3.486 0.192 3.485
alameda del rio 1 0.012 3.498 0.012 3.497
alameda del río 2 0.024 3.522 0.024 3.521
alamos 14 0.168 3.690 0.168 3.689
alborada 1 0.012 3.702 0.012 3.701
alcazares 2 0.024 3.726 0.024 3.725
alférez real 5 0.060 3.787 0.060 3.785
alferez real 2 0.024 3.811 0.024 3.809
alfonso lopez 1 0.012 3.823 0.012 3.821
alfonso lópez 21 0.252 4.075 0.252 4.074
alfonso lópez i 1 0.012 4.087 0.012 4.086
alto jordán 1 0.012 4.099 0.012 4.098
altos de guadalupe 4 0.048 4.147 0.048 4.146
altos de menga 3 0.036 4.183 0.036 4.182
altos de santa 1 0.012 4.195 0.012 4.194
antonio nariño 2 0.024 4.219 0.024 4.218
aranjuez 15 0.180 4.400 0.180 4.398
arboleda 5 0.060 4.460 0.060 4.458
arboleda campestre candelaria 1 0.012 4.472 0.012 4.470
arboledas 38 0.457 4.928 0.457 4.927
atanasio girardot 9 0.108 5.037 0.108 5.035
autopista sur 1 0.012 5.049 0.012 5.047
bajo aguacatal 1 0.012 5.061 0.012 5.059
barranquilla 6 0.072 5.133 0.072 5.131
barrio 7de agosto 1 0.012 5.145 0.012 5.143
barrio el recuerdo 1 0.012 5.157 0.012 5.155
barrio eucarístico 1 0.012 5.169 0.012 5.167
barrio obrero 1 0.012 5.181 0.012 5.179
barrio tranquilo y 1 0.012 5.193 0.012 5.191
base aérea 2 0.024 5.217 0.024 5.215
belalcazar 3 0.036 5.253 0.036 5.251
Belalcazar 1 0.012 5.265 0.012 5.263
belisario caicedo 2 0.024 5.289 0.024 5.287
bella suiza 18 0.216 5.505 0.216 5.503
bella suiza alta 4 0.048 5.554 0.048 5.552
bellavista 43 0.517 6.070 0.517 6.068
benjamín herrera 8 0.096 6.167 0.096 6.164
berlin 1 0.012 6.179 0.012 6.176
bloques del limonar 1 0.012 6.191 0.012 6.188
bochalema 33 0.397 6.587 0.397 6.585
bolivariano 1 0.012 6.599 0.012 6.597
bosques de alboleda 1 0.012 6.611 0.012 6.609
bosques del limonar 21 0.252 6.864 0.252 6.861
boyacá 1 0.012 6.876 0.012 6.873
bretaña 16 0.192 7.068 0.192 7.066
brisas de guadalupe 1 0.012 7.080 0.012 7.078
brisas de los 81 0.974 8.054 0.973 8.051
Brisas De Los 1 0.012 8.066 0.012 8.063
brisas del guabito 1 0.012 8.078 0.012 8.075
brisas del limonar 1 0.012 8.090 0.012 8.087
Bueno Madrid 1 0.012 8.102 0.012 8.099
buenos aires 7 0.084 8.186 0.084 8.183
caldas 1 0.012 8.198 0.012 8.195
Cali 37 0.445 8.643 0.445 8.640
cali bella 1 0.012 8.655 0.012 8.652
cali canto 1 0.012 8.667 0.012 8.664
calibella 1 0.012 8.679 0.012 8.676
calicanto 8 0.096 8.775 0.096 8.772
calicanto viii 1 0.012 8.787 0.012 8.784
calima 6 0.072 8.859 0.072 8.856
calimio norte 5 0.060 8.919 0.060 8.916
calipso 11 0.132 9.052 0.132 9.048
cambulos 3 0.036 9.088 0.036 9.084
camino real 35 0.421 9.508 0.421 9.505
Camino Real 1 0.012 9.520 0.012 9.517
campestre 1 0.012 9.532 0.012 9.529
cañasgordas 7 0.084 9.617 0.084 9.613
cañaveralejo 12 0.144 9.761 0.144 9.757
cañaverales 21 0.252 10.013 0.252 10.010
cañaverales los samanes 1 0.012 10.025 0.012 10.022
caney 88 1.058 11.083 1.057 11.079
caney especial 5 0.060 11.143 0.060 11.139
capri 56 0.673 11.816 0.673 11.812
cascajal 1 0.012 11.828 0.012 11.824
cataya real 1 0.012 11.840 0.012 11.836
ceibas 1 0.012 11.852 0.012 11.848
centelsa 1 0.012 11.864 0.012 11.860
centenario 15 0.180 12.045 0.180 12.040
Centenario 1 0.012 12.057 0.012 12.052
centro 4 0.048 12.105 0.048 12.100
cerro cristales 22 0.264 12.369 0.264 12.365
cerros de guadalupe 1 0.012 12.381 0.012 12.377
champagnat 14 0.168 12.550 0.168 12.545
chapinero 7 0.084 12.634 0.084 12.629
chiminangos 17 0.204 12.838 0.204 12.833
Chiminangos 1 0.012 12.850 0.012 12.845
chiminangos 1 etapa 1 0.012 12.862 0.012 12.857
chiminangos 2 etapa 2 0.024 12.886 0.024 12.882
chipichape 30 0.361 13.247 0.360 13.242
ciudad 2000 95 1.142 14.389 1.142 14.384
Ciudad 2000 1 0.012 14.401 0.012 14.396
ciudad antejardin 1 0.012 14.413 0.012 14.408
ciudad bochalema 48 0.577 14.990 0.577 14.984
ciudad capri 13 0.156 15.146 0.156 15.141
ciudad cordoba 20 0.240 15.386 0.240 15.381
ciudad córdoba 15 0.180 15.567 0.180 15.561
ciudad córdoba reservado 1 0.012 15.579 0.012 15.573
ciudad country 1 0.012 15.591 0.012 15.585
ciudad del campo 1 0.012 15.603 0.012 15.597
ciudad jardin 22 0.264 15.867 0.264 15.862
ciudad jardín 516 6.203 22.070 6.200 22.062
Ciudad Jardín 2 0.024 22.094 0.024 22.086
ciudad jardin pance 1 0.012 22.106 0.012 22.098
ciudad los alamos 1 0.012 22.118 0.012 22.110
ciudad los álamos 25 0.301 22.419 0.300 22.410
ciudad meléndez 1 0.012 22.431 0.012 22.422
ciudad melendez 1 0.012 22.443 0.012 22.435
ciudad modelo 7 0.084 22.527 0.084 22.519
ciudad pacifica 2 0.024 22.551 0.024 22.543
Ciudad Pacifica 1 0.012 22.563 0.012 22.555
ciudad real 3 0.036 22.599 0.036 22.591
ciudad talanga 1 0.012 22.611 0.012 22.603
ciudad universitaria 1 0.012 22.623 0.012 22.615
ciudadela comfandi 17 0.204 22.827 0.204 22.819
ciudadela del río 1 0.012 22.839 0.012 22.831
ciudadela melendez 1 0.012 22.851 0.012 22.843
ciudadela paso ancho 1 0.012 22.863 0.012 22.855
ciudadela pasoancho 21 0.252 23.116 0.252 23.107
colinas de menga 3 0.036 23.152 0.036 23.143
colinas del bosque 1 0.012 23.164 0.012 23.155
colinas del sur 8 0.096 23.260 0.096 23.252
colon 1 0.012 23.272 0.012 23.264
colseguros 44 0.529 23.801 0.529 23.792
colseguros andes 4 0.048 23.849 0.048 23.840
Colseguros Andes 1 0.012 23.861 0.012 23.852
comfenalco 1 0.012 23.873 0.012 23.864
compartir 1 0.012 23.885 0.012 23.876
conjunto gibraltar 1 0.012 23.897 0.012 23.888
cristales 83 0.998 24.895 0.997 24.886
cristobal colón 14 0.168 25.063 0.168 25.054
cristóbal colón 2 0.024 25.087 0.024 25.078
cuarto de legua 44 0.529 25.616 0.529 25.607
departamental 29 0.349 25.965 0.348 25.955
ed benjamin herrera 1 0.012 25.977 0.012 25.967
el bosque 49 0.589 26.566 0.589 26.556
El Bosque 1 0.012 26.578 0.012 26.568
el caney 208 2.500 29.078 2.499 29.068
El Caney 1 0.012 29.090 0.012 29.080
el castillo 6 0.072 29.162 0.072 29.152
el cedro 8 0.096 29.258 0.096 29.248
el diamante 2 0.024 29.282 0.024 29.272
el dorado 6 0.072 29.354 0.072 29.344
el gran limonar 8 0.096 29.451 0.096 29.440
el guabal 19 0.228 29.679 0.228 29.668
el guabito 1 0.012 29.691 0.012 29.680
el ingenio 202 2.428 32.119 2.427 32.108
El Ingenio 1 0.012 32.131 0.012 32.120
el ingenio 3 1 0.012 32.143 0.012 32.132
el ingenio i 19 0.228 32.372 0.228 32.360
el ingenio ii 21 0.252 32.624 0.252 32.612
el ingenio iii 20 0.240 32.865 0.240 32.853
el jardín 15 0.180 33.045 0.180 33.033
el jordán 1 0.012 33.057 0.012 33.045
el lido 59 0.709 33.766 0.709 33.754
el limonar 135 1.623 35.389 1.622 35.376
el nacional 1 0.012 35.401 0.012 35.388
el paraíso 3 0.036 35.437 0.036 35.424
el peñon 60 0.721 36.158 0.721 36.145
el prado 2 0.024 36.182 0.024 36.169
el refugio 120 1.442 37.625 1.442 37.611
el rodeo 1 0.012 37.637 0.012 37.623
el sena 1 0.012 37.649 0.012 37.635
el trébol 5 0.060 37.709 0.060 37.695
el troncal 19 0.228 37.937 0.228 37.924
el vallado 1 0.012 37.949 0.012 37.936
eucarístico 2 0.024 37.973 0.024 37.960
evaristo garcía 2 0.024 37.997 0.024 37.984
farrallones de pance 1 0.012 38.009 0.012 37.996
fenalco kennedy 1 0.012 38.021 0.012 38.008
fepicol 1 0.012 38.033 0.012 38.020
flora 1 0.012 38.045 0.012 38.032
flora industrial 16 0.192 38.238 0.192 38.224
floralia 6 0.072 38.310 0.072 38.296
fonaviemcali 1 0.012 38.322 0.012 38.308
francisco eladio ramirez 1 0.012 38.334 0.012 38.320
fuentes de la 1 0.012 38.346 0.012 38.332
gaitan 1 0.012 38.358 0.012 38.344
gran limonar 24 0.288 38.646 0.288 38.633
granada 15 0.180 38.827 0.180 38.813
guadalupe 21 0.252 39.079 0.252 39.065
guadalupe alto 1 0.012 39.091 0.012 39.077
guaduales 2 0.024 39.115 0.024 39.101
guayaquil 16 0.192 39.308 0.192 39.293
hacienda alferez real 1 0.012 39.320 0.012 39.305
ingenio 1 0.012 39.332 0.012 39.317
ingenio i 1 0.012 39.344 0.012 39.329
ingenio ii 1 0.012 39.356 0.012 39.342
jamundi 4 0.048 39.404 0.048 39.390
jamundi alfaguara 1 0.012 39.416 0.012 39.402
jorge eliecer gaitán 1 0.012 39.428 0.012 39.414
jorge isaacs 1 0.012 39.440 0.012 39.426
jose manuel marroquín 1 0.012 39.452 0.012 39.438
juanamb√∫ 53 0.637 40.089 0.637 40.075
juanambu 2 0.024 40.113 0.024 40.099
junin 18 0.216 40.329 0.216 40.315
junín 6 0.072 40.401 0.072 40.387
la alborada 5 0.060 40.462 0.060 40.447
la alianza 5 0.060 40.522 0.060 40.507
la arboleda 18 0.216 40.738 0.216 40.723
la base 15 0.180 40.918 0.180 40.904
la buitrera 3 0.036 40.954 0.036 40.940
la campiña 13 0.156 41.111 0.156 41.096
la cascada 7 0.084 41.195 0.084 41.180
la ceibas 1 0.012 41.207 0.012 41.192
la esmeralda 1 0.012 41.219 0.012 41.204
la flora 366 4.400 45.618 4.398 45.602
La Flora 2 0.024 45.643 0.024 45.626
la floresta 18 0.216 45.859 0.216 45.842
la fortaleza 4 0.048 45.907 0.048 45.890
la gran colombia 1 0.012 45.919 0.012 45.902
la hacienda 164 1.971 47.890 1.971 47.873
La Hacienda 2 0.024 47.914 0.024 47.897
la independencia 12 0.144 48.059 0.144 48.041
la libertad 2 0.024 48.083 0.024 48.065
la luisa 1 0.012 48.095 0.012 48.077
la merced 26 0.313 48.407 0.312 48.390
la morada 1 0.012 48.419 0.012 48.402
la nueva base 8 0.096 48.515 0.096 48.498
la playa 1 0.012 48.527 0.012 48.510
la portada al 1 0.012 48.539 0.012 48.522
la primavera 1 0.012 48.552 0.012 48.534
la reforma 1 0.012 48.564 0.012 48.546
la rivera 11 0.132 48.696 0.132 48.678
la rivera i 2 0.024 48.720 0.024 48.702
la rivera ii 2 0.024 48.744 0.024 48.726
la riverita 1 0.012 48.756 0.012 48.738
la riviera 1 0.012 48.768 0.012 48.750
la selva 11 0.132 48.900 0.132 48.882
la villa del 1 0.012 48.912 0.012 48.894
laflora 1 0.012 48.924 0.012 48.907
lares de comfenalco 1 0.012 48.936 0.012 48.919
las acacias 12 0.144 49.080 0.144 49.063
las américas 3 0.036 49.116 0.036 49.099
las camelias 1 0.012 49.129 0.012 49.111
las ceibas 23 0.276 49.405 0.276 49.387
las delicias 5 0.060 49.465 0.060 49.447
las granjas 10 0.120 49.585 0.120 49.567
las quintas de 1 0.012 49.597 0.012 49.579
las vegas 1 0.012 49.609 0.012 49.591
las vegas de 1 0.012 49.621 0.012 49.603
libertadores 3 0.036 49.657 0.036 49.640
los alamos 1 0.012 49.669 0.012 49.652
los alcazares 17 0.204 49.874 0.204 49.856
los alcázares 5 0.060 49.934 0.060 49.916
los andes 21 0.252 50.186 0.252 50.168
los cambulos 25 0.301 50.487 0.300 50.469
los cámbulos 6 0.072 50.559 0.072 50.541
los cristales 154 1.851 52.410 1.851 52.391
los cristales club 1 0.012 52.422 0.012 52.403
los farallones 4 0.048 52.470 0.048 52.451
los guaduales 25 0.301 52.771 0.300 52.752
Los Guaduales 1 0.012 52.783 0.012 52.764
los guayacanes 3 0.036 52.819 0.036 52.800
los jockeys 1 0.012 52.831 0.012 52.812
los libertadores 4 0.048 52.879 0.048 52.860
los parques barranquilla 6 0.072 52.951 0.072 52.932
los robles 1 0.012 52.963 0.012 52.944
lourdes 2 0.024 52.987 0.024 52.968
mamellan 1 0.012 52.999 0.012 52.980
manzanares 5 0.060 53.059 0.060 53.040
mariano ramos 1 0.012 53.071 0.012 53.052
marroquín iii 1 0.012 53.083 0.012 53.064
mayapan las vegas 46 0.553 53.636 0.553 53.617
meléndez 23 0.276 53.913 0.276 53.893
melendez 52 0.625 54.538 0.625 54.518
menga 23 0.276 54.814 0.276 54.795
metropolitano del norte 21 0.252 55.067 0.252 55.047
miradol del aguacatal 1 0.012 55.079 0.012 55.059
miraflores 25 0.301 55.379 0.300 55.359
Miraflores 1 0.012 55.391 0.012 55.371
morichal de comfandi 3 0.036 55.427 0.036 55.407
multicentro 27 0.325 55.752 0.324 55.732
municipal 3 0.036 55.788 0.036 55.768
napoles 2 0.024 55.812 0.024 55.792
nápoles 29 0.349 56.161 0.348 56.140
normandia 5 0.060 56.221 0.060 56.200
normandía 154 1.851 58.072 1.851 58.051
normandía west point 1 0.012 58.084 0.012 58.063
norte 9 0.108 58.192 0.108 58.171
norte la flora 1 0.012 58.204 0.012 58.183
nueva base 1 0.012 58.216 0.012 58.195
nueva floresta 15 0.180 58.396 0.180 58.375
nueva tequendama 73 0.878 59.274 0.877 59.253
oasis de comfandi 6 0.072 59.346 0.072 59.325
oasis de pasoancho 1 0.012 59.358 0.012 59.337
occidente 11 0.132 59.490 0.132 59.469
pacara 19 0.228 59.719 0.228 59.697
pacará 4 0.048 59.767 0.048 59.745
palmas del ingenio 1 0.012 59.779 0.012 59.757
pampa linda 26 0.313 60.091 0.312 60.070
pampalinda 12 0.144 60.236 0.144 60.214
panamericano 9 0.108 60.344 0.108 60.322
pance 409 4.916 65.260 4.915 65.237
Pance 3 0.036 65.296 0.036 65.273
parcelaciones pance 61 0.733 66.030 0.733 66.006
parque residencial el 1 0.012 66.042 0.012 66.018
paseo de los 2 0.024 66.066 0.024 66.042
paso del comercio 6 0.072 66.138 0.072 66.114
pasoancho 6 0.072 66.210 0.072 66.186
poblado campestre 2 0.024 66.234 0.024 66.210
ponce 1 0.012 66.246 0.012 66.222
popular 6 0.072 66.318 0.072 66.294
portada de comfandi 2 0.024 66.342 0.024 66.318
portales de comfandi 1 0.012 66.354 0.012 66.330
porvenir 3 0.036 66.390 0.036 66.366
prados de oriente 6 0.072 66.462 0.072 66.438
prados del limonar 20 0.240 66.703 0.240 66.679
Prados Del Limonar 1 0.012 66.715 0.012 66.691
prados del norte 126 1.515 68.229 1.514 68.205
Prados Del Norte 1 0.012 68.241 0.012 68.217
prados del sur 2 0.024 68.265 0.024 68.241
primavera 2 0.024 68.289 0.024 68.265
primero de mayo 37 0.445 68.734 0.445 68.709
primitivo crespo 3 0.036 68.770 0.036 68.745
puente del comercio 6 0.072 68.842 0.072 68.818
puente palma 1 0.012 68.854 0.012 68.830
quintas de don 72 0.865 69.720 0.865 69.695
Quintas De Don 1 0.012 69.732 0.012 69.707
quintas de salomia 4 0.048 69.780 0.048 69.755
rafael uribe uribe 1 0.012 69.792 0.012 69.767
refugio 2 0.024 69.816 0.024 69.791
rep√∫blica de israel 1 0.012 69.828 0.012 69.803
rincon de la 1 0.012 69.840 0.012 69.815
rincón de salomia 1 0.012 69.852 0.012 69.827
riveras del valle 1 0.012 69.864 0.012 69.839
rozo la torre 1 0.012 69.876 0.012 69.851
saavedra galindo 4 0.048 69.924 0.048 69.899
salomia 40 0.481 70.405 0.481 70.380
samanes 1 0.012 70.417 0.012 70.392
samanes de guadalupe 1 0.012 70.429 0.012 70.404
sameco 1 0.012 70.441 0.012 70.416
san antonio 24 0.288 70.730 0.288 70.704
san bosco 8 0.096 70.826 0.096 70.800
san carlos 4 0.048 70.874 0.048 70.848
san cayetano 9 0.108 70.982 0.108 70.957
san fernando 54 0.649 71.631 0.649 71.605
San Fernando 1 0.012 71.643 0.012 71.617
san fernando nuevo 10 0.120 71.763 0.120 71.738
san fernando viejo 18 0.216 71.980 0.216 71.954
san joaquin 4 0.048 72.028 0.048 72.002
san joaquín 16 0.192 72.220 0.192 72.194
san juan bosco 7 0.084 72.304 0.084 72.278
san judas 1 0.012 72.316 0.012 72.290
san judas tadeo 2 0.024 72.340 0.024 72.314
san luis 2 0.024 72.364 0.024 72.338
san luís 1 0.012 72.376 0.012 72.350
san nicolas 1 0.012 72.389 0.012 72.362
san nicolás 1 0.012 72.401 0.012 72.374
san pedro 3 0.036 72.437 0.036 72.410
san vicente 48 0.577 73.014 0.577 72.987
santa 1 0.012 73.026 0.012 72.999
santa anita 48 0.577 73.603 0.577 73.576
Santa Anita 2 0.024 73.627 0.024 73.600
santa anita sur 1 0.012 73.639 0.012 73.612
santa bárbara 3 0.036 73.675 0.036 73.648
santa elena 10 0.120 73.795 0.120 73.768
santa fe 8 0.096 73.891 0.096 73.864
santa helena de 1 0.012 73.903 0.012 73.876
santa isabel 63 0.757 74.660 0.757 74.634
Santa Isabel 1 0.012 74.672 0.012 74.646
santa monica 51 0.613 75.285 0.613 75.258
Santa Monica 1 0.012 75.298 0.012 75.270
santa mónica 3 0.036 75.334 0.036 75.306
santa mónica alta 1 0.012 75.346 0.012 75.318
santa monica norte 2 0.024 75.370 0.024 75.342
santa monica popular 2 0.024 75.394 0.024 75.366
santa mónica popular 7 0.084 75.478 0.084 75.451
santa monica residencial 5 0.060 75.538 0.060 75.511
santa mónica residencial 39 0.469 76.007 0.469 75.979
santa rita 45 0.541 76.548 0.541 76.520
santa rosa 1 0.012 76.560 0.012 76.532
santa teresita 262 3.149 79.709 3.148 79.680
Santa Teresita 1 0.012 79.721 0.012 79.692
Santafe 1 0.012 79.733 0.012 79.704
santander 1 0.012 79.745 0.012 79.716
santo domingo 5 0.060 79.805 0.060 79.776
Santo Domingo 1 0.012 79.817 0.012 79.789
sector aguacatal 1 0.012 79.829 0.012 79.801
sector cañaveralejo guadalupe 2 0.024 79.853 0.024 79.825
seminario 32 0.385 80.238 0.385 80.209
sierras de normandía 1 0.012 80.250 0.012 80.221
siete de agosto 8 0.096 80.346 0.096 80.317
simón bolivar 1 0.012 80.358 0.012 80.329
tejares cristales 4 0.048 80.406 0.048 80.377
tejares de san 14 0.168 80.575 0.168 80.546
templete 4 0.048 80.623 0.048 80.594
tequendama 44 0.529 81.152 0.529 81.122
tequendema 1 0.012 81.164 0.012 81.134
terrón colorado 1 0.012 81.176 0.012 81.146
torres de comfandi 57 0.685 81.861 0.685 81.831
unicentro cali 1 0.012 81.873 0.012 81.843
unión de vivienda 3 0.036 81.909 0.036 81.879
urbanización barranquilla 4 0.048 81.957 0.048 81.927
urbanización boyacá 1 0.012 81.969 0.012 81.939
urbanización colseguros 3 0.036 82.005 0.036 81.975
urbanizacion el saman 1 0.012 82.017 0.012 81.988
urbanizacion gratamira 1 0.012 82.029 0.012 82.000
urbanización la flora 83 0.998 83.027 0.997 82.997
urbanización la merced 4 0.048 83.075 0.048 83.045
urbanización la nueva 4 0.048 83.123 0.048 83.093
urbanización las cascadas 1 0.012 83.135 0.012 83.105
urbanizacion lili 2 0.024 83.159 0.024 83.129
urbanización nueva granada 3 0.036 83.195 0.036 83.165
urbanización pacara 1 0.012 83.207 0.012 83.177
urbanización río lili 5 0.060 83.267 0.060 83.237
urbanización san joaquin 4 0.048 83.315 0.048 83.285
urbanización tequendama 7 0.084 83.399 0.084 83.369
valle de lili 1 0.012 83.411 0.012 83.381
valle del lili 1008 12.117 95.528 12.112 95.494
Valle Del Lili 1 0.012 95.540 0.012 95.506
valle grande 1 0.012 95.552 0.012 95.518
versalles 71 0.853 96.406 0.853 96.371
villa colombia 6 0.072 96.478 0.072 96.443
villa de veracruz 6 0.072 96.550 0.072 96.515
villa del lago 10 0.120 96.670 0.120 96.635
villa del parque 1 0.012 96.682 0.012 96.647
villa del prado 51 0.613 97.295 0.613 97.260
Villa Del Prado 1 0.012 97.307 0.012 97.272
villa del sol 25 0.301 97.608 0.300 97.573
villa del sur 5 0.060 97.668 0.060 97.633
villas de veracruz 8 0.096 97.764 0.096 97.729
Villas De Veracruz 1 0.012 97.776 0.012 97.741
vipasa 32 0.385 98.161 0.385 98.125
zona centro 1 0.012 98.173 0.012 98.137
zona norte 32 0.385 98.558 0.385 98.522
zona norte los 1 0.012 98.570 0.012 98.534
zona oeste 26 0.313 98.882 0.312 98.846
zona oriente 18 0.216 99.098 0.216 99.063
zona residencial 1 0.012 99.110 0.012 99.075
zona sur 74 0.890 100.000 0.889 99.964
<NA> 3 0.036 100.000
Total 8322 100.000 100.000 100.000 100.000