Evaluación de la oferta inmobiliaria urbana

A continuación vamos a cargar los datos de una empresa inmobiliaria que está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

## Loading required package: cubature
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: flextable
## Warning: package 'flextable' was built under R version 4.3.2
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: psych
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
## 
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
## 
##     label, label<-
## The following object is masked from 'package:dplyr':
## 
##     n
## The following objects are masked from 'package:stats':
## 
##     IQR, median, sd, var
## The following objects are masked from 'package:base':
## 
##     max, mean, min, range, sum

1. Vivienda 1.

1. Filtros para datos de Vivienda 1

En está sección filtraremos los datos para la Vivienda1 que se necesita

Vivienda1 <- vivienda[(vivienda$tipo == 'Casa') & (vivienda$zona == 'Zona Norte'), ]
head(Vivienda1, 3)
## # 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>

Ahora procedemos a generar un mapa donde observamos la ubicación de los distintos puntos que quedaron en nuestra base de datos

#install.packages("leaflet")
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.3.3
# Crea un mapa
map <- leaflet(Vivienda1) %>%
  addTiles() %>%
  addMarkers(
    lng = ~latitud,
    lat = ~longitud,
    popup = ~paste(latitud,",",longitud,barrio) # Puedes personalizar el contenido del popup aquí
  )
## Warning in validateCoords(lng, lat, funcName): Data contains 3 rows with either
## missing or invalid lat/lon values and will be ignored
map # Muestra el mapa

Lo primero que observamos es que todos los puntos estan muy concentrados entre sí a excepción de 3 casos puntuales, donde estas se encuentran alejados, dos de ellos pertenecen al barrio “La Flora” y el otro a Santa Monica Residencial. Esto puede deber ser debido a que cuando se lleno los datos se hayan llenado de manera incorrecta, ya que si se busca esa latitud, y longitud en google, vamos a poder observar que queda por fuera del barrio “La Flora”, y equivocarse en un numero es mas sencillo que en un nombre de un barrio, probablemente esta información este errada. Lo mismo puede ser para el otro caso. Puede que sea mas de un error de digitación en la latitud o longitud que sobre el barrio o la zona de la ciudad.

2. Análisis Exploratorio Vivienda1

A continuación, revisamos una estadística descriptiva básica de sobre los datos que tenemos. Recordemos que lo que queremos hallar es una función en base área construida, estrato, numero de baños, numero de habitaciones, número de parqueaderos. Para ello debemos revisar que estas variables sean numéricas, lo que haremos a continuación.

tipos_de_datos <- sapply(Vivienda1, class)
print(tipos_de_datos)
##           id         zona         piso      estrato      preciom    areaconst 
##    "numeric"  "character"  "character"    "numeric"    "numeric"    "numeric" 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##    "numeric"    "numeric"    "numeric"  "character"  "character"    "numeric" 
##      latitud 
##    "numeric"

Como se observa las variables que nos interesan en efecto son numericas, por lo que no hay necesidad de transformarlas.

summary(Vivienda1)
##        id             zona               piso              estrato     
##  Min.   :  58.0   Length:725         Length:725         Min.   :3.000  
##  1st Qu.: 766.2   Class :character   Class :character   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Mode  :character   Median :4.000  
##  Mean   :2574.6                                         Mean   :4.202  
##  3rd Qu.:4225.0                                         3rd Qu.:5.000  
##  Max.   :8319.0                                         Max.   :6.000  
##  NA's   :3                                              NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 2.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 2.182   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 3.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##  NA's   :3        NA's   :3        NA's   :290      NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:725         Length:725         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.452  
##  Median :3.468  
##  Mean   :3.460  
##  3rd Qu.:3.482  
##  Max.   :3.496  
##  NA's   :3

