Pontificia Universidad Javeriana - Cali

Introducción

El siguiente documento contiene el análisis de precios para apartamentos de estrato 4 con área construida menor o igual a 200 m2, proyecto contratado por la inmobiliaria A&C para la orientación en la asignación de los valores correctos según el historial del mercado.

El proyecto incluye la construcción de un modelo predictivo de precios basados en el área de los apartamentos, el estudio inicia desde un estudio detallado de la base de datos, principalmente de las variables precio y área, contiene las pruebas matemáticas que dan soporte a los resultados y el modelo, también incluyen graficas de tendencias de comportamiento del mercado y un ejercicio de predicción de precio.

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

library(dplyr)
library(paqueteMETODOS)
data(vivienda4)

vivienda_filtrado = vivienda4 %>%
  filter(tipo == "Apartamento")

par(mfrow=c(2,2))
hist(vivienda_filtrado$areaconst, main = "Histograma de las areas construidas")
line = mean(vivienda_filtrado$areaconst)
abline(v=line, col="orange", lwd=4)
hist(vivienda_filtrado$preciom, main = "Histograma de los precios")
line2 = mean(vivienda_filtrado$preciom)
abline(v=line2, col="orange", lwd=4)

qqnorm(vivienda_filtrado$areaconst, col= "black", lwd=2, lty=2, main = "QQ Areas")
qqline(vivienda_filtrado$areaconst, col="blue")
qqnorm(vivienda_filtrado$preciom, col= "black", lwd=2, lty=2, main = "QQ Precios")
qqline(vivienda_filtrado$preciom, col="blue")

cat("MTC Area Construida: ", "Media:", mean(vivienda_filtrado$areaconst), "Min:", 
min(vivienda_filtrado$areaconst), "Max:", max(vivienda_filtrado$areaconst), "Desviación estandar:", 
sd(vivienda_filtrado$areaconst), "\n")
## MTC Area Construida:  Media: 75.47836 Min: 40 Max: 200 Desviación estandar: 22.56461
cat("MTC Precios: ", "Media:", mean(vivienda_filtrado$preciom), "Min:", 
min(vivienda_filtrado$preciom), "Max:", max(vivienda_filtrado$preciom), "Desviación estandar:", 
sd(vivienda_filtrado$preciom))
## MTC Precios:  Media: 237.6831 Min: 207.4063 Max: 305.19 Desviación estandar: 13.28868
shapiro.test(vivienda_filtrado$areaconst)
## 
##  Shapiro-Wilk normality test
## 
## data:  vivienda_filtrado$areaconst
## W = 0.82347, p-value < 2.2e-16
shapiro.test(vivienda_filtrado$preciom)
## 
##  Shapiro-Wilk normality test
## 
## data:  vivienda_filtrado$preciom
## W = 0.9277, p-value < 2.2e-16

Análisis: En el análisis de las variables “Área Construida”, encontramos que no constituye una distribución normal, lo cual se puede probar en el histograma y el los grafico QQ, en este último vemos que los puntos no están alineados con la línea de referencia. Para el caso de los precios, se acerca más a una distribución normal, la media coincide con el pico máximo, sin embargo, presenta una asimetría negativa y con prueba de saphiro test confirmamos que ninguna de las variables es una distribución normal, ya que ambos dieron como resultado el p-value < 0.05. En la variable Área construida, encontramos una Media de 87,6 M2, un Mínimo de 40 M2 y un Máximo de 200 M2 y finalmente una Desviación Estándar de 36,34 M2. Para la variable de Precios, encontramos una Media de 243,70 millones, un Mínimo de 207,40 millones, un Máximo de 309,69 millones y una Desviación Estándar de 19,55 millones.

Paso 2:

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 (área construida) - incluir gráficos e indicadores apropiados interpretados.

grafico=ggplot(data = vivienda_filtrado,aes(y=vivienda_filtrado$preciom,
       x=vivienda_filtrado$areaconst)) + 
       geom_point() + geom_smooth() + labs(title='Relacion Area/Precio',
       x='Area Construida - M2',
       y='Precio en Millones de pesos - COP')
       plot(grafico)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

