Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz (datos_vivienda.xls - descarga) realizar los siguientes puntos:
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, indicadores apropiados e interpretarlos.
summary(datos$area_construida)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 80.0 86.0 97.0 115.7 130.0 195.0
desviacion_estandar_area=sd(datos$area_construida)
desviacion_estandar_area
## [1] 35.54332
hist(datos$area_construida, col="#EEAEEE", main="Histograma", xlab="Área de vivienda (m2)", ylab="Cantidad de viviendas")
abline(v=97,col="#CD1076",lwd=3)
caja=boxplot(datos$area_construida, horizontal = TRUE, col="#FFC0CB", xlab="Área de vivienda (m2)", ylab="Cantidad de viviendas")
title("Diagrama de Cajas")
stripchart(datos$area_construida, method = "jitter", pch = 19, add = TRUE, col = "#FF3E96")
abline(v=97,col="#00CDCD",lwd=3)
La información generada por los datos de medida de tendencia central son: Media, con un valor de 116m2 (promedio de todos los valores) y mediana corresponde a 97m2 (valor central). La dispersión de los datos se mide por la desviación estandar que, con respecto a cero, tiene un valor de 36. En el Histograma se puede evidenciar que, 14 viviendas se encuentran entre 80 y 100 m2, 2 entre 100 y 120 m2, 5 entre 120 y 140m2, 0 en el rango de 140 y 160m2, 3 entre 160 y 180m2 y finalmente 2 entre 180 y 200 m2. En el Diagrama de caja se revisa la mediana (Q2) que es representada por la línea azul aguamarina, el tamaño de la caja me indica que hay mayor variabilidad, su ubicación dentro del cerco inferior y superior me indica asimetría en los datos, donde los puntos muestra su mayor concentración en el lado izquierdo.
t.test(datos$precio_millon)
##
## One Sample t-test
##
## data: datos$precio_millon
## t = 20.613, df = 25, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 298.8982 365.2557
## sample estimates:
## mean of x
## 332.0769
mediana_precio=median(datos$precio_millon)
mediana_precio
## [1] 305
desviacion_estandar_precio=sd(datos$precio_millon)
desviacion_estandar_precio
## [1] 82.14423
summary(datos$precio_millon)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 240.0 251.2 305.0 332.1 395.0 480.0
hist(datos$precio_millon, col="#EEAEEE", main="Histograma", xlab="Precio de las viviendas (millones)", ylab="Cantidad de viviendas")
abline(v=305,col="#CD1076",lwd=3)
caja=boxplot(datos$precio_millon, horizontal = TRUE, col="#FFDEAD", xlab="Precio de las viviendas (millones)")
title("Diagrama de Cajas")
stripchart(datos$precio_millon, method = "jitter", pch = 19, add = TRUE, col = "#EE4000")
abline(v=305,col="#1874CD",lwd=3)
La información generada por los datos de medida de tendencia central son: Media, con un valor de 332m2 (promedio de todos los valores) y mediana corresponde a 305m2 (valor central). La dispersión de los datos se mide por la desviación estandar que, con respecto a cero, tiene un valor de 82. En el Histograma se puede evidenciar que, 7 viviendas se encuentran en el precio de 200 y 250 millones, 6 entre 250 y 300 millones, 1 entre 300 y 350 millones, 6 entre 350 y 400 millones, 5 entre 400 y 450 millones y finalmente 1 entre 450 y 500. En el Diagrama de caja se revisa la mediana (Q2) que es representada por la línea azul, el tamaño de la caja me indica que hay mayor variabilidad, su ubicación dentro del cerco inferior y superior me indica asimetría en los datos, donde los puntos muestra su mayor concentración en el lado izquierdo y lado derecho.
2. Realice un análisis exploratorio bivariado de datos enfocado en la relación entre la variable respuesta (y=precio) en función de la variable predictora (x=area). Incluir gráficos, indicadores apropiados e interpretarlos.
ggplot(data=datos, mapping=aes(x=area_construida,y=precio_millon))+geom_point(colour="#FF1493")+geom_smooth(colour="black", method = "lm")+theme_classic()+xlab("Área de vivienda (m2)")+ylab("Precio de vivienda (millones) ")+ggtitle("Diagrama de Puntos")
## `geom_smooth()` using formula 'y ~ x'
cor(datos$area_construida, datos$precio_millon, method = 'kendall')
## [1] 0.7934597
cor(datos$area_construida, datos$precio_millon, method = 'pearson')
## [1] 0.9190295
cor(datos$area_construida, datos$precio_millon, method = 'spearman')
## [1] 0.9173882
En la gráfica se puede evidenciar una relación directamente proporcional entre el metro cuadrado y precio, ya que, a más metraje mayor es su valor. Por otra parte, los tres coeficientes de correlación existentes que se miden entre -1 y 1 podemo encontrara que, kendall nos da un valor de 0.79, pearson 0.92 y spearman 0.92, lo que nos indica una fuerte relación lineal entre el precio y metro cuadrado ofrecidos de las viviendas.
3. Estime el modelo de regresión lineal simple entre precio = f(area)+e. Interprete los coeficientes del modelo \(\beta 0\);\(\beta 1\) en caso de ser correcto.
model=lm(formula=precio_millon~area_construida,data=datos)
summary(model)
##
## Call:
## lm(formula = precio_millon ~ area_construida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.673 -25.612 -6.085 24.875 67.650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 86.234 22.479 3.836 0.000796 ***
## area_construida 2.124 0.186 11.422 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared: 0.8446, Adjusted R-squared: 0.8381
## F-statistic: 130.5 on 1 and 24 DF, p-value: 3.45e-11
model$coefficients
## (Intercept) area_construida
## 86.23387 2.12397
El modelo de regresión simple para este caso se mostraría así:
Y= \(\beta 0\) + \(\beta 1\) X
Precio = 86.234 + 2.124 (Área)
Cuando el área es 0, es decir, no hay vivienda (porque ésta la derribaron por su pésimo estado de deterioro o se hizo el negocio sólo sobre lote, etcétera) sino sólo lote, el valor de éste es de $86.234.000. Matemáticamente se demostraría así:
Precio = 86.234 + 2.124 (0)
Precio = 86.234 + 0
Precio = 86.234
Por último, hay que tener en cuenta que, por cada metro cuadrado adicional, el precio de la vivienda aumenta en $2.124.000, podríamos deducir entonces que éste es el valor del metro cuadrado. Matemáticamente sería así:
Precio = 86.234 + 2.124 (1)
Precio = 86.234 + 2.124
Precio = 88.358
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 hipotesis t.
confint(object=model, level=0.95)
## 2.5 % 97.5 %
## (Intercept) 39.83983 132.627917
## area_construida 1.74017 2.507771
summary(model)
##
## Call:
## lm(formula = precio_millon ~ area_construida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.673 -25.612 -6.085 24.875 67.650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 86.234 22.479 3.836 0.000796 ***
## area_construida 2.124 0.186 11.422 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.05 on 24 degrees of freedom
## Multiple R-squared: 0.8446, Adjusted R-squared: 0.8381
## F-statistic: 130.5 on 1 and 24 DF, p-value: 3.45e-11
Se puede evidenciar que, el coeficiente 1 (\(\beta 1\)), no tiene un valor cero cuando se tiene un intérvalo de confianza del 95%, pues oscila entre 1.74 y 2.50. Recordar que éste representa la pendiente de la recta y se relaciona directamente con el área de las viviendas. Por otro lado, la hipótesis t, es decir, el p-valor, representa un 0.000796, por su valor bajo se rechaza la hipótesis de que el coeficiente 1 sea cero.
5. Calcule e interprete el indicador de bondad y ajuste R2.
coe=cor(datos$area_construida, datos$precio_millon)
cor=coe^2
cor
## [1] 0.8446152
El indicador de bondad y ajuste R2 muestra la influencia de la variable X en la variable Y. Dado lo anterior, se puede deducir que, el precio de la vivienda depende en un 84.46% del área de la misma.
6. ¿Cuál seria el precio promedio estimado para un apartamento de 110 metros cuadrados? Considera entonces con este resultado que un apartemento en la misma zona con 110 metros cuadrados en un precio de 200 millones seria una buena oferta?, ¿Qué consideraciones adicionales se deben tener?
(predict(model, list(area_construida=110)))
## 1
## 319.8706
Para validar el resultado anterior, se puede realizar matemáticamente así:
Y= \(\beta 0\) + \(\beta 1\) X
Precio = 86.234 + 2.124 (Área)
Precio = 86.234 + 2.124 (110)
Precio = 86.234 + 233.640
Precio = 319.870
El precio de un apartamento de 110m2 sería de $319.870.000; sin embargo, un inmueble con el mismo metraje en la misma zona por valor de 200 millones habría qué revisarlo. No necesariamente es una buena oferta. Si bien miramos en el punto anterior, el área de la vivienda sólo influye en un porcentaje sobre el precio, hay que verificar las otras variables que pueden complementar y determinar el valor de la vivienda, como lo es: en qué estado se encuentra la propiedad (tiene deterioro o no), ¿es propiedad horizontal o es unidad residencial? y ¿qué zonas verdes tiene?, precio de administración o portería (si la tiene), parqueaderos (privado - ¿cuántos tiene?, asignado o comunitarios), estado de la via, piso (es decir, la altura en que se encuentra en la torre o el edificio), ¿tiene vista? (si o no), estado jurídico del apartamento, ¿tiene remodelación? (si o no), vetustez del inmueble (es decir, la edad), distribución del apartamento (no. habitaciones, baños, patio - si o no, sala de estár - si o no, balcón - si o no), ¿está hipotecada? (si o no), ¿cómo es el tema de seguirdad?, etcétera; y, sobre todo, cuales son los motivos por el cuál el propietario quiere vender.
7. Realice la validación de supuestos del modelo por medio de gráficos apropiados, interpretarlos y sugerir posibles soluciones si se violan algunos de ellos.
plot(model, col="#00CD00", pch=16, which=1, main="Gráfico de Residuales vs Valores ajustados")
La gráfica normalmente debe mostrar aleatoriedad, ya que éstos no deben mostar ningún comportamiento; sin embargo, para este caso de estudio, los residuos tienden a distribuirse a lo largo de la línea y=0, es decir, habría homocedasticidad. Por último, lo valores en los puntos indican que son atípicos.
plot(model, col="#00CD00", pch=16, which=2, main="Gráfico de Distribución Normal")
La gráfica normalmente debe mostrar que los residuos deben situarse a lo largo de la línea punteada; sin embargo, se logra observar una gran dispersión de los residuos de la línea, incluído puntos atípicos.
plot(model, col="#00CD00", pch=16, which=3, main="Gráfico de Escala - Ubicación")
Si la varianza es constante en esta gráfica, es decir, hay homocedasticidad, se debe observar una línea roja horizontal y los residuales deben estar distribuidos de manera constante a lo largo de ella. Claramente para este caso, se evidencia que no cumple con los patrones establecidos.
plot(model, col="#00CD00", pch=16, which=5, main="Gráfico de Residuales vs Valor de la Palanca")
Esta gráfica sirve para encontrar las observaciones influyentes (leverage); si no existen observaciones influyentes, no debe observarse una curva punteada roja, o en caso de verse, deben ubicarse ligeramente en las esquinas de la gráfica y, por último, no deben existir puntos en esa zona. Para este estudio si se observa linea punteada en la esquina con un dato atípico (no. 25), lo cuál indica que hay observarciones influyentes pero no es muy marcado, es sutíl.
8. De ser necesario, realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.
Para este punto se pueden hacer diferentes transformaciones:
Transformación Exponencial
model_exponencial=lm(log(precio_millon)~area_construida, data=datos)
summary(model_exponencial)
##
## Call:
## lm(formula = log(precio_millon) ~ area_construida, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.16503 -0.09255 -0.02221 0.08600 0.19822
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.048147 0.073371 68.80 < 2e-16 ***
## area_construida 0.006288 0.000607 10.36 2.46e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1079 on 24 degrees of freedom
## Multiple R-squared: 0.8172, Adjusted R-squared: 0.8096
## F-statistic: 107.3 on 1 and 24 DF, p-value: 2.456e-10
cor(datos$area_construida, log(datos$precio_millon))
## [1] 0.9040102
gvlma(model_exponencial)
##
## Call:
## lm(formula = log(precio_millon) ~ area_construida, data = datos)
##
## Coefficients:
## (Intercept) area_construida
## 5.048147 0.006288
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma(x = model_exponencial)
##
## Value p-value Decision
## Global Stat 18.63161 9.283e-04 Assumptions NOT satisfied!
## Skewness 0.26831 6.045e-01 Assumptions acceptable.
## Kurtosis 1.52281 2.172e-01 Assumptions acceptable.
## Link Function 16.82333 4.103e-05 Assumptions NOT satisfied!
## Heteroscedasticity 0.01715 8.958e-01 Assumptions acceptable.
par(mfrow=c(2,2))
plot(model_exponencial, col="#EE00EE", pch=16)
Transformación Logarítmica
model_logaritmica=lm(precio_millon~log(area_construida), data=datos)
summary(model_logaritmica)
##
## Call:
## lm(formula = precio_millon ~ log(area_construida), data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -45.837 -20.153 -1.878 20.145 55.145
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -948.53 89.09 -10.65 1.42e-10 ***
## log(area_construida) 271.88 18.88 14.40 2.63e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 27 on 24 degrees of freedom
## Multiple R-squared: 0.8963, Adjusted R-squared: 0.8919
## F-statistic: 207.4 on 1 and 24 DF, p-value: 2.63e-13
gvlma(model_logaritmica)
##
## Call:
## lm(formula = precio_millon ~ log(area_construida), data = datos)
##
## Coefficients:
## (Intercept) log(area_construida)
## -948.5 271.9
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma(x = model_logaritmica)
##
## Value p-value Decision
## Global Stat 1.077e+01 0.029316 Assumptions NOT satisfied!
## Skewness 1.538e-01 0.694903 Assumptions acceptable.
## Kurtosis 9.155e-01 0.338665 Assumptions acceptable.
## Link Function 9.697e+00 0.001846 Assumptions NOT satisfied!
## Heteroscedasticity 6.933e-04 0.978993 Assumptions acceptable.
par(mfrow=c(2,2))
plot(model_logaritmica, col="#0000EE", pch=16)
Transformación Doble Logarítmico
model_doble_logaritmico=lm(log(precio_millon)~log(area_construida), data=datos)
summary(model_doble_logaritmico)
##
## Call:
## lm(formula = log(precio_millon) ~ log(area_construida), data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.13325 -0.07583 -0.01435 0.07501 0.16051
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.96408 0.29228 6.72 5.97e-07 ***
## log(area_construida) 0.80928 0.06194 13.06 2.11e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08859 on 24 degrees of freedom
## Multiple R-squared: 0.8767, Adjusted R-squared: 0.8716
## F-statistic: 170.7 on 1 and 24 DF, p-value: 2.109e-12
gvlma(model_doble_logaritmico)
##
## Call:
## lm(formula = log(precio_millon) ~ log(area_construida), data = datos)
##
## Coefficients:
## (Intercept) log(area_construida)
## 1.9641 0.8093
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma(x = model_doble_logaritmico)
##
## Value p-value Decision
## Global Stat 14.06326 0.0070959 Assumptions NOT satisfied!
## Skewness 0.14883 0.6996589 Assumptions acceptable.
## Kurtosis 1.66690 0.1966747 Assumptions acceptable.
## Link Function 12.22172 0.0004724 Assumptions NOT satisfied!
## Heteroscedasticity 0.02582 0.8723435 Assumptions acceptable.
par(mfrow=c(2,2))
plot(model_doble_logaritmico, col="#EE00EE", pch=16)
Según lo expuesto, el modelo de regresión inicial no cumple con el supuesto de homocedasticidad, por ello, se eligió trabajar con estas tres transformaciones; sin embargo, el modelo que más se ajustó (cercano) fue el logarítmico ya que en las gráficas se puede observar el comportamiento de los residuos se amoldan a los patrones explicados anteriormente y el que más alto valor tiene de los R2.
9. De ser necesario, compare el ajuste y supuestos del modelo inicial y el transformado.
Al comparar el R2 del modelo inicial 0.8381, y el modelo elegido transformado logarítmico 0.8919, se evidencia un mayor ajuste en el modelo y explica la variabilidad del Precio (Y). A continuación se presenta los gráficos comparativos para visualizar el comportamiento de los residuos:
par(mfrow=c(2,2))
plot(model, col="#00CD00", pch=16, main="Gráfico Modelo Inicial")
par(mfrow=c(2,2))
plot(model_logaritmica, col="#0000EE", pch=16, main="Gráfico Modelo Transformado")