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