Con lo anterior identificamos por ejemplo que que tenemos estratos 3,4,5 y 6. Ademas de esto que el numero de parqueaderos que hay es mínimo 1 y máximo 10, por otro lado notamos que tenemos 290 registros donde no tenemos información de parqueadero, para estos casos vamos a asumir que no tienen y es cero.Lo otro que notamos es que para todas las variables tenemos 3 valores de NA, incluido el id. Esto es debido a que tenemos 3 filas llenas de vacios, por lo que vamos a eliminarlas. Como ya sabemos que este dataset solo posee los valores de la Zona Norte, podemos precindir de esta columna al igual de que la variable tipo. Así mismo vamos a eliminar la variable de tipo de piso, ya que tenemos muchos vacios y no es algo que nos interese incluir en nuestro modelo.

Vivienda1$parqueaderos[is.na(Vivienda1$parqueaderos)] <- 0
# Sacamos piso y zona del analisis
Vivienda1 <- subset(Vivienda1, select = -c(zona, piso,tipo))
#Eliminar na
Vivienda1 <- na.omit(Vivienda1)
summary(Vivienda1)
##        id            estrato         preciom         areaconst     
##  Min.   :  58.0   Min.   :3.000   Min.   :  89.0   Min.   :  30.0  
##  1st Qu.: 766.2   1st Qu.:3.000   1st Qu.: 261.2   1st Qu.: 140.0  
##  Median :2257.0   Median :4.000   Median : 390.0   Median : 240.0  
##  Mean   :2574.6   Mean   :4.202   Mean   : 445.9   Mean   : 264.9  
##  3rd Qu.:4225.0   3rd Qu.:5.000   3rd Qu.: 550.0   3rd Qu.: 336.8  
##  Max.   :8319.0   Max.   :6.000   Max.   :1940.0   Max.   :1440.0  
##   parqueaderos        banios        habitaciones       barrio         
##  Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Length:722        
##  1st Qu.: 0.000   1st Qu.: 2.000   1st Qu.: 3.000   Class :character  
##  Median : 1.000   Median : 3.000   Median : 4.000   Mode  :character  
##  Mean   : 1.314   Mean   : 3.555   Mean   : 4.507                     
##  3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 5.000                     
##  Max.   :10.000   Max.   :10.000   Max.   :10.000                     
##     longitud         latitud     
##  Min.   :-76.59   Min.   :3.333  
##  1st Qu.:-76.53   1st Qu.:3.452  
##  Median :-76.52   Median :3.468  
##  Mean   :-76.52   Mean   :3.460  
##  3rd Qu.:-76.50   3rd Qu.:3.482  
##  Max.   :-76.47   Max.   :3.496

Ya con esto tenemos completo nuestro dataset y podemos proceder a hacer nuestro análisis de relación entre variables.

Comenzamos por la relación entre nuestras variables y la variable objetivo que es el precio del inmueble.

library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggpairs(Vivienda1[,2:7], title="Correlacion Entre Variables")

Lo que sacamos de lo anterior es que tenemos un relación positiva, entre las demás variables y el precio de la vivienda, de esto obtenemos que también que nuestra variable que mas tiene relación con nuestra variable objetivo es el de area de construcción, seguido de estrato, baños, parqueadero y habitaciones en ese orden.

De acuerdo a lo anterior hacemos un gráfico de dispersión de la variable mas correlacionada con nuestra variable objetivo, es decir area construida contra precio. Ademas de esto por medio de una grafica interactiva agregamos la informacion de baños, parqueaderos y habitaciones, para que pueda ser señalado con el puntero.

library(plotly)
scatter_matrix <- plot_ly(
  Vivienda1,
  x = ~preciom,
  y = ~areaconst,
  type = "scatter",
  mode = "markers",
  marker = list(size = 10),
  text = ~paste("Parqueaderos: ", parqueaderos, "<br>Baños: ", banios, "<br>Habitaciones: ", habitaciones)
) %>%
  layout(
    title = "Relación entre Variables",
    showlegend = FALSE,
    height = 700,
    width = 700
  )
## Warning: Specifying width/height in layout() is now deprecated.
## Please specify in ggplotly() or plot_ly()
scatter_matrix

