Caso de trabajo

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.

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

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.

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.

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

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.

Calcule e interprete el indicador de bondad R2 .

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

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.

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

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

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

Con los resultados obtenidos construya un informe para los directivos de la inmobiliaria, indicando el modelo apropiado y sus principales características. A este informe se deben añadir los anexos como evidencia de la realización de los pasos anteriores.

Informe

Analisis exploratorio

Se da inicio utilizando una base de datos de 1.706 registros con 5 variables; estas son: zona, estrato, precio, área de construcción y tipo. Para iniciar el análisis exploratorio, es necesario filtrar la información mediante la variable tipo para obtener únicamente los registros de apartamentos según las indicaciones del caso.

Al extraer únicamente la información de los apartamentos, se tiene que hay 1.363 registros de apartamentos en estrato 4 con área de construcción menor o igual a 200 m².

Precio de los apartamentos

Datos = vivienda4
aptos = Datos[Datos$tipo == "Apartamento", ]

limites <- seq(min(aptos$preciom), max(aptos$preciom), length.out = 10+1)
limites_formateados <- format(limites, nsmall = 0)
etiquetas_intervalos <- paste0(limites_formateados[-length(limites_formateados)], " - ", limites_formateados[-1])
intervalos <- cut(aptos$preciom, breaks = limites, include.lowest = TRUE, labels = etiquetas_intervalos)
tabla_frecuencias <- table(intervalos)

