Descripción

Este informe presenta el análisis de una base de datos que contiene la información del mercado de viviendas urbanas de la ciudad de Cali con el fin de ayudar a la compañía C&A a realizar una asesoría sobre la compra de dos viviendas. Para ello, se construyó un modelo de regresión lineal múltiple para cada solicitud.

Objetivos

Objetivo general

Utilizar técnicas de modelación estadística para construir dos modelos de regresión lineal múltiple que permitan apoyar la recomendación de viviendas que cumplan con las características solicitadas.

Objetivos específicos

  • Filtrar y depurar la base de datos según las características de cada solicitud.
  • Realizar un Análisis Exploratorio de Datos.
  • Construir dos modelos de regresión lineal múltiple que permitan explicar el precio de las viviendas.
  • Validar los supuestos de los modelos construidos.
  • Realizar predicciones del precio para las viviendas solicitadas.
  • Identificar viviendas que cumplan con las características requeridas y el presupuesto de los clientes.

Base de datos y variables

La base de datos contiene la información de 8322 viviendas y sus atributos. La descripción de cada atributo y su clasificación según su naturaleza se encuentra en el Anexo 0.

Filtro de la base de datos

Zona Norte

Se construyó un subset que contiene la información de las casas ubicadas en el norte de la ciudad (Anexo 1).

Seguidamente se hizo una revisión de la aplicación del filtro. Primero, se visualizó la frecuencia de las zonas en el subset (Anexo 1). Se evidenció que sólo hay casas con la categoría “Zona Norte”.

Luego, se visualizó la frecuencia de los tipos de vivienda en el subset (Anexo 1). Se notó que el subset sólo contiene registros con tipo “Casa”.

Luego se realizó una tabla cruzada para confirmar que los registros cumplan tanto con la condición de tener tipo de vivienda “Casa” como con la de tener zona “Zona Norte” (Anexo 1). Se nota que 722 registros cumplen la condición.

Dada las 3 comprobaciones anteriores, se concluye que el filtro se realizó correctamente. A continuación, se realizó un mapa con las coordenadas de las viviendas para revisar si hay registros con la zona incorrecta (Anexo 2).

Zona Sur

Se construyó un segundo subset que contiene la información de los apartamentos ubicados en el sur de la ciudad (Anexo 3).

Seguidamente se hizo una revisión de la aplicación del filtro. Primero, se visualizó la frecuencia de las zonas en el subset (Anexo 3). Se evidenció que sólo hay apartamentos con la categoría “Zona Sur”.

Luego, se visualizó la frecuencia de los tipos de vivienda en el subset (Anexo 3). Se notó que el subset sólo contiene registros con tipo “Apartamento”.

Luego se realizó una tabla cruzada para confirmar que los registros cumplan tanto con la condición de tener tipo de vivienda “Apartamento” como con la de tener zona “Zona Sur” (Anexo 3). Se nota que 2787 registros cumplen la condición.

Dada las 3 comprobaciones anteriores, se concluye que el filtro se realizó correctamente. A continuación, se realizó un mapa con las coordenadas de las viviendas para revisar si hay registros con la zona incorrecta (Anexo 4).

Tanto en Anexo 2 como en el Anexo 4, la mayor parte de los puntos se concentran en un mismo sector, por lo que se considera que la mayoría de los registros están en una zona geográfica similar.

Sin embargo, también se observan puntos dispersos ubicados en otras áreas del mapa. Esto puede explicarse por factores como errores en la ubicación de las direcciones, coordenadas aproximadas asignadas a algunos registros o diferencias entre la clasificación de las zonas utilizada al hacer el dataset y los límites geográficos reales de Cali.

Por lo anterior, se decidió filtrar nuevamente utilizando las coordenadas de las viviendas en vez de la zona.

Para iniciar, se convirtieron las coordenadas del dataset en puntos espaciales. Se eliminaron los NAs debido a que la función st_as_sf no los permite.

Seguidamente, se descargó la capa de barrios oficial de la ciudad de Cali [1].

Luego, se clasificaron los registros para saber a qué comuna pertenece cada uno según sus coordenadas (Anexo 5).

Seguidamente, se tomó un mapa de las comunas por zonas [2] para hacer la reclasificación.

Luego de la reclasificación, se realizaron nuevamente los gráficos para observar la ubicación de las viviendas (Anexo 6 y Anexo 7). En el Anexo 6, se nota que ya las viviendas de la zona norte no se encuentran por debajo de la latitud 3.45, y, en el Anexo 7 que las viviendas de la zona sur no están por encima de la latitud 3.41. Por lo que se concluye que la reclasificación funcionó de forma exitosa y se utilizarán estos nuevos subsets para el análisis posterior.

Análisis Exploratorio de datos

Con el fin de analizar la asociación entre las variables de respuesta (precio de la vivienda) en función del área construida, estrato, número de baños, número de habitaciones, zona donde se ubica la vivienda y parqueaderos, se realizó un análisis exploratorio de datos. En este análisis se utilizaron diversas técnicas estadísticas dependiendo de las variables. Para complementar el análisis, se hicieron gráficos interactivos que muestran cómo se comporta cada relación.

Precio - Área construida

Dado que el área construida es una variable cuantitativa, se estimó un modelo de regresión lineal simple para evaluar su relación con el precio de la vivienda (Anexo 8). Este modelo se evalúa mediante la prueba F que tiene las siguientes hipótesis:

\[ H_0: \text{El área construida no tiene efecto sobre el precio}\] \[ H_1: \text{El área construida sí tiene efecto sobre el precio}\]

Como p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que el área construida sí tiene incidencia sobre el precio de la vivienda.

El gráfico interactivo se muestra en el Anexo 9. Este gráfico muestra una relación positiva entre el área construida y el precio de la vivienda.

Precio - Estrato

El estrato corresponde a una variable categórica, por lo que se utilizó un análisis de varianza para evaluar esta relación (Anexo 10). En este método se evalúan las siguientes hipótesis:

\[H_0: \text{los precios promedios de las viviendas son iguales para todos los estratos}\]

\[H_1: \text{al menos uno de los estratos tiene un precio promedio diferente}\]

Como p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que al menos uno de los estratos tiene un precio promedio diferente.

El gráfico interactivo se muestra en el Anexo 11. Este gráfico muestra que a medida que aumenta el estrato la mediana también aumenta, lo que da indicios de una relación positiva entre las variables.

Precio - Número de baños