Tenemos 436 barrios, y 8.319 variables, lo cual es un buen candidato para un análisis de correspondencia más adelante.

3. Modelo de Regresión Lineal Múltiple

Ahora que ya hemos visto que si existe una relación entre nuestras variables y la de predicción, es decir el precio del inmueble, procemos a generar el modelo

# Suponiendo que Vivienda1 es tu dataframe
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = Vivienda1)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = Vivienda1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -964.04  -80.10  -17.08   50.06 1069.45 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -236.47551   30.36582  -7.788 2.40e-14 ***
## areaconst       0.82677    0.04368  18.926  < 2e-16 ***
## estrato        86.42579    7.39747  11.683  < 2e-16 ***
## habitaciones    1.44443    4.16411   0.347    0.729    
## parqueaderos   -1.67672    4.31505  -0.389    0.698    
## banios         26.97978    5.34384   5.049 5.65e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 159.1 on 716 degrees of freedom
## Multiple R-squared:  0.6508, Adjusted R-squared:  0.6484 
## F-statistic: 266.9 on 5 and 716 DF,  p-value: < 2.2e-16

De lo anterior interpretamos que hay un valor de intercepcion o \(b_{0}\) muy alto, esto quiere decir que el valor de las casas por mas pequeñas o poco que tengan inician con un valor alto. Por otro lado, sabes que por el coeficiente que acompaña mis valores que las variables que mas peso tienen son estrato, baños y area construida. Por otro lado parece un valor extraño que el modelo haya predicho que el coeficiente de parqueaderos sea negativo, como si la relacion entre el precio y el numero de parqueaderos sea inverso, lo cual no es así.

Tenemos como formula general de nuestro modelo de regresion lineal multiple que:

\(preciom=-236.47551+0.82677*areacons+86.42579*estrato+1.44443*habitaciones-1.67672*parqueaderos+26.97978*banios\)

y valor de \(R^{2}=0.6508\) y \(R^{2}_{ajustado}=0.6484\) que es algo razonable y moderado. Recordando que lo mejor es un valor cercano a 1.

3.1 Estimación paso a paso, para analisis de variables.

Con esta parte buscamos entender que aporta cada variable a la prediccion final del modelo

# se define el modelo  ingenuo  y= b0
modelo_b0<- lm(preciom ~ 1, data=Vivienda1)

#define model with all predictors
modelo_all <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data=Vivienda1)

# Se aplica el proceso forward stepwise regression
forward <- step(modelo_b0, direction='forward', scope=formula(modelo_all), trace=0)

# Visualización de los resultados 
forward$anova
##          Step Df   Deviance Resid. Df Resid. Dev      AIC
## 1             NA         NA       721   51926104 8076.348
## 2 + areaconst -1 27773709.6       720   24152394 7525.701
## 3   + estrato -1  5069011.9       719   19083382 7357.623
## 4    + banios -1   944488.2       718   18138894 7322.975

De lo anterior obtenemos que las variables que las variables que ayudaron a mejorar el rendimiento del modelo es areacons, estrato y baños, pero dejo de lado parqueadero y habitaciones. A continuación vemos los coeficientes y el error de \(R^{2}\) para nuestro nuevo modelo.

summary(forward)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios, data = Vivienda1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -958.78  -79.28  -18.28   49.58 1075.72 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -230.09209   26.57191  -8.659  < 2e-16 ***
## areaconst      0.82806    0.04234  19.556  < 2e-16 ***
## estrato       85.26855    6.99365  12.192  < 2e-16 ***
## banios        27.66782    4.52501   6.114 1.59e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.9 on 718 degrees of freedom
## Multiple R-squared:  0.6507, Adjusted R-squared:  0.6492 
## F-statistic: 445.8 on 3 and 718 DF,  p-value: < 2.2e-16

