0. Cargue de información y librerías

El siguiente informe realiza un análisis de la tabla “vivienda4” para la inmobiliaria A&C, que requiere apoyo en la construcción de un modelo que lo oriente sobre los precios de los inmuebles. Este documento se divide en secciones en los cuales se va evaluando la información y se construyen los modelos como también se evaluan los supuestos con el objetivo de confirmar si estos pueden ser usados para el análisis de los precios de viviendas.

A continuación se hace el cargue de los datos y librerías requeridas para la construcción de los modelos.

#install.packages("devtools") # solo una vez

#devtools::install_github("dgonxalex80/paqueteMETODOS")

require(dplyr)
require(mice)
require(VIM)
require(ggplot2)
require(table1)
require(naniar)

library(paqueteMETODOS)

data(vivienda4)

df <- vivienda4[vivienda4$tipo == 'Apartamento',]

1. Análisis exploratorio

Se identifican la estructura de la tabla “Vivienda4” extrayendo las 6 primeras lineas de la misma y todas sus columnas después de los filtros aplicados según el requerimiento de los asesores. Y posteriormente un resumen de estadísticos para cada una de las columnas numéricas.

head(df)
summary(df[,c(3,4)])
##     preciom        areaconst     
##  Min.   : 78.0   Min.   : 40.00  
##  1st Qu.:153.5   1st Qu.: 60.00  
##  Median :185.0   Median : 70.00  
##  Mean   :202.4   Mean   : 75.48  
##  3rd Qu.:240.0   3rd Qu.: 84.00  
##  Max.   :645.0   Max.   :200.00
describe(df[,c(3,4)])
cv_preciom <-100*sd(df$preciom, na.rm=TRUE)/mean(df$preciom, na.rm=TRUE)
cat("El coeficiente de variacion del precio es",round(cv_preciom, digits=0))
## El coeficiente de variacion del precio es 32
cv_areaconst <- 100*sd(df$areaconst, na.rm=TRUE)/mean(df$areaconst, na.rm=TRUE)
cat(" y El coeficiente de variacion del area es",round(cv_areaconst, digits=0))
##  y El coeficiente de variacion del area es 30
sort(table(df$zona), decreasing = TRUE)
## 
##     Zona Sur   Zona Norte   Zona Oeste  Zona Centro Zona Oriente 
##         1065          237           52            7            2
barplot(table(df$zona), ylim=c(0,1200), ylab="# viviendas", col=rainbow(5))

hist(df$preciom)

hist(df$areaconst)

Del resumen anterior tenemos los siguientes resultados:

  1. Hay 1363 registros asociados a apartamentos de estrato 4 con áreas inferiores/iguales a 200 m2.
  2. Preciom: debido a que no se especifica el significado, en este estudio se trata como el precio en millones de pesos de la propiedad.
    • No hay registros sin información del precio.
    • Las viviendas del data set poseen un precio que oscila entre 78 y 645 millones de pesos.
    • El promedio de precio esta en 202.44 Millones de pesos (media).
    • El 75% de las viviendas con información se encuentra en o por debajo de un precio de 240 millones.
    • El coeficiente de variación indica una muestra relativamente homogénea con un valor de 32%, indicando que la media puede ser considerada representativa.
    • Visual y analíticamente se observa una distribución leptocurtica y asimétrica (media de 202.44 y mediana de 185)
  3. Areaconst: se infiere para este estudio que esta columna corresponde al área construida en metros cuadrados de cada apartamento.
    • No hay registros sin información del precio.
    • Las viviendas del data set poseen un área construida entre 40 y 198 metros cuadrados.
    • El área promedio es de 75.48 metros cuadrados.
    • El 75% de las viviendas con información se encuentra en o por debajo de un área de 84 metros cuadrados.
    • El coeficiente de variación indica una muestra relativamente homogénea con un valor de 30%, indicando que la media puede ser considerada representativa.
    • Visual y analíticamente se observa una distribución leptocurtica y asimetrica de cola derecha (media de 75.48 y mediana de 70)
  4. Zona: se infiere para el análisis que corresponde a las zonas de una ciudad donde se encuentran ubicados los apartamentos.
    • No hay registros sin información del precio.
    • El mayor numero de apartamentos en estrato 4 se encuentran en la zona Sur con 1065 de 1363 registros y la zona oriente es la de menor numero de registros de apartamentos con apenas 2 con estas características.

2. Análisis exploratorio bivariado

