Aplicar la técnica estadística de regresión lineal múltiple al conjunto de datos de la compañia C&A determinando el grado de influencia de las variables independientes sobre la variable dependiente.
La dimensión de la base de datos inicial es de 8322 registros y 13 variables relacionadas con el mercado inmobiliario.
dim(vivienda)
[1] 8322 13
Un resumen inicial de la base de datos es el siguiente:
head(vivienda)
# A tibble: 6 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1147 Zona O… <NA> 3 250 70 1 3 6
2 1169 Zona O… <NA> 3 320 120 1 2 3
3 1350 Zona O… <NA> 3 350 220 2 2 4
4 5992 Zona S… 02 4 400 280 3 5 3
5 1212 Zona N… 01 5 260 90 1 2 3
6 1724 Zona N… 01 5 240 87 1 3 3
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
En donde se puede validar que efectivamente la base suministrada cuenta con 13 variables, de las cuales 9 son de tipo cuantitativo (id, precio, piso, area construida, parqueadero, baños, habitaciones, latitud y longitud), 4 variables de tipo cualitativo (tipo de vivienda, zona de ubicación, barrio y estrato sociodemográfico). Adicionalmente esta vista nos muestra los 6 primeros valores que toma cada una de estas.
summary(vivienda)
id zona piso estrato
Min. : 1 Length:8322 Length:8322 Min. :3.000
1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
Median :4160 Mode :character Mode :character Median :5.000
Mean :4160 Mean :4.634
3rd Qu.:6240 3rd Qu.:5.000
Max. :8319 Max. :6.000
NA's :3 NA's :3
preciom areaconst parqueaderos banios
Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
NA's :2 NA's :3 NA's :1605 NA's :3
habitaciones tipo barrio longitud
Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
Median : 3.000 Mode :character Mode :character Median :-76.53
Mean : 3.605 Mean :-76.53
3rd Qu.: 4.000 3rd Qu.:-76.52
Max. :10.000 Max. :-76.46
NA's :3 NA's :3
latitud
Min. :3.333
1st Qu.:3.381
Median :3.416
Mean :3.418
3rd Qu.:3.452
Max. :3.498
NA's :3
Este resumen muestra que:
Dado que la base cuenta con datos faltantes, en este apartado se analizaran y organizaran usando las técnicas más adecuadas para cada variable.
Para analizar más a fondo la información contenida en la base se
evalúa en detalle los faltantes de cada variable.
vivienda_faltantes <- colSums(is.na(vivienda)) %>%
as.data.frame()
vivienda_faltantes
.
id 3
zona 3
piso 2638
estrato 3
preciom 2
areaconst 3
parqueaderos 1605
banios 3
habitaciones 3
tipo 3
barrio 3
longitud 3
latitud 3
Y efectivamente la base contiene datos faltantes en todas sus variables como se muestra en el resumen anterior, siendo la variable piso y parqueaderos las más afectadas con 2638 y 1605 registros faltantes respectivamente.
md.pattern(vivienda, rotate.names = TRUE)
preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
4808 1 1 1 1 1 1 1 1 1 1
1909 1 1 1 1 1 1 1 1 1 1
876 1 1 1 1 1 1 1 1 1 1
726 1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
2 3 3 3 3 3 3 3 3 3
latitud parqueaderos piso
4808 1 1 1 0
1909 1 1 0 1
876 1 0 1 1
726 1 0 0 2
1 0 0 0 12
2 0 0 0 13
3 1605 2638 4275
Del gráfico anterior se logra identificar que tres registros no cuentan con la mayoría de los datos, solo uno de estos registros cuenta con la variable preciom y es por esto que se decide eliminar estos tres registros ya que en comparación con la base total es una cantidad muy pequeña, por lo cual esta no se verá afectada. Quedando con una base de 8319 registros.
#Eliminar los registros sin variables
vivienda_sf <- vivienda[!is.na(vivienda$id),]
dim(vivienda_sf)
[1] 8319 13
La variable piso y parqueaderos continuan con valores faltantes, siendo estos del 32% y 19% respectivamente.
vis_miss(vivienda_sf)
Es por esto que se procede a evaluar estas variables y definir la mejor forma de organizarlas.
#Completar valores faltantes
vivienda_sf$parqueaderos[is.na(vivienda_sf$parqueaderos)] <- 0
barplot(table(vivienda_sf$piso), main = "Distribución de la variable piso",
ylab = "Frecuencia", xlab = "Piso",col = "cadetblue",
border =par("fg"))
vivienda_sf$piso <- as.numeric(as.character(vivienda_sf$piso))
summary(vivienda_sf$piso)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
1.000 2.000 3.000 3.771 5.000 12.000 2635
El gráfico de barras nos muestra que la variable piso tiene una asimetria positiva hacia la derecha como lo muestra su cola. Igualmente el resumen estadistico indica una media de 3.7 y una mediana de 3, por lo que trabajaremos con la mediana ya que es el valor que más se ajusta al tipo de esta variable.
#Completar valores faltantes
vivienda_sf$piso[is.na(vivienda_sf$piso)] <- 3
Con la imputación realizada a estas variables podemos evidenciar que la base de datos ya no tiene datos faltantes, como lo certifica el siguiente mapa de valores faltantes:
gg_miss_var(vivienda_sf)
Otra validación importante es garantizar que no se cuente con registros duplicados en la base ya que esto podria modificar los resultados.
duplicados <- duplicated(vivienda_sf) #identificar registros duplicados
table(duplicados) #Conocer la cantidad de registros duplicados
duplicados
FALSE
8319
La base no cuenta con registros duplicados.
Y por último se procede a eliminar la variable id ya que es un identificador unico, por lo cual no aporta al analisis estadistico y también se eliminaran las variables latitud y longitud dado que no se hará ningun analisis espacial.
vivienda_sf <- vivienda_sf[,!names(vivienda_sf) %in% c("id","longitud","latitud")]
Esto contribuye a reducir la dimensionalidad de la base de datos, quedando con 10 variables.
dim(vivienda_sf)
[1] 8319 10
Se crea una sub-base llamada aptos para filtrar en esta solo los registros que cumplan con la condición de ser tipo = Apartamento y se muestran los 3 primeros registos de este.
aptos <- subset(vivienda_sf, tipo == "Apartamento")
head(aptos, 3)
# A tibble: 3 × 10
zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 Zona N… 1 5 260 90 1 2 3 Apar…
2 Zona N… 1 5 240 87 1 3 3 Apar…
3 Zona N… 1 4 220 52 2 2 3 Apar…
# ℹ 1 more variable: barrio <chr>
Algunas tablas de frecuencia que comprueban que la sub-base quedo bien establecida:
est_tipo <- table(aptos$estrato, aptos$tipo)
print("Tabla de frecuencia estrato vs tipo")
[1] "Tabla de frecuencia estrato vs tipo"
est_tipo
Apartamento
3 639
4 1404
5 1766
6 1291
zona_tipo <- table(aptos$zona, aptos$tipo)
print("Tabla de frecuencia zona vs tipo")
[1] "Tabla de frecuencia zona vs tipo"
zona_tipo
Apartamento
Zona Centro 24
Zona Norte 1198
Zona Oeste 1029
Zona Oriente 62
Zona Sur 2787
piso_tipo <- table(aptos$piso, aptos$tipo)
print("Tabla de frecuencia piso vs tipo")
[1] "Tabla de frecuencia piso vs tipo"
piso_tipo
Apartamento
1 430
2 512
3 1954
4 545
5 564
6 243
7 200
8 211
9 146
10 128
11 84
12 83
Realizar un análisis exploratorio enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda.
Comenzaremos con el análisis de correlación entre variables cuantitativas especificamente entre el precio del apartamento vs el número de baños y el número de habitaciones.
# Gráfico entre el precio del apartamento vs el número de baños y el número de habitaciones
grafico_bh <- plot_ly()
grafico_bh <- add_trace(grafico_bh, data = aptos, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers', name = 'Número de baños')
grafico_bh <- add_trace(grafico_bh, data = aptos, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers', name = 'Número de habitaciones')
grafico_bh <- layout(grafico_bh, title = "Relación entre diferentes variables y el precio",
xaxis = list(title = "Valor de la variable"),
yaxis = list(title = "Precio (millones)"))
# Mostrar el gráfico
grafico_bh
Como se puede observar el número de habitaciones oscila entre 0 y 9, asi mismo el número de baños va de 0 a 8 con precios desde 58 hasta 1950 millones de pesos. Y según el gráfico se evidencia una pequeña relación entre el número de baños y el precio de los apartamentos, donde a medida que se tienen más baños el precio comienza a aumentar. Y para la variable número de habitaciones no es tan evidente esta relación, aunque evaluaremos la matriz de correlaciones.
Adicionalmente, las variables número de baños y de habitaciones presentan datos extraños como lo es el valor de cero, ya que entendiendo el contexto del análisis no es lógico que una vivienda no cuente con ningún baño o ninguna habitación, esto se debe tener presente para la interpretación de los resultados.
# Gráfico entre precio, area y estrato
grafico_est <- plot_ly(data = aptos,
x = ~areaconst,
y = ~preciom,
color = ~factor(estrato),
type = 'scatter',
mode = 'markers',
colors = "Dark2") %>%
layout(title = "Precio vs Área construida por Estrato",
xaxis = list(title = "Área construida (m^2)"),
yaxis = list(title = "Precio (millones)"),
legend = list(title = list(text = "Estrato")))
# Mostrar el gráfico
grafico_est
En el gráfico anterior se observa que los apartamentos de todos los estratos estan mayormente concentrados entre los 35 y 400 m^2. También se evidencia que son que escasos los apartamentos con más de 500 m^2. Y respecto al precio oscilan en su mayoria entre 58 y 500 millones.
Aqui se evidencia, una relación directa entre el precio y el área construida. En la mayoría de los casos, a medida que el precio aumenta, también lo hace el área construida. Con esto se comprueba que el tamaño de la vivienda es un factor muy importante y un predictor siginificativo en la determinación del precio de la misma. También podemos concluir que entre más alto el estrato del apartamento, también tiende a ser más alto el precio.
# Gráfico distribución de precios por zona
grafico_z <- plot_ly(data = aptos,
x = ~zona,
y = ~preciom,
type = 'box',
color=~zona) %>%
layout(title = "Distribución de precios por zonas",
yaxis = list(title = "Precio (millones)"),
xaxis = list(title = "Zona"),
showlegend = FALSE)
# Mostrar el gráfico
grafico_z
Ahora comparando las variables precio versus la zona, podemos darnos cuenta que la Zona Oriente y Centro son las que cuentan con el precio más bajo y la Zona Oeste tiene el precio más alto. Por otro lado las medianas de las Zonas Norte y Sur son muy similares entre si.
# Codificar 'zona' como factor
aptos$zona <- as.factor(aptos$zona)
# Ajuste del modelo de regresión
mod_pz <- lm(preciom ~ zona, data = aptos)
# Resumen del modelo
summary(mod_pz)
Call:
lm(formula = preciom ~ zona, data = aptos)
Residuals:
Min 1Q Median 3Q Max
-582.93 -141.29 -52.29 57.71 1452.71
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 186.58 50.20 3.717 0.000204 ***
zonaZona Norte 98.58 50.70 1.944 0.051906 .
zonaZona Oeste 481.34 50.78 9.479 < 2e-16 ***
zonaZona Oriente -33.99 59.12 -0.575 0.565415
zonaZona Sur 110.71 50.41 2.196 0.028140 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 245.9 on 5095 degrees of freedom
Multiple R-squared: 0.2776, Adjusted R-squared: 0.277
F-statistic: 489.3 on 4 and 5095 DF, p-value: < 2.2e-16
Al realizar un modelo de regresión simple entre el precio y la zona, nos damos cuenta que la categoria Zona Oeste es la que más significancia tiene por lo cual se utilizara en el modelo de regresión lineal múltiple.
aptos_num <- cor(aptos[c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
# Visualizar la matriz de correlación con plotly
plot_ly(z = aptos_num, colorscale = "Viridis", type = "heatmap",
x = colnames(aptos_num), y = colnames(aptos_num)) %>%
layout(title = "Matriz de Correlación")
Con la matriz de correlaciones verificamos la relación entre el área construida, el número de baños, el estrato y el precio siendo de 82%, 74% y 66% respectivamente. Y la variable que menos relación tiene con el precio es el número de las habitaciones con un 30%.
aptos$D1=as.numeric(aptos$zona=="Zona Oeste")
mod <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos + D1, data = aptos)
summary(mod)
Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
parqueaderos + D1, data = aptos)
Residuals:
Min 1Q Median 3Q Max
-1749.75 -51.83 -1.10 45.19 983.47
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -184.26484 13.08348 -14.08 <2e-16 ***
areaconst 2.05636 0.04165 49.37 <2e-16 ***
estrato 42.47348 2.65952 15.97 <2e-16 ***
banios 51.61264 2.95121 17.49 <2e-16 ***
habitaciones -34.01179 3.22812 -10.54 <2e-16 ***
parqueaderos 51.32050 2.89475 17.73 <2e-16 ***
D1 87.95927 5.29621 16.61 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 130.6 on 5093 degrees of freedom
Multiple R-squared: 0.7962, Adjusted R-squared: 0.796
F-statistic: 3316 on 6 and 5093 DF, p-value: < 2.2e-16
Interpretación de los coeficientes
Intercepto (Intercept): El estimado del intercepto es de -184.26, esto significa que cuando todas las variables predictores sean cero, el precio estimado de un apartamento es de -$184.26. Este valor es estadisticamente significativo con un valor de p< 2e-16 Esto es una situación que no refleja la realidad, ya que es ilogico que un apartamento tenga un área, estrato, número de baños, habitaciones y parqueaderos igual a cero.
Área construida (areaconst): El estimado para el área construida es de 2.05, esto significa que manteniendo todas las demás variables constantes se espera que, por cada metro cuadrado adicional de área construida, el precio del apartamento aumente $2.05 millones. Este valor es razonable, aunque este valor también puede depender de la que zona u obra en la que este construido el apartamento.
Estrato (estrato): El estimado para el estrato es de 42.47, esto significa que manteniendo todas las demás variables constantes se espera que, cuando se pasa de un estrato a otro el precio del apartamento aumenta en $42.47 millones.
Números de baños (banios): El estimado para el número de baños es de 51.61, esto significa que manteniendo todas las demás variables constantes se espera que, por cada baño adicional el precio del apartamento aumente $51.61 millones.
Número de habitaciones (habitaciones): El estimado para el número de habitaciones es de -34.01, esto significa que manteniendo todas las demás variables constantes se espera que, por cada habitación adicional el precio del apartamento disminuya $34.01 millones. Esto es algo ilogico, ya que al tener habitaciones adicionales el precio deberia aumentar más no disminuir como lo indica este coeficiente. Aunque también puede ser razonable que entre mas habitaciones disminuir el precio si el espacio total no aumenta.
Número de parqueaderos (parqueaderos): El estimado para el número de parqueaderos es de 51.32, esto significa que manteniendo todas las demás variables constantes se espera que, por cada parqueadero adicional el precio del apartamento aumente $51.32 millones.
Zona Oeste (D1): El estimado es de esta zona es de 87.95, esto significa que, manteniendo constantes todas las demás variables del modelo el precio del apartamento en la “Zona Oeste” es, en promedio, $87.96 millones más alto que el precio de la vivienda en las demás zonas.
Algo en común que tienen todos estos coeficientes es que sus valores son estadisticamente significativos con un valor de p< 2e-16
Análisis R2
Este coeficiente de determinación indica la proporción de la varianza en la variable dependiente que es explicada por las variables independientes. En este caso con un 0.7962 (79.62%) podemos afirmar que la variables independientes explican en muy buena proporción la variabilidad de la variable precio, lo que indica que el modelo tiene un buen ajuste.
Aunque tenemos un buen R2, se podria revisar diferentes opciones para mejorar, como eliminar la variable número de habitaciones ya que vimos en la matriz de correlaciones que era la que menos relación tenia con el precio y otra cosa que podriamos hacer es aplicar transformaciones al modelo en todas la variables para ver si su explicación de la variabilidad mejora.
errores <- mod$residuals
ajustados <- mod$fitted.values
1. Relación lineal
#Prueba grafica
plot(ajustados, errores,
main = "Errores vs Valores ajustados",
ylab = "Errores",
xlab = "Valores ajustados")
abline(h = 0, col = "red", lwd=2, lty=2)
El gráfico de errores vs valores ajustados muestra un estilo de embudo aumentando la dispersión de los puntos con respecto a la linea cero a medida que los valores ajustados van aumentando, evidenciando que no están dispersos de manera aleatoria sugiriendo una posible no linealidad.
2. Normalidad: se cumple si los errores siguen una distribución normal
\[ H_0: \text{ Los errores siguen una distribución normal} \\ H_1: \text{ Los errores no siguen una distribución normal} \]
#Prueba grafica
par(mfrow=c(1,2))
hist(errores, main="Histograma de residuales",
xlab="Residuos", ylab="Frecuencia", col="azure3")
qqnorm(errores, main="QQplot de residuales",
xlab="Cuantiles teóricos", ylab="Cuantiles de muestra", col="cadetblue2")
qqline(errores, col = "red", lwd=2, lty=2)
#Prueba Estadistica Shapiro Wilk
if (length(errores) > 5000) {
errores_sample <- sample(errores, 5000)
shapiro.test(errores_sample)
} else {
shapiro.test(errores)
}
Shapiro-Wilk normality test
data: errores_sample
W = 0.82675, p-value < 2.2e-16
Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por lo cual los errores no siguen una distribución normal, lo cual indica que no esta capturando completamente la estructura de los datos. Esto lo apoya el gráfico qqplot donde todos los puntos no se ajustan a la línea recta (roja) y tienen una curvatura muy pronunciada en la parte superior derecha.
3. Homocedasticidad: se cumple si los errores tiene una varianza constante
\[ H_0: \text{ Los errores tiene varianza constante (Homogeneidad)} \\ H_1: \text{ Los errores no tienen varianza constante (Heterocedasticidad)} \]
plot(ajustados, errores,
main = "Errores vs Valores ajustados",
ylab = "Errores",
xlab = "Valores ajustados")
abline(h = 0, col = "red", lwd=2, lty=2)
#Prueba estadistica Breusch-Pagan
library(lmtest)
bptest(mod)
studentized Breusch-Pagan test
data: mod
BP = 1442.4, df = 6, p-value < 2.2e-16
Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por tal motivo hay evidencia de heterocedasticidad, lo que afirma el gráfico mostrando una especie de cono o embudo haciendo evidente la varianza creciente de los errores. La presencia de heterocedasticidad puede afectar la precisión de las estimaciones y los intervalos de confianza del modelo, y puede requerir ajustes adicionales.
4. No Autocorrelación (Independencia)
\[ H_0: \text{ No existe correlación serial entre los residuales} \\ H_1: \text{ Existe correlación serial entre los residuales} \]
#Prueba grafica
plot(aptos$preciom, errores, xlab="Precio", ylab="Residuos",
main = "Precio vs Residuales", col="coral3")
#Prueba estadística Durbin-Watson:
dwtest(mod)
Durbin-Watson test
data: mod
DW = 1.6544, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por lo cual existe correlación serial entre los residuales del modelo, igualmente en el gráfico se evidencia una dependencia positiva.
5. Ausencia de multicolinealidad
# Cálculo de factores de inflación de la varianza (VIF)
library(car)
vif(mod)
areaconst estrato banios habitaciones parqueaderos D1
2.493726 2.018892 2.971594 1.422506 2.015041 1.349925
Cuando los valores de VIF son bajos y están por debajo de ciertos umbrales (generalmente 10), indica que no hay multicolinealidad significativa entre esas variables. De esta manera, se puede concluir que no hay preocupaciones relevantes de multicolinealidad en el modelo.
En resumen: El modelo de regresión lineal múltiple planteado no cumple con los supuestos de linealidad, normalidad, homocedasticidad y no autocorrelación. Por lo tanto, no es un modelo valido ni preciso al momento de predecir el precio de los apartamentos en términos de las variables independientes planteadas. Aún es importante resaltar que no presenta multicolinealidad.
Para lograr esta estimación, primero se dividen los datos en dos subconjuntos (entrenamiento y prueba) de manera aleatoria. Y luego se estima el modelo con el subconjunto de datos de entrenamiento.
Para esto se utilizo la libreria caret.
# Semilla para reproducir
set.seed(50)
#library(caret)
dividir_datos <- createDataPartition(aptos$preciom, p = 0.7, list = FALSE)
train_data <- aptos[dividir_datos, ]
test_data <- aptos[-dividir_datos, ]
mod70 = lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos + D1, data = train_data)
summary(mod70)
Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
parqueaderos + D1, data = train_data)
Residuals:
Min 1Q Median 3Q Max
-1701.40 -52.53 -0.26 45.52 994.55
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -190.03065 15.48218 -12.274 < 2e-16 ***
areaconst 2.00069 0.04949 40.425 < 2e-16 ***
estrato 42.05355 3.17120 13.261 < 2e-16 ***
banios 51.33953 3.55953 14.423 < 2e-16 ***
habitaciones -30.82108 3.83569 -8.035 1.26e-15 ***
parqueaderos 53.96492 3.55891 15.163 < 2e-16 ***
D1 90.58090 6.35285 14.258 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 131.6 on 3565 degrees of freedom
Multiple R-squared: 0.7948, Adjusted R-squared: 0.7945
F-statistic: 2302 on 6 and 3565 DF, p-value: < 2.2e-16
# Hacer predicciones en el conjunto de prueba
prediciones <- predict(mod70, newdata = test_data)
# Evaluar el rendimiento del modelo
resultados <- data.frame(Real = test_data$preciom, Prediccion = prediciones)
# Imprimir los 6 primeros resultados
print("Primeros 6 resultados de las predicciones")
[1] "Primeros 6 resultados de las predicciones"
print(head(resultados))
Real Prediccion
1 240 309.8174
2 310 432.9957
3 385 344.4538
4 420 491.7727
5 620 471.0479
6 170 175.9380
# Calcular métricas de evaluación
mse <- mean((resultados$Real - resultados$Prediccion)^2)
cat("MSE:", mse)
MSE: 16509.06
metricas = postResample(pred = resultados$Prediccion, obs = resultados$Real)
print(metricas)
RMSE Rsquared MAE
128.4875853 0.7993801 78.4573985
Error Cuadrático Medio (MSE): El MSE es el promedio de los errores al cuadrado. Este valor muestra que, en promedio, el cuadrado de las diferencias entre los valores reales y los predichos es 16509.06.
Raíz del Error Cuadrático Medio (RMSE): El RMSE es la raíz cuadrada del MSE y está en la misma unidad que la variable dependiente preciom, lo que indica este resultado es que en promedio las predicciones del modelo se encuentran 128.48 millones de distancia al valor real.
Error Absoluto Medio (MAE): El MAE nos dice cuánto se desvían en promedio las predicciones del modelo respecto a los valores reales, lo que nos significa que en promedio el valor predicho se encuentra a 78.45 millones del valor real.
R2 (Rsquared): El R2 indica cuanta varianza en la variable respuesta es explicada por el modelo, en este caso se habla de que el modelo explica un 79.93% de la varianza de los precios de los apartamentos.
En conclusión:
Precisión del Modelo: El R2 sugiere que el modelo explica bastante bien la variabilidad en el precio de los apartamentos.
Error de Predicción: Aunque el RMSE y el MAE son relativamente bajos, indicando que las predicciones no están demasiado lejos de los valores reales.
Estas métricas muestran que el modelo es razonablemente bueno, pero también pueden sugerir que existe espacio para mejorar si se consideran más variables o se aplica al modelo alguna transformación.