De lo anterior obtenemos unos valores similares a lo anterior. Un \(b_{0}\) muy alto, esto quiere decir que el valor de las casas por mas pequeñas o poco que tengan inician con un valor alto. Por otro lado, sabes que por el coeficiente que acompaña mis valores que las variables que mas peso tienen son estrato, baños y area construida.

Tenemos como formula general de nuestro modelo de regresion lineal multiple que:

Modelo mediante metodologia Steppwise:

\(preciom=-230.09209+0.82806*areacons+85.26855*estrato+27.66782*banios\)

y valor de \(R^{2}=0.6507\) y \(R^{2}_{ajustado}=0.6492\) que es algo razonable y moderado. Recordando que lo mejor es un valor cercano a 1.

Modelo anterior:

\(preciom=-236.47551+0.82677*areacons+86.42579*estrato+1.44443*habitaciones-1.67672*parqueaderos+26.97978*banios\)

y valor de \(R^{2}=0.6508\) y \(R^{2}_{ajustado}=0.6484\)

Como vemos realmente no hay mucha diferencia entre ambas metricas y como \(R^{2}_{ajustado}\) castiga que haya mas variables pues nos da un poco mejor en este caso para el anterior. Pero no hay mucha diferencia entre implementar un modelo u otro, y ya que necesitamos las variables de habitaciones y parqueaderos, para el modelo, ya que son parte de los requerimientos se escoge el modelo inicial, y se descarta el hecho por steppwise, aunque lo siguiente nos ayudo a entender mejor la relación de nuestras variables con el precio de la vivienda.

3.2. Analisis \(R^{2}\)

Lo que observamos de nuestro \(R^{2}\) es que con un valor \(R^{2}=0.6507\), nos puede explicar 65% de la variabilidad de los datos, de manera proporcional. Lo ideal sería que fuera cerca 1, pero en este caso no se presenta.

Para mejorar esta metrica podríamos tomar acciones como buscar mas variables relevante para el modelo, escalar las variables para que esten en la misma magnitud, también eliminar outliers, detectar de multicolinealidad para eliminar variables que tal vez presenten redundancia de información.

4. Validacion De Supuestos

Vamos a revisar inicialmente Linealidad mediante la siguiente un gráfico de residuos versus valores ajustados (scatterplots) para verificar si la relación entre las variables predictoras y la variable de respuesta es lineal. Si se observa patrones no lineales en estos gráficos, podría indicar una violación de la linealidad.

# Obtener los residuos y los valores ajustados
residuos <- residuals(modelo)
valores_ajustados <- fitted(modelo)

# Crear el gráfico de residuos versus valores ajustados
plot(valores_ajustados, residuos, main = "Gráfico de Residuos vs. Valores Ajustados",
     xlab = "Valores Ajustados", ylab = "Residuos")
abline(h = 0, col = "red", lty = 2)  # Línea horizontal en y=0 para referencia

Al ser un modelo Regeresion lineal, el modelo cumple con linealidad.

Ahora vamos a evaluar la normalidad del modelo con QQplot y una prueba de Shapiro-Wilk

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

En el Q-Q plot obtenemos que el comportamiento de los datos se asemeja algo a la diagonal lo que indicaría que la distribución es normal, y aunque vamos a confirmarlos con el resultado del test de Shapiro-Wilk el valor \(p < 0,05\) para lo que implica que la distribución de los datos es significativamente diferente de la distribución normal. En otras palabras, no podemos asumir la normalidad. Con la inspección visual notamos que los puntos no forman una diagonal, podríamos opinar que no hay suficiente evidencia aceptar que tiene una distribución normal.

## 
##  studentized Breusch-Pagan test
## 
## data:  modelo
## BP = 139, df = 5, p-value < 2.2e-16

El p-valor es extremadamente pequeño \(p < 2,2e^{-16}\) , lo que sugiere que hay heterocedasticidad en los residuos del modelo, lo que quiere decir que la varianza de los errores de un modelo estadístico no es constante. Esto puede deberse a que la distribucion de los datos originales, no corresponde bien a un modelo lineal.