Como número de baños es una variable cuantitativa, se empleó también un modelo de regresión lineal simple (Anexo 12). Las hipótesis son:

\[ H_0: \text{El número de baños no tiene efecto sobre el precio}\] \[ H_1: \text{El número de baños sí tiene efecto sobre el precio}\]

Como p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que el número de baños sí tiene incidencia sobre el precio de la vivienda.

El gráfico interactivo se muestra en el Anexo 13. Este gráfico confirma que sí existe una relación entre el precio y el número de baños, y que en general, al aumentar el número de baños aumenta el precio.

Precio - Número de habitaciones

El número de habitaciones es una variable cuantitativa, por lo cual se empleó también un modelo de regresión lineal simple (Anexo 14). Las hipótesis son:

\[ H_0: \text{El número de habitaciones no tiene efecto sobre el precio}\] \[ H_1: \text{El número de habitaciones sí tiene efecto sobre el precio}\]

Como p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que el número de habitaciones sí tiene incidencia sobre el precio de la vivienda.

El gráfico interactivo se muestra en el Anexo 15. Este gráfico confirma que el número de habitaciones sí varía el precio de la vivienda.

Precio - Parqueaderos

Número de parqueaderos es una variable numérica, así que se empleó un modelo de regresión lineal simple para evaluar la asociación (Anexo 16). Las hipótesis son:

\[ H_0: \text{El número de parqueaderos no tiene efecto sobre el precio}\] \[ H_1: \text{El número de parqueaderos sí tiene efecto sobre el precio}\]

Como p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que el número de parqueaderos sí tiene incidencia sobre el precio de la vivienda.

El gráfico interactivo se muestra en el Anexo 17. Este gráfico confirma que el precio varía según el número de parqueaderos.

Matriz de correlaciones

Finalmente se generó una matriz de correlaciones para analizar las relaciones entre las variables predictoras (Anexo 18). En esta matriz, se notó que hay una relación moderada entre el número de baños y el número de habitaciones, y, el número de baños y el área construida. No se observan relaciones muy fuertes entre las variables.

Caso 1 - Vivienda Norte

Estimación del modelo

A continuación se realizó la estimación de un modelo de regresión lineal con las variables área construida, estrato, número de baños, número de habitaciones y número de parqueaderos (Anexo 19). No se incluyó la variable zona debido a que el subset ya contiene sólo registros clasificados como Zona Norte.

Modelo obtenido:

\[Precio = -236.22 + 0.70(\text{Área}) + 93.29(\text{Estrato}) + 27.82(\text{Baños}) -16.67(\text{Habitaciones}) + 38.18(\text{Parqueaderos})\]

En este modelo se observó que el coeficiente estimado para el área construida es 0.70 y es altamente significativo. Es decir que un incremento de una unidad en el área construida genera un aumento promedio de 0.70 unidades en el precio de la vivienda.

Por su parte, el coeficiente del estrato es 93.29 y también es altamente significativo. Por lo tanto un aumento de un nivel en el estrato está relacionado con un aumento promedio de 93.29 unidades en el precio de la vivienda.

En el caso del número de baños el coeficiente es 27.82 y es estadísticamente significativo. Lo que quiere decir que por cada baño extra el precio aumenta 27.82 unidades.

El coeficiente estimado del número de habitaciones es -16.67 y es estadísticamente significativo. Es decir que el precio disminuye 16.67 unidades por cada habitación extra, lo cual tiene sentido si hay muchas habitaciones en un área pequeña.

El número de parqueaderos tiene un coeficiente estimado de 38.18 y es estadísticamente significativo. Quiere decir que por cada parqueadero extra el precio aumenta 38.18 unidades.

El coeficiente \(R^2\) indica que aproximadamente el 60.16% de la variabilidad en el precio de la vivienda puede ser explicada por las variables incorporadas. El \(R^2\) ajustado es muy cercano a \(R^2\), por lo cual las variables usadas aportan información relevante y que no se observan indicios importantes de sobreajuste en el modelo.

Para mejorar el modelo se podrían incorporar otras variables que podrían estar relacionadas con el precio de las viviendas (barrio, antigüedad, cercanía a vías principales, etc.).

Validación de supuestos

Normalidad de los residuos

Se realizó un Q-Q plot (Anexo 20) para evaluar la normalidad de los residuos.

En el Anexo 20 se evidencia que la mayoría de los puntos están sobre la línea de referencia, sin embargo, se decidió hacer un test Shapiro-Wilk para evaluar la normalidad más certeramente (Anexo 21). Este test revisa las siguientes hipótesis:

\[ H_0 = \text{Los residuos siguen una distribución normal}\]

\[H_1 = \text{Los residuos no siguen una distribución normal}\]

Debido a que el p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que los residuos no siguen una distribución normal. Para mejorar el cumplimiento de este supuesto, se podrían aplicar transformaciones sobre la variable respuesta.

Homocedasticidad

Para el supuesto de homocedasticidad se realizó un test de Goldfeld-Quandt (Anexo 22), el cual evalúa las siguientes hipótesis:

\[H_0: Homocedasticidad \]

\[H_1: Heterocedasticidad\]

Debido a que p-value es menor a 0.05, se rechaza la hipótesis nula. Es decir que el supuesto de varianza constante no se cumple. Para mejorar el cumplimiento de este supuesto, se podrían aplicar transformaciones sobre la variable respuesta y algunas variables predictoras.

Independencia de los errores

Para evaluar la independencia de los errores se empleó el test de Durbin-Watson (Anexo 23). Este test tiene las siguientes hipótesis:

\[H_0: \text{los errores son independientes}\]

\[H_1: \text{los errores no son independientes}\]

Ya que p-value es menor a 0.05, se rechaza la hipótesis nula y por lo tanto no se cumple el supuesto de independencia de los errores.

Estimación puntual

A continuación se hizo una estimación con las características requeridas para la vivienda del norte. A partir de esta estimación se obtuvo que la casa que se espera adquirir posiblemente tendrá un valor alrededor de 305 millones, por lo cual es aceptable dado el presupuesto.

##        1 
## 304.9584

Respuesta a la solicitud

Se calcularon los precios para todas las viviendas de la zona norte utilizando el modelo y se intentó filtrar con las características requeridas. Sin embargo, utilizando los precios estimados por el modelo no se encontraron viviendas que cumplieran todo lo requerido, así que se incluyó el estrato 3 en la búsqueda.