A continuación se evalúa la covarianza, correlación y el scatterplot entre las variables de precio y area.

library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:purrr':
## 
##     some
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:dplyr':
## 
##     recode
scatterplot(df$preciom ~ df$areaconst, data=df,
   xlab="Area", ylab="precio",
   main="Area vs Precio", smooth=FALSE)

covarianza=cov(df$preciom, df$areaconst)
cat("La covarianza entre el precio y el area es ",round(covarianza, digits=3))
## La covarianza entre el precio y el area es  1102.199
correlacion=cor(df$preciom, df$areaconst)
cat(" y el coeficiente de correlacion es",round(correlacion, digits=3))
##  y el coeficiente de correlacion es 0.748

En el scatterplot se observa una tendencia positiva y una posible correlación que parece tener una tendencia lineal, esta misma tendencia positiva se comprueba con la covarianza la cual observa un valor positivo (1102) y el coeficiente de correlación confirma esta tendencia positiva y una posible relación lineal que se podría considerar débil al ser de 0.748 < 0.8. Para confirmar que esta relación lineal existe se debe evaluar si se cumple el supuesto de normalidad de la distribución de las variables.

shapiro.test(df$areaconst)
## 
##  Shapiro-Wilk normality test
## 
## data:  df$areaconst
## W = 0.82347, p-value < 2.2e-16
shapiro.test(df$preciom)
## 
##  Shapiro-Wilk normality test
## 
## data:  df$preciom
## W = 0.89881, p-value < 2.2e-16
qqPlot(df$areaconst)

## [1] 118 262
qqPlot(df$preciom)

## [1] 664 771

En ambos casos para ambas variables se rechaza la hipótesis nula y se concluye que los datos de ambas variables no siguen una distribución normal, lo cual también puede ser observado en los gráficos Q-Q normal, razón por la se decide evaluar de manera adicional la prueba de correlación de Spearman.

cor.test(df$areaconst,df$preciom, method="spearman")
## Warning in cor.test.default(df$areaconst, df$preciom, method = "spearman"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  df$areaconst and df$preciom
## S = 93987139, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.7772938

En la muestra se observa un coeficiente de correlación Spearman de 0.777, siendo estadísticamente significativo a un nivel de confianza de 95% (p<0.05). Se concluye entonces que existe entonces evidencia suficiente para afirmar que existe una correlación entre ambas variables.

3. Estimación modelo de regresión lineal simple

Se procede a generar un modelo lineal que explique el precio en función del área de los apartamentos de la información suministrada. Obteniendo el modelo Preciom = 2.16473Areaconst + 39.04679

modelo1 = lm(preciom ~ areaconst, data=df)
summary(modelo1)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = df)
## 
## 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 ***
## 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

Como se puede observar dado la Prueba T y el P-value (ambos iguales al ser un modelo para una sola covariable), confirmando entonces que el área es una variable significativa para explicar el comportamiento del precio.

El coeficiente 𝝱1 se interpreta como el valor o tasa a la cual aumenta el precio de un apartamento por cada aumento de su área, en este caso por cada metro cuadrado se espera un aumento en el precio de 2.16 millones de pesos.

Posterior para interpretar el intercepto o constante del modelo 𝝱0, se evalua nuevamente el modelo lineal sin embargo esta vez centrado, restando la media del área construida, con este modelo se puede explicar el intercepto como el precio promedio esperado para el área promedio de los apartamentos evaluados, en este caso el área promedio calculada previamente fue de 75 M2 obteniendo para este valor un precio estimado de de 202 Millones. A continuación el calculo del modelo y un resumen de este, Preciom_centrado = 2.16473Areaconst + 202.43727.

df$areacent <- df$areaconst-mean(df$areaconst)

modelo_cent <- lm(preciom ~ areacent, data=df)
summary(modelo_cent)
## 
## Call:
## lm(formula = preciom ~ areacent, data = df)
## 
## 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) 202.43727    1.17390  172.45   <2e-16 ***
## areacent      2.16473    0.05204   41.59   <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

4. Intervalo de confianza 95%

A continuación se obtiene el intervalo de confianza de 95% para el coeficiente 𝝱1, encontrando que no toma valores de 0 en este rango y se interpreta que por cada metro cuadrado adicional en un apartamento el precio puede incrementar en un rango de 2.062 a 2.267 Millones de pesos.

