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:

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

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

  3. 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).

  4. 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).

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

  6. Realice predicciones con el modelo anterior usando los datos de prueba (30%).

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

  1. Realice un filtro a la base de datos e incluya sólo las ofertas de apartamentos zona norte. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

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.

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

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.

  1. 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).
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.

  1. 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).
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.

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

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.

  1. Realice predicciones con el modelo anterior usando los datos de prueba (30%).

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
  1. Calcule el error cuadrático medio, el error absoluto medio y el R2, interprete.
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

```