A continuación se muestran en un mapa todas las opciones encontradas con el id del inmueble (Figura 1):

Figura 1. Mapa de las ofertas vivienda 1

Figura 1. Mapa de las ofertas vivienda 1

Todas las ofertas presentadas en la Figura 1 cumplen con las características mínimas requeridas a excepción del estrato que no es 4 ni 5 sino 3. De estas viviendas, según el modelo, la mejor sería la que tiene id 124 ya que tiene un área de 400 \(m^2\), 1 parqueadero, 3 baños y 7 habitaciones. Sin embargo, tanto esa vivienda como otras dos tienen un valor real por fuera del presupuesto, por lo que si no se contara con dicho valor, se le estaría dando una mala oferta al cliente, especialmente por qué sí hay viviendas en estrato 4 y 5 que cumplen con las características pero que el modelo les asignó un precio mayor.

Caso 2 - Vivienda Sur

Estimación del modelo

Estimación del modelo de regresión lineal con las variables área construida, estrato, número de baños, número de habitaciones y número de parqueaderos (Anexo 24).

Modelo obtenido:

\[Precio = -279.40 + 1.28(\text{Área}) + 55.59(\text{Estrato}) + 57.96(\text{Baños}) -20.90(\text{Habitaciones}) + 85.23(\text{Parqueaderos})\]

A partir del modelo generado, se observa que para el área construida el coeficiente estimado es 1.28 y la variable es estadísticamente significativa. Es decir que por cada unidad de área que aumenta, el precio de la vivienda aumenta 1.28.

En el caso del estrato, el coeficiente estimado es 55.59 y también es estadísticamente significativo. Es decir que por cada unidad, el precio de la vivienda aumenta 55.59.

Para el número de baños el coeficiente estimado es 57.96 y es estadísticamente significativo. Es decir que por cada baño extra el precio de la vivienda aumenta en 57.96.

En cuanto al número de habitaciones, el coeficiente estimado fue -20.90 y es estadísticamente significativo. Este valor negativo se explica debido a que al mantener el área constante, si se tienen muchas habitaciones en un espacio pequeño, esto se podría asumir como mala distribución y bajaría el precio del inmueble.

El número de parqueaderos tiene un coeficiente estimado 85.23 y es estadísticamente significativo. Esto significa que por cada parqueadero extra el precio aumenta 85.23 unidades.

En cuanto al \(R^2\), indica que aproximadamente el 76.31% de la variabilidad en el precio puede explicarse con las variables utilizadas en el modelo. El \(R^2\) ajustado es muy cercano al \(R^2\), por lo cual las variables incluidas aportan información importante y que no se observan indicios importantes de sobreajuste en el modelo.

Para mejorar el modelo se podrían incorporar otras variables que podrían estar relacionadas con el precio de las viviendas (barrio, antigüedad, cercanía a vías principales, etc.).

Validación de supuestos

Se realizó un Q-Q plot (Anexo 25) para evaluar la normalidad de los residuos.

En el Anexo 25 se evidencia que la mayoría de los puntos están sobre la línea de referencia, sin embargo, se decidió hacer un test Shapiro-Wilk para evaluar la normalidad (Anexo 26).

Debido a que el p-value es menor a 0.05, se rechaza la hipótesis nula, es decir que los residuos no siguen una distribución normal. Para mejorar el cumplimiento de este supuesto, se podrían aplicar transformaciones sobre la variable respuesta.

Homocedasticidad

Para el supuesto de homocedasticidad se realizó un test de Goldfeld-Quandt (Anexo 27).

Debido a que p-value es mayor a 0.05, no se rechaza la hipótesis nula. Es decir que el supuesto de varianza constante se cumple.

Independencia de los errores

Para evaluar la independencia de los errores se empleó el test de Durbin-Watson (Anexo 28).

Debido a que p-value es menor a 0.05, se rechaza la hipótesis nula. Es decir que los errores no son independientes. Para mejorar este supuesto, podrían incluirse variables adicionales relacionadas con la localización específica de la vivienda o características del barrio que permitan diferenciar mejor las zonas.

A continuación se hizo una estimación con las características requeridas para la vivienda del sur. A partir de esta estimación se obtuvo que el apartamento que se espera adquirir posiblemente tendrá un valor alrededor de 707 millones, lo cual está dentro del presupuesto.

##        1 
## 706.8615

Respuesta a la solicitud

Se calcularon los precios para todas las viviendas de la zona sur utilizando el modelo y se intentó filtrar por las características mínimas, sin embargo, no se encontraron opciones que cumplieran con todo lo requerido, así que dejó un holgamiento de 140 \(m^2\) menos en el área construída y de 1 parqueadero menos para poder tener al menos 5 ofertas que presentar al cliente. También se incluyó el estrato 4 en la búsqueda. Se mantuvo el presupuesto en vez de incrementar esta variable porque se considera más rígida que las demás. El número de habitaciones y de baños requeridos se mantuvo por ser menos flexible al estar atado al número de personas que van a vivir en el inmueble.

A continuación se muestran en un mapa todas las opciones encontradas con el id del inmueble (Figura 2):

Figura 2. Mapa de ofertas vivienda 2

Figura 2. Mapa de ofertas vivienda 2

En la Figura 2 se observa que la opción más cercana a lo requerido empleando el precio estimado por el modelo, es la vivienda con id 6086 que tiene 240 \(m^2\), 3 parqueaderos, 5 baños y 6 habitaciones. Sin embargo, el precio real es mucho mayor al estimado por el modelo y se sale del presupuesto. Si no se contara con dicho valor, sería una oferta errónea.

Conclusiones

Referencias

[1] “Capa de barrios de Santiago de Cali,” Datos Abiertos Cali. [En línea]. Disponible en: https://datos.cali.gov.co/dataset/capa-de-barrios-de-santiago-de-cali. [Accedido: 6-mar-2026].

[2] “Zonas geográficas - IDESC,” Alcaldía de Santiago de Cali. [En línea]. Disponible en: https://www.cali.gov.co/planeacion/publicaciones/169423/zonas-geograficas-idesc/. [Accedido: 6-mar-2026].

Anexos

Anexo 0

