Problema

Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz para apartamento de estrato 4 con área construida menor a 200 m2 (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.

Se realiza la importacion de librerias necesarias y la base de datos para el desarrollo del analisis.

#devtools::install_github("dgonxalex80/paqueteMETODOS", force = TRUE) 
library(paqueteMETODOS)
## Loading required package: cubature
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: MASS
## Loading required package: summarytools
## Loading required package: psych
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::select() masks MASS::select()
## ✖ tibble::view()  masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(naniar)
library(ggplot2)
library(mice)
## 
## Attaching package: 'mice'
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
library(stargazer)
## 
## Please cite as: 
## 
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
data(vivienda4)

# Depuracion de las viviendas tipo apartamento de estrato 4 y menores a 200 m2 de area

options(max.print = .Machine$integer.max)
vivienda4$tipo=str_to_upper(vivienda4$tipo)
Data = subset(vivienda4, vivienda4$estrato == 4 & vivienda4$areaconst < 201 & vivienda4$tipo == "APARTAMENTO")

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.

# visualizacion de los datos
str(Data)
## tibble [1,363 × 5] (S3: tbl_df/tbl/data.frame)
##  $ zona     : Factor w/ 5 levels "Zona Centro",..: 2 2 5 2 2 2 2 2 2 2 ...
##  $ estrato  : Factor w/ 4 levels "3","4","5","6": 2 2 2 2 2 2 2 2 2 2 ...
##  $ preciom  : num [1:1363] 220 320 290 220 220 162 225 370 155 240 ...
##  $ areaconst: num [1:1363] 52 108 96 82 75 60 84 117 60 75 ...
##  $ tipo     : chr [1:1363] "APARTAMENTO" "APARTAMENTO" "APARTAMENTO" "APARTAMENTO" ...
summary(Data)
##            zona      estrato     preciom        areaconst     
##  Zona Centro :   7   3:   0   Min.   : 78.0   Min.   : 40.00  
##  Zona Norte  : 237   4:1363   1st Qu.:153.5   1st Qu.: 60.00  
##  Zona Oeste  :  52   5:   0   Median :185.0   Median : 70.00  
##  Zona Oriente:   2   6:   0   Mean   :202.4   Mean   : 75.48  
##  Zona Sur    :1065            3rd Qu.:240.0   3rd Qu.: 84.00  
##                               Max.   :645.0   Max.   :200.00  
##      tipo          
##  Length:1363       
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Validacion de datos faltantes 
faltantes <- colSums(is.na(Data))

faltantes
##      zona   estrato   preciom areaconst      tipo 
##         0         0         0         0         0
# Se verifican y no se encuentra ninguna dato faltante
# vista de datos faltantes por variable
gg_miss_var(Data) + labs(x="Variables", y = "Datos Na")

# En la grafica anterior se visualiza que no hace falta ningun dato

grafico <-md.pattern(Data, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

# Grafica de datos completos

# Frecuencia relativas de el precio
barplot(prop.table(table(Data$preciom)),col=c("blue","orange", "green", "yellow", "red"),
        ylim=c(0,0.05),ylab="Frecuencias Relativas")

# Frecuencia relativa del area
barplot(prop.table(table(Data$areaconst)),col=c("blue","orange", "green", "yellow", "red"),
        ylim=c(0,0.12),ylab="Frecuencias Relativas")

# Promedio de precios de los apartamentos
mean(Data$preciom)
## [1] 202.4373
# Promedio de area construida de los apartamentos
mean(Data$areaconst)
## [1] 75.47836
par(mfrow=c(1,2))
boxplot(Data$areaconst, vertical=TRUE, xlab="Area Construida")
boxplot(Data$preciom, vertical=TRUE, xlab="Precio")

# Densidad del area construida
plot(Data$areaconst)
plot(density(Data$areaconst),main = "Densidad de area construida")

# Densidad del promedio de precios
plot(Data$preciom)
plot(density(Data$preciom),main = "Densidad de precios")

# Histogramas del area construida y del precio de los apartamentos.
hist(Data$areaconst)
hist(Data$preciom)

En el analisis exploratorio de datos se logra identificar el precio promedio de los apartamentos que rondan los 202 millones y area promedio de 75 m2 adicional de que todos los datos estan completos y no fue necesario realizar ningun tipo de depuracion.

En el histograma se evidencia de que la mayoria de apartamentos en cuanto al area construida esta entre 50 a 100 m2 y el precio entre 100 y 300 millones.

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

# Grafica de precios de viviendas con su respectiva linealidad
plot(Data$preciom,Data$areaconst,xlab = "Precios de viviendas", ylab = "Area de vivienda")
abline(lm(Data$areaconst ~ Data$preciom), col = "red")

print(paste("Correlacion: ",cov(Data$preciom,Data$areaconst)))
## [1] "Correlacion:  1102.19889830134"
summary(lm(Data$areaconst ~ Data$preciom))
## 
## Call:
## lm(formula = Data$areaconst ~ Data$preciom)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -49.411  -7.875  -3.042   3.897  95.494 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  23.136326   1.322152   17.50   <2e-16 ***
## Data$preciom  0.258559   0.006216   41.59   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.98 on 1361 degrees of freedom
## Multiple R-squared:  0.5597, Adjusted R-squared:  0.5594 
## F-statistic:  1730 on 1 and 1361 DF,  p-value: < 2.2e-16

3 - Estime el modelo de regresión lineal simple entre precio=f(area)+ε. Interprete los coeficientes del modelo β0, β1 en caso de ser correcto.

Lineal = lm(Data$preciom ~ Data$areaconst, data = Data)
summary(Lineal)
## 
## Call:
## lm(formula = Data$preciom ~ Data$areaconst, data = Data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -225.404  -23.902   -4.754   25.763  209.021 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    39.04679    4.09977   9.524   <2e-16 ***
## Data$areaconst  2.16473    0.05204  41.595   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared:  0.5597, Adjusted R-squared:  0.5594 
## F-statistic:  1730 on 1 and 1361 DF,  p-value: < 2.2e-16

B1 es el area el cual es la variable independiente y B0 es el intercepto o el precio el cual depende del area directamente. en este caso el intercepto es de 39.04 su r2 equivale al 0.55 su ajuste es 0.55 y su p-value es menor que la significancia del 0.05.

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

Confianza = confint(object = Lineal, level = 0.95)
Confianza
##                   2.5 %    97.5 %
## (Intercept)    31.00423 47.089340
## Data$areaconst  2.06264  2.266826
summary(Lineal)
## 
## Call:
## lm(formula = Data$preciom ~ Data$areaconst, data = Data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -225.404  -23.902   -4.754   25.763  209.021 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    39.04679    4.09977   9.524   <2e-16 ***
## Data$areaconst  2.16473    0.05204  41.595   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 43.34 on 1361 degrees of freedom
## Multiple R-squared:  0.5597, Adjusted R-squared:  0.5594 
## F-statistic:  1730 on 1 and 1361 DF,  p-value: < 2.2e-16

Si el intervalo no incluye el valor cero, se concluye que el coeficiente β1 es significativamente diferente de cero al nivel de confianza del 95%. Esto sugiere que la variable independiente area tiene un efecto significativo en la variable dependiente precio.

Como el valor p es menor que el nivel de significancia entonces se rechaza la hipotesis nula de que el coheficiente B1 es igual a cero o significacitvamente se acerca a cero.

5 - Calcule e interprete el indicador de bondad R2.

Para evitar ejecucion del mismo codigo vamos a tomarlo del punto anterior con respecto a la linea summary(Lineal) donde se determina el valor de R Cuadrado y nos indica que la variable dependiente (precio) es del 55% dependiente de la variable area, este modelo explica una variabilidad en la valiable dependiente y si este valor se aproxima a uno mejor sera el ajuste del modelo.

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

Precio = Data$preciom
Area = Data$areaconst
Lineal = lm(Precio ~ Area, data = Data)
predict(Lineal, data.frame(Area = 110), interval = "confidence", level = 0.95)
##        fit      lwr      upr
## 1 277.1674 272.9573 281.3775
summary(Lineal$residuals)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -225.404  -23.902   -4.754    0.000   25.763  209.021
hist(Lineal$residuals)

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

De acuerdo al analisis realizado esta oferta no es viable ya que el valor estimado o predicto para un area de 110 m2 es de 277.16 millones pero adicional con esa misma area se tienen apartamentos entre los 272 a 281 millones esto puede variar de acuerdo a la zona.

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.

hist(Lineal$residuals)

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

shapiro.test(Lineal$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  Lineal$residuals
## W = 0.96486, p-value < 2.2e-16
bptest(Lineal)
## 
##  studentized Breusch-Pagan test
## 
## data:  Lineal
## BP = 292.99, df = 1, p-value < 2.2e-16

Se puede observar que de acuerdo al tamaño de Breusch-Pagan (BP) no es homocedastico ya que su p-value es muy pequeño Esto indica que hay una fuerte evidencia para rechazar la hipótesis nula de que no hay heterocedasticidad en el modelo. Esto quiere decir que os errores del modelo no tienen una varianza constante en todos los niveles de las variables independientes. Esto indica que la varianza de los errores no es la misma en todos los valores de las variables independientes.

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

Adaptado = lm(log(Data$preciom) ~ log(Data$areaconst), data = Data)
Adaptado
## 
## Call:
## lm(formula = log(Data$preciom) ~ log(Data$areaconst), data = Data)
## 
## Coefficients:
##         (Intercept)  log(Data$areaconst)  
##              1.4837               0.8818
bptest(Adaptado)
## 
##  studentized Breusch-Pagan test
## 
## data:  Adaptado
## BP = 92.877, df = 1, p-value < 2.2e-16

El modelo nuevo ha demostrado mejoras, pero su p-valor aún es muy pequeño, lo que significa que se rechaza la hipotesis nula y no cumple con la homocedasticidad. Esto también demuestra que la varianza de errores no es constante. de igual forma se demuestra de que la varianza de los errores tiende a ser constante en función de las variables independientes, según un valor de prueba BP más bajo con un BP de 92.877, lo que indica menos prueba de heterocedasticidad en el modelo.

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

Adaptado
## 
## Call:
## lm(formula = log(Data$preciom) ~ log(Data$areaconst), data = Data)
## 
## Coefficients:
##         (Intercept)  log(Data$areaconst)  
##              1.4837               0.8818
bptest(Adaptado)
## 
##  studentized Breusch-Pagan test
## 
## data:  Adaptado
## BP = 92.877, df = 1, p-value < 2.2e-16
Lineal
## 
## Call:
## lm(formula = Precio ~ Area, data = Data)
## 
## Coefficients:
## (Intercept)         Area  
##      39.047        2.165
bptest(Lineal)
## 
##  studentized Breusch-Pagan test
## 
## data:  Lineal
## BP = 292.99, df = 1, p-value < 2.2e-16

Después de la transformación, el segundo modelo experimenta una notable mejora, pero ninguno de los dos modelos cumple con el principio de homocedasticidad, lo que significa que se requiere una mayor adaptación o modificación del modelo.

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

modelo1=lm(Data$preciom ~ Data$areaconst, data=Data)           # Lin - Lin
modelo2=lm(Data$preciom ~ log(Data$areaconst), data=Data)      # Lin - Log
modelo3=lm(log(Data$preciom) ~ Data$areaconst, data=Data)      # Log - Lin
modelo4=lm(log(Data$preciom) ~ log(Data$areaconst), data=Data)# Log - Log

dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.443, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(modelo2)
## 
##  Durbin-Watson test
## 
## data:  modelo2
## DW = 1.4775, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(modelo3)
## 
##  Durbin-Watson test
## 
## data:  modelo3
## DW = 1.3187, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(modelo4)
## 
##  Durbin-Watson test
## 
## data:  modelo4
## DW = 1.3214, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
stargazer(modelo1, modelo2, modelo3, modelo4, type="text", df=FALSE)
## 
## =======================================================================
##                                     Dependent variable:                
##                     ---------------------------------------------------
##                              preciom                  preciom)         
##                         (1)          (2)          (3)          (4)     
## -----------------------------------------------------------------------
## areaconst             2.165***                  0.009***               
##                       (0.052)                   (0.0002)               
##                                                                        
## areaconst)                        195.419***                 0.882***  
##                                    (4.445)                   (0.020)   
##                                                                        
## Constant             39.047***   -635.532***    4.551***     1.484***  
##                       (4.100)      (19.092)     (0.019)      (0.087)   
##                                                                        
## -----------------------------------------------------------------------
## Observations           1,363        1,363        1,363        1,363    
## R2                     0.560        0.587        0.520        0.582    
## Adjusted R2            0.559        0.587        0.519        0.582    
## Residual Std. Error    43.339       41.982       0.205        0.191    
## F Statistic         1,730.157*** 1,933.199*** 1,473.424*** 1,894.288***
## =======================================================================
## Note:                                       *p<0.1; **p<0.05; ***p<0.01

Se evidencia que el mejor modelo que se adapta es el modelo 4 o LOG - LOG aunque en las observaciones todos los modelos cumplen con el mismo valor de 1.363 pero se hace notable su diferencia en el R2 ya que el modelo 4 es superior al modelo 1 y 3 pero se aproxima al modelo 2 de igual forma que el ajuste del R2. Lo que hace que el modelo 4 sea el mejor es su resultado residual ya que comparandolo con los demas modelos este contiene el error mas pequeño y frente a el F Satatistic es el segundo con mayor resultado.