cat("Coeficiente de correlacion Area/Precio: ", cor(vivienda_filtrado$areaconst,vivienda_filtrado$preciom))
## Coeficiente de correlacion Area/Precio:  0.8463271

Análisis: En la gráfica podemos observar que existe una relación lineal entre las variables, a mayor Área Construida se incrementa el precio. Calculando el coeficiente de correlación, encontramos que este tiene un valor de 0.84, se encuentra en el intervalo de 0.8 a 1, lo que significa una relación lineal Positiva Fuerte.

Paso 3:

Estime el modelo de regresión lineal simple entre precio=f(area)+E. Interprete los coeficientes del modelo B0, B1 en caso de ser correcto.

mod = lm(vivienda_filtrado$preciom~vivienda_filtrado$areaconst)
summary(mod)
## 
## Call:
## lm(formula = vivienda_filtrado$preciom ~ vivienda_filtrado$areaconst)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -26.5139  -5.0886  -0.0031   4.6406  24.3309 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 2.001e+02  6.698e-01  298.67   <2e-16 ***
## vivienda_filtrado$areaconst 4.984e-01  8.503e-03   58.62   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.081 on 1361 degrees of freedom
## Multiple R-squared:  0.7163, Adjusted R-squared:  0.7161 
## F-statistic:  3436 on 1 and 1361 DF,  p-value: < 2.2e-16

Análisis: El modelo logra explicar en un 71,63% la variable precio, con respecto a los coeficientes tenemos: B0(Intercepto)= 200.1 y B1(Pendiente)= 0.4984. Se puede interpretar diciendo que por cada 1% que se incremente el área, el precio se elevara 0,49 millones o $498.400 COP.

Paso 4:

Construir un intervalo de confianza (95%) para el coeficiente B1, interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t.

confint(mod)
##                                   2.5 %     97.5 %
## (Intercept)                 198.7494103 201.377500
## vivienda_filtrado$areaconst   0.4817357   0.515097
prueba_t = t.test(vivienda_filtrado$preciom, vivienda_filtrado$areaconst)
print(prueba_t)
## 
##  Welch Two Sample t-test
## 
## data:  vivienda_filtrado$preciom and vivienda_filtrado$areaconst
## t = 228.68, df = 2205.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  160.8138 163.5957
## sample estimates:
## mean of x mean of y 
## 237.68310  75.47836

Análisis: El resultado muestra que B1 es diferente de cero. Se rechaza la hipótesis nula y se acepta la hipótesis alterna, donde B1 es diferente de cero, lo cual se comprueba con la prueba de hipótesis t, donde encontramos que p-value es prácticamente cero (2.2e-16), menor que el nivel de significancia de 0.05.

Paso 5:

Calcule e interprete el indicador de bondad R2.

resumen_modelo = summary(mod)
r_cuadrado = resumen_modelo$r.squared
print(r_cuadrado)
## [1] 0.7162696

Análisis: El valor de R-squared para este caso es 0,7162 lo que se puede traducir en una relación positiva débil, teniendo en cuenta que es un modelo simple, el resultado es confiable.

Paso 6:

¿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?.