Tabla 1: Descripción detallada de las variables
Nombre Descripción Clasificación.por.naturaleza
id Número identificador de la vivienda Cualitativa nominal
Zona Zona donde se encuentra la vivienda Cualitativa nominal
Piso Piso en el que se encuentra la vivienda Cuantitativa discreta
Estrato Estrato social Cualitativa ordinal
Preciom Precio em millones de pesos Cuantitativa continua
Areaconst Área construida Cuantitativa continua
Parqueaderos Número de parqueaderos Cuantitativa discreta
Banios Número de baños Cuantitativa discreta
Habitaciones Número de habitaciones Cuantitativa discreta
Tipo Tipo de vivienda Cualitativa nominal
Barrio Barrio en el que se encuentra la vivienda Cualitativa nominal
Longitud Longitud en la que se encuentra la vivienda Cuantitativa continua
Latitud Latitud en la que se encuentra la vivienda Cuantitativa continua

Anexo 1 - Comprobación del filtro para casas en zona norte

## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1209 Zona N… 02          5     320       150            2      4            6
## 2  1592 Zona N… 02          5     780       380            2      3            3
## 3  4057 Zona N… 02          6     750       445           NA      7            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## 
## Zona Norte 
##        722
## 
## Casa 
##  722
##       
##        Zona Norte
##   Casa        722

Anexo 2

Figura 3. Mapa de las casas clasificadas como zona norte

Figura 3. Mapa de las casas clasificadas como zona norte

Anexo 3 - Comprobación del filtro para apartamentos en zona sur

## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5098 Zona S… 05          4     290        96            1      2            3
## 2   698 Zona S… 02          3      78        40            1      1            2
## 3  8199 Zona S… <NA>        6     875       194            2      5            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## 
## Zona Sur 
##     2787
## 
## Apartamento 
##        2787
##              
##               Zona Sur
##   Apartamento     2787

Anexo 4

Figura 4. Mapa de los apartamentos clasificados como zona sur

Figura 4. Mapa de los apartamentos clasificados como zona sur

Anexo 5

## Simple feature collection with 6 features and 16 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -76.54 ymin: 3.36971 xmax: -76.51168 ymax: 3.45891
## Geodetic CRS:  WGS 84
## # A tibble: 6 × 17
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 8 more variables: tipo <chr>, barrio.x <chr>, geometry <POINT [°]>,
## #   id_barrio <chr>, barrio.y <chr>, comuna <chr>, shape_leng <dbl>,
## #   shape_area <dbl>

Anexo 6

Figura 5. Mapa de las casas reclasificadas como zona norte

Figura 5. Mapa de las casas reclasificadas como zona norte

Anexo 7

Figura 6. Mapa de los apartamentos reclasificados como zona sur

Figura 6. Mapa de los apartamentos reclasificados como zona sur

Anexo 8

## 
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda_clasificada)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2659.88  -120.78   -47.55    67.27  1330.10 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 157.47636    4.13640   38.07   <2e-16 ***
## areaconst     1.58018    0.01831   86.30   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 238.7 on 8317 degrees of freedom
## Multiple R-squared:  0.4725, Adjusted R-squared:  0.4724 
## F-statistic:  7448 on 1 and 8317 DF,  p-value: < 2.2e-16

Anexo 9

Figura 7. Gráfico interactivo precio-área

Anexo 10

##                   Df    Sum Sq   Mean Sq F value Pr(>F)    
## factor(estrato)    3 394593057 131531019    2170 <2e-16 ***
## Residuals       8315 503923112     60604                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Anexo 11

Figura 8. Gráfico interactivo precio-estrato

Anexo 12

## 
## Call:
## lm(formula = preciom ~ banios, data = vivienda_clasificada)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1319.67  -124.74   -37.78    58.24  1695.19 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -45.195      6.420   -7.04 2.07e-12 ***
## banios       153.986      1.875   82.12  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 244.3 on 8317 degrees of freedom
## Multiple R-squared:  0.4478, Adjusted R-squared:  0.4477 
## F-statistic:  6743 on 1 and 8317 DF,  p-value: < 2.2e-16

Anexo 13

Figura 9. Gráfico interactivo precio-número de baños

Anexo 14

## 
## Call:
## lm(formula = preciom ~ habitaciones, data = vivienda_clasificada)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -594.19 -198.43  -97.90   91.57 1552.10 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   219.496      9.263   23.70   <2e-16 ***
## habitaciones   59.469      2.382   24.97   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 317 on 8317 degrees of freedom
## Multiple R-squared:  0.06974,    Adjusted R-squared:  0.06963 
## F-statistic: 623.6 on 1 and 8317 DF,  p-value: < 2.2e-16

Anexo 15

Figura 10. Gráfico interactivo precio-número de habitaciones

Anexo 16

## 
## Call:
## lm(formula = preciom ~ parqueaderos, data = vivienda_clasificada)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1953.61  -132.68   -47.57    72.43  1502.43 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    92.453      5.673   16.30   <2e-16 ***
## parqueaderos  205.116      2.635   77.83   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 242.9 on 6715 degrees of freedom
##   (1602 observations deleted due to missingness)
## Multiple R-squared:  0.4743, Adjusted R-squared:  0.4742 
## F-statistic:  6058 on 1 and 6715 DF,  p-value: < 2.2e-16

Anexo 17

Figura 11. Gráfico interactivo precio-parqueaderos

Anexo 18

##              areaconst banios habitaciones parqueaderos
## areaconst         1.00   0.67         0.53         0.58
## banios            0.67   1.00         0.60         0.57
## habitaciones      0.53   0.60         1.00         0.28
## parqueaderos      0.58   0.57         0.28         1.00

Anexo 19

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
##     parqueaderos, data = basegeo1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -670.63  -99.60  -20.33   57.93 1102.89 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -236.22207   52.60840  -4.490 9.32e-06 ***
## areaconst       0.70432    0.06156  11.442  < 2e-16 ***
## estrato        93.29466   11.81790   7.894 2.83e-14 ***
## banios         27.82442    9.32192   2.985  0.00301 ** 
## habitaciones  -16.67340    6.63159  -2.514  0.01232 *  
## parqueaderos   38.18199    6.73290   5.671 2.73e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 178.7 on 400 degrees of freedom
##   (196 observations deleted due to missingness)
## Multiple R-squared:  0.6016, Adjusted R-squared:  0.5966 
## F-statistic: 120.8 on 5 and 400 DF,  p-value: < 2.2e-16

Anexo 20

Figura 12. Q-Q plot zona norte

Figura 12. Q-Q plot zona norte

Anexo 21

## 
##  Shapiro-Wilk normality test
## 
## data:  residuos_norte
## W = 0.87881, p-value < 2.2e-16

