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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.).
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.
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.
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.
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
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
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.
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.).
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.
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.
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
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
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.
[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].
| 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 |
## # 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
Figura 3. Mapa de las casas clasificadas como 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 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
Figura 4. Mapa de los apartamentos clasificados como zona sur
## 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>
Figura 5. Mapa de las casas reclasificadas como zona norte
Figura 6. Mapa de los apartamentos reclasificados como zona sur
##
## 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
Figura 7. Gráfico interactivo precio-área
## 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
Figura 8. Gráfico interactivo precio-estrato
##
## 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
Figura 9. Gráfico interactivo precio-número de baños
##
## 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
Figura 10. Gráfico interactivo precio-número de habitaciones
##
## 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
Figura 11. Gráfico interactivo precio-parqueaderos
## 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
##
## 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
Figura 12. Q-Q plot zona norte
##
## Shapiro-Wilk normality test
##
## data: residuos_norte
## W = 0.87881, p-value < 2.2e-16
##
## 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
##
## Durbin-Watson test
##
## data: modelo_norte
## DW = 1.807, p-value = 0.02296
## alternative hypothesis: true autocorrelation is greater than 0
##
## 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
Figura 13. Q-Q plot zona sur
##
## Shapiro-Wilk normality test
##
## data: residuos_sur
## W = 0.77541, p-value < 2.2e-16
##
## 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
##
## Durbin-Watson test
##
## data: modelo_sur
## DW = 1.6065, p-value = 4.549e-16
## alternative hypothesis: true autocorrelation is greater than 0
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)