confint(modelo1, level=0.95)
##                2.5 %    97.5 %
## (Intercept) 31.00423 47.089340
## areaconst    2.06264  2.266826
summary(modelo1)$coefficients
##              Estimate Std. Error   t value      Pr(>|t|)
## (Intercept) 39.046787 4.09976963  9.524142  7.307017e-21
## areaconst    2.164733 0.05204291 41.595152 1.056327e-244

Se observa que el valor P de beta 1 es 1.056 e-244 < 0.05 por lo cual se rechaza la hipótesis Ho: 𝝱1=0, existiendo evidencia de que existe una relación lineal el precio y el área. Lo cual se confirma con el intervalo de confianza del 95% donde este coeficiente se encuentra entre 2.06 y 2.26.

5. Indicador de bondad de ajustes R2

Se procede a calcular el indicador de bondad R² del modelo lineal.

r2 = summary(modelo1)$r.squared
cat('El coeficiente R2 es igual a ', r2)
## El coeficiente R2 es igual a  0.5597117

Se obtuvo para este primer modelo un coeficiente de R² de 0.5597 indicando que aproximadamente un 56% de la variación del precio puede ser explicada con el modelo empleando como variable independiente el área construida. Sin embargo el 44% restante no se logra explicar con este modelo y su ajuste correspondiente, y puede deberse a no tomar en cuenta en la construccion del modelo las otras variables como por ejemplo Estrato, ubicación geográfica o alguna otra que incluso no este siendo visualizada en la tabla suministrada por la gerencia de la inmobiliaria A&C.

6. Predicción del modelo caso 110 m²

Se procede a emplear el modelo para calcular el precio estimado para una vivienda con un área construida de 110 m² y 95% de confianza.

precioarea110 <- data.frame(areaconst=110)

predict(modelo1, precioarea110, interval = 'confidence', level = 0.95)
##        fit      lwr      upr
## 1 277.1674 272.9573 281.3775

Para un área de 110 metros cuadrados se espera un preció de 277 Millones con un intervalo de confianza del 95% entre 273 y 281 millones. Si se presenta una oportunidad de negocio se puede confirmar de manera preliminar que un apartamento con la misma área y un precio de oferta de 200 millones se podría considerar atractiva de manera preliminar. Sin embargo se debe tener en cuenta que este modelo como fue visto en la sección anterior presenta un R² aproximado de 56% y este apartamento en oferta puede estar en el 44% de los datos que no logra explicar este modelo lineal.

Se debe evaluar los precios de viviendas con tamaños similares, ya que algunas viviendas en el gráfico realizado a continuación de área vs precio se logran observar que oscilan en precios por debajo de 200 millones. Como también evaluar la zona de compra ya que su precio puede variar en función de esto sin embargo no es tópico de este informe expandir en esta correlación por zonas.

scatterplot(df$preciom ~ df$areaconst, data=df,
   xlab="Area", ylab="precio",
   main="Area vs Precio", smooth=FALSE)

abline(v=c(90,120), col="red")

7. Validación de supuestos

A continuación una revisión de los supuestos del modelo lineal (modelo1).

7.1 Homoscedasticidad o Varianza constante

Se evalua la Homoscedasticidad de manera grafica y por medio del test Breusch-Pagan. Se observa en el grafico de valores residuales vs ajustados que los datos no siguen el comportamiento esperado de aleatoriedad alrededor del eje de residual igual a cero, descartando entonces el supuesto de linealidad para el modelo 1. De igual forma con el test Breusch-Pagan se observa que el valor-P es menor (2.2e-16) que el nivel de significancia de 5% por lo tanto, hay evidencias de que no se cumple la Homoscedasticidad de los residuales.

lmtest::bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 292.99, df = 1, p-value < 2.2e-16
plot(modelo1, which=1)

7.2 Normalidad

Se evalua la normalidad de dos formas, graficamente a traves del Q-Q plot, ademas por medio de la prueba Shapiro-Wilks. En el gráfico del Q-Q plot se observa que en los extremos de la diagonal los puntos se desvían de la diagonal indicando un comportamiento de No Normalidad, confirmado a su vez con la prueba Shapiro donde el Valor-P de 2.2e-16 es menor al nivel de significancia de 0.05, evidencia de que NO se cumple el supuesto de normalidad.

shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.96486, p-value < 2.2e-16
plot(modelo1, which=2)

7.3 No Autocorrelación de errores