ggplot(data.frame(Intervalo = etiquetas_intervalos, Frecuencia = as.numeric(tabla_frecuencias)), aes(x = Intervalo, y = Frecuencia)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  labs(title = "Histograma del precio de la vivienda",
       x = "Precio",
       y = "Frecuencia") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot(aptos$preciom, 
        main = "Boxplot variable precio",
        ylab = "Precio por ",
        col = c("skyblue"))

Media = mean(aptos$preciom)
Mediana = median(aptos$preciom)
Varianza = var(aptos$preciom)
Desviacion = sd(aptos$preciom)
Minimo = min(aptos$preciom)
Maximo = max(aptos$preciom)

resumen_preciom = data.frame(Media = Media, Mediana = Mediana, Varianza = Varianza, Desviación = Desviacion, Minimo = Minimo, Maximo = Maximo)


kable(resumen_preciom)
Media Mediana Varianza Desviación Minimo Maximo
237.6831 236.1382 176.589 13.28868 207.4063 305.19

Al analizar la información referente al precio de los apartamentos, se tiene que la media o el valor promedio es de 237 millones. Se observa que la diferencia entre el valor medio y el valor mínimo es de alrededor de 30 millones, mientras que la diferencia entre la media y el valor máximo es de casi $70 millones, lo cual refleja cómo el precio de los apartamentos tiende a presentar datos atípicos en valores más altos. Esto también se respalda con el gráfico de boxplot, donde se presenta una concentración de datos en los valores cercanos a los $270 millones.

Adicionalmente, nos encontramos con que la mediana y la media comparten valores similares, reflejando la ausencia de sesgo. Esto se observa al analizar que la diferencia entre la media y la mediana es inferior a la desviación calculada.

Area construida de los apartamentos

limites <- seq(min(aptos$areaconst), max(aptos$areaconst), length.out = 10+1)
limites_formateados <- format(limites, nsmall = 0)
etiquetas_intervalos <- paste0(limites_formateados[-length(limites_formateados)], " - ", limites_formateados[-1])
intervalos <- cut(aptos$areaconst, breaks = limites, include.lowest = TRUE, labels = etiquetas_intervalos)
tabla_frecuencias <- table(intervalos)

ggplot(data.frame(Intervalo = etiquetas_intervalos, Frecuencia = as.numeric(tabla_frecuencias)), aes(x = Intervalo, y = Frecuencia)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  labs(title = "Histograma del area contruida en metros cuadrados",
       x = "Area construida en metros cuadrados",
       y = "Frecuencia") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

boxplot(aptos$areaconst, 
        main = "Boxplot variable area construida",
        ylab = "Precio por ",
        col = c("skyblue"))

Media = mean(aptos$areaconst)
Mediana = median(aptos$areaconst)
Varianza = var(aptos$areaconst)
Desviacion = sd(aptos$areaconst)
Minimo = min(aptos$areaconst)
Maximo = max(aptos$areaconst)

resumen_areaconst = data.frame(Media = Media, Mediana = Mediana, Varianza = Varianza, Desviación = Desviacion, Minimo = Minimo, Maximo = Maximo)


kable(resumen_areaconst)
Media Mediana Varianza Desviación Minimo Maximo
75.47836 70 509.1616 22.56461 40 200

Al analizar la información referente al área construida en metros cuadrados, se tiene que la media o el valor promedio es de 75 metros cuadrados. Se observa que la diferencia entre el valor medio y el valor mínimo es de alrededor de 35 metros cuadrados, mientras que la diferencia entre la media y el valor máximo es de alrededor de 125 metros cuadrados. Este comportamiento es similar al de la variable de precio, en tanto que los datos atípicos presentan una concentración en los valores más altos. Sin embargo, el área construida presenta una concentración relativa en valores más bajos, implicando que existe un rango en el que los precios de los apartamentos varían más que el tamaño de construcción.

Analisis exploratorio bivariado

Diagrama de puntos, ver si aplica pearson, correlación no parametrica, resumen por cada variable

plot(aptos$areaconst, aptos$preciom, main='Precio del apartamento segun el area construida', xlab='Area constrida m2', ylab='Precio en millones', col='skyblue')

Al analizar el diagrama de puntos generado al usar las variables de precio como variable dependiente y la variable de área construida como variable independiente, se observa lo que podría identificarse como una relación lineal positiva. Esto se considera debido a que visualmente se aprecia un crecimiento constante en la variable precio a medida que aumentan los valores en la variable área.

Para determinar estadísticamente si existe la relación planteada anteriormente, se procederá a realizar dos coeficientes de correlación: el de Pearson y el de Spearman. La razón de usar dos coeficientes es que el de Pearson es el coeficiente básico, y el de Spearman se usa para variables no normales, como es en este caso el comportamiento de las variables trabajadas, teniendo en cuenta los resultados del análisis exploratorio del punto previo.

pearson <- cor(aptos$areaconst, aptos$preciom, method = "pearson")

print(pearson)
## [1] 0.8463271
spearman <- cor(aptos$areaconst, aptos$preciom, method = "spearman")

print(spearman)
## [1] 0.7408906

El coeficiente de correlación entre la variable del areacontruida y el precio de los apartamentos indica que existe una alta asociación entre el area de construcción de la vivienda y su precio en el mercado en ambos casos se presento un resultado positivo, sin embargo en coeficiente de peason fue de 0.84 mientras que el de spearman fue de 0.74 eso indica una relación lineal positivia fuerte para el caso de Pearson y debil para el caso de Spearman. La razon para incluir el coeficiente de Spearman es que en este caso no contamos con una variable con comportamiento normal por lo que este podria ser mas adecuado para el analisi actual.

Modelo de regresion lineal simple

Al realizar la estimación del modelo de regresión lineal simple, se obtienen los resultados presentados en la siguiente tabla:

mrls = lm(preciom ~ areaconst, data=aptos)
resultado_mrls = summary(mrls)
print(resultado_mrls)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = aptos)
## 
## 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 ***
## 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

Al obtener los estimadores del modelo, se tiene que β₀ es igual a 200 y β₁ es igual a 0.49. Que β₀ tenga un valor no necesariamente tiene que tener una interpretación en la vida real, esto teniendo en cuenta las características del problema planteado, pues que el intercepto sea 0 quiere decir que el valor de un apartamento con 0 metros de construcción será de 200 millones. En cuanto a β₁, la interpretación es que por cada metro cuadrado que aumente un apartamento, su precio incrementará en 0.49 millones.

Intervalo de confianza y prueba de hipotesis t

confint(mrls, level = 0.95)
##                   2.5 %     97.5 %
## (Intercept) 198.7494103 201.377500
## areaconst     0.4817357   0.515097

Al obtener el intervalo de confianza del estimador para la variable de área construida, se tiene que al no contener el valor 0 dentro del intervalo de confianza es posible afirmar que el coeficiente es estadísticamente significativo. Además, el impacto sobre el precio de un apartamento ante el incremento de un metro cuadrado puede variar entre $0.48 y $0.51 millones. Dado que el intervalo de confianza es del 95%, se espera que este intervalo sea acertado en un 95% de las ocasiones.

Las pruebas de hipótesis t del modelo tienen como H₀ que los coeficientes de β₀ y β₁ son iguales a cero. Dado que el valor p para los dos estimadores resulta menor a 0.05, es posible afirmar que se rechaza la hipótesis nula, lo que indica que existe un intercepto para determinar el valor de los apartamentos y que el tamaño construido sí tiene un efecto sobre el precio.

Indicador de bondad R2

R2_mrls = resultado_mrls$r.squared

El indicador de bondad R² muestra cuánto de la variable dependiente se explica por el modelo realizado. En este caso, se tiene que el R² es igual a 0.71, lo cual significa que el modelo que contiene el tamaño construido puede explicar el 71% de los cambios en los precios de los apartamentos. Teniendo en cuenta que este modelo cuenta únicamente con una variable, se puede afirmar que cuenta con una buena capacidad de explicación.

Caso apartamento de 110 metros cuadrados

apto_110 = data.frame(areaconst= 110)

p_110m = predict(mrls, apto_110, interval = "confidence", level = 0.95)
print(1-(200/277))
## [1] 0.2779783

Utilizando los resultados obtenidos mediante el modelo de regresión, se tiene que se espera que un apartamento con un área construida de 110 m² cueste 277 millones. Teniendo en cuenta lo anterior, un apartamento de 110 m² por un precio de 200 millones resulta bastante atractivo, siendo un valor que es un 27% más económico que el estimado del mercado.

Validación de supuestos

Teniendo en cuenta el ejercicio realizado previamente, se destaca la utilidad de contar con un modelo que permita estimar el precio de los apartamentos y cómo este se ve afectado por las variables de los mismos. No obstante, resulta necesario validar los supuestos del modelo para determinar si está construido de manera adecuada y si la información presentada es adecuada.

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

Shapiro_test = shapiro.test(residuals(mrls))
B_P = bptest(mrls)
D_W = dwtest(mrls)

Respecto a la linealidad, se observa que el primer gráfico muestra un comportamiento ligeramente sistemático, al no tener un comportamiento completamente aleatorio por parte de los residuos.

Para analizar la normalidad del modelo, se procede con el análisis gráfico en el que la segunda gráfica presenta un comportamiento que visualmente podría indicar normalidad; no obstante, esto se comprobará con el análisis de la prueba Shapiro, la cual tiene como hipótesis nula que los datos (en este caso, los residuos) no cuentan con una distribución normal. En este caso, el valor obtenido fue de 0.54, con lo que, manejando un nivel de confianza del 95%, no se rechaza la hipótesis nula, por lo cual se puede decir que hay una distribución normal.

print(Shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mrls)
## W = 0.99885, p-value = 0.5419

Respecto a la homocedasticidad, se validará mediante el uso de la prueba Breusch-Pagan, en la cual se tiene como hipótesis nula que la varianza de los errores es constante. En este caso, se obtuvo un valor p de 0.36, por lo que no es posible afirmar que hay heterocedasticidad. Esto resulta válido para los resultados, en tanto que no se viola el supuesto de homocedasticidad.

print(B_P)
## 
##  studentized Breusch-Pagan test
## 
## data:  mrls
## BP = 0.83288, df = 1, p-value = 0.3614

Por último, para validar la autocorrelación de los datos se usa la prueba Durbin-Watson, en la que se obtuvo un valor p de 0.64. Con este resultado, no es posible afirmar la existencia de autocorrelación.

print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls
## DW = 2.0204, p-value = 0.6435
## alternative hypothesis: true autocorrelation is greater than 0

Transformación de la variable

Dado que el modelo planteado inicialmente no cumplio con el supuesto de linealidad se realizará una transformación sobre las variables para determinar si esto puede resultar beneficioso para el caso de analisis.En este caso se transformara la variable dependeinte con un logaritmo.

mrls_log = lm(log(preciom) ~ areaconst, data=aptos)
resultado_mrls_log = summary(mrls_log)
print(resultado_mrls_log)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst, data = aptos)
## 
## 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 ***
## 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

