Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento en estrato 4 con área construida menor a 200 m\(^2\) (vivienda4.RDS) la inmobiliaria A&C requiere el apoyo de un científico 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.
# Validación de los valores faltantes en la tabla vivienda4
faltantes <- colSums(is.na(vivienda4))
print(faltantes)
## zona estrato preciom areaconst tipo
## 0 0 0 0 0
#Resumen de los datos del precio
datos_precio <- summary(vivienda4$preciom)
print(datos_precio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 207.4 230.7 238.8 243.7 251.5 309.7
#Resumen de los datos del área construida
datos_area <- summary(vivienda4$areaconst)
print(datos_area)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 40.00 60.00 75.00 87.63 98.00 200.00
Lo primero que se realizó en este análisis fue validar que en la base de vivienda4 no tuviera datos N/A. Después de esta validación se utilizó la función summary tanto para la variable precio como para la variable área construida, en estos valores podemos mencionar lo siguiente:
Las gráficas que se muestran a continuación permiten validar los datos mencionados anteriormente.
#Coeficiente de correlación de Pearson
coef_corr <- cor(vivienda4$preciom,vivienda4$areaconst)
print(coef_corr)
## [1] 0.9309803
El coeficiente de correlacicón de Pearson da como resultado 0.9309803 lo que indica que es una relación lineal positiva fuerte y esto significa que en tanto aumenta el área construida, también aumenta el precio de la vivienda, esto se logra evidenciar en el gráfico de dispersión con regresión lineal que se muestra a continuación.
#Modelo de regresión lineal simple
modelo <- lm(preciom ~ areaconst, data = vivienda4)
#Coeficientes del modelo
coeficientes <- coef(modelo)
print(coeficientes)
## (Intercept) areaconst
## 199.8101482 0.5008917
#Imprimir los resultados del modelo
resumen<-summary(modelo)
print (resumen)
##
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.5997 -5.0198 -0.0056 4.6648 24.4010
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.998e+02 4.514e-01 442.7 <2e-16 ***
## areaconst 5.009e-01 4.758e-03 105.3 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.141 on 1704 degrees of freedom
## Multiple R-squared: 0.8667, Adjusted R-squared: 0.8666
## F-statistic: 1.108e+04 on 1 and 1704 DF, p-value: < 2.2e-16
Para el coeficiente \(B_{0}\) significa que cuando el área es igual a cero el precio de la vivienda sería de 199 millones, algo que en la realidad no tiene mucho sentido ya que no se puede vender un apartamento o una casa por ese valor de área 0, sin embargo, una interpretación puede estar asociada a que tanto para el precio como para el área inician mínimo con un valor de 199 millones para todas las áreas > 0.
Respecto al coeficiente \(B_{1}\) este nos indica que por cada metro adicional que yo construya esto va a significar un aumento en el precio de $500,000
#Construcción del intervalo de confianza (95%)
intervalo_confianza <- confint(modelo)["areaconst",]
print(intervalo_confianza)
## 2.5 % 97.5 %
## 0.4915592 0.5102243
#Pruebas de hipótesis t
t_value <- resumen$coefficients[,"t value"]
p_value <- resumen$coefficients[,"Pr(>|t|)"]
print(t_value)
## (Intercept) areaconst
## 442.6604 105.2688
print(p_value)
## (Intercept) areaconst
## 0 0
El intervalo de confianza (95%) para el coeficiente \(B_{1}\) se encuentra entre 0.4915592 y 0.5102243, en este caso al no estar contenido cero dentro del intervalo de confianza se puede concluir que el coeficiente no es igual a cero, sin embargo, aplicamos una prueba de hipótesis t en donde encontramos que el valor p es igual a cero lo que se compara el nivel de significancia (0.005) y al estar por debajo de este valor se rechaza la hipótesis nula de que el coeficiente sea igual a cero y se concluye que este es significativamente diferente de cero.
#Cálculo del indicador de bondad R\(^2\)
r_cuadrado <- resumen$r.squared
print(r_cuadrado)
## [1] 0.8667242
El resultado del R\(^2\) nos indica que el modelo tiene un buen ajuste de los datos ya que el 86% de la variabilidad en la variable dependiente puede ser atribuida a las variables independientes incluidas en el modelo, en este caso la variable área construida.
#Función para estimar el precio de una vivienda de 110 metros
estimar <- predict(modelo, newdata = data.frame(areaconst=110, tipo = "Apartamento", zona = "Zona Sur"))
print(estimar)
## 1
## 254.9082
El precio estimado para un apartamento de 110 metros es de 254 millones por lo que un apartamento de 110 metros en 200 millones sería una muy buena oferta para el comprador, no tanto para el vendedor que en este caso sería la inmobiliaria, sin embargo, se deben tener otras consideraciones a la hora de estimar este valor como el número de baños de la vivienda, piso del apartamento, barrio, etc…
#Validación de supuestos
#Prueba de Shapiro
shapiro <- shapiro.test(residuals(modelo))
print(shapiro)
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.99911, p-value = 0.5907
#Durbin-Watson
durbinwatsontest <- dwtest(modelo)
print(durbinwatsontest)
##
## Durbin-Watson test
##
## data: modelo
## DW = 2.0651, p-value = 0.9092
## alternative hypothesis: true autocorrelation is greater than 0
#Breusch-Pagan
bptest <- bptest(modelo)
print(bptest)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 0.089882, df = 1, p-value = 0.7643
El gráfico de residuos vs valores ajustados muestra que los residuos están distribuidos aleatoriamente alrededor de la línea horizontal en y=0, cómo también se puede observar que hay una distribución constante de los valores ajustados lo que indica homocedasticidad. En el gráfico QQ norm los puntos del gráfico estan alineados a lo largo de la línea diagonal lo que indica que se ajustan a una distribución teórica.
Respecto a las pruebas de hipótesis.
El test de Shapiro nos da un valor W de 0.99911 lo que indica al estar tan cerca de 1 es mucho más consistente con la suposición de normalidad de los datos y el valor p al estar muy por encima del valor de significancia que se utiliza comunmente (0.05) no hay evidencia suficiente para rechazar la hipótesis nula y puede concluir que los datos provienen de una distribución normal.
El test de Durbin-Watson se cumple al dar un estadístico DW de 2.0651 lo que sugiere que hay poca evidencia de autocorrelación en los residuos, el valor p está muy por encima del valor de significancia comunmente utilizado (0.05) con un valor de 0.9092 por lo que se puede asumir la independencia de los errores en el modelo.
El test de Breusch-Pagan al igual que las anteriores pruebas muestran un estadístico que sugiere homocedasticidad y un valor p está por encima del valor de significancia comunmente utilizado lo cuál valida el supuesto de homocedsaticidad.
#Transformación logarítmica en el precio
modelo_log_p <- lm(log(preciom) ~ areaconst, data = vivienda4)
#Transformación raíz cuadrada
modelo_raiz <- lm(sqrt(preciom) ~ areaconst, data = vivienda4)
stargazer(modelo_log_p,modelo_raiz, type = "text", df=FALSE)
##
## ================================================
## Dependent variable:
## ----------------------------
## log(preciom) sqrt(preciom)
## (1) (2)
## ------------------------------------------------
## areaconst 0.002*** 0.016***
## (0.00002) (0.0002)
##
## Constant 5.322*** 14.229***
## (0.002) (0.014)
##
## ------------------------------------------------
## Observations 1,706 1,706
## R2 0.852 0.860
## Adjusted R2 0.852 0.860
## Residual Std. Error 0.030 0.229
## F Statistic 9,803.025*** 10,457.690***
## ================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Dados los resultados de las transformaciones y los resultados del modelo inicial no es necesarios comparar los supuestos del modelo inicial y el transformado ya que las pruebas de normalidad y el valor R\(^2\) del modelo da un valor confiable.
#Modelo de regresión lineal simple
modelo <- lm(preciom ~ areaconst, data = vivienda4)
#Modelo logarítmico en el precio
modelo_log_p <- lm(log(preciom) ~ areaconst, data = vivienda4)
#Modelo raíz cuadrada
modelo_raiz <- lm(sqrt(preciom) ~ areaconst, data = vivienda4)
#Coeficientes del modelo
coeficientes <- coef(modelo)
print(coeficientes)
## (Intercept) areaconst
## 199.8101482 0.5008917
#Coeficiente modelo logarítmico en el precio
coeficientes1 <- coef(modelo_log_p)
print(coeficientes1)
## (Intercept) areaconst
## 5.321718365 0.001953596
#Coeficiente modelo raíz cuadrada
coeficientes2 <- coef(modelo_raiz)
print(coeficientes2)
## (Intercept) areaconst
## 14.22931687 0.01563007
#Imprimir los resultados de los modelos
stargazer(modelo,modelo_log_p,modelo_raiz, type = "text", df=FALSE)
##
## ============================================================
## Dependent variable:
## ----------------------------------------
## preciom log(preciom) sqrt(preciom)
## (1) (2) (3)
## ------------------------------------------------------------
## areaconst 0.501*** 0.002*** 0.016***
## (0.005) (0.00002) (0.0002)
##
## Constant 199.810*** 5.322*** 14.229***
## (0.451) (0.002) (0.014)
##
## ------------------------------------------------------------
## Observations 1,706 1,706 1,706
## R2 0.867 0.852 0.860
## Adjusted R2 0.867 0.852 0.860
## Residual Std. Error 7.141 0.030 0.229
## F Statistic 11,081.520*** 9,803.025*** 10,457.690***
## ============================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
#Validación de supuestos modelo logarítmico
#Prueba de Shapiro
shapiro <- shapiro.test(residuals(modelo_log_p))
print(shapiro)
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_log_p)
## W = 0.99935, p-value = 0.8503
#Durbin-Watson
durbinwatsontest <- dwtest(modelo_log_p)
print(durbinwatsontest)
##
## Durbin-Watson test
##
## data: modelo_log_p
## DW = 2.0665, p-value = 0.9139
## alternative hypothesis: true autocorrelation is greater than 0
#Breusch-Pagan
bptest <- bptest(modelo_log_p)
print(bptest)
##
## studentized Breusch-Pagan test
##
## data: modelo_log_p
## BP = 13.144, df = 1, p-value = 0.0002885
#Validación de supuestos modelo raiz cuadrada
#Prueba de Shapiro
shapiro <- shapiro.test(residuals(modelo_raiz))
print(shapiro)
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_raiz)
## W = 0.9993, p-value = 0.7942
#Durbin-Watson
durbinwatsontest <- dwtest(modelo_raiz)
print(durbinwatsontest)
##
## Durbin-Watson test
##
## data: modelo_raiz
## DW = 2.0672, p-value = 0.9161
## alternative hypothesis: true autocorrelation is greater than 0
#Breusch-Pagan
bptest <- bptest(modelo_raiz)
print(bptest)
##
## studentized Breusch-Pagan test
##
## data: modelo_raiz
## BP = 4.5044, df = 1, p-value = 0.03381
El modelo original presenta mejores resultados que los modelos logarítmicos al precio y la raiz cuadrada ya que particularmente en una de las pruebas de hipótesis como la Breusch Pagan el valor p en estos dos modelos dio por debajo del valor mínimo de significancia lo que indica que existe heteroceidad en el modelo, adicional el valor R\(^2\) en los dos modelos propuestos es inferior al modelo original lo que permite concluir que la variable independiente es importante para predecir la variable dependiente.