5. Entrenamiento modelo y generar datos de entrenamiento y testeo.

Ahora vamos a proceder a generar el modelo pero solo con una proporción de los datos que vamos a llamar datos de entrenamiento, y vamos a dejar otros datos de testeo. Para probar el rendimiento del modelo

## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = datos_entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -767.94  -82.43  -20.27   47.44 1026.16 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -238.0965    35.6840  -6.672 6.68e-11 ***
## areaconst       0.9132     0.0512  17.837  < 2e-16 ***
## estrato        81.8633     8.8550   9.245  < 2e-16 ***
## habitaciones    4.0646     4.8588   0.837    0.403    
## parqueaderos   -2.2614     5.1712  -0.437    0.662    
## banios         24.4086     6.0513   4.034 6.35e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 156.1 on 501 degrees of freedom
## Multiple R-squared:  0.6832, Adjusted R-squared:  0.6801 
## F-statistic: 216.1 on 5 and 501 DF,  p-value: < 2.2e-16

El modelo obtuvimos con todos los datos es:

\(preciom=-236.47551+0.82677*areacons+86.42579*estrato+1.44443*habitaciones-1.67672*parqueaderos+26.97978*banios\) \(R^{2}=0.6508\) y \(R^{2}_{ajustado}=0.6484\)

Modelo con datos de entrenamiento:

\(preciom=-238.0965+0.9132*areacons+81.8633*estrato+4.0646*habitaciones-2.2614*parqueaderos+24.4086*banios\) \(R^{2}=0.6832\) y \(R^{2}_{ajustado}=0.6801\)

Como observamos a pesar de trabajar con el 70% de los datos, el modelo nos da muy similar en ambos casos, lo cual es una buena señal de que el modelo logro tomar la generalidad de los datos, Aunque en este caso el \(R^{2}\) y \(R^{2}_{ajustado}\) dan un valor mas cercano 1. Lo cual nos podría indicar que se ajusta mejor a los datos de entrenamiento, que con los datos de testeo, o todo el conjunto de datos en general.

6 Prediccion de modelo con datos de testeo.

Ahora vamos a probar el modelo generado, con el conjunto de datos que dejamos para testear el modelo. Con esto podemos ver el valor predicho, versus el valor real.