Comparación de los supuestos

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

Shapiro_test = shapiro.test(residuals(mrls_log))
B_P = bptest(mrls_log)
D_W = dwtest(mrls_log)

Al realizar el análisis gráfico, se tiene que no hubo un cambio significativo. En cuanto a la linealidad, se mantiene el resultado en que el primer gráfico muestra un comportamiento ligeramente sistemático.

Gráficamente, la normalidad se mantiene. Al validar mediante el análisis de la prueba Shapiro, se obtuvo un valor de 0.73, con lo que, manejando un nivel de confianza del 95%, no se rechaza la hipótesis nula, por lo cual se puede decir que hay una distribución normal.

print(Shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mrls_log)
## W = 0.99907, p-value = 0.7333

Respecto a la homocedasticidad, se obtuvo un valor p de 0.0081, lo que permite rechazar la hipótesis nula, implicando la existencia de heterocedasticidad.

print(B_P)
## 
##  studentized Breusch-Pagan test
## 
## data:  mrls_log
## BP = 7.0095, df = 1, p-value = 0.008108

Por último, respecto a la autocorrelación de los datos, se obtuvo un valor p de 0.65, por lo que no es posible afirmar la existencia de autocorrelación.

print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls_log
## DW = 2.0219, p-value = 0.6534
## alternative hypothesis: true autocorrelation is greater than 0

