library(readxl)
datos =read_excel("C:/Mesa/datos_vivienda.xlsx")

1. Análisis exploratorio Univariado

1.1. Se observa que la base de datos contiene información sobre el registro de los precios de vivienda -“millones de pesos COP” (y) de las viviendas en relación con el área de la vivienda(x) en metros cuadrados.

1.2. Se observa que el promedio de los precios es 332.1 millones de pesos con una desviación estándar de $ 82.14423, mientras el promedio del área construida es 115.7 M2 con una desviación estándar de 35.54 M2, también se observa que las viviendas con área construida de 170 M2 tienen la mayor variabilidad del precio.

attach(datos)
summary(datos)
##  Area_contruida  precio_millon  
##  Min.   : 80.0   Min.   :240.0  
##  1st Qu.: 86.0   1st Qu.:251.2  
##  Median : 97.0   Median :305.0  
##  Mean   :115.7   Mean   :332.1  
##  3rd Qu.:130.0   3rd Qu.:395.0  
##  Max.   :195.0   Max.   :480.0
desvest_Area_contruida = sd(Area_contruida, na.rm = TRUE)
desvest_precio_millon = sd(precio_millon  , na.rm = TRUE)
desvest=data.frame(desvest_Area_contruida,desvest_precio_millon)
desvest
desvest_Area_contruida desvest_precio_millon
35.54332 82.14423
with(datos, boxplot(precio_millon ~ Area_contruida, ylab='Precio (millones)'))

2. Análisis exploratorio bivariado

Veamos la correlación entre Area_contruida y precio_millon Se observa que a mayor Area_contruida el precio aumenta y su relación es fuerte de acuerdo con el coeficiente de correlación de Pearson (0,919).

plot(Area_contruida, precio_millon,main = "Diagrama de dispersión",xlab = "Área construida", ylab = "Precio por millón ",pch=16)

cor(Area_contruida,precio_millon,use ="complete.obs" )
## [1] 0.9190295

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

Se observa que el coeficiente \(\beta_0\) no se debe interpretar por que no se observan valores areas construidas en cero. Por otro lado el \(\beta_1=2.124\) nos indica que por cada metro cuadrado que se aumente el precio se incrementa en 2,124 pesos.

De igual forma el area construida tiene codigos de significancia ***, signfica que su relación es estructural con el precio de la vivienda

Ecuación de regresión \(precio(area)\)=\(86.234\)+\(2.124\)*\(area\)

mod=lm(precio_millon~Area_contruida,data=datos)
summary(mod)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -51.673 -25.612  -6.085  24.875  67.650 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      86.234     22.479   3.836 0.000796 ***
## Area_contruida    2.124      0.186  11.422 3.45e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared:  0.8446, Adjusted R-squared:  0.8381 
## F-statistic: 130.5 on 1 and 24 DF,  p-value: 3.45e-11

4. Intervalo de confianza (95%) para el coeficiente \(\beta_1\)

El efecto que tiene área construida en el precio oscila entre 1.759447 y 2.488553, como el cero no está incluido en el intervalo esto reafirma la significancia del área frente al precio de la vivienda

t=qnorm(0.975)
li=2.124 -(t* 0.186)
ls=2.124 +(t* 0.186)
inter_conf=data.frame(li,ls)
inter_conf
li ls
1.759447 2.488553
confint(object=mod, level=0.95)
##                   2.5 %     97.5 %
## (Intercept)    39.83983 132.627917
## Area_contruida  1.74017   2.507771

5. Interpretación del indicador de bondad y ajuste \(R^2\).

Adicionalmente se observa que el coeficiente es significativamente distinto de cero. Se observa que el ajuste del modelo es de \(R^2=0.8446\) es decir que el modelo explica el 84% de la variabilidad de los precios de las vivivendas.

summary(mod)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -51.673 -25.612  -6.085  24.875  67.650 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      86.234     22.479   3.836 0.000796 ***
## Area_contruida    2.124      0.186  11.422 3.45e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared:  0.8446, Adjusted R-squared:  0.8381 
## F-statistic: 130.5 on 1 and 24 DF,  p-value: 3.45e-11

6.Precio promedio estimado para un apartamento de 110 metros cuadrados. Considera entonces con este resultado que un apartemento en la misma zona con 110 metros cuadrados en un precio de 200 millones seria una buena oferta? Que consideraciones adicionales se deben tener?.

6.1 De acuerdo con las estimaciones del modelo para un área de 110 m2 el precio promedio estimado seria de $ 319.87

6.2 Realizando la estimación con el modelo y considerando los intervalos de confianza tomado el menor precio promedio $ 306.3133, la oferta de 200 millones es 53% más alta, lo que constituye una muy buena oferta.

6.3 Se debe considerar también el error de estimación del modelo, el cual determina la probabilidad de que esa estimación se ajuste a la realidad de los datos, por otro lado, para determinar el precio de una vivienda pueden influir otros factores como el tipo de vivienda, ubicación, condiciones de seguridad, distancia a centros comerciales, red de salud pública, colegios, entro otros.