Para la no autocorrelacion de errores se usa el Darwin-Watson test, donde se obtuvo un valor de 1.443. En este test los valores de 2 a 4 indican que no se detecta una autocorrelación, valores entre 0 y 2 una autocorrelacion positiva y de 2 a 4 una autocorrelacion negativa. Con esta ultima definición se confirma de que los errores presentan una correlacion positiva y por ende NO cumple este supuesto.

lmtest::dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.443, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

7.4 Outliers

Aunque no es un supuesto formal, se espera que la data no contenga datos atípicos que generen sesgos en los estimadores de los coeficientes. Razon por la cual se usa el boxplot para identificar si existen posibles outiers, en los graficos a continuación se observan que para el area puede poseer valores atipicos por encima de 150 metros cuadrados y para el precio a su vez valores posiblemente atipicos por enciam de los 400 millones de pesos.

boxplot(df$areaconst, ylab="Area")

boxplot(df$preciom)

7.5 Linealidad

El supuesto de linealidad puede ser algo mas subjetivo y dependiente de gráficos como el scatterplot, cumpliéndose en los casos donde se observe una tendencia lineal, el cual para este modelo de manera aparente parece cumplir con una pendiente positiva atravesando los puntos en lo que parece el medio de la nube.

Sin embargo al graficar el scale-Location plot se observa que los puntos residuales parecen presentar un ligero patrón y la linea de tendencia roja no es horizontal indicando posiblemente una NO linealidad.

scatterplot(df$preciom ~ df$areaconst, data=df,
   xlab="Area", ylab="precio",
   main="Area vs Precio", smooth=FALSE)

plot(modelo1, which=3)

8. Transformación

Debido al no cumplimiento de los supuestos de linealidad del modelo 1, se evaluaron transformaciones con el objetivo de buscar un cumplimiento de los supuestos de ser posible.

Se emplea el metodo Box-Cox el cual puede traer soluciones a problemas de normalidad y no homogeneidad de varianza. Para ellos se calcula el valor de lambda, 𝛌, obteniendo un valor de -0.13, indicando que posiblemente la transformación log(y) es la más apropiada, y como segunda opción se evalua la transformación 1/√y.

dfbxc = as.data.frame(df)

boxcox(lm(preciom ~ areaconst, data=dfbxc),lambda=-2:2)

bxc <- boxcox(lm(preciom ~ areaconst, data=dfbxc),lambda=-1:1)

(lambda <- bxc$x[which.max(bxc$y)])
## [1] -0.1313131

A continuación se encuentra el modelo 2, con log(y).

modelo2 = lm(log(preciom) ~ areaconst, data=dfbxc)

summary(modelo2)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst, data = dfbxc)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.98857 -0.13188 -0.01249  0.15595  0.66387 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 4.5512586  0.0194001  234.60   <2e-16 ***
## areaconst   0.0094530  0.0002463   38.38   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2051 on 1361 degrees of freedom
## Multiple R-squared:  0.5198, Adjusted R-squared:  0.5195 
## F-statistic:  1473 on 1 and 1361 DF,  p-value: < 2.2e-16

A continuación se encuentra el modelo 3, con 1/√y.

modelo3 = lm(1/sqrt(preciom) ~ areaconst, data=dfbxc)

summary(modelo3)
## 
## Call:
## lm(formula = 1/sqrt(preciom) ~ areaconst, data = dfbxc)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.022689 -0.006035  0.000169  0.004798  0.033685 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.707e-02  7.061e-04  137.47   <2e-16 ***
## areaconst   -3.231e-04  8.963e-06  -36.05   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.007464 on 1361 degrees of freedom
## Multiple R-squared:  0.4884, Adjusted R-squared:  0.488 
## F-statistic:  1299 on 1 and 1361 DF,  p-value: < 2.2e-16

A continuación se encuentra el modelo 3, con log(y) & log(x).

modelo4 = lm(log(preciom) ~ log(areaconst), data=dfbxc)

summary(modelo4)
## 
## Call:
## lm(formula = log(preciom) ~ log(areaconst), data = dfbxc)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.8890 -0.1119  0.0028  0.1343  0.7538 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1.48373    0.08703   17.05   <2e-16 ***
## log(areaconst)  0.88175    0.02026   43.52   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1914 on 1361 degrees of freedom
## Multiple R-squared:  0.5819, Adjusted R-squared:  0.5816 
## F-statistic:  1894 on 1 and 1361 DF,  p-value: < 2.2e-16