##     Observado Predicciones      Residuos
## 1         780    599.14776   180.8522435
## 2         600    351.17108   248.8289198
## 3         420    462.77968   -42.7796796
## 4         230    214.62278    15.3772244
## 5         190    404.75254  -214.7525376
## 6         180    202.50178   -22.5017835
## 7         520    725.04536  -205.0453592
## 8         485    479.22762     5.7723761
## 9         390    594.86000  -204.8599988
## 10        680    528.78229   151.2177068
## 11        800    617.95416   182.0458422
## 12        700    738.08986   -38.0898624
## 13        620    655.40344   -35.4034447
## 14        790    728.95747    61.0425319
## 15        750    524.13269   225.8673148
## 16        600    567.22823    32.7717697
## 17        280    339.15943   -59.1594294
## 18        460    719.14777  -259.1477732
## 19        600    589.47044    10.5295565
## 20        850    771.95666    78.0433382
## 21        490    392.87509    97.1249129
## 22        280    252.02287    27.9771293
## 23        240    125.12531   114.8746883
## 24        450    490.70016   -40.7001592
## 25        154    167.54600   -13.5460044
## 26        270    223.84189    46.1581133
## 27        120     96.62883    23.3711716
## 28        165    163.89305     1.1069533
## 29        210    166.69938    43.3006152
## 30        129    145.21658   -16.2165791
## 31        149    187.22559   -38.2255927
## 32        600    514.33213    85.6678704
## 33       1200    708.52766   491.4723392
## 34        170    259.95648   -89.9564787
## 35        420    564.12763  -144.1276341
## 36        560    299.78976   260.2102396
## 37        900    615.46332   284.5366810
## 38        257    182.15784    74.8421647
## 39        369    444.33199   -75.3319943
## 40        245    378.39269  -133.3926945
## 41        400    414.60677   -14.6067723
## 42        485    404.88941    80.1105932
## 43        370    446.37740   -76.3774002
## 44        550    569.92473   -19.9247319
## 45        450    506.18023   -56.1802316
## 46        315    445.30136  -130.3013611
## 47        250    508.83323  -258.8332330
## 48        350    421.22507   -71.2250664
## 49        340    392.29012   -52.2901159
## 50        600    670.70603   -70.7060311
## 51        400    416.85770   -16.8576992
## 52        145    153.00079    -8.0007934
## 53        300    215.71891    84.2810883
## 54        550    513.06334    36.9366616
## 55        380    472.20595   -92.2059512
## 56        470    548.11446   -78.1144636
## 57        540    475.91656    64.0834388
## 58        430    420.89278     9.1072239
## 59        340    532.30532  -192.3053172
## 60        485    464.40000    20.5999997
## 61        480    442.56164    37.4383572
## 62        520    623.17106  -103.1710581
## 63        990    512.43337   477.5666306
## 64        520    559.08466   -39.0846629
## 65        380    550.67945  -170.6794470
## 66        520    541.14814   -21.1481426
## 67        570    445.30136   124.6986389
## 68        780    765.68293    14.3170684
## 69        655    671.63937   -16.6393676
## 70        600    766.55612  -166.5561186
## 71        420    463.23788   -43.2378814
## 72        500    557.80310   -57.8031028
## 73        780    772.00899     7.9910122
## 74        550    590.33716   -40.3371601
## 75        585    702.00505  -117.0050512
## 76        650    700.22193   -50.2219307
## 77        480    404.99608    75.0039209
## 78        420    486.75269   -66.7526871
## 79        480    401.20422    78.7957798
## 80        350    425.34003   -75.3400273
## 81        390    601.13323  -211.1332336
## 82        320    409.62890   -89.6288961
## 83        340    444.97309  -104.9730929
## 84        600    607.12053    -7.1205291
## 85        550    575.08803   -25.0880321
## 86        680    586.96014    93.0398553
## 87        430    662.63691  -232.6369070
## 88        370    449.03773   -79.0377297
## 89        800    717.10528    82.8947191
## 90        420    759.08093  -339.0809332
## 91        320    386.29635   -66.2963501
## 92        680    562.78098   117.2190210
## 93        330    527.34918  -197.3491775
## 94        350    430.02517   -80.0251703
## 95        253    302.17165   -49.1716505
## 96        321    538.72125  -217.7212546
## 97        330    304.43307    25.5669302
## 98        150    133.09179    16.9082143
## 99        230    253.21835   -23.2183509
## 100       180    226.63443   -46.6344264
## 101       219    243.75656   -24.7565560
## 102       275    192.66481    82.3351949
## 103       185    222.75205   -37.7520492
## 104       220    146.63138    73.3686212
## 105       180    200.39936   -20.3993624
## 106       330    227.17935   102.8206549
## 107       310    212.20866    97.7913435
## 108       265    265.49834    -0.4983412
## 109       580    346.54093   233.4590677
## 110       215    182.15784    32.8421647
## 111       430    366.20736    63.7926409
## 112       160    302.12829  -142.1282920
## 113       180    170.35234     9.6476574
## 114       350    369.58871   -19.5887102
## 115      1500    621.47718   878.5228181
## 116      1250    679.18519   570.8148050
## 117       310    310.57687    -0.5768663
## 118       280    217.56865    62.4313481
## 119       290    225.55839    64.4416127
## 120       400    372.75273    27.2472652
## 121       295     94.82561   200.1743891
## 122       690    792.63201  -102.6320125
## 123       330    505.24690  -175.2468951
## 124       475    599.47336  -124.4733558
## 125       410    504.10804   -94.1080376
## 126       390    536.29704  -146.2970356
## 127       300    391.77579   -91.7757866
## 128       390    511.88845  -121.8884506
## 129       650   1032.09996  -382.0999650
## 130       650    709.16054   -59.1605433
## 131       220    292.31208   -72.3120778
## 132       420    398.41962    21.5803815
## 133       370    309.59968    60.4003240
## 134       180    207.29360   -27.2935988
## 135       550    713.23670  -163.2367022
## 136       730    740.81614   -10.8161447
## 137       400    516.23863  -116.2386342
## 138       780    693.80916    86.1908423
## 139       480    565.26802   -85.2680165
## 140       410    475.35887   -65.3588735
## 141       580    523.95939    56.0406069
## 142       390    501.38778  -111.3877793
## 143      1650    922.36370   727.6362998
## 144       168    155.67389    12.3261081
## 145       850    648.66554   201.3344623
## 146       600    586.68800    13.3119962
## 147       490    598.42058  -108.4205781
## 148      1300    997.62045   302.3795471
## 149       790    755.01630    34.9837036
## 150       430    724.56390  -294.5638960
## 151       490    434.30646    55.6935423
## 152       780    611.55832   168.4416825
## 153       480    538.04413   -58.0441257
## 154       570    663.69616   -93.6961550
## 155       850    746.20886   103.7911357
## 156       490    838.05180  -348.0517955
## 157       785    716.45788    68.5421163
## 158       590    814.55645  -224.5564499
## 159       500    636.00962  -136.0096240
## 160       850    766.36675    83.6332484
## 161       440    757.10175  -317.1017547
## 162       130    150.69602   -20.6960156
## 163       215    172.84318    42.1568186
## 164       320    334.30832   -14.3083225
## 165       600    608.94701    -8.9470080
## 166       430    440.13806   -10.1380609
## 167       360    398.23508   -38.2350825
## 168       350    344.78890     5.2111033
## 169       600    553.94082    46.0591773
## 170       690    631.68562    58.3143848
## 171       430    440.90846   -10.9084561
## 172       370    542.09197  -172.0919715
## 173       450    443.35214     6.6478649
## 174       360    623.11721  -263.1172072
## 175       380    275.95985   104.0401521
## 176       205    141.88542    63.1145808
## 177       270    243.26929    26.7307105
## 178       690    790.04499  -100.0449939
## 179       500    574.56321   -74.5632104
## 180      1200    999.67838   200.3216168
## 181       125    273.32680  -148.3268019
## 182       162    136.99742    25.0025758
## 183       145    150.69602    -5.6960156
## 184       140    132.43123     7.5687729
## 185       160    159.82841     0.1715901
## 186       120    117.15504     2.8449637
## 187       160    214.62278   -54.6227756
## 188       167    159.82841     7.1715901
## 189       370   1458.57745 -1088.5774514
## 190       140    159.82841   -19.8284099
## 191       110    100.71673     9.2832734
## 192       132    150.69602   -18.6960156
## 193       117    153.68461   -36.6846134
## 194       165    174.02856    -9.0285616
## 195       210    123.29883    86.7011672
## 196       155    136.99742    18.0025758
## 197       135    150.69602   -15.6960156
## 198       115    190.21419   -75.2141905
## 199       223    243.24603   -20.2460282
## 200       240    251.46518   -11.4651830
## 201       223    243.24603   -20.2460282
## 202       190    228.90634   -38.9063382
## 203       340    441.56901  -101.5690147
## 204       320    389.20154   -69.2015370
## 205       450    428.11261    21.8873884
## 206       360    446.14640   -86.1463986
## 207       410    584.94760  -174.9476048
## 208       340    476.42442  -136.4244201
## 209       550    416.90106   133.0989424
## 210       380    499.07984  -119.0798372
## 211       380    460.78307   -80.7830729
## 212       340    290.13674    49.8632617
## 213       265    324.52434   -59.5243372
## 214       400    495.61294   -95.6129405
## 215       120    128.27671    -8.2767090