Comparación de resultados de los diferentes modelos

Por ultimo se procederá con la elaboración de varios modelos y se compararan los resultados para determinar cual es el modelo con una mayo eficacia y que a su vez mejor cumple los supuestos necesarios para un buen modelo.

mrls1 = lm(log(preciom) ~ areaconst, data=aptos)
resultado_mrls1 = summary(mrls1)
print(resultado_mrls1)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst, data = aptos)
## 
## 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 ***
## 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(mrls1)

Shapiro_test = shapiro.test(residuals(mrls1))
B_P = bptest(mrls1)
D_W = dwtest(mrls1)

print(Shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mrls1)
## W = 0.99907, p-value = 0.7333
print(B_P)
## 
##  studentized Breusch-Pagan test
## 
## data:  mrls1
## BP = 7.0095, df = 1, p-value = 0.008108
print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls1
## DW = 2.0219, p-value = 0.6534
## alternative hypothesis: true autocorrelation is greater than 0
mrls2 = lm(preciom ~ log(areaconst), data=aptos)
resultado_mrls2 = summary(mrls2)
print(resultado_mrls2)
## 
## Call:
## lm(formula = preciom ~ log(areaconst), data = aptos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -22.9725  -5.4109  -0.1832   4.9141  24.1899 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     53.8202     3.4091   15.79   <2e-16 ***
## log(areaconst)  42.8778     0.7936   54.03   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.496 on 1361 degrees of freedom
## Multiple R-squared:  0.682,  Adjusted R-squared:  0.6818 
## F-statistic:  2919 on 1 and 1361 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mrls2)

Shapiro_test = shapiro.test(residuals(mrls2))
B_P = bptest(mrls2)
D_W = dwtest(mrls2)

print(Shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mrls2)
## W = 0.9971, p-value = 0.01302
print(B_P)
## 
##  studentized Breusch-Pagan test
## 
## data:  mrls2
## BP = 14.481, df = 1, p-value = 0.0001416
print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls2
## DW = 1.9464, p-value = 0.1587
## alternative hypothesis: true autocorrelation is greater than 0
mrls3 = lm(log(preciom) ~ log(areaconst), data=aptos)
resultado_mrls3 = summary(mrls3)
print(resultado_mrls3)
## 
## Call:
## lm(formula = log(preciom) ~ log(areaconst), data = aptos)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.104277 -0.022240  0.000027  0.020782  0.093359 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    4.722680   0.014102  334.91   <2e-16 ***
## log(areaconst) 0.174148   0.003283   53.05   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03101 on 1361 degrees of freedom
## Multiple R-squared:  0.674,  Adjusted R-squared:  0.6738 
## F-statistic:  2814 on 1 and 1361 DF,  p-value: < 2.2e-16
par(mfrow=c(3,3))
plot(mrls3)

Shapiro_test = shapiro.test(residuals(mrls3))
B_P = bptest(mrls3)
D_W = dwtest(mrls3)

print(Shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mrls3)
## W = 0.9985, p-value = 0.2868
print(B_P)
## 
##  studentized Breusch-Pagan test
## 
## data:  mrls3
## BP = 0.11855, df = 1, p-value = 0.7306
print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls3
## DW = 1.9635, p-value = 0.2469
## alternative hypothesis: true autocorrelation is greater than 0
print(D_W)
## 
##  Durbin-Watson test
## 
## data:  mrls3
## DW = 1.9635, p-value = 0.2469
## alternative hypothesis: true autocorrelation is greater than 0

El resultado obtenido de la comparación de modelos es que, en primer lugar, el R² del mejor modelo es el que no contó con ninguna transformación, siendo de 0.71, mientras que el R² más bajo lo tuvo el modelo con la transformación log-log.

Respecto a los supuestos, se tiene que ningún modelo cumplió con el supuesto de linealidad, siendo el modelo lin-lin el que tuvo un mejor comportamiento. El supuesto de normalidad se cumplió de manera adecuada en todos los modelos. El supuesto de homocedasticidad no se cumplió para los modelos log-lin y lin-log y, por último, el supuesto de no autocorrelación se cumplió para todos los modelos.

Conclusión

Después de analizar los datos para los apartamentos del sector 4, se determinó que la variable de área construida resulta ser adecuada para la elaboración de un modelo que busque explicar los factores que afectan los precios de los apartamentos. En este caso, el mejor modelo obtuvo un R² de 0.71, lo que es un valor alto considerando que es un modelo simple con una sola variable. No obstante, es necesario continuar con la investigación y la mejora del modelo, teniendo en cuenta que ningún modelo cumplió con todos los supuestos necesarios para contar con un modelo fiable.