Introducción
En el presente trabajo se pretende construir un modelo predictivo que permita predecir el valor de un apartamento de estrato 4 en la ciudad de cali a partir del área construida de los mismos. Se realizará la verificación de los supuestos y se contrastará el modelo con otros 4 modelos que son producto de transformaciones, para finalmente escoger el mejor de ellos.
Metodología
Para llegar a los resultados se construyó un modelo de regresión lineal y se realizaron transformaciones al mismo para conocer si hay algún modelo con mejores resultados que pueda reemplazarlo.
Resumen de Resultados
El modelo de regresión lineal confirma la correlación teórica existente entre el área construida y el precio de un inmueble.
Ninguno de las transformaciones realizadas arrojaron un modelo con mejores resultados y ajustes del modelo original.
Sugerencias a modo de Conclusiones
Los resultados encontrados no se pueden generalizar para otros estratos o tipos de vivienda, pues son exclusivos para los apartamentos de estrato 4 de la ciudad de Cali. Se requerirían modelos propios para cada (sub)conjunto de datos para poder hacer predicciones de precio para viviendas con otras características.
Para un estudio más detallado y que pueda hacer mejores predicciones, se sugiere segmentar los datos por zona, tipo de inmueble y por estrato, y construir modelos propios para cada subconjunto de datos. Esto hará que se tengan en cuenta esas características en las predicciones y que las mismas sean mas acordes a la realidad.
Se presenta a continuación todo el proceso de análisis y de construcción del modelo que se llevó a cabo para la Inmobiliaria A&C.
El mercado de Bienes Raíces ha crecido significativamente en los últimos años en la ciudad de Cali. Para el año 2022 las ventas de inmuebles alcanzaron los $6.700 millones de pesos y para el año 2023 las ventas fueron de $6.100 millones. La inmobiliaria A&C quiere construir un modelo predictivo que les permita conocer el precio estimado de un inmueble dada el valor del área construida.
A continuación se muestra el proceso que se llevo a cabo para crear, evaluar y escoger un modelo predictivo con buenas características que sirviera para los propósitos de la Inmobiliaria.
Construir un modelo que permita predecir los precios de los inmuebles a negociar, basado en el conjunto de datos de los inmuebles con menos de 200 metros cuadrados construidos.
Realizaré un análisis inicial al conjunto de datos para detectar registros vacíos, valores atípicos y datos que deban eliminarse. Posteriormente se realizará un análisis descriptivo y estadístico de los datos definiendo las variables de interés. Finalmente se construirá y evaluará un modelo que permita predecir el valor de una casa a partir de sus variables independientes.
Se preparan las librerías a utilizar, se cargan los datos y se visualiza la cabecera del conjunto de datos vivienda4 que tiene los inmuebles de menos de 200 metros cuadrados para el estrato 4.
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 8 288 60 6 1344
Podemos observar que el conjunto está bien acotado y tiene las siguientes variables: - Zona/zona: Zona en donde se ubica la casa (Norte, Sur, Centro, Oeste, Oriente) - Estrato/estrato: Para este conjunto todos los inmuebles pertenecen al estrato 4 - Precio/preciom: Precio del inmueble - Área Construida/areaconst: Área construida en metros cuadrados - Tipo de Inmueble/tipo: Casa o Apartamento
Antes de ver como se distribuyen los valores de las variables, veamos si hay valores nulos en ellas:
knitr::opts_chunk$set(echo = TRUE, fig.width = 4, fig.height = 4)
missing_data <- colSums(is.na(df)) %>%
as.data.frame()
missing_dataSe puede notar que no hay valores nulos en ningún registro. Ahora veamos la distribución de las variables Zona y Tipo de Inmueble:
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 8 288 60 6 1344
## Apartamento Casa
## 1363 343
Hay una amplia mayoría de inmuebles en la zona Sur. En cuanto al tipo de inmueble, la mayoría son Apartamentos. NOTA: Según las indicaciones del profesor, se realizarán todos los puntos con un subconjunto de datos que corresponda solamente a los apartamentos.
Por ser un subconjunto de datos ya filtrado, se puede notar que no existen registros vacíos ni columnas con datos faltantes, tal como se detectó en la sección anterior. Esta es una situación bastante atípica en el proceso de desarrollar un modelo. Se realizará el filtrado para que queden solo los apartamentos.
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.
A continuación, se muestra la “estadística descriptiva” para la variable que muestra el valor del inmueble en millones de pesos. Contiene \(1.363\) registros de apartamentos.
## Descriptive Statistics
## df$preciom
## N: 1363
##
## preciom
## ----------------- ---------
## Mean 237.68
## Std.Dev 13.29
## Min 207.41
## Q1 228.79
## Median 236.14
## Q3 243.59
## Max 305.19
## MAD 10.98
## IQR 14.79
## CV 0.06
## Skewness 1.28
## SE.Skewness 0.07
## Kurtosis 3.19
## N.Valid 1363.00
## Pct.Valid 100.00
Veamos gráficamente la distribución con un diagrama de cajas y bigotes y un histograma para la variable preciom:
knitr::opts_chunk$set(echo = TRUE, fig.width = 4, fig.height = 4)
# Generate boxplot
fillcolor = "lightgreen"
linecolor = "#08C671"
ggplot(df, aes_string(x = df$preciom)) +
geom_boxplot(fill = fillcolor,
outlier.size = 1,
outlier.shape = 24) +
labs(title = "Diagrama de Cajas y Bigotes para Precio de Inmueble",
x = "Precio (millones de pesos)", y = "Distribucion") +
scale_x_continuous(breaks = seq(200, 320, by = 10)) + # Marks every 10 millions
theme_tufte()Se puede observar que por encima de 265 millones de pesos (aproximadamente), los precios de los apartamentos se convierten en valores atípicos, y que el \(50\%\) central se encuentra distribuido alrededor de un poco menos de \(230\) y un poco más de \(240\) millones de pesos. No muestra valores atípicos en los valores bajos.
knitr::opts_chunk$set(echo = TRUE, fig.width = 4, fig.height = 4)
ts = 0.8 #text size
fillcolor = "lightgreen"
linecolor = "#08C671"
# Gráfico de histograma
par(cex = ts) # Ajustar tamaño de texto dentro del gráfico
hist(df$preciom,
main = "Histograma para apartamentos de menos de 200 m2",
ylab = "Frecuencia",
xlab = "Precio (en millones de pesos)",
col = fillcolor,
border = linecolor)La mayor cantidad de precios de casas se encuentran aproximadamente entre \(230\) y \(240\) millones de pesos, seguidos por los rangos aproximados de \(220-230\) y \(240-250\) millones de pesos respectivamente.
Por último, veamos el gráfico de densidad de distribución de los precios.
# Generar el histograma de densidad
ggplot(df, aes(x = preciom)) +
geom_density(fill = "lightgreen") +
labs(title = "Densidad de precios", x = "Precio", y = "Densidad") +
geom_vline(xintercept = mean(df$preciom), color = "darkgreen", linetype = 4)A continuación, se muestra la “estadística descriptiva” para la variable que muestra el Área Construida de los apartamentos que contiene \(1.363\) registros.
## Descriptive Statistics
## df$areaconst
## N: 1363
##
## areaconst
## ----------------- -----------
## Mean 75.48
## Std.Dev 22.56
## Min 40.00
## Q1 60.00
## Median 70.00
## Q3 84.00
## Max 200.00
## MAD 14.83
## IQR 24.00
## CV 0.30
## Skewness 2.08
## SE.Skewness 0.07
## Kurtosis 6.32
## N.Valid 1363.00
## Pct.Valid 100.00
# Generate boxplot
fillcolor = "lightgreen"
linecolor = "#08C671"
ggplot(df, aes_string(x = df$areaconst)) +
geom_boxplot(fill = fillcolor,
outlier.size = 1,
outlier.shape = 24) +
labs(title = "Diagrama de Cajas y Bigotes para Area de Inmueble",
x = "Metros cuadrados construidos", y = "Distribucion") +
scale_x_continuous(breaks = seq(min(df$areaconst), max(df$areaconst), by = 10)) + # Marks every 10 millions
theme_tufte()Se puede observar que al acercarse a los \(120\) metros cuadrados construidos, los áreas de los inmuebles se convierten en valores atípicos, es decir, poco comunes, y que el \(50\%\) central se encuentra distribuido alrededor de \(60\) y \(84\) metros cuadrados (Q3).
ts = 0.8 #text size
fillcolor = "lightgreen"
linecolor = "#08C671"
# Gráfico de histograma
par(cex = ts) # Ajustar tamaño de texto dentro del gráfico
hist(df$areaconst,
main = "Histograma para Apartamentos de menos de 200 m2",
ylab = "Frecuencia",
xlab = "Metros cuadrados construidos",
col = fillcolor,
border = linecolor)La mayor cantidad de áreas de apartamentos se encuentra entre \(50\) y \(60\) metros cuadrados, seguidos por los rangos aproximados de \(70-80\) y \(60-70\) metros cuadrados. Se ve que hay una cierta cantidad de valores hacia la derecha del histograma desde los \(130\) hasta \(200\) metros construidos.
Ahora veamos el gráfico de densidad de distribución de las áreas construidas.
# Generar el histograma de densidad
ggplot(df, aes(x = areaconst)) +
geom_density(fill = "lightgreen") +
labs(title = "Densidad de precios", x = "Área construida", y = "Densidad") +
geom_vline(xintercept = mean(df$areaconst), color = "darkgreen", linetype = 4)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.
Veamos la relación entre las variables preciom y areaconst. Se espera que entre más área construida, el precio sea más alto. Un comportamiento diferente a este, si bien puede ser posible en la práctica, es poco probable y altera la homogeneidad de los datos. Para este estudio, si son pocos estos valores atípicos, se eliminarán.
Se representarán gráficamente las distancias de Mahalanobis, que es una medida de la distancia entre un punto y una distribución multivariante. Es una medida útil para detectar valores atípicos en un conjunto de datos multidimensional cuando las variables estan correlacionadas. La distancia es una medida de la distancia en unidades de desviaciones estándar, por lo tanto, un valor alto de la distancia indica que el punto esta lejos de la distribución multivariante. Típicamente, los puntos con una distancia mayor a 3 se consideran atípicos. La distancia Mahalanobis no se afecta por la escala de las variables y es sensible a la correlación entre las variables.
numeric_columns <- names(df)[sapply(df, is.numeric)]
exclude_columns <- c() #Se usaran las dos únicas variables numéricas del conjunto
numeric_columns <- setdiff(numeric_columns, exclude_columns)
cov_matrix <- cov(df[, numeric_columns])
atipicos <- mahalanobis(df[, numeric_columns], center = TRUE, cov = cov_matrix)
ggplot(df, aes_string(x = 'preciom', y = 'areaconst', color = "atipicos")) +
geom_point(size = 2, alpha = 0.5) +
scale_color_brewer(palette = "Spectral") +
scale_color_continuous(low = "lightgreen", high = "darkgreen") +
labs(title = "Relacion entre precio y Area construida\n segun distancia de Mahalanobis",
x = "Precio del metro cuadrado", y = "Area construida en metros cuadrados",
color = "Distancia de Mahalanobis") +
scale_x_continuous(limits = c(min(df$preciom), max(df$preciom) + 10)) +
scale_y_continuous(limits = c(min(df$areaconst), max(df$areaconst) + 10)) ## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
Podemos ver que a medida que el área aumenta, también aumenta el precio del inmueble, es decir, hay una relación lineal positiva entre preciom y areaconst. Si validamos numéricamente lo que se ve en el gráfico anterior, podemos corroborarlo con la función cor. Veamos:
## [1] 0.8463271
Esta función nos entrega un valor de \(0.84\), el cual se acerca a 1. Probemos con el test de correlación de Pearson:
##
## Pearson's product-moment correlation
##
## data: df$preciom and df$areaconst
## t = 58.616, df = 1361, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8305531 0.8607445
## sample estimates:
## cor
## 0.8463271
Este resultado también sugiere una correlación muy fuerte entre el precio y el área construida de los apartamentos. La hipótesis alternativa es que la correlación verdadera entre las variables no es igual a cero. El resultado del valor p es muy bajito, pues está en el orden de 10 a la menos 16, es decir, prácticamente cero, esto nos permite respaldar la hipótesis alternativa, confirmando que la correlación entre las variables es muy fuerte (muy cercana a cero). El intervalo de confianza es del \(95\%\), es decir, el valor verdadero de la correlación se encuentra en el rango \(0.83\) y \(0.86\). Todo lo anterior nos confirma que a medida que aumenta el área construida de los apartamentos, también aumenta el precio de ellos.
knitr::opts_chunk$set(echo = TRUE, fig.width = 5, fig.height = 5)
plot(df$preciom, df$areaconst,
xlab = expression("Precio en millones de pesos "),
ylab = "Area construida en metros cuadrados (m"^"2"~")",
main = "Grafico de Dispersion",
col = "lightgreen",
pch = 20,
cex = 0.8)Por último, realizaré un gráfico combinado con las correlaciones entre las dos variables en donde se puede corroborar lo encontrado anteriormente.
knitr::opts_chunk$set(echo = TRUE, fig.width = 8, fig.height = 8)
# Crear matriz de correlaciones con ggpairs
ggpairs(df[,4:3],
mapping = aes(fill = "red"),
title = "Matriz de Correlaciones entre precio y área construida",
upper = list(geom = "point", size = 2, color = "red"),
lower = list(cor = TRUE, p.cex = 0.6, sig.level = 0.05),
diag = list(histogram = "density", bins = 15))Estime el modelo de regresión lineal simple entre \(precio = f(area)+ \epsilon\). Interprete los coeficientes del modelo \(\beta_0\), \(\beta_1\) en caso de ser correcto.
Como existe una correlación positiva entre las dos variables, es posible construir un modelo de regresión lineal que describa la relación existente entre dichas variables. La regresión lineal se expresa a través de una ecuación de una recta con un valor de coeficientes para el intercepto en el eje y \(\beta_0\) y la pendiente de la recta \(\beta_1\).
##
## Call:
## lm(formula = preciom ~ areaconst, data = df)
##
## 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) 200.063455 0.669847 298.67 <0.0000000000000002 ***
## areaconst 0.498416 0.008503 58.62 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022
La variable independiente es el área construida y la dependiente es
el precio. El modelo estima la relación con la siguiente ecuación: \(preciom = \beta_0 + \beta_1 * areaconst +
\epsilon\). \(\beta_0\) es el
intercepto en el eje \(y\) que tiene un
valor de \(200\). Esto indicaría un
valor de \(200\) millones de pesos
cuando el área construida es cero, lo que realmente no es posible, pero
sirve como una referencia matemática para los cálculos de áreas
positivas. \(\beta_1\) es la pendiente
de la recta cuyo valor es \(0.498\).
Esto indica que para cada unidad en que aumenta el área construida, el
precio resultado de la predicción aumentaría en \(0.498\) unidades. Por ejemplo, si la
pendiente fuera uno, por cada metro cuadrado mas de área construida, el
precio aumentaría un millón de pesos.
El valor de \(p\) para \(\beta_0\) y \(\beta_1\) es altamente significativo (valor
menor del orden de \(2e-16\)), es
decir, que su correlación no se debe al azar. Según el resultado de
Multiple R-squared o el indicador de bondad \(R^2\) del modelo explica el \(71.63%\) de la varianza del precio, pero
bien podría haber otros factores que influyen en el precio que no son
capturados por el modelo. Esto tiene sentido, pues se sabe que inmuebles
de igual área construida en sectores diferentes tienen valores
diferentes, también tiene influencia el tipo de acabados, el material de
construcción, entre otros factores. Para tener esas variables en
cuenta
Construir un intervalo de confianza (95%) para el coeficiente \(\beta_1\), interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipótesis t
Pare esto, usaremos la función confint.
## 2.5 % 97.5 %
## (Intercept) 198.7494103 201.377500
## areaconst 0.4817357 0.515097
Según este resultado, se puede decir que con intervalo de confianza del \(95\%\) el intercepto tiene un valor entre \(\$198.74\) millones y \(\$201.37\) millones cuando el valor de la variable independiente es cero. Como ya se explicó, esto no es real en la práctica pues un apartamento con área construida de cero simplemente no existiría. También, con una confianza del \(95\%\) se puede decir que el efecto de la unidad de aumento en el área construida se encuentra entre \(0.48\) y \(0.51\) para el precio.
Calcule e interprete el indicador de bondad \(R^2\).
El indicador o coeficiente de bondad \(R^2\) mide la proporción de la varianza total de los datos que es explicada por el modelo. Un valor de \(R^2\) cercano a 1 indica que el modelo explica una gran parte de la varianza de los datos, mientras que un valor cercano a 0 indica que el modelo explica poca varianza. Para calcularlo usaremos
cat("El indicador o coeficiente de bondad del modelo de regresion lineal es de:", summary(reg_model)$r.squared)## El indicador o coeficiente de bondad del modelo de regresion lineal es de: 0.7162696
Este resultado de \(0.7162\) del indicador \(R^2\) indica que el \(71.62\%\) de la varianza del precio de los apartamentos es explicada por el modelo. Si bien es más cercano a 1 que a 0, no me parece significativamente cercano a 1, lo que me hace pensar que hay otras variables que influyen en el precio ademas del área construida.
¿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?.
Para hacer esta estimación, basta con reemplazar los valores encontrados en la ecuación:
\(Y = \beta_0 + \beta_1 * X\), donde
\(Y\) es el precio,
\(X\) es el área construida, es decir \(110m^2\)
\(\beta_0 = 200.06\) y
\(\beta_1 = 0.498\)
Entonces tenemos:
\(precio = 200.06 + 0.498*110\)
\(precio = 200.06 + 54.78\)
\(precio = 254.84\)
Lo que indica que el modelo arroja un precio de \(254.84\) millones de pesos para un apartamento de 110 \(M^2\), luego la oferta de \(200\) millones por parte de la inmobiliaria para un apartamento en el mismo sector sería muy atractiva según lo arrojado por el modelo pues estaría muy por debajo del valor de los apartamentos en la zona. Según lo anterior, la inmobiliaria tendría un margen de \(54\) millones de pesos para subir el valor del apartamento, es decir, aún pidiendo \(225\) millones o hasta \(240\) millones de pesos por el apartamento estaría en buenas condiciones para ser una oferta atractiva para el comprador por estar por debajo de lo esperado en la zona.
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.
Supuesto de Normalidad: Los errores siguen una distribución normal \((\epsilon_i ∼ N(0,\sigma^2))\).
Para validar estos supuestos se utilizarán las pruebas Shapiro-Wilk y Anderson-Darling.
La prueba de Shapiro-Wilk se usa para evaluar si los residuos del modelo siguen una distribución normal. Los residuos son la diferencia entre los valores observados de la variable dependiente (en este caso preciom) y los valores predichos por el modelo.
##
## Shapiro-Wilk normality test
##
## data: reg_model$residuals
## W = 0.99885, p-value = 0.5419
El resultado muestra un estadístico W: 0.99885 que se acerca a \(1\), lo que indica que la distribución se puede tomar como una distribución normal. Si fuera cercano a \(0\) sería lo contrario.
El valor p representa la probabilidad de obtener un estadístico W igual de extremo que el observado, suponiendo que la hipótesis nula, es decir la normalidad, sea cierta. Generalmente, un valor p menor que el nivel de significancia de \(0.05\) indicaría que debe rechazarse la hipótesis nula, es decir, que los datos no siguen una distribución normal. Para este caso, el valor p es mayor que \(0.05\) lo que no permite rechazar la hipótesis nula de normalidad.
##
## Anderson-Darling normality test
##
## data: reg_model$residuals
## A = 0.42398, p-value = 0.318
El resultado muestra un estadístico A: 0.42398 que se acerca a \(0\), lo que indica que la distribución se puede tomar como una distribución normal. Si fuera cercano a \(1\) sería lo contrario.
El valor p en este caso es \(0.318\) también es mayor a \(0.05\) lo que tampoco permite rechazar a hipótesis nula.
_Supuesto de Homoscedasticidad: La varianza alrededor de la linea de regresión, para cualquier valor constante \((V_([\epsilon]) = \sigma^2)\).
Se utilizará la prueba Breusch-Pagan estandarizada o prueba BP se utiliza para evaluar la heterocedasticidad en los residuos de un modelo de regresión lineal. La heterocedasticidad se refiere a la varianza no constante de los residuos, es decir, que la dispersión de los errores no es uniforme en todos los niveles de la variable independiente, en este caso la área construida.
##
## studentized Breusch-Pagan test
##
## data: reg_model
## BP = 0.83288, df = 1, p-value = 0.3614
La prueba arroja los siguientes resultados: Estadistico BP \(= 0.83288\) el cual es un valor alejado de cero, lo que indica una posible heterocedasticidad.
El valor p, al igual que en las pruebas anteriores, representa la posibilidad de obtener un estadistico BP tan extremo o mas extremo que el observado. Este valor es mayor a \(0.05\) lo que no permite rechazar la hipótesis nula de homocedasticidad.
Supuesto de No Autocorrelación: Los errores que corresponden a diferentes individuos o diferentes tiempo deben ser independientes unos de otros \((Cov[\epsilon_i,\epsilon_j] = 0)\).
\(H_0:E[\epsilon_i,epsilon_j] = 0\)
\(H_a:E[epsilon_i,epsilon_j] ≠ 0\)
Se utilizará la prueba de Durbin-Watson (DW) para detectar la presencia de autocorrelación en los residuos del modelo de regresión lineal.
##
## Durbin-Watson test
##
## data: reg_model
## DW = 2.0204, p-value = 0.6435
## alternative hypothesis: true autocorrelation is greater than 0
El Estadístico DW varia entre \(0\) y \(4\). En este caso dio como resultado \(2.0204\) lo cual sugiere, por ser cercano a 2, que los residuos tienden a estar correlacionados negativamente entre si, es decir, que no hay autocorrelación entre ellos. (Los valores menores que \(2\) indican autocorrelación positiva, y valores superiores a 2, autocorrelación negativa, lo cual es menos común)
Se obtiene un valor p de \(0.6435\) que es mayor al nivel de significancia \(0.05\) no hay evidencia suficiente para rechazar la hipótesis nula de No Autocorrelación.
Aunque este no es un supuesto formal, se espera que los datos no contengan datos atípicos que generen sesgos en los estimadores de los coeficientes.
Tal como se vio en los gráficos del conjunto de datos, las variables preciom y areaconst si tienen datos atípicos representados por los triángulos en los gráficos correspondientes. Veamos el gráfico de cajas y bigotes para los residuos del modelo.
knitr::opts_chunk$set(echo = TRUE, fig.width = 4, fig.height = 4)
boxplot(reg_model$residuals,
main = "Outliers - Residuos del Modelo",
ylab = "Residuos",
col = "lightgreen",
border = "darkgreen"
)knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
par(mfrow = c(2,2))
plot(reg_model,
col = "lightgreen",
pch = 20,
lwd = 1,
cex = 1)
# Línea de identidad
abline(a = 0,
b = 1,
col = "green",
lty = 1)Los gráficos de dispersión nos muestran correlación entre las dos variables usando los residuos y los residuos estandarizados, soportando los análisis previamente descritos.
A continuación se realizan los puntos 8 al 10 en donde se realizarán transformaciones para ver si se mejorar el ajuste y los supuestos del modelo, se compararán los resultados de estas transformaciones con el modelo inicial.
Aunque el modelo inicial cumple los supuestos y se demostró que existe una correlación entre las variables estudiadas, luego no sería estrictamente necesario hacer transformaciones para mejorar el ajuste y los supuestos del modelo, se realizarán algunas transformaciones para ser comparadas con el modelo inicial.
Punto 8: De ser necesario realice una transformación apropiada para mejorar el ajuste y supuestos del modelo.
Punto 9: De ser necesario compare el ajuste y supuestos del modelo inicial y el transformado.
Punto 10: Estime varios modelos y compare los resultados obtenidos. En el mejor de los modelos, ¿se cumplen los supuestos sobre los errores?
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
model1 = lm(df$preciom ~ df$areaconst, data = data.frame(df)) # Lin - Lin
summary(model1)##
## Call:
## lm(formula = df$preciom ~ df$areaconst, data = data.frame(df))
##
## 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) 200.063455 0.669847 298.67 <0.0000000000000002 ***
## df$areaconst 0.498416 0.008503 58.62 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022
##
## Shapiro-Wilk normality test
##
## data: model1$residuals
## W = 0.99885, p-value = 0.5419
##
## Anderson-Darling normality test
##
## data: model1$residuals
## A = 0.42398, p-value = 0.318
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model1
## LM test = 0.15038, df = 1, p-value = 0.6982
##
## Durbin-Watson test
##
## data: model1
## DW = 2.0204, p-value = 0.6435
## alternative hypothesis: true autocorrelation is greater than 0
La transformación Box-Cox se utiliza para corregir la no linealidad en la relación entre variables (lo que no seria necesario en este caso), estabilizar la varianza, normalizar la distribución de los residuos y mejorar la interpretabilidad de los resultados.
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
bc <- boxcox(df$preciom ~ df$areaconst, lambda = -1:1)## El valor Lambda (λ) es: 1
El valor de \(\lambda\) es \(1\), lo que indica que el modelo no necesita transformación.
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
model2 = lm(preciom ~ log(areaconst), data = df) # Lin - Log
summary(model2)##
## Call:
## lm(formula = preciom ~ log(areaconst), data = df)
##
## 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 <0.0000000000000002 ***
## log(areaconst) 42.8778 0.7936 54.03 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022
##
## Shapiro-Wilk normality test
##
## data: model2$residuals
## W = 0.9971, p-value = 0.01302
##
## Anderson-Darling normality test
##
## data: model2$residuals
## A = 1.1581, p-value = 0.005009
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model2
## LM test = 0.93995, df = 1, p-value = 0.3323
##
## Durbin-Watson test
##
## data: model2
## DW = 1.9464, p-value = 0.1587
## alternative hypothesis: true autocorrelation is greater than 0
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
model3 = lm(log(preciom) ~ areaconst, data = df) # Log - Lin
summary(model3)##
## Call:
## lm(formula = log(preciom) ~ areaconst, data = df)
##
## 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.31797842 0.00283459 1876.11 <0.0000000000000002 ***
## areaconst 0.00200666 0.00003598 55.77 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022
##
## Shapiro-Wilk normality test
##
## data: model3$residuals
## W = 0.99907, p-value = 0.7333
##
## Anderson-Darling normality test
##
## data: model3$residuals
## A = 0.33717, p-value = 0.5044
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model3
## LM test = 0.17106, df = 1, p-value = 0.6792
##
## Durbin-Watson test
##
## data: model3
## DW = 2.0219, p-value = 0.6534
## alternative hypothesis: true autocorrelation is greater than 0
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
model4 = lm(log(preciom) ~ log(areaconst), data = df) # Log- Log
summary(model4)##
## Call:
## lm(formula = log(preciom) ~ log(areaconst), data = df)
##
## 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 <0.0000000000000002 ***
## log(areaconst) 0.174148 0.003283 53.05 <0.0000000000000002 ***
## ---
## 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: < 0.00000000000000022
##
## Shapiro-Wilk normality test
##
## data: model4$residuals
## W = 0.9985, p-value = 0.2868
##
## Anderson-Darling normality test
##
## data: model4$residuals
## A = 0.58718, p-value = 0.1259
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model4
## LM test = 0.42812, df = 1, p-value = 0.5129
##
## Durbin-Watson test
##
## data: model4
## DW = 1.9635, p-value = 0.2469
## alternative hypothesis: true autocorrelation is greater than 0
knitr::opts_chunk$set(echo = TRUE, fig.width = 6, fig.height = 6)
model5 = lm(preciom ~ sqrt(areaconst), data = df) # Lin - Sqrt(x)
summary(model5)##
## Call:
## lm(formula = preciom ~ sqrt(areaconst), data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25.1087 -5.2451 -0.0772 4.7355 23.6388
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 156.3863 1.4349 108.99 <0.0000000000000002 ***
## sqrt(areaconst) 9.4454 0.1652 57.19 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.206 on 1361 degrees of freedom
## Multiple R-squared: 0.7061, Adjusted R-squared: 0.7059
## F-statistic: 3271 on 1 and 1361 DF, p-value: < 0.00000000000000022
##
## Shapiro-Wilk normality test
##
## data: model5$residuals
## W = 0.99832, p-value = 0.1983
##
## Anderson-Darling normality test
##
## data: model5$residuals
## A = 0.70556, p-value = 0.06539
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: model5
## LM test = 0.034307, df = 1, p-value = 0.8531
##
## Durbin-Watson test
##
## data: model5
## DW = 1.9891, p-value = 0.4163
## alternative hypothesis: true autocorrelation is greater than 0
Para analizar los modelos se puede utilizar el valor de \(R^2\) buscando el valor más alto, ya que este indica la proporción de varianza de la variable dependiente que es explicada por el modelo. También se puede mirar el Error Residual estándar (Residual Std. Error) más bajo, pues este valor representa la variabilidad promedio de los errores de predicción del modelo.
##
## ====================================================================================
## Dependent variable:
## ----------------------------------------------------------------
## preciom preciom log(preciom) preciom
## (1) (2) (3) (4) (5)
## ------------------------------------------------------------------------------------
## areaconst 0.498***
## (0.009)
##
## log(areaconst) 42.878*** 0.174***
## (0.794) (0.003)
##
## areaconst 0.002***
## (0.00004)
##
## sqrt(areaconst) 9.445***
## (0.165)
##
## Constant 200.063*** 53.820*** 5.318*** 4.723*** 156.386***
## (0.670) (3.409) (0.003) (0.014) (1.435)
##
## ------------------------------------------------------------------------------------
## Observations 1,363 1,363 1,363 1,363 1,363
## R2 0.716 0.682 0.696 0.674 0.706
## Adjusted R2 0.716 0.682 0.695 0.674 0.706
## Residual Std. Error 7.081 7.496 0.030 0.031 7.206
## F Statistic 3,435.808*** 2,919.088*** 3,110.029*** 2,814.311*** 3,270.505***
## ====================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Para los modelos comparados en la tabla, podemos ver que el modelo 1, es decir, el Lin-Lin tiene \(R^2\) es el más alto (\(0.716\)), lo que nos dice que es el que mejor explica la variabilidad de la variable dependiente preciom. El siguiente \(R^2\) es el del modelo 5 Lin-\(sqrt(areaconst)\) con un valor de \(0.706\)
En cuanto a los errores estándar residuales, los modelos 3 y 4 son los que tiene este valor más bajo, con \(0.030\) y \(0.031\) respectivamente. Esto indica que para ellos hay un mejor ajuste de los datos.
Si bien ningún modelo mejor el \(R^2\), los modelos 3 y 4 si parecen tener una mejora en cuando al ajuste de los datos.
Ahora bien, si hacemos la estimación para el apartamento con 110\(m^2\), podremos saber cuál es el modelo que ofrece un mejor resultado. Recordemos que para el modelo inicial el resultado fue de \(254.84\)
Veamos el resultado para el modelo 5 [Lin-\(\sqrt{areaconst}\)] que tiene un intercepto de \(156.38\) y una pendiente de \(9.445\).
\(precio = 156.38 + 9.45 * \sqrt(110)\)
\(precio = 156.38 + 9.45 * 10.49\)
\(precio = 156.38 + 99.06\)
\(precio = 255.44\) (en millones de pesos)
Para el modelo 3 [Log-Lin] que tiene un intercepto de \(5.318\) y una pendiente de \(0.002\).
\(\log(precio) = 5.318 + 0.002 * 110\)
\(\log(precio) = 5.318 + 0.22\)
\(\log(precio) = 5.538\)
\(precio = e^{5.538}\)
\(precio = 254,36\) (en millones de pesos)
Todos los valores obtenidos son muy parecidos entre si y no marcan una diferencia significativamente positiva con el resultado del modelo inicial.
Sobre el conjunto de datos: Nos encontramos con un conjunto de datos limpio, que contenía registros sobre casas y apartamentos del estrato 4 en la ciudad de Cali. La mayoría de registros eran sobre los apartamentos en una relación casi 4 a 1. Se eliminaron los registros de las casas para la realización del ejercicio y el análisis estuvo concentrado específicamente en las variables de preciom (Precio de la vivienda en millones de pesos), como variable dependiente, y areaconst (Área construida) como variable independiente.
Sobre las variables de estudio: El tamaño promedio de los apartamentos es de \(75.48m^2\) y el valor promedio es \(\$237.68\) millones de pesos colombianos. Esta relación arroja un promedio de valor por \(m^2\) de un poco más de \(\$3\) millones de pesos.
Sobre la correlación de las variables: De acuerdo al resultado del análisis de correlación realizado por medio de una regresión lineal con la ecuación \(y = \beta_0 + \beta_1(x)\), donde \(\beta_0\) es el intercepto de los ejes, y \(\beta_1\) es la pendiente de la recta, es decir, el grado de afectación de una unidad de la variable independiente en la variable dependiente. Se estableció, gracias al modelo de regresión lineal y del análisis realizado, que si existe correlación entre las variables estudiadas. En la práctica, se puede decir que cuando aumenta el área construida, también aumenta el precio del inmueble.
Sobre el modelo original: El modelo de regresión lineal aplicado a los datos del conjunto fue revisado frente a los supuestos que se deben cumplir, y todos fueron comprobados y verificados.
Sobre los modelos transformados: Con el objetivo de buscar si había otros modelos que mejoraran el rendimiento del modelo de regresión lineal se hicieron varias transformaciones. La comparación entre los 5 modelos, el inicial y las 4 transformaciones, arrojó que ninguno de los modelos producto de las transformaciones supera al modelo inicial, si tenemos en cuenta,por un lado, el valor de \(R^2\) para los modelos, pues todos los de las transformaciones son menores al del modelo original, y por otro lado, si miramos el Error Residual Estandar, el del modelo original es el más bajo de todos. Por lo anterior se puede deducir que, dados los datos existentes, el modelo de regresión lineal original es el mejor de todos los modelos estudiados.
Sobre la generalización o extrapolación del modelo: El modelo fue aplicado a los datos de los apartamentos en la ciudad de Cali, y tal como se dijo en los puntos anteriores, no fue tenida en cuenta la variable de zona, que es una variable que puede influir en el valor de los apartamentos. Nota: Las variables tipo y estrato sirvieron como filtro del conjunto de datos, estudiando solo los apartamentos del estrato 4.
Sobre trabajos futuros: Existe la posibilidad de aplicar un modelo de regresión lineal a un subconjunto de datos, lo que ofrecería mejores predicciones para ese subconjunto de datos, por ejemplo, teniendo en cuenta la zona y el estrato dentro de la misma ciudad.
Todo este documento y código esta disponible aquí
Basado 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 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 ha 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) + epsilon\). Interprete los coeficientes del modelo beta0, beta1 en caso de ser correcto.
Construir un intervalo de confianza (95%) para el coeficiente beta1, 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 \(R^2\).
¿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.
Descripción
Esta data contiene información sobre caracteristicas de viviendas de la ciudad de Cali.
¿Cómo se usa?: Solo hay que escribir “data(vivienda4)” sin las comillas.
Registros: Conjunto con 1706 registros y 5 variables
Variables/Columnas
zona: Zona de la ciudad (Una de cinco: Norte, Sur, Oriente, Oeste y Centro)
estrato: Estrato donde esta la vivienda
preciom: Precio en millones de pesos
areaconst: Área construida en metros cuadrados
tipo: Tipo de vivienda