1 Introducción y contexto del problema

1.1 Enunciado y objetivo de la asesoría

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
)
Condiciones de las dos solicitudes de vivienda
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.

1.2 Diccionario de datos y naturaleza de las variables

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)
Diccionario analítico de variables
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.

2 Resumen ejecutivo

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.

3 Marco teórico y fundamentos estadísticos

3.1 Regresión lineal múltiple y estimación por mínimos cuadrados

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.

3.2 Variables categóricas y tratamiento del estrato

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.

3.3 Bondad de ajuste, inferencia y contribución de variables

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.

3.4 Validación de supuestos y multicolinealidad

El diagnóstico se realiza sobre el modelo seleccionado y combina evidencia gráfica y formal [1-3]:

  • Linealidad y forma funcional: residuos frente a valores ajustados.
  • Normalidad de los residuos: gráfico Q-Q y prueba de Shapiro-Wilk.
  • Homoscedasticidad: gráfico Scale-Location y prueba de Goldfeld-Quandt.
  • Influencia: residuos, leverage y distancia de Cook.
  • Independencia: Durbin-Watson se reporta por coherencia con el procedimiento del curso, pero se interpreta con cautela porque los datos son transversales y el orden de las filas no tiene significado temporal.
  • Multicolinealidad: VIF para términos de un grado de libertad y GVIF ajustado para factores [6].

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.

3.5 Selección y validación del modelo

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.

4 Filtro inicial, depuración y auditoría espacial

4.1 Dimensiones y estructura de los datos

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)
Dimensiones y control inicial de la base
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…

4.2 Valores faltantes, duplicados e imputación

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)
Valores faltantes y cardinalidad por variable
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

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.
  • Para los predictores con una ausencia prácticamente nula se utiliza eliminación por caso completo: la pérdida de información es mínima y evita introducir supuestos innecesarios.
  • 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.

4.2.1 Imputación de parqueaderos

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
  )
Imputación de parqueaderos por zona corregida y tipo de vivienda
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.

4.3 Outliers espaciales y retag de zona

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.

4.3.1 Método utilizado y por qué

El retag se realiza antes de construir base1 y base2:

  1. Detección por IQR de longitud y latitud dentro de cada zona original. El IQR es un criterio robusto que no exige normalidad y no se deja arrastrar por unos pocos puntos extremos. Se usa solo como screening: identifica candidatos, pero no decide cuál debe ser su nueva zona.
  2. Clasificación KNN con coordenadas estandarizadas. Los registros que no fueron marcados como atípicos forman la referencia geográfica. KNN resulta apropiado porque la variable a corregir (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.
  3. Retag de todo candidato. Cada candidato recibe una 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.

4.3.2 Evidencia en boxplots de coordenadas

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

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

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.

4.3.3 Resumen y trazabilidad del retag

transicionesZonas |>
  tablaHtml(
    "Resumen de transiciones de zona después de la auditoría espacial",
    digitos = 0
  )
Resumen de transiciones de zona después de la auditoría espacial
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
  )
Nivel de confianza de las correcciones espaciales
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.")
}
Detalle de registros cuya zona fue corregida
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
  )
Número de registros por zona antes y después del retag
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
  )
Impacto del retag sobre los dos segmentos solicitados
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.

4.3.4 Mapa interactivo de auditoría espacial

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.

4.4 Resultado final del preprocesamiento

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)
Trazabilidad completa del preprocesamiento
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.

5 Vivienda 1 - Casa en Zona Norte

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.

5.1 Filtro solicitado y comprobación

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)
Comprobación del filtro para Vivienda 1
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)
Primeros tres registros - Casa / Zona Norte después del retag
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
)
Trazabilidad de la zona utilizada para estimar la Vivienda 1
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)
Composición por estrato del filtro Casa / Zona Norte corregida
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.

5.1.1 Mapa de casas de Zona Norte después del retag

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.

5.2 Análisis exploratorio de variables

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.

5.2.1 Distribución de variables cuantitativas y estrato

resumenNumerico1 |>
  tablaHtml("Resumen descriptivo de variables cuantitativas - Vivienda 1", digitos = 2)
Resumen descriptivo de variables cuantitativas - Vivienda 1
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

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

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

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.

5.2.2 Valores extremos numéricos

atipicosIqr1 |>
  tablaHtml("Valores extremos continuos por IQR - Vivienda 1", digitos = 2)
Valores extremos continuos por IQR - Vivienda 1
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)
Casos extremos por IQR para inspección - Vivienda 1 (máximo 20)
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.

5.2.3 Relación entre precio y área construida

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.

5.2.4 Precio según estrato y predictores discretos

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
)
Distribución del precio dentro de cada estrato - Vivienda 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.