De lo anterior podemos observar algunas predicciones buenas, donde la diferencia con el valor real es 5 millones o 15, lo cual es perfectamente negociable. Pero por otro lado tenemos algunas donde incluso la diferencia con el valor predicho es de cerca de 200 millones, esto debido tal vez que el modelo de regresión Lineal Multiple, no es suficiente para predecir toda la varianza contenida en los datos iniciales del modelo, y tal vez con transformación de variables podríamos generar un mejor modelo. Aunque igual sirve para darnos un estimado de precio inicial para una vivienda.

7. Error cuadrático medio(MSE), el error absoluto medio(MAE) y el R2

En la siguiente sección vamos a usar distintas métricas de error sobre las predicciones hechas sobre el dataset de testeo.

## Error Cuadrático Medio (MSE): 28256.63
## Error Cuadrático Medio (RMSE): 14128.32
## Error Absoluto Medio (MAE): 102.7515
## R2: 0.5453289

De las medidas obtenidas de MSE es 28.256,63 y RMSE 14.256,63 esto es un valor bastante elevado de error, teniendo en cuenta que estamos en ordenes de magnitud 1.000, lo cual preocupa del desempeño del modelo.

Por otro lado el MAE nos indica un error promedio de aproximadamente 102.75 millones, lo cual es teniendo en cuenta los precios en los que oscilan las viviendas es mucho, porque puede llegar representar una disminución de precio del 20% o un aumento similar, hay que hacer un tratamiento de datos mas exhaustivo sobre los datos obtenidos, incluyendo transformación de variables, búsqueda de nuevas variables. Esto podría ayudar a mejorar el resultado del modelo.