Anexo 22

## 
##  Goldfeld-Quandt test
## 
## data:  modelo_norte
## GQ = 1.9945, df1 = 197, df2 = 197, p-value = 8.253e-07
## alternative hypothesis: variance increases from segment 1 to 2

Anexo 23

## 
##  Durbin-Watson test
## 
## data:  modelo_norte
## DW = 1.807, p-value = 0.02296
## alternative hypothesis: true autocorrelation is greater than 0

Anexo 24

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
##     parqueaderos, data = basegeo2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1086.66   -44.05    -1.50    41.46   900.56 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -279.40430   20.85720 -13.396  < 2e-16 ***
## areaconst       1.27761    0.06443  19.830  < 2e-16 ***
## estrato        55.58708    4.20291  13.226  < 2e-16 ***
## banios         57.96154    4.22534  13.718  < 2e-16 ***
## habitaciones  -20.90343    5.03873  -4.149 3.52e-05 ***
## parqueaderos   85.22685    5.03705  16.920  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 102.8 on 1649 degrees of freedom
##   (283 observations deleted due to missingness)
## Multiple R-squared:  0.7631, Adjusted R-squared:  0.7624 
## F-statistic:  1062 on 5 and 1649 DF,  p-value: < 2.2e-16

Anexo 25

Figura 13. Q-Q plot zona sur

Figura 13. Q-Q plot zona sur

Anexo 26

## 
##  Shapiro-Wilk normality test
## 
## data:  residuos_sur
## W = 0.77541, p-value < 2.2e-16

Anexo 27

## 
##  Goldfeld-Quandt test
## 
## data:  modelo_sur
## GQ = 0.76384, df1 = 822, df2 = 821, p-value = 0.9999
## alternative hypothesis: variance increases from segment 1 to 2

Anexo 28

## 
##  Durbin-Watson test
## 
## data:  modelo_sur
## DW = 1.6065, p-value = 4.549e-16
## alternative hypothesis: true autocorrelation is greater than 0

Anexo 29

Este Anexo incluye todos los chunks de código que se emplearon para realizar el informe:

## ----setup, include=FALSE-------------------------------------------------------------------------
knitr::opts_chunk$set(
    echo = TRUE,
    fig.align = "center",
    message = FALSE,
    warning = FALSE
)


## ----inicializacion, message=FALSE, warning=FALSE, include=FALSE----------------------------------

#Instalar librerías

library(paqueteMODELOS)
library(kableExtra)
library(dplyr)


rm(list = ls())

library(paqueteMODELOS)

data("vivienda", package = "paqueteMODELOS")



## ----tabla_variables, warning=FALSE, include=FALSE------------------------------------------------

tabla_variables <- read.csv2(
  "C:/Users/Aleja/OneDrive/Documents/Maestria/202601/Modelos/Actividad2/diccionario.csv",
  fileEncoding = "UTF-8",
  stringsAsFactors = FALSE
)

tabla_variables %>%
  kable(format = "html",
        align = "c") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive"))


## ----filtro1, include=FALSE-----------------------------------------------------------------------

base1 <- vivienda[!is.na(vivienda$zona) & !is.na(vivienda$tipo) &
                  vivienda$zona == "Zona Norte" & vivienda$tipo == "Casa", ]

head(base1, 3)



## ----frecuencia_zona, include=FALSE, tab.cap="Tabla 1. Frecuencia de las zonas en el subset"------

table(base1$zona)



## ----frecuencia_tipo, include=FALSE, tab.cap="Tabla 2. Frecuencia de los tipos de vivienda en el subset"----

table(base1$tipo)



## ----frecuencia_zonatipo, include=FALSE, tab.cap="Tabla 3. Frecuencia de los tipos de vivienda en el subset"----

table(base1$tipo, base1$zona)



## ----mapanorte, fig.cap="Figura 3. Mapa de las casas clasificadas como zona norte", include=FALSE----

# Eliminación de filas sin coordenadas y conversión a a numérico
base1_map <- base1
base1_map$longitud <- as.numeric(base1_map$longitud)
base1_map$latitud  <- as.numeric(base1_map$latitud)

base1_map <- base1_map[!is.na(base1_map$longitud) & !is.na(base1_map$latitud), ]

# Mapa de puntos

library(ggplot2)

