Realice un filtro a la base de datos e incluya solo las ofertas de:
base1: casas, de la zona norte de la ciudad.
Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
(Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).
# Define la ruta del archivo CSV
ruta <- "C:\\Users\\jmont\\OneDrive\\Escritorio\\3. ESTUDIOS\\Metodos Estadisticos para la toma de decisiones\\Unidad 2\\Desarrollo\\vivienda.csv"
# Lee el archivo CSV en un data frame, especificando la codificación UTF-8
datos_org <- read.csv(ruta, fileEncoding = "UTF-8")
# Elimina las filas con valores faltantes (NAs)
datos_org <- datos_org[complete.cases(datos_org), ]
# Se modifila la columna 'tipo' recodificando los valores en 'tipo' para que estén en formato 'Apartamento' o 'Casa'
datos_org <- datos_org %>%
mutate(tipo = recode(tipo, "APARTAMENTO" = "Apartamento",
"CASA" = "Casa",
"apto" = "Apartamento",
"casa" = "Casa"))
# Crea un nuevo data frame llamado 'base1' que contiene las filas donde 'tipo' es "Casa" y 'zona' es "Zona Norte"
base1 <- datos_org[datos_org$tipo == "Casa" & datos_org$zona == "Zona Norte",]
base1 <- base1[complete.cases(base1), ]
# Cuenta la cantidad de registros por tipo de vivienda en 'base1'
tabla <- base1 %>%
count(tipo)
print(tabla)
## tipo n
## 1 Casa 254
# Cuenta la cantidad de registros por zona en 'base1'
tabla <- base1 %>%
count(zona)
print(tabla)
## zona n
## 1 Zona Norte 254
# Muestra las primeras 3 filas de 'base1'
head(base1, n = 3)
## id zona piso estrato preciom areaconst parquea banios habitac tipo
## 417 6812 Zona Norte 7 4 670 470 4 5 5 Casa
## 563 6338 Zona Norte 3 4 540 306 3 4 4 Casa
## 565 6340 Zona Norte 2 4 530 400 4 3 3 Casa
## barrio longitud latitud
## 417 tejares de san -76545 3.44
## 563 la campiña -76542 3422.00
## 565 el bosque -76542 3411.00
# Limpia la columna 'latitud' eliminando los puntos y convirtiéndola a numérica
base1$latitud <- gsub("\\.", "", base1$latitud)
base1$latitud <- sapply(strsplit(base1$latitud, ""), function(x) paste0(x[1], ".", paste0(x[-1], collapse = "")))
base1$latitud <- as.numeric(base1$latitud)
# Define una función para agregar un separador decimal a la columna 'longitud'
base1$longitud <- gsub("\\.", "", base1$longitud)
agregarSeparadorDecimal <- function(x) {
x_str <- as.character(x)
x_str <- sub("(\\d{2})", "\\1.", x_str)
x_num <- as.numeric(x_str)
return(x_num)
}
# Aplica la función 'agregarSeparadorDecimal' para limpiar la columna 'longitud'
base1$longitud <- sapply(base1$longitud, agregarSeparadorDecimal)
# Crear el mapa
mapa <- leaflet(data = base1) %>%
addTiles() %>% # Agregar el fondo del mapa (tiles de OpenStreetMap)
addMarkers(lng = ~longitud, lat = ~latitud, popup = "Ubicación") %>%
fitBounds(~min(longitud), ~min(latitud), ~max(longitud), ~max(latitud))
# Mostrar el mapa
mapa
Una vez realizado el filtro de la base de datos, para casas en la zona norte se evidencia que las coordenadas latitud,longitud tienen errores en el separados decimal, el cual genera una cantidad considerable de registros atípicos en estas columnas. Una vez solucionado el inconveniente de las coordenadas se procede a especializar la información, donde es claro que existen registros mal clasificados como zona norte, ya que espacialmente según sus coordenadas se encuentran en zonas diferentes a esta.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
# Crear un nuevo dataset con solo las columnas deseadas
base2 <- base1[, c("preciom", "areaconst", "estrato", "banios", "habitac", "zona" )]
summary(base2)
## preciom areaconst estrato banios
## Min. : 89.0 Min. : 60.0 Min. :3.00 Min. :0.000
## 1st Qu.: 350.0 1st Qu.: 196.5 1st Qu.:4.00 1st Qu.:3.000
## Median : 450.0 Median : 275.5 Median :5.00 Median :4.000
## Mean : 499.6 Mean : 305.9 Mean :4.52 Mean :3.882
## 3rd Qu.: 600.0 3rd Qu.: 365.5 3rd Qu.:5.00 3rd Qu.:5.000
## Max. :1600.0 Max. :1440.0 Max. :6.00 Max. :9.000
## habitac zona
## Min. : 0.00 Length:254
## 1st Qu.: 4.00 Class :character
## Median : 4.00 Mode :character
## Mean : 4.87
## 3rd Qu.: 5.75
## Max. :10.00
#ggpairs(base2[,1:6], title=" ")
# Crear la matriz de dispersión
scatter_matrix <- ggpairs(base2, columns = c("preciom", "areaconst", "estrato", "banios", "habitac", "zona"))
# Mostrar la matriz de dispersión
print(scatter_matrix)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
###
Conclusión 2
Una vez realizado el filtro de la base de datos, para generar un gráfico interactivo que permita ver la correlación entre las variables mencionadas frente a precio del metro cuadrado, se puede observar que existe correlación positiva en todas las variables numéricas, es decir, que un aumento en cada uno de ellos genera un efecto de aumento en el precio. Esto se da especialmente para la variable área construida y estrato, lo cual indica que entre más área construida mayor será el precio, sin embargo las variables número de baños, número de habitaciones y el área construida presentan una correlación alta entre ellas, lo que puede implicar que se tiene información redundante para el precio del metro cuadrado.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
# Seleccionar las columnas de interés del dataframe 'datos_org' y guardarlas en 'base3'
base3 <- base1[, c("preciom", "areaconst", "estrato", "habitac", "parquea", "banios" )]
# Crear un modelo de regresión lineal (lm) para predecir 'preciom' en función de las variables predictoras
modelo1 <- lm(preciom ~ areaconst + estrato + habitac + parquea + banios, data = base3)
# Mostrar un resumen del modelo, que incluye estadísticas y coeficientes
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitac + parquea +
## banios, data = base3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -761.11 -84.10 -16.36 52.22 925.67
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -245.62878 60.86958 -4.035 7.27e-05 ***
## areaconst 0.66444 0.06703 9.913 < 2e-16 ***
## estrato 85.58184 13.17690 6.495 4.51e-10 ***
## habitac 8.91428 7.14129 1.248 0.213
## parquea 28.05949 6.77575 4.141 4.74e-05 ***
## banios 11.49860 9.51130 1.209 0.228
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 152.8 on 248 degrees of freedom
## Multiple R-squared: 0.5952, Adjusted R-squared: 0.587
## F-statistic: 72.92 on 5 and 248 DF, p-value: < 2.2e-16
# Mostrar los coeficientes estimados del modelo
modelo1$coefficients
## (Intercept) areaconst estrato habitac parquea banios
## -245.6287794 0.6644388 85.5818446 8.9142814 28.0594897 11.4985999
Al estimar el modelo de regresión lineal y obtener un resumen de dicho modelo, se puede evaluar estadísticamente cada coeficiente considerando el p-valor resultante para cada caso:
“El valor p de cada término evalúa la hipótesis nula de que el coeficiente es igual a cero (no hay efecto). Un valor p bajo (< 0,05) indica que se puede rechazar la hipótesis nula. En otras palabras, es probable que un predictor que tenga un valor p bajo sea una adición significativa al modelo porque los cambios en el valor del predictor se relacionan con cambios en la variable de respuesta.” tomado de: https://blog.minitab.com/es/como-interpretar-los-resultados-del-analisis-de-regresion-valores-p-y-coeficientes
Basado en lo anterior los coeficientes de número de baños y habitaciones no son significativos, es decir, no aportan considerablemente al modelo. Sin embargo, es necesario un análisis más detallado que se presenta a continuación:
beta_0 (Intercepto)
En este caso, establece el valor esperado de ‘preciom’ cuando todas las variables predictoras son cero, pero esta interpretación puede no ser significativa en la práctica. Lo anterior a que no es lógico que por ejemplo no se tenga área construida, baños, habitaciones, parqueadero y se pretenda obtener algún valor lógico del inmueble.
beta_1 (areaconst)
En este caso, el coeficiente indica que un existe un efecto de 0.66444 en el precio del metro cuadrado cuando aumenta una unidad el área construida. Lo que es lógico en el sentido de que al aumentar el área construida se espera un precio más alto, aunque el efecto de este coeficiente es pequeño frente a el efecto de los coeficientes de las otras variables, algo que no es muy lógico en la realidad.
beta_2 (estrato)
En este caso, el coeficiente se supone que indica que un existe un efecto de 85.58184 en el precio del metro cuadrado cuando aumenta una unidad el área construida. Lo que es lógico en el sentido de que al aumentar el estrato si se espera un precio más alto, pero en este caso puede existir un error importante en lo que refleja el coeficiente, puesto que, se habla de una variable categórica debe tener un análisis diferencial y está limitada en la cantidad de estratos, no podemos decir que por cada unidad que aumenta el estrato aumenta en 95.1010887 en el precio del metro cuadrado.
beta_3 (habitac)
En este caso, el coeficiente indica que un existe un efecto de 8.91428 en el precio del metro cuadrado cuando aumenta una unidad el número de habitaciones. Lo que es lógico en el sentido de que al aumentar el número de habitaciones se espera un precio más alto. Este coeficiente es acorde a la realidad y debe darse un tratamiento diferencial a esta variable, contemplando la posibilidad de datos atípicos o mal registrados que están afectando el modelo o que se esté presentando correlación con otra variable como área construida.
beta_4 (parquea)
En este caso, el coeficiente indica que un existe un efecto de 28.05949 en el precio del metro cuadrado cuando aumenta una unidad el número de parqueaderos. Lo que es lógico en el sentido de que al aumentar la disponibilidad de parqueaderos se espera un precio más alto.
beta_5 (banios)
En este caso, el coeficiente indica que un existe un efecto de 11.49860 en el precio del metro cuadrado cuando aumenta una unidad el número de baños. Lo que es lógico en el sentido de que al aumentar la cantidad de baños se espera un precio más alto, sin embargo aquí puede existir una correlación fuerte con el área construida que este afectando significativamente los coeficientes de las variables, área construida, numero de baños y número de habitaciones, ya que de cierta manera están relacionados.
# Calcular el R-cuadrado (R2)
r2 <- summary(modelo1)$r.squared
# Calcular el R-cuadrado ajustado (R2 ajustado)
r2_adj <- summary(modelo1)$adj.r.squared
# Calcular el AIC (Criterio de Información de Akaike)
aic <- AIC(modelo1)
# Calcular el BIC (Criterio de Información Bayesiano)
bic <- BIC(modelo1)
# Calcular la estadística F y su p-valor
f_statistic <- summary(modelo1)$fstatistic[1]
f_p_value <- summary(modelo1)$fstatistic[3]
# Calcular el RMSE (Error Cuadrático Medio)
residuals <- residuals(modelo1)
rmse <- sqrt(mean(residuals^2))
# Imprimir los resultados
cat("R2:", r2, "\n")
## R2: 0.5951689
cat("R2 ajustado:", r2_adj, "\n")
## R2 ajustado: 0.587007
cat("AIC:", aic, "\n")
## AIC: 3283.637
cat("BIC:", bic, "\n")
## BIC: 3308.398
cat("Estadística F:", f_statistic, "\n")
## Estadística F: 72.92024
cat("p-valor F:", f_p_value, "\n")
## p-valor F: 248
cat("RMSE:", rmse, "\n")
## RMSE: 151.0112
Al analizar los indicadores de ajustes del modelo como el R2, se muestra que el modelo se ajusta a los datos auque con un valor de R2 se podria decir que es un ajuste debil o no muy significativo, además, según lo estipulado en el análisis de los coeficientes se sugiere realizar ajustes desde las mismas variables para poder identificar posibles sesgos y correlaciones que puedan estar afectando los resultados de un futura estimación.
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
4.1 Linealidad y multicolinealidad:
Se asume que la relación entre las variables independientes y la variable dependiente es lineal. Esto significa que un cambio en una variable independiente causa un cambio proporcional en la variable dependiente. En otras palabras, los efectos de las variables independientes se suman de manera directa y constante
scatter_matrix <- ggpairs(base1, columns = c("preciom", "areaconst", "estrato", "habitac", "parquea", "banios"))
# Mostrar la matriz de dispersión
print(scatter_matrix)
Al
analizar la variable dependiente vs las variables independientes en la
primera fila del grafico anterior se puede evidenciar que existe
correlación significativa exceptuando la variable numero de
habitaciones, con una correlacion de 0.377. Lo anterior y la conclusion
3.1 dada respecto a la significacia de los coeficientes nos puede
indicar que no es clara la linealidad del modelo.
Por otro lado si se analiza a correlacion entre las variables independientes, se encuentra que parecen tener dependencia entre ellas en algunos casos por ejemplo, la correlacion entre el numero de baños, numero de habitaciones y el area construida es de 0.44 y 0.42 respectivamente lo que puede afectar significativamente el modelo y sus predicciones.
4.2 Homocedasticidad y normalidad:
La homocedasticidad se refiere a la constancia de la varianza de los errores en un modelo estadístico.
par(mfrow = c(2, 2))
plot(modelo1)
shapiro.test(modelo1$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.87822, p-value = 2.263e-13
bptest(modelo1)
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 51.686, df = 5, p-value = 6.257e-10
Al analizar graficamente la distribucion del modelo se evidencia que existen patrones graficos que pueden sugerir que no existe Homocedasticidad. El grafico de normalidad muestra valores atipicos que se alejan de la distribucion normal y al comparar los residuos vs el ajutes se pueden ver patrones graficos que no deberian presentarse.
Adicional anterior se ejecuta el test de Breusch-Pagan evaluando la siguiente hipitesis nula:
HO: los residuos tienen varianza constante (homocedasticidad)
HA: hay heterocedasticidad en los residuo
El resultado el test nos indica que existe heterocedasticidad en el modelo evaluado.
Para corregir las posibles violaciones a los supuestos del modelo expuestas, es importante partir de la calidad de los datos mismos, extraer aquellos datos atipicos que puedan estan generando problemas para cada una de las variables.
Seleccionar cuidadosamente las variables que haran parte del modelo evitando la multicolinealidad, procurando que cada variable aporte al modelo de manera independiente. Se sugiere realizar un analisis de componentes principales antes de incluir las variables definitivas.
Realizar transformaciones BOX COX con el objetivo de intentar mitigar la no homogeneidad y heterocedasticidad de los datos, al apicar diferentes transformaciones se pueden evaluar los supuestos sobre la variedad de modelos con el objetivo de identificar con indicadores y evaluaciones el mejor modelo.
Realizar un tratamiento diferenciado a la variable categorica estrato con el objetivo de llevarla a un modelo binario que permita incluirla en el modelo de manera más adecuada.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
datos_prediccion <- data.frame(
areaconst = 200,
estrato = 4,
habitac = 4,
parquea = 1,
banios = 2
)
prediccion <- predict(modelo1, datos_prediccion)
cat("La predicción con estrato 4 es: ", prediccion)
## La predicción con estrato 4 es: 316.3002
datos_prediccion <- data.frame(
areaconst = 200,
estrato = 5,
habitac = 4,
parquea = 1,
banios = 2
)
prediccion <- predict(modelo1, datos_prediccion)
cat("\nLa predicción con estrato 5 es: ", prediccion)
##
## La predicción con estrato 5 es: 401.882
Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
s_base1 <- base1[
(base1$areaconst >= 200 & base1$areaconst <= 275) & # Comentario para áreaconst
(base1$parquea >= 1 & base1$parquea <= 2) &
(base1$banios >= 2 & base1$banios <= 3) &
(base1$habitac >= 4 & base1$habitac <= 5) &
base1$estrato >= 4 &
(base1$preciom <= 350 & base1$preciom >= 300) ,
]
# Crear el mapa
mapa <- leaflet(data = s_base1) %>%
addTiles() %>% # Agregar el fondo del mapa (tiles de OpenStreetMap)
addMarkers(lng = ~longitud, lat = ~latitud, popup = "Ubicación") %>%
fitBounds(~min(longitud), ~min(latitud), ~max(longitud), ~max(latitud))
# Mostrar el mapa
mapa
Basados en las especificaciones dadas para la vivienda 1 se tiene que puede existir cierta variabilidad dependiendo del estrato, como se ve en la prediccion del punto 5. Para poder tener almenos 5 posibilidades es necesario considerar un rango cercano a lo solicitado para cada variabe que se encuentre dentro del presupuesto. De esta manera podemos obtener 5 posibilidades de casas en la zona norte, con estrato 4 o 5, con un área cercana a 200 mts con almenos 1 parqueadero, 2 baños, 4 habitaciones y un precio cercano al aprobado.
De esta manera aunque no se puedan seleccionar 5 opciones con las caracteristicas especificas se dan un aproximado con más posbilidades para el comprador.
Realice los pasos del 1 al 6. Para la segunda solicitud se tiene un crédito pre-aprobado por valor de $850 millones
Realice un filtro a la base de datos e incluya solo las ofertas de:
base1: apartamentos, de la zona sur de la ciudad.
Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
(Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).
base2 <- datos_org[datos_org$tipo == "Apartamento" & datos_org$zona == "Zona Sur",]
base2 <- base2[complete.cases(base2), ]
tabla <- base2 %>%
count(tipo)
print(tabla)
## tipo n
## 1 Apartamento 1860
tabla <- base2 %>%
count(zona)
print(tabla)
## zona n
## 1 Zona Sur 1860
head(base2, n = 3)
## id zona piso estrato preciom areaconst parquea banios habitac
## 7 8299 Zona Sur 2 6 305 125 2 3 3
## 10 8287 Zona Sur 2 5 285 120 2 4 3
## 11 8288 Zona Sur 1 5 310 166 2 4 3
## tipo barrio longitud latitud
## 7 Apartamento bella suiza -76565 3408.00
## 10 Apartamento bella suiza -76564 3.41
## 11 Apartamento bella suiza -76564 3.41
# Limpia la columna 'latitud' eliminando los puntos y convirtiéndola a numérica
base2$latitud <- gsub("\\.", "", base2$latitud)
base2$latitud <- sapply(strsplit(base2$latitud, ""), function(x) paste0(x[1], ".", paste0(x[-1], collapse = "")))
base2$latitud <- as.numeric(base2$latitud)
# Define una función para agregar un separador decimal a la columna 'longitud'
base2$longitud <- gsub("\\.", "", base2$longitud)
agregarSeparadorDecimal <- function(x) {
x_str <- as.character(x)
x_str <- sub("(\\d{2})", "\\1.", x_str)
x_num <- as.numeric(x_str)
return(x_num)
}
# Aplica la función 'agregarSeparadorDecimal' para limpiar la columna 'longitud'
base2$longitud <- sapply(base2$longitud, agregarSeparadorDecimal)
# Crear el mapa
mapa <- leaflet(data = base2) %>%
addTiles() %>% # Agregar el fondo del mapa (tiles de OpenStreetMap)
addMarkers(lng = ~longitud, lat = ~latitud, popup = "Ubicación") %>%
fitBounds(~min(longitud), ~min(latitud), ~max(longitud), ~max(latitud))
# Mostrar el mapa
mapa
Una vez realizado el filtro de la base de datos, para casas en la zona Sur se evidencia que las coordenadas latitud,longitud tienen errores en el separados decimal, el cual genera una cantidad considerable de registros atípicos en estas columnas. Una vez solucionado el inconveniente de las coordenadas se procede a especializar la información, donde es claro que existen registros mal clasificados como zona sur, ya que espacialmente según sus coordenadas se encuentran en zonas diferentes a esta.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
# Crear un nuevo dataset con solo las columnas deseadas
base3 <- base2[, c("preciom", "areaconst", "estrato", "banios", "habitac", "zona" )]
summary(base3)
## preciom areaconst estrato banios
## Min. : 78.0 Min. : 40.0 Min. :3.000 Min. :1.000
## 1st Qu.: 210.0 1st Qu.: 71.0 1st Qu.:4.000 1st Qu.:2.000
## Median : 260.0 Median : 90.0 Median :5.000 Median :2.000
## Mean : 312.9 Mean :100.7 Mean :4.745 Mean :2.584
## 3rd Qu.: 350.0 3rd Qu.:112.0 3rd Qu.:5.000 3rd Qu.:3.000
## Max. :1750.0 Max. :932.0 Max. :6.000 Max. :7.000
## habitac zona
## Min. :0.000 Length:1860
## 1st Qu.:3.000 Class :character
## Median :3.000 Mode :character
## Mean :3.018
## 3rd Qu.:3.000
## Max. :6.000
#ggpairs(base2[,1:6], title=" ")
# Crear la matriz de dispersión
scatter_matrix <- ggpairs(base3, columns = c("preciom", "areaconst", "estrato", "banios", "habitac", "zona"))
# Mostrar la matriz de dispersión
print(scatter_matrix)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
###
Conclusión 2
Una vez realizado el filtro de la base de datos, para generar un gráfico interactivo que permita ver la correlación entre las variables mencionadas frente a precio del metro cuadrado, se puede observar que existe correlación positiva en todas las variables numéricas, es decir, que un aumento en cada uno de ellos genera un efecto de aumento en el precio. Esto se da especialmente para la variable área construida y número de baños, lo cual indica que entre más área construida mayor será el precio, sin embargo las variables número de baños y el área construida presentan una correlación alta entre ellas, lo que puede implicar que se tiene información redundante para el precio del metro cuadrado.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
# Seleccionar las columnas de interés del dataframe 'datos_org' y guardarlas en 'base3'
base4 <- base2[, c("preciom", "areaconst", "estrato", "habitac", "parquea", "banios" )]
# Crear un modelo de regresión lineal (lm) para predecir 'preciom' en función de las variables predictoras
modelo1 <- lm(preciom ~ areaconst + estrato + habitac + parquea + banios, data = base4)
# Mostrar un resumen del modelo, que incluye estadísticas y coeficientes
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitac + parquea +
## banios, data = base4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1023.81 -41.49 -1.62 40.43 935.25
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -265.88631 16.98801 -15.651 < 2e-16 ***
## areaconst 1.21225 0.06101 19.870 < 2e-16 ***
## estrato 57.95258 3.46882 16.707 < 2e-16 ***
## habitac -18.60682 4.29409 -4.333 1.55e-05 ***
## parquea 82.36047 5.06287 16.268 < 2e-16 ***
## banios 47.52768 3.87136 12.277 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 95.6 on 1854 degrees of freedom
## Multiple R-squared: 0.7367, Adjusted R-squared: 0.736
## F-statistic: 1038 on 5 and 1854 DF, p-value: < 2.2e-16
# Mostrar los coeficientes estimados del modelo
modelo1$coefficients
## (Intercept) areaconst estrato habitac parquea banios
## -265.886314 1.212245 57.952584 -18.606816 82.360468 47.527678
Al estimar el modelo de regresión lineal y obtener un resumen de dicho modelo, se puede evaluar estadísticamente cada coeficiente considerando el p-valor resultante para cada caso:
“El valor p de cada término evalúa la hipótesis nula de que el coeficiente es igual a cero (no hay efecto). Un valor p bajo (< 0,05) indica que se puede rechazar la hipótesis nula. En otras palabras, es probable que un predictor que tenga un valor p bajo sea una adición significativa al modelo porque los cambios en el valor del predictor se relacionan con cambios en la variable de respuesta.” tomado de: https://blog.minitab.com/es/como-interpretar-los-resultados-del-analisis-de-regresion-valores-p-y-coeficientes
Basado en lo anterior todos los coeficientes son significativos, es decir, aportan considerablemente al modelo. Sin embargo, es necesario un análisis más detallado que se presenta a continuación:
beta_0 (Intercepto)
En este caso, establece el valor esperado de ‘preciom’ cuando todas las variables predictoras son cero, pero esta interpretación puede no ser significativa en la práctica. Lo anterior a que no es lógico que por ejemplo no se tenga área construida, baños, habitaciones, parqueadero y se pretenda obtener algún valor lógico del inmueble.
beta_1 (areaconst)
En este caso, el coeficiente indica que un existe un efecto de 1.21225 en el precio del metro cuadrado cuando aumenta una unidad el área construida. Lo que es lógico en el sentido de que al aumentar el área construida se espera un precio más alto, aunque el efecto de este coeficiente es pequeño frente a el efecto de los coeficientes de las otras variables, algo que no es muy lógico en la realidad.
beta_2 (estrato)
En este caso, el coeficiente se supone que indica que un existe un efecto de 57.95258 en el precio del metro cuadrado cuando aumenta una unidad el área construida. Lo que es lógico en el sentido de que al aumentar el estrato si se espera un precio más alto, pero en este caso puede existir un error importante en lo que refleja el coeficiente, puesto que, se habla de una variable categórica debe tener un análisis diferencial y está limitada en la cantidad de estratos, no podemos decir que por cada unidad que aumenta el estrato aumenta en 57.95258 en el precio del metro cuadrado.
beta_3 (habitac)
En este caso, el coeficiente indica que un existe un efecto de -18.60682 en el precio del metro cuadrado cuando aumenta una unidad el número de habitaciones. Lo que no es lógico en el sentido de que al aumentar el número de habitaciones se espera un precio más alto no un precio más bajo. Este coeficiente no es acorde a la realidad y debe darse un tratamiento diferencial a esta variable, contemplando la posibilidad de datos atípicos o mal registrados que están afectando el modelo o que se esté presentando correlación con otra variable como área construida.
beta_4 (parquea)
En este caso, el coeficiente indica que un existe un efecto de 82.36047 en el precio del metro cuadrado cuando aumenta una unidad el número de parqueaderos. Lo que es lógico en el sentido de que al aumentar la disponibilidad de parqueaderos se espera un precio más alto.
beta_5 (banios)
En este caso, el coeficiente indica que un existe un efecto de 47.52768 en el precio del metro cuadrado cuando aumenta una unidad el número de baños. Lo que es lógico en el sentido de que al aumentar la cantidad de baños se espera un precio más alto, sin embargo aquí puede existir una correlación fuerte con el área construida que este afectando significativamente los coeficientes de las variables, área construida, numero de baños y número de habitaciones, ya que de cierta manera están relacionados.
# Calcular el R-cuadrado (R2)
r2 <- summary(modelo1)$r.squared
# Calcular el R-cuadrado ajustado (R2 ajustado)
r2_adj <- summary(modelo1)$adj.r.squared
# Calcular el AIC (Criterio de Información de Akaike)
aic <- AIC(modelo1)
# Calcular el BIC (Criterio de Información Bayesiano)
bic <- BIC(modelo1)
# Calcular la estadística F y su p-valor
f_statistic <- summary(modelo1)$fstatistic[1]
f_p_value <- summary(modelo1)$fstatistic[3]
# Calcular el RMSE (Error Cuadrático Medio)
residuals <- residuals(modelo1)
rmse <- sqrt(mean(residuals^2))
# Imprimir los resultados
cat("R2:", r2, "\n")
## R2: 0.7367439
cat("R2 ajustado:", r2_adj, "\n")
## R2 ajustado: 0.7360339
cat("AIC:", aic, "\n")
## AIC: 22250.35
cat("BIC:", bic, "\n")
## BIC: 22289.05
cat("Estadística F:", f_statistic, "\n")
## Estadística F: 1037.714
cat("p-valor F:", f_p_value, "\n")
## p-valor F: 1854
cat("RMSE:", rmse, "\n")
## RMSE: 95.44731
Al analizar los indicadores de ajustes del modelo como el R2, se muestra que el modelo se ajusta a los datos con un valor de R2 se podria decir que es significativo, sin embargo, según lo estipulado en el análisis de los coeficientes se sugiere realizar ajustes desde las mismas variables para poder identificar posibles sesgos y correlaciones que puedan estar afectando los resultados de un futura estimación.
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
4.1 Linealidad y multicolinealidad:
Se asume que la relación entre las variables independientes y la variable dependiente es lineal. Esto significa que un cambio en una variable independiente causa un cambio proporcional en la variable dependiente. En otras palabras, los efectos de las variables independientes se suman de manera directa y constante
scatter_matrix <- ggpairs(base2, columns = c("preciom", "areaconst", "estrato", "habitac", "parquea", "banios"))
# Mostrar la matriz de dispersión
print(scatter_matrix)
Al
analizar la variable dependiente vs las variables independientes en la
primera fila del grafico anterior se puede evidenciar que existe
correlación significativa exceptuando la variable numero de
habitaciones, con una correlacion de 0.315. Lo anterior y la conclusion
3.1 dada respecto a la significacia de los coeficientes nos puede
indicar que no es clara la linealidad del modelo.
Por otro lado si se analiza a correlacion entre las variables independientes, se encuentra que parecen tener dependencia entre ellas en algunos casos por ejemplo, la correlacion entre el numero de baños, numero de parqueaderos y el area construida es de 0.646 y 0.557 respectivamente lo que puede afectar significativamente el modelo y sus predicciones.
4.2 Homocedasticidad y normalidad:
La homocedasticidad se refiere a la constancia de la varianza de los errores en un modelo estadístico.
par(mfrow = c(2, 2))
plot(modelo1)
shapiro.test(modelo1$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.77889, p-value < 2.2e-16
bptest(modelo1)
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 647.63, df = 5, p-value < 2.2e-16
Al analizar graficamente la distribucion del modelo se evidencia que existen patrones graficos que pueden sugerir que no existe Homocedasticidad. El grafico de normalidad muestra valores atipicos que se alejan de la distribucion normal y al comparar los residuos vs el ajutes se pueden ver patrones graficos que no deberian presentarse.
Adicional anterior se ejecuta el test de Breusch-Pagan evaluando la siguiente hipitesis nula:
HO: los residuos tienen varianza constante (homocedasticidad)
HA: hay heterocedasticidad en los residuo
El resultado el test nos indica que existe heterocedasticidad en el modelo evaluado.
Para corregir las posibles violaciones a los supuestos del modelo expuestas, es importante partir de la calidad de los datos mismos, extraer aquellos datos atipicos que puedan estan generando problemas para cada una de las variables.
Seleccionar cuidadosamente las variables que haran parte del modelo evitando la multicolinealidad, procurando que cada variable aporte al modelo de manera independiente. Se sugiere realizar un analisis de componentes principales antes de incluir las variables definitivas.
Realizar transformaciones BOX COX con el objetivo de intentar mitigar la no homogeneidad y heterocedasticidad de los datos, al apicar diferentes transformaciones se pueden evaluar los supuestos sobre la variedad de modelos con el objetivo de identificar con indicadores y evaluaciones el mejor modelo.
Realizar un tratamiento diferenciado a la variable categorica estrato con el objetivo de llevarla a un modelo binario que permita incluirla en el modelo de manera más adecuada.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
datos_prediccion <- data.frame(
areaconst = 300,
estrato = 5,
habitac = 5,
parquea = 3,
banios = 3
)
prediccion <- predict(modelo1, datos_prediccion)
cat("La predicción con estrato 5 es: ", prediccion)
## La predicción con estrato 5 es: 684.1805
datos_prediccion <- data.frame(
areaconst = 300,
estrato = 6,
habitac = 5,
parquea = 3,
banios = 3
)
prediccion <- predict(modelo1, datos_prediccion)
cat("\nLa predicción con estrato 6 es: ", prediccion)
##
## La predicción con estrato 6 es: 742.1331
Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 850 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
s_base2 <- base2[
(base2$areaconst >= 250 & base2$areaconst <= 350) & # Comentario para áreaconst
(base2$parquea >= 2 & base2$parquea <= 4) &
(base2$banios >= 2 & base2$banios <= 4) &
(base2$habitac >= 4 & base2$habitac <= 5 ) &
(base2$estrato >= 5 & base2$estrato <= 6) &
(base2$preciom <= 850 ) ,
]
s_base2
## id zona piso estrato preciom areaconst parquea banios habitac
## 234 7658 Zona Sur 6 5 520 320.00 2 4 4
## 628 6175 Zona Sur 5 5 350 270.00 3 3 4
## 4025 2308 Zona Sur 4 5 350 258.00 2 4 5
## 5374 4266 Zona Sur 5 6 700 250.00 2 4 5
## 8184 8113 Zona Sur 2 5 410 295.55 2 4 4
## tipo barrio longitud latitud
## 234 Apartamento cuarto de legua -76.55100 3.40900
## 628 Apartamento capri -76.54100 3.39200
## 4025 Apartamento San Fernando -76.51972 3.44000
## 5374 Apartamento el ingenio -76.53043 3.37062
## 8184 Apartamento cuarto de legua -76.55527 3.40750
# Crear el mapa
mapa <- leaflet(data = s_base2) %>%
addTiles() %>% # Agregar el fondo del mapa (tiles de OpenStreetMap)
addMarkers(lng = ~longitud, lat = ~latitud, popup = "Ubicación") %>%
fitBounds(~min(longitud), ~min(latitud), ~max(longitud), ~max(latitud))
# Mostrar el mapa
mapa
Basados en las especificaciones dadas para la vivienda 2 se tiene que puede existir cierta variabilidad dependiendo del estrato, como se ve en la prediccion del punto 5. Para poder tener almenos 5 posibilidades es necesario considerar un rango cercano a lo solicitado para cada variabe que se encuentre dentro del presupuesto. De esta manera podemos obtener 5 posibilidades de casas en la zona sur, con estrato 5 o 6, con un área cercana a 300 mts con almenos 3 parqueadero, 3 baños, 5 habitaciones y un precio cercano al aprobado.
De esta manera aunque no se puedan seleccionar 5 opciones con las caracteristicas especificas se dan un aproximado con más posbilidades para el comprador.