Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m^2 (vivienda4.RDS) la inmobiliaria A&C requiere el apoyo de un cientifico de datos en la construcción de un modelo que lo oriente sobre los precios de inmuebles.

Con este propósito el equipo de asesores a diseñado los siguientes pasos para obtener un modelo y así poder a futuro determinar los precios de los inmuebles a negociar.

library(paqueteMET)
library(dplyr)
## 
## 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
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
library(nortest)
library(lawstat)
## 
## Attaching package: 'lawstat'
## The following object is masked from 'package:car':
## 
##     levene.test

Punto1

1.Realice un análisis exploratorio de las variables precio de vivienda (millones de pesos COP) y área de la vivienda (metros cuadrados) - incluir gráficos e indicadores apropiados interpretados.

data(vivienda4)
names(vivienda4)
## [1] "zona"      "estrato"   "preciom"   "areaconst" "tipo"

Primero se realiza el filtro en la base de datos, teniendo en cuenta que existen tanto apartamentos como casas, ya que el analisis apunta a apartamentos estrato 4 con área menor a 200m^2

vivienda4 %>% filter(tipo=="Apartamento")-> vivienda4_

vivienda4_ %>% filter(estrato==4)-> vivienda4_

vivienda4_ %>% filter(areaconst<200)-> vivienda4_

Se fijará variables para las columnas precios y área de la base vivienda4_,

