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

1. Análisis exploratorio de los datos

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.

2. Análisis bivariado

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

3. Estimación del modelo de regresión lineal simple

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

4. Mejor modelo

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.

5. Validación cruzada

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.

Regresión Lineal Multiple

1. Propuesta de tres modelos de regresión lineal multiple

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.

2. Mejor modelo

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.

3. Poder predictivo del mejor modelo (MAE)

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.

Pronósticos hipoteticos del precio de la vivienta teniendo en cuenta el mejor modelo elegido

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

5. Validación de supuestos

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.

6. Evaluación del modelo actual y transformado

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.

7. Definición mejor modelo y pronósticos

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