5.2.5 Matriz de correlaciones cuantitativas

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
)
Matriz de correlación de Pearson entre variables cuantitativas - Vivienda 1
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

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.

5.2.6 Asociaciones bivariadas

asociaciones1 |>
  tablaHtml("Asociación bivariada con el precio - Vivienda 1", digitos = 3)
Asociación bivariada con el precio - Vivienda 1
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.

5.3 Estimación, interpretación y contribución de variables

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. \]

5.3.1 Codificación del factor estrato

codificacionEstrato1 |>
  tablaHtml("Codificación dummy del factor estrato - Vivienda 1", digitos = 0)
Codificación dummy del factor estrato - Vivienda 1
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)
Coeficientes e interpretación contextual - modelo completo Vivienda 1
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)
Bondad de ajuste - modelo completo Vivienda 1
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.

5.3.2 Contribución global de cada variable y del factor estrato

contribuciones1 |>
  tablaHtml("Contribución única de los predictores - Vivienda 1", digitos = 4)
Contribución única de los predictores - Vivienda 1
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.

5.3.3 Comparación de especificaciones

ajuste1$comparacion |>
  tablaHtml("Comparación del modelo completo y la alternativa reducida - Vivienda 1", digitos = 4)
Comparación del modelo completo y la alternativa reducida - Vivienda 1
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.

5.4 Validación de supuestos

par(mfrow = c(2, 2))
plot(modelo1Final)
Diagnósticos gráficos del modelo final - Vivienda 1

Diagnósticos gráficos del modelo final - Vivienda 1

par(mfrow = c(1, 1))

5.4.1 Observaciones atípicas, leverage e influencia

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)
Diagnóstico formal de observaciones atípicas e influencia - Vivienda 1
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

Residuales studentizados, leverage y distancia de Cook - Vivienda 1

casosInfluencia1 |>
  tablaHtml("Observaciones con alertas diagnósticas - Vivienda 1 (máximo 20)", digitos = 4)
Observaciones con alertas diagnósticas - Vivienda 1 (máximo 20)
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)
Validación de supuestos - Vivienda 1
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)
VIF/GVIF ajustado - Vivienda 1
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.

5.5 Estimación puntual para la solicitud

prediccion1 |>
  mutate(
    Presupuesto = 350,
    CumplePrecioEsperado = PrecioEstimado <= Presupuesto
  ) |>
  tablaHtml("Predicción de precio para la Vivienda 1", digitos = 2)
Predicción de precio para la Vivienda 1
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.

5.6 Cinco ofertas potenciales

ofertas1 |>
  select(
    id, barrio, estrato, preciom, PrecioEstimadoModelo,
    areaconst, habitaciones, parqueaderos, banios,
    CumpleEstricto, DistanciaPerfil, BrechaModeloMenosPrecio,
    longitud, latitud
  ) |>
  tablaHtml("Cinco ofertas priorizadas - Vivienda 1", digitos = 2)
Cinco ofertas priorizadas - Vivienda 1
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

5.6.1 Mapa de ofertas priorizadas - Vivienda 1

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.

6 Vivienda 2 - Apartamento en Zona Sur

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.

6.1 Filtro solicitado y comprobació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)
Comprobación del filtro para Vivienda 2
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)
Primeros tres registros - Apartamento / Zona Sur después del retag
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
)
Trazabilidad de la zona utilizada para estimar la Vivienda 2
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)
Composición por estrato del filtro Apartamento / Zona Sur corregida
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.

6.1.1 Mapa de apartamentos de Zona Sur después del retag

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.

6.2 Análisis exploratorio de variables

6.2.1 Distribución de variables cuantitativas y estrato

resumenNumerico2 |>
  tablaHtml("Resumen descriptivo de variables cuantitativas - Vivienda 2", digitos = 2)
Resumen descriptivo de variables cuantitativas - Vivienda 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

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

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

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.

6.2.2 Valores extremos numéricos

atipicosIqr2 |>
  tablaHtml("Valores extremos continuos por IQR - Vivienda 2", digitos = 2)
Valores extremos continuos por IQR - Vivienda 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)
Casos extremos por IQR para inspección - Vivienda 2 (máximo 20)
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.

6.2.3 Relación entre precio y área construida

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.

6.2.4 Precio según estrato y predictores discretos

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
)
Distribución del precio dentro de cada estrato - Vivienda 2
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.

6.2.5 Matriz de correlaciones cuantitativas

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
)
Matriz de correlación de Pearson entre variables cuantitativas - Vivienda 2
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

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.

6.2.6 Asociaciones bivariadas

asociaciones2 |>
  tablaHtml("Asociación bivariada con el precio - Vivienda 2", digitos = 3)