ggplot(base1_map, aes(x = longitud, y = latitud)) +
  geom_point(color = "blue", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Casas en Zona Norte",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----filtro2, include=FALSE-----------------------------------------------------------------------

base2 <- vivienda[!is.na(vivienda$zona) & !is.na(vivienda$tipo) &
                  vivienda$zona == "Zona Sur" & vivienda$tipo == "Apartamento", ]

head(base2, 3)



## ----frecuencia_zona2, include = FALSE, tab.cap= "Tabla 4. Frecuencia de las zonas en el subset"----

table(base2$zona)



## ----frecuencia_tipo2, include = FALSE, tab.cap= "Tabla 5. Frecuencia de los tipos de vivienda en el subset"----

table(base2$tipo)



## ----frecuencia_zonatipo2, include=FALSE, tab.cap="Tabla 6. Frecuencia de los tipos de vivienda en el subset"----

table(base2$tipo, base2$zona)



## ----mapasur, include = FALSE, fig.cap= "Figura 4. Mapa de los apartamentos clasificados como zona sur"----

# Eliminación de filas sin coordenadas y conversión a a numérico
base2_map <- base2
base2_map$longitud <- as.numeric(base2_map$longitud)
base2_map$latitud  <- as.numeric(base2_map$latitud)

base2_map <- base2_map[!is.na(base2_map$longitud) & !is.na(base2_map$latitud), ]

# Mapa de puntos

library(ggplot2)

ggplot(base2_map, aes(x = longitud, y = latitud)) +
  geom_point(color = "red", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Apartamentos en Zona Sur",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----puntosespaciales, include=FALSE--------------------------------------------------------------

library(sf)

vivienda_clean <- vivienda[!is.na(vivienda$latitud) & !is.na(vivienda$longitud), ]

vivienda_sf <- st_as_sf(vivienda_clean,
                        coords = c("longitud","latitud"),
                        crs = 4326)


## ----capabarrios, include=FALSE-------------------------------------------------------------------


barrios <- st_read("C:/Users/Aleja/OneDrive/Documents/Maestria/202601/Modelos/Actividad2/mc_barrios.shp")

#Conversión de sistema de coordenadas

barrios <- st_transform(barrios, st_crs(vivienda_sf))



## ----clasificacion, include=FALSE-----------------------------------------------------------------

vivienda_clasificada <- st_join(vivienda_sf, barrios, join = st_within)

head(vivienda_clasificada)



## ----comunaszona, include=FALSE-------------------------------------------------------------------

vivienda_clasificada$zona_geo <- ifelse(
  vivienda_clasificada$comuna %in% c("02","04","05","06"),
  "Zona Norte",
  ifelse(vivienda_clasificada$comuna %in% c("17","22"),
         "Zona Sur",
         "Otras zonas")
)



## ----mapanorte_recla, include = FALSE, fig.cap = "Figura 5. Mapa de las casas reclasificadas como zona norte"----

library(gridExtra)

basegeo1 <- vivienda_clasificada[
  vivienda_clasificada$tipo == "Casa" &
  vivienda_clasificada$zona_geo == "Zona Norte",
]

basegeo1_map <- basegeo1

coords <- st_coordinates(basegeo1_map)
basegeo1_map$longitud <- coords[, 1]
basegeo1_map$latitud  <- coords[, 2]

ggplot(basegeo1_map, aes(x = longitud, y = latitud)) +
  geom_point(color = "blue", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Casas en Zona Norte (clasificación geográfica)",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()


## ----mapasur_recla, include = FALSE, fig.cap= "Figura 6. Mapa de los apartamentos reclasificados como zona sur"----

basegeo2 <- vivienda_clasificada[
  vivienda_clasificada$tipo == "Apartamento" &
  vivienda_clasificada$zona_geo == "Zona Sur",
]

basegeo2_map <- basegeo2

coords <- st_coordinates(basegeo2_map)
basegeo2_map$longitud <- coords[, 1]
basegeo2_map$latitud  <- coords[, 2]

ggplot(basegeo2_map, aes(x = longitud, y = latitud)) +
  geom_point(color = "red", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Apartamentos en Zona Sur (clasificación geográfica)",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----modelo_area, include=FALSE-------------------------------------------------------------------

modelo_area <- lm(preciom ~ areaconst, data = vivienda_clasificada)
summary(modelo_area)



## ----plotly_area, fig.cap="Figura 7. Gráfico interactivo precio-área", include=FALSE--------------

library(plotly)

plot_ly(
  vivienda_clasificada,
  x = ~areaconst,
  y = ~preciom,
  type = "scatter",
  mode = "markers",
  marker = list(color = "steelblue")
) %>%
layout(
  title = "Relación entre precio y área construida",
  xaxis = list(title = "Área construida"),
  yaxis = list(title = "Precio de la vivienda")
)



## ----anova_estrato, include=FALSE-----------------------------------------------------------------

anova_estrato <- aov(preciom ~ factor(estrato), data = vivienda_clasificada)
summary(anova_estrato)



## ----fig.cap="Figura 8. Gráfico interactivo precio-estrato", include=FALSE------------------------

library(plotly)

p1 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(estrato),
  y = ~preciom,
  type = "box",
  color = ~factor(estrato)
) %>%
  layout(
    title = "Precio de la vivienda según el estrato",
    xaxis = list(title = "Estrato"),
    yaxis = list(title = "Precio de la vivienda")
  )

p1 <- plotly_build(p1)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n1 <- length(p1$x$data)
for (i in seq((n1/2) + 1, n1)) {
  p1$x$data[[i]]$showlegend <- FALSE
}



## ----modelo_banos, include=FALSE------------------------------------------------------------------

modelo_banos <- lm(preciom ~ banios, data = vivienda_clasificada)
summary(modelo_banos)



## ----fig.cap="Figura 9. Gráfico interactivo precio-número de baños", include=FALSE----------------

p2 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(banios),
  y = ~preciom,
  type = "box",
  color = ~factor(banios)
) %>%
  layout(
    title = "Precio de la vivienda según el número de baños",
    xaxis = list(title = "Número de baños"),
    yaxis = list(title = "Precio de la vivienda")
  )

p2 <- plotly_build(p2)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n2 <- length(p2$x$data)
for (j in seq((n2/2) + 1, n2)) {
  p2$x$data[[j]]$showlegend <- FALSE
}

p2



## ----modelo_habitaciones, include=FALSE-----------------------------------------------------------

modelo_habitaciones <- lm(preciom ~ habitaciones, data = vivienda_clasificada)
summary(modelo_habitaciones)



## ----fig.cap="Figura 10. Gráfico interactivo precio-número de habitaciones", include=FALSE--------

p3 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(habitaciones),
  y = ~preciom,
  type = "box",
  color = ~factor(habitaciones)
) %>%
  layout(
    title = "Precio de la vivienda según el número de habitaciones",
    xaxis = list(title = "Número de habitaciones"),
    yaxis = list(title = "Precio de la vivienda")
  )

p3 <- plotly_build(p3)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n3 <- length(p3$x$data)
for (k in seq((n3/2) + 1, n3)) {
  p3$x$data[[k]]$showlegend <- FALSE
}

p3



## ----modelo_parqueaderos, include=FALSE-----------------------------------------------------------

modelo_parqueaderos <- lm(preciom ~ parqueaderos, data = vivienda_clasificada)
summary(modelo_parqueaderos)



## ----fig.cap="Figura 11. Gráfico interactivo precio-parqueaderos", include=FALSE------------------

p5 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(parqueaderos),
  y = ~preciom,
  type = "box",
  color = ~factor(parqueaderos)
) %>%
  layout(
    title = "Precio de la vivienda según el número de parqueaderos",
    xaxis = list(title = "Parqueaderos"),
    yaxis = list(title = "Precio de la vivienda")
  )

p5 <- plotly_build(p5)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n5 <- length(p5$x$data)
for (l in seq((n5/2) + 1, n5)) {
  p5$x$data[[l]]$showlegend <- FALSE
}

p5



## ----matrizcorr, include=FALSE--------------------------------------------------------------------

vars_corr <- st_drop_geometry(vivienda_clasificada)[, c("areaconst",
                                                        "banios",
                                                        "habitaciones",
                                                        "parqueaderos")]

round(cor(vars_corr, use = "complete.obs"), 2)



## ----modelozonanorte, include=FALSE---------------------------------------------------------------

modelo_norte <- lm(
  preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos,
  data = basegeo1
)

