Actividad 3

Métodos y simulación estadística

Fabián Andrés Castro S.

22 de abril del 2024

Problema

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.

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

  • El valor mínimo en el precio de la vivienda es 207 millones, mientras que el valor máximo es de 309 millones.
  • La mediana del precio es 238 millones, mientras que la media se ubica en 243 millones.
  • El primer cuartil inicia en 230 millones mientras que el tercer cuartil está en 251 millones, cabe aclarar que la mediana es igual al segundo cuartil.
  • Respecto al área el valor mínimo es de 40 m\(^2\), mientras que el valor máximo construido fue de 200 m\(^2\).
  • La mediana del área construida es de 75 m\(^2\), mientras que la media se ubica en 87,63 m\(^2\).
  • El primer cuartil inicia en 60 m\(^2\) mientras que el tercer cuartil está en 98 m\(^2\), cabe aclarar que la mediana es igual al segundo cuartil.

Las gráficas que se muestran a continuación permiten validar los datos mencionados anteriormente.

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

  1. Estime el modelo de regresión lineal simple entre precio = f(area) + \(\epsilon\). Interprete los coeficientes del modelo \(B_{0}\), \(B_{1}\) en caso de ser correcto.
#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

  1. Construir un intervalo de confianza (95%) para el coeficiente \(B_{1}\), interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t.
#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.

  1. Calcule e interprete el indicador de bondad R\(^2\)

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

  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 oferta? ¿Qué consideraciones adicionales se deben tener?
#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…

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

  1. De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo
#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
  1. De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.

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.

  1. Estime varios modelos y compare los resultados obtenidos. En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?
#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

Gráficos del modelo logarítmico de los precios

Gráficos del modelo de raiz cuadrada

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.

Conclusiones

  1. La relación área construida vs precio es una relación directa y positiva.
  2. De acuerdo al modelo planteado el coeficiente \(B_{1}\) tiene una variación de aproximadamente 0,5 lo que indicaría que por cada metro cuadrado adcional que se contruya el precio de la vivienda aumentaría en $500,000.
  3. El mejor modelo planteado es el original, al intentar plantear otros modelos como el logarítmico o la raiz cuadrada estos no cumplen con el supuesto de hocedasticidad y el valor de ajuste R\(^2\) es menor.
  4. Poder agregar otras variables al modelo como las características de la casa o el apartamento (número de baños, piso del edificio, parqueaderos, etc) posiblemente tenga un impacto diferente en los resultados del modelo y pueda cambiar de manera importante.