Asociación bivariada con el precio - Vivienda 2
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.

6.3 Estimación, interpretación y contribución de variables

6.3.1 Codificación del factor estrato

codificacionEstrato2 |>
  tablaHtml("Codificación dummy del factor estrato - Vivienda 2", digitos = 0)
Codificación dummy del factor estrato - Vivienda 2
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.

6.3.2 Coeficientes y bondad de ajuste

coeficientes2 |>
  tablaHtml("Coeficientes e interpretación contextual - modelo completo Vivienda 2", digitos = 4)
Coeficientes e interpretación contextual - modelo completo Vivienda 2
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)
Bondad de ajuste - modelo completo Vivienda 2
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.

6.3.3 Contribución global de cada variable y del factor estrato

contribuciones2 |>
  tablaHtml("Contribución única de los predictores - Vivienda 2", digitos = 4)
Contribución única de los predictores - Vivienda 2
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.

6.3.4 Comparación de especificaciones

ajuste2$comparacion |>
  tablaHtml("Comparación del modelo completo y la alternativa reducida - Vivienda 2", digitos = 4)
Comparación del modelo completo y la alternativa reducida - Vivienda 2
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.

6.4 Validación de supuestos

par(mfrow = c(2, 2))
plot(modelo2Final)
Diagnósticos gráficos del modelo final - Vivienda 2

Diagnósticos gráficos del modelo final - Vivienda 2

par(mfrow = c(1, 1))

6.4.1 Observaciones atípicas, leverage e influencia

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)
Diagnóstico formal de observaciones atípicas e influencia - Vivienda 2
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

Residuales studentizados, leverage y distancia de Cook - Vivienda 2

casosInfluencia2 |>
  tablaHtml("Observaciones con alertas diagnósticas - Vivienda 2 (máximo 20)", digitos = 4)
Observaciones con alertas diagnósticas - Vivienda 2 (máximo 20)
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)
Validación de supuestos - Vivienda 2
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)
VIF/GVIF ajustado - Vivienda 2
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.

6.5 Estimación puntual para la solicitud

prediccion2 |>
  mutate(
    Presupuesto = 850,
    CumplePrecioEsperado = PrecioEstimado <= Presupuesto
  ) |>
  tablaHtml("Predicción de precio para la Vivienda 2", digitos = 2)
Predicción de precio para la Vivienda 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.

6.6 Cinco ofertas potenciales

ofertas2 |>
  select(
    id, barrio, estrato, preciom, PrecioEstimadoModelo,
    areaconst, habitaciones, parqueaderos, banios,
    CumpleEstricto, DistanciaPerfil, BrechaModeloMenosPrecio,
    longitud, latitud
  ) |>
  tablaHtml("Cinco ofertas priorizadas - Vivienda 2", digitos = 2)
Cinco ofertas priorizadas - Vivienda 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

6.6.1 Mapa de ofertas priorizadas - Vivienda 2

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.

7 Comparación final y conclusiones

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)
Comparación ejecutiva de los dos casos
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.

7.1 Conclusiones sobre el preprocesamiento

  1. La zona debía corregirse, no solo marcarse. Las Figuras @ref(fig:boxplotLongitudRetag) y @ref(fig:boxplotLatitudRetag) identifican candidatos espaciales y el mapa de la Sección @ref(mapaAuditoriaEspacial) permite encender por separado los registros corregidos hacia Norte, Sur, Oriente y Oeste. En total se corrigieron 476 etiquetas; la transición dominante es Zona Norte → Zona Sur con 192 registros. La Tabla @ref(tab:impactoRetagSegmentos) muestra que esta decisión cambia directamente las muestras de Norte y Sur, por lo que debía ejecutarse antes del filtro final.
  2. El retag y la imputación tienen funciones distintas. Primero se corrige la ubicación; después se imputa parqueaderos dentro del submercado ya corregido. Alterar ese orden podría usar información de una zona equivocada para completar un valor faltante.
  3. La imputación de parqueaderos está justificada por magnitud. La Figura @ref(fig:graficaFaltantes) muestra que 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.
  4. No todo valor extremo debe eliminarse. El IQR se utiliza solo como pantalla exploratoria para precio y área; los conteos discretos se revisan mediante sus distribuciones y no se etiquetan mecánicamente como outliers. Las Tablas @ref(tab:atipicosIqrBase1) y @ref(tab:atipicosIqrBase2) documentan extremos continuos. Después del ajuste, las Tablas @ref(tab:resumenInfluenciaBase1) y @ref(tab:resumenInfluenciaBase2) aplican los criterios del curso —residual studentizado, leverage, Cook, DFFITS y DFBETAS— para distinguir extremos marginales de observaciones potencialmente influyentes. La Vivienda 1 presenta 16 outliers de respuesta y ningún Cook > 1; la Vivienda 2 presenta 40 outliers de respuesta y un único Cook > 1. No se elimina ninguna observación por estos criterios; cuando una alerta es fuerte, la acción metodológicamente correcta es verificar el registro y contextualizarlo antes de decidir cualquier exclusión.
  5. El estrato se maneja según su naturaleza ordinal. No se reportan media, varianza ni desviación estándar. Las Tablas @ref(tab:composicionEstratoFiltro1) y @ref(tab:composicionEstratoFiltro2) utilizan frecuencias y porcentajes, y las Tablas @ref(tab:codificacionEstratoBase1) y @ref(tab:codificacionEstratoBase2) muestran la parametrización \(K-1\) usada en regresión.

