Maestría en Ciencia de Datos **Modelos Estadísticos para la Toma de Decisiones*
Caso C&A
Tomada de: sitios-turisticos/cali
Enunciado
Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
Características Vivienda 1 Vivienda 2 Tipo Casa Apartamento área construida 200 300 parqueaderos 1 3 baños 2 3 habitaciones 4 5 estrato 4 o 5 5 o 6 zona Norte Sur crédito preaprobado 350 millones 850 millones
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
Datos Los datos de los tres últimos meses se adjuntan en la base que puede obtener con el siguiente código en R
variable descripción zona ubicación de la vivienda : Zona Centro, Zona Norte,… piso piso que ocupa la vivienda : primer piso, segundo piso… estrato estrato socio-económico : 3,4,5,6 preciom precio de la vivienda en millones de pesos areaconst área construida parqueaderos número de parqueaderos banios número de baños habitaciones número de habitaciones tipo tipo de vivienda : Casa, Apartamento barrio barrio de ubicación de la vivienda : 20 de Julio, alamos,.. longitud coordenada geográfica latitud coordenada geográfica
Se requieren los siguientes evaluaciones:
Realice un filtro a la base de datos e incluya sólo las ofertas de apartamentos. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime el modelo con la muestra del 70%. Muestre los resultados.
Realice predicciones con el modelo anterior usando los datos de prueba (30%).
Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.
Desarollo
Previo al trabajo con el DF se realizara un analisis exploratorio de los datos y de realiza el proceso de limpieza y depuracion de los datos, cada tratamiento de los datos sera detallado previo a la aplicacion.
load("~/Downloads/vivienda.rda")
str(vivienda)
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 8322 obs. of 13 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr NA NA NA "02" ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
head(vivienda)
## id zona piso estrato preciom areaconst parqueaderos banios
## 1 1147 Zona Oriente <NA> 3 250 70 1 3
## 2 1169 Zona Oriente <NA> 3 320 120 1 2
## 3 1350 Zona Oriente <NA> 3 350 220 2 2
## 4 5992 Zona Sur 02 4 400 280 3 5
## 5 1212 Zona Norte 01 5 260 90 1 2
## 6 1724 Zona Norte 01 5 240 87 1 3
## habitaciones tipo barrio longitud latitud
## 1 6 Casa 20 de julio -76.51168 3.43382
## 2 3 Casa 20 de julio -76.51237 3.43369
## 3 4 Casa 20 de julio -76.51537 3.43566
## 4 3 Casa 3 de julio -76.54000 3.43500
## 5 3 Apartamento acopi -76.51350 3.45891
## 6 3 Apartamento acopi -76.51700 3.36971
Tenemos un DF con 8322 observaciones con 13 variables, en el cual contamos con 4 viariables tipo texto, sin embargo se evidencia que la variable piso es tipo texto lo que no tiene sentido por que debe ser un dato numerico, situacion que solucionaramos en primer lugar, continuando con la exploracion de los datos revisamos si el df cuenta con datos faltantes
Para la variable piso se imputara la media de la variable piso y la variable parqueaderos se imputara con cero:
vivienda$piso= as.numeric(vivienda$piso)
mean(vivienda$piso)
## [1] NA
vivienda$piso[is.na(vivienda$piso)] <- 1
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
df_vivienda <- vivienda
Validamos los datos faltantes:
#install.packages("mice")
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
md.pattern(vivienda)
## piso parqueaderos preciom id zona estrato areaconst banios habitaciones
## 8319 1 1 1 1 1 1 1 1 1
## 1 1 1 1 0 0 0 0 0 0
## 2 1 1 0 0 0 0 0 0 0
## 0 0 2 3 3 3 3 3 3
## tipo barrio longitud latitud
## 8319 1 1 1 1 0
## 1 0 0 0 0 10
## 2 0 0 0 0 11
## 3 3 3 3 32
Con los cambios realizados el DF paso de 8322 a 8319, eliminamos los registros faltantes:
df_vivienda <- na.omit(vivienda)
md.pattern(df_vivienda)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 8319 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0 0
## tipo barrio longitud latitud
## 8319 1 1 1 1 0
## 0 0 0 0 0
Validamos que tenemos el DF limpio y procedemos al desarrollo del analisis solicitado
Para realizar la consulta del DF con solo los datos de los apartamentos creamos un nuevo DF con la funcion subset:
df_vivienda_aptos <- subset(df_vivienda, df_vivienda$tipo=="Apartamento")
df_vivienda_aptos <- subset(df_vivienda, df_vivienda$zona=="Zona Norte")
head(df_vivienda_aptos,3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1212 Zona N… 1 5 260 90 1 2 3
## 2 1724 Zona N… 1 5 240 87 1 3 3
## 3 2326 Zona N… 1 4 220 52 2 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Ahora graficamos en el mapa la ubicacion de los inmuebles y validamos si pertenecen a la zona
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(leaflet)
mapa <- leaflet(data = df_vivienda_aptos) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud, popup = ~zona)
mapa
Para la segmentacion de la zona norte utilice estos datos de georeferenciacion:
df_vivienda_aptos$zona <- NA
df_vivienda_aptos$zona <- ifelse(df_vivienda_aptos$longitud < -76.537138, "Zona Oeste", df_vivienda_aptos$zona)
df_vivienda_aptos$zona <- ifelse(df_vivienda_aptos$longitud > -76.485196, "Zona Oriente", df_vivienda_aptos$zona)
df_vivienda_aptos$zona <- ifelse(df_vivienda_aptos$latitud > 3.460322, "Zona Norte", df_vivienda_aptos$zona)
df_vivienda_aptos$zona <- ifelse(df_vivienda_aptos$latitud < 3.404536, "Zona Sur", df_vivienda_aptos$zona)
df_vivienda_aptos$zona <- ifelse(is.na(df_vivienda_aptos$zona), "Zona Centro", df_vivienda_aptos$zona)
df_aptos_norte1 <- df_vivienda_aptos[df_vivienda_aptos$tipo == "Apartamento", ]
df_aptos_norte1 <- df_aptos_norte1[df_aptos_norte1$zona == "Zona Norte", ]
colnames(df_aptos_norte1)
## [1] "id" "zona" "piso" "estrato" "preciom"
## [6] "areaconst" "parqueaderos" "banios" "habitaciones" "tipo"
## [11] "barrio" "longitud" "latitud"
mapa <- leaflet(data = df_aptos_norte1) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud, popup = ~zona)
mapa
Para determinar las zonas geograficas de la ciudad de Cali trabaje con el mapa “Zonas Geograficas” de la alcaldia publicado por la Subdirección de Planificación del Territorio Acuerdo 0373 de 2014 (POT), tomando el mapa optenido sobre puse las zonas geograficas de la ciudad. Con este ejercicio efectivamente se evidencia que hay inmuebles clasificados como zona norte que en realidad pertenecen a otra zona, considero que la principal razon puede ser mala captura de la informacion. Revizando el DF se identifico que la mejor forma de trabajar los datros era con reclasificando por latitud y longitud, aunque es una forma no es la mas exacta.
Instalamos las librerias:
#install.packages("plotly")
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
colnames(df_aptos_norte1)
## [1] "id" "zona" "piso" "estrato" "preciom"
## [6] "areaconst" "parqueaderos" "banios" "habitaciones" "tipo"
## [11] "barrio" "longitud" "latitud"
fig <- plot_ly(df_aptos_norte1, x = ~preciom, y = ~areaconst, name = "Precio", type = 'scatter',
mode = "markers", marker = list(color = "black"))
fig <- fig %>% layout(
title = "Precio por Area Cosntruida",
xaxis = list(title = "Precio)"),
margin = list(l = 100)
)
fig
Hacemos el analisis exploratorio de la informacion:
En primer lugar verifico la relacion del precio con las variables categoricas:
plot(df_aptos_norte1$preciom~df_aptos_norte1$estrato,
xlab = "Estrato",
ylab = "Precio de la Vivienda",
main = "Relación entre Estrato y Precio",
col=c("blue"))
Se evidencia una relacion directa positiva entre el precio de los inmuebles y el estrato, en cuanto al relacion del precio con la zona trabaje de le sigueinte manera:
Por otra parte trabaje las variables numericas en un mismo analisis:
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
ggpairs(df_aptos_norte1[,3:6], title=" ")
Lo que nos evidencia que existe uan relacion muy fuerte entre el precio y el area construida, asi mismo el precio con los baños lo cual era algo no esperado.
modelo <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = df_aptos_norte1)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones,
## data = df_aptos_norte1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -476.97 -36.01 2.04 34.17 701.14
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -166.22975 21.21154 -7.837 1.31e-14 ***
## areaconst 1.98771 0.09787 20.309 < 2e-16 ***
## estrato 59.02553 4.13863 14.262 < 2e-16 ***
## banios 41.97460 5.51601 7.610 6.98e-14 ***
## habitaciones -32.37612 5.73386 -5.646 2.20e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 88.69 on 892 degrees of freedom
## Multiple R-squared: 0.7694, Adjusted R-squared: 0.7683
## F-statistic: 743.9 on 4 and 892 DF, p-value: < 2.2e-16
Las estimaciones de los coeficientes del modelo indican que por cada variacion de una unidad del precio es asociada a la variable regresora area en 1.9 manteninedo las demas constantes o inalterables, asi mismo cada variacion de una unidad del precio es asociada a una variacion de del estrato en 59 y baños en 41.9, es decir que estas dos variables tiene un impacto muy fuerte en el precio, en cuanto al area la estimacion es negativa siendo asiciada con una reduccion de -32.3
El Std Error: representa el error estándar de cada coeficiente del modelo.
El t value: es el valor que toma el estadístico de prueba.
Signif codes: representa el nivel de significancia de las variables regresoras para la predicción del modelo de regresión. Entre más estrellas se le asigne a la regresora, más contribuye con el modelo.
Residual standard error: es la estimación de la desviación estandar. Este valor da una idea de cuán lejos están los valores del modelo ajustado a los valores observados de la variable respuesta.
El R2 expresa la proporción de la variación explicada por el modelo; es decir, por las variables explicativas. En este caso el valor es de 0.7694 que puede ser bajo mas aun con el impacto que se esta evidenciando con la variable baños, por lo cual es conveniente mejorar el modelo, para dar mejor explicación y predicción. Con esta informacion es conveniente revisar y evaluar la selección de variables y realizar un tratamiento a los valores atípicos encontrados.
qqnorm(resid(modelo))
El grafico nos permite verificar que tan cerca esta la distribucion del conjunto de datos a una distribucion “ideal”. Al presentar los datos sobre uan recta indica que son razonables. La curva S invertida implica una distribución con colas cortas
plot(modelo, which = 1)
El gráfico de residuos frente a ajustes para verificar el supuesto de que los residuos se distribuyen aleatoriamente y tienen una varianza constante. Lo ideal sería que los puntos cayeran aleatoriamente en ambos lados del 0, sin patrones reconocibles en los puntos, en la grafica podemos evidenciar que esto ocurre.
summary(lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda))$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -379.567289 11.78695900 -32.20231 1.639249e-214
## areaconst 1.069663 0.01880352 56.88629 0.000000e+00
## estrato 111.614781 2.37588095 46.97827 0.000000e+00
## banios 67.732773 2.26952683 29.84445 5.159748e-186
## habitaciones -28.171025 1.92936591 -14.60118 1.071571e-47
En la regresion de los coeficientes se evidencia un mayor impacto de la variable estrato con variable regresora, sin embargo el continua alto el impacto de los baños sobre el precio y continua en negatico la variable habitaciones lo cual es extraño.
Procedemos con la creacion de la particion del 70% de la data y graficamos la dispersion del nuevo modelo:
#install.packages("caret")
library(caret)
## Loading required package: lattice
set.seed(pi)
training_model <- df_aptos_norte1$preciom %>%
createDataPartition(p = 0.7, list = FALSE)
train_data <- df_aptos_norte1[training_model, ]
test_data <- df_aptos_norte1[-training_model, ]
colnames(train_data)
## [1] "id" "zona" "piso" "estrato" "preciom"
## [6] "areaconst" "parqueaderos" "banios" "habitaciones" "tipo"
## [11] "barrio" "longitud" "latitud"
modelo2 <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = train_data)
summary(modelo2)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones,
## data = train_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -502.78 -36.02 1.64 33.70 682.28
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -162.9523 25.8986 -6.292 5.90e-10 ***
## areaconst 2.1055 0.1162 18.122 < 2e-16 ***
## estrato 56.3520 5.1241 10.997 < 2e-16 ***
## banios 41.0202 6.7130 6.111 1.75e-09 ***
## habitaciones -32.8136 6.9623 -4.713 3.01e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.73 on 624 degrees of freedom
## Multiple R-squared: 0.7707, Adjusted R-squared: 0.7692
## F-statistic: 524.2 on 4 and 624 DF, p-value: < 2.2e-16
Los resultados de la particion del modelo nos muestran que el el modelo explica el 0.77 el precio, que mejora contra el modelo inicial sin la particion por lo tanto concluyo que brinda mayor acertividad.
Ahora realizamos las predicciones:
predicciones <- modelo2 %>% predict(test_data)
predicciones
## 1 2 3 4 5 6 7 8
## 314.19033 133.09437 379.24606 118.14017 210.28607 103.40149 105.50702 75.01447
## 9 10 11 12 13 14 15 16
## 103.40149 85.54210 137.08989 70.80342 70.80342 107.61254 72.90895 107.82808
## 17 18 19 20 21 22 23 24
## 138.32062 111.82359 107.82808 116.03464 103.40149 164.42913 151.82856 144.63719
## 25 26 27 28 29 30 31 32
## 463.46705 83.43657 83.43657 75.01447 75.01447 355.07009 310.63853 375.03501
## 33 34 35 36 37 38 39 40
## 355.07009 734.36702 389.27649 388.66253 284.43133 116.03464 203.96949 205.20022
## 41 42 43 44 45 46 47 48
## 203.96949 235.55237 332.40651 239.26623 72.03416 79.22552 126.56226 249.20071
## 49 50 51 52 53 54 55 56
## 433.17648 293.41673 281.37672 312.95959 391.87921 327.69827 321.16616 282.60745
## 57 58 59 60 61 62 63 64
## 291.68881 255.23563 317.55916 324.71795 324.71795 319.55782 312.95959 353.97976
## 65 66 67 68 69 70 71 72
## 330.81899 381.35158 285.58777 245.58280 443.85807 357.53155 343.45214 238.88862
## 73 74 75 76 77 78 79 80
## 287.10016 249.79385 379.24606 447.42251 244.70801 327.69827 262.42700 307.87375
## 81 82 83 84 85 86 87 88
## 266.63805 404.51236 279.27120 294.94583 275.06015 413.14999 312.08480 381.35158
## 89 90 91 92 93 94 95 96
## 427.45759 477.99019 291.90435 291.90435 381.35158 291.90435 325.58121 295.24060
## 97 98 99 100 101 102 103 104
## 381.35158 381.35158 340.33142 279.27120 406.61788 380.12085 469.78362 406.61788
## 105 106 107 108 109 110 111 112
## 279.27120 279.27120 420.85937 291.90435 386.79336 409.73860 368.71843 441.32147
## 113 114 115 116 117 118 119 120
## 285.58777 362.61740 199.75844 384.68784 182.91425 287.69330 285.58777 285.58777
## 121 122 123 124 125 126 127 128
## 279.27120 351.87424 445.53252 364.50738 75.01447 51.85370 41.32608 43.43160
## 129 130 131 132 133 134 135 136
## 111.82359 75.01447 41.32608 116.03464 137.08989 94.97939 75.01447 60.27580
## 137 138 139 140 141 142 143 144
## 62.38133 75.01447 197.65292 141.89408 197.65292 90.76834 137.08989 180.80872
## 145 146 147 148 149 150 151 152
## 168.17557 711.42179 126.56226 111.82359 101.29597 111.82359 126.56226 131.36646
## 153 154 155 156 157 158 159 160
## 302.43197 212.39159 210.28607 201.86397 210.28607 214.49712 173.47695 60.27580
## 161 162 163 164 165 166 167 168
## 111.82359 258.21595 312.95959 295.52225 293.13508 178.70320 213.62232 166.07005
## 169 170 171 172 173 174 175 176
## 203.09470 187.12530 198.88365 199.75844 226.25547 209.41127 226.25547 199.75844
## 177 178 179 180 181 182 183 184
## 228.36100 209.41127 288.92403 215.72785 234.67757 213.83786 187.12530 357.17561
## 185 186 187 188 189 190 191 192
## 193.44187 193.44187 107.61254 147.61751 331.69378 430.27584 355.07009 252.61210
## 193 194 195 196 197 198 199 200
## 132.87884 306.04988 356.96008 677.73339 425.28595 536.66323 620.88422 716.64803
## 201 202 203 204 205 206 207 208
## 553.29189 447.00046 425.28595 540.87428 608.25107 608.25107 388.38088 551.68355
## 209 210 211 212 213 214 215 216
## 451.33109 434.18734 590.31654 89.75315 116.03464 141.30094 70.80342 68.69790
## 217 218 219 220 221 222 223 224
## 64.48685 75.01447 70.80342 70.80342 70.80342 64.48685 68.69790 111.82359
## 225 226 227 228 229 230 231 232
## 197.65292 85.54210 64.48685 247.68833 283.48225 320.50690 413.14999 289.79882
## 233 234 235 236 237 238 239 240
## 279.27120 314.19033 362.40186 350.05036 353.97976 381.35158 281.37672 224.74309
## 241 242 243 244 245 246 247 248
## 323.48722 458.02527 342.43694 401.39163 720.12554 614.84930 448.72838 344.54247
## 249 250 251 252 253 254 255 256
## 269.24076 334.01484 547.47251 377.35607 866.42194 336.47630 126.56226 126.56226
## 257 258 259 260 261 262 263 264
## 120.24569 122.35122 120.24569 116.03464 103.40149 120.24569 111.82359 132.87884
## 265 266 267 268
## 192.56708 111.82359 406.40234 197.65292
data.frame(RMSE = RMSE(predicciones, test_data$preciom),
R2 = R2(predicciones, test_data$preciom))
## RMSE R2
## 1 78.84991 0.7657342
El R2 0.74 indica la correlación entre las variables y el precio y el RMSE de 96.75 indica la diferencia entre ellos
```