Natalia Zartha Suarez
Sara Isabela Salinas Gómez
Victor Hugo Perilla Martinez
Profesora: Delia Ortega Lenis
María inició su trayectoria como agente de bienes raíces en Cali hace aproximadamente diez años y, después de adquirir experiencia en otras agencias, fundó C&A (Casas y Apartamentos). En el contexto planteado por la actividad, la firma enfrenta un mercado inmobiliario con ventas desaceleradas, pero con disponibilidad de crédito y expectativa de reactivación; por eso la recomendación debe equilibrar evidencia estadística, restricciones presupuestales y conocimiento del submercado.
C&A debe asesorar a una compañía internacional en la compra de dos viviendas para empleados y sus familias. La solicitud exige que la recomendación no se base únicamente en el precio publicado, sino en un procedimiento reproducible de regresión lineal múltiple que permita: depurar y explorar los datos, estimar el precio esperado, validar los supuestos del modelo y priorizar ofertas compatibles con las condiciones comerciales.
solicitudesCaso <- tibble::tribble(
~Caracteristica, ~Vivienda1, ~Vivienda2,
"Tipo", "Casa", "Apartamento",
"Área construida", "200 m²", "300 m²",
"Parqueaderos", "1", "3",
"Baños", "2", "3",
"Habitaciones", "4", "5",
"Estrato", "4 o 5", "5 o 6",
"Zona", "Norte", "Sur",
"Crédito preaprobado", "$350 millones", "$850 millones"
)
tablaHtml(
solicitudesCaso,
"Condiciones de las dos solicitudes de vivienda",
digitos = 0
)
| Caracteristica | Vivienda1 | Vivienda2 |
|---|---|---|
| Tipo | Casa | Apartamento |
| Área construida | 200 m² | 300 m² |
| Parqueaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 o 5 | 5 o 6 |
| Zona | Norte | Sur |
| Crédito preaprobado | $350 millones | $850 millones |
La Tabla @ref(tab:solicitudesCaso) resume los perfiles objetivo.
Estas condiciones cumplen dos funciones distintas en el informe. Algunas
variables alimentan directamente el modelo de precio
(areaconst, estrato,
habitaciones, parqueaderos y
banios), mientras que tipo, zona
y el presupuesto delimitan el submercado y la decisión
comercial. En particular, la zona no se usa como predictor
dentro de cada modelo porque, una vez realizado el filtro, es constante;
antes de ese filtro sí es crítica y por eso se audita y corrige
geográficamente.
diccionarioDatos <- tibble::tribble(
~Variable, ~TipoAnalitico, ~Uso,
"id", "Identificador", "Trazabilidad; no predictor",
"zona", "Categórica nominal", "Filtro del caso y auditoría espacial",
"piso", "Ordinal", "No entra al modelo solicitado",
"estrato", "Ordinal categórica", "Predictor mediante variables indicadoras; sin media/varianza",
"preciom", "Cuantitativa continua", "Variable respuesta en millones de pesos",
"areaconst", "Cuantitativa continua", "Predictor de área construida",
"parqueaderos", "Cuantitativa discreta", "Predictor; presenta faltantes",
"banios", "Cuantitativa discreta", "Predictor",
"habitaciones", "Cuantitativa discreta", "Predictor",
"tipo", "Categórica nominal", "Filtro Casa/Apartamento",
"barrio", "Categórica nominal", "Identificación comercial de ofertas",
"longitud", "Coordenada", "Auditoría espacial y mapas",
"latitud", "Coordenada", "Auditoría espacial y mapas"
)
tablaHtml(diccionarioDatos, "Diccionario analítico de variables", digitos = 0)
| Variable | TipoAnalitico | Uso |
|---|---|---|
| id | Identificador | Trazabilidad; no predictor |
| zona | Categórica nominal | Filtro del caso y auditoría espacial |
| piso | Ordinal | No entra al modelo solicitado |
| estrato | Ordinal categórica | Predictor mediante variables indicadoras; sin media/varianza |
| preciom | Cuantitativa continua | Variable respuesta en millones de pesos |
| areaconst | Cuantitativa continua | Predictor de área construida |
| parqueaderos | Cuantitativa discreta | Predictor; presenta faltantes |
| banios | Cuantitativa discreta | Predictor |
| habitaciones | Cuantitativa discreta | Predictor |
| tipo | Categórica nominal | Filtro Casa/Apartamento |
| barrio | Categórica nominal | Identificación comercial de ofertas |
| longitud | Coordenada | Auditoría espacial y mapas |
| latitud | Coordenada | Auditoría espacial y mapas |
Decisión sobre estrato. Aunque sus
valores se codifican con números, representan categorías ordenadas. En
consecuencia, el análisis descriptivo utiliza frecuencias y
porcentajes, no media, varianza ni desviación estándar. En el
modelo se representa como factor para no imponer artificialmente que el
salto de estrato 3 a 4 tenga exactamente el mismo efecto que el salto de
5 a 6.
C&A debe asesorar dos compras de vivienda en Cali: una casa en Zona Norte con crédito máximo de 350 millones de pesos y un apartamento en Zona Sur con crédito máximo de 850 millones. El documento sigue los seis criterios de la actividad: filtro y depuración, análisis exploratorio, estimación e interpretación del modelo, validación de supuestos, predicción y selección de ofertas, y réplica completa para la segunda solicitud.
La principal decisión de preprocesamiento es la corrección de
la variable zona antes de filtrar los casos. Las
Figuras @ref(fig:boxplotLongitudRetag) y @ref(fig:boxplotLatitudRetag),
junto con el mapa interactivo de la Sección @ref(mapaAuditoriaEspacial),
permiten identificar observaciones cuya posición geográfica es
incompatible con la etiqueta original. Todo candidato espacial se
clasifica mediante KNN usando como referencia los puntos geográficamente
consistentes; cuando la zona sugerida difiere de la original, la
etiqueta se reemplaza y el cambio queda documentado en las Tablas
@ref(tab:resumenTransicionesRetag) y @ref(tab:auditoriaRetag). El
objetivo no es eliminar viviendas, sino evitar que una propiedad
sea modelada dentro del submercado equivocado.
Los faltantes también se tratan de acuerdo con su magnitud y función.
preciom no se imputa; los pocos NA de predictores
esenciales se eliminan por caso completo; y parqueaderos,
que concentra una proporción sustancial de ausencias, se imputa mediante
la mediana entera de la combinación zona corregida ×
tipo. La Tabla @ref(tab:tablaImputacionParqueaderos) muestra
exactamente cuántos valores se imputan y con qué valor en cada
submercado.
El estrato se conserva como factor
ordinal, no como variable cuantitativa. Por eso se describe con
frecuencias y porcentajes y, en regresión, se representa con \(K-1\) variables indicadoras. Las Tablas
@ref(tab:codificacionEstratoBase1) y @ref(tab:codificacionEstratoBase2)
hacen visible la categoría de referencia y evitan la trampa de variables
dummy. Además, las Tablas @ref(tab:contribucionesBase1) y
@ref(tab:contribucionesBase2) evalúan la contribución conjunta
del factor, no solamente la significancia de sus niveles por
separado.
Para la Vivienda 1 se modelan 661 casas corregidas de Zona Norte y para la Vivienda 2 2835 apartamentos corregidos de Zona Sur. Las predicciones, sus intervalos y las ofertas priorizadas se interpretan junto con los diagnósticos residuales. El IQR se conserva como exploración de extremos de precio y área, mientras que los outliers del modelo se evalúan formalmente con residuales studentizados, leverage, Cook, DFFITS y DFBETAS. En Vivienda 1 aparecen 16 casos con \(|r_i|>3\) y ninguno con Cook > 1; en Vivienda 2 aparecen 40 casos con \(|r_i|>3\) y 1 con Cook > 1, correspondiente al ID 6121, que merece verificación por su combinación excepcional de área y precio. No se elimina ninguna vivienda por estos criterios porque una alerta estadística no demuestra por sí sola un error de registro. El modelo es una herramienta para priorizar y negociar, no un avalúo definitivo, especialmente cuando los diagnósticos muestran heterocedasticidad, colas no normales o casos potencialmente influyentes.
La regresión lineal múltiple representa una respuesta cuantitativa como combinación lineal de varios predictores y un término de error [1, 2]:
\[ Y_i = \beta_0 + \beta_1X_{i1} + \cdots + \beta_pX_{ip} + \varepsilon_i. \]
En este caso, \(Y_i\) es el precio de la vivienda en millones de pesos. Los coeficientes se estiman mediante Mínimos Cuadrados Ordinarios (MCO), buscando la combinación que minimiza la suma de cuadrados de los residuos. Cuando la matriz de diseño tiene rango completo,
\[ \widehat{\boldsymbol{\beta}}=(X^\top X)^{-1}X^\top Y. \]
Bajo los supuestos clásicos de Gauss-Markov, MCO produce estimadores lineales insesgados de varianza mínima dentro de esa clase [1, 2]. Esa propiedad teórica no sustituye el diagnóstico: por ello los supuestos se verifican explícitamente más adelante y cualquier incumplimiento se reporta en lugar de ocultarse.
La interpretación de un coeficiente siempre es parcial: describe el cambio esperado en el precio cuando cambia un predictor, manteniendo constantes los demás. Por eso una asociación bivariada observada en el EDA puede cambiar de magnitud o incluso de signo dentro del modelo múltiple.
El estrato es una variable ordinal
categórica. Su código numérico indica orden, pero no garantiza
que la distancia económica entre 3 y 4 sea equivalente a la distancia
entre 5 y 6. Por ello no se resume mediante media, varianza ni
desviación estándar y no se impone una pendiente lineal única.
En la regresión se incorpora como factor con codificación de tratamiento de \(K-1\) variables indicadoras. Si el estrato 3 es la referencia, la combinación de ceros representa ese nivel y se estiman coeficientes separados para 4, 5 y 6. Omitir una categoría evita la multicolinealidad perfecta con el intercepto [1, 2]. Además de interpretar cada dummy, la contribución del factor completo se evalúa conjuntamente mediante una prueba F tipo II, \(R^2\) parcial y la pérdida de \(R^2\) al retirar todo el término.
El coeficiente de determinación
\[ R^2 = 1-\frac{SS_{res}}{SS_{tot}} \]
cuantifica la proporción de variabilidad del precio explicada por el modelo. El \(R^2\) ajustado penaliza la inclusión de términos que no aportan suficiente información. La prueba F global contrasta si el conjunto de predictores mejora frente a un modelo con solo intercepto, mientras que las pruebas t estudian coeficientes individuales.
Para factores con varias dummies no es correcto juzgar la contribución del factor únicamente por un nivel. Por eso este informe complementa los coeficientes con una prueba conjunta y con medidas de contribución única. Así se distingue entre que una variable sea estadísticamente significativa y cuánto ajuste adicional aporta realmente.
El diagnóstico se realiza sobre el modelo seleccionado y combina evidencia gráfica y formal [1-3]:
La actividad solicita diagnosticar y sugerir, no corregir obligatoriamente los incumplimientos. Por tanto, no se eliminan observaciones ni se transforman variables solo para forzar pruebas favorables.
Además de los supuestos sobre los errores, el material de la asignatura distingue entre observaciones atípicas, puntos de balanceo (leverage) y observaciones influyentes. En este informe se adopta el criterio del curso: residual studentizado \(|r_i|>3\) para detectar respuestas atípicas; \(h_{ii}>2p/n\) para leverage alto; distancia de Cook \(D_i>1\); \(|DFFITS_i|>2\sqrt{p/n}\); y \(|DFBETAS_{ij}|>2/\sqrt{n}\). Estos indicadores se interpretan como señales de revisión, no como una regla automática de eliminación. Una vivienda real puede ser extrema y, aun así, pertenecer legítimamente al mercado analizado.
El modelo completo conserva los predictores exigidos por el enunciado. Como contraste de parsimonia se utiliza una única reducción backward basada en AIC, criterio que penaliza complejidad innecesaria [7]. La decisión final no se toma solo con el AIC ni con valores p: se verifica también el desempeño mediante validación cruzada de 10 particiones, usando RMSE y \(R^2\) fuera de muestra [8].
Esta combinación permite conservar el modelo completo cuando la simplificación no aporta una ventaja clara y aceptar una reducción cuando disminuye complejidad sin deteriorar materialmente la capacidad predictiva.
tibble(
Indicador = c("Observaciones originales", "Variables", "Observaciones tras controles básicos"),
Valor = c(nrow(viviendaOriginal), ncol(viviendaOriginal), nrow(viviendaTrabajo))
) |>
tablaHtml("Dimensiones y control inicial de la base", digitos = 0)
| Indicador | Valor |
|---|---|
| Observaciones originales | 8322 |
| Variables | 13 |
| Observaciones tras controles básicos | 8319 |
dplyr::glimpse(viviendaOriginal)
## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
La preparación comienza sobre la base completa, antes de separar los dos casos. Esta secuencia evita que una decisión de limpieza dependa accidentalmente del subconjunto que luego se desea modelar.
resumenCalidad <- tibble(
Variable = names(viviendaOriginal),
Faltantes = sapply(viviendaOriginal, function(x) sum(is.na(x))),
PorcentajeFaltante = sapply(viviendaOriginal, function(x) mean(is.na(x)) * 100),
ValoresUnicos = sapply(viviendaOriginal, dplyr::n_distinct)
) |>
arrange(desc(Faltantes))
tablaHtml(resumenCalidad, "Valores faltantes y cardinalidad por variable", digitos = 2)
| Variable | Faltantes | PorcentajeFaltante | ValoresUnicos |
|---|---|---|---|
| piso | 2638 | 31.70 | 13 |
| parqueaderos | 1605 | 19.29 | 11 |
| id | 3 | 0.04 | 8320 |
| zona | 3 | 0.04 | 6 |
| estrato | 3 | 0.04 | 5 |
| areaconst | 3 | 0.04 | 653 |
| banios | 3 | 0.04 | 12 |
| habitaciones | 3 | 0.04 | 12 |
| tipo | 3 | 0.04 | 3 |
| barrio | 3 | 0.04 | 437 |
| longitud | 3 | 0.04 | 2929 |
| latitud | 3 | 0.04 | 3680 |
| preciom | 2 | 0.02 | 540 |
naniar::gg_miss_var(viviendaOriginal, show_pct = TRUE) +
labs(
title = "Valores faltantes en la base original",
x = "Variable",
y = "Cantidad de faltantes"
) +
theme_minimal(base_size = 12)
Porcentaje de valores faltantes por variable
La Tabla @ref(tab:faltantesYDuplicados) y la Figura
@ref(fig:graficaFaltantes) muestran un patrón muy concentrado:
piso y parqueaderos reúnen prácticamente todo
el problema de ausencia. En particular, parqueaderos tiene
1605 faltantes (19,29%), mientras que
areaconst, estrato, banios y
habitaciones presentan únicamente 3 faltantes cada una o
menos. Esto justifica tratamientos diferentes:
preciom no se imputa, porque es la
variable respuesta; inventar su valor alteraría precisamente aquello que
el modelo debe aprender.piso no se imputa porque no forma parte de la
especificación exigida.parqueaderos sí requiere imputación. Eliminar todos sus
NA implicaría descartar cerca de una quinta parte de la base, una
pérdida desproporcionada para una variable que sí entra al modelo.La imputación se realiza después del retag
geográfico y dentro de cada combinación
zona corregida × tipo de vivienda. Se utiliza la
mediana del grupo porque parqueaderos es
un conteo discreto con distribución potencialmente asimétrica y valores
altos aislados; la mediana es mucho menos sensible a esos extremos que
la media. Como el resultado debe seguir representando un número de
parqueaderos, la mediana se lleva al entero más cercano. De este modo
una casa del Norte no recibe información proveniente de apartamentos del
Sur ni de una zona que estaba mal etiquetada.
resumenImputacionParqueaderos |>
filter(Faltantes > 0) |>
tablaHtml(
"Imputación de parqueaderos por zona corregida y tipo de vivienda",
digitos = 2
)
| zonaCorregida | tipo | Registros | Faltantes | PorcentajeFaltante | MedianaObservada | ValorImputacion |
|---|---|---|---|---|---|---|
| Zona Sur | Apartamento | 2835 | 460 | 16.23 | 1 | 1 |
| Zona Norte | Apartamento | 1170 | 296 | 25.30 | 1 | 1 |
| Zona Sur | Casa | 2000 | 271 | 13.55 | 2 | 2 |
| Zona Norte | Casa | 661 | 233 | 35.25 | 2 | 2 |
| Zona Oriente | Casa | 319 | 151 | 47.34 | 1 | 1 |
| Zona Oeste | Apartamento | 949 | 51 | 5.37 | 2 | 2 |
| Zona Oriente | Apartamento | 127 | 50 | 39.37 | 1 | 1 |
| Zona Centro | Casa | 93 | 45 | 48.39 | 1 | 1 |
| Zona Oeste | Casa | 146 | 33 | 22.60 | 2 | 2 |
| Zona Centro | Apartamento | 19 | 12 | 63.16 | 1 | 1 |
La Tabla @ref(tab:tablaImputacionParqueaderos) permite auditar la
imputación: no solo muestra cuántos faltantes existen por submercado,
sino también la mediana observada y el valor entero utilizado. En total
se imputan 1602 registros. En los dos segmentos de
interés la ausencia no tiene la misma magnitud: en Casa / Zona
Norte alcanza 35,25% (233 registros), mientras
que en Apartamento / Zona Sur es
16,23% (460 registros). Por ello, el coeficiente de
parqueaderos debe interpretarse con mayor cautela en el
primer modelo: la variable conserva su utilidad, pero una proporción
importante de sus valores procede de imputación. No se agrega una
sección extensa de sensibilidad porque la actividad exige justificar y
documentar el tratamiento, no convertir la imputación en un experimento
paralelo.
Este punto es diferente del tratamiento de valores extremos de precio o área. Una vivienda con precio muy alto puede ser una observación real del mercado y no debe eliminarse automáticamente. En cambio, una vivienda cuya latitud/longitud es incompatible con la zona que trae en la base puede contaminar el segmento equivocado y, por instrucción de la actividad y de la profesora, debe ser revisada y retaggeada cuando la evidencia espacial apunta a otra zona.
El retag se realiza antes de construir
base1 y base2:
zona) es categórica y la evidencia relevante es la
proximidad espacial a las nubes de puntos de las demás zonas. La
estandarización evita que una coordenada domine por diferencias de
escala.zonaSugerida. Si KNN lo ubica en una zona diferente de
zonaOriginal, se reemplaza la etiqueta. Si KNN vuelve a
asignarlo a su zona original, se conserva esa etiqueta porque la
evidencia local confirma que se trata de un punto extremo pero no de un
error de zona. El consensoZona queda registrado como medida
de confianza y no se usa para esconder casos dudosos.coloresDestinoRetag <- c(
"Zona Norte" = "#1F78B4",
"Zona Sur" = "#E31A1C",
"Zona Oriente" = "#FF7F00",
"Zona Oeste" = "#6A3D9A",
"Zona Centro" = "#33A02C"
)
datosVisualRetag <- viviendaCorregida |>
filter(coordValida) |>
mutate(
CategoriaAuditoria = case_when(
reclasificarZona ~ paste0("Corregido → ", zona),
EstadoZona == "Atípico confirmado en zona original" ~ "Atípico confirmado",
TRUE ~ "Coherente"
)
)
coloresAuditoria <- c(
"Coherente" = "grey75",
"Atípico confirmado" = "black",
stats::setNames(
unname(coloresDestinoRetag),
paste0("Corregido → ", names(coloresDestinoRetag))
)
)
ggplot(datosVisualRetag, aes(x = zonaOriginal, y = longitud)) +
geom_boxplot(outlier.shape = NA, alpha = 0.20) +
geom_jitter(
aes(color = CategoriaAuditoria),
width = 0.14,
alpha = 0.22,
size = 0.75
) +
geom_point(
data = datosVisualRetag |> filter(reclasificarZona),
aes(color = CategoriaAuditoria),
size = 2.3,
alpha = 0.98
) +
scale_color_manual(values = coloresAuditoria, drop = FALSE) +
labs(
title = "Auditoría espacial mediante longitud",
subtitle = "Los registros corregidos se colorean según su zona de destino",
x = "Zona registrada originalmente",
y = "Longitud",
color = "Resultado / destino"
) +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 25, hjust = 1))
Longitud por zona original, destacando observaciones sometidas a auditoría espacial
ggplot(datosVisualRetag, aes(x = zonaOriginal, y = latitud)) +
geom_boxplot(outlier.shape = NA, alpha = 0.20) +
geom_jitter(
aes(color = CategoriaAuditoria),
width = 0.14,
alpha = 0.22,
size = 0.75
) +
geom_point(
data = datosVisualRetag |> filter(reclasificarZona),
aes(color = CategoriaAuditoria),
size = 2.3,
alpha = 0.98
) +
scale_color_manual(values = coloresAuditoria, drop = FALSE) +
labs(
title = "Auditoría espacial mediante latitud",
subtitle = "Norte, Sur, Oriente y Oeste tienen colores distintos después del retag",
x = "Zona registrada originalmente",
y = "Latitud",
color = "Resultado / destino"
) +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 25, hjust = 1))
Latitud por zona original, destacando observaciones sometidas a auditoría espacial
Las Figuras @ref(fig:boxplotLongitudRetag) y @ref(fig:boxplotLatitudRetag) permiten ver por qué un registro entra a la auditoría y, al mismo tiempo, distinguir el destino final del retag. Los puntos corregidos conservan un color estable según la zona a la que fueron reasignados: Norte, Sur, Oriente u Oeste. Un registro sometido a corrección excede los límites IQR de su zona original en longitud, latitud o ambas; por eso debe aparecer fuera del patrón central en al menos una de las dos figuras. El boxplot solo detecta la incompatibilidad con la etiqueta original; la nueva zona se decide después mediante KNN. Los puntos negros corresponden a candidatos extremos cuya vecindad confirma la zona de origen, por lo que se conservan sin cambio.
transicionesZonas |>
tablaHtml(
"Resumen de transiciones de zona después de la auditoría espacial",
digitos = 0
)
| zonaOriginal | zonaCorregida | Registros |
|---|---|---|
| Zona Norte | Zona Sur | 192 |
| Zona Sur | Zona Oriente | 78 |
| Zona Sur | Zona Norte | 71 |
| Zona Oeste | Zona Sur | 56 |
| Zona Oeste | Zona Norte | 31 |
| Zona Oeste | Zona Oriente | 20 |
| Zona Centro | Zona Norte | 7 |
| Zona Oriente | Zona Sur | 7 |
| Zona Norte | Zona Oriente | 4 |
| Zona Centro | Zona Sur | 3 |
| Zona Norte | Zona Oeste | 3 |
| Zona Centro | Zona Oriente | 2 |
| Zona Oriente | Zona Norte | 1 |
| Zona Oriente | Zona Oeste | 1 |
resumenConfianzaRetag |>
tablaHtml(
"Nivel de confianza de las correcciones espaciales",
digitos = 2
)
| ConfianzaRetag | Registros | Porcentaje |
|---|---|---|
| Alta | 412 | 86.55 |
| Media | 46 | 9.66 |
| Baja | 18 | 3.78 |
if (nrow(auditoriaZonas) > 0) {
tablaHtml(
auditoriaZonas,
"Detalle de registros cuya zona fue corregida",
digitos = 4
)
} else {
cat("No se identificaron registros cuya zona necesitara corrección.")
}
| id | barrio | zonaOriginal | zonaCorregida | longitud | latitud | MotivoAtipico | consensoZona | ConfianzaRetag |
|---|---|---|---|---|---|---|---|---|
| 1132 | centelsa | Zona Centro | Zona Norte | -76.5110 | 3.4870 | Latitud | 1.0000 | Alta |
| 2594 | prados del norte | Zona Centro | Zona Norte | -76.5210 | 3.4680 | Latitud | 1.0000 | Alta |
| 440 | torres de comfandi | Zona Centro | Zona Norte | -76.4959 | 3.4751 | Longitud y latitud | 1.0000 | Alta |
| 1060 | san juan bosco | Zona Centro | Zona Norte | -76.5089 | 3.4772 | Latitud | 0.9333 | Alta |
| 1130 | flora industrial | Zona Centro | Zona Norte | -76.5110 | 3.4700 | Latitud | 0.8000 | Alta |
| 1850 | la morada | Zona Centro | Zona Norte | -76.5180 | 3.4620 | Latitud | 0.8000 | Alta |
| 572 | san bosco | Zona Centro | Zona Norte | -76.4990 | 3.4430 | Longitud | 0.4000 | Baja |
| 988 | el troncal | Zona Centro | Zona Oriente | -76.5071 | 3.4507 | Longitud | 0.7333 | Media |
| 482 | santa anita | Zona Centro | Zona Oriente | -76.4970 | 3.4400 | Longitud | 0.5882 | Baja |
| 4275 | guayaquil | Zona Centro | Zona Sur | -76.5306 | 3.3984 | Latitud | 1.0000 | Alta |
| 3886 | guayaquil | Zona Centro | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 659 | san juan bosco | Zona Centro | Zona Sur | -76.5006 | 3.4451 | Longitud | 0.5333 | Baja |
| 8316 | granada | Zona Norte | Zona Oeste | -76.5873 | 3.4615 | Longitud | 0.7333 | Media |
| 8318 | la flora | Zona Norte | Zona Oeste | -76.5888 | 3.4635 | Longitud | 0.7333 | Media |
| 8319 | la flora | Zona Norte | Zona Oeste | -76.5892 | 3.4647 | Longitud | 0.7333 | Media |
| 31 | torres de comfandi | Zona Norte | Zona Oriente | -76.4674 | 3.4076 | Latitud | 0.8000 | Alta |
| 978 | urbanización la flora | Zona Norte | Zona Oriente | -76.5070 | 3.4020 | Latitud | 0.7333 | Media |
| 946 | la flora | Zona Norte | Zona Oriente | -76.5062 | 3.4030 | Latitud | 0.6667 | Media |
| 979 | unión de vivienda | Zona Norte | Zona Oriente | -76.5070 | 3.4110 | Latitud | 0.5333 | Baja |
| 1724 | acopi | Zona Norte | Zona Sur | -76.5170 | 3.3697 | Latitud | 1.0000 | Alta |
| 4386 | acopi | Zona Norte | Zona Sur | -76.5310 | 3.3830 | Latitud | 1.0000 | Alta |
| 4057 | acopi | Zona Norte | Zona Sur | -76.5295 | 3.3853 | Latitud | 1.0000 | Alta |
| 4460 | acopi | Zona Norte | Zona Sur | -76.5318 | 3.4059 | Latitud | 1.0000 | Alta |
| 6081 | acopi | Zona Norte | Zona Sur | -76.5404 | 3.3686 | Latitud | 1.0000 | Alta |
| 7987 | acopi | Zona Norte | Zona Sur | -76.5536 | 3.4005 | Latitud | 1.0000 | Alta |
| 3495 | acopi | Zona Norte | Zona Sur | -76.5268 | 3.3782 | Latitud | 1.0000 | Alta |
| 6857 | acopi | Zona Norte | Zona Sur | -76.5453 | 3.3777 | Latitud | 1.0000 | Alta |
| 6043 | acopi | Zona Norte | Zona Sur | -76.5402 | 3.4097 | Latitud | 1.0000 | Alta |
| 6412 | acopi | Zona Norte | Zona Sur | -76.5425 | 3.3430 | Latitud | 1.0000 | Alta |
| 1770 | acopi | Zona Norte | Zona Sur | -76.5173 | 3.3725 | Latitud | 1.0000 | Alta |
| 1276 | acopi | Zona Norte | Zona Sur | -76.5147 | 3.3868 | Latitud | 1.0000 | Alta |
| 1353 | acopi | Zona Norte | Zona Sur | -76.5154 | 3.3687 | Latitud | 1.0000 | Alta |
| 1391 | acopi | Zona Norte | Zona Sur | -76.5158 | 3.3841 | Latitud | 1.0000 | Alta |
| 1489 | acopi | Zona Norte | Zona Sur | -76.5161 | 3.3693 | Latitud | 1.0000 | Alta |
| 1490 | acopi | Zona Norte | Zona Sur | -76.5161 | 3.3693 | Latitud | 1.0000 | Alta |
| 1492 | acopi | Zona Norte | Zona Sur | -76.5161 | 3.3706 | Latitud | 1.0000 | Alta |
| 1611 | acopi | Zona Norte | Zona Sur | -76.5169 | 3.3738 | Latitud | 1.0000 | Alta |
| 1667 | acopi | Zona Norte | Zona Sur | -76.5170 | 3.3697 | Latitud | 1.0000 | Alta |
| 1722 | acopi | Zona Norte | Zona Sur | -76.5170 | 3.3697 | Latitud | 1.0000 | Alta |
| 1723 | acopi | Zona Norte | Zona Sur | -76.5170 | 3.3697 | Latitud | 1.0000 | Alta |
| 1744 | acopi | Zona Norte | Zona Sur | -76.5171 | 3.3700 | Latitud | 1.0000 | Alta |
| 1838 | acopi | Zona Norte | Zona Sur | -76.5180 | 3.3798 | Latitud | 1.0000 | Alta |
| 1899 | acopi | Zona Norte | Zona Sur | -76.5181 | 3.3863 | Latitud | 1.0000 | Alta |
| 1904 | acopi | Zona Norte | Zona Sur | -76.5182 | 3.3818 | Latitud | 1.0000 | Alta |
| 1932 | acopi | Zona Norte | Zona Sur | -76.5184 | 3.3876 | Latitud | 1.0000 | Alta |
| 1968 | acopi | Zona Norte | Zona Sur | -76.5186 | 3.3709 | Latitud | 1.0000 | Alta |
| 2017 | acopi | Zona Norte | Zona Sur | -76.5188 | 3.3690 | Latitud | 1.0000 | Alta |
| 2026 | acopi | Zona Norte | Zona Sur | -76.5189 | 3.3679 | Latitud | 1.0000 | Alta |
| 2027 | acopi | Zona Norte | Zona Sur | -76.5189 | 3.3709 | Latitud | 1.0000 | Alta |
| 2357 | acopi | Zona Norte | Zona Sur | -76.5200 | 3.3696 | Latitud | 1.0000 | Alta |
| 2416 | acopi | Zona Norte | Zona Sur | -76.5201 | 3.3861 | Latitud | 1.0000 | Alta |
| 2425 | acopi | Zona Norte | Zona Sur | -76.5202 | 3.3739 | Latitud | 1.0000 | Alta |
| 2728 | acopi | Zona Norte | Zona Sur | -76.5219 | 3.3708 | Latitud | 1.0000 | Alta |
| 2741 | acopi | Zona Norte | Zona Sur | -76.5220 | 3.3947 | Latitud | 1.0000 | Alta |
| 2811 | acopi | Zona Norte | Zona Sur | -76.5221 | 3.3709 | Latitud | 1.0000 | Alta |
| 3082 | acopi | Zona Norte | Zona Sur | -76.5235 | 3.3706 | Latitud | 1.0000 | Alta |
| 3109 | acopi | Zona Norte | Zona Sur | -76.5239 | 3.3640 | Latitud | 1.0000 | Alta |
| 3185 | acopi | Zona Norte | Zona Sur | -76.5242 | 3.3782 | Latitud | 1.0000 | Alta |
| 3297 | acopi | Zona Norte | Zona Sur | -76.5257 | 3.3712 | Latitud | 1.0000 | Alta |
| 3299 | acopi | Zona Norte | Zona Sur | -76.5257 | 3.3712 | Latitud | 1.0000 | Alta |
| 3300 | acopi | Zona Norte | Zona Sur | -76.5257 | 3.3712 | Latitud | 1.0000 | Alta |
| 3418 | acopi | Zona Norte | Zona Sur | -76.5261 | 3.3761 | Latitud | 1.0000 | Alta |
| 3446 | acopi | Zona Norte | Zona Sur | -76.5263 | 3.3711 | Latitud | 1.0000 | Alta |
| 3447 | acopi | Zona Norte | Zona Sur | -76.5263 | 3.3711 | Latitud | 1.0000 | Alta |
| 3479 | acopi | Zona Norte | Zona Sur | -76.5266 | 3.3632 | Latitud | 1.0000 | Alta |
| 3559 | acopi | Zona Norte | Zona Sur | -76.5270 | 3.3639 | Latitud | 1.0000 | Alta |
| 3602 | acopi | Zona Norte | Zona Sur | -76.5273 | 3.3636 | Latitud | 1.0000 | Alta |
| 3619 | acopi | Zona Norte | Zona Sur | -76.5274 | 3.3850 | Latitud | 1.0000 | Alta |
| 3783 | acopi | Zona Norte | Zona Sur | -76.5284 | 3.3507 | Latitud | 1.0000 | Alta |
| 3805 | acopi | Zona Norte | Zona Sur | -76.5287 | 3.3433 | Latitud | 1.0000 | Alta |
| 4003 | acopi | Zona Norte | Zona Sur | -76.5290 | 3.3857 | Latitud | 1.0000 | Alta |
| 4010 | acopi | Zona Norte | Zona Sur | -76.5291 | 3.3452 | Latitud | 1.0000 | Alta |
| 4095 | acopi | Zona Norte | Zona Sur | -76.5298 | 3.3889 | Latitud | 1.0000 | Alta |
| 4118 | acopi | Zona Norte | Zona Sur | -76.5299 | 3.3893 | Latitud | 1.0000 | Alta |
| 4230 | acopi | Zona Norte | Zona Sur | -76.5302 | 3.3664 | Latitud | 1.0000 | Alta |
| 4329 | acopi | Zona Norte | Zona Sur | -76.5310 | 3.3899 | Latitud | 1.0000 | Alta |
| 4415 | acopi | Zona Norte | Zona Sur | -76.5313 | 3.3628 | Latitud | 1.0000 | Alta |
| 4468 | acopi | Zona Norte | Zona Sur | -76.5318 | 3.3534 | Latitud | 1.0000 | Alta |
| 4476 | acopi | Zona Norte | Zona Sur | -76.5319 | 3.3675 | Latitud | 1.0000 | Alta |
| 4688 | acopi | Zona Norte | Zona Sur | -76.5323 | 3.3956 | Latitud | 1.0000 | Alta |
| 4718 | acopi | Zona Norte | Zona Sur | -76.5325 | 3.3654 | Latitud | 1.0000 | Alta |
| 4845 | acopi | Zona Norte | Zona Sur | -76.5334 | 3.3816 | Latitud | 1.0000 | Alta |
| 5319 | acopi | Zona Norte | Zona Sur | -76.5358 | 3.3830 | Latitud | 1.0000 | Alta |
| 5412 | acopi | Zona Norte | Zona Sur | -76.5364 | 3.3859 | Latitud | 1.0000 | Alta |
| 5599 | acopi | Zona Norte | Zona Sur | -76.5375 | 3.3959 | Latitud | 1.0000 | Alta |
| 5605 | acopi | Zona Norte | Zona Sur | -76.5376 | 3.4007 | Latitud | 1.0000 | Alta |
| 5616 | acopi | Zona Norte | Zona Sur | -76.5377 | 3.3637 | Latitud | 1.0000 | Alta |
| 5632 | acopi | Zona Norte | Zona Sur | -76.5378 | 3.3800 | Latitud | 1.0000 | Alta |
| 5780 | acopi | Zona Norte | Zona Sur | -76.5382 | 3.3959 | Latitud | 1.0000 | Alta |
| 5884 | acopi | Zona Norte | Zona Sur | -76.5390 | 3.3655 | Latitud | 1.0000 | Alta |
| 5965 | acopi | Zona Norte | Zona Sur | -76.5399 | 3.3724 | Latitud | 1.0000 | Alta |
| 5970 | acopi | Zona Norte | Zona Sur | -76.5399 | 3.3982 | Latitud | 1.0000 | Alta |
| 6028 | acopi | Zona Norte | Zona Sur | -76.5400 | 3.3723 | Latitud | 1.0000 | Alta |
| 6033 | acopi | Zona Norte | Zona Sur | -76.5401 | 3.3499 | Latitud | 1.0000 | Alta |
| 6155 | acopi | Zona Norte | Zona Sur | -76.5410 | 3.3802 | Latitud | 1.0000 | Alta |
| 6385 | acopi | Zona Norte | Zona Sur | -76.5422 | 3.3786 | Latitud | 1.0000 | Alta |
| 6388 | acopi | Zona Norte | Zona Sur | -76.5422 | 3.4113 | Latitud | 1.0000 | Alta |
| 6806 | acopi | Zona Norte | Zona Sur | -76.5449 | 3.3546 | Latitud | 1.0000 | Alta |
| 6807 | acopi | Zona Norte | Zona Sur | -76.5449 | 3.4066 | Latitud | 1.0000 | Alta |
| 6872 | acopi | Zona Norte | Zona Sur | -76.5454 | 3.3549 | Latitud | 1.0000 | Alta |
| 7026 | acopi | Zona Norte | Zona Sur | -76.5470 | 3.3722 | Latitud | 1.0000 | Alta |
| 7471 | acopi | Zona Norte | Zona Sur | -76.5498 | 3.3976 | Latitud | 1.0000 | Alta |
| 8068 | acopi | Zona Norte | Zona Sur | -76.5546 | 3.3752 | Latitud | 1.0000 | Alta |
| 8123 | acopi | Zona Norte | Zona Sur | -76.5556 | 3.4076 | Latitud | 1.0000 | Alta |
| 7619 | brisas de los | Zona Norte | Zona Sur | -76.5508 | 3.3914 | Latitud | 1.0000 | Alta |
| 3406 | Brisas De Los | Zona Norte | Zona Sur | -76.5260 | 3.4040 | Latitud | 1.0000 | Alta |
| 3062 | Cali | Zona Norte | Zona Sur | -76.5235 | 3.3792 | Latitud | 1.0000 | Alta |
| 5392 | Cali | Zona Norte | Zona Sur | -76.5362 | 3.3856 | Latitud | 1.0000 | Alta |
| 1668 | Cali | Zona Norte | Zona Sur | -76.5170 | 3.3697 | Latitud | 1.0000 | Alta |
| 1732 | Cali | Zona Norte | Zona Sur | -76.5170 | 3.3662 | Latitud | 1.0000 | Alta |
| 1898 | Cali | Zona Norte | Zona Sur | -76.5181 | 3.3694 | Latitud | 1.0000 | Alta |
| 1942 | Cali | Zona Norte | Zona Sur | -76.5185 | 3.3832 | Latitud | 1.0000 | Alta |
| 2256 | Cali | Zona Norte | Zona Sur | -76.5194 | 3.3725 | Latitud | 1.0000 | Alta |
| 2712 | Cali | Zona Norte | Zona Sur | -76.5217 | 3.3660 | Latitud | 1.0000 | Alta |
| 2898 | Cali | Zona Norte | Zona Sur | -76.5227 | 3.3640 | Latitud | 1.0000 | Alta |
| 3091 | Cali | Zona Norte | Zona Sur | -76.5236 | 3.3764 | Latitud | 1.0000 | Alta |
| 3439 | Cali | Zona Norte | Zona Sur | -76.5263 | 3.3852 | Latitud | 1.0000 | Alta |
| 3463 | Cali | Zona Norte | Zona Sur | -76.5265 | 3.3714 | Latitud | 1.0000 | Alta |
| 3776 | Cali | Zona Norte | Zona Sur | -76.5284 | 3.3545 | Latitud | 1.0000 | Alta |
| 4540 | Cali | Zona Norte | Zona Sur | -76.5320 | 3.3513 | Latitud | 1.0000 | Alta |
| 4842 | Cali | Zona Norte | Zona Sur | -76.5333 | 3.3846 | Latitud | 1.0000 | Alta |
| 5125 | Cali | Zona Norte | Zona Sur | -76.5349 | 3.3810 | Latitud | 1.0000 | Alta |
| 5371 | Cali | Zona Norte | Zona Sur | -76.5360 | 3.3885 | Latitud | 1.0000 | Alta |
| 5376 | Cali | Zona Norte | Zona Sur | -76.5360 | 3.3341 | Latitud | 1.0000 | Alta |
| 5572 | Cali | Zona Norte | Zona Sur | -76.5373 | 3.3649 | Latitud | 1.0000 | Alta |
| 5628 | Cali | Zona Norte | Zona Sur | -76.5378 | 3.3672 | Latitud | 1.0000 | Alta |
| 5647 | Cali | Zona Norte | Zona Sur | -76.5379 | 3.3638 | Latitud | 1.0000 | Alta |
| 6068 | Cali | Zona Norte | Zona Sur | -76.5404 | 3.3698 | Latitud | 1.0000 | Alta |
| 6386 | Cali | Zona Norte | Zona Sur | -76.5422 | 3.3834 | Latitud | 1.0000 | Alta |
| 6575 | Cali | Zona Norte | Zona Sur | -76.5434 | 3.4106 | Latitud | 1.0000 | Alta |
| 7228 | Cali | Zona Norte | Zona Sur | -76.5482 | 3.3366 | Latitud | 1.0000 | Alta |
| 7542 | Cali | Zona Norte | Zona Sur | -76.5501 | 3.3410 | Latitud | 1.0000 | Alta |
| 7831 | Cali | Zona Norte | Zona Sur | -76.5523 | 3.3961 | Latitud | 1.0000 | Alta |
| 1362 | cali bella | Zona Norte | Zona Sur | -76.5155 | 3.3932 | Latitud | 1.0000 | Alta |
| 5577 | ciudad jardín | Zona Norte | Zona Sur | -76.5373 | 3.3649 | Latitud | 1.0000 | Alta |
| 6171 | ciudad jardín | Zona Norte | Zona Sur | -76.5410 | 3.3710 | Latitud | 1.0000 | Alta |
| 5578 | ciudad jardín | Zona Norte | Zona Sur | -76.5373 | 3.3649 | Latitud | 1.0000 | Alta |
| 6340 | el bosque | Zona Norte | Zona Sur | -76.5420 | 3.4110 | Latitud | 1.0000 | Alta |
| 6673 | el gran limonar | Zona Norte | Zona Sur | -76.5440 | 3.3970 | Latitud | 1.0000 | Alta |
| 640 | flora industrial | Zona Norte | Zona Sur | -76.5000 | 3.4010 | Latitud | 1.0000 | Alta |
| 641 | flora industrial | Zona Norte | Zona Sur | -76.5000 | 3.4010 | Latitud | 1.0000 | Alta |
| 5843 | juanamb√∫ | Zona Norte | Zona Sur | -76.5389 | 3.3766 | Latitud | 1.0000 | Alta |
| 6906 | juanamb√∫ | Zona Norte | Zona Sur | -76.5459 | 3.3331 | Latitud | 1.0000 | Alta |
| 4739 | la flora | Zona Norte | Zona Sur | -76.5328 | 3.3983 | Latitud | 1.0000 | Alta |
| 8270 | la flora | Zona Norte | Zona Sur | -76.5611 | 3.3799 | Latitud | 1.0000 | Alta |
| 2995 | la flora | Zona Norte | Zona Sur | -76.5232 | 3.3876 | Latitud | 1.0000 | Alta |
| 4733 | la flora | Zona Norte | Zona Sur | -76.5327 | 3.3982 | Latitud | 1.0000 | Alta |
| 4734 | la flora | Zona Norte | Zona Sur | -76.5327 | 3.3982 | Latitud | 1.0000 | Alta |
| 7078 | la flora | Zona Norte | Zona Sur | -76.5470 | 3.3861 | Latitud | 1.0000 | Alta |
| 7411 | la flora | Zona Norte | Zona Sur | -76.5494 | 3.3952 | Latitud | 1.0000 | Alta |
| 6902 | la flora | Zona Norte | Zona Sur | -76.5458 | 3.3737 | Latitud | 1.0000 | Alta |
| 3395 | la flora | Zona Norte | Zona Sur | -76.5260 | 3.3990 | Latitud | 1.0000 | Alta |
| 626 | la floresta | Zona Norte | Zona Sur | -76.5000 | 3.4010 | Latitud | 1.0000 | Alta |
| 3517 | las granjas | Zona Norte | Zona Sur | -76.5270 | 3.4010 | Latitud | 1.0000 | Alta |
| 3384 | los alcázares | Zona Norte | Zona Sur | -76.5260 | 3.4040 | Latitud | 1.0000 | Alta |
| 7521 | pacará | Zona Norte | Zona Sur | -76.5500 | 3.3880 | Latitud | 1.0000 | Alta |
| 4627 | popular | Zona Norte | Zona Sur | -76.5320 | 3.4140 | Latitud | 1.0000 | Alta |
| 5918 | rozo la torre | Zona Norte | Zona Sur | -76.5394 | 3.4148 | Latitud | 1.0000 | Alta |
| 622 | san vicente | Zona Norte | Zona Sur | -76.5000 | 3.4010 | Latitud | 1.0000 | Alta |
| 5413 | torres de comfandi | Zona Norte | Zona Sur | -76.5364 | 3.4045 | Latitud | 1.0000 | Alta |
| 5818 | torres de comfandi | Zona Norte | Zona Sur | -76.5385 | 3.4035 | Latitud | 1.0000 | Alta |
| 620 | urbanización la flora | Zona Norte | Zona Sur | -76.5000 | 3.4010 | Latitud | 1.0000 | Alta |
| 2278 | valle del lili | Zona Norte | Zona Sur | -76.5196 | 3.3720 | Latitud | 1.0000 | Alta |
| 3020 | valle del lili | Zona Norte | Zona Sur | -76.5234 | 3.3786 | Latitud | 1.0000 | Alta |
| 3310 | valle del lili | Zona Norte | Zona Sur | -76.5259 | 3.3726 | Latitud | 1.0000 | Alta |
| 3048 | valle del lili | Zona Norte | Zona Sur | -76.5235 | 3.3779 | Latitud | 1.0000 | Alta |
| 7691 | villa del prado | Zona Norte | Zona Sur | -76.5513 | 3.4045 | Latitud | 1.0000 | Alta |
| 2863 | villas de veracruz | Zona Norte | Zona Sur | -76.5224 | 3.4003 | Latitud | 1.0000 | Alta |
| 7470 | vipasa | Zona Norte | Zona Sur | -76.5498 | 3.3756 | Latitud | 1.0000 | Alta |
| 3986 | alamos | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3984 | alcazares | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3985 | alcazares | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3903 | brisas de los | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3904 | brisas de los | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3905 | brisas de los | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3979 | Bueno Madrid | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3856 | el trébol | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3919 | el troncal | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3890 | la flora | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3891 | la flora | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3892 | la flora | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3893 | la flora | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3961 | la flora | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3875 | las ceibas | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3873 | las delicias | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3951 | los alcazares | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3949 | Los Guaduales | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3929 | paso del comercio | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3930 | paso del comercio | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3866 | poblado campestre | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3860 | prados del norte | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3861 | prados del norte | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3925 | puente del comercio | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3859 | salomia | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3923 | salomia | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3920 | torres de comfandi | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3908 | villa de veracruz | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3852 | villa del prado | Zona Norte | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 635 | urbanización la flora | Zona Norte | Zona Sur | -76.5000 | 3.4020 | Latitud | 0.9375 | Alta |
| 5424 | acopi | Zona Norte | Zona Sur | -76.5364 | 3.4077 | Latitud | 0.9333 | Alta |
| 5418 | acopi | Zona Norte | Zona Sur | -76.5364 | 3.4087 | Latitud | 0.9333 | Alta |
| 744 | prados del norte | Zona Norte | Zona Sur | -76.5023 | 3.4010 | Latitud | 0.9333 | Alta |
| 1211 | zona norte | Zona Norte | Zona Sur | -76.5135 | 3.3879 | Latitud | 0.9333 | Alta |
| 8278 | acopi | Zona Norte | Zona Sur | -76.5621 | 3.4100 | Latitud | 0.8667 | Alta |
| 8289 | Cali | Zona Norte | Zona Sur | -76.5641 | 3.4103 | Latitud | 0.8000 | Alta |
| 536 | zona oriente | Zona Norte | Zona Sur | -76.4982 | 3.4047 | Latitud | 0.8000 | Alta |
| 2180 | urbanización la flora | Zona Norte | Zona Sur | -76.5190 | 3.4050 | Latitud | 0.7500 | Media |
| 842 | villa de veracruz | Zona Norte | Zona Sur | -76.5040 | 3.4010 | Latitud | 0.6875 | Media |
| 1327 | la flora | Zona Norte | Zona Sur | -76.5151 | 3.4081 | Latitud | 0.6667 | Media |
| 722 | la flora | Zona Norte | Zona Sur | -76.5020 | 3.4066 | Latitud | 0.6667 | Media |
| 1171 | prados del norte | Zona Norte | Zona Sur | -76.5125 | 3.4135 | Latitud | 0.6000 | Media |
| 196 | arboledas | Zona Oeste | Zona Norte | -76.4886 | 3.4691 | Longitud | 1.0000 | Alta |
| 3534 | el peñon | Zona Oeste | Zona Norte | -76.5270 | 3.4760 | Latitud | 1.0000 | Alta |
| 2790 | normandía | Zona Oeste | Zona Norte | -76.5220 | 3.4830 | Longitud y latitud | 1.0000 | Alta |
| 3379 | normandía | Zona Oeste | Zona Norte | -76.5260 | 3.4650 | Longitud | 1.0000 | Alta |
| 3380 | normandía | Zona Oeste | Zona Norte | -76.5260 | 3.4650 | Longitud | 1.0000 | Alta |
| 2849 | norte | Zona Oeste | Zona Norte | -76.5223 | 3.4894 | Longitud y latitud | 1.0000 | Alta |
| 586 | norte | Zona Oeste | Zona Norte | -76.4990 | 3.4758 | Longitud y latitud | 1.0000 | Alta |
| 2020 | norte | Zona Oeste | Zona Norte | -76.5189 | 3.4762 | Longitud y latitud | 1.0000 | Alta |
| 2675 | norte | Zona Oeste | Zona Norte | -76.5214 | 3.4688 | Longitud | 1.0000 | Alta |
| 3173 | norte | Zona Oeste | Zona Norte | -76.5240 | 3.4857 | Longitud y latitud | 1.0000 | Alta |
| 2443 | prados del norte | Zona Oeste | Zona Norte | -76.5203 | 3.4695 | Longitud | 1.0000 | Alta |
| 823 | san antonio | Zona Oeste | Zona Norte | -76.5034 | 3.4861 | Longitud y latitud | 1.0000 | Alta |
| 1183 | san antonio | Zona Oeste | Zona Norte | -76.5129 | 3.4711 | Longitud | 1.0000 | Alta |
| 3200 | san vicente | Zona Oeste | Zona Norte | -76.5246 | 3.4662 | Longitud | 1.0000 | Alta |
| 737 | santa rita | Zona Oeste | Zona Norte | -76.5020 | 3.4910 | Longitud y latitud | 1.0000 | Alta |
| 239 | santa teresita | Zona Oeste | Zona Norte | -76.4902 | 3.4941 | Longitud y latitud | 1.0000 | Alta |
| 489 | santa teresita | Zona Oeste | Zona Norte | -76.4971 | 3.4697 | Longitud | 1.0000 | Alta |
| 450 | santa teresita | Zona Oeste | Zona Norte | -76.4960 | 3.4690 | Longitud | 1.0000 | Alta |
| 451 | santa teresita | Zona Oeste | Zona Norte | -76.4960 | 3.4690 | Longitud | 1.0000 | Alta |
| 3367 | santa teresita | Zona Oeste | Zona Norte | -76.5260 | 3.4670 | Longitud | 1.0000 | Alta |
| 505 | zona norte | Zona Oeste | Zona Norte | -76.4978 | 3.4778 | Longitud y latitud | 1.0000 | Alta |
| 1500 | zona norte | Zona Oeste | Zona Norte | -76.5162 | 3.4912 | Longitud y latitud | 1.0000 | Alta |
| 4912 | zona oeste | Zona Oeste | Zona Norte | -76.5338 | 3.4903 | Latitud | 1.0000 | Alta |
| 275 | norte | Zona Oeste | Zona Norte | -76.4916 | 3.4751 | Longitud y latitud | 0.9333 | Alta |
| 211 | santa teresita | Zona Oeste | Zona Norte | -76.4890 | 3.4800 | Longitud y latitud | 0.9333 | Alta |
| 1129 | santa teresita | Zona Oeste | Zona Norte | -76.5110 | 3.4730 | Longitud | 0.9333 | Alta |
| 1027 | santa teresita | Zona Oeste | Zona Norte | -76.5080 | 3.4730 | Longitud | 0.9333 | Alta |
| 1237 | cristales | Zona Oeste | Zona Norte | -76.5140 | 3.4620 | Longitud | 0.8000 | Alta |
| 1198 | cristales | Zona Oeste | Zona Norte | -76.5130 | 3.4630 | Longitud | 0.7333 | Media |
| 3158 | normandía | Zona Oeste | Zona Norte | -76.5240 | 3.4570 | Longitud | 0.6667 | Media |
| 1653 | cristales | Zona Oeste | Zona Norte | -76.5170 | 3.4580 | Longitud | 0.5000 | Baja |
| 959 | miraflores | Zona Oeste | Zona Oriente | -76.5067 | 3.4381 | Longitud | 0.9333 | Alta |
| 961 | santa teresita | Zona Oeste | Zona Oriente | -76.5067 | 3.4381 | Longitud | 0.9333 | Alta |
| 1508 | santa teresita | Zona Oeste | Zona Oriente | -76.5163 | 3.4368 | Longitud | 0.8125 | Alta |
| 2 | miraflores | Zona Oeste | Zona Oriente | -76.4640 | 3.4280 | Longitud | 0.8000 | Alta |
| 414 | miraflores | Zona Oeste | Zona Oriente | -76.4953 | 3.4415 | Longitud | 0.8000 | Alta |
| 11 | zona oeste | Zona Oeste | Zona Oriente | -76.4650 | 3.4288 | Longitud | 0.8000 | Alta |
| 984 | el peñon | Zona Oeste | Zona Oriente | -76.5070 | 3.4010 | Longitud y latitud | 0.7333 | Media |
| 117 | santa teresita | Zona Oeste | Zona Oriente | -76.4843 | 3.4395 | Longitud | 0.7333 | Media |
| 1495 | tejares de san | Zona Oeste | Zona Oriente | -76.5161 | 3.4383 | Longitud | 0.7333 | Media |
| 139 | zona oeste | Zona Oeste | Zona Oriente | -76.4863 | 3.4301 | Longitud | 0.7333 | Media |
| 236 | zona oeste | Zona Oeste | Zona Oriente | -76.4900 | 3.4494 | Longitud | 0.7333 | Media |
| 983 | santa teresita | Zona Oeste | Zona Oriente | -76.5070 | 3.4030 | Longitud y latitud | 0.6667 | Media |
| 1712 | cristales | Zona Oeste | Zona Oriente | -76.5170 | 3.4100 | Longitud y latitud | 0.6000 | Media |
| 400 | cristales | Zona Oeste | Zona Oriente | -76.4950 | 3.4510 | Longitud | 0.6000 | Media |
| 125 | la arboleda | Zona Oeste | Zona Oriente | -76.4850 | 3.4160 | Longitud y latitud | 0.6000 | Media |
| 1158 | aguacatal | Zona Oeste | Zona Oriente | -76.5120 | 3.4020 | Longitud y latitud | 0.5333 | Baja |
| 1197 | cristales | Zona Oeste | Zona Oriente | -76.5130 | 3.4210 | Longitud | 0.4667 | Baja |
| 1049 | los cristales | Zona Oeste | Zona Oriente | -76.5085 | 3.4204 | Longitud | 0.4667 | Baja |
| 1077 | primavera | Zona Oeste | Zona Oriente | -76.5093 | 3.4206 | Longitud | 0.4667 | Baja |
| 817 | santa teresita | Zona Oeste | Zona Oriente | -76.5033 | 3.4483 | Longitud | 0.4000 | Baja |
| 8212 | altos de guadalupe | Zona Oeste | Zona Sur | -76.5578 | 3.4117 | Latitud | 1.0000 | Alta |
| 8238 | arboledas | Zona Oeste | Zona Sur | -76.5594 | 3.3890 | Latitud | 1.0000 | Alta |
| 5284 | bella suiza | Zona Oeste | Zona Sur | -76.5356 | 3.4123 | Latitud | 1.0000 | Alta |
| 8210 | bella suiza | Zona Oeste | Zona Sur | -76.5577 | 3.4110 | Latitud | 1.0000 | Alta |
| 4876 | bella suiza | Zona Oeste | Zona Sur | -76.5335 | 3.4046 | Latitud | 1.0000 | Alta |
| 5116 | bella suiza | Zona Oeste | Zona Sur | -76.5348 | 3.4047 | Latitud | 1.0000 | Alta |
| 4879 | bella suiza | Zona Oeste | Zona Sur | -76.5335 | 3.4046 | Latitud | 1.0000 | Alta |
| 6851 | bella suiza | Zona Oeste | Zona Sur | -76.5452 | 3.4083 | Latitud | 1.0000 | Alta |
| 7734 | bella suiza | Zona Oeste | Zona Sur | -76.5517 | 3.4086 | Latitud | 1.0000 | Alta |
| 6709 | bellavista | Zona Oeste | Zona Sur | -76.5440 | 3.3900 | Latitud | 1.0000 | Alta |
| 7362 | centenario | Zona Oeste | Zona Sur | -76.5490 | 3.3870 | Latitud | 1.0000 | Alta |
| 3966 | cristales | Zona Oeste | Zona Sur | -76.5290 | 3.3700 | Latitud | 1.0000 | Alta |
| 6348 | el peñon | Zona Oeste | Zona Sur | -76.5420 | 3.3750 | Latitud | 1.0000 | Alta |
| 5910 | el peñon | Zona Oeste | Zona Sur | -76.5394 | 3.3597 | Latitud | 1.0000 | Alta |
| 8194 | guadalupe alto | Zona Oeste | Zona Sur | -76.5570 | 3.4110 | Latitud | 1.0000 | Alta |
| 7193 | la arboleda | Zona Oeste | Zona Sur | -76.5480 | 3.3900 | Latitud | 1.0000 | Alta |
| 7194 | la arboleda | Zona Oeste | Zona Sur | -76.5480 | 3.3900 | Latitud | 1.0000 | Alta |
| 8233 | la arboleda | Zona Oeste | Zona Sur | -76.5590 | 3.3880 | Latitud | 1.0000 | Alta |
| 5873 | meléndez | Zona Oeste | Zona Sur | -76.5390 | 3.3710 | Latitud | 1.0000 | Alta |
| 8227 | normandía | Zona Oeste | Zona Sur | -76.5590 | 3.3750 | Latitud | 1.0000 | Alta |
| 685 | normandía | Zona Oeste | Zona Sur | -76.5010 | 3.4010 | Longitud y latitud | 1.0000 | Alta |
| 4364 | normandía | Zona Oeste | Zona Sur | -76.5310 | 3.3660 | Latitud | 1.0000 | Alta |
| 7881 | refugio | Zona Oeste | Zona Sur | -76.5529 | 3.4003 | Latitud | 1.0000 | Alta |
| 5982 | santa anita | Zona Oeste | Zona Sur | -76.5400 | 3.4020 | Latitud | 1.0000 | Alta |
| 4541 | santa isabel | Zona Oeste | Zona Sur | -76.5320 | 3.4131 | Latitud | 1.0000 | Alta |
| 4740 | santa rita | Zona Oeste | Zona Sur | -76.5328 | 3.3983 | Latitud | 1.0000 | Alta |
| 8220 | santa teresita | Zona Oeste | Zona Sur | -76.5586 | 3.3829 | Latitud | 1.0000 | Alta |
| 684 | santa teresita | Zona Oeste | Zona Sur | -76.5010 | 3.4000 | Longitud y latitud | 1.0000 | Alta |
| 8181 | santa teresita | Zona Oeste | Zona Sur | -76.5568 | 3.3888 | Latitud | 1.0000 | Alta |
| 4754 | santa teresita | Zona Oeste | Zona Sur | -76.5328 | 3.4132 | Latitud | 1.0000 | Alta |
| 4682 | santa teresita | Zona Oeste | Zona Sur | -76.5322 | 3.3603 | Latitud | 1.0000 | Alta |
| 8188 | seminario | Zona Oeste | Zona Sur | -76.5570 | 3.4080 | Latitud | 1.0000 | Alta |
| 5618 | zona oeste | Zona Oeste | Zona Sur | -76.5377 | 3.4061 | Latitud | 1.0000 | Alta |
| 8209 | zona oeste | Zona Oeste | Zona Sur | -76.5577 | 3.4110 | Latitud | 1.0000 | Alta |
| 3965 | cristales | Zona Oeste | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 3950 | los cristales | Zona Oeste | Zona Sur | -76.5290 | 3.4130 | Latitud | 0.9574 | Alta |
| 2591 | santa teresita | Zona Oeste | Zona Sur | -76.5210 | 3.4420 | Longitud | 0.8125 | Alta |
| 8285 | bella suiza | Zona Oeste | Zona Sur | -76.5639 | 3.4103 | Latitud | 0.8000 | Alta |
| 8290 | bella suiza | Zona Oeste | Zona Sur | -76.5646 | 3.4086 | Latitud | 0.8000 | Alta |
| 8295 | bella suiza | Zona Oeste | Zona Sur | -76.5650 | 3.4091 | Latitud | 0.8000 | Alta |
| 8301 | bella suiza | Zona Oeste | Zona Sur | -76.5652 | 3.4087 | Latitud | 0.8000 | Alta |
| 8280 | bella suiza | Zona Oeste | Zona Sur | -76.5630 | 3.4128 | Latitud | 0.8000 | Alta |
| 8297 | bella suiza alta | Zona Oeste | Zona Sur | -76.5650 | 3.4080 | Latitud | 0.8000 | Alta |
| 8300 | bella suiza alta | Zona Oeste | Zona Sur | -76.5650 | 3.4080 | Latitud | 0.8000 | Alta |
| 2838 | normandía | Zona Oeste | Zona Sur | -76.5222 | 3.4206 | Longitud | 0.7333 | Media |
| 2791 | normandia | Zona Oeste | Zona Sur | -76.5220 | 3.4210 | Longitud | 0.7333 | Media |
| 500 | santa isabel | Zona Oeste | Zona Sur | -76.4976 | 3.4095 | Longitud y latitud | 0.7333 | Media |
| 859 | santa rita | Zona Oeste | Zona Sur | -76.5040 | 3.4080 | Longitud y latitud | 0.6471 | Media |
| 902 | santa teresita | Zona Oeste | Zona Sur | -76.5050 | 3.4020 | Longitud y latitud | 0.6316 | Media |
| 3410 | aguacatal | Zona Oeste | Zona Sur | -76.5260 | 3.4530 | Longitud | 0.5333 | Baja |
| 646 | santa teresita | Zona Oeste | Zona Sur | -76.5002 | 3.4481 | Longitud | 0.4667 | Baja |
| 3376 | el peñon | Zona Oeste | Zona Sur | -76.5260 | 3.4340 | Longitud | 0.4333 | Baja |
| 3377 | el peñon | Zona Oeste | Zona Sur | -76.5260 | 3.4340 | Longitud | 0.4333 | Baja |
| 3387 | juanamb√∫ | Zona Oeste | Zona Sur | -76.5260 | 3.4340 | Longitud | 0.4333 | Baja |
| 3378 | normandía | Zona Oeste | Zona Sur | -76.5260 | 3.4340 | Longitud | 0.4333 | Baja |
| 3366 | santa teresita | Zona Oeste | Zona Sur | -76.5260 | 3.4340 | Longitud | 0.4333 | Baja |
| 628 | calipso | Zona Oriente | Zona Norte | -76.5000 | 3.4900 | Latitud | 1.0000 | Alta |
| 8052 | ciudad cordoba | Zona Oriente | Zona Oeste | -76.5544 | 3.4248 | Longitud | 0.5333 | Baja |
| 7797 | meléndez | Zona Oriente | Zona Sur | -76.5520 | 3.3720 | Longitud y latitud | 1.0000 | Alta |
| 6937 | pance | Zona Oriente | Zona Sur | -76.5460 | 3.3440 | Latitud | 1.0000 | Alta |
| 8271 | quintas de salomia | Zona Oriente | Zona Sur | -76.5611 | 3.3891 | Longitud | 1.0000 | Alta |
| 3013 | valle grande | Zona Oriente | Zona Sur | -76.5233 | 3.3790 | Latitud | 1.0000 | Alta |
| 7443 | antonio nariño | Zona Oriente | Zona Sur | -76.5497 | 3.4248 | Longitud | 0.6061 | Media |
| 7442 | la base | Zona Oriente | Zona Sur | -76.5497 | 3.4248 | Longitud | 0.6061 | Media |
| 7431 | municipal | Zona Oriente | Zona Sur | -76.5497 | 3.4248 | Longitud | 0.6061 | Media |
| 822 | belisario caicedo | Zona Sur | Zona Norte | -76.5034 | 3.4770 | Latitud | 1.0000 | Alta |
| 753 | cañaveralejo | Zona Sur | Zona Norte | -76.5025 | 3.4713 | Latitud | 1.0000 | Alta |
| 678 | ciudad 2000 | Zona Sur | Zona Norte | -76.5010 | 3.4850 | Latitud | 1.0000 | Alta |
| 3487 | ciudad bochalema | Zona Sur | Zona Norte | -76.5267 | 3.4678 | Latitud | 1.0000 | Alta |
| 706 | ciudad capri | Zona Sur | Zona Norte | -76.5012 | 3.4854 | Latitud | 1.0000 | Alta |
| 1496 | ciudad jardín | Zona Sur | Zona Norte | -76.5161 | 3.4683 | Latitud | 1.0000 | Alta |
| 887 | cuarto de legua | Zona Sur | Zona Norte | -76.5047 | 3.4799 | Latitud | 1.0000 | Alta |
| 2150 | el caney | Zona Sur | Zona Norte | -76.5190 | 3.4807 | Latitud | 1.0000 | Alta |
| 1177 | el caney | Zona Sur | Zona Norte | -76.5128 | 3.4804 | Latitud | 1.0000 | Alta |
| 3669 | el caney | Zona Sur | Zona Norte | -76.5279 | 3.4838 | Latitud | 1.0000 | Alta |
| 3670 | el caney | Zona Sur | Zona Norte | -76.5279 | 3.4838 | Latitud | 1.0000 | Alta |
| 221 | el ingenio | Zona Sur | Zona Norte | -76.4895 | 3.4968 | Longitud y latitud | 1.0000 | Alta |
| 140 | el limonar | Zona Sur | Zona Norte | -76.4864 | 3.4651 | Longitud | 1.0000 | Alta |
| 955 | el limonar | Zona Sur | Zona Norte | -76.5065 | 3.4894 | Latitud | 1.0000 | Alta |
| 197 | el refugio | Zona Sur | Zona Norte | -76.4886 | 3.4663 | Longitud | 1.0000 | Alta |
| 429 | el refugio | Zona Sur | Zona Norte | -76.4957 | 3.4688 | Latitud | 1.0000 | Alta |
| 711 | guadalupe | Zona Sur | Zona Norte | -76.5015 | 3.4780 | Latitud | 1.0000 | Alta |
| 2973 | la flora | Zona Sur | Zona Norte | -76.5230 | 3.4920 | Latitud | 1.0000 | Alta |
| 345 | la hacienda | Zona Sur | Zona Norte | -76.4936 | 3.4835 | Latitud | 1.0000 | Alta |
| 545 | pampa linda | Zona Sur | Zona Norte | -76.4986 | 3.4811 | Latitud | 1.0000 | Alta |
| 315 | pance | Zona Sur | Zona Norte | -76.4930 | 3.4680 | Latitud | 1.0000 | Alta |
| 1296 | pance | Zona Sur | Zona Norte | -76.5150 | 3.4704 | Latitud | 1.0000 | Alta |
| 673 | seminario | Zona Sur | Zona Norte | -76.5009 | 3.4779 | Latitud | 1.0000 | Alta |
| 779 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 784 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 795 | valle del lili | Zona Sur | Zona Norte | -76.5031 | 3.4759 | Latitud | 1.0000 | Alta |
| 2390 | valle del lili | Zona Sur | Zona Norte | -76.5200 | 3.4700 | Latitud | 1.0000 | Alta |
| 3424 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 649 | valle del lili | Zona Sur | Zona Norte | -76.5004 | 3.4809 | Latitud | 1.0000 | Alta |
| 777 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4830 | Latitud | 1.0000 | Alta |
| 3423 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3428 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3429 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 778 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4830 | Latitud | 1.0000 | Alta |
| 648 | valle del lili | Zona Sur | Zona Norte | -76.5004 | 3.4809 | Latitud | 1.0000 | Alta |
| 781 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 797 | valle del lili | Zona Sur | Zona Norte | -76.5031 | 3.4758 | Latitud | 1.0000 | Alta |
| 782 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 3430 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3431 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3432 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 631 | valle del lili | Zona Sur | Zona Norte | -76.5000 | 3.4810 | Latitud | 1.0000 | Alta |
| 785 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 857 | valle del lili | Zona Sur | Zona Norte | -76.5040 | 3.4690 | Latitud | 1.0000 | Alta |
| 886 | valle del lili | Zona Sur | Zona Norte | -76.5047 | 3.4799 | Latitud | 1.0000 | Alta |
| 3427 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3425 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 3426 | valle del lili | Zona Sur | Zona Norte | -76.5262 | 3.4698 | Latitud | 1.0000 | Alta |
| 357 | valle del lili | Zona Sur | Zona Norte | -76.4940 | 3.4710 | Latitud | 1.0000 | Alta |
| 780 | valle del lili | Zona Sur | Zona Norte | -76.5030 | 3.4760 | Latitud | 1.0000 | Alta |
| 1844 | vipasa | Zona Sur | Zona Norte | -76.5180 | 3.4750 | Latitud | 1.0000 | Alta |
| 407 | zona sur | Zona Sur | Zona Norte | -76.4952 | 3.4812 | Latitud | 1.0000 | Alta |
| 1790 | ciudad bochalema | Zona Sur | Zona Norte | -76.5175 | 3.4784 | Latitud | 0.9333 | Alta |
| 582 | el ingenio | Zona Sur | Zona Norte | -76.4990 | 3.4710 | Latitud | 0.9333 | Alta |
| 193 | el refugio | Zona Sur | Zona Norte | -76.4884 | 3.4814 | Longitud y latitud | 0.9333 | Alta |
| 1789 | nueva tequendama | Zona Sur | Zona Norte | -76.5175 | 3.4784 | Latitud | 0.9333 | Alta |
| 181 | pance | Zona Sur | Zona Norte | -76.4880 | 3.4700 | Longitud y latitud | 0.9333 | Alta |
| 253 | primero de mayo | Zona Sur | Zona Norte | -76.4910 | 3.4728 | Longitud y latitud | 0.9333 | Alta |
| 1092 | valle del lili | Zona Sur | Zona Norte | -76.5100 | 3.4770 | Latitud | 0.9333 | Alta |
| 316 | urbanizacion el saman | Zona Sur | Zona Norte | -76.4930 | 3.4680 | Latitud | 0.9091 | Alta |
| 324 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4680 | Latitud | 0.9091 | Alta |
| 301 | bloques del limonar | Zona Sur | Zona Norte | -76.4920 | 3.4730 | Longitud y latitud | 0.8750 | Alta |
| 1165 | ciudad jardín | Zona Sur | Zona Norte | -76.5122 | 3.4682 | Latitud | 0.8750 | Alta |
| 318 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 319 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 320 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 321 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 322 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 323 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 325 | valle del lili | Zona Sur | Zona Norte | -76.4930 | 3.4670 | Latitud | 0.8667 | Alta |
| 1133 | bochalema | Zona Sur | Zona Norte | -76.5110 | 3.4690 | Latitud | 0.8000 | Alta |
| 87 | Colseguros Andes | Zona Sur | Zona Oriente | -76.4820 | 3.4490 | Longitud | 0.9333 | Alta |
| 43 | bochalema | Zona Sur | Zona Oriente | -76.4700 | 3.4270 | Longitud | 0.8000 | Alta |
| 120 | capri | Zona Sur | Zona Oriente | -76.4846 | 3.4531 | Longitud | 0.8000 | Alta |
| 49 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4714 | 3.4207 | Longitud | 0.8000 | Alta |
| 50 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4714 | 3.4207 | Longitud | 0.8000 | Alta |
| 48 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4714 | 3.4207 | Longitud | 0.8000 | Alta |
| 63 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4741 | 3.4197 | Longitud | 0.8000 | Alta |
| 52 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4717 | 3.4237 | Longitud | 0.8000 | Alta |
| 20 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4655 | 3.4293 | Longitud | 0.8000 | Alta |
| 51 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4717 | 3.4237 | Longitud | 0.8000 | Alta |
| 40 | ciudad bochalema | Zona Sur | Zona Oriente | -76.4695 | 3.4250 | Longitud | 0.8000 | Alta |
| 23 | ciudad jardín | Zona Sur | Zona Oriente | -76.4669 | 3.4233 | Longitud | 0.8000 | Alta |
| 7 | ciudad jardín | Zona Sur | Zona Oriente | -76.4644 | 3.4346 | Longitud | 0.8000 | Alta |
| 54 | ciudad jardín | Zona Sur | Zona Oriente | -76.4722 | 3.4212 | Longitud | 0.8000 | Alta |
| 56 | ciudad jardín | Zona Sur | Zona Oriente | -76.4728 | 3.4215 | Longitud | 0.8000 | Alta |
| 57 | ciudad jardín | Zona Sur | Zona Oriente | -76.4728 | 3.4215 | Longitud | 0.8000 | Alta |
| 36 | ciudad jardín | Zona Sur | Zona Oriente | -76.4685 | 3.4254 | Longitud | 0.8000 | Alta |
| 61 | ciudad jardín | Zona Sur | Zona Oriente | -76.4736 | 3.4125 | Longitud | 0.8000 | Alta |
| 24 | ciudad jardín | Zona Sur | Zona Oriente | -76.4669 | 3.4233 | Longitud | 0.8000 | Alta |
| 4 | ciudad jardín | Zona Sur | Zona Oriente | -76.4640 | 3.4330 | Longitud | 0.8000 | Alta |
| 17 | ciudad jardín | Zona Sur | Zona Oriente | -76.4654 | 3.4331 | Longitud | 0.8000 | Alta |
| 37 | el ingenio | Zona Sur | Zona Oriente | -76.4686 | 3.4362 | Longitud | 0.8000 | Alta |
| 160 | el refugio | Zona Sur | Zona Oriente | -76.4870 | 3.4568 | Longitud | 0.8000 | Alta |
| 47 | melendez | Zona Sur | Zona Oriente | -76.4712 | 3.4274 | Longitud | 0.8000 | Alta |
| 62 | melendez | Zona Sur | Zona Oriente | -76.4740 | 3.4253 | Longitud | 0.8000 | Alta |
| 3 | multicentro | Zona Sur | Zona Oriente | -76.4640 | 3.4290 | Longitud | 0.8000 | Alta |
| 33 | pance | Zona Sur | Zona Oriente | -76.4681 | 3.4166 | Longitud | 0.8000 | Alta |
| 1 | pance | Zona Sur | Zona Oriente | -76.4630 | 3.4300 | Longitud | 0.8000 | Alta |
| 5 | pance | Zona Sur | Zona Oriente | -76.4644 | 3.4346 | Longitud | 0.8000 | Alta |
| 46 | pance | Zona Sur | Zona Oriente | -76.4711 | 3.4205 | Longitud | 0.8000 | Alta |
| 6 | pance | Zona Sur | Zona Oriente | -76.4644 | 3.4346 | Longitud | 0.8000 | Alta |
| 19 | pance | Zona Sur | Zona Oriente | -76.4655 | 3.4293 | Longitud | 0.8000 | Alta |
| 59 | pance | Zona Sur | Zona Oriente | -76.4736 | 3.4125 | Longitud | 0.8000 | Alta |
| 39 | pance | Zona Sur | Zona Oriente | -76.4695 | 3.4253 | Longitud | 0.8000 | Alta |
| 10 | pance | Zona Sur | Zona Oriente | -76.4648 | 3.4278 | Longitud | 0.8000 | Alta |
| 44 | pance | Zona Sur | Zona Oriente | -76.4704 | 3.4144 | Longitud | 0.8000 | Alta |
| 60 | pance | Zona Sur | Zona Oriente | -76.4736 | 3.4125 | Longitud | 0.8000 | Alta |
| 35 | pance | Zona Sur | Zona Oriente | -76.4685 | 3.4254 | Longitud | 0.8000 | Alta |
| 38 | parcelaciones pance | Zona Sur | Zona Oriente | -76.4688 | 3.4256 | Longitud | 0.8000 | Alta |
| 34 | parcelaciones pance | Zona Sur | Zona Oriente | -76.4681 | 3.4166 | Longitud | 0.8000 | Alta |
| 30 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4345 | Longitud | 0.8000 | Alta |
| 18 | valle del lili | Zona Sur | Zona Oriente | -76.4654 | 3.4342 | Longitud | 0.8000 | Alta |
| 26 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4345 | Longitud | 0.8000 | Alta |
| 53 | valle del lili | Zona Sur | Zona Oriente | -76.4721 | 3.4249 | Longitud | 0.8000 | Alta |
| 25 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4348 | Longitud | 0.8000 | Alta |
| 41 | valle del lili | Zona Sur | Zona Oriente | -76.4699 | 3.4272 | Longitud | 0.8000 | Alta |
| 68 | valle del lili | Zona Sur | Zona Oriente | -76.4768 | 3.4268 | Longitud | 0.8000 | Alta |
| 8 | valle del lili | Zona Sur | Zona Oriente | -76.4644 | 3.4346 | Longitud | 0.8000 | Alta |
| 29 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4350 | Longitud | 0.8000 | Alta |
| 14 | valle del lili | Zona Sur | Zona Oriente | -76.4650 | 3.4360 | Longitud | 0.8000 | Alta |
| 42 | valle del lili | Zona Sur | Zona Oriente | -76.4700 | 3.4270 | Longitud | 0.8000 | Alta |
| 27 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4345 | Longitud | 0.8000 | Alta |
| 28 | valle del lili | Zona Sur | Zona Oriente | -76.4670 | 3.4345 | Longitud | 0.8000 | Alta |
| 9 | valle del lili | Zona Sur | Zona Oriente | -76.4644 | 3.4346 | Longitud | 0.8000 | Alta |
| 32 | valle del lili | Zona Sur | Zona Oriente | -76.4680 | 3.4340 | Longitud | 0.8000 | Alta |
| 16 | valle del lili | Zona Sur | Zona Oriente | -76.4652 | 3.4352 | Longitud | 0.8000 | Alta |
| 12 | valle del lili | Zona Sur | Zona Oriente | -76.4650 | 3.4360 | Longitud | 0.8000 | Alta |
| 13 | valle del lili | Zona Sur | Zona Oriente | -76.4650 | 3.4360 | Longitud | 0.8000 | Alta |
| 15 | valle del lili | Zona Sur | Zona Oriente | -76.4650 | 3.4360 | Longitud | 0.8000 | Alta |
| 45 | valle del lili | Zona Sur | Zona Oriente | -76.4710 | 3.4290 | Longitud | 0.8000 | Alta |
| 55 | zona sur | Zona Sur | Zona Oriente | -76.4728 | 3.4215 | Longitud | 0.8000 | Alta |
| 64 | zona sur | Zona Sur | Zona Oriente | -76.4754 | 3.4196 | Longitud | 0.8000 | Alta |
| 75 | capri | Zona Sur | Zona Oriente | -76.4792 | 3.4322 | Longitud | 0.7333 | Media |
| 102 | ciudad jardín | Zona Sur | Zona Oriente | -76.4830 | 3.4450 | Longitud | 0.7333 | Media |
| 66 | ciudad jardín | Zona Sur | Zona Oriente | -76.4760 | 3.4151 | Longitud | 0.7333 | Media |
| 67 | el cedro | Zona Sur | Zona Oriente | -76.4760 | 3.4130 | Longitud | 0.7333 | Media |
| 284 | el limonar | Zona Sur | Zona Oriente | -76.4918 | 3.4466 | Longitud | 0.7333 | Media |
| 290 | el refugio | Zona Sur | Zona Oriente | -76.4919 | 3.4465 | Longitud | 0.7333 | Media |
| 101 | pance | Zona Sur | Zona Oriente | -76.4830 | 3.4450 | Longitud | 0.7333 | Media |
| 65 | valle del lili | Zona Sur | Zona Oriente | -76.4756 | 3.4127 | Longitud | 0.7333 | Media |
| 134 | ciudad 2000 | Zona Sur | Zona Oriente | -76.4858 | 3.4447 | Longitud | 0.6667 | Media |
| 100 | ciudad country | Zona Sur | Zona Oriente | -76.4830 | 3.4660 | Longitud | 0.6667 | Media |
| 123 | el ingenio | Zona Sur | Zona Oriente | -76.4850 | 3.4179 | Longitud | 0.6667 | Media |
| 151 | el refugio | Zona Sur | Zona Oriente | -76.4866 | 3.4460 | Longitud | 0.6667 | Media |
| 70 | nápoles | Zona Sur | Zona Oriente | -76.4778 | 3.4258 | Longitud | 0.6667 | Media |
| 184 | san fernando viejo | Zona Sur | Zona Oriente | -76.4880 | 3.4590 | Longitud | 0.6667 | Media |
| 119 | valle del lili | Zona Sur | Zona Oriente | -76.4846 | 3.4179 | Longitud | 0.6667 | Media |
| 95 | valle del lili | Zona Sur | Zona Oriente | -76.4825 | 3.4179 | Longitud | 0.6000 | Media |
comparacionZonas |>
tablaHtml(
"Número de registros por zona antes y después del retag",
digitos = 0
)
| Zona | Antes | Despues | CambioNeto |
|---|---|---|---|
| Zona Centro | 124 | 112 | -12 |
| Zona Norte | 1920 | 1831 | -89 |
| Zona Oeste | 1198 | 1095 | -103 |
| Zona Oriente | 351 | 446 | 95 |
| Zona Sur | 4726 | 4835 | 109 |
impactoRetagSegmentos |>
tablaHtml(
"Impacto del retag sobre los dos segmentos solicitados",
digitos = 0
)
| Segmento | AntesRetag | DespuesRetag | Cambio |
|---|---|---|---|
| Casa / Zona Norte | 722 | 661 | -61 |
| Apartamento / Zona Sur | 2787 | 2835 | 48 |
Se corrigieron 476 registros. La transición más frecuente fue Zona Norte → Zona Sur, con 192 registros. La Tabla @ref(tab:resumenTransicionesRetag) resume todas las direcciones de cambio y la Tabla @ref(tab:confianzaRetag) distingue la fuerza de la evidencia local: 412 correcciones tienen confianza alta, 46 media y 18 baja. Por instrucción de la actividad los candidatos asignados a otra zona sí se retaggean, pero los casos de confianza baja quedan claramente identificados para inspección visual en el mapa y en la Tabla @ref(tab:auditoriaRetag). Así, el procedimiento es automático pero no opaco.
La Tabla @ref(tab:impactoRetagSegmentos) muestra además el efecto directo sobre los mercados que se modelarán. En Casa / Zona Norte, el filtro pasa de 722 a 661 registros únicamente por la corrección espacial. En Apartamento / Zona Sur pasa de 2787 a 2835. Por tanto, el retag sí cambia la muestra de estimación y no debe dejarse como una observación decorativa del mapa.
zonasDestinoPresentes <- intersect(
names(coloresDestinoRetag),
unique(datosVisualRetag$zona[datosVisualRetag$reclasificarZona])
)
gruposCorregidos <- paste0("Corregidos → ", zonasDestinoPresentes)
mapaRetag <- leaflet(datosVisualRetag) |>
addProviderTiles(providers$CartoDB.Positron) |>
addCircleMarkers(
data = datosVisualRetag |> filter(EstadoZona == "Coherente con su zona"),
~longitud, ~latitud,
radius = 2.0,
stroke = FALSE,
fillOpacity = 0.22,
color = "grey70",
group = "Coherentes",
popup = ~paste0(
"<b>ID: ", id, "</b><br>",
"Zona original: ", zonaOriginal, "<br>",
"Zona final: ", zona, "<br>",
"Barrio: ", barrio, "<br>",
"Estado: coherente"
)
) |>
addCircleMarkers(
data = datosVisualRetag |> filter(EstadoZona == "Atípico confirmado en zona original"),
~longitud, ~latitud,
radius = 4.5,
weight = 1,
fillOpacity = 0.80,
color = "black",
group = "Atípicos confirmados",
popup = ~paste0(
"<b>ID: ", id, "</b><br>",
"Zona original: ", zonaOriginal, "<br>",
"Zona sugerida: ", zonaSugerida, "<br>",
"Zona final: ", zona, "<br>",
"Consenso KNN: ", round(consensoZona * 100, 1), "%<br>",
"Motivo: ", MotivoAtipico
)
)
for (zonaDestino in zonasDestinoPresentes) {
datosDestino <- datosVisualRetag |>
dplyr::filter(
reclasificarZona == TRUE,
zona == zonaDestino
)
mapaRetag <- mapaRetag |>
leaflet::addCircleMarkers(
data = datosDestino,
lng = ~longitud,
lat = ~latitud,
radius = 7,
weight = 2,
stroke = TRUE,
opacity = 1,
fillOpacity = 0.90,
color = unname(
coloresDestinoRetag[zonaDestino]
),
fillColor = unname(
coloresDestinoRetag[zonaDestino]
),
# Cada destino constituye una capa independiente
group = paste0(
"Corregidos → ",
zonaDestino
),
# Texto breve al pasar el cursor
label = ~paste0(
"ID ", id,
" | ",
zonaOriginal,
" → ",
zona
),
labelOptions = leaflet::labelOptions(
direction = "auto",
textsize = "12px",
opacity = 0.95
),
# Información detallada al hacer clic
popup = ~paste0(
"<b>ID: ", id, "</b><br>",
"Barrio: ", barrio, "<br>",
"Zona original: ", zonaOriginal, "<br>",
"<b>Zona corregida: ", zona, "</b><br>",
"Consenso KNN: ",
round(consensoZona * 100, 1),
"%<br>",
"Confianza: ", ConfianzaRetag, "<br>",
"Motivo: ", MotivoAtipico
)
)
}
mapaRetag <- mapaRetag |>
addLayersControl(
overlayGroups = c(
gruposCorregidos,
"Atípicos confirmados",
"Coherentes"
),
options = layersControlOptions(
collapsed = FALSE,
autoZIndex = TRUE
)
) |>
hideGroup("Coherentes") |>
hideGroup("Atípicos confirmados") |>
addLegend(
position = "bottomright",
colors = unname(coloresDestinoRetag[zonasDestinoPresentes]),
labels = paste("Corregido →", zonasDestinoPresentes),
opacity = 1,
title = "Zona final del retag"
)
mapaRetag
El mapa interactivo de la Sección @ref(mapaAuditoriaEspacial) debe
leerse junto con los boxplots. Los registros corregidos se separan ahora
en capas independientes por zona de destino —Norte,
Sur, Oriente y Oeste— y cada una mantiene un color propio. El control de
capas permite dejar visibles todos los corregidos, ninguno o una
sola zona específica. Por defecto se ocultan los miles de
puntos coherentes y los atípicos confirmados para que la auditoría se
concentre en las correcciones; ambas capas pueden activarse cuando se
necesite contexto. Al abrir un punto se observan el id,
barrio, zona original, zona corregida, consenso KNN, nivel de confianza
y motivo de detección. Esta combinación hace posible verificar
visualmente que cada retag tenga sentido dentro de la nube geográfica de
destino.
resumenPreparacion <- tibble(
Indicador = c(
"Base original",
"Base tras controles básicos",
"Base preparada final",
"Registros con zona corregida",
"Parqueaderos imputados",
"Casa / Zona Norte final",
"Apartamento / Zona Sur final"
),
Valor = c(
nrow(viviendaOriginal),
nrow(viviendaTrabajo),
nrow(viviendaPreparada),
nrow(auditoriaZonas),
sum(viviendaPreparada$parqueaderosImputado),
nrow(base1),
nrow(base2)
)
)
tablaHtml(resumenPreparacion, "Trazabilidad completa del preprocesamiento", digitos = 0)
| Indicador | Valor |
|---|---|
| Base original | 8322 |
| Base tras controles básicos | 8319 |
| Base preparada final | 8319 |
| Registros con zona corregida | 476 |
| Parqueaderos imputados | 1602 |
| Casa / Zona Norte final | 661 |
| Apartamento / Zona Sur final | 2835 |
La Tabla @ref(tab:resumenPreparacion) cierra la trazabilidad: de 8322 registros originales se conservan 8319 después de los controles esenciales, se corrigen 476 etiquetas de zona y se imputan 1602 valores de parqueaderos. Solo después de estas decisiones se construyen los dos segmentos que alimentan los modelos. Así, las diferencias posteriores entre Norte y Sur corresponden a mercados depurados y no a errores de etiquetado conocidos.
La primera solicitud exige una casa, ubicada en Zona Norte, con 200 m², 4 habitaciones, 1 parqueadero, 2 baños, estrato 4 o 5 y un presupuesto máximo de 350 millones de pesos. Todo el análisis de esta sección utiliza la zona corregida del preprocesamiento anterior.
tibble(
Indicador = c("Tipo", "Zona corregida", "Número de registros"),
Valor = c(
paste(unique(base1$tipo), collapse = ", "),
paste(unique(base1$zona), collapse = ", "),
nrow(base1)
)
) |>
tablaHtml("Comprobación del filtro para Vivienda 1", digitos = 0)
| Indicador | Valor |
|---|---|
| Tipo | Casa |
| Zona corregida | Zona Norte |
| Número de registros | 661 |
base1 |>
select(id, zonaOriginal, zonaCorregida, tipo, barrio, estrato, preciom, areaconst,
parqueaderos, banios, habitaciones, longitud, latitud) |>
head(3) |>
tablaHtml("Primeros tres registros - Casa / Zona Norte después del retag", digitos = 2)
| id | zonaOriginal | zonaCorregida | tipo | barrio | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | Zona Norte | Casa | acopi | 5 | 320 | 150 | 2 | 4 | 6 | -76.51 | 3.48 |
| 1592 | Zona Norte | Zona Norte | Casa | acopi | 5 | 780 | 380 | 2 | 3 | 3 | -76.52 | 3.49 |
| 7824 | Zona Norte | Zona Norte | Casa | acopi | 4 | 600 | 160 | 1 | 4 | 5 | -76.55 | 3.42 |
trazabilidadZonaModelo1 <- tibble(
Indicador = c(
"Campo usado para filtrar el segmento",
"Zona final exigida",
"Registros usados por el modelo",
"Registros que ingresaron a Norte desde otra etiqueta original",
"Casas originalmente Norte que salieron del segmento por retag",
"Verificación de consistencia"
),
Valor = c(
"zonaCorregida",
"Zona Norte",
as.character(nrow(base1)),
as.character(sum(base1$zonaOriginal != "Zona Norte")),
as.character(sum(
viviendaPreparada$tipo == "Casa" &
viviendaPreparada$zonaOriginal == "Zona Norte" &
viviendaPreparada$zonaCorregida != "Zona Norte",
na.rm = TRUE
)),
ifelse(all(base1$zonaCorregida == "Zona Norte"), "100% Zona Norte corregida", "REVISAR")
)
)
tablaHtml(
trazabilidadZonaModelo1,
"Trazabilidad de la zona utilizada para estimar la Vivienda 1",
digitos = 0
)
| Indicador | Valor |
|---|---|
| Campo usado para filtrar el segmento | zonaCorregida |
| Zona final exigida | Zona Norte |
| Registros usados por el modelo | 661 |
| Registros que ingresaron a Norte desde otra etiqueta original | 28 |
| Casas originalmente Norte que salieron del segmento por retag | 89 |
| Verificación de consistencia | 100% Zona Norte corregida |
estratos1 |>
tablaHtml("Composición por estrato del filtro Casa / Zona Norte corregida", digitos = 2)
| estrato | n | Porcentaje |
|---|---|---|
| 3 | 225 | 34.04 |
| 4 | 141 | 21.33 |
| 5 | 250 | 37.82 |
| 6 | 45 | 6.81 |
Las Tablas @ref(tab:comprobacionBase1), @ref(tab:primerosBase1) y
@ref(tab:trazabilidadZonaModelo1) comprueban el punto 1 de la
actividad con trazabilidad completa. base1 no se
construye desde la etiqueta original: se filtra explícitamente con
zonaCorregida == "Zona Norte" sobre
viviendaPreparada, que ya pasó por el retag y por la
imputación posterior. Por eso el conjunto de modelación contiene
661 casas cuya zona final es Norte. Además, 28
registros ingresan al segmento porque originalmente tenían otra
etiqueta pero fueron corregidos hacia Norte, mientras que 89
casas que inicialmente aparecían como Norte quedan fuera
después del retag. Esto confirma que la corrección espacial sí
altera la muestra que alimenta la regresión, no solamente la
visualización del mapa.
La Tabla @ref(tab:composicionEstratoFiltro1) complementa la
comprobación del filtro mostrando su composición por estrato. Una vez
construido base1, zonaCorregida es constante y
por ello no puede explicar variaciones internas de precio; su función
estadística se cumplió al definir correctamente el submercado antes de
estimar el modelo.
leaflet(base1) |>
addProviderTiles(providers$CartoDB.Positron) |>
addCircleMarkers(
~longitud, ~latitud,
radius = 4,
stroke = FALSE,
fillOpacity = 0.65,
popup = ~paste0(
"<b>ID: ", id, " - ", barrio, "</b><br>",
"Estrato: ", estrato, "<br>",
"Precio: $", preciom, " M<br>",
"Área: ", areaconst, " m²<br>",
"Zona usada: ", zona
)
)
El mapa de la Sección @ref(mapaBase1Seccion) debe compararse con el mapa de auditoría espacial de la Sección @ref(mapaAuditoriaEspacial). Aquí ya no aparecen como Norte los registros que el procedimiento espacial reasignó a otra zona. Por tanto, cualquier punto extremo que permanezca en este mapa fue conservado porque su vecindad geográfica confirmó Zona Norte, no porque el problema de etiquetado haya sido ignorado.
El análisis exploratorio se realiza antes de estimar el modelo y separa tres preguntas: cómo se distribuye cada variable, cómo se relaciona cada predictor con el precio y si existen valores extremos que deban investigarse. No se eliminan observaciones únicamente por ser grandes o pequeñas; primero se determina si son errores o propiedades plausibles del mercado.
resumenNumerico1 |>
tablaHtml("Resumen descriptivo de variables cuantitativas - Vivienda 1", digitos = 2)
| Variable | N | Minimo | Q1 | Mediana | Q3 | Maximo |
|---|---|---|---|---|---|---|
| preciom | 661 | 89 | 250 | 380 | 550 | 1940 |
| areaconst | 661 | 30 | 140 | 240 | 339 | 1500 |
| habitaciones | 661 | 0 | 3 | 4 | 5 | 10 |
| parqueaderos | 661 | 1 | 2 | 2 | 2 | 10 |
| banios | 661 | 0 | 2 | 3 | 4 | 10 |
ggplot(estratos1, aes(x = estrato, y = Porcentaje)) +
geom_col() +
geom_text(aes(label = paste0(round(Porcentaje, 1), "%")), vjust = -0.35, size = 3.5) +
labs(
title = "Distribución por estrato - Casa / Zona Norte corregida",
x = "Estrato",
y = "Porcentaje de inmuebles"
) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.10))) +
theme_minimal(base_size = 12)
Distribución porcentual del estrato en casas de Zona Norte corregida
datosContinuos1 <- base1 |>
dplyr::select(preciom, areaconst) |>
tidyr::pivot_longer(
cols = dplyr::everything(),
names_to = "Variable",
values_to = "Valor"
) |>
dplyr::mutate(
Variable = dplyr::case_when(
Variable == "preciom" ~ "Precio (millones)",
Variable == "areaconst" ~ "Área construida (m²)",
TRUE ~ Variable
)
)
ggplot2::ggplot(datosContinuos1, ggplot2::aes(x = Valor)) +
ggplot2::geom_histogram(bins = 30, boundary = 0) +
ggplot2::facet_wrap(~Variable, scales = "free", ncol = 2) +
ggplot2::labs(
title = "Distribuciones marginales - Vivienda 1",
x = NULL,
y = "Frecuencia"
) +
ggplot2::theme_minimal(base_size = 11)
Distribuciones de precio y área construida en casas de Zona Norte corregida
datosConteos1 <- base1 |>
dplyr::select(habitaciones, parqueaderos, banios) |>
tidyr::pivot_longer(
cols = dplyr::everything(),
names_to = "Variable",
values_to = "Nivel"
) |>
dplyr::count(Variable, Nivel, name = "Frecuencia") |>
dplyr::mutate(
Variable = dplyr::case_when(
Variable == "habitaciones" ~ "Habitaciones",
Variable == "parqueaderos" ~ "Parqueaderos",
Variable == "banios" ~ "Baños",
TRUE ~ Variable
)
)
ggplot2::ggplot(
datosConteos1,
ggplot2::aes(x = factor(Nivel), y = Frecuencia)
) +
ggplot2::geom_col() +
ggplot2::facet_wrap(
~Variable,
scales = "free_x"
) +
ggplot2::labs(
title = "Distribuciones de predictores discretos - Vivienda 1",
x = "Número",
y = "Frecuencia"
) +
ggplot2::theme_minimal(base_size = 11)
Frecuencias de habitaciones, parqueaderos y baños en casas de Zona Norte corregida
La Tabla @ref(tab:descriptivosBase1) muestra que el precio presenta una mediana de 380,0 millones y un rango amplio que llega hasta 1.940 millones. El área construida también tiene una cola extensa: la mediana es 240,0 m², pero existen propiedades de hasta 1.500 m². Estas diferencias anticipan la presencia de viviendas de alto valor que pueden afectar la dispersión de los residuos, pero no constituyen por sí mismas un error de calidad.
Las Figuras @ref(fig:distribucionContinuasBase1) y @ref(fig:distribucionConteosBase1) permiten ver esa estructura directamente. En precio y área aparece una cola derecha marcada: el máximo del precio equivale a aproximadamente 5,1 veces la mediana, y el máximo del área a 6,2 veces la mediana. En los predictores discretos, los valores modales son 4 habitaciones, 2 parqueaderos y 3 baños. Esto ayuda a distinguir el perfil típico del segmento de las viviendas poco frecuentes que luego pueden influir en el ajuste.
Para estrato no se calculan media ni desviación
estándar. La Tabla @ref(tab:composicionEstratoFiltro1) y la Figura
@ref(fig:distribucionEstratoBase1) muestran frecuencias y porcentajes:
el nivel más frecuente es estrato 5, con
37,82% de las casas. Esta composición debe tenerse
presente al interpretar los coeficientes de los niveles menos
representados.
atipicosIqr1 |>
tablaHtml("Valores extremos continuos por IQR - Vivienda 1", digitos = 2)
| Variable | LimiteInferior | LimiteSuperior | AtipicosIQR | PorcentajeAtipicos |
|---|---|---|---|---|
| preciom | -200.0 | 1000.0 | 24 | 3.63 |
| areaconst | -158.5 | 637.5 | 23 | 3.48 |
La Tabla @ref(tab:atipicosIqrBase1) aplica IQR únicamente a
precio y área, donde el criterio tiene una
interpretación razonable como detector exploratorio de extremos. Se
identifican 24 precios y 23 áreas fuera de los límites, pero no se
eliminan automáticamente porque pueden corresponder a viviendas reales
de alta gama. Para habitaciones, parqueaderos
y banios no se fuerza el IQR: son conteos discretos y,
cuando Q1 y Q3 coinciden, el IQR puede ser cero y etiquetar
artificialmente como “atípico” cualquier valor distinto del centro. Esos
predictores se estudian mediante frecuencias, boxplots y diagnóstico
posterior del modelo. La única corrección automática de outliers
corresponde a la etiqueta de zona, porque allí sí
existe evidencia de clasificación geográfica inconsistente.
casosIqr1 |>
tablaHtml("Casos extremos por IQR para inspección - Vivienda 1 (máximo 20)", digitos = 2)
| id | barrio | estrato | preciom | areaconst | habitaciones | parqueaderos | banios | TipoExtremoIQR |
|---|---|---|---|---|---|---|---|---|
| 4564 | san vicente | 5 | 1940 | 734 | 10 | 3 | 8 | Precio y área |
| 315 | pance | 6 | 1650 | 1500 | 3 | 4 | 5 | Precio y área |
| 3858 | san vicente | 4 | 1650 | 734 | 10 | 2 | 5 | Precio y área |
| 4056 | versalles | 5 | 1600 | 942 | 10 | 4 | 4 | Precio y área |
| 673 | seminario | 6 | 1600 | 825 | 8 | 8 | 6 | Precio y área |
| 5710 | san vicente | 5 | 1530 | 776 | 10 | 6 | 6 | Precio y área |
| 7226 | occidente | 6 | 1300 | 806 | 5 | 2 | 4 | Precio y área |
| 4274 | santa monica | 5 | 1270 | 950 | 10 | 4 | 5 | Precio y área |
| 7245 | acopi | 4 | 1200 | 752 | 0 | 2 | 0 | Precio y área |
| 4335 | versalles | 5 | 1200 | 730 | 6 | 4 | 6 | Precio y área |
| 3259 | juanamb√∫ | 5 | 1050 | 850 | 5 | 2 | 5 | Precio y área |
| 4793 | granada | 4 | 1800 | 607 | 8 | 2 | 4 | Precio |
| 1653 | cristales | 6 | 1590 | 530 | 4 | 6 | 5 | Precio |
| 1296 | pance | 6 | 1500 | 596 | 5 | 5 | 6 | Precio |
| 5263 | santa monica | 6 | 1500 | 470 | 5 | 3 | 6 | Precio |
| 3449 | menga | 5 | 1500 | 400 | 4 | 2 | 3 | Precio |
| 4542 | vipasa | 5 | 1400 | 265 | 10 | 2 | 10 | Precio |
| 4559 | santa mónica residencial | 6 | 1300 | 552 | 9 | 7 | 9 | Precio |
| 489 | santa teresita | 6 | 1250 | 628 | 5 | 2 | 6 | Precio |
| 3284 | menga | 6 | 1250 | 330 | 4 | 6 | 5 | Precio |
La Tabla @ref(tab:casosIqrBase1) hace trazable qué inmuebles producen
esas colas. Se muestran hasta 20 casos para no recargar el informe;
todos permanecen en base1 y continúan disponibles para
estimar el modelo. El IQR responde aquí a una pregunta univariada: si
precio o área están lejos del centro de su distribución y no decide si
una observación es un outlier de regresión. Esa segunda pregunta se
resuelve después del ajuste mediante residuales studentizados, leverage
e indicadores de influencia.
Con la versión interactiva Plotly, puede consultarse ID, barrio, estrato y características de cada inmueble.
# graficaArea1 <- ggplot(
# base1,
# aes(
# x = areaconst,
# y = preciom,
# color = estrato,
# text = paste0(
# "ID: ", id,
# "<br>Barrio: ", barrio,
# "<br>Estrato: ", estrato,
# "<br>Precio: $", preciom, " M",
# "<br>Área: ", areaconst, " m²",
# "<br>Baños: ", banios,
# "<br>Habitaciones: ", habitaciones,
# "<br>Parqueaderos: ", parqueaderos
# )
# )
# ) +
# geom_point(alpha = 0.55) +
# geom_smooth(method = "lm", se = FALSE) +
# labs(
# title = "Precio frente a área construida - Vivienda 1",
# x = "Área construida (m²)",
# y = "Precio (millones)",
# color = "Estrato"
# ) +
# theme_minimal(base_size = 12)
#
# print(graficaArea1)
graficaAreaInteractiva1 <- plotly::plot_ly(
data = base1,
x = ~areaconst,
y = ~preciom,
color = ~estrato,
type = "scatter",
mode = "markers",
text = ~paste0(
"ID: ", id,
"<br>Barrio: ", barrio,
"<br>Estrato: ", estrato,
"<br>Precio: $", preciom, " M",
"<br>Área: ", areaconst, " m²",
"<br>Baños: ", banios,
"<br>Habitaciones: ", habitaciones,
"<br>Parqueaderos: ", parqueaderos
),
hoverinfo = "text",
marker = list(
opacity = 0.55,
size = 7
)
) |>
plotly::layout(
title = "Precio frente a área construida - Vivienda 1",
xaxis = list(
title = "Área construida (m²)"
),
yaxis = list(
title = "Precio (millones)"
),
legend = list(
title = list(text = "Estrato")
)
) |>
plotly::partial_bundle()
graficaAreaInteractiva1
Se observa una tendencia ascendente clara: las casas de mayor área tienden a registrar mayor precio. La Tabla @ref(tab:asociacionesBase1) cuantifica esta relación: para área construida, Pearson es 0,741 y Spearman 0,829. El valor mayor de Spearman indica que la asociación monotónica es incluso más fuerte que la relación estrictamente lineal y sugiere revisar posibles curvaturas o influencia de propiedades extremas al validar el modelo.
datosLargos1 <- base1 |>
select(preciom, estrato, habitaciones, parqueaderos, banios) |>
mutate(across(c(estrato, habitaciones, parqueaderos, banios), as.character)) |>
pivot_longer(
cols = c(estrato, habitaciones, parqueaderos, banios),
names_to = "Variable",
values_to = "Nivel"
)
# graficaCategorias1 <- ggplot(
# datosLargos1,
# aes(x = factor(Nivel), y = preciom)
# ) +
# geom_boxplot(outlier.alpha = 0.25) +
# facet_wrap(~Variable, scales = "free_x") +
# labs(
# title = "Distribución del precio según predictores discretos/ordinales - Vivienda 1",
# x = "Nivel",
# y = "Precio (millones)"
# ) +
# theme_minimal(base_size = 11)
#
# print(graficaCategorias1)
graficaCategoriasInteractiva1 <- crearBoxplotsInteractivos(
datosLargos1,
"Precio según estrato, habitaciones, parqueaderos y baños - Vivienda 1"
)
graficaCategoriasInteractiva1
precioPorEstrato1 <- base1 |>
group_by(estrato) |>
summarise(
N = n(),
Q1Precio = quantile(preciom, 0.25, na.rm = TRUE),
MedianaPrecio = median(preciom, na.rm = TRUE),
Q3Precio = quantile(preciom, 0.75, na.rm = TRUE),
.groups = "drop"
)
tablaHtml(
precioPorEstrato1,
"Distribución del precio dentro de cada estrato - Vivienda 1",
digitos = 1
)
| estrato | N | Q1Precio | MedianaPrecio | Q3Precio |
|---|---|---|---|---|
| 3 | 225 | 160 | 215 | 300 |
| 4 | 141 | 310 | 380 | 525 |
| 5 | 250 | 380 | 480 | 600 |
| 6 | 45 | 600 | 850 | 950 |
La Figura interactiva y la Tabla @ref(tab:precioPorEstrato1) permiten
interpretar el factor sin calcular una media del estrato.
Lo que se compara es la distribución del precio dentro de cada
categoría. La mediana del precio es 215,0
millones en el estrato de referencia 3 y 850,0
millones en el estrato 6. Las cajas de habitaciones,
parqueaderos y baños presentan mayor solapamiento que las de estrato;
por eso una diferencia marginal visible no debe confundirse con efecto
parcial. Esa distinción se comprueba después en la regresión
múltiple.
matrizCorrelacion1 <- base1 |>
select(preciom, areaconst, habitaciones, parqueaderos, banios) |>
cor(use = "complete.obs", method = "pearson")
nombresCorrelacion <- c(
preciom = "Precio",
areaconst = "Área",
habitaciones = "Habitaciones",
parqueaderos = "Parqueaderos",
banios = "Baños"
)
colnames(matrizCorrelacion1) <- nombresCorrelacion[colnames(matrizCorrelacion1)]
rownames(matrizCorrelacion1) <- nombresCorrelacion[rownames(matrizCorrelacion1)]
tablaCorrelacion1 <- as.data.frame(matrizCorrelacion1) |>
tibble::rownames_to_column("Variable")
tablaHtml(
tablaCorrelacion1,
"Matriz de correlación de Pearson entre variables cuantitativas - Vivienda 1",
digitos = 3
)
| Variable | Precio | Área | Habitaciones | Parqueaderos | Baños |
|---|---|---|---|---|---|
| Precio | 1.000 | 0.741 | 0.363 | 0.382 | 0.538 |
| Área | 0.741 | 1.000 | 0.405 | 0.297 | 0.481 |
| Habitaciones | 0.363 | 0.405 | 1.000 | 0.207 | 0.626 |
| Parqueaderos | 0.382 | 0.297 | 0.207 | 1.000 | 0.317 |
| Baños | 0.538 | 0.481 | 0.626 | 0.317 | 1.000 |
corrplot::corrplot(
matrizCorrelacion1,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 35,
number.cex = 0.8
)
Correlaciones de Pearson entre precio y predictores cuantitativos en la Vivienda 1
La Tabla @ref(tab:matrizCorrelacionBase1) y la Figura @ref(fig:corrplotBase1) muestran toda la estructura lineal entre las variables cuantitativas. La correlación lineal de mayor magnitud entre predictores es 0,626. Este valor sirve como alerta exploratoria, pero la decisión sobre multicolinealidad se reserva para VIF/GVIF en el modelo, porque una matriz de correlación no detecta por sí sola dependencias conjuntas entre varios predictores.
El estrato no se introduce en esta matriz de Pearson
porque es ordinal categórico. Su asociación con el precio se cuantifica
mediante Spearman en la tabla siguiente, que respeta el orden de sus
categorías sin tratar sus códigos como distancias métricas.
asociaciones1 |>
tablaHtml("Asociación bivariada con el precio - Vivienda 1", digitos = 3)
| Variable | Pearson | Spearman |
|---|---|---|
| Área construida | 0.741 | 0.829 |
| Habitaciones | 0.363 | 0.445 |
| Parqueaderos | 0.382 | 0.309 |
| Baños | 0.538 | 0.634 |
| Estrato (ordinal) |
|
0.693 |
La Tabla @ref(tab:asociacionesBase1) confirma que la asociación
ordinal entre estrato y precio es Spearman =
0,693. Entre los predictores cuantitativos, la asociación de
mayor magnitud según Spearman corresponde a Área
construida. Estas asociaciones son descriptivas: no representan
efectos parciales. El modelo múltiple responderá una pregunta más
exigente: cuánto aporta cada predictor manteniendo constantes
los demás.
La línea base reproduce la especificación solicitada:
\[ Precio_i = \beta_0 + \beta_1 Area_i + \boldsymbol{\beta}_{Estrato} + \beta_2 Habitaciones_i + \beta_3 Parqueaderos_i + \beta_4 Baños_i + \varepsilon_i. \]
codificacionEstrato1 |>
tablaHtml("Codificación dummy del factor estrato - Vivienda 1", digitos = 0)
| Estrato | 4 | 5 | 6 |
|---|---|---|---|
| 3 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 |
| 5 | 0 | 1 | 0 |
| 6 | 0 | 0 | 1 |
La Tabla @ref(tab:codificacionEstratoBase1) hace explícita la parametrización que R utiliza en el modelo. El estrato 3 es la categoría de referencia y queda representado por ceros en todas las variables indicadoras. Para 4 niveles se estiman 3 dummies, evitando multicolinealidad perfecta con el intercepto. Así, cada coeficiente de estrato se interpreta como una diferencia frente al nivel de referencia y no como el efecto de “subir una unidad” en una escala cuantitativa.
coeficientes1 |>
tablaHtml("Coeficientes e interpretación contextual - modelo completo Vivienda 1", digitos = 4)
| Variable | Coeficiente | ErrorEstandar | EstadisticoT | ValorP | IC95Inferior | IC95Superior | Significativo5pct | Interpretacion |
|---|---|---|---|---|---|---|---|---|
| (Intercept) | -8.7719 | 19.4432 | -0.4512 | 0.6520 | -46.9506 | 29.4068 | FALSE | Intercepto del modelo. Solo tiene interpretación sustantiva si el perfil de referencia y los valores cero de los predictores son plausibles. |
| areaconst | 0.7900 | 0.0439 | 17.9983 | 0.0000 | 0.7038 | 0.8762 | TRUE | Por cada m² adicional de área construida, manteniendo constantes las demás variables, el precio esperado cambia 0.79 millones de pesos. |
| estrato4 | 81.5757 | 17.9674 | 4.5402 | 0.0000 | 46.2949 | 116.8565 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 81.576 millones de pesos. |
| estrato5 | 122.8947 | 16.5497 | 7.4258 | 0.0000 | 90.3976 | 155.3918 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 122.895 millones de pesos. |
| estrato6 | 328.4494 | 29.2225 | 11.2396 | 0.0000 | 271.0679 | 385.8308 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 328.449 millones de pesos. |
| habitaciones | 3.8843 | 4.5174 | 0.8599 | 0.3902 | -4.9861 | 12.7547 | FALSE | Por cada habitación adicional, manteniendo constantes las demás variables, el precio esperado cambia 3.884 millones de pesos. |
| parqueaderos | 27.2486 | 5.6167 | 4.8514 | 0.0000 | 16.2197 | 38.2776 | TRUE | Por cada parqueadero adicional, manteniendo constantes las demás variables, el precio esperado cambia 27.249 millones de pesos. |
| banios | 21.6665 | 5.9465 | 3.6436 | 0.0003 | 9.9900 | 33.3430 | TRUE | Por cada baño adicional, manteniendo constantes las demás variables, el precio esperado cambia 21.666 millones de pesos. |
broom::glance(modelo1Completo) |>
select(r.squared, adj.r.squared, sigma, statistic, p.value, AIC, BIC) |>
rename(
R2 = r.squared,
R2Ajustado = adj.r.squared,
ErrorResidual = sigma,
EstadisticoF = statistic,
ValorPGlobal = p.value
) |>
tablaHtml("Bondad de ajuste - modelo completo Vivienda 1", digitos = 4)
| R2 | R2Ajustado | ErrorResidual | EstadisticoF | ValorPGlobal | AIC | BIC |
|---|---|---|---|---|---|---|
| 0.6766 | 0.6731 | 156.6793 | 195.1756 | 0 | 8567.442 | 8607.885 |
La Tabla @ref(tab:ajusteBase1) indica que el modelo completo explica 67,66% de la variabilidad observada del precio; el \(R^2\) ajustado es 0,673. El contraste F global tiene un valor p < 0,001, por lo que el conjunto de predictores aporta información estadísticamente significativa frente a un modelo con solo intercepto.
En la Tabla @ref(tab:coeficientesBase1), el área construida tiene un
coeficiente de 0,790 millones por m², manteniendo
constantes estrato, habitaciones, parqueaderos y baños.
parqueaderos aporta 27,249 millones por
espacio adicional y banios 21,666 millones
por baño adicional, siempre como efectos parciales. El efecto de
parqueaderos debe leerse junto con la Tabla
@ref(tab:tablaImputacionParqueaderos), porque en Casa / Zona Norte
35,25% de esa variable requirió imputación; su signo y
significancia son informativos, pero la precisión de la magnitud depende
de la calidad del registro original. Para habitaciones, el
valor p es 0,390: no existe evidencia suficiente de un
aporte parcial después de controlar área, estrato, parqueaderos y
baños.
contribuciones1 |>
tablaHtml("Contribución única de los predictores - Vivienda 1", digitos = 4)
| Variable | SumaCuadrados | GradosLibertad | EstadisticoF | ValorP | DeltaR2 | DeltaR2Pct | R2Parcial | Significativo5pct |
|---|---|---|---|---|---|---|---|---|
| areaconst | 7952156.24 | 1 | 323.9379 | 0.0000 | 0.1604 | 16.0426 | 0.3316 | TRUE |
| estrato | 3269639.67 | 3 | 44.3972 | 0.0000 | 0.0660 | 6.5962 | 0.1694 | TRUE |
| habitaciones | 18149.76 | 1 | 0.7393 | 0.3902 | 0.0004 | 0.0366 | 0.0011 | FALSE |
| parqueaderos | 577767.78 | 1 | 23.5359 | 0.0000 | 0.0117 | 1.1656 | 0.0348 | TRUE |
| banios | 325898.05 | 1 | 13.2757 | 0.0003 | 0.0066 | 0.6575 | 0.0199 | TRUE |
La Tabla @ref(tab:contribucionesBase1) responde directamente al
comentario sobre contribuciones de variables en
factores. Para estrato no basta con leer
estrato4, estrato5 o estrato6 por
separado: la prueba F tipo II evalúa las dummies
conjuntamente. El factor estrato presenta \(F=\) 44,40, valor p
< 0,001 y \(R^2\)
parcial 0,169.
La contribución única también puede leerse como la pérdida de ajuste
al retirar cada término. En Vivienda 1, eliminar área
construida reduce el \(R^2\)
en 16,04 puntos porcentuales; retirar el factor
estrato completo, en 6,60;
parqueaderos, en 1,17;
banios, en 0,66; y
habitaciones, en apenas 0,04. Por tanto,
el área es el componente con mayor aporte único, el estrato es el
segundo bloque explicativo y habitaciones añade muy poca explicación
después de controlar los demás términos. Esto es coherente con la
reducción AIC posterior.
ajuste1$comparacion |>
tablaHtml("Comparación del modelo completo y la alternativa reducida - Vivienda 1", digitos = 4)
| Modelo | Formula | R2 | R2Ajustado | AIC | BIC | CVRMSE | CVR2 |
|---|---|---|---|---|---|---|---|
| Completo | preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios | 0.6766 | 0.6731 | 8567.442 | 8607.885 | 157.3901 | 0.6331 |
| ReducidoAIC | preciom ~ areaconst + estrato + parqueaderos + banios | 0.6762 | 0.6733 | 8566.190 | 8602.140 | 156.3602 | 0.6384 |
La Tabla @ref(tab:comparacionModelos1) conserva el modelo completo como línea base y lo compara con una única reducción backward por AIC. El modelo seleccionado para predicción es ReducidoAIC. Su RMSE de validación cruzada es 156,36 millones, frente a 157,39 millones para el completo. La selección no se decide por significancia aislada: se exige que la simplificación reduzca AIC y no deteriore de forma material la capacidad predictiva fuera de muestra.
par(mfrow = c(2, 2))
plot(modelo1Final)
Diagnósticos gráficos del modelo final - Vivienda 1
par(mfrow = c(1, 1))
El IQR anterior permitió detectar valores marginalmente extremos, pero en regresión la evaluación relevante depende de qué tan inesperado es el precio dadas simultáneamente las demás características y de cuánto puede cambiar el ajuste por una observación. Por eso se aplican los diagnósticos del material del curso sobre el modelo final, sin eliminar registros.
resumenInfluencia1 |>
tablaHtml("Diagnóstico formal de observaciones atípicas e influencia - Vivienda 1", digitos = 4)
| Diagnostico | Criterio | Casos | Porcentaje |
|---|---|---|---|
| Residual studentizado | |r_i| > 3 | 16 | 2.4206 |
| Leverage | h_ii > 2p/n = 0.0212 | 75 | 11.3464 |
| Distancia de Cook | D_i > 1 | 0 | 0.0000 |
| DFFITS | |DFFITS| > 2√(p/n) = 0.2058 | 43 | 6.5053 |
| DFBETAS | máx.|DFBETAS| > 2/√n = 0.0778 | 91 | 13.7670 |
| Al menos una alerta | Cumple uno o más criterios | 113 | 17.0953 |
ggplot2::ggplot(
diagnosticoObs1$datos,
ggplot2::aes(
x = Leverage,
y = ResidualStudentizado,
size = Cook,
shape = EstadoDiagnostico
)
) +
ggplot2::geom_point(alpha = 0.55) +
ggplot2::geom_hline(yintercept = c(-3, 3), linetype = "dashed") +
ggplot2::geom_vline(xintercept = diagnosticoObs1$umbralLeverage, linetype = "dashed") +
ggplot2::scale_size_continuous(range = c(1.5, 6)) +
ggplot2::labs(
title = "Outliers e influencia en el modelo final - Vivienda 1",
subtitle = "Líneas: |residual studentizado| = 3 y leverage = 2p/n",
x = "Leverage",
y = "Residual studentizado",
size = "Cook",
shape = "Estado"
) +
ggplot2::theme_minimal(base_size = 11)
Residuales studentizados, leverage y distancia de Cook - Vivienda 1
casosInfluencia1 |>
tablaHtml("Observaciones con alertas diagnósticas - Vivienda 1 (máximo 20)", digitos = 4)
| id | barrio | estrato | preciom | areaconst | ResidualStudentizado | Leverage | Cook | DFFITS | MaxAbsDFBETAS | NumeroAlertas | ExtremoPrecioIQR | ExtremoAreaIQR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 534 | villa del prado | 3 | 370 | 1440 | -6.3413 | 0.1210 | 0.7459 | -2.3525 | 2.2810 | 4 | FALSE | TRUE |
| 4542 | vipasa | 5 | 1400 | 265 | 5.1162 | 0.0424 | 0.1593 | 1.0763 | 1.0205 | 4 | TRUE | FALSE |
| 4349 | el bosque | 5 | 650 | 1188 | -4.4811 | 0.0520 | 0.1529 | -1.0494 | 0.9488 | 4 | FALSE | TRUE |
| 4564 | san vicente | 5 | 1940 | 734 | 6.3607 | 0.0219 | 0.1223 | 0.9526 | 0.5485 | 4 | TRUE | TRUE |
| 3858 | san vicente | 4 | 1650 | 734 | 5.3312 | 0.0221 | 0.0881 | 0.8015 | 0.6289 | 4 | TRUE | TRUE |
| 7245 | acopi | 4 | 1200 | 752 | 3.0813 | 0.0485 | 0.0682 | 0.6954 | 0.5421 | 4 | TRUE | TRUE |
| 1653 | cristales | 6 | 1590 | 530 | 3.6647 | 0.0348 | 0.0678 | 0.6955 | 0.4084 | 4 | TRUE | FALSE |
| 4056 | versalles | 5 | 1600 | 942 | 3.4163 | 0.0329 | 0.0558 | 0.6300 | 0.5530 | 4 | TRUE | TRUE |
| 5263 | santa monica | 6 | 1500 | 470 | 3.7432 | 0.0233 | 0.0469 | 0.5783 | 0.4267 | 4 | TRUE | FALSE |
| 5710 | san vicente | 5 | 1530 | 776 | 3.1345 | 0.0280 | 0.0398 | 0.5315 | 0.3278 | 4 | TRUE | TRUE |
| 181 | pance | 6 | 1250 | 300 | 3.3312 | 0.0244 | 0.0390 | 0.5265 | 0.4497 | 4 | TRUE | FALSE |
| 4707 | granada | 4 | 900 | 300 | 3.4409 | 0.0214 | 0.0363 | 0.5084 | 0.4138 | 4 | FALSE | FALSE |
| 4793 | granada | 4 | 1800 | 607 | 7.2522 | 0.0156 | 0.1107 | 0.9142 | 0.6731 | 3 | TRUE | FALSE |
| 1065 | manzanares | 3 | 350 | 350 | -1.6779 | 0.0926 | 0.0409 | -0.5360 | 0.5122 | 3 | FALSE | FALSE |
| 6143 | salomia | 3 | 1100 | 500 | 2.9360 | 0.0293 | 0.0368 | 0.5102 | 0.3977 | 3 | TRUE | FALSE |
| 3284 | menga | 6 | 1250 | 330 | 2.4716 | 0.0369 | 0.0332 | 0.4838 | 0.3032 | 3 | TRUE | FALSE |
| 1296 | pance | 6 | 1500 | 596 | 2.7246 | 0.0285 | 0.0308 | 0.4665 | 0.2721 | 3 | TRUE | FALSE |
| 3449 | menga | 5 | 1500 | 400 | 6.1463 | 0.0057 | 0.0293 | 0.4658 | 0.2461 | 3 | TRUE | FALSE |
| 4975 | zona norte | 6 | 680 | 452 | -1.8147 | 0.0555 | 0.0276 | -0.4400 | 0.3184 | 3 | FALSE | FALSE |
| 5444 | juanamb√∫ | 6 | 850 | 736 | -2.3785 | 0.0325 | 0.0270 | -0.4361 | 0.1914 | 3 | FALSE | TRUE |
Según la Tabla @ref(tab:resumenInfluenciaBase1), 16 de 661 observaciones (2,42%) presentan \(|r_i|>3\) y, por tanto, se consideran atípicas respecto de la respuesta condicionada por el modelo. 75 (11,35%) superan el umbral de leverage \(2p/n\), lo que indica combinaciones poco frecuentes de predictores, no errores de registro. Asimismo, 43 casos superan el criterio de DFFITS y 91 el de DFBETAS. Estas medidas evalúan sensibilidad local del ajuste y de los coeficientes, por lo que no deben confundirse con el número de outliers.
Un resultado especialmente importante es que 0 observaciones presentan Cook > 1. Por tanto, bajo este criterio no se identifica una vivienda individual con influencia global extrema sobre el modelo. Aun así, el caso que concentra la señal diagnóstica más fuerte es el ID 534, barrio Villa Del Prado, con precio de 370 millones y área de 1.440 m². Presenta residual studentizado -6,34, leverage 0,121, Cook 0,746, DFFITS -2,353 y máximo DFBETAS 2,281. El IQR lo había señalado por área, pero no por precio; esto ilustra que un valor marginalmente extremo y una observación influyente son conceptos distintos.
En total, 113 observaciones (17,10%) activan al menos uno de los criterios. Ninguna se elimina: las alertas justifican inspección y, cuando corresponda, verificación en la fuente original, pero no constituyen evidencia suficiente de error. La muestra completa se conserva para representar el mercado observado y evitar una depuración dirigida a mejorar artificialmente los supuestos del MCO.
supuestos1 |>
tablaHtml("Validación de supuestos - Vivienda 1", digitos = 4)
| Supuesto | Prueba | Estadistico | ValorP | Decision | Criterio |
|---|---|---|---|---|---|
| Normalidad de residuales | Shapiro-Wilk | 0.8145 | 0 | Se rechaza normalidad | p > 0.05 |
| Varianza constante | Goldfeld-Quandt | 11.3393 | 0 | Se rechaza homocedasticidad | p > 0.05 |
| Independencia / autocorrelación secuencial | Durbin-Watson | 1.7022 | 0 | Evidencia secuencial según el orden usado; interpretar con cautela | p > 0.05, con cautela en datos transversales |
| Multicolinealidad | VIF/GVIF ajustado | 1.4877 |
|
Sin alerta relevante | VIF equivalente < 5 |
vif1 |>
tablaHtml("VIF/GVIF ajustado - Vivienda 1", digitos = 3)
| Variable | GVIF | GradosLibertad | GVIFAjustado | VIFEquivalente | ToleranciaAproximada |
|---|---|---|---|---|---|
| areaconst | 1.488 | 1 | 1.220 | 1.488 | 0.672 |
| estrato | 1.380 | 3 | 1.055 | 1.113 | 0.898 |
| parqueaderos | 1.155 | 1 | 1.075 | 1.155 | 0.866 |
| banios | 1.455 | 1 | 1.206 | 1.455 | 0.687 |
La Figura @ref(fig:diagnosticosGraficos1) muestra que los problemas principales no están en la multicolinealidad, sino en la distribución y varianza de los errores. En Residuals vs Fitted y especialmente en Scale-Location la dispersión aumenta a medida que crecen los valores ajustados; esto coincide con Goldfeld-Quandt, cuyo valor p es < 0,001, por lo que se rechaza la homocedasticidad. En el Q-Q plot las colas se apartan de la recta teórica; Shapiro-Wilk también rechaza normalidad con valor p < 0,001. Los puntos etiquetados en los paneles de leverage y residuos son candidatos a revisión. Su condición se cuantifica en la Tabla @ref(tab:resumenInfluenciaBase1) mediante residuales studentizados, leverage, Cook, DFFITS y DFBETAS; no se eliminan automáticamente.
La Tabla @ref(tab:vifBase1) muestra un VIF equivalente máximo de 1,49, claramente inferior al umbral de 5. Por tanto, no existe evidencia de multicolinealidad problemática después de codificar el estrato con \(K-1\) dummies. Durbin-Watson se reporta porque forma parte del procedimiento del curso; sin embargo, con datos transversales el orden de las filas es arbitrario, por lo que un valor p pequeño no debe presentarse como evidencia concluyente de dependencia temporal. Si se quisiera estudiar dependencia entre viviendas cercanas, correspondería un diagnóstico espacial.
La actividad no exige corregir los incumplimientos. Las sugerencias técnicamente coherentes serían transformar precio/área, considerar términos no lineales o interacciones, segmentar con mayor detalle o explorar modelos espaciales. Para esta entrega, lo importante es reconocer los problemas y no interpretar el modelo como si todos los supuestos se cumplieran.
prediccion1 |>
mutate(
Presupuesto = 350,
CumplePrecioEsperado = PrecioEstimado <= Presupuesto
) |>
tablaHtml("Predicción de precio para la Vivienda 1", digitos = 2)
| Estrato | PrecioEstimado | ICMediaInferior | ICMediaSuperior | IPIndividualInferior | IPIndividualSuperior | Presupuesto | CumplePrecioEsperado |
|---|---|---|---|---|---|---|---|
| 4 | 313.25 | 282.08 | 344.42 | 4.08 | 622.42 | 350 | TRUE |
| 5 | 354.21 | 326.51 | 381.90 | 45.37 | 663.05 | 350 | FALSE |
Para estrato 4, la Tabla @ref(tab:prediccionBase1) estima 313,25 millones; la predicción puntual queda dentro del presupuesto de 350 millones. Para estrato 5, la estimación es 354,21 millones y queda por encima del presupuesto.
Importante: el modelo final de Vivienda 1 no utiliza la variable habitaciones porque la reducción AIC la excluyó y la validación cruzada no se deterioró. Por tanto, las cuatro habitaciones siguen siendo un requisito para filtrar y priorizar ofertas reales, pero no modifican la predicción puntual del modelo final.
La diferencia entre el intervalo de confianza y el intervalo de predicción es clave. El primero cuantifica incertidumbre sobre el precio medio de viviendas con ese perfil; el segundo es mucho más amplio porque intenta cubrir el precio de una vivienda individual. Por eso una predicción puntual compatible con el presupuesto no garantiza que cualquier inmueble con esas características vaya a costar menos de 350 millones.
ofertas1 |>
select(
id, barrio, estrato, preciom, PrecioEstimadoModelo,
areaconst, habitaciones, parqueaderos, banios,
CumpleEstricto, DistanciaPerfil, BrechaModeloMenosPrecio,
longitud, latitud
) |>
tablaHtml("Cinco ofertas priorizadas - Vivienda 1", digitos = 2)
| id | barrio | estrato | preciom | PrecioEstimadoModelo | areaconst | habitaciones | parqueaderos | banios | CumpleEstricto | DistanciaPerfil | BrechaModeloMenosPrecio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1108 | la merced | 4 | 330 | 385.80 | 260 | 4 | 1 | 3 | TRUE | 1.29 | 55.80 | -76.51 | 3.48 |
| 1163 | la merced | 5 | 350 | 394.25 | 216 | 4 | 2 | 2 | TRUE | 1.58 | 44.25 | -76.51 | 3.48 |
| 1270 | el bosque | 5 | 350 | 383.87 | 203 | 5 | 2 | 2 | TRUE | 1.78 | 33.87 | -76.51 | 3.49 |
| 1887 | vipasa | 5 | 340 | 408.49 | 203 | 4 | 2 | 3 | TRUE | 1.84 | 68.49 | -76.52 | 3.48 |
| 1842 | vipasa | 5 | 350 | 438.05 | 240 | 4 | 2 | 3 | TRUE | 1.93 | 88.05 | -76.52 | 3.48 |
leaflet(ofertas1) |>
addProviderTiles(providers$CartoDB.Positron) |>
addMarkers(
~longitud, ~latitud,
popup = ~paste0(
"<b>ID ", id, " - ", barrio, "</b><br>",
"Precio: $", preciom, " M<br>",
"Predicción modelo: $", round(PrecioEstimadoModelo, 1), " M<br>",
"Estrato: ", estrato, "<br>",
"Área: ", areaconst, " m²<br>",
"Habitaciones: ", habitaciones, "<br>",
"Parqueaderos: ", parqueaderos, "<br>",
"Baños: ", banios, "<br>",
"Cumple estricto: ", CumpleEstricto
)
)
La Tabla @ref(tab:ofertasBase1) contiene 5 ofertas con cumplimiento estricto entre las cinco mostradas. La primera opción priorizada es el inmueble ID 1108 de la merced, con precio publicado de 330 millones, área de 260 m² y estrato 4. Su posición en la lista responde primero al cumplimiento de requisitos y luego a la cercanía estandarizada al perfil solicitado.
El mapa de la Sección @ref(mapaOfertas1Seccion) permite verificar que
las cinco opciones están efectivamente dentro del segmento geográfico
corregido. La columna BrechaModeloMenosPrecio es útil para
negociación: un valor positivo indica que el modelo estima un precio
mayor que el publicado, pero no debe interpretarse como prueba
de subvaloración porque los intervalos de predicción son
amplios y el modelo presenta heterocedasticidad.
La segunda solicitud requiere un apartamento en Zona Sur con 300 m², 5 habitaciones, 3 parqueaderos, 3 baños, estrato 5 o 6 y crédito máximo de 850 millones. La rúbrica exige replicar el procedimiento; por eso se mantiene la misma secuencia analítica y los mismos criterios de decisión.
tibble(
Indicador = c("Tipo", "Zona corregida", "Número de registros"),
Valor = c(
paste(unique(base2$tipo), collapse = ", "),
paste(unique(base2$zona), collapse = ", "),
nrow(base2)
)
) |>
tablaHtml("Comprobación del filtro para Vivienda 2", digitos = 0)
| Indicador | Valor |
|---|---|
| Tipo | Apartamento |
| Zona corregida | Zona Sur |
| Número de registros | 2835 |
base2 |>
select(id, zonaOriginal, zonaCorregida, tipo, barrio, estrato, preciom, areaconst,
parqueaderos, banios, habitaciones, longitud, latitud) |>
head(3) |>
tablaHtml("Primeros tres registros - Apartamento / Zona Sur después del retag", digitos = 2)
| id | zonaOriginal | zonaCorregida | tipo | barrio | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1724 | Zona Norte | Zona Sur | Apartamento | acopi | 5 | 240 | 87 | 1 | 3 | 3 | -76.52 | 3.37 |
| 4386 | Zona Norte | Zona Sur | Apartamento | acopi | 5 | 310 | 137 | 2 | 3 | 4 | -76.53 | 3.38 |
| 5424 | Zona Norte | Zona Sur | Apartamento | acopi | 4 | 320 | 108 | 2 | 3 | 3 | -76.54 | 3.41 |
trazabilidadZonaModelo2 <- tibble(
Indicador = c(
"Campo usado para filtrar el segmento",
"Zona final exigida",
"Registros usados por el modelo",
"Registros que ingresaron a Sur desde otra etiqueta original",
"Apartamentos originalmente Sur que salieron del segmento por retag",
"Verificación de consistencia"
),
Valor = c(
"zonaCorregida",
"Zona Sur",
as.character(nrow(base2)),
as.character(sum(base2$zonaOriginal != "Zona Sur")),
as.character(sum(
viviendaPreparada$tipo == "Apartamento" &
viviendaPreparada$zonaOriginal == "Zona Sur" &
viviendaPreparada$zonaCorregida != "Zona Sur",
na.rm = TRUE
)),
ifelse(all(base2$zonaCorregida == "Zona Sur"), "100% Zona Sur corregida", "REVISAR")
)
)
tablaHtml(
trazabilidadZonaModelo2,
"Trazabilidad de la zona utilizada para estimar la Vivienda 2",
digitos = 0
)
| Indicador | Valor |
|---|---|
| Campo usado para filtrar el segmento | zonaCorregida |
| Zona final exigida | Zona Sur |
| Registros usados por el modelo | 2835 |
| Registros que ingresaron a Sur desde otra etiqueta original | 154 |
| Apartamentos originalmente Sur que salieron del segmento por retag | 106 |
| Verificación de consistencia | 100% Zona Sur corregida |
estratos2 |>
tablaHtml("Composición por estrato del filtro Apartamento / Zona Sur corregida", digitos = 2)
| estrato | n | Porcentaje |
|---|---|---|
| 3 | 218 | 7.69 |
| 4 | 1076 | 37.95 |
| 5 | 1052 | 37.11 |
| 6 | 489 | 17.25 |
Las Tablas @ref(tab:comprobacionBase2), @ref(tab:primerosBase2) y
@ref(tab:trazabilidadZonaModelo2) confirman que la réplica para la
Vivienda 2 utiliza exclusivamente la zona corregida.
base2 se filtra con
zonaCorregida == "Zona Sur" y contiene 2835
apartamentos. De ellos, 154 llegaron
originalmente con otra etiqueta y entran al segmento únicamente después
del retag; a la vez, 106 apartamentos inicialmente
marcados como Sur salen del segmento porque sus coordenadas los ubican
en otra zona. Esta doble dirección del cambio es importante: corregir la
zona puede incorporar y excluir observaciones antes de
la regresión.
La Tabla @ref(tab:composicionEstratoFiltro2) muestra la composición
del filtro final. Igual que en Vivienda 1, zonaCorregida ya
es constante dentro del segmento y no se introduce como predictor del
modelo.
leaflet(base2) |>
addProviderTiles(providers$CartoDB.Positron) |>
addCircleMarkers(
~longitud, ~latitud,
radius = 4,
stroke = FALSE,
fillOpacity = 0.65,
popup = ~paste0(
"<b>ID: ", id, " - ", barrio, "</b><br>",
"Estrato: ", estrato, "<br>",
"Precio: $", preciom, " M<br>",
"Área: ", areaconst, " m²<br>",
"Zona usada: ", zona
)
)
El mapa de la Sección @ref(mapaBase2Seccion) representa el Sur después de la corrección, no el Sur tal como venía en la base. Esto es particularmente importante porque el retag puede tanto sacar observaciones originalmente marcadas como Sur como incorporar registros que llegaron con otra zona pero cuyas coordenadas corresponden al submercado Sur.
resumenNumerico2 |>
tablaHtml("Resumen descriptivo de variables cuantitativas - Vivienda 2", digitos = 2)
| Variable | N | Minimo | Q1 | Mediana | Q3 | Maximo |
|---|---|---|---|---|---|---|
| preciom | 2835 | 70 | 175 | 250 | 340 | 1750 |
| areaconst | 2835 | 40 | 65 | 85 | 110 | 932 |
| habitaciones | 2835 | 0 | 3 | 3 | 3 | 6 |
| parqueaderos | 2835 | 1 | 1 | 1 | 2 | 10 |
| banios | 2835 | 0 | 2 | 2 | 3 | 8 |
ggplot(estratos2, aes(x = estrato, y = Porcentaje)) +
geom_col() +
geom_text(aes(label = paste0(round(Porcentaje, 1), "%")), vjust = -0.35, size = 3.5) +
labs(
title = "Distribución por estrato - Apartamento / Zona Sur corregida",
x = "Estrato",
y = "Porcentaje de inmuebles"
) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.10))) +
theme_minimal(base_size = 12)
Distribución porcentual del estrato en apartamentos de Zona Sur corregida
datosContinuos2 <- base2 |>
dplyr::select(preciom, areaconst) |>
tidyr::pivot_longer(
cols = dplyr::everything(),
names_to = "Variable",
values_to = "Valor"
) |>
dplyr::mutate(
Variable = dplyr::case_when(
Variable == "preciom" ~ "Precio (millones)",
Variable == "areaconst" ~ "Área construida (m²)",
TRUE ~ Variable
)
)
ggplot2::ggplot(datosContinuos2, ggplot2::aes(x = Valor)) +
ggplot2::geom_histogram(bins = 30, boundary = 0) +
ggplot2::facet_wrap(~Variable, scales = "free", ncol = 2) +
ggplot2::labs(
title = "Distribuciones marginales - Vivienda 2",
x = NULL,
y = "Frecuencia"
) +
ggplot2::theme_minimal(base_size = 11)
Distribuciones de precio y área construida en apartamentos de Zona Sur corregida
datosConteos2 <- base2 |>
dplyr::select(habitaciones, parqueaderos, banios) |>
tidyr::pivot_longer(
cols = dplyr::everything(),
names_to = "Variable",
values_to = "Nivel"
) |>
dplyr::count(Variable, Nivel, name = "Frecuencia") |>
dplyr::mutate(
Variable = dplyr::case_when(
Variable == "habitaciones" ~ "Habitaciones",
Variable == "parqueaderos" ~ "Parqueaderos",
Variable == "banios" ~ "Baños",
TRUE ~ Variable
)
)
ggplot2::ggplot(
datosConteos2,
ggplot2::aes(
x = factor(Nivel),
y = Frecuencia
)
) +
ggplot2::geom_col() +
ggplot2::facet_wrap(
~Variable,
scales = "free_x"
) +
ggplot2::labs(
title = "Distribuciones de predictores discretos - Vivienda 2",
x = "Número",
y = "Frecuencia"
) +
ggplot2::theme_minimal(base_size = 11)
Frecuencias de habitaciones, parqueaderos y baños en apartamentos de Zona Sur corregida
La Tabla @ref(tab:descriptivosBase2) muestra un mercado con precio mediano de 250,0 millones y área mediana de 85,0 m². La solicitud de 300 m² se ubica, por tanto, muy por encima de la vivienda típica del segmento y debe considerarse una predicción hacia una zona menos densa de los datos; esto ayuda a entender por qué el intervalo de predicción será relevante.
Las Figuras @ref(fig:distribucionContinuasBase2) y @ref(fig:distribucionConteosBase2) muestran que el segundo segmento está todavía más concentrado en áreas pequeñas y medianas, con una cola prolongada hacia apartamentos grandes. La solicitud de 300 m² equivale a 3,5 veces el área mediana, por lo que la predicción se realiza en una región menos poblada del espacio de datos. Los valores modales son 3 habitaciones, 1 parqueaderos y 2 baños; el perfil solicitado exige 5 habitaciones y 3 parqueaderos, por lo que se aleja del centro de la distribución en más de una característica.
La Tabla @ref(tab:composicionEstratoFiltro2) y la Figura @ref(fig:distribucionEstratoBase2) muestran que el estrato más frecuente es 4, con 37,95%. Nuevamente, esta variable se resume mediante proporciones y no mediante media o dispersión.
atipicosIqr2 |>
tablaHtml("Valores extremos continuos por IQR - Vivienda 2", digitos = 2)
| Variable | LimiteInferior | LimiteSuperior | AtipicosIQR | PorcentajeAtipicos |
|---|---|---|---|---|
| preciom | -72.5 | 587.5 | 271 | 9.56 |
| areaconst | -2.5 | 177.5 | 204 | 7.20 |
La Tabla @ref(tab:atipicosIqrBase2) restringe el IQR a precio y área, evitando falsos positivos en variables discretas. En este segmento aparecen 271 precios y 204 áreas fuera de los límites exploratorios. No se eliminan automáticamente: apartamentos excepcionalmente grandes o costosos pueden ser observaciones reales y su influencia se revisa después en la Figura @ref(fig:diagnosticosGraficos2). Esta separación evita confundir valor extremo, dato erróneo y error de etiquetado espacial, que son problemas distintos.
casosIqr2 |>
tablaHtml("Casos extremos por IQR para inspección - Vivienda 2 (máximo 20)", digitos = 2)
| id | barrio | estrato | preciom | areaconst | habitaciones | parqueaderos | banios | TipoExtremoIQR |
|---|---|---|---|---|---|---|---|---|
| 5952 | ciudad jardín | 6 | 1750 | 342 | 4 | 3 | 5 | Precio y área |
| 6512 | pance | 6 | 1750 | 290 | 3 | 3 | 4 | Precio y área |
| 6197 | ciudad jardín | 6 | 1700 | 290 | 3 | 3 | 4 | Precio y área |
| 5190 | ciudad jardín | 6 | 1600 | 345 | 3 | 3 | 6 | Precio y área |
| 6510 | pance | 6 | 1600 | 290 | 4 | 3 | 5 | Precio y área |
| 5472 | pance | 6 | 1590 | 310 | 3 | 3 | 4 | Precio y área |
| 3785 | pance | 6 | 1580 | 296 | 3 | 4 | 4 | Precio y área |
| 6475 | ciudad jardín | 6 | 1561 | 399 | 3 | 3 | 4 | Precio y área |
| 2791 | normandia | 6 | 1500 | 530 | 4 | 4 | 7 | Precio y área |
| 6086 | ciudad jardín | 6 | 1500 | 240 | 6 | 3 | 5 | Precio y área |
| 4754 | santa teresita | 6 | 1500 | 236 | 3 | 3 | 5 | Precio y área |
| 8227 | normandía | 6 | 1400 | 300 | 3 | 2 | 4 | Precio y área |
| 5211 | ciudad jardín | 6 | 1350 | 439 | 4 | 4 | 6 | Precio y área |
| 7346 | pance | 6 | 1350 | 212 | 3 | 3 | 5 | Precio y área |
| 6937 | pance | 6 | 1350 | 212 | 3 | 3 | 4 | Precio y área |
| 6073 | multicentro | 5 | 1250 | 251 | 4 | 4 | 5 | Precio y área |
| 4942 | unicentro cali | 5 | 1250 | 213 | 3 | 3 | 4 | Precio y área |
| 3975 | ciudad jardín | 6 | 1240 | 222 | 4 | 3 | 5 | Precio y área |
| 4682 | santa teresita | 6 | 1200 | 254 | 3 | 3 | 4 | Precio y área |
| 6023 | ciudad jardín | 6 | 1150 | 464 | 5 | 4 | 6 | Precio y área |
La Tabla @ref(tab:casosIqrBase2) permite inspeccionar los apartamentos que originan las colas de precio y área. Esto es especialmente importante porque la solicitud requiere 300 m², un perfil situado en la parte alta de la distribución del segmento. Eliminar mecánicamente áreas grandes mediante IQR empobrecería precisamente la región del espacio de datos que necesitamos para predecir. Por eso estas observaciones se conservan y su comportamiento se evalúa formalmente dentro del modelo.
La versión Plotly permite inspeccionar inmuebles individuales.
# graficaArea2 <- ggplot(
# base2,
# aes(
# x = areaconst,
# y = preciom,
# color = estrato,
# text = paste0(
# "ID: ", id,
# "<br>Barrio: ", barrio,
# "<br>Estrato: ", estrato,
# "<br>Precio: $", preciom, " M",
# "<br>Área: ", areaconst, " m²",
# "<br>Baños: ", banios,
# "<br>Habitaciones: ", habitaciones,
# "<br>Parqueaderos: ", parqueaderos
# )
# )
# ) +
# geom_point(alpha = 0.5) +
# geom_smooth(method = "lm", se = FALSE) +
# labs(
# title = "Precio frente a área construida - Vivienda 2",
# x = "Área construida (m²)",
# y = "Precio (millones)",
# color = "Estrato"
# ) +
# theme_minimal(base_size = 12)
#
# print(graficaArea2)
graficaAreaInteractiva2 <- plotly::plot_ly(
data = base2,
x = ~areaconst,
y = ~preciom,
color = ~estrato,
type = "scatter",
mode = "markers",
text = ~paste0(
"ID: ", id,
"<br>Barrio: ", barrio,
"<br>Estrato: ", estrato,
"<br>Precio: $", preciom, " M",
"<br>Área: ", areaconst, " m²",
"<br>Baños: ", banios,
"<br>Habitaciones: ", habitaciones,
"<br>Parqueaderos: ", parqueaderos
),
hoverinfo = "text",
marker = list(
opacity = 0.55,
size = 7
)
) |>
plotly::layout(
title = "Precio frente a área construida - Vivienda 2",
xaxis = list(
title = "Área construida (m²)"
),
yaxis = list(
title = "Precio (millones)"
),
legend = list(
title = list(text = "Estrato")
)
)
graficaAreaInteractiva2
Se observa nuevamente una asociación positiva entre área y precio, pero con mayor densidad de observaciones en áreas pequeñas y medianas. Pearson para área es 0,761 y Spearman 0,868. La diferencia entre ambos refuerza la necesidad de no asumir que toda la relación puede resumirse perfectamente mediante una recta.
datosLargos2 <- base2 |>
select(preciom, estrato, habitaciones, parqueaderos, banios) |>
mutate(across(c(estrato, habitaciones, parqueaderos, banios), as.character)) |>
pivot_longer(
cols = c(estrato, habitaciones, parqueaderos, banios),
names_to = "Variable",
values_to = "Nivel"
)
# graficaCategorias2 <- ggplot(
# datosLargos2,
# aes(x = factor(Nivel), y = preciom)
# ) +
# geom_boxplot(outlier.alpha = 0.25) +
# facet_wrap(~Variable, scales = "free_x") +
# labs(
# title = "Distribución del precio según predictores discretos/ordinales - Vivienda 2",
# x = "Nivel",
# y = "Precio (millones)"
# ) +
# theme_minimal(base_size = 11)
#
# print(graficaCategorias2)
graficaCategoriasInteractiva2 <- crearBoxplotsInteractivos(
datosLargos2,
"Precio según estrato, habitaciones, parqueaderos y baños - Vivienda 2"
)
graficaCategoriasInteractiva2
precioPorEstrato2 <- base2 |>
group_by(estrato) |>
summarise(
N = n(),
Q1Precio = quantile(preciom, 0.25, na.rm = TRUE),
MedianaPrecio = median(preciom, na.rm = TRUE),
Q3Precio = quantile(preciom, 0.75, na.rm = TRUE),
.groups = "drop"
)
tablaHtml(
precioPorEstrato2,
"Distribución del precio dentro de cada estrato - Vivienda 2",
digitos = 1
)
| estrato | N | Q1Precio | MedianaPrecio | Q3Precio |
|---|---|---|---|---|
| 3 | 218 | 110 | 125 | 145 |
| 4 | 1076 | 152 | 185 | 240 |
| 5 | 1052 | 235 | 280 | 335 |
| 6 | 489 | 420 | 580 | 700 |
La Figura interactiva y la Tabla @ref(tab:precioPorEstrato2) muestran
una separación sustantiva de precios entre estratos. La mediana del
precio pasa de 125,0 millones en el estrato de
referencia 3 a 580,0 millones en el estrato 6. Los
boxplots de parqueaderos y baños también se desplazan con el precio,
mientras que habitaciones requiere una lectura más
cuidadosa: marginalmente acompaña el tamaño del inmueble, pero
manteniendo el área constante puede representar una mayor subdivisión
del mismo espacio. La regresión permitirá separar esos efectos.
matrizCorrelacion2 <- base2 |>
select(preciom, areaconst, habitaciones, parqueaderos, banios) |>
cor(use = "complete.obs", method = "pearson")
nombresCorrelacion2 <- c(
preciom = "Precio",
areaconst = "Área",
habitaciones = "Habitaciones",
parqueaderos = "Parqueaderos",
banios = "Baños"
)
colnames(matrizCorrelacion2) <- nombresCorrelacion2[colnames(matrizCorrelacion2)]
rownames(matrizCorrelacion2) <- nombresCorrelacion2[rownames(matrizCorrelacion2)]
tablaCorrelacion2 <- as.data.frame(matrizCorrelacion2) |>
tibble::rownames_to_column("Variable")
tablaHtml(
tablaCorrelacion2,
"Matriz de correlación de Pearson entre variables cuantitativas - Vivienda 2",
digitos = 3
)
| Variable | Precio | Área | Habitaciones | Parqueaderos | Baños |
|---|---|---|---|---|---|
| Precio | 1.000 | 0.761 | 0.315 | 0.709 | 0.721 |
| Área | 0.761 | 1.000 | 0.419 | 0.592 | 0.669 |
| Habitaciones | 0.315 | 0.419 | 1.000 | 0.249 | 0.502 |
| Parqueaderos | 0.709 | 0.592 | 0.249 | 1.000 | 0.584 |
| Baños | 0.721 | 0.669 | 0.502 | 0.584 | 1.000 |
corrplot::corrplot(
matrizCorrelacion2,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 35,
number.cex = 0.8
)
Correlaciones de Pearson entre precio y predictores cuantitativos en la Vivienda 2
La Tabla @ref(tab:matrizCorrelacionBase2) y la Figura @ref(fig:corrplotBase2) muestran la estructura lineal del segundo segmento. La mayor correlación absoluta entre predictores cuantitativos es 0,669. Aunque en este segmento área, baños y parqueaderos pueden estar relacionados porque describen tamaño y dotación del apartamento, la magnitud de esas asociaciones debe contrastarse después con el VIF/GVIF antes de hablar de multicolinealidad problemática.
Como en Vivienda 1, estrato se mantiene fuera de Pearson
y se analiza con Spearman por su naturaleza ordinal.
asociaciones2 |>
tablaHtml("Asociación bivariada con el precio - Vivienda 2", digitos = 3)
| Variable | Pearson | Spearman |
|---|---|---|
| Área construida | 0.761 | 0.868 |
| Habitaciones | 0.315 | 0.386 |
| Parqueaderos | 0.709 | 0.664 |
| Baños | 0.721 | 0.713 |
| Estrato (ordinal) |
|
0.760 |
La Tabla @ref(tab:asociacionesBase2) muestra una asociación ordinal estrato-precio de Spearman = 0,760. Entre los predictores cuantitativos, la mayor asociación según Spearman corresponde a Área construida. Estas relaciones fuertes explican parte del buen ajuste posterior, pero no sustituyen el análisis de contribución única del modelo múltiple.
codificacionEstrato2 |>
tablaHtml("Codificación dummy del factor estrato - Vivienda 2", digitos = 0)
| Estrato | 4 | 5 | 6 |
|---|---|---|---|
| 3 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 |
| 5 | 0 | 1 | 0 |
| 6 | 0 | 0 | 1 |
La Tabla @ref(tab:codificacionEstratoBase2) confirma la misma estrategia: estrato 3 es la referencia y se utilizan \(K-1\) indicadores. Esto evita dependencia lineal perfecta con el intercepto y permite comparar cada estrato con una categoría real observada, sin asumir una pendiente constante entre niveles.
coeficientes2 |>
tablaHtml("Coeficientes e interpretación contextual - modelo completo Vivienda 2", digitos = 4)
| Variable | Coeficiente | ErrorEstandar | EstadisticoT | ValorP | IC95Inferior | IC95Superior | Significativo5pct | Interpretacion |
|---|---|---|---|---|---|---|---|---|
| (Intercept) | -46.4417 | 10.4113 | -4.4607 | 0 | -66.8562 | -26.0272 | TRUE | Intercepto del modelo. Solo tiene interpretación sustantiva si el perfil de referencia y los valores cero de los predictores son plausibles. |
| areaconst | 1.3282 | 0.0455 | 29.2200 | 0 | 1.2391 | 1.4174 | TRUE | Por cada m² adicional de área construida, manteniendo constantes las demás variables, el precio esperado cambia 1.328 millones de pesos. |
| estrato4 | 30.0305 | 6.9701 | 4.3085 | 0 | 16.3635 | 43.6975 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 30.03 millones de pesos. |
| estrato5 | 54.0471 | 7.1915 | 7.5154 | 0 | 39.9461 | 68.1482 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 54.047 millones de pesos. |
| estrato6 | 211.2966 | 9.0427 | 23.3665 | 0 | 193.5657 | 229.0276 | TRUE | Diferencia estimada frente al estrato 3, manteniendo constantes área, habitaciones, parqueaderos y baños: 211.297 millones de pesos. |
| habitaciones | -13.4703 | 3.2292 | -4.1714 | 0 | -19.8022 | -7.1384 | TRUE | Por cada habitación adicional, manteniendo constantes las demás variables, el precio esperado cambia -13.47 millones de pesos. |
| parqueaderos | 68.3519 | 3.8245 | 17.8720 | 0 | 60.8528 | 75.8510 | TRUE | Por cada parqueadero adicional, manteniendo constantes las demás variables, el precio esperado cambia 68.352 millones de pesos. |
| banios | 38.7096 | 2.9411 | 13.1616 | 0 | 32.9427 | 44.4765 | TRUE | Por cada baño adicional, manteniendo constantes las demás variables, el precio esperado cambia 38.71 millones de pesos. |
broom::glance(modelo2Completo) |>
select(r.squared, adj.r.squared, sigma, statistic, p.value, AIC, BIC) |>
rename(
R2 = r.squared,
R2Ajustado = adj.r.squared,
ErrorResidual = sigma,
EstadisticoF = statistic,
ValorPGlobal = p.value
) |>
tablaHtml("Bondad de ajuste - modelo completo Vivienda 2", digitos = 4)
| R2 | R2Ajustado | ErrorResidual | EstadisticoF | ValorPGlobal | AIC | BIC |
|---|---|---|---|---|---|---|
| 0.7913 | 0.7908 | 91.7224 | 1531.473 | 0 | 33676.78 | 33730.32 |
El modelo completo explica 79,13% de la variabilidad
del precio y presenta \(R^2\) ajustado
de 0,791. En la Tabla @ref(tab:coeficientesBase2), el
área construida cambia el precio esperado en 1,328 millones por
m², parqueaderos en 68,352 millones por
espacio y baños en 38,710 millones, manteniendo las
demás variables constantes. En Apartamento / Zona Sur la proporción
imputada de parqueaderos es 16,23%, menor
que en el primer segmento, aunque sigue siendo una limitación de calidad
de datos que conviene reconocer.
El coeficiente de habitaciones es -13,470
millones con valor p < 0,001. Si resulta
negativo, no significa que “agregar una habitación abarate” un
apartamento en términos causales; significa que, para
apartamentos con igual área, estrato, parqueaderos y baños, una
subdivisión en más habitaciones se asocia con un precio diferente.
contribuciones2 |>
tablaHtml("Contribución única de los predictores - Vivienda 2", digitos = 4)
| Variable | SumaCuadrados | GradosLibertad | EstadisticoF | ValorP | DeltaR2 | DeltaR2Pct | R2Parcial | Significativo5pct |
|---|---|---|---|---|---|---|---|---|
| areaconst | 7183064.9 | 1 | 853.8060 | 0 | 0.0630 | 6.3024 | 0.2320 | TRUE |
| estrato | 7441579.1 | 3 | 294.8446 | 0 | 0.0653 | 6.5292 | 0.2383 | TRUE |
| habitaciones | 146388.1 | 1 | 17.4002 | 0 | 0.0013 | 0.1284 | 0.0061 | TRUE |
| parqueaderos | 2687188.2 | 1 | 319.4092 | 0 | 0.0236 | 2.3577 | 0.1015 | TRUE |
| banios | 1457366.1 | 1 | 173.2280 | 0 | 0.0128 | 1.2787 | 0.0577 | TRUE |
La contribución del factor estrato se evalúa de manera
conjunta en la Tabla @ref(tab:contribucionesBase2): \(F=\) 294,84, valor p
< 0,001 y \(R^2\)
parcial 0,238.
En este segundo segmento, retirar estrato reduce el
\(R^2\) en 6,53 puntos
porcentuales y retirar área construida en
6,30; ambos son los bloques con mayor contribución
única. parqueaderos aporta 2,36 puntos,
banios 1,28 y habitaciones
0,13. Aunque habitaciones aporta menos que los demás,
su contribución es distinta de cero y el modelo completo la conserva;
por eso no sería coherente eliminarla solo porque su efecto sea menor en
magnitud.
ajuste2$comparacion |>
tablaHtml("Comparación del modelo completo y la alternativa reducida - Vivienda 2", digitos = 4)
| Modelo | Formula | R2 | R2Ajustado | AIC | BIC | CVRMSE | CVR2 |
|---|---|---|---|---|---|---|---|
| Completo | preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios | 0.7913 | 0.7908 | 33676.78 | 33730.32 | 90.8349 | 0.7921 |
La Tabla @ref(tab:comparacionModelos2) selecciona Completo. La reducción backward por AIC no elimina ningún término; por ello se muestra una sola especificación y se conserva íntegramente el modelo solicitado.
par(mfrow = c(2, 2))
plot(modelo2Final)
Diagnósticos gráficos del modelo final - Vivienda 2
par(mfrow = c(1, 1))
Se repite exactamente el mismo diagnóstico sobre el modelo final de apartamentos de Zona Sur corregida. Esto permite separar los apartamentos simplemente grandes o costosos de aquellos cuyo precio observado resulta inusual frente a sus características o cuya combinación de predictores tiene leverage elevado.
resumenInfluencia2 |>
tablaHtml("Diagnóstico formal de observaciones atípicas e influencia - Vivienda 2", digitos = 4)
| Diagnostico | Criterio | Casos | Porcentaje |
|---|---|---|---|
| Residual studentizado | |r_i| > 3 | 40 | 1.4109 |
| Leverage | h_ii > 2p/n = 0.0056 | 161 | 5.6790 |
| Distancia de Cook | D_i > 1 | 1 | 0.0353 |
| DFFITS | |DFFITS| > 2√(p/n) = 0.1062 | 154 | 5.4321 |
| DFBETAS | máx.|DFBETAS| > 2/√n = 0.0376 | 351 | 12.3810 |
| Al menos una alerta | Cumple uno o más criterios | 408 | 14.3915 |
ggplot2::ggplot(
diagnosticoObs2$datos,
ggplot2::aes(
x = Leverage,
y = ResidualStudentizado,
size = Cook,
shape = EstadoDiagnostico
)
) +
ggplot2::geom_point(alpha = 0.50) +
ggplot2::geom_hline(yintercept = c(-3, 3), linetype = "dashed") +
ggplot2::geom_vline(xintercept = diagnosticoObs2$umbralLeverage, linetype = "dashed") +
ggplot2::scale_size_continuous(range = c(1.5, 6)) +
ggplot2::labs(
title = "Outliers e influencia en el modelo final - Vivienda 2",
subtitle = "Líneas: |residual studentizado| = 3 y leverage = 2p/n",
x = "Leverage",
y = "Residual studentizado",
size = "Cook",
shape = "Estado"
) +
ggplot2::theme_minimal(base_size = 11)
Residuales studentizados, leverage y distancia de Cook - Vivienda 2
casosInfluencia2 |>
tablaHtml("Observaciones con alertas diagnósticas - Vivienda 2 (máximo 20)", digitos = 4)
| id | barrio | estrato | preciom | areaconst | ResidualStudentizado | Leverage | Cook | DFFITS | MaxAbsDFBETAS | NumeroAlertas | ExtremoPrecioIQR | ExtremoAreaIQR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6121 | valle del lili | 5 | 299 | 932 | -13.4615 | 0.1701 | 4.3650 | -6.0947 | 6.0680 | 5 | FALSE | TRUE |
| 6472 | el limonar | 5 | 170 | 605 | -8.7169 | 0.0724 | 0.7227 | -2.4362 | 2.4015 | 4 | FALSE | TRUE |
| 7182 | guadalupe | 5 | 730 | 573 | -5.4334 | 0.0392 | 0.1489 | -1.0969 | 0.7871 | 4 | TRUE | TRUE |
| 4952 | el ingenio | 5 | 650 | 600 | -4.2475 | 0.0493 | 0.1162 | -0.9671 | 0.9204 | 4 | TRUE | TRUE |
| 6086 | ciudad jardín | 6 | 1500 | 240 | 7.7341 | 0.0100 | 0.0743 | 0.7787 | 0.6076 | 4 | TRUE | TRUE |
| 5952 | ciudad jardín | 6 | 1750 | 342 | 8.7174 | 0.0076 | 0.0710 | 0.7636 | 0.5353 | 4 | TRUE | TRUE |
| 6512 | pance | 6 | 1750 | 290 | 9.7889 | 0.0061 | 0.0710 | 0.7662 | 0.5121 | 4 | TRUE | TRUE |
| 3479 | acopi | 6 | 620 | 480 | -4.1855 | 0.0302 | 0.0679 | -0.7391 | 0.6298 | 4 | TRUE | TRUE |
| 6475 | ciudad jardín | 6 | 1561 | 399 | 6.0421 | 0.0146 | 0.0670 | 0.7365 | 0.6463 | 4 | TRUE | TRUE |
| 6197 | ciudad jardín | 6 | 1700 | 290 | 9.2158 | 0.0061 | 0.0632 | 0.7213 | 0.4822 | 4 | TRUE | TRUE |
| 3785 | pance | 6 | 1580 | 296 | 7.0055 | 0.0094 | 0.0573 | 0.6830 | 0.4007 | 4 | TRUE | TRUE |
| 5190 | ciudad jardín | 6 | 1600 | 345 | 6.4020 | 0.0106 | 0.0540 | 0.6620 | 0.3706 | 4 | TRUE | TRUE |
| 5472 | pance | 6 | 1590 | 310 | 7.6701 | 0.0072 | 0.0524 | 0.6541 | 0.4778 | 4 | TRUE | TRUE |
| 6073 | multicentro | 5 | 1250 | 251 | 5.4647 | 0.0110 | 0.0412 | 0.5773 | 0.4064 | 4 | TRUE | TRUE |
| 684 | santa teresita | 6 | 1270 | 153 | 6.4678 | 0.0073 | 0.0380 | 0.5555 | 0.4372 | 4 | TRUE | FALSE |
| 8227 | normandía | 6 | 1400 | 300 | 6.4527 | 0.0071 | 0.0369 | 0.5475 | 0.4491 | 4 | TRUE | TRUE |
| 6868 | melendez | 3 | 370 | 300 | -3.8833 | 0.0185 | 0.0354 | -0.5337 | 0.4185 | 4 | FALSE | TRUE |
| 7176 | pance | 6 | 1150 | 344 | 3.0984 | 0.0159 | 0.0193 | 0.3933 | 0.2702 | 4 | TRUE | TRUE |
| 8300 | bella suiza alta | 5 | 480 | 280 | -3.0079 | 0.0118 | 0.0134 | -0.3282 | 0.2321 | 4 | FALSE | TRUE |
| 6175 | capri | 5 | 350 | 270 | -3.1089 | 0.0083 | 0.0101 | -0.2845 | 0.1632 | 4 | FALSE | TRUE |
La Tabla @ref(tab:resumenInfluenciaBase2) identifica 40 de 2835 observaciones (1,41%) con \(|r_i|>3\) y 161 (5,68%) con leverage superior a \(2p/n\). Además, 154 casos superan el umbral de DFFITS y 351 el de DFBETAS. Estas cantidades corresponden a alertas de distinta naturaleza y no deben sumarse ni interpretarse como igual número de outliers.
En este segmento sí aparece 1 observación con Cook > 1. El caso más crítico es el ID 6121, barrio Valle Del Lili, con precio de 299 millones y área de 932 m². Su residual studentizado es -13,46, el leverage 0,170, Cook 4,365, DFFITS -6,095 y el máximo DFBETAS 6,068; por ello activa 5 de los cinco criterios. El registro había sido identificado como extremo por área mediante IQR, pero no por precio: su relevancia surge de la combinación multivariada entre tamaño, precio y demás características. Este registro merece verificación en la fuente original, pero la información disponible no permite concluir que sea un error.
En total, 408 observaciones (14,39%) activan al menos un criterio. La Figura @ref(fig:graficaInfluenciaBase2) también recuerda que el perfil solicitado de 300 m² se encuentra en una región poco densa: un apartamento grande puede presentar leverage alto precisamente por ser poco frecuente. Por ello se conserva la muestra completa; las alertas se documentan como diagnóstico y no como una regla automática de exclusión.
supuestos2 |>
tablaHtml("Validación de supuestos - Vivienda 2", digitos = 4)
| Supuesto | Prueba | Estadistico | ValorP | Decision | Criterio |
|---|---|---|---|---|---|
| Normalidad de residuales | Shapiro-Wilk | 0.7848 | 0 | Se rechaza normalidad | p > 0.05 |
| Varianza constante | Goldfeld-Quandt | 19.3018 | 0 | Se rechaza homocedasticidad | p > 0.05 |
| Independencia / autocorrelación secuencial | Durbin-Watson | 1.7184 | 0 | Evidencia secuencial según el orden usado; interpretar con cautela | p > 0.05, con cautela en datos transversales |
| Multicolinealidad | VIF/GVIF ajustado | 2.6267 |
|
Sin alerta relevante | VIF equivalente < 5 |
vif2 |>
tablaHtml("VIF/GVIF ajustado - Vivienda 2", digitos = 3)
| Variable | GVIF | GradosLibertad | GVIFAjustado | VIFEquivalente | ToleranciaAproximada |
|---|---|---|---|---|---|
| areaconst | 2.124 | 1 | 1.457 | 2.124 | 0.471 |
| estrato | 1.842 | 3 | 1.107 | 1.226 | 0.816 |
| habitaciones | 1.424 | 1 | 1.193 | 1.424 | 0.702 |
| parqueaderos | 1.884 | 1 | 1.373 | 1.884 | 0.531 |
| banios | 2.627 | 1 | 1.621 | 2.627 | 0.381 |
La Figura @ref(fig:diagnosticosGraficos2) presenta un patrón aún más visible de varianza creciente: la nube se abre al aumentar los valores ajustados y la línea roja de Scale-Location asciende. Goldfeld-Quandt lo confirma con valor p < 0,001. El Q-Q plot se separa fuertemente de la recta en ambas colas y Shapiro-Wilk arroja valor p < 0,001, por lo que la normalidad residual tampoco se sostiene estrictamente.
El panel Residuals vs Leverage destaca algunas observaciones candidatas a revisión. La Tabla @ref(tab:resumenInfluenciaBase2) cuantifica cuáles superan los criterios de residuales studentizados, leverage, Cook, DFFITS o DFBETAS. En un segmento donde la mayoría de apartamentos está muy por debajo de 300 m², un leverage alto puede reflejar simplemente un inmueble grande y real; por eso las observaciones se conservan.
La Tabla @ref(tab:vifBase2) reporta un VIF equivalente máximo de 2,63, por debajo de 5. Por tanto, aunque varios predictores estén relacionados entre sí, no se observa multicolinealidad suficientemente fuerte como para invalidar la estimación. Esto es coherente con la codificación \(K-1\) del factor estrato.
prediccion2 |>
mutate(
Presupuesto = 850,
CumplePrecioEsperado = PrecioEstimado <= Presupuesto
) |>
tablaHtml("Predicción de precio para la Vivienda 2", digitos = 2)
| Estrato | PrecioEstimado | ICMediaInferior | ICMediaSuperior | IPIndividualInferior | IPIndividualSuperior | Presupuesto | CumplePrecioEsperado |
|---|---|---|---|---|---|---|---|
| 5 | 659.91 | 639.78 | 680.03 | 478.93 | 840.88 | 850 | TRUE |
| 6 | 817.16 | 796.99 | 837.32 | 636.18 | 998.13 | 850 | TRUE |
Para estrato 5, el precio esperado es 659,91 millones; para estrato 6 asciende a 817,16 millones. Ambas predicciones puntuales se mantienen dentro del crédito de 850 millones.
La decisión cambia cuando se incorpora incertidumbre: el límite superior del intervalo individual para estrato 5 es 840,88 millones y para estrato 6 998,13 millones. Por ello el modelo respalda la búsqueda dentro del presupuesto, pero no garantiza que una propiedad individual con el perfil solicitado esté siempre por debajo del crédito aprobado.
ofertas2 |>
select(
id, barrio, estrato, preciom, PrecioEstimadoModelo,
areaconst, habitaciones, parqueaderos, banios,
CumpleEstricto, DistanciaPerfil, BrechaModeloMenosPrecio,
longitud, latitud
) |>
tablaHtml("Cinco ofertas priorizadas - Vivienda 2", digitos = 2)
| id | barrio | estrato | preciom | PrecioEstimadoModelo | areaconst | habitaciones | parqueaderos | banios | CumpleEstricto | DistanciaPerfil | BrechaModeloMenosPrecio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7512 | seminario | 5 | 670 | 723.86 | 300 | 6 | 3 | 5 | TRUE | 2.69 | 53.86 | -76.55 | 3.41 |
| 7182 | guadalupe | 5 | 730 | 1216.06 | 573 | 5 | 3 | 8 | TRUE | 7.43 | 486.06 | -76.55 | 3.41 |
| 6175 | capri | 5 | 350 | 633.53 | 270 | 4 | 3 | 3 | FALSE | 1.71 | 283.53 | -76.54 | 3.39 |
| 2308 | San Fernando | 5 | 350 | 574.48 | 258 | 5 | 2 | 4 | FALSE | 2.11 | 224.48 | -76.52 | 3.44 |
| 4266 | el ingenio | 6 | 700 | 721.10 | 250 | 5 | 2 | 4 | FALSE | 2.17 | 21.10 | -76.53 | 3.37 |
leaflet(ofertas2) |>
addProviderTiles(providers$CartoDB.Positron) |>
addMarkers(
~longitud, ~latitud,
popup = ~paste0(
"<b>ID ", id, " - ", barrio, "</b><br>",
"Precio: $", preciom, " M<br>",
"Predicción modelo: $", round(PrecioEstimadoModelo, 1), " M<br>",
"Estrato: ", estrato, "<br>",
"Área: ", areaconst, " m²<br>",
"Habitaciones: ", habitaciones, "<br>",
"Parqueaderos: ", parqueaderos, "<br>",
"Baños: ", banios, "<br>",
"Cumple estricto: ", CumpleEstricto
)
)
De las cinco alternativas de la Tabla @ref(tab:ofertasBase2), 2 cumplen estrictamente área, habitaciones, parqueaderos, baños, estrato y presupuesto. Las restantes 3 se muestran solo como alternativas cercanas y no deben presentarse como cumplimiento total. La primera opción es ID 7512 en seminario, con precio de 670 millones.
El mapa de la Sección @ref(mapaOfertas2Seccion) permite verificar la localización de cada alternativa y facilita una lectura comercial de la tabla. Una brecha grande entre precio publicado y precio estimado por el modelo puede señalar una oferta que merece revisión, pero también puede reflejar características no incluidas en la regresión; por ello debe utilizarse como señal para inspección y negociación, no como avalúo automático.
comparacionCasos <- tibble(
Caso = c("Vivienda 1 - Casa / Norte", "Vivienda 2 - Apartamento / Sur"),
N = c(nrow(base1), nrow(base2)),
ModeloSeleccionado = c(ajuste1$nombreFinal, ajuste2$nombreFinal),
R2Ajustado = c(summary(modelo1Final)$adj.r.squared, summary(modelo2Final)$adj.r.squared),
RMSEcv = c(
ajuste1$comparacion$CVRMSE[ajuste1$comparacion$Modelo == ajuste1$nombreFinal],
ajuste2$comparacion$CVRMSE[ajuste2$comparacion$Modelo == ajuste2$nombreFinal]
),
VIFEquivalenteMaximo = c(max(vif1$VIFEquivalente), max(vif2$VIFEquivalente)),
OfertasEstrictas = c(sum(ofertas1$CumpleEstricto), sum(ofertas2$CumpleEstricto))
)
tablaHtml(comparacionCasos, "Comparación ejecutiva de los dos casos", digitos = 3)
| Caso | N | ModeloSeleccionado | R2Ajustado | RMSEcv | VIFEquivalenteMaximo | OfertasEstrictas |
|---|---|---|---|---|---|---|
| Vivienda 1 - Casa / Norte | 661 | ReducidoAIC | 0.673 | 156.360 | 1.488 | 5 |
| Vivienda 2 - Apartamento / Sur | 2835 | Completo | 0.791 | 90.835 | 2.627 | 2 |
La Tabla @ref(tab:comparacionCasos) permite comparar ambos casos sin confundir escalas. La Vivienda 1 utiliza 661 observaciones y alcanza \(R^2\) ajustado de 0,673; la Vivienda 2 utiliza 2835 observaciones y alcanza 0,791. El RMSE no debe compararse de forma aislada entre los dos segmentos porque los niveles y dispersiones de precio son distintos; dentro de cada caso sirve para comparar especificaciones sobre la misma escala.
parqueaderos dentro del submercado ya corregido. Alterar
ese orden podría usar información de una zona equivocada para completar
un valor faltante.parqueaderos concentra 1605 NA, mientras que los demás
predictores esenciales presentan ausencias mínimas. La mediana entera
por zona × tipo es robusta a valores extremos y conserva la
naturaleza discreta del conteo; la Tabla
@ref(tab:tablaImputacionParqueaderos) deja auditado el valor aplicado en
cada grupo.La exploración muestra que el área construida mantiene una asociación
fuerte con el precio (Tabla @ref(tab:asociacionesBase1)), mientras que
el estrato también presenta una asociación ordinal importante. En el
modelo completo, el área, el factor estrato, parqueaderos y baños deben
interpretarse conjuntamente con sus valores p e intervalos;
habitaciones no conserva evidencia de aporte parcial una
vez controladas las demás características.
La contribución del factor estrato no se deduce de una sola dummy: la Tabla @ref(tab:contribucionesBase1) muestra que eliminarlo reduce el \(R^2\) en 6,60 puntos porcentuales, con \(R^2\) parcial de 0,169. Esto responde a la interpretación de contribuciones de variables en factores solicitada por la profesora.
La Tabla @ref(tab:comparacionModelos1) selecciona ReducidoAIC para predicción. En la Tabla @ref(tab:prediccionBase1), el perfil estrato 4 se estima en 313,25 millones y el perfil estrato 5 en 354,21 millones. La decisión comercial debe utilizar también los intervalos individuales, porque la Figura @ref(fig:diagnosticosGraficos1) y las pruebas formales muestran que los errores no cumplen perfectamente normalidad ni homocedasticidad.
El diagnóstico formal identifica 16 observaciones (2,42%) con \(|r_i|>3\), 75 con leverage elevado y ninguna con Cook > 1. Aunque 113 activan al menos un criterio, esto no equivale a igual número de outliers. El caso ID 534 concentra la mayor señal diagnóstica y merece revisión por su área excepcional, pero se conserva porque no existe evidencia de error de registro. En consecuencia, los diagnósticos se incorporan como una advertencia sobre sensibilidad y no como un procedimiento de depuración automática.
La Tabla @ref(tab:ofertasBase1) entrega cinco opciones y 5 cumplen todos los requisitos de forma estricta. El modelo sirve aquí como filtro y apoyo de negociación, no como sustituto de la revisión física, jurídica y comercial del inmueble.
En el segmento de apartamentos del Sur, la asociación con precio es especialmente fuerte para área, estrato, parqueaderos y baños, según la Tabla @ref(tab:asociacionesBase2). El modelo completo explica 79,13% de la variabilidad del precio. El factor estrato aporta de manera conjunta: su \(R^2\) parcial es 0,238 y retirarlo reduce el \(R^2\) en 6,53 puntos porcentuales.
La Tabla @ref(tab:comparacionModelos2) selecciona Completo. Para la solicitud, la Tabla @ref(tab:prediccionBase2) estima 659,91 millones en estrato 5 y 817,16 millones en estrato 6. Aunque la predicción puntual puede ser compatible con 850 millones, el límite superior del intervalo individual puede superar el presupuesto, particularmente en el perfil de mayor estrato; esa incertidumbre debe informarse explícitamente.
La Figura @ref(fig:diagnosticosGraficos2) muestra heterocedasticidad y colas residuales pronunciadas, de modo que un \(R^2\) alto no significa que todos los supuestos inferenciales se satisfagan. La Tabla @ref(tab:vifBase2), en cambio, indica que la multicolinealidad no es el problema principal: el VIF equivalente máximo es 2,63.
El diagnóstico formal identifica 40 observaciones (1,41%) con \(|r_i|>3\) y un único caso con Cook > 1. Este corresponde al ID 6121, en Valle Del Lili, con 932 m² y precio de 299 millones; su residual studentizado de -13,46 y Cook de 4,365 lo convierten en la observación que más requiere verificación. Sin evidencia de error se conserva, y esta cautela es especialmente pertinente porque la solicitud de 300 m² ya se ubica en una zona poco densa del espacio de predictores.
La Tabla @ref(tab:ofertasBase2) contiene 2 alternativas estrictas. Si son menos de cinco, las demás opciones se presentan expresamente como concesiones y no como cumplimiento pleno del requerimiento.
Para la Vivienda 1, la prioridad debe darse al
estrato y perfil cuya predicción puntual sea compatible con 350 millones
y a las ofertas marcadas CumpleEstricto = TRUE. Para la
Vivienda 2, ambos estratos solicitados deben evaluarse
con el mismo criterio frente a 850 millones, pero con especial atención
al intervalo individual y a la distancia entre cada oferta y el perfil
de 300 m².
En ambos casos, la conclusión más importante es que la calidad de la recomendación depende primero de haber construido correctamente el mercado de comparación. El retag espacial evita mezclar zonas, la imputación segmentada evita perder una proporción grande de datos y la codificación factorial del estrato evita imponer una estructura numérica que la variable no tiene. El diagnóstico de outliers agrega una salvaguarda adicional: permite distinguir viviendas simplemente extremas de observaciones que pueden ejercer influencia sobre el ajuste, sin borrar información válida de manera automática. En particular, la ausencia de Cook > 1 en Vivienda 1 es tranquilizadora, mientras que el único caso de Vivienda 2 con Cook > 1 debe quedar documentado y sujeto a verificación. Solo después de integrar calidad de datos, diagnóstico del modelo e incertidumbre predictiva resulta razonable utilizar las estimaciones para recomendar ofertas.
[1] D. C. Montgomery, E. A. Peck, and G. G. Vining, Introduction to Linear Regression Analysis, 5th ed. Hoboken, NJ: Wiley, 2012.
[2] M. H. Kutner, C. J. Nachtsheim, J. Neter, and W. Li, Applied Linear Statistical Models, 5th ed. New York: McGraw-Hill, 2005.
[3] D. N. Gujarati and D. C. Porter, Basic Econometrics, 5th ed. New York: McGraw-Hill, 2009.
[4] S. S. Shapiro and M. B. Wilk, “An Analysis of Variance Test for Normality (Complete Samples),” Biometrika, vol. 52, no. 3/4, pp. 591-611, 1965.
[5] J. Durbin and G. S. Watson, “Testing for Serial Correlation in Least Squares Regression I,” Biometrika, vol. 37, no. 3/4, pp. 409-428, 1950.
[6] J. Fox and S. Weisberg, An R Companion to Applied Regression, 3rd ed. Thousand Oaks, CA: Sage, 2019.
[7] W. N. Venables and B. D. Ripley, Modern Applied Statistics with S, 4th ed. New York: Springer, 2002.
[8] G. James, D. Witten, T. Hastie, and R. Tibshirani, An Introduction to Statistical Learning: with Applications in R, 2nd ed. New York: Springer, 2021.
[9] C. Sievert, Interactive Web-Based Data Visualization with R, plotly, and shiny. Boca Raton, FL: CRC Press, 2020.
[10] J. Cheng, B. Karambelkar, and Y. Xie, Leaflet: Create Interactive Web Maps with the JavaScript ‘Leaflet’ Library, R package, 2023.
La evaluación solicita que la metodología utilizada sea identificable y reproducible. El plan seguido en ambos casos es el siguiente:
planTrabajo <- tibble::tribble(
~Etapa, ~Accion, ~Evidencia,
1, "Carga y auditoría de calidad", "Dimensiones, tipos, faltantes, duplicados y rangos plausibles",
2, "Auditoría espacial", "IQR de coordenadas por zona original, KNN y trazabilidad del retag",
3, "Tratamiento de faltantes", "No imputar precio; mediana entera de parqueaderos por zona corregida × tipo",
4, "Construcción de submercados", "Casa / Zona Norte corregida y Apartamento / Zona Sur corregida",
5, "EDA y extremos marginales", "Distribuciones, IQR de precio/área, correlaciones, estrato y Plotly",
6, "Estimación MCO", "Modelo completo solicitado y parametrización K-1 del estrato",
7, "Outliers e influencia del modelo", "Residual studentizado, leverage, Cook, DFFITS y DFBETAS; sin eliminación automática",
8, "Validación y comparación", "Supuestos, VIF/GVIF, AIC y validación cruzada de 10 folds",
9, "Predicción", "Precio esperado e intervalos para los perfiles solicitados",
10, "Selección comercial", "Cinco ofertas priorizadas por presupuesto y cercanía al perfil, con mapa",
11, "Réplica", "Misma secuencia completa para apartamentos de Zona Sur"
)
tablaHtml(planTrabajo, "Anexo 1. Plan de trabajo reproducible", digitos = 0)
| Etapa | Accion | Evidencia |
|---|---|---|
| 1 | Carga y auditoría de calidad | Dimensiones, tipos, faltantes, duplicados y rangos plausibles |
| 2 | Auditoría espacial | IQR de coordenadas por zona original, KNN y trazabilidad del retag |
| 3 | Tratamiento de faltantes | No imputar precio; mediana entera de parqueaderos por zona corregida × tipo |
| 4 | Construcción de submercados | Casa / Zona Norte corregida y Apartamento / Zona Sur corregida |
| 5 | EDA y extremos marginales | Distribuciones, IQR de precio/área, correlaciones, estrato y Plotly |
| 6 | Estimación MCO | Modelo completo solicitado y parametrización K-1 del estrato |
| 7 | Outliers e influencia del modelo | Residual studentizado, leverage, Cook, DFFITS y DFBETAS; sin eliminación automática |
| 8 | Validación y comparación | Supuestos, VIF/GVIF, AIC y validación cruzada de 10 folds |
| 9 | Predicción | Precio esperado e intervalos para los perfiles solicitados |
| 10 | Selección comercial | Cinco ofertas priorizadas por presupuesto y cercanía al perfil, con mapa |
| 11 | Réplica | Misma secuencia completa para apartamentos de Zona Sur |
anexoComparacionModelos <- dplyr::bind_rows(
ajuste1$comparacion |> dplyr::mutate(Caso = "Vivienda 1 - Casa / Norte"),
ajuste2$comparacion |> dplyr::mutate(Caso = "Vivienda 2 - Apartamento / Sur")
) |>
dplyr::select(Caso, dplyr::everything())
tablaHtml(
anexoComparacionModelos,
"Anexo 2A. Comparación de modelos por caso",
digitos = 4
)
| Caso | Modelo | Formula | R2 | R2Ajustado | AIC | BIC | CVRMSE | CVR2 |
|---|---|---|---|---|---|---|---|---|
| Vivienda 1 - Casa / Norte | Completo | preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios | 0.6766 | 0.6731 | 8567.442 | 8607.885 | 157.3901 | 0.6331 |
| Vivienda 1 - Casa / Norte | ReducidoAIC | preciom ~ areaconst + estrato + parqueaderos + banios | 0.6762 | 0.6733 | 8566.190 | 8602.140 | 156.3602 | 0.6384 |
| Vivienda 2 - Apartamento / Sur | Completo | preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios | 0.7913 | 0.7908 | 33676.776 | 33730.324 | 90.8349 | 0.7921 |
anexoValidacionModelos <- dplyr::bind_rows(
supuestos1 |> dplyr::mutate(Caso = "Vivienda 1 - Casa / Norte"),
supuestos2 |> dplyr::mutate(Caso = "Vivienda 2 - Apartamento / Sur")
) |>
dplyr::select(Caso, dplyr::everything())
tablaHtml(
anexoValidacionModelos,
"Anexo 2B. Síntesis de validación de supuestos",
digitos = 4
)
| Caso | Supuesto | Prueba | Estadistico | ValorP | Decision | Criterio |
|---|---|---|---|---|---|---|
| Vivienda 1 - Casa / Norte | Normalidad de residuales | Shapiro-Wilk | 0.8145 | 0 | Se rechaza normalidad | p > 0.05 |
| Vivienda 1 - Casa / Norte | Varianza constante | Goldfeld-Quandt | 11.3393 | 0 | Se rechaza homocedasticidad | p > 0.05 |
| Vivienda 1 - Casa / Norte | Independencia / autocorrelación secuencial | Durbin-Watson | 1.7022 | 0 | Evidencia secuencial según el orden usado; interpretar con cautela | p > 0.05, con cautela en datos transversales |
| Vivienda 1 - Casa / Norte | Multicolinealidad | VIF/GVIF ajustado | 1.4877 |
|
Sin alerta relevante | VIF equivalente < 5 |
| Vivienda 2 - Apartamento / Sur | Normalidad de residuales | Shapiro-Wilk | 0.7848 | 0 | Se rechaza normalidad | p > 0.05 |
| Vivienda 2 - Apartamento / Sur | Varianza constante | Goldfeld-Quandt | 19.3018 | 0 | Se rechaza homocedasticidad | p > 0.05 |
| Vivienda 2 - Apartamento / Sur | Independencia / autocorrelación secuencial | Durbin-Watson | 1.7184 | 0 | Evidencia secuencial según el orden usado; interpretar con cautela | p > 0.05, con cautela en datos transversales |
| Vivienda 2 - Apartamento / Sur | Multicolinealidad | VIF/GVIF ajustado | 2.6267 |
|
Sin alerta relevante | VIF equivalente < 5 |
anexoOutliersModelos <- dplyr::bind_rows(
resumenInfluencia1 |> dplyr::mutate(Caso = "Vivienda 1 - Casa / Norte"),
resumenInfluencia2 |> dplyr::mutate(Caso = "Vivienda 2 - Apartamento / Sur")
) |>
dplyr::select(Caso, dplyr::everything())
tablaHtml(
anexoOutliersModelos,
"Anexo 2C. Síntesis de outliers, leverage e influencia",
digitos = 4
)
| Caso | Diagnostico | Criterio | Casos | Porcentaje |
|---|---|---|---|---|
| Vivienda 1 - Casa / Norte | Residual studentizado | |r_i| > 3 | 16 | 2.4206 |
| Vivienda 1 - Casa / Norte | Leverage | h_ii > 2p/n = 0.0212 | 75 | 11.3464 |
| Vivienda 1 - Casa / Norte | Distancia de Cook | D_i > 1 | 0 | 0.0000 |
| Vivienda 1 - Casa / Norte | DFFITS | |DFFITS| > 2√(p/n) = 0.2058 | 43 | 6.5053 |
| Vivienda 1 - Casa / Norte | DFBETAS | máx.|DFBETAS| > 2/√n = 0.0778 | 91 | 13.7670 |
| Vivienda 1 - Casa / Norte | Al menos una alerta | Cumple uno o más criterios | 113 | 17.0953 |
| Vivienda 2 - Apartamento / Sur | Residual studentizado | |r_i| > 3 | 40 | 1.4109 |
| Vivienda 2 - Apartamento / Sur | Leverage | h_ii > 2p/n = 0.0056 | 161 | 5.6790 |
| Vivienda 2 - Apartamento / Sur | Distancia de Cook | D_i > 1 | 1 | 0.0353 |
| Vivienda 2 - Apartamento / Sur | DFFITS | |DFFITS| > 2√(p/n) = 0.1062 | 154 | 5.4321 |
| Vivienda 2 - Apartamento / Sur | DFBETAS | máx.|DFBETAS| > 2/√n = 0.0376 | 351 | 12.3810 |
| Vivienda 2 - Apartamento / Sur | Al menos una alerta | Cumple uno o más criterios | 408 | 14.3915 |
estrato.estrato se reporta únicamente con Spearman en el
análisis de asociación; no se calcula Pearson porque su codificación
numérica no convierte las categorías en una escala de intervalo.zona no se correlaciona dentro de cada segmento porque
después del filtro es constante; su papel es geográfico y de
selección.factor y R utiliza
codificación de tratamiento con \(K-1\)
indicadores.VIFEquivalente = [GVIF^(1/(2Df))]^2 permite usar como
referencia el umbral de 5 de manera comparable.preciom no se imputa.parqueaderos se imputa por mediana dentro de
zona corregida × tipo, porque su proporción de faltantes es
sustancial y la mediana es robusta a extremos.