Newdata = list(vivienda_filtrado$areaconst)
predicion = data.frame(predict(mod, Newdata=110 ,interval = "confidence"))
cat("El precio promedio para un apartamento de 110 M2 segun el modelo debe estar entre: 
","$", round(mean(predicion$lwr),3), "y", "$",round(mean(predicion$upr),3), "millones de pesos COP.")
## El precio promedio para un apartamento de 110 M2 segun el modelo debe estar entre: 
##  $ 237.192 y $ 238.174 millones de pesos COP.

Análisis: El precio estimado según el modelo estaría entre $237.192 y $238.174, por lo tanto una oferta de 200 millones no es atractiva.

Paso 7:

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.

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

Análisis: En las gráficas podemos observar que hay cumplimiento de los supuestos:

Residuals vs Fitted (Lineralidad): La línea de referencia es horizontal y la dispersión de los valores está cerca de la línea roja, hay linealidad. Normal Q-Q (Normalidad de residuos): Cumple la normalidad, sigue una distribución normal, los puntos siguen la diagonal. Scale-Location (homocedasticidad): La línea roja es horizontal y la varianza de los residuos es constante, el modelo es homoscedastico. Residuals vs Leverage (Outliers): No se observan valores atípicos o influyentes.

Paso 8:

De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.

mod2 = lm(log(vivienda_filtrado$preciom)~vivienda_filtrado$areaconst)
summary(mod2)
## 
## Call:
## lm(formula = log(vivienda_filtrado$preciom) ~ vivienda_filtrado$areaconst)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.104645 -0.020942  0.000593  0.019371  0.099110 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.318e+00  2.835e-03 1876.11   <2e-16 ***
## vivienda_filtrado$areaconst 2.007e-03  3.598e-05   55.77   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.02996 on 1361 degrees of freedom
## Multiple R-squared:  0.6956, Adjusted R-squared:  0.6954 
## F-statistic:  3110 on 1 and 1361 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod2)

Análisis: Aunque el modelo ya era bueno y se cumplen los supuestos, realizamos la transformación de la variable respuesta (precio) para conocer el comportamiento, se aplica transformación logarítmica

Paso 9:

De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.

R2_original = 0.7163
R2_transformado = 0.6956

Nombres = c("R2 Original", "R2 Tranformado")
R2 = c(R2_original, R2_transformado)

tabla = data.frame(Nombres, R2)
print(tabla)
##          Nombres     R2
## 1    R2 Original 0.7163
## 2 R2 Tranformado 0.6956

Observamos que hay una pequeña disminución en el valor del R2, lo que indica que la transformacion no es necesaria.

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

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

Análisis: Con la transformación el R2 y los supuestos desmejoran un poco, sin embargo, se cumplen y el modelo sigue con un R2 bueno.

Paso 10:

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

modelo_original = lm(vivienda_filtrado$preciom~vivienda_filtrado$areaconst)
modelo_logaritmo = lm(log(vivienda_filtrado$preciom)~vivienda_filtrado$areaconst)
modelo_sqrt = lm(sqrt(vivienda_filtrado$preciom)~vivienda_filtrado$areaconst)

resumen_modelo_original <- summary(modelo_original)
resumen_modelo_log <- summary(modelo_logaritmo)
resumen_modelo_sqrt <- summary(modelo_sqrt)
Variables = c("Modelo Original", "Modelo Logaritmo", "Modelo Raiz Cuadrada")
R2_Modelos = c(resumen_modelo_original$r.squared, resumen_modelo_log$r.squared, resumen_modelo_sqrt$r.squared)

tabla = data.frame(Variables, R2_Modelos)
print(tabla)
##              Variables R2_Modelos
## 1      Modelo Original  0.7162696
## 2     Modelo Logaritmo  0.6955958
## 3 Modelo Raiz Cuadrada  0.7062526
par(mfrow=c(2,2))
plot(modelo_original)

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

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

Análisis: Para los tres modelos se cumplen los supuestos, no hay evidencia que indique lo contrario, el modelo original es el más acertado y con el mejor R2.

Conclusión

Se realizo la comprobación de la relación entre las variables precio y área, están fuertemente ligadas, lo que significa que a medida que aumenta el área también lo hace el precio, visualmente se puede observar en la gráfica de análisis bivariado, el modelo indica que por cada 1% en el incremento del área, el precio de los inmuebles debe aumentar $498.400 COP, el modelo original cumple los supuestos y es confiable, de igual forma se aplicaron algunas transformaciones pero con resultados similares. Con el modelo descrito es posible predecir los precios de los apartamentos, esto será de gran utilidad para la inmobiliaria porque podran fijar los precios con un fundamento matemático y confiable.