precio=predict(mod,list(Area_contruida=110))
precio
##        1 
## 319.8706
precio_intervalos=predict(mod,list(Area_contruida=110),interval = "confidence")
precio_intervalos
##        fit      lwr      upr
## 1 319.8706 306.3133 333.4279

7. Validación de supuestos del modelo por medio de graficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos.

Nota: Los valores ajustados \(y^i\) y los residuos \(ei\)=\(y^i\)\(yi\) se pueden obtener con los comandos fitted y residuals respectivamente. Los residuos estandarizados se obtienen con rstandard

  1. En el grafico 1 y 2 de residuos, la varianza de los errores no es constante y se oberva que para valores ajustados de 200 a 300 muestran un patron exponencial.
  2. Media cero: Se cumple por defecto.
  3. Varianza Constante: Se observa en la grafica 2 de residuales vs ajustados que el comportamiento no es aleatorio mostrando una curva hacia abajo.
  4. Normalidad: Se observa en la grafica 3 que los datos se ajustan bien a la linea de normalidad en el qqplot
  5. Independencia: Dado que estos registros no corresponden a datos en el tiempo no se tiene un orden temporal para realizar la validación de este supuesto.
residuos = rstandard(mod)
valores.ajustados = fitted(mod)
plot(valores.ajustados, residuos, main = "Residuos estandarizados vs valores ajustados")

par(mfrow=c(2,2))
plot(mod)

8.Transformación apropiada para mejorar el ajuste y supuestos del modelo.

8.1 Se transforma el modelo a hiperbólico

x=1/Area_contruida
mod_ajustado=lm(precio_millon~x,data=datos)
summary(mod_ajustado)
## 
## Call:
## lm(formula = precio_millon ~ x, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -36.987 -16.743  -5.023  18.547  44.379 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    635.35      18.27   34.77  < 2e-16 ***
## x           -32464.72    1895.32  -17.13 5.84e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.05 on 24 degrees of freedom
## Multiple R-squared:  0.9244, Adjusted R-squared:  0.9212 
## F-statistic: 293.4 on 1 and 24 DF,  p-value: 5.839e-15

9. Comparación del ajuste y supuestos del modelo inicial y el transformado.

9.1 Se observa que mejora el supuesto de aleatoriedad de los errores grafica 5 y mejora la normalidad grafica 6 respecto al modelo anterior

9.2 Se oberva que se mejora el ajuste del modelo de 0,84 a 0,92 lo que se concluye que el modelo ajustado explica en un 92% la variabilidad de los precios de las viviendas.

9.3 Se calcula la predicción con el nuevo modelo y arroja para un área de 110 m2 el precio promedio pasa de $319.87 a $340.216 que corresponde a un 6,36% de incremento

9.4 El modelo ajustado haciendo la validación cruzada con la tecnica MAE se obtiene un 6,2% de probabilidad de error de predicción, lo que constituye un buen modelo predictivo.

summary(mod)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -51.673 -25.612  -6.085  24.875  67.650 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      86.234     22.479   3.836 0.000796 ***
## Area_contruida    2.124      0.186  11.422 3.45e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared:  0.8446, Adjusted R-squared:  0.8381 
## F-statistic: 130.5 on 1 and 24 DF,  p-value: 3.45e-11
summary(mod_ajustado)
## 
## Call:
## lm(formula = precio_millon ~ x, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -36.987 -16.743  -5.023  18.547  44.379 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    635.35      18.27   34.77  < 2e-16 ***
## x           -32464.72    1895.32  -17.13 5.84e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.05 on 24 degrees of freedom
## Multiple R-squared:  0.9244, Adjusted R-squared:  0.9212 
## F-statistic: 293.4 on 1 and 24 DF,  p-value: 5.839e-15
print("Validación de supuestos modelo inicial sobre el error")
## [1] "Validación de supuestos modelo inicial sobre el error"
par(mfrow=c(2,2))
plot(mod)

print("Validación de supuestos modelo transformado sobre el error")
## [1] "Validación de supuestos modelo transformado sobre el error"
par(mfrow=c(2,2))
plot(mod_ajustado)

precio2=predict(mod_ajustado,list(x=(1/110)))
precio2
##       1 
## 340.216

Validación cruzada del modelo final

validar_modelo=function(){
  precio_predict=array(NA,26)
  for (i in 1:26) {
    
    datos_training=datos[-i,]
    datos_test=datos[i,]
    
    x=1/datos_training$Area_contruida
    mod=lm(precio_millon~x,data=datos_training)
    
    precio_predict[i]=mean(predict(mod,list(x=(1/datos_test$Area_contruida))))
    
  }
  return(precio_predict)
 }
precio_predict=validar_modelo()
res=data.frame(datos,precio_predict)
head(res)
Area_contruida precio_millon precio_predict
86 250 258.4787
118 385 359.0972
130 395 385.0559
181 419 461.8544
86 240 259.2754
98 320 303.3532
MAE=mean(abs(res$precio_millon-res$precio_predict))
MAE
## [1] 20.60411
MAE/mean(res$precio_millon)*100
## [1] 6.204618