summary(modelo_norte)



## ----qqnorte, fig.cap="Figura 12. Q-Q plot zona norte", include=FALSE-----------------------------

residuos_norte <- residuals(modelo_norte)

qqnorm(residuos_norte)
qqline(residuos_norte, col = "red")



## ----shap-wilk_norte, include=FALSE---------------------------------------------------------------

shapiro.test(residuos_norte)



## ----homocedasticidad_norte, include=FALSE--------------------------------------------------------

library(lmtest)

gqtest(modelo_norte)



## ----independiencia_norte, include=FALSE----------------------------------------------------------

dwtest(modelo_norte)



## ----estimacion_norte, echo = FALSE---------------------------------------------------------------

#Características solicitadas para la vivienda

vivienda_norte <- data.frame(
  areaconst = 200,
  estrato = 4,
  banios = 2,
  habitaciones = 4,
  parqueaderos = 1
)

predict(modelo_norte, newdata = vivienda_norte)



## ----prediccion_norte, include=FALSE--------------------------------------------------------------

# Cálculo precio

basegeo1$precio_pred <- predict(modelo_norte, newdata = basegeo1)

# Filtro características

ofertas_norte <- basegeo1[
  !is.na(basegeo1$precio_pred) &
  !is.na(basegeo1$areaconst) &
  !is.na(basegeo1$estrato) &
  !is.na(basegeo1$banios) &
  !is.na(basegeo1$habitaciones) &
  !is.na(basegeo1$parqueaderos) &
  basegeo1$precio_pred <= 350 &
  basegeo1$areaconst - 200 >= 0 &
  basegeo1$estrato %in% c(3, 4, 5) &
  basegeo1$banios - 2 >= 0 &
  basegeo1$habitaciones - 4 >= 0 &
  basegeo1$parqueaderos - 1 >= 0,
]



## ----mapaofertas_norte, echo = FALSE, fig.cap = "Figura 1. Mapa de las ofertas vivienda 1"--------

oferta_nortecoords <- st_coordinates(ofertas_norte)
ofertas_norte$longitud <- oferta_nortecoords[,1]
ofertas_norte$latitud  <- oferta_nortecoords[,2]

ggplot(ofertas_norte, aes(x = longitud, y = latitud)) +
  geom_point(color = "darkgreen", size = 2.5, alpha = 0.7) +
  geom_text(aes(label = id), nudge_y = 0.002, size = 3) +
  coord_equal() +
  labs(
    title = "Ofertas potenciales para la vivienda 1 - Zona Norte",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----modelozonasur, include = FALSE---------------------------------------------------------------

modelo_sur <- lm(
  preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos,
  data = basegeo2
)

summary(modelo_sur)



## ----qqsur, fig.cap="Figura 13. Q-Q plot zona sur", include=FALSE---------------------------------

residuos_sur <- residuals(modelo_sur)

qqnorm(residuos_sur)
qqline(residuos_sur, col = "red")



## ----shap-wilk_sur, include=FALSE-----------------------------------------------------------------

shapiro.test(residuos_sur)



## ----homocedasticidad_sur, include=FALSE----------------------------------------------------------

library(lmtest)

gqtest(modelo_sur)



## ----independiencia_sur, include=FALSE------------------------------------------------------------

dwtest(modelo_sur)



## ----estimacion_sur, echo = FALSE-----------------------------------------------------------------

#Características solicitadas para la vivienda

vivienda_sur <- data.frame(
  areaconst = 300,
  estrato = 5,
  banios = 3,
  habitaciones = 5,
  parqueaderos = 3
)

predict(modelo_sur, newdata = vivienda_sur)



## ----prediccion_sur, include=FALSE----------------------------------------------------------------

# Cálculo precio

basegeo2$precio_pred <- predict(modelo_sur, newdata = basegeo2)

# Filtro características

ofertas_sur <- basegeo2[
  !is.na(basegeo2$precio_pred) &
  !is.na(basegeo2$areaconst) &
  !is.na(basegeo2$estrato) &
  !is.na(basegeo2$banios) &
  !is.na(basegeo2$habitaciones) &
  !is.na(basegeo2$parqueaderos) &
  basegeo2$precio_pred <= 850 &
  basegeo2$areaconst - 160 >= 0 &
  basegeo2$estrato %in% c(4, 5, 6) &
  basegeo2$banios - 3 >= 0 &
  basegeo2$habitaciones - 5 >= 0 &
  basegeo2$parqueaderos - 2 >= 0,
]



## ----mapaofertas_sur, echo = FALSE, fig.cap = "Figura 2. Mapa de ofertas vivienda 2"--------------

oferta_surcoords <- st_coordinates(ofertas_sur)
ofertas_sur$longitud <- oferta_surcoords[,1]
ofertas_sur$latitud  <- oferta_surcoords[,2]

ggplot(ofertas_sur, aes(x = longitud, y = latitud)) +
  geom_point(color = "darkgreen", size = 2.5, alpha = 0.7) +
  geom_text(aes(label = id), nudge_y = 0.002, size = 3) +
  coord_equal() +
  labs(
    title = "Ofertas potenciales para la vivienda 2 - Zona Sur",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----anexo 0, echo=FALSE, message=FALSE, warning=FALSE--------------------------------------------

knitr::kable(
  tabla_variables,
  caption = "Tabla 1: Descripción detallada de las variables",
  align = "ccc"
)


## ----anexo 1c, echo=FALSE, include=TRUE, ref.label="filtro1"--------------------------------------


## ----anexo 1b, echo=FALSE, include=TRUE, ref.label="frecuencia_zona"------------------------------


## ----anexo 1c, echo=FALSE, include=TRUE, ref.label="frecuencia_tipo"------------------------------


## ----anexo 1d, echo=FALSE, include=TRUE, ref.label="frecuencia_zonatipo"--------------------------


## ----anexo 2, echo=FALSE, include=TRUE, ref.label="mapanorte", fig.cap="Figura 3. Mapa de las casas clasificadas como zona norte"----


## ----anexo 3a, echo=FALSE, include=TRUE, ref.label="filtro2"--------------------------------------


## ----anexo 3b, echo=FALSE, include=TRUE, ref.label="frecuencia_zona2"-----------------------------


## ----anexo 3c, echo=FALSE, include=TRUE, ref.label="frecuencia_tipo2"-----------------------------


## ----anexo 3d, echo=FALSE, include=TRUE, ref.label="frecuencia_zonatipo2"-------------------------


## ----anexo 4, echo=FALSE, include=TRUE, ref.label="mapasur", fig.cap= "Figura 4. Mapa de los apartamentos clasificados como zona sur"----


## ----anexo 5, echo=FALSE, include=TRUE, ref.label="clasificacion"---------------------------------


## ----anexo 6, echo=FALSE, fig.cap="Figura 5. Mapa de las casas reclasificadas como zona norte"----

coords <- st_coordinates(basegeo1)
basegeo1$longitud <- coords[, 1]
basegeo1$latitud  <- coords[, 2]

ggplot(basegeo1, aes(x = longitud, y = latitud)) +
  geom_point(color = "blue", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Casas en Zona Norte (clasificación geográfica)",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----anexo 7, echo=FALSE, fig.cap="Figura 6. Mapa de los apartamentos reclasificados como zona sur"----

coords <- st_coordinates(basegeo2)
basegeo2$longitud <- coords[, 1]
basegeo2$latitud  <- coords[, 2]

ggplot(basegeo2, aes(x = longitud, y = latitud)) +
  geom_point(color = "red", size = 1.6, alpha = 0.7) +
  coord_equal() +
  labs(
    title = "Mapa de puntos - Apartamentos en Zona Sur (clasificación geográfica)",
    x = "Longitud",
    y = "Latitud"
  ) +
  theme_minimal()



## ----anexo 8, echo=FALSE, include=TRUE, ref.label="modelo_area"-----------------------------------


## ----anexo 9, echo=FALSE, include=TRUE, ref.label="plotly_area", fig.cap="Figura 7. Gráfico interactivo precio-área"----


## ----anexo 10, echo=FALSE, include=TRUE, ref.label="anova_estrato"--------------------------------


## ----plotly_estrato, echo=FALSE, fig.cap="Figura 8. Gráfico interactivo precio-estrato"-----------
p1 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(estrato),
  y = ~preciom,
  type = "box",
  color = ~factor(estrato)
) %>%
  layout(
    title = "Precio de la vivienda según el estrato",
    xaxis = list(title = "Estrato"),
    yaxis = list(title = "Precio de la vivienda")
  )

p1 <- plotly_build(p1)

n1 <- length(p1$x$data)
for (i in seq((n1/2) + 1, n1)) {
  p1$x$data[[i]]$showlegend <- FALSE
}

p1



## ----anexo 12, echo=FALSE, include=TRUE, ref.label="modelo_banos"---------------------------------


## ----plotly_banios, echo=FALSE, fig.cap="Figura 9. Gráfico interactivo precio-número de baños"----

p2 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(banios),
  y = ~preciom,
  type = "box",
  color = ~factor(banios)
) %>%
  layout(
    title = "Precio de la vivienda según el número de baños",
    xaxis = list(title = "Número de baños"),
    yaxis = list(title = "Precio de la vivienda")
  )

p2 <- plotly_build(p2)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n2 <- length(p2$x$data)
for (j in seq((n2/2) + 1, n2)) {
  p2$x$data[[j]]$showlegend <- FALSE
}

p2



## ----anexo 14, echo=FALSE, include=TRUE, ref.label="modelo_habitaciones"--------------------------


## ----plotly_habitaciones, echo=FALSE, fig.cap="Figura 10. Gráfico interactivo precio-número de habitaciones"----

p3 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(habitaciones),
  y = ~preciom,
  type = "box",
  color = ~factor(habitaciones)
) %>%
  layout(
    title = "Precio de la vivienda según el número de habitaciones",
    xaxis = list(title = "Número de habitaciones"),
    yaxis = list(title = "Precio de la vivienda")
  )