Precio <- vivienda4_$preciom
Area <- vivienda4_$areaconst
summary(Precio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      78     153     185     202     240     645
par(mfrow=c(1,2))
boxplot(Precio, main='Precio (Millones)', ylab='Precio', col = 'blue')

Realizando un analisis descriptivo a partir del precio nos damos cuenta que el apartamento más económico es de 78 millones de pesos y el más costoso vale 645 millones de pesos, los apartamentos en promedio tienen un valor de 202 millones, y en cuanto al gráfico de cajas nos muestra que la distribución a partir del precio presenta un sesgo hacia la derecha a causa de valores atípicos, asi como confirma que los precios en su mayoria estan al rededor de los 200 millones de pesos.

summary(Area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    40.0    60.0    70.0    75.2    83.0   198.0
par(mfrow=c(1,2))
boxplot(Area, main='Area (m^2)', ylab='Area', col = 'blue')

Por lado del área de los predios a partir del analisis descriptivo se evidencia que el apto más pequeño mide 40m^2 y el más grande teniendo en cuenta que estamos revisando los menores a 200m^2 mide 198m^2, los aptos en promedio estan midiendo 75.2m^2, y en cuanto al gráfico de cajas nos muestra que la distribución a partir del área de igual manera que en el precio, presenta un sesgo hacia la derecha a causa de valores atípicos, asi como confirma que la mayoria de los apartamentos miden al rededor de 75.2m^2.

mode <- function(Precio) {
   return(as.numeric(names(which.max(table(Precio)))))
}
mode(Precio)
## [1] 150
mode(Area)
## [1] 60

Por otro lado el precio mas recurrente en los apartamentos de estrato 4 con área menor a 200 m^2 es 150 millones de pesos colombianos y el área que más se repite en los mismos es de 60m^2.

Punto2

  1. Realice un análisis exploratorio bivariado de datos, enfocado en la relación entre la variable respuesta (precio) en función de la variable predictora (area construida) - incluir gráficos e indicadores apropiados interpretados.
plot(Area, Precio, main='Área (m^2) vs Precio (Millones)', xlab='Área', ylab='Precio', col='blue')

Graficamente se evidencia que existe una correlación de manera directa pues a mayor área del predio mayor valor tiene, sin embargo a continuación se realizará la comprobación a partir del coeficiente de correlación.

cor(Area, Precio)
## [1] 0.7431338

La correlación es buena teniendo en cuenta que tiene un valor cercano a 1, sin embargo podria llegar a ser mejor.

Punto3

  1. Estime el modelo de regresión lineal simple entre precio=f(area)+ε. Interprete los coeficientes del modelo β0, β1 en caso de ser correcto.
Regresion <- lm(Precio ~ Area)
summary(Regresion)
## 
## Call:
## lm(formula = Precio ~ Area)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -228.412  -23.589   -4.653   25.674  207.336 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 36.62292    4.20667   8.706   <2e-16 ***
## Area         2.19868    0.05372  40.926   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 43.21 on 1358 degrees of freedom
## Multiple R-squared:  0.5522, Adjusted R-squared:  0.5519 
## F-statistic:  1675 on 1 and 1358 DF,  p-value: < 2.2e-16

El coeficiente estimado Bo= corresponde a 36.62 El coeficiente estimado B1=2.1986 Por lo cual la ecuación dada para precio es Precio= 36.62+2.19X

Punto4

  1. Construir un intervalo de confianza (95%) para el coeficiente β1, interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t.
confint(Regresion, level = 0.95)
##                 2.5 %    97.5 %
## (Intercept) 28.370647 44.875201
## Area         2.093294  2.304074
summary(Regresion)$coefficients
##              Estimate Std. Error   t value      Pr(>|t|)
## (Intercept) 36.622924 4.20667014  8.705918  8.972924e-18
## Area         2.198684 0.05372357 40.925877 3.301551e-239

Teniendo en cuenta que en la regresión lineal que habiamos realizado antes, teniamos el P-valor aproximadamente igual a cero y el intervalo de confianza menor a 2.09, a partir de la hipotesis nula que relaciona B1 igual 0 y la Hipotesis alternativa donde B1 es diferente de cero, se evidencia que al caer el P-valor en la zona de rechazo, se rechaza la hipotesis nula, por tanto B1 no es igual a cero.

Punto5

  1. Calcule e interprete el indicador de variabilidad R^2.
summary(Regresion)$r.squared
## [1] 0.5522478

El R^2 debe ser cercano a uno para lograr interpretar la mayor cantidad de puntos, según el resultado a partir del modelo se logra un indicador de variación de 55% que no es malo pero podria mejorar.

Punto6

  1. ¿Cuál sería el precio promedio estimado para un apartamento de 110 metros cuadrados? Considera entonces con este resultado que un apartamento en la misma zona con 110 metros cuadrados en un precio de 200 millones sería una atractiva esta oferta? ¿Qué consideraciones adicionales se deben tener?.

                    Precio=36.622924+2.198684(Area)
                    Precio=36.622924+2.198684(110)
                    Precio=278.478164

El precio promedio de un apto de 110m^2 corresponde a 278 millones de pesos aproximadamente, por lo cual un apto con el mismo área y en un valor de 200 millones de pesos es una oferta muy atractiva, se debe considerar de igual manera que es un estimado inicial por lo cual no es 100% confiable.

Punto7

  1. Realice la validación de los supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos. Utilice las pruebas de hipótesis para la validación de supuestos y compare los resultados con lo observado en los gráficos asociados.
Residuales <- Regresion$residuals
Val_ajustados <- Regresion$fitted.values

Prueba de linealidad

plot(Area, Precio, main='Área (m^2) vs Precio (Millones)', xlab='Área', ylab='Precio', col='red')
abline(Regresion, col = "blue")

cor(Area, Precio)
## [1] 0.7431338

Teniendo en cuenta la relación que se presenta a traves del grafico de dispersión, se observa una correlación lineal positiva entre las variables analizadas. De manera que, según la data conforme las viviendas tienen una mayor área el precio de las mismas aumenta de manera considerable.

Normalidad

par(mfrow=c(1,2))
hist(Residuales, main="Histograma", xlab="Residuales", ylab="Frecuencia", col="blue")
qqnorm(Residuales, main="QQplot", xlab="Q teóricos", ylab="Q muestra", col="red")
qqline(Residuales, col = "blue", lwd="1")

Esta prueba de normalidad revisa si la distribución de los datos es normal, en el gráfico de histograma se evidencia que todas las medidas de los datos se encuentran dentro de normalidad, mientras que en la grafica QQPlot se realiza una comparación entre los datos ajustados y la linea teorica dando claridad, pensando en mejorar el modelo se pueden encontrar diferentes variables como el tiempo de uso del apartamento o acabados del mismo, para corroborar los resultados dados a partir de la grafica se va a realizar a continuación un test con el fin de ratificar los datos de normalidad.

Shapiro-Wilk

shapiro.test(Residuales)
## 
##  Shapiro-Wilk normality test
## 
## data:  Residuales
## W = 0.96464, p-value < 2.2e-16

Este Test busca revisar si los datos siguen una distribución normal, en esta caso especifico se indica que el intervalo de confianza corresponde a 0.9646 y el P-valor es cercano a cero, por lo cual se rechaza la hipotesis nula.

Homocedasticidad

plot(Val_ajustados, Residuales, main="Val_ajustados Vs Residuales", xlab="Val_ajustados", ylab="Residuales", col="red")
abline(0,0, col="blue")

Esta prueba revisa que la varianza de los errores sea contante, para este caso al revisarse en la gráfica se evidencia que no es homocedastico.

Breusch-Pagan

bptest(Regresion)
## 
##  studentized Breusch-Pagan test
## 
## data:  Regresion
## BP = 303.81, df = 1, p-value < 2.2e-16

Teniendo en cuenta que la homocedasticidad se rechaza se utiliza este test para revisar que los valores estimados se comportan de la misma manera que los valores teoricos.

Independencia

Row <- row.names(vivienda4_)
plot(Precio, Residuales, xlab="Precio", ylab="Residuales", main = "Precio vs Residuales", col="blue")

Esta prueba revisa que los valores estimados se comportan de la misma manera que los valores teoricos, en esta caso a medida que crece el Precio, crece los valores residuales.

Durbin-Watson:

durbinWatsonTest(Regresion)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.2791007      1.438078       0
##  Alternative hypothesis: rho != 0

Esta prueba se utiliza para detectar la presencia de autocorrelación en los residuos de un analisis de la regresión.

Punto8

  1. De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.
Trf <- log(Area)
Regresion1 <- lm(Precio ~ Trf)
summary(Regresion1)
## 
## Call:
## lm(formula = Precio ~ Trf)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -195.847  -21.239   -1.573   22.108  261.907 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -633.526     19.397  -32.66   <2e-16 ***
## Trf          194.944      4.518   43.15   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 41.94 on 1358 degrees of freedom
## Multiple R-squared:  0.5782, Adjusted R-squared:  0.5779 
## F-statistic:  1862 on 1 and 1358 DF,  p-value: < 2.2e-16

A pesar de realizar la transformación a partir del logaritmo en la variable del área, el modelo no mejoro significativamente debido a que el R^2 en el modelo paso de 55% a 57% la explicación de la variabilidad de los datos.

Punto9

  1. De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.
Val_ajustados1 <- Regresion1$fitted.values
Residuales1 <- Regresion1$residuals

plot(Trf, Precio, main='Log(Área (m^2)) vs Precio (Millones)', xlab='Logaritmo (Área)', ylab='Precio', col='red')
abline(Regresion1, col = "blue")

Validación

par(mfrow=c(2,2))

hist(Residuales1, main="Histograma", xlab="Residuales", ylab="Frecuencia", col="red")
qqnorm(Residuales1, main="QQplot", xlab="Q teóricos", ylab="Q muestra", col="blue")
qqline(Residuales1, col = "red", lwd="1")

plot(Val_ajustados1, Residuales1, main="Val_ajustados vs Residuales", xlab="Val_ajustados", ylab="Residuales", col="red")
abline(0,0, col="blue")

plot(Precio, Residuales1, xlab="Precio", ylab="Residuales", main = "Precio vs Residuales", col="blue")

shapiro.test(Residuales1)
## 
##  Shapiro-Wilk normality test
## 
## data:  Residuales1
## W = 0.95777, p-value < 2.2e-16

Este Test busca revisar si los datos siguen una distribución normal, en esta caso especifico se indica que el intervalo de confianza corresponde a 0.95777 y el P-valor es cercano a cero, por lo cual se rechaza la hipotesis nula.

bptest(Regresion1)
## 
##  studentized Breusch-Pagan test
## 
## data:  Regresion1
## BP = 217.76, df = 1, p-value < 2.2e-16

Esta prueba revisa que los valores estimados se comportan de la misma manera que los valores teoricos.

durbinWatsonTest(Regresion1)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.2580271      1.479578       0
##  Alternative hypothesis: rho != 0

Esta prueba se utiliza para detectar la presencia de autocorrelación en los residuos de un analisis de la regresión.

Punto10

  1. Estime varios modelos y compare los resultados obtenidos. En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?

Valores atipicos

Q1_Area <- quantile(Area, 0.25)
Q3_Area <- quantile(Area, 0.75)

IQR_Area <- Q3_Area - Q1_Area

lim_inf_Area <- Q1_Area - 2 * IQR_Area
lim_sup_Area <- Q3_Area + 2 * IQR_Area


Q1_Precio <- quantile(Precio, 0.25)
Q3_Precio <- quantile(Precio, 0.75)

IQR_Precio <- Q3_Precio - Q1_Precio

lim_inf_Precio <- Q1_Precio - 1.5 * IQR_Precio
lim_sup_Precio <- Q3_Precio + 1.5 * IQR_Precio

datos <- vivienda4_[,c("preciom", "areaconst")]

datos1 <- datos[datos$areaconst > lim_inf_Area & datos$areaconst < lim_sup_Area,]
data <- datos1[datos1$preciom > lim_inf_Precio & datos1$preciom < lim_sup_Precio,]

Area1 <- data$areaconst
Precio1 <- data$preciom

plot(Area1, Precio1)

Conclusiones

Los modelos estimados no cumplen con los supuestos de normalidad, homocedasticidad e independencia, esto podria ser en primera medida debido a que el sesgo de las variables del precio y área era demasiado grande y no permitio desde el principio generar un modelo confiable.

Para futuros trabajos se recomienda utilizar estrategias de limpieza de datos que permitan mejorar la calidad de información. Una de las desventajas del uso de modelos de regresión lineal es que son altamente influenciables por los valores atipicos, en este tipo de situaciones es necesario revisar los datos con el fin de corregirlos o eliminarlos, como por ejemplo la variable Precio que tenia valores muy alejados hacia los extremos superiores.

Pese a que se tiene un coeficiente de correlación alto entre las variables consideradas, esta no es condicion suficiente para garantizar un buen ajuste del modelo y por ende unas buenas predicciones. En este caso estamos viendo que a mayor área es mayor el precio a pagar por los predios, por lo tanto es necesario considerar otro tipo de factores tanto endogenos como exogenos que pueden influir en el rendimiento del modelo.