Ademas, de esto tener en cuenta que el MSE castiga mucho los errores muy grande, debido a que al estar elevado al cuadrado, lo que hace es que los errores grande se vuelvan aun mas grande y al promediar castigue muy duro al modelo. Esto nos indicaría que probablemente tenemos problemas con algunos datos en particular donde la diferencia de precio es muy grande. Ya que la métrica MAE es bastante mas baja, nos indicaría también que en promedio el error no es tan grande, pero si hay valores particulares donde la predicción se aleja mucho del valor real.

Por ultimo, tenemos un \(R^{2}=0,5453\) lo que significa que alrededor del 54.53% de la variabilidad en los precios de las casas se explica por el modelo. Lo que nos indicaría que el modelo tiene un poder explicativo moderado.

8.Conclusiones :

  • Hacer un buen tratamiento de datos y análisis extenso antes de generar un modelo predictivo es importante para que cuando el modelo y algoritmo se configure pueda tener un mejor desempeño al momento de evaluarlo.

  • Las métricas escogidas para la evaluación del modelo son importantes, ya que cada una puede dar información importante y particular sobre el desempeño del modelo. Ejemplo con el MSE sabemos que tuvimos valores en los que la diferencia con el valor real de la vivienda fue muy grande, por tanto la métrica dio muy elevada, pero por otro lado sabemos que en realidad el error promedio no es tan elevado ya que MAE dio en una escala mucha mas baja, es decir el modelo puede predecir ciertos comportamientos del valor de la casa, pero algunos valores no puede predecirlos con la información aportada. Y ademas el \(R^{2}\) nos indica que solo podemos explicar un poco mas de la mitad de la varianza de los datos, pero hay otros valores cuya varianza se sale de lo que puede predecir el modelo, esto se podría mejorar cambiando el orden de las variables, es decir que elevar algunos valores al cuadrado o transformándolos para que pueda predecir esos valores que se escapan a una predicción lineal.

  • Por otro lado, hubo variables importantes que no se tuvieron en cuenta al momento de predecir como lo fue el barrio, o incluso la ubicación de acuerdo a longitud y latitud, así el modelo podría asumir que hacia mas el norte o hacia mas sitios en concreto de la ciudad pueda tener mejor predicción.