Como se observa en los modelos 2, 3 y 4 no hay un cambio sustancial en el R2, esto es debido a que estas transformaciones como se mención previamente buscan es mitigar los problemas asociados a los supuestos de normalidad, varianza constante y linealidad.

9 & 10 Comparativo modelo inicial y transformaciones: Ajuste y supuestos

Para realizar de manera más eficiente el comparativo se genera una tabla comparativa de los 4 modelos realizados, evaluando el R2, y si cumple o no los supuestos.

Modelo (y - x) R² Normalidad Homoscedasticidad Linealidad No autocorrelación
Lin - Lin 0.56 NO NO NO NO
Log -Lin 0.52 NO NO NO NO
1/√y - Lin 0.488 NO NO NO NO
Log - Log 0.582 NO NO NO NO

El mejor modelo en general es el Log-Log (model4) con un R2 de 0.582 el mayor entre estos sin embargo tampoco cumple los supuestos de linealidad. A continuación algunos comentarios frente a este no cumplmiento de supuestos, el cual tambien se repite en todos los modelos evaluados incluyendo las transformaciones:

  1. Normalidad: Las colas en el grafico Q-Q se acercan más a la linea recta sin emabrgo no logra cumplir el supuesto, al igual que la prueba Shapiro el valor P aumenta sin emabrgo no es mayor a la significancia de 0.05.
  2. Varianza Constante: No hay una mejora apreciable en los modelos
  3. No autocorrelación errores: No hay una mejora apreciable en los modelos
  4. Linealidad: En el scatter plot se ve un mejor comportamiento en el modelo 4 comparado con los otros, sin emabrgo en el scale-Location plot se observa que los puntos residuales parecen presentar un ligero patrón de putnos concentrados en una zona del grafico y la linea de tendencia roja no es horizontal indicando posiblemente una NO linealidad.

A continuación un cuadro comparativo donde se observan los coeficientes para el modelo lineal y las transformaciones realizadas, R², estadístico F.

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
stargazer(modelo1, modelo2, modelo3, modelo4, type="text", df=FALSE)
## 
## ==========================================================================
##                                      Dependent variable:                  
##                     ------------------------------------------------------
##                       preciom    log(preciom) 1/sqrt(preciom) log(preciom)
##                         (1)          (2)            (3)           (4)     
## --------------------------------------------------------------------------
## areaconst             2.165***     0.009***     -0.0003***                
##                       (0.052)      (0.0002)      (0.00001)                
##                                                                           
## log(areaconst)                                                  0.882***  
##                                                                 (0.020)   
##                                                                           
## Constant             39.047***     4.551***      0.097***       1.484***  
##                       (4.100)      (0.019)        (0.001)       (0.087)   
##                                                                           
## --------------------------------------------------------------------------
## Observations           1,363        1,363          1,363         1,363    
## R2                     0.560        0.520          0.488         0.582    
## Adjusted R2            0.559        0.519          0.488         0.582    
## Residual Std. Error    43.339       0.205          0.007         0.191    
## F Statistic         1,730.157*** 1,473.424***  1,299.279***   1,894.288***
## ==========================================================================
## Note:                                          *p<0.1; **p<0.05; ***p<0.01

A continuación las funciones y gráficos empleados para construir la tabla mostrada previamente donde se especifican supuestos de linealidad por modelo y si este cumple o no estos.

Modelo 1: Lin - Lin

par(mfrow=c(1,2))

# Normalidad
shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.96486, p-value < 2.2e-16
plot(modelo1, which=2)

# Varianza Constante
lmtest::bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 292.99, df = 1, p-value < 2.2e-16
# No autocorrelación errores
lmtest::dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.443, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# linealidad
plot(modelo1, which=3)

scatterplot(df$preciom ~ df$areaconst, data=df,
   xlab="Area", ylab="precio",
   main="Area vs Precio", smooth=FALSE)

Modelo 2: Log - Lin