p3 <- plotly_build(p3)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n3 <- length(p3$x$data)
for (k in seq((n3/2) + 1, n3)) {
  p3$x$data[[k]]$showlegend <- FALSE
}

p3



## ----anexo 16, echo=FALSE, include=TRUE, ref.label="modelo_parqueaderos"--------------------------


## ----plotly_parqueaderos, echo=FALSE, fig.cap="Figura 11. Gráfico interactivo precio-parqueaderos"----

p5 <- plot_ly(
  data = vivienda_clasificada,
  x = ~factor(parqueaderos),
  y = ~preciom,
  type = "box",
  color = ~factor(parqueaderos)
) %>%
  layout(
    title = "Precio de la vivienda según el número de parqueaderos",
    xaxis = list(title = "Parqueaderos"),
    yaxis = list(title = "Precio de la vivienda")
  )

p5 <- plotly_build(p5)

# Ocultar la leyenda duplicada en la segunda mitad de las trazas
n5 <- length(p5$x$data)
for (l in seq((n5/2) + 1, n5)) {
  p5$x$data[[l]]$showlegend <- FALSE
}

p5



## ----anexo 18, echo=FALSE, include=TRUE, ref.label="matrizcorr"-----------------------------------


## ----anexo 19, echo=FALSE, include=TRUE, ref.label="modelozonanorte"------------------------------


## ----anexo 20, echo=FALSE, include=TRUE, ref.label="qqnorte", fig.cap="Figura 12. Q-Q plot zona norte"----


## ----eanexo 21, echo=FALSE, include=TRUE, ref.label="shap-wilk_norte"-----------------------------


## ----anexo 22, echo=FALSE, include=TRUE, ref.label="homocedasticidad_norte"-----------------------


## ----anexo 23, echo=FALSE, include=TRUE, ref.label="independiencia_norte"-------------------------


## ----anexo 24, echo=FALSE, include=TRUE, ref.label="modelozonasur"--------------------------------


## ----anexo 25, echo=FALSE, include=TRUE, ref.label="qqsur", fig.cap="Figura 13. Q-Q plot zona sur"----


## ----anexo 26, echo=FALSE, include=TRUE, ref.label="shap-wilk_sur"--------------------------------


## ----anexo 27, echo=FALSE, include=TRUE, ref.label="homocedasticidad_sur"-------------------------


## ----anexo 28, echo=FALSE, include=TRUE, ref.label="independiencia_sur"---------------------------


## ----Anexo_codigo, echo=FALSE, results='asis'-----------------------------------------------------
# Leer todo el archivo .R
codigo <- readLines("Anexo_codigo.R")

# Mostrarlo como texto en el documento
cat(paste(c("```r", codigo, "```"), collapse = "\n"))

# Evitar que R imprima el resultado del chunk
invisible(NULL)