En el siguiente trabajo se mostrará la regresion simple y multiple tomando los datos de los precios de vivienda en Cali.
Punto 1.
Regresión Lineal Simple
library(readxl)
vivienda <- read_excel("C:/Users/57321/Desktop/vivienda.xlsx")
View(vivienda)
library(summarytools)
## Warning: package 'summarytools' was built under R version 4.3.3
descr(vivienda$precio_millon,stats ="common")
## Descriptive Statistics
## vivienda$precio_millon
## N: 8322
##
## precio_millon
## --------------- ---------------
## Mean 433.89
## Std.Dev 328.65
## Min 58.00
## Median 330.00
## Max 1999.00
## N.Valid 8320.00
## Pct.Valid 99.98
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
##
## 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
data <- vivienda
require(plotly)
## Loading required package: plotly
## Warning: package 'plotly' was built under R version 4.3.3
##
## 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
require(datarium)
## Loading required package: datarium
## Warning: package 'datarium' was built under R version 4.3.3
g1=ggplot(data =vivienda,mapping = aes(x=precio_millon))+geom_histogram(fill="pink")+theme_bw()
ggplotly(g1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_bin()`).
En el presente histograma podemos observar que en el rango donde mas cantidad de viviendas hay es entre 0 a 500 millones. La mayor cantidad de casas (1337) tienen un precio aproximado de 268 millones. Tambien se puede observar que a medida que el precio de las viviendas aumenta, la cantidad de estas se reduce, por lo cual se puede concluir que hay una relación inversa entre estas dos variables.
Gráfico de dispersión
g2=ggplot(data=vivienda,mapping = aes(x=Banos,y=precio_millon))+geom_point()+theme_bw()+
geom_smooth()
ggplotly(g2)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
El presente gráfico de dispersión muestra la relación que hay entre el precio de las viviendas con el numero de baños que estas tengan. En este caso, se muestra que el numero de baños tiene una relación no lineal con el precio de las viviendas, con una tendencia ascendente hasta cierto punto y muestra una estabilización.Ademas, se observa que hay una alta variabilidad en los precios para cada numero de baños por lo cual se sugiere que se consideren otros factores para analizar los precios de las viviendas.
Coeficiente de correlación
cor(vivienda$Banos,vivienda$precio_millon , use = "complete.obs")
## [1] 0.6691456
Este coeficiente indica que hay una correlación positiva moderada a fuerte entre el número de baños y los precios de las viviendas. Al ser positivo, se puede interpretar que a medida que aumenta el número de baños en una vivienda, generalmente aumenta el precio de la vivienda aunque no es una relación perfecta por lo cual habria que tener otros factores en consideración.
g2=ggplot(data=vivienda,mapping = aes(x=Estrato,y=precio_millon))+geom_point()+theme_bw()+
geom_smooth()
ggplotly(g2)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Failed to fit group -1.
## Caused by error in `smooth.construct.cr.smooth.spec()`:
## ! x has insufficient unique values to support 10 knots: reduce k.
Este gráfico de dispersión nos muestra la variabilidad de precios que se encuentran en cada estrato. En el estrato 6 es donde se encuentra la mayor cantidad de precios dispersos ya que se pueden encontrar viviendas desde 128 millones a 1950 y el estrato 3 es donde menor dispersión de precios hay.Estos se encuentran concentrados en un rango de 200 a 650 millones, aunque es un rango amplio no es tan disperso como los otros.
cor(vivienda$Estrato,vivienda$precio_millon, use = "complete.obs")
## [1] 0.6098066
El valor obtenido del coeficiente de correlación nos permite clasificar la relación que hay entre las variables. En este caso podemos decir que las variables estrato y precio en millones tienen una correlacion positiva débil (directa).
g2=ggplot(data=vivienda,mapping = aes(x=Area_contruida,y=precio_millon))+geom_point()+theme_bw()+
geom_smooth()
ggplotly(g2)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
## Warning: Removed 3 rows containing non-finite outside the scale range
## (`stat_smooth()`).
En el presente gráfico se puede evidenciar que los precios aumentan a medida que el área construida aumenta, sin embargo, a partir de cierto punto estas variables se estabilizan y a pesar de que haya mayor área construida se encuentran precios mas bajos.
cor(vivienda$Area_contruida,vivienda$precio_millon , use = "complete.obs")
## [1] 0.687352
A continuación vamos a estimar tres modelos de regresión lineal simple entre el precio de viviendas en función de la zona, aréa construida y estrato
Modelo_Banos=lm(precio_millon~Banos , data=vivienda)
Modelo_Banos
##
## Call:
## lm(formula = precio_millon ~ Banos, data = vivienda)
##
## Coefficients:
## (Intercept) Banos
## -45.19 153.99
summary(Modelo_Banos)
##
## Call:
## lm(formula = precio_millon ~ Banos, data = vivienda)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1319.67 -124.74 -37.78 58.24 1695.19
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -45.195 6.420 -7.04 2.07e-12 ***
## Banos 153.986 1.875 82.12 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 244.3 on 8317 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.4478, Adjusted R-squared: 0.4477
## F-statistic: 6743 on 1 and 8317 DF, p-value: < 2.2e-16
AIC (Modelo_Banos)
## [1] 115091.6
BIC(Modelo_Banos)
## [1] 115112.7
El valor del intercepto es de -45.19. Este coeficiente representa el valor estimado del precio cuando el # de baños es igual a 0. En el caso de los baños, el coeficiente es de 153.99 representando que, por cada baño adicional el precio aumente en promedio 153.99 unidades.
Modelo_Estrato=lm(precio_millon~Estrato , data=vivienda)
Modelo_Estrato
##
## Call:
## lm(formula = precio_millon ~ Estrato, data = vivienda)
##
## Coefficients:
## (Intercept) Estrato
## -468.4 194.7
summary(Modelo_Estrato)
##
## Call:
## lm(formula = precio_millon ~ Estrato, data = vivienda)
##
## Residuals:
## Min 1Q Median 3Q Max
## -571.98 -165.25 -49.98 94.21 1493.75
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -468.406 13.172 -35.56 <2e-16 ***
## Estrato 194.732 2.775 70.17 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 260.5 on 8317 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.3719, Adjusted R-squared: 0.3718
## F-statistic: 4924 on 1 and 8317 DF, p-value: < 2.2e-16
AIC(Modelo_Estrato)
## [1] 116162.8
BIC(Modelo_Estrato)
## [1] 116183.9
El valor del intercepto es de -468.4. Este coeficiente representa el valor estimado del precio cuando el estrato es igual a 0. Para el caso de estrato, el coeficiente es de 194.7, que representa el cambio en el precio por cada unidad adicional de estrato. Lo que se esperaria es que por cada aumento de una unidad en el estrato, el precio aumente en promedio 194.7 unidades.
Modelo_Area_contruida=lm(precio_millon~Area_contruida , data=vivienda)
Modelo_Area_contruida
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = vivienda)
##
## Coefficients:
## (Intercept) Area_contruida
## 157.48 1.58
summary (Modelo_Area_contruida)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = vivienda)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2659.88 -120.78 -47.55 67.27 1330.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.47636 4.13640 38.07 <2e-16 ***
## Area_contruida 1.58018 0.01831 86.30 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 238.7 on 8317 degrees of freedom
## (3 observations deleted due to missingness)
## Multiple R-squared: 0.4725, Adjusted R-squared: 0.4724
## F-statistic: 7448 on 1 and 8317 DF, p-value: < 2.2e-16
AIC(Modelo_Area_contruida)
## [1] 114711
BIC(Modelo_Area_contruida)
## [1] 114732.1
El valor del intercepto es de 157.48 representando que es el valor estimado cuando el área construida es igual a 0. El coeficiente de area construida de 1.58, nos indica que por cada unidad adicional de área construida, el precio en millones aumenta en 1.58
Para determinar el mejor modelo, se utilizó el criterio de información Akaika (AIC) y bayesiano (BIC) y se interpretó que el modelo de área construida es el mejor.
vivienda2 <- vivienda %>% filter(!is.na(Area_contruida))
vivienda2 <- vivienda2 %>% filter(!is.na(precio_millon))
id_modelar=sample(1:8319, size = 2496)
Modelo=vivienda2[id_modelar,]
Modelo_validar=vivienda2[id_modelar,]
mod_you_modelar=lm(precio_millon~Area_contruida,data=Modelo)
precio_millon_pred=predict(mod_you_modelar, list(Area_contruida=Modelo_validar$Area_contruida))
precio_millon_real=Modelo_validar$precio_millon
error=precio_millon_real-precio_millon_pred
res=data.frame(precio_millon_real,precio_millon_pred,error)
MAE=mean(abs(error))
MAE
## [1] 162.0912
La validación cruzada se realizó segmentando los datos en un 70% para el modelo y el 30% restante aleatorio para validar el modelo con el 70%. Predecimos el precio de la vivienda del 30% y se compararón los resultados del modelo con los resultados reales por medio del MAE que nos da la diferencia entre valor medido y el valor “verdadero” que en este caso nos dio un valor de 161,27, lo que significa que el modelo tiende a sobreestimar o subestimar el precio de la vivienda en este valor.
y=vivienda2$precio_millon
x1=vivienda2$Area_contruida
x2=vivienda2$Estrato
plot(vivienda2[,3:5])
cor(vivienda2[,3:5])
## Estrato precio_millon Area_contruida
## Estrato 1.0000000 0.6098066 0.2743233
## precio_millon 0.6098066 1.0000000 0.6873520
## Area_contruida 0.2743233 0.6873520 1.0000000
La correlación entre la variable Estrato y precio es positiva y fuerte por lo cual podemos determinar que las viviendas en estratos mas altos suelen ser tener precios mas altos.
mod_mulipe1=lm(y~x1+x2)
summary(mod_mulipe1)
##
## Call:
## lm(formula = y ~ x1 + x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1971.20 -101.63 -23.92 63.63 1177.39
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -466.30084 9.62966 -48.42 <2e-16 ***
## x1 1.29290 0.01519 85.12 <2e-16 ***
## x2 145.46598 2.10971 68.95 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 190.4 on 8316 degrees of freedom
## Multiple R-squared: 0.6643, Adjusted R-squared: 0.6643
## F-statistic: 8230 on 2 and 8316 DF, p-value: < 2.2e-16
AIC(mod_mulipe1)
## [1] 110951.6
BIC(mod_mulipe1)
## [1] 110979.7
predicciones <- predict(mod_mulipe1, newdata= vivienda2)
MAE <- mean(abs(vivienda2$precio_millon - predicciones))
Este modelo indica que tanto la variable estrato como la variable área construida son importantes para predecir el precio en millones de las viviendas. Este modelo nos muestra que un incremento en las variables esta asociado en incrementos significativos para el precio de las viviendas. En el caso del área construida, un incremento en esta variable esta asociado en un incremento en 1.29290 unidades en el precio, para el caso del estrato, un mejor estrato esta asociado a un incremento en 145.46 unidades en el precio de la vivienda.
y=vivienda2$precio_millon
x1=vivienda2$Area_contruida
x3=vivienda2$Banos
plot(vivienda2 %>% select(precio_millon, Area_contruida, Banos))
vivienda2$precio_millon<- as.numeric(vivienda2$precio_millon)
vivienda2$Area_contruida<- as.numeric(vivienda2$Area_contruida)
vivienda2$Banos<- as.numeric(vivienda2$Banos)
vivienda2 <-vivienda2 %>% filter(!is.na(Banos))
cor(vivienda2 %>% select(precio_millon, Area_contruida, Banos))
## precio_millon Area_contruida Banos
## precio_millon 1.0000000 0.6873520 0.6691456
## Area_contruida 0.6873520 1.0000000 0.6484165
## Banos 0.6691456 0.6484165 1.0000000
mod_mulipe2=lm(y~x1+x3)
summary(mod_mulipe2)
##
## Call:
## lm(formula = y ~ x1 + x3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1747.62 -98.59 -25.95 63.08 1315.58
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -18.038 5.770 -3.126 0.00178 **
## x1 1.005 0.022 45.700 < 2e-16 ***
## x3 88.727 2.202 40.289 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 218.4 on 8316 degrees of freedom
## Multiple R-squared: 0.5586, Adjusted R-squared: 0.5585
## F-statistic: 5262 on 2 and 8316 DF, p-value: < 2.2e-16
AIC(mod_mulipe2)
## [1] 113229.7
BIC(mod_mulipe2)
## [1] 113257.8
Este modelo muestra que la variable área construida y la variable baños son predictores significativos para determinar la variable y (precio en millones). Ambas variables tienen una relación positiva aunque la variable baños tiene un impacto mucho mayor debido a que su coeficiente es mas grande. En general el modelo muestra un porcenteja de variabilidad significativo siendo este de 55.86%
y=vivienda2$precio_millon
x2=vivienda2$Estrato
x4=vivienda2$Banos
plot(vivienda2 %>% select(precio_millon, Estrato,Banos))
vivienda2$precio_millon<- as.numeric(vivienda2$precio_millon)
vivienda2$Estrato<- as.numeric(vivienda2$Estrato)
vivienda2$Banos<- as.numeric(vivienda2$Banos)
vivienda2 <-vivienda2 %>% filter(!is.na(Banos))
cor(vivienda2 %>% select(precio_millon, Estrato, Banos))
## precio_millon Estrato Banos
## precio_millon 1.0000000 0.6098066 0.6691456
## Estrato 0.6098066 1.0000000 0.4203218
## Banos 0.6691456 0.4203218 1.0000000
La correlación entre las variables precio y estrato son positivas y moderadamente fuerte. De esto se puede interpretar que las viviendas en estratos mas altos tienden a ser mas costosos.
La correlación entre las variables precio y baños es positiva y moderadamente fuerte, por lo que las viviendas con baños tienden a tener precios mas altos.
mod_mulipe3=lm(y~x2+x4)
summary(mod_mulipe3)
##
## Call:
## lm(formula = y ~ x2 + x4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -845.60 -120.57 -37.75 65.07 1528.41
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -515.564 10.812 -47.69 <2e-16 ***
## x2 127.430 2.504 50.88 <2e-16 ***
## x4 115.388 1.805 63.93 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 213.3 on 8316 degrees of freedom
## Multiple R-squared: 0.5789, Adjusted R-squared: 0.5788
## F-statistic: 5715 on 2 and 8316 DF, p-value: < 2.2e-16
AIC(mod_mulipe3)
## [1] 112838.9
BIC(mod_mulipe3)
## [1] 112867
Este modelo indica que la variable Estratlo es una variable significativa para predecir el precio, sin embargo, la variable baños no es significativa.
Luego de encontrar los criterios de información AIC y BIC se encuentra que el mejor modelo es el primer modelo que contiene las variables área construida y estrato ya que tienen un menor valor AIC y BIC.
modelo2 <-lm(precio_millon~Area_contruida+ Estrato, data = vivienda2)
predicciones <- predict(modelo2)
MAE <- mean(abs(predicciones-vivienda2$precio_millon))
MAE
## [1] 123.2733
El modelo escogido muestra que tanto la variable área construida como la variable estrato son significativas para predecir el precio en millones de las viviendas.
El MAE con un valor de 123.2733 nos indica que tiene un buen ajuste para predecir el precio usando las variables área construida y estrato como predictores y ambos coeficientes de las variables son significativos para explicar la variabilidad de los precios de las viviendas.
Supongamos que queremos predecir el precio para una vivienda con un área construida de 150 mts y en un estrato 4
# Definir valores hipotéticos
area_contruida <- 150
estrato <- 4
# Crear dataframe con los valores hipotéticos
datos_hipoteticos <- data.frame(
Area_contruida = area_contruida,
Estrato = estrato
)
# Realizar la predicción
prediccion <- predict(modelo2, newdata = datos_hipoteticos)
# Mostrar la predicción
prediccion
## 1
## 309.4975
Según el modelo ajustado, una vivienda con un área construida de 150mts y ubicada en un estrato 4 podría tener un precio de 309.49 millones
par(mfrow=c(2,2))
plot(mod_mulipe1)
Para el gráfico de residuos vs valores ajustados muestra como lo spuntos
estan distribuidos alrededor de la linea horizontal por lo cual indica
que el modelo se ajusta bien a los datos. El gráfico QQ nos muestra que
los datos estan distribuidos normalmente ya que en su mayoria siguen el
comportamiento de la linea diagonal.
mod_trans_multi=lm(log(y)~x1+x2)
summary(mod_trans_multi)
##
## Call:
## lm(formula = log(y) ~ x1 + x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.5343 -0.2206 -0.0057 0.2008 1.7063
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.723e+00 1.709e-02 217.81 <2e-16 ***
## x1 2.440e-03 2.696e-05 90.52 <2e-16 ***
## x2 3.649e-01 3.744e-03 97.46 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.338 on 8316 degrees of freedom
## Multiple R-squared: 0.7455, Adjusted R-squared: 0.7455
## F-statistic: 1.218e+04 on 2 and 8316 DF, p-value: < 2.2e-16
AIC(mod_trans_multi)
## [1] 5565.959
BIC(mod_trans_multi)
## [1] 5594.064
valores_ajustados <- predict(mod_trans_multi, newdata = vivienda2)
residuos_absolutos <- abs(exp(valores_ajustados) - vivienda2$precio_millon)
MAE <- mean(residuos_absolutos)
MAE
## [1] 132.634
El modelo explica aproximadamente el 74.55% de la variabilidad utilizando las variables predictoras (área construida y estrato). A su vez, los residuos están distribuidos al rededor de cero, por lo cual el modelo es adecuado en terminos de normalidad homocedasticidad de los errores. Tambien los coeficientes de las variables son significativos lo cual significa que ambos tienen un impacto en el precio de las viviendas.
Teniendo en cuenta los criterio de significancia y MAE, ambos modelos muestran coeficientes significantes para las variables, sin embargo, el modelo actual se considera mas adecuado ya que muestra un MAE inferior al modelo transformado, esto permite una mayor precisión en los datos.
# Definir valores hipotéticos
area_contruida <- 200
estrato <- 3
# Crear dataframe con los valores hipotéticos
datos_hipoteticos <- data.frame(
Area_contruida = area_contruida,
Estrato = estrato
)
# Realizar la predicción
prediccion <- predict(modelo2, newdata = datos_hipoteticos)
# Mostrar la predicción
prediccion
## 1
## 228.6763
Después de la comparación entre ambos modelos se concluye que el modelo actual es el mas adecuado teniendo en cuenta el criterio de MAE. El pronóstico realizado fue con valores hipotéticos de área construida=200 ubicada en un estrato= 3 donde se predice que el una vivienda con estas variables tendra un precio en millones de 228.6763 aproximadamente.