par(mfrow=c(1,2))
# Normalidad
shapiro.test(modelo2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo2$residuals
## W = 0.99051, p-value = 1.035e-07
plot(modelo2, which=2)

# Varianza Constante
lmtest::bptest(modelo2)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo2
## BP = 150.38, df = 1, p-value < 2.2e-16
# No autocorrelación errores
lmtest::dwtest(modelo2)
## 
##  Durbin-Watson test
## 
## data:  modelo2
## DW = 1.3187, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# linealidad
plot(modelo2, which=3)

scatterplot(log(df$preciom) ~ df$areaconst, data=df,
   xlab="Area", ylab="log(precio)",
   main="Area vs Precio", smooth=FALSE)

Modelo 3: 1/√y - Lin

par(mfrow=c(1,2))
# Normalidad
shapiro.test(modelo3$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo3$residuals
## W = 0.98459, p-value = 7.294e-11
plot(modelo3, which=2)

# Varianza Constante
lmtest::bptest(modelo3)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo3
## BP = 79.641, df = 1, p-value < 2.2e-16
# No autocorrelación errores
lmtest::dwtest(modelo3)
## 
##  Durbin-Watson test
## 
## data:  modelo3
## DW = 1.2926, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# linealidad
plot(modelo3, which=3)

Modelo 4: Log - Log

par(mfrow=c(1,2))
# Normalidad
shapiro.test(modelo4$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo4$residuals
## W = 0.98958, p-value = 2.857e-08
plot(modelo4, which=2)

# Varianza Constante
lmtest::bptest(modelo4)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo4
## BP = 92.877, df = 1, p-value < 2.2e-16
plot(modelo4, which=1)

# No autocorrelación errores
lmtest::dwtest(modelo4)
## 
##  Durbin-Watson test
## 
## data:  modelo4
## DW = 1.3214, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# linealidad
plot(modelo4, which=3)
scatterplot(log(df$preciom) ~ log(df$areaconst), data=df,
   xlab="log(Area)", ylab="log(precio)",
   main="log(Area) vs log(Precio)", smooth=FALSE)

11. Conclusiones

Posterior a la revisión de la información suministrada de apartamentos estrato 4, se encuentra que un modelo lineal a pesar de que gráficamente aparenta ser una buena opción y presentar R² que explica entre un 50-60% de la información ninguno de los 4 casos evaluados cumplio los supuestos de linealidad, descartando esta opción para la evaluación del precio en función del área.

Ninguno de los 4 modelos evaludos, de los cuales 3 fueron transformaciones, cumplieron los supuestos de linealidad, por lo cual se recomienda buscar un ajuste con otro tipo de modelos y confirmar los supuestos requeridos antes de emplear estos modelos lineales para evaluar el precio de las viviendas.

Sin embargo si se plantea emplear el mejor modelo ajustado a pesar de este no cumplimiento, su ajuste se puede observar en el gráfico a continuación, representando en el eje X el logaritmo del área y en el eje Y el logaritmo del precio, la linea en el medio corresponde al ajuste encontrado con un R2 de 0.582. Donde este modelo tiene la siguiente formula: log(preciom) = 1.48373 + 0.88175Log(Areaconst). En el cual se evaluo al precio como variable dependiente y el área como variable independiente.

Para hacer prueba de este se evaluo el precio promedio estimado para un apartamento de 110 metros cuadrados, y se pueden observar en la tabla junto al cumplimiento de los supuestos de linealidad. En este se observa que el estimado oscila entre 264 y 278 Millones para una vivienda del área definida. cabe resaltar que el modelo 4 el de mejor R² presenta el estimado más alto pre-decido por lo cual al no cumplir los supuestos de linealidad como se menciono anteriormente puede sobrestimar o subestimar el precio y acarrear una toma de decisiones equivoca.

Modelo (y - x) R² Estimado 110m² Normalidad Homoscedasticidad Linealidad No Autocorrelación
Lin - Lin 0.56 277.2 NO NO NO NO
Log -Lin 0.52 268.0 NO NO NO NO
1/√y - Lin 0.488 264.2 NO NO NO NO
Log - Log 0.582 278.2 NO NO NO NO

A continuación el código empleado para obtener los valores de estimados para cada modelo y el scatterplot previamente mecionado del modelo 4 donde se encontró el R².

## Prediccion modelo 2
exp(predict(modelo2, precioarea110, interval = 'confidence', level = 0.95))
##        fit      lwr      upr
## 1 268.0277 262.7409 273.4209
## Prediccion modelo 3
1/(predict(modelo3, precioarea110, interval = 'confidence', level = 0.95))^2
##        fit     lwr      upr
## 1 264.1658 270.504 258.0479
## Prediccion modelo 4
exp(predict(modelo4, precioarea110, interval = 'confidence', level = 0.95))
##        fit      lwr     upr
## 1 278.2166 272.9017 283.635
scatterplot(log(df$preciom) ~ log(df$areaconst), data=df,
   xlab="log(Area)", ylab="log(precio)",
   main="log(Area) vs log(Precio)", smooth=FALSE)