7.2 Conclusiones sobre la Vivienda 1

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.

7.3 Conclusiones sobre la Vivienda 2

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.

7.4 Recomendación ejecutiva para C&A

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.

8 Referencias

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

9 Anexos

9.1 Anexo 1 - Plan de trabajo

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)
Anexo 1. Plan de trabajo reproducible
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

9.2 Anexo 2 - Resultados de modelación, validación y comparación

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
)
Anexo 2A. Comparación de modelos por caso
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
)
Anexo 2B. Síntesis de validación de supuestos
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
)
Anexo 2C. Síntesis de outliers, leverage e influencia
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

9.3 Criterios estadísticos utilizados

9.3.1 Correlación y asociación

  • Pearson se emplea para describir asociación lineal entre variables cuantitativas.
  • Spearman complementa la lectura cuando la relación es monotónica, existen valores extremos o interviene una variable ordinal como 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.

9.3.2 Factor estrato y multicolinealidad

  • El estrato se convierte en factor y R utiliza codificación de tratamiento con \(K-1\) indicadores.
  • El primer nivel observado actúa como referencia y queda representado por ceros en las dummies.
  • Omitir una categoría evita dependencia lineal perfecta entre el intercepto y el conjunto de indicadores.
  • Para factores de varios grados de libertad se reporta GVIF y su transformación ajustada. VIFEquivalente = [GVIF^(1/(2Df))]^2 permite usar como referencia el umbral de 5 de manera comparable.
  • La contribución conjunta del factor se evalúa con prueba F tipo II, \(R^2\) parcial y reducción del \(R^2\) al retirar todo el término.

9.3.3 Outliers y retag espacial

  • El IQR de longitud y latitud detecta candidatos dentro de cada zona original; no determina por sí mismo la nueva etiqueta.
  • KNN usa exclusivamente coordenadas estandarizadas y registros espaciales no atípicos como referencia.
  • Todo candidato recibe una zona sugerida. Si difiere de la original, se retaggea; si coincide, el registro queda como atípico espacial confirmado en su zona.
  • El consenso de KNN se conserva como indicador de confianza para auditoría.
  • Después del retag y del filtro de cada submercado, el IQR se usa solo para explorar extremos marginales de precio y área; no se usa como regla de exclusión.
  • En el modelo final, un outlier de respuesta se identifica con \(|r_i|>3\); leverage alto con \(h_{ii}>2p/n\); influencia con Cook \(D_i>1\), \(|DFFITS_i|>2\sqrt{p/n}\) y \(|DFBETAS_{ij}|>2/\sqrt{n}\).
  • Las alertas diagnósticas se reportan e investigan, pero ninguna observación se elimina automáticamente.

9.3.4 Imputación

  • preciom no se imputa.
  • Los predictores con ausencia mínima se manejan por caso completo.
  • 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.
  • El valor se lleva a entero para respetar la naturaleza de conteo.

9.3.5 Supuestos

  • Linealidad y patrón de residuos: Residuals vs Fitted.
  • Normalidad: gráfico Q-Q y Shapiro-Wilk.
  • Homocedasticidad: Scale-Location y Goldfeld-Quandt.
  • Influencia: Residuals vs Leverage y distancia de Cook.
  • Independencia: Durbin-Watson se reporta por coherencia con el material del curso, con cautela porque los datos son transversales.
  • Multicolinealidad: VIF/GVIF ajustado después de la codificación factorial.

9.3.6 Comparación de modelos

  • Línea base: modelo completo exigido por el enunciado.
  • Alternativa: reducción backward por AIC.
  • Validación: 10-fold cross-validation con RMSE y \(R^2\).
  • La reducción solo se adopta si disminuye AIC y no empeora materialmente el RMSE de validación; la selección no se basa únicamente en valores p del modelo ajustado.