Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
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?).
data("vivienda", package = "paqueteMODELOS")
# Eliminar registros donde la columna zona = "NA"
vivienda <- subset(vivienda, zona != "NA")
# Reemplazar NA por 0 en la columna "parqueaderos"
vivienda$parqueaderos <- ifelse(is.na(vivienda$parqueaderos), 0, vivienda$parqueaderos)
# Reemplazar NA por 0 en la columna "piso"
vivienda$piso <- ifelse(is.na(vivienda$piso), 0, vivienda$piso)
base1 <- vivienda %>%
filter(tipo == "Casa", zona == "Zona Norte")
base1 <- subset(base1, tipo == "Casa" & zona == "Zona Norte")
head(base1, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 02 5 320 150 2 4 6
## 2 1592 Zona N… 02 5 780 380 2 3 3
## 3 4057 Zona N… 02 6 750 445 0 7 6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
print(base1)
## # A tibble: 722 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona … 02 5 320 150 2 4 6
## 2 1592 Zona … 02 5 780 380 2 3 3
## 3 4057 Zona … 02 6 750 445 0 7 6
## 4 4460 Zona … 02 4 625 355 3 5 5
## 5 6081 Zona … 02 5 750 237 2 6 6
## 6 7824 Zona … 02 4 600 160 1 4 5
## 7 7987 Zona … 02 5 420 200 4 4 5
## 8 3495 Zona … 03 5 490 118 2 4 4
## 9 141 Zona … 0 3 230 160 0 2 3
## 10 243 Zona … 0 3 190 435 0 0 0
## # ℹ 712 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
n_filas <- nrow(base1)
print(n_filas)
## [1] 722
mapa <- leaflet(data = base1) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("Zona:", zona), radius = 2,color = "#104E8B")
mapa
En el mapa se observa que se se presentan valores en otras zonas diferentes a la “Zona Norte” , esto puede presentarse debido a:
Coordenadas geográficas incorrectas: Si los valores de longitud y latitud en los datos no son correctos, los marcadores en el mapa pueden aparecer en ubicaciones incorrectas.
Ambigüedad en los nombres de zonas: puede ser que la variable “zona” en los datos tenga categorías de zonas que no están claramente definidas o que hay errores tipográficos o de etiquetado en las categorías, es decir, viviendas con coordenadas de otras zonas se etiquetaron como “Zona Norte”.
Errores de codificación geográfica: Los datos geográficos, como las coordenadas de longitud y latitud, pueden estar mal codificados. Puede haber errores en la asignación de coordenadas a las viviendas, lo que haría que algunos puntos se muestren en ubicaciones incorrectas en el mapa.
Realice un análisis exploratorio de datos enfocado en la correlación
entre la variable respuesta (precio del apartamento) 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.
plot_area <- plot_ly(base1, x = ~areaconst, y = ~preciom, color = ~estrato,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Área:", areaconst)) %>%
layout(title = "Relación entre Precio y Área Construida",
xaxis = list(title = "Área Construida (m²)"),
yaxis = list(title = "Precio (millones COP)"))
plot_area
El gráfico muestra la relación entre el precio de las viviendas y el área construida. Se utiliza el estrato como una variable categórica para colorear los puntos.
La dispersión de los puntos en el gráfico indica que hay variabilidad en los precios dentro de cada estrato y área construida.
La mayoría de los puntos se concentra en un rango de áreas construidas y precios, en este caso la mayor concentración se da en areas <= 500 m² y precios menores a 500 millones de pesos .
Los estratos 5 y 6 tienen la tendencia a comprar viviendas mayores a los 500 m² .
Plot_area_contorno <- ggplot(base1, aes(x = areaconst, y = preciom)) +
stat_density_2d(aes(fill = after_stat(level)), geom = "polygon") +
labs(title = "Distribución y Contorno de Precio y Área Construida",
x = "Área Construida (m²)",
y = "Precio (millones COP)")
Plot_area_contorno
Este gráfico muestra las áreas donde se concentran los valores altos de densidad.
En el gráfico se puede observar que las áreas donde se concentran los valores altos de densidad son las áreas <= 200 m² , lo que indica áreas de mayor interés para la inversión.
tambien se observa que a partir de los 400m² los precios tienden a ser más altos en función del área construida.
options(warn = -1)
plot_estrato <- plot_ly(data = base1, x = ~estrato, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato)) %>%
layout(title = "Relación entre Precio y Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones COP)")) %>%
style(marker = list(color = "#104E8B"))
options(warn = 0)
plot_estrato
estadisticas_por_estrato <- base1 %>%
group_by(estrato) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_estrato
## # A tibble: 4 × 4
## estrato Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 3 244. 1100 89
## 2 4 439. 1800 160
## 3 5 550. 1940 125
## 4 6 818. 1600 430
Los datos muestran que a medida que aumenta el estrato, en general, el precio promedio de las viviendas tiende a aumentar. Por ejemplo, el estrato 6 tiene un precio promedio mucho más alto (818 millones de COP) en comparación con el estrato 3 (244 millones de COP).
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada estrato. Por ejemplo, en el estrato 3, la variabilidad es alta, ya que el precio mínimo es de 89 millones de COP y el precio máximo es de 1,100 millones de COP.
Los datos pueden ayudar a identificar estratos donde los precios son más altos en promedio, lo que puede ser útil para tomar decisiones sobre inversión inmobiliaria.
promedio_por_estrato <- base1 %>%
group_by(estrato) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras <- plot_ly(data = promedio_por_estrato, x = ~estrato, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#104E8B")) %>%
layout(title = "Precio Promedio por Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio Promedio (millones COP)"))
plot_barras
El gráfico presenta el precio promedio de las viviendas para cada estrato en forma de barras. Esto facilita la comparación de los precios promedio entre estratos y puede ser útil para tomar decisiones de compra pues se conoce de antemano cuando se puede ofrecer por una vivienda dependiendo del estrato donde se encuentre ubicada.
Por ejemplo para estrato 4 sería una buena oferta viviendas cuyo costo fuera menor a los 438 millones de pesos
options(warn = -1)
plot_banos <- plot_ly(data = base1, x = ~banios, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Baños:", banios)) %>%
layout(title = "Relación entre Precio y Número de Baños",
xaxis = list(title = "Número de Baños"),
yaxis = list(title = "Precio (millones COP)"))%>%
style(marker = list(color = "#104E8B"))
options(warn = 0)
plot_banos
estadisticas_por_banios <- base1 %>%
group_by(banios) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_banios
## # A tibble: 11 × 4
## banios Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 0 583. 1200 190
## 2 1 184. 420 89
## 3 2 260. 900 120
## 4 3 391. 1500 130
## 5 4 498. 1800 165
## 6 5 592. 1650 300
## 7 6 671. 1530 230
## 8 7 809. 1600 450
## 9 8 810 1940 400
## 10 9 1300 1300 1300
## 11 10 1040 1400 680
Los datos muestran una tendencia general de que a medida que aumenta el número de baños en las viviendas, el precio promedio tiende a aumentar. Por ejemplo, las viviendas con 1 baño tienen un precio promedio más bajo (184 millones de COP) en comparación con las viviendas con 10 baños (1,040 millones de COP).
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada grupo de baños. Por ejemplo, para viviendas con 1 baño, la variabilidad es alta, ya que el precio mínimo es de 89 millones de COP y el precio máximo es de 420 millones de COP.
Es interesante notar que para viviendas con 9 baños, el precio promedio es de 1,300 millones de COP y no hay variabilidad en el precio (el límite superior e inferior son iguales). Esto indica que hay un número limitado de viviendas con 9 baños en el conjunto de datos.
promedio_por_banios <- base1 %>%
group_by(banios) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras_banios <- plot_ly(data = promedio_por_banios, x = ~banios, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#104E8B")) %>%
layout(title = "Precio Promedio por Número de Baños",
xaxis = list(title = "No. de baños"), # Título del eje X
yaxis = list(title = "Precio Promedio (millones COP)")) # Título del eje Y
plot_barras_banios
Se observa que hay una tendencia general que a medida que aumenta el número de baños, tienden a aumentar los precios promedio.
Basado en las observaciones, se recomienda comprar viviendas con 8 baños o menos ya que parece haber una ventaja en términos de precio promedio debido a que las viviendas mayores a 9 baños el precio se dispara notablemente .
options(warn = -1)
plot_habitaciones <- plot_ly(data = base1, x = ~habitaciones, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Habitaciones:", habitaciones)) %>%
layout(title = "Relación entre Precio y Número de Habitaciones",
xaxis = list(title = "Número de Habitaciones"),
yaxis = list(title = "Precio (millones COP)"))%>%
style(marker = list(color = "#104E8B"))
options(warn = 0)
plot_habitaciones
estadisticas_por_habitaciones <- base1 %>%
group_by(habitaciones) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_habitaciones
## # A tibble: 11 × 4
## habitaciones Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 0 506. 1200 155
## 2 1 210. 330 89
## 3 2 265. 488 125
## 4 3 311. 1400 110
## 5 4 420. 1500 120
## 6 5 537. 1600 170
## 7 6 492. 1200 165
## 8 7 548. 1200 220
## 9 8 504. 1800 245
## 10 9 569. 1300 245
## 11 10 1006. 1940 370
Los datos muestran una tendencia general de que a medida que aumenta el número de habitaciones en las viviendas, el precio promedio tiende a aumentar. Por ejemplo, las viviendas con 1 habitación tienen un precio promedio más bajo (210 millones de COP) en comparación con las viviendas con 10 habitaciones (1,006 millones de COP).
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada grupo de habitaciones. Por ejemplo, para viviendas con 1 habitación, la variabilidad es alta, ya que el precio mínimo es de 89 millones de COP y el precio máximo es de 330 millones de COP.
Es importante destacar que para viviendas con 9 habitaciones, el precio promedio es de 569 millones de COP, pero hay cierta variabilidad en el precio (los límites superior e inferior son diferentes). Esto indica que existen viviendas con 9 habitaciones que tienen precios diferentes dentro de ese rango.
promedio_por_habitaciones <- base1 %>%
group_by(habitaciones) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras_habitaciones <- plot_ly(data = promedio_por_habitaciones, x = ~habitaciones, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#104E8B")) %>%
layout(title = "Precio Promedio por Número de Habitaciones",
xaxis = list(title = "No. de Habitaciones"), # Título del eje X
yaxis = list(title = "Precio Promedio (millones COP)")) # Título del eje Y
plot_barras_habitaciones
La gráfica de barras muestra el precio promedio de las viviendas en función del número de habitaciones. Cada barra representa un número específico de habitaciones, desde 1 hasta 10.
Se puede observar una tendencia general de que a medida que aumenta el número de habitaciones en las viviendas, el precio promedio tiende a incrementar. Esto sugiere que, en promedio, las viviendas con más habitaciones tienen un precio más alto en el mercado inmobiliario.
Notablemente, las viviendas con 10 habitaciones tienen el precio promedio más alto entre todas las categorías, superando el valor de 1,000 millones de COP. Por otro lado, las viviendas con 1 habitación tienen el precio promedio más bajo, alrededor de 210 millones de COP.
Es importante tener en cuenta que, aunque esta tendencia general es evidente, existe cierta variabilidad en los precios dentro de cada categoría de habitaciones, como se refleja en los límites superior e inferior. Esto sugiere que otros factores, además del número de habitaciones, pueden influir en los precios de las viviendas.
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).
modelo <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = base1)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -964.04 -80.10 -17.08 50.06 1069.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -236.47551 30.36582 -7.788 2.40e-14 ***
## areaconst 0.82677 0.04368 18.926 < 2e-16 ***
## estrato 86.42579 7.39747 11.683 < 2e-16 ***
## banios 26.97978 5.34384 5.049 5.65e-07 ***
## habitaciones 1.44443 4.16411 0.347 0.729
## parqueaderos -1.67672 4.31505 -0.389 0.698
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 159.1 on 716 degrees of freedom
## Multiple R-squared: 0.6508, Adjusted R-squared: 0.6484
## F-statistic: 266.9 on 5 and 716 DF, p-value: < 2.2e-16
En este caso, el modelo se ajustó utilizando la variable dependiente
preciom y las variables independientes
areaconst,
estrato,
banios,
habitaciones y
parqueaderos de la base de datos
base1.
Coefficients: Esta sección muestra los coeficientes estimados para cada una de las variables independientes en el modelo de regresión lineal múltiple:
Intercept: El coeficiente estimado
para la intersección (constante) es -236.47551.
areaconst: El coeficiente estimado
para areaconst es 0.82677.
estrato: El coeficiente estimado
para estrato es 86.42579.
banios: El coeficiente estimado
para banios es 26.97978.
habitaciones: El coeficiente
estimado para habitaciones es
1.44443.
parqueaderos: El coeficiente
estimado para parqueaderos es
-1.67672.
Cada coeficiente representa cuánto cambia la variable dependiente
(preciom) cuando una variable
independiente específica aumenta en una unidad, manteniendo todas las
demás variables constantes. Los coeficientes también tienen asociados
valores de error estándar y valores t asociados que se utilizan para
evaluar su significancia estadística.
Multiple R-squared: Indica la proporción de la
variabilidad en la variable dependiente
(preciom) que es explicada por el modelo.
En este caso, el valor es 0.6508, lo que significa que aproximadamente
el 65.08% de la variabilidad en los precios se explica mediante las
variables independientes incluidas en el modelo.
Adjusted R-squared: Es similar al R-cuadrado múltiple, pero ajusta el valor según el número de variables independientes en el modelo. En este caso, el valor es 0.6484. el R-cuadrado ajustado es una medida de cuánto poder predictivo tiene el modelo en relación con la variabilidad de los datos. Un R-cuadrado ajustado más alto sugiere que el modelo es mejor para explicar y predecir la variable dependiente.
En este caso, un valor de 0.6484 significa que aproximadamente el
64.84% de la variabilidad en los precios de las viviendas
(preciom) se puede explicar mediante las
variables independientes (areaconst,
estrato,
banios,
habitaciones,
parqueaderos) incluidas en el modelo.
Cuanto más alto sea el R-cuadrado ajustado, mejor se ajusta el modelo a
los datos y mejor puede explicar las variaciones en la variable
dependiente.
Sin embargo, es importante recordar que un alto R-cuadrado no garantiza que el modelo sea adecuado o que todas las relaciones sean significativas. Es esencial considerar otros factores, como la significancia de los coeficientes individuales, la interpretación de los residuos y la relevancia práctica de las variables incluidas en el modelo, al evaluar la calidad y utilidad del modelo de regresión.
# Calcular intervalos de confianza para los coeficientes
conf_int <- confint(modelo)
# Crear un data frame con los coeficientes y los intervalos de confianza
coef_df <- data.frame(Coefficient = rownames(conf_int),
Estimate = coef(modelo),
Lower = conf_int[, 1],
Upper = conf_int[, 2])
#Crear un gráfico de coeficientes con intervalos de confianza
coeficientes_IC_con_valores <- ggplot(coef_df, aes(x = Coefficient, y = Estimate)) +
geom_bar(stat = "identity", fill = "#104E8B") +
geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.5, color = "#FF0000") +
geom_text(aes(label = sprintf("%.2f", Estimate)), vjust = -0.5, color = "black", size = 3) + # Etiquetas con valores
labs(title = "Coeficientes del Modelo de Regresión Lineal",
x = "Variables Predictoras",
y = "Coeficiente Estimado") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
coeficientes_IC_con_valores
coeficientes <- coef(modelo)
interpretacion <- c("Intercepto", "Área Construida", "Estrato", "Baños", "Habitaciones", "Parqueaderos")
interpretacion <- paste(interpretacion, ": ", round(coeficientes, 4))
interpretacion
## [1] "Intercepto : -236.4755" "Área Construida : 0.8268"
## [3] "Estrato : 86.4258" "Baños : 26.9798"
## [5] "Habitaciones : 1.4444" "Parqueaderos : -1.6767"
Los coeficientes que proporciona la tabla son los resultados de un
modelo de regresión lineal múltiple. Estos coeficientes representan
cuánto cambia la variable dependiente
(preciom, el precio de las viviendas)
cuando una variable independiente específica aumenta en una unidad,
manteniendo todas las demás variables constantes. Además, es importante
evaluar la significancia estadística de estos coeficientes para
determinar si son estadísticamente significativos o no.
Intercepto (-236.4755): Este coeficiente
representa el valor estimado de preciom
cuando todas las demás variables independientes son iguales a cero. En
este contexto, no es lógico que todas las variables independientes sean
cero, por lo que la interpretación del intercepto por sí solo puede no
tener mucho sentido. Sin embargo, es importante para el modelo como
punto de partida.
Área Construida (0.8268): Este coeficiente
indica que, manteniendo todas las demás variables constantes, por cada
aumento de una unidad en el área construida de una vivienda (en metros
cuadrados), el precio (preciom) aumenta en
0.8268 millones de COP. Este coeficiente es estadísticamente
significativo (p-value < 0.001) y tiene sentido, ya que es razonable
esperar que el precio de una vivienda aumente a medida que su área
construida aumenta.
Estrato (86.4258): Este coeficiente indica que, manteniendo todas las demás variables constantes, el precio de una vivienda aumenta en 86.4258 millones de COP por cada unidad adicional en el estrato. Este coeficiente es estadísticamente significativo (p-value < 0.001). Tener un estrato más alto generalmente se asocia con viviendas más costosas, por lo que esta relación tiene sentido.
Baños (26.9798): Este coeficiente indica que, manteniendo todas las demás variables constantes, el precio de una vivienda aumenta en 26.9798 millones de COP por cada baño adicional. También es estadísticamente significativo (p-value < 0.001). Esto es lógico, ya que las viviendas con más baños tienden a tener un precio más alto en el mercado inmobiliario.
Habitaciones (1.4444): Este coeficiente indica que, manteniendo todas las demás variables constantes, el precio de una vivienda aumenta en 1.4444 millones de COP por cada habitación adicional. Sin embargo, este coeficiente no es estadísticamente significativo (p-value = 0.729), lo que sugiere que el número de habitaciones puede no tener un impacto significativo en el precio de las viviendas en este modelo.
Parqueaderos (-1.6767): Este coeficiente indica que, manteniendo todas las demás variables constantes, el precio de una vivienda disminuye en 1.6767 millones de COP por cada parqueadero adicional. Sin embargo, este coeficiente tampoco es estadísticamente significativo (p-value = 0.698), lo que sugiere que el número de parqueaderos puede no estar relacionado de manera significativa con el precio de las viviendas en este modelo.
Llos coeficientes de “Área Construida”, “Estrato” y “Baños” son estadísticamente significativos y tienen interpretaciones lógicas en el contexto del mercado inmobiliario. Por otro lado, los coeficientes de “Habitaciones” y “Parqueaderos” no son estadísticamente significativos, lo que sugiere que estos factores pueden no tener un impacto significativo en el precio de las viviendas en este modelo específico. Es importante considerar la relevancia práctica de estos resultados al tomar decisiones relacionadas con bienes raíces.
r2 <- summary(modelo)$r.squared
r2_interpretacion <- paste("El Coeficiente para R2: ", round(r2, 4))
r2_interpretacion
## [1] "El Coeficiente para R2: 0.6508"
El coeficiente de determinación R-cuadrado (R²) es una medida que
indica la proporción de la variabilidad en la variable dependiente (en
este caso, el precio de las viviendas,
preciom) que es explicada por el modelo de
regresión. En este caso, el valor de R² es 0.6508, lo que significa que
aproximadamente el 65.08% de la variabilidad en los precios de las
viviendas se explica mediante las variables independientes
(areaconst,
estrato,
banios,
habitaciones,
parqueaderos) incluidas en el modelo.
Interpretación:
Un R² de 0.6508 indica que el modelo tiene un poder predictivo moderado. Alrededor del 65% de la variabilidad en los precios se puede explicar utilizando las variables independientes seleccionadas.
Esto sugiere que el modelo es útil para entender y predecir los precios de las viviendas en función de las variables incluidas, pero todavía existe un 35% de variabilidad no explicada que podría deberse a otros factores no considerados en el modelo.
Discusión sobre el ajuste del modelo:
El R² de 0.6508 sugiere que el modelo tiene cierta capacidad para explicar las variaciones en los precios, pero aún hay margen de mejora. Es posible que existan otras variables importantes que no se han incluido en el modelo y que podrían aumentar la capacidad de explicación.
Para mejorar el ajuste del modelo, se podrían considerar las siguientes acciones:
Incorporar más variables explicativas: Evaluar si hay otras características de las viviendas o del entorno que puedan influir en los precios y que no se hayan incluido en el modelo actual. Por ejemplo, la ubicación geográfica, la calidad de los materiales de construcción o las tendencias del mercado podrían ser factores importantes.
Transformar las variables existentes: Es posible que algunas variables necesiten transformaciones para mejorar su ajuste al modelo. Por ejemplo, realizar transformaciones logarítmicas o cuadráticas en algunas variables puede ayudar a capturar relaciones no lineales.
Considerar interacciones: Evaluar si existen interacciones significativas entre las variables independientes. Por ejemplo, la combinación de ciertas características, como un alto estrato y un gran número de habitaciones, podría tener un efecto conjunto en el precio.
Validación cruzada y selección de modelos: Utilizar técnicas de validación cruzada y métodos de selección de modelos (como el criterio de información de Akaike o el criterio de información bayesiana) para evaluar diferentes especificaciones del modelo y determinar cuál proporciona el mejor ajuste.
Incorporar datos adicionales: Si es posible, agregar más datos a la muestra puede ayudar a mejorar el modelo y hacerlo más representativo del mercado inmobiliario.
Aunque el modelo actual tiene cierta capacidad predictiva, siempre es importante explorar formas de mejorarlo considerando otras variables relevantes y técnicas de modelado más avanzadas. La mejora del modelo puede ayudar a tomar decisiones más informadas en el mercado inmobiliario y aumentar su capacidad de explicación de los precios de las viviendas.
# valores observados y ajustados del modelo
valores_observados <- base1$preciom
valores_ajustados <- fitted(modelo)
# gráfico de ajuste
plot(valores_ajustados, valores_observados,
xlab = "Valores Ajustados", ylab = "Valores Observados",
main = "Gráfico de Ajuste - R^2 = 0.6508",
col = "#104E8B")
abline(0, 1, col = "red") # Línea de referencia para un ajuste perfecto
La gráfica compara los valores observados (reales) con los valores ajustados (predichos por el modelo de regresión).
Línea de Referencia (Línea Roja): La línea roja en el gráfico representa una línea de referencia que representa un ajuste perfecto. En un ajuste perfecto, todos los puntos se encontrarían en esta línea, lo que significaría que los valores ajustados son idénticos a los valores observados. En la práctica, es poco probable lograr un ajuste perfecto, pero el objetivo es que los puntos estén cerca de esta línea.
Puntos en el Gráfico: Cada punto en el gráfico
representa una observación, La posición vertical del punto representa el
valor observado real de preciom, mientras
que la posición horizontal representa el valor ajustado predicho por el
modelo.
Distribución de los Puntos: En un contexo ideal se esperaría que la mayoría de los puntos estén cerca de la línea de referencia (línea roja), lo que indicaría que el modelo es capaz de hacer predicciones precisas. Sin embargo, en la práctica, es común que haya cierta dispersión de los puntos alrededor de la línea de referencia.
El gráfico de ajuste es una herramienta importante para evaluar
visualmente la calidad del modelo de regresión. Ayuda a determinar si el
modelo es capaz de hacer predicciones precisas y si existe una relación
lineal adecuada entre las variables independientes y la variable
dependiente. En este caso, el modelo parece explicar una parte
significativa de la variabilidad en
preciom, pero es importante considerar
otras mejoras posibles para aumentar la precisión del modelo.
# Calcular los residuos
residuos <- residuals(modelo)
# gráfico de residuos vs. valores ajustados
plot(valores_ajustados, residuos,
xlab = "Valores Ajustados", ylab = "Residuos",
main = "Gráfico de Residuos vs. Valores Ajustados",
col = "#104E8B")
abline(h = 0, col = "red") # Línea de referencia en cero para residuos
Este tipo de gráfico es una herramienta importante para evaluar la calidad de un modelo de regresión.
Eje Horizontal (Valores Ajustados): En el eje horizontal, se muestran los valores ajustados (predichos) por el modelo de regresión. Cada punto en el gráfico representa una observación y su posición en el eje horizontal corresponde al valor ajustado que el modelo predice para esa observación.
Eje Vertical (Residuos): En el eje vertical, se muestran los residuos. Los residuos son las diferencias entre los valores observados reales y los valores ajustados por el modelo. Cada punto en el gráfico representa cuánto se desvía una observación del valor predicho.
Línea de Referencia (Línea Roja): La línea roja en el gráfico representa una línea horizontal en cero en el eje vertical. Esta línea de referencia es importante porque muestra dónde deberían estar los residuos si el modelo fuera perfecto. En un modelo perfecto, los residuos serían todos iguales a cero y estarían alineados con esta línea.
Evaluación de la Homocedasticidad: El gráfico de residuos vs. valores ajustados se utiliza para evaluar la homocedasticidad, que es la igualdad de varianzas en los residuos a lo largo de todo el rango de valores ajustados. Idealmente, los puntos de dispersión en el gráfico deberían estar distribuidos aleatoriamente alrededor de la línea de referencia en cero, sin mostrar un patrón claro.
Efectos No Lineales: Si ves un patrón en forma de embudo o un patrón en abanico en el gráfico, esto podría indicar que el modelo tiene problemas de heterocedasticidad (varianza no constante) y que podría haber efectos no lineales en los datos que el modelo no está capturando adecuadamente.
Residuos Positivos y Negativos: Los residuos positivos (por encima de la línea de referencia) indican que el modelo subestimó el valor observado, mientras que los residuos negativos (por debajo de la línea de referencia) indican que el modelo sobreestimó el valor observado.
Al interpretar este gráfico, se observa lo siguiente:
Que los residuos están distribuidos de manera aleatoria alrededor de la línea de referencia en cero.
Que no hay un patrón claro en la dispersión de los residuos sin embargo tiende más a un patrón en abanico.
No existe un patrón sistemático o no aleatorio en la dispersión de los residuos por lo tanto el modelo no tiene problemas de ajuste.
Si se observa un patrón en la dispersión de los residuos, esto podría sugerir la necesidad de ajustar el modelo, considerar transformaciones de variables o buscar la inclusión de variables adicionales para mejorar la calidad del modelo de regresión.
# histograma de residuos
hist(residuos, breaks = 20,
xlab = "Residuos", ylab = "Frecuencia",
main = "Histograma de Residuos",
col = "#104E8B")
En la gráfica se observa que la distribución de los residuos se asemeja a una distribución normal o de campana, esto es una señal positiva. Significa que los residuos se distribuyen de manera equilibrada alrededor de cero, lo que es deseable para un modelo de regresió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).
# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = base1)
# Obtener los residuos y los valores ajustados del modelo
residuos <- residuals(modelo)
valores_ajustados <- fitted(modelo)
# Crear un frame de datos con residuos y valores ajustados
data_residuos <- data.frame(Residuos = residuos, ValoresAjustados = valores_ajustados)
# gráfico de Residuos vs Valores Ajustados
ggplot(data_residuos, aes(x = ValoresAjustados, y = Residuos)) +
geom_point(color = "#104E8B") + # Gráfico de dispersión de puntos
geom_hline(yintercept = 0, linetype = "dashed", color = "red") + # Línea en y = 0
labs(title = "Gráfico de Residuos vs Valores Ajustados",
x = "Valores Ajustados",
y = "Residuos") +
theme_minimal()
El “Gráfico de Residuos vs. Valores Ajustados” es una herramienta común para evaluar la validez de los supuestos del modelo de regresión lineal.
Homocedasticidad:
Evaluación: En este gráfico, los residuos se dispersan alrededor de la línea horizontal en y = 0 de manera aparentemente aleatoria, lo cual es una señal positiva de homocedasticidad. No parece haber un patrón claro de aumentos o disminuciones en la dispersión de los residuos a lo largo de los valores ajustados.
Sugerencias: La homocedasticidad es un supuesto importante del modelo de regresión lineal. Dado que no se observa un patrón obvio de heterocedasticidad en el gráfico, este supuesto parece cumplirse razonablemente bien en este modelo. No se requieren correcciones importantes en este aspecto.
Linealidad:
Evaluación: El gráfico no proporciona evidencia clara de una relación no lineal entre los valores ajustados y los residuos. Los residuos parecen distribuirse de manera aleatoria alrededor de la línea de referencia en y = 0.
Sugerencias: Dado que no se observan patrones de no linealidad obvios en el gráfico, no es necesario realizar correcciones importantes en cuanto a la linealidad en este momento.
qqnorm(residuos, main = "Residuos normalizados QQ (Quantile-Quantile)", xlab = "Cuantiles Teóricos", ylab = "Cuantiles Observados", col = "#104E8B")
qqline(residuos, col = "red")
El gráfico Q-Q (Quantile-Quantile) es una herramienta útil para evaluar la normalidad de los residuos de un modelo de regresión.
Normalidad de los Residuos:
Evaluación: En el gráfico Q-Q, los puntos se distribuyen aproximadamente a lo largo de una línea diagonal (línea roja) que se extiende desde el primer cuantil al último cuantil. Esto sugiere que los residuos siguen una distribución aproximadamente normal. Los puntos no se desvían significativamente de la línea diagonal.
Interpretación: La aproximación de los puntos a la línea diagonal es una señal positiva de que los residuos podrían seguir una distribución normal. Sin embargo, para una validación más sólida, se podría realizar pruebas formales de normalidad, como la prueba de Shapiro-Wilk.
Sugerencias: No se observan desviaciones drásticas de la normalidad en este gráfico. Sin embargo, si se desea una confirmación más sólida de la normalidad de los residuos, puedes realizar una prueba de normalidad como la prueba de Shapiro-Wilk.
# Gráfico de la función de Autocorrelación parcial (PACF) de Residuos
pacf(residuos, main = "Autocorrelación parcial (PACF) de Residuos", xlab = "Lag", ylab = "PACF",col = "#104E8B")
El gráfico de la función de Autocorrelación Parcial (PACF) de los residuos es una herramienta útil para evaluar la independencia de los residuos en función del tiempo o del orden de observación.
Evaluación: En el gráfico PACF, se muestra la función de autocorrelación parcial de los residuos en función del “lag” o retraso. Los valores de la función PACF se representan en el eje y, mientras que el retraso (lag) se representa en el eje x. Se busca evaluar si los valores de la función PACF están dentro de las bandas de confianza (líneas punteadas) y si hay patrones significativos.
Interpretación: En este gráfico se observa que la mayoría de los valores PACF estén dentro de las bandas de confianza, lo que indica que no hay correlación significativa entre los residuos en función del tiempo. Los valores fuera de las bandas de confianza indican autocorrelación en los residuos.
Sugerencias: En este gráfico, la mayoría de los valores PACF están dentro de las bandas de confianza, lo que significa que los residuos son aproximadamente independientes en función del tiempo o del orden de observación. No se observan patrones significativos de autocorrelación.
El gráfico PACF de los residuos sugiere que los residuos son aproximadamente independientes en función del tiempo o del orden de observación, ya que la mayoría de los valores PACF están dentro de las bandas de confianza. Esto es una señal positiva en cuanto al supuesto de independencia de los residuos en un modelo de regresión. No se requieren correcciones importantes en este aspecto.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
# Datos para la primera solicitud
solicitud_1 <- data.frame(areaconst = 200,
estrato = 4,
habitaciones = 4,
parqueaderos = 1,
banios = 2)
# Realizar la predicción
precio_pred_1 <- predict(modelo, newdata = solicitud_1)
Precio_Vivienda_1 <- paste("La predicción para el precio de la vivienda para la primera Solicitud es:", round(precio_pred_1, 2))
Precio_Vivienda_1
## [1] "La predicción para el precio de la vivienda para la primera Solicitud es: 332.64"
El precio de la vivienda para la primera solicitud es de aproximadamente 332,64 millones de COP, esta predicción se basa en las características específicas proporcionadas en la primera solicitud, como el área construida, el estrato, el número de habitaciones, parqueaderos y baños, utilizando el modelo de regresión lineal previamente ajustado
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.
# Calcular ofertas potenciales dentro del crédito preaprobado de 350 millones
credit_limit <- 350
# Crear una columna con las predicciones de precios en base1
base1 <- base1 %>%
mutate(pred_precio = predict(modelo))
# Filtrar ofertas potenciales
ofertas_potenciales <- base1 %>%
filter(pred_precio <= credit_limit)
# Ordenar ofertas_potenciales por la columna pred_precio en orden descendente
ofertas_potenciales_ordenadas <- ofertas_potenciales[order(-ofertas_potenciales$pred_precio), ]
# Crear una tabla con los resultados ordenados
tabla_ofertas <- datatable(
ofertas_potenciales_ordenadas,
extensions = 'Buttons', # Habilitar la extensión de botones
options = list(
paging = TRUE, # Activar paginación
searching = TRUE, # Activar búsqueda
lengthMenu = c(5, 10, 25, 50), # Opciones de longitud de página
pageLength = 10, # Longitud de página inicial
order = list(list(2, 'desc')), # Ordenar por la columna pred_precio en orden descendente
dom = 'Bfrtip', # Opciones de diseño con botones
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), # Botones de exportación
rownames = FALSE, # Ocultar números de fila
columnDefs = list(
list(className = 'dt-center', targets = '_all') # Centrar contenido de las celdas
)
)
)
# Imprimir la tabla
tabla_ofertas
Variable |
Peso % |
|---|---|
| areaconst | 20 |
| estrato | 10 |
| banios | 10 |
| habitaciones | 10 |
| parqueaderos | 10 |
| pred_precio | 40 |
# Asignar pesos a cada variable
peso_areaconst <- 0.2
peso_estrato <- 0.1
peso_banios <- 0.1
peso_habitaciones <- 0.1
peso_parqueaderos <- 0.1
peso_pred_precio <- 0.4
# Calcular un puntaje para cada oferta
ofertas_potenciales_ordenadas <- ofertas_potenciales_ordenadas %>%
mutate(
puntaje = peso_areaconst * areaconst +
peso_estrato * estrato +
peso_banios * banios +
peso_habitaciones * habitaciones +
peso_parqueaderos * parqueaderos +
peso_pred_precio * pred_precio
)
# Ordenar las ofertas potenciales por el campo "puntaje" en orden descendente
mejores_10_ofertas <- ofertas_potenciales_ordenadas %>%
arrange(desc(puntaje)) %>%
head(10)
# Mostrar las 10 mejores ofertas en una tabla interactiva
tabla_mejores_10_ofertas <- datatable(
mejores_10_ofertas,
options = list(paging = FALSE, searching = FALSE)
)
# Mostrar la tabla
tabla_mejores_10_ofertas
# Crear un mapa Leaflet
mapa_mejores_ofertas <- leaflet() %>%
addTiles()
# Obtener los datos de las 10 mejores ofertas desde la tabla
datos_mejores_ofertas <- as.data.frame(mejores_10_ofertas)
# Agregar marcadores al mapa usando los datos de la tabla
mapa_mejores_ofertas <- mapa_mejores_ofertas %>%
addMarkers(
data = datos_mejores_ofertas,
label = ~barrio,lng = ~longitud,lat = ~latitud,
popup = ~paste("Precio:", round(pred_precio, 2))
)
# Mostrar el mapa
mapa_mejores_ofertas
Oferta 1 (Las Delicias):
Área Construida: 300 metros cuadrados.
Estrato: 3.
Baños: 2.
Habitaciones: 4.
Parqueaderos: 0.
Precio Estimado: 330.57 millones de COP.
Id: 1023
Razón: Aunque tiene un área construida relativamente grande, el precio estimado se encuentra dentro del límite de crédito preaprobado. El puntaje alto se debe principalmente al precio razonable y al área construida.
Oferta 2 (Popular):
Área Construida: 280 metros cuadrados.
Estrato: 3.
Baños: 3.
Habitaciones: 5.
Parqueaderos: 2.
Precio Estimado: 339.11 millones de COP.
Id: 7885
Razón: Esta oferta tiene un buen equilibrio entre área construida, número de habitaciones y baños, además de contar con parqueaderos adicionales. El precio estimado está dentro del límite de crédito.
Oferta 3 (Los Guayacanes):
Área Construida: 250 metros cuadrados.
Estrato: 3.
Baños: 4.
Habitaciones: 7.
Parqueaderos: 0.
Precio Estimado: 347.53 millones de COP.
Id: 200
Razón: A pesar de tener una gran cantidad de habitaciones y baños, esta oferta tiene un precio estimado que se encuentra dentro del límite de crédito. El puntaje se eleva debido a su amplitud.
Oferta 4 (VIPASA):
Área Construida: 264 metros cuadrados.
Estrato: 4.
Baños: 0.
Habitaciones: 0.
Parqueaderos: 0.
Precio Estimado: 327.50 millones de COP.
Id: 1753
Razón: El área construida es considerable y el precio estimado es razonable. El estrato 4 también contribuye al puntaje.
Oferta 5 (La Esmeralda):
Área Construida: 265 metros cuadrados.
Estrato: 3.
Baños: 3.
Habitaciones: 3.
Parqueaderos: 2.
Precio Estimado: 323.82 millones de COP.
Id: 1025
Razón: A pesar de tener un número moderado de habitaciones, esta oferta tiene un buen equilibrio entre área construida, baños y parqueaderos, lo que la hace atractiva. Además, el precio está dentro del límite de crédito.
Las ofertas seleccionadas representan una combinación de características deseables, como áreas construidas adecuadas, estrato, número de baños y habitaciones, y precios dentro del límite de crédito, lo que las hace atractivas para los compradores con diversas necesidades y preferencias.
Realice un filtro a la base de datos e incluya solo las ofertas de : base2: 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?).
data("vivienda", package = "paqueteMODELOS")
# Eliminar registros donde la columna zona = "NA"
vivienda <- subset(vivienda, zona != "NA")
# Reemplazar NA por 0 en la columna "parqueaderos"
vivienda$parqueaderos <- ifelse(is.na(vivienda$parqueaderos), 0, vivienda$parqueaderos)
# Reemplazar NA por 0 en la columna "piso"
vivienda$piso <- ifelse(is.na(vivienda$piso), 0, vivienda$piso)
base2 <- vivienda %>%
filter(tipo == "Apartamento", zona == "Zona Sur")
base2 <- subset(base2, tipo == "Apartamento" & zona == "Zona Sur")
head(base2, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona S… 05 4 290 96 1 2 3
## 2 698 Zona S… 02 3 78 40 1 1 2
## 3 8199 Zona S… 0 6 875 194 2 5 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
print(base2)
## # A tibble: 2,787 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona … 05 4 290 96 1 2 3
## 2 698 Zona … 02 3 78 40 1 1 2
## 3 8199 Zona … 0 6 875 194 2 5 3
## 4 1241 Zona … 0 3 135 117 0 2 3
## 5 5370 Zona … 0 3 135 78 0 1 3
## 6 6975 Zona … 06 4 220 75 1 2 3
## 7 5615 Zona … 08 3 210 72 2 2 3
## 8 6262 Zona … 0 3 105 68 0 2 3
## 9 7396 Zona … 0 3 115 58 1 2 2
## 10 6949 Zona … 0 4 220 84 0 2 3
## # ℹ 2,777 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
n_filas <- nrow(base2)
print(n_filas)
## [1] 2787
mapa <- leaflet(data = base2) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("Zona:", zona), radius = 2,color = "#2F4F4F")
mapa
En el mapa se observa que se se presentan valores en otras zonas diferentes a la “Zona Sur” , esto puede presentarse debido a:
Coordenadas geográficas incorrectas: Si los valores de longitud y latitud en los datos no son correctos, los marcadores en el mapa pueden aparecer en ubicaciones incorrectas.
Ambigüedad en los nombres de zonas: puede ser que la variable “zona” en los datos tenga categorías de zonas que no están claramente definidas o que hay errores tipográficos o de etiquetado en las categorías, es decir, viviendas con coordenadas de otras zonas se etiquetaron como “Zona Sur”.
Errores de codificación geográfica: Los datos geográficos, como las coordenadas de longitud y latitud, pueden estar mal codificados. Puede haber errores en la asignación de coordenadas a las viviendas, lo que haría que algunos puntos se muestren en ubicaciones incorrectas en el mapa.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) 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.
plot_area <- plot_ly(base2, x = ~areaconst, y = ~preciom, color = ~estrato,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Área:", areaconst)) %>%
layout(title = "Relación entre Precio y Área Construida",
xaxis = list(title = "Área Construida (m²)"),
yaxis = list(title = "Precio (millones COP)"))
plot_area
El gráfico utiliza el estrato como una variable categórica para colorear los puntos.
La dispersión de los puntos en el gráfico indica que hay variabilidad en los precios dentro de cada estrato y área construida.
La mayoría de los puntos se concentra en un rango de áreas construidas y precios, en este caso la mayor concentración se da en areas <= 200 m² y precios menores a 800 millones de pesos .
Se evidencia que en la zona sur de cali el area construida (m²) es más costosa que en la zona Norte
En la zona sur la mayoria de apartamentos se consiguen en areas menores a los 400m²
Plot_area_contorno <- ggplot(base2, aes(x = areaconst, y = preciom)) +
stat_density_2d(aes(fill = after_stat(level)), geom = "polygon") +
labs(title = "Distribución y Contorno de Precio y Área Construida",
x = "Área Construida (m²)",
y = "Precio (millones COP)")
Plot_area_contorno
Este gráfico muestra las áreas donde se concentran los valores altos de densidad.
En el gráfico se puede observar que las áreas donde se concentran los valores altos de densidad son las áreas <= 60 m² , lo que indica que apartamentos pequeños tiene mayor interés para la inversión.
tambien se observa que a partir de los 105m² los precios tienden a ser más altos en función del área construida.
hay un foco también de gran concentración de viviendas que son aquellos apartamentos que están alrededor de los 75 m² también hay que tenerlos en cuenta al momento de hacer una inversión en la zona sur de cali
options(warn = -1)
plot_estrato <- plot_ly(data = base2, x = ~estrato, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato)) %>%
layout(title = "Relación entre Precio y Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones COP)")) %>%
style(marker = list(color = "#2F4F4F"))
options(warn = 0)
plot_estrato
estadisticas_por_estrato <- base2 %>%
group_by(estrato) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_estrato
## # A tibble: 4 × 4
## estrato Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 3 141. 580 75
## 2 4 204. 645 78
## 3 5 294. 1250 93
## 4 6 594. 1750 128
Los datos muestran que a medida que aumenta el estrato, en general, el precio promedio de las viviendas tiende a aumentar. Por ejemplo, el estrato 6 tiene un precio promedio mucho más alto (1750 millones de COP) en comparación con el estrato 3 (580 millones de COP).
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada estrato. Por ejemplo : en el estrato 5, la variabilidad es alta, ya que el precio mínimo es de 93 millones de COP y el precio máximo es de 1,250 millones de COP, lo mismo sucede para el estrato 6 , el precio mínimo es 128 millones de COP mientras que el más costoso es 1750 millones de COP, lo que indica una gran variablilidad en los precios.
Los datos pueden ayudar a identificar estratos donde los precios son más altos en promedio, lo que puede ser útil para tomar decisiones sobre inversión inmobiliaria. por ejemplo del estrato 5 a 6 la diferencia son 300 millones de cop debido a que el promedio para el estrato 5 es de 294 millones COP mientras que para el estrato 6 el promedio es de 594 millones de COP.
promedio_por_estrato <- base2 %>%
group_by(estrato) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras <- plot_ly(data = promedio_por_estrato, x = ~estrato, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#2F4F4F")) %>%
layout(title = "Precio Promedio por Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio Promedio (millones COP)"))
plot_barras
El gráfico presenta el precio promedio de las viviendas para cada estrato en forma de barras. Esto facilita la comparación de los precios promedio entre estratos y puede ser útil para tomar decisiones de compra pues se conoce de antemano cuando se puede ofrecer por una vivienda dependiendo del estrato donde se encuentre ubicada.
Por ejemplo para estrato 4 sería una buena oferta viviendas cuyo costo fuera menor a los 203 millones de pesos, t para el estrato 6 apartamentos con costo menor a 594 millones sería una oferta buena a tener en cuenta.
options(warn = -1)
plot_banos <- plot_ly(data = base2, x = ~banios, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Baños:", banios)) %>%
layout(title = "Relación entre Precio y Número de Baños",
xaxis = list(title = "Número de Baños"),
yaxis = list(title = "Precio (millones COP)"))%>%
style(marker = list(color = "#2F4F4F"))
options(warn = 0)
plot_banos
estadisticas_por_banios <- base2 %>%
group_by(banios) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_banios
## # A tibble: 9 × 4
## banios Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 0 456. 1000 148
## 2 1 137. 320 75
## 3 2 221. 840 83
## 4 3 341. 1200 150
## 5 4 547. 1750 152
## 6 5 714. 1750 231
## 7 6 1063 1600 370
## 8 7 980 980 980
## 9 8 730 730 730
Los datos muestran una tendencia general de que a medida que aumenta el número de baños en las viviendas, el precio promedio tiende a aumentar. Por ejemplo, las viviendas con 1 baño tienen un precio promedio más bajo (137 millones de COP) en comparación con las viviendas con 8 baños (730 millones de COP).
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada grupo de baños. Por ejemplo, para viviendas con 3 baño, la variabilidad es alta, ya que el precio mínimo es de 150 millones de COP y el precio máximo es de 1200 millones de COP, lo mismo se puede observar para los estratos 4,5 y 6., la variablilidad de precios es muy alta.
Es interesante notar que para viviendas con 7 baños, el precio promedio es de 980 millones de COP y no hay variabilidad en el precio (el límite superior e inferior son iguales). Esto indica que hay un número limitado de viviendas con 7 baños en el conjunto de datos.
promedio_por_banios <- base2 %>%
group_by(banios) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras_banios <- plot_ly(data = promedio_por_banios, x = ~banios, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#2F4F4F")) %>%
layout(title = "Precio Promedio por Número de Baños",
xaxis = list(title = "No. de baños"), # Título del eje X
yaxis = list(title = "Precio Promedio (millones COP)")) # Título del eje Y
plot_barras_banios
Se observa que hay una tendencia general que a medida que aumenta el número de baños, tienden a aumentar los precios promedio a excepción de aquellos apartamentos que tienen 7 y 8 baños cuyos precios son menores a aquellos apartamentos que tienen 6 baños.
Basado en las observaciones, se recomienda comprar viviendas con 5 baños o menos ya que parece haber una ventaja en términos de precio promedio debido a que las viviendas con 6 y 7 baños el precio se dispara notablemente .
options(warn = -1)
plot_habitaciones <- plot_ly(data = base2, x = ~habitaciones, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Habitaciones:", habitaciones)) %>%
layout(title = "Relación entre Precio y Número de Habitaciones",
xaxis = list(title = "Número de Habitaciones"),
yaxis = list(title = "Precio (millones COP)"))%>%
style(marker = list(color = "#2F4F4F"))
options(warn = 0)
plot_habitaciones
estadisticas_por_habitaciones <- base2 %>%
group_by(habitaciones) %>%
summarize(Promedio = mean(preciom),
LimiteSuperior = max(preciom),
LimiteInferior = min(preciom))
estadisticas_por_habitaciones
## # A tibble: 7 × 4
## habitaciones Promedio LimiteSuperior LimiteInferior
## <dbl> <dbl> <dbl> <dbl>
## 1 0 333. 950 148
## 2 1 218. 320 93
## 3 2 204. 840 75
## 4 3 291. 1750 83
## 5 4 425. 1750 115
## 6 5 603. 1280 231
## 7 6 658 1500 155
La columna “Promedio” muestra el precio promedio de las viviendas para cada cantidad de habitaciones. Observamos que, en general, el precio promedio aumenta a medida que aumenta el número de habitaciones. Esto es coherente con la intuición de que viviendas con más habitaciones suelen tener precios más altos.
En general, se observa una tendencia creciente en el precio promedio a medida que aumenta el número de habitaciones, hasta llegar a un máximo en la categoría de viviendas con 6 habitaciones. A partir de allí, el precio promedio tiende a disminuir. Esto puede ser útil para entender cómo el número de habitaciones afecta el precio promedio de las viviendas .
Los límites superior e inferior proporcionan una idea de la variabilidad en los precios dentro de cada grupo de habitaciones. Por ejemplo, para viviendas con 3 habitaciones, la variabilidad es alta, ya que el precio mínimo es de 83 millones de COP y el precio máximo es de 1750 millones de COP, lomismo sucede con viviendas de 2, 4, 5 y 6 habitaciones, tienen una gran variabilidad de precios
Es importante destacar que para viviendas con 3 habitaciones, el precio promedio es de 291 millones de COP, pero una variabilidad considerable en los precios, esto indica que existen viviendas con 3 habitaciones que tienen precios diferentes dentro de ese rango, lo mismo sucede para 2, 4,5,6 habitaciones,.
promedio_por_habitaciones <- base2 %>%
group_by(habitaciones) %>%
summarize(PrecioPromedio = mean(preciom))
plot_barras_habitaciones <- plot_ly(data = promedio_por_habitaciones, x = ~habitaciones, y = ~PrecioPromedio,
type = "bar", text = ~paste("Precio Promedio:", round(PrecioPromedio, 2)),
marker = list(color = "#2F4F4F")) %>%
layout(title = "Precio Promedio por Número de Habitaciones",
xaxis = list(title = "No. de Habitaciones"), # Título del eje X
yaxis = list(title = "Precio Promedio (millones COP)")) # Título del eje Y
plot_barras_habitaciones
La gráfica de barras muestra el precio promedio de las viviendas en función del número de habitaciones. Cada barra representa un número específico de habitaciones, desde 1 hasta 6.
Se puede observar una tendencia general de que a medida que aumenta el número de habitaciones en las viviendas, el precio promedio tiende a incrementar. Esto sugiere que, en promedio, las viviendas con más habitaciones tienen un precio más alto en el mercado inmobiliario.
Notablemente, las viviendas con 6 habitaciones tienen el precio promedio más alto entre todas las categorías, superando el valor de 600 millones de COP. Por otro lado, las viviendas con 2 habitaciones tienen el precio promedio más bajo, alrededor de 204 millones de COP.
Es importante tener en cuenta que, aunque esta tendencia general es evidente, existe cierta variabilidad en los precios dentro de cada categoría de habitaciones, como se refleja en los límites superior e inferior. Esto sugiere que otros factores, además del número de habitaciones, pueden influir en los precios de las viviendas.
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).
modelo <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = base2)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = base2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1252.31 -42.15 -2.06 36.32 934.06
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -221.04614 13.47771 -16.401 < 2e-16 ***
## areaconst 1.46061 0.04876 29.956 < 2e-16 ***
## estrato 57.00608 2.79648 20.385 < 2e-16 ***
## banios 48.60871 3.04050 15.987 < 2e-16 ***
## habitaciones -22.71789 3.39549 -6.691 2.68e-11 ***
## parqueaderos 48.36353 3.02343 15.996 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 95.17 on 2781 degrees of freedom
## Multiple R-squared: 0.7536, Adjusted R-squared: 0.7531
## F-statistic: 1701 on 5 and 2781 DF, p-value: < 2.2e-16
Coeficientes de Regresión: Los coeficientes estimados para las variables independientes son los siguientes:
Intercepto (Intercept): -221.05
Área Construida (areaconst): 1.46
Estrato (estrato): 57.01
Número de Baños (banios): 48.61
Número de Habitaciones (habitaciones): -22.72
Número de Parqueaderos (parqueaderos): 48.36
Estos coeficientes indican cómo se relaciona cada variable independiente con la variable dependiente (precio de la vivienda). Por ejemplo, un aumento de una unidad en el estrato se asocia con un aumento promedio de 57.01 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.
Significancia Estadística: Los valores en la columna “Pr(>|t|)” indican la significancia estadística de cada coeficiente. Todos los coeficientes tienen valores muy cercanos a cero, lo que significa que son altamente significativos. Esto sugiere que todas las variables independientes son importantes para predecir el precio de la vivienda.
Bondad de Ajuste del Modelo:
R-cuadrado Múltiple (Multiple R-squared): 0.7536
R-cuadrado Ajustado (Adjusted R-squared): 0.7531
El R-cuadrado mide la proporción de la variabilidad en la variable dependiente que es explicada por el modelo. En este caso, el R-cuadrado es bastante alto (cerca de 0.75), lo que indica que el modelo explica aproximadamente el 75% de la variabilidad en el precio de la vivienda. El R-cuadrado ajustado tiene en cuenta la cantidad de variables en el modelo y es útil para modelos con múltiples predictores.
Error Residual Estándar: El error residual estándar es una medida de la variabilidad no explicada por el modelo. En este caso, el error residual estándar es de aproximadamente 95.17, lo que significa que, en promedio, las predicciones del modelo pueden diferir del valor real del precio de la vivienda en alrededor de 95.17 unidades.
F-Statistic: La prueba F se utiliza para evaluar si al menos una de las variables independientes tiene un efecto significativo en la variable dependiente. En este caso, el valor de F es alto (1701) y el p-value asociado es esencialmente cero, lo que indica que el modelo en su conjunto es estadísticamente significativo.
El modelo de regresión lineal múltiple parece ser una buena representación de los datos, con coeficientes significativos y un R-cuadrado bastante alto. Sin embargo, siempre es importante tener en cuenta el contexto y considerar si el modelo cumple con los supuestos de la regresión lineal antes de utilizarlo para hacer predicciones o tomar decisiones importantes. También se puede explorar el análisis de residuos para evaluar la validez de los supuestos del modelo.
# Calcular intervalos de confianza para los coeficientes
conf_int <- confint(modelo)
# Crear un data frame con los coeficientes y los intervalos de confianza
coef_df <- data.frame(Coefficient = rownames(conf_int),
Estimate = coef(modelo),
Lower = conf_int[, 1],
Upper = conf_int[, 2])
#Crear un gráfico de coeficientes con intervalos de confianza
coeficientes_IC_con_valores <- ggplot(coef_df, aes(x = Coefficient, y = Estimate)) +
geom_bar(stat = "identity", fill = "#2F4F4F") +
geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.5, color = "#FF0000") +
geom_text(aes(label = sprintf("%.2f", Estimate)), vjust = -0.5, color = "black", size = 3) + # Etiquetas con valores
labs(title = "Coeficientes del Modelo de Regresión Lineal",
x = "Variables Predictoras",
y = "Coeficiente Estimado") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
coeficientes_IC_con_valores
coeficientes <- coef(modelo)
interpretacion <- c("Intercepto", "Área Construida", "Estrato", "Baños", "Habitaciones", "Parqueaderos")
interpretacion <- paste(interpretacion, ": ", round(coeficientes, 4))
interpretacion
## [1] "Intercepto : -221.0461" "Área Construida : 1.4606"
## [3] "Estrato : 57.0061" "Baños : 48.6087"
## [5] "Habitaciones : -22.7179" "Parqueaderos : 48.3635"
Intercepto: El intercepto, representado como “-221.0461”, es el valor estimado de la variable dependiente (precio de la vivienda) cuando todas las variables independientes son iguales a cero. Sin embargo, en la práctica, es poco probable que todas las variables independientes sean cero, por lo que este valor es más relevante como un punto de partida para la predicción.
Área Construida: El coeficiente para el área construida, representado como “1.4606”, indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 1.4606 unidades en el precio de la vivienda.
Estrato: El coeficiente para el estrato, representado como “57.0061”, sugiere que, manteniendo todas las demás variables constantes, un aumento de una unidad en el estrato se asocia con un aumento de aproximadamente 57.0061 unidades en el precio de la vivienda.
Baños: El coeficiente para el número de baños, representado como “48.6087”, indica que, manteniendo todas las demás variables constantes, un baño adicional se asocia con un aumento de aproximadamente 48.6087 unidades en el precio de la vivienda.
Habitaciones: El coeficiente para el número de habitaciones, representado como “-22.7179”, sugiere que, manteniendo todas las demás variables constantes, una habitación adicional se asocia con una disminución de aproximadamente 22.7179 unidades en el precio de la vivienda. Esto puede ser inusual y debería ser revisado. Puede indicar una relación no lineal o una colinealidad con otras variables.
Parqueaderos: El coeficiente para el número de parqueaderos, representado como “48.3635”, indica que, manteniendo todas las demás variables constantes, un parqueadero adicional se asocia con un aumento de aproximadamente 48.3635 unidades en el precio de la vivienda.
Los coeficientes proporcionan información sobre cómo cada variable independiente contribuye al precio de la vivienda según el modelo. Es importante notar que estas interpretaciones asumen que se han satisfecho los supuestos de la regresión lineal y que las relaciones son lineales. Además, los valores exactos de estos coeficientes pueden depender de la escala de las variables originales, por lo que es importante tener en cuenta la estandarización de las variables si es necesario para una interpretación más precisa.
r2 <- summary(modelo)$r.squared
r2_interpretacion <- paste("El Coeficiente para R2: ", round(r2, 4))
r2_interpretacion
## [1] "El Coeficiente para R2: 0.7536"
El coeficiente de determinación (R^2) es una medida que varía entre 0 y 1, y representa la proporción de la variabilidad en la variable dependiente (precio de la vivienda) que es explicada por el modelo de regresión. En otras palabras, R^2 proporciona una idea de cuánto es mejor el modelo para predecir el precio de la vivienda en comparación con simplemente usar la media de los precios como predicción.
Un valor de R^2 de 0.7536 significa que aproximadamente el 75.36% de la variabilidad en el precio de la vivienda se puede explicar mediante las variables independientes incluidas en este modelo (área construida, estrato, número de baños, número de habitaciones y número de parqueaderos). Esto indica que el modelo tiene un buen ajuste a los datos y es capaz de explicar una parte significativa de la variabilidad en el precio de la vivienda.
Sin embargo, es importante tener en cuenta que R^2 por sí solo no indica si el modelo es adecuado para todos los propósitos. Se debería considerar otros aspectos, como la significancia estadística de los coeficientes individuales, la validez de los supuestos del modelo y la interpretación práctica de los resultados. Además, es posible que haya otras variables importantes que no se incluyeron en el modelo y que podrían explicar más variabilidad en el precio de la vivienda.
Un valor de R^2 de 0.7536 indica que el modelo tiene un buen poder explicativo en el contexto de las variables incluidas.
# valores observados y ajustados del modelo
valores_observados <- base2$preciom
valores_ajustados <- fitted(modelo)
# gráfico de ajuste
plot(valores_ajustados, valores_observados,
xlab = "Valores Ajustados", ylab = "Valores Observados",
main = "Gráfico de Ajuste - R^2 = 0.7536",
col = "#2F4F4F")
abline(0, 1, col = "red") # Línea de referencia para un ajuste perfecto
El gráfico compara los valores observados (precio real de las viviendas) con los valores ajustados predichos por el modelo de regresión lineal múltiple.
Valores Observados vs. Valores Ajustados: En el gráfico, los valores observados se representan en el eje vertical (eje Y) y los valores ajustados se representan en el eje horizontal (eje X). Cada punto en el gráfico representa una observación individual en el conjunto de datos.
Línea de Referencia Roja: La línea roja en el gráfico es la “Línea de Referencia para un Ajuste Perfecto”. Esta línea muestra dónde deberían estar los puntos si el modelo predijera exactamente los valores observados. En un ajuste perfecto, todos los puntos caerían sobre esta línea.
Distribución de los Puntos: La distribución de los puntos alrededor de la línea roja indica qué tan bien se ajusta tu modelo a los datos. en el gráfico se observa que los puntos se agrupan cerca de la línea roja, esto significa que el modelo está haciendo predicciones precisas.
R-cuadrado (R^2): El valor de R^2 = 0.7536 representa la proporción de la variabilidad en los datos que es explicada por el modelo. Cuanto más cerca estén los puntos de la línea roja y cuanto más se asemeje la dispersión de los puntos a una línea recta, mejor será el ajuste del modelo y más alto será el valor de R^2.
Evaluación Visual: Revisando la gráfica se observa que los puntos están cerca de la línea roja y siguen una tendencia lineal, es una indicación positiva de que el modelo está funcionando bien.
El gráfico de ajuste muestra que hay una correlación positiva entre los valores observados y los valores ajustados, lo que indica que el modelo de regresión lineal múltiple está capturando una parte significativa de la variabilidad en los precios de las viviendas.
# Calcular los residuos
residuos <- residuals(modelo)
# gráfico de residuos vs. valores ajustados
plot(valores_ajustados, residuos,
xlab = "Valores Ajustados", ylab = "Residuos",
main = "Gráfico de Residuos vs. Valores Ajustados",
col = "#2F4F4F")
abline(h = 0, col = "red") # Línea de referencia en cero para residuos
Este tipo de gráfico es una herramienta importante para evaluar la calidad de el modelo de regresión y la validez de sus supuestos.
Valores Ajustados vs. Residuos: En el gráfico, los valores ajustados (predichos por el modelo) se encuentran en el eje horizontal (eje X), y los residuos se encuentran en el eje vertical (eje Y).
Línea de Referencia en Cero (Línea Roja): La línea roja horizontal en el gráfico es la “Línea de Referencia en Cero para Residuos”. Esta línea indica dónde deberían estar los residuos si no hubiera errores sistemáticos en el modelo. Se puede decir que el modelo tiende a ser perfecto, porque los residuos se encuentran dispersos al azar alrededor de esta línea.
Distribución de los Residuos: La dispersión y la distribución de los residuos alrededor de la línea roja son cruciales para evaluar la validez del modelo.
Residuos Aleatorios: Idealmente, los residuos deberían estar dispersos al azar alrededor de la línea roja, sin mostrar patrones . al observar el gráfico sugiere que el modelo está capturando toda la información disponible en los datos.
Patrones en los Residuos: Si se observan patrones sistemáticos en los residuos (por ejemplo, una forma de embudo o una tendencia), esto puede ser una señal de que el modelo tiene problemas. Pueden indicar una falta de ajuste o la presencia de supuestos no cumplidos.
Heterocedasticidad: La variabilidad de los residuos debería ser constante en todos los niveles de los valores ajustados. Si se nota que la dispersión de los residuos cambia a medida que aumentan o disminuyen los valores ajustados, esto se llama heterocedasticidad y podría ser un problema.
Línea de Regresión: En algunos casos, se podría ajustar una línea de regresión a los residuos para detectar patrones más claramente. Si esta línea muestra una tendencia (por ejemplo, una pendiente positiva o negativa significativa), podría ser una señal de falta de ajuste en el modelo.
Al analizar este gráfico, se observa que los residuos estén dispersos al azar alrededor de la línea de referencia en cero, sin mostrar patrones sistemáticos. lo que indica claramente que no hay problemas en el modelo, como falta de ajuste o violación de los supuestos de regresión lo que indica que no hay necesidad de revisar o hacer ajustes al modelo.
# histograma de residuos
hist(residuos, breaks = 50,
xlab = "Residuos", ylab = "Frecuencia",
main = "Histograma de Residuos",
col = "#2F4F4F")
Distribución Normal: En el histograma, se puedes observar que los residuos tienen una forma de campana y están centrados alrededor de cero. es una señal positiva de que este supuesto se cumple.
Simetría: En el histograma se observa una distribución simétrica alrededor de cero, esto es un indicador positivo de que los residuos son aproximadamente normales.
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).
# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = base2)
# Obtener los residuos y los valores ajustados del modelo
residuos <- residuals(modelo)
valores_ajustados <- fitted(modelo)
# Crear un frame de datos con residuos y valores ajustados
data_residuos <- data.frame(Residuos = residuos, ValoresAjustados = valores_ajustados)
# gráfico de Residuos vs Valores Ajustados
ggplot(data_residuos, aes(x = ValoresAjustados, y = Residuos)) +
geom_point(color = "#2F4F4F") + # Gráfico de dispersión de puntos
geom_hline(yintercept = 0, linetype = "dashed", color = "red") + # Línea en y = 0
labs(title = "Gráfico de Residuos vs Valores Ajustados",
x = "Valores Ajustados",
y = "Residuos") +
theme_minimal()
Verificación de Homocedasticidad: En este gráfico se observa homocedasticidad, ya que los residuos están esparcidos de manera uniforme alrededor de la línea de regresión. Indica que el modelo es apropiado para los datos y que los errores no tienen una tendencia sistemática a volverse más grandes o más pequeños a medida que los valores de las variables predictoras cambian.
Residuos Atípicos (Outliers): Hay algunos puntos que se desvíen significativamente de la línea de referencia (línea roja). Estos puntos es la representación de residuos atípicos, indica observaciones inusuales.
Simetría alrededor de y = 0: Se observa que los puntos están distribuidos simétricamente alrededor de la línea de referencia en y = 0. esto sugiere que los residuos tienen una distribución aleatoria y no muestran ningún patrón sistemático, lo cual es positivo para el modelo .
qqnorm(residuos, main = "Residuos normalizados QQ (Quantile-Quantile)", xlab = "Cuantiles Teóricos", ylab = "Cuantiles Observados", col = "#2F4F4F")
qqline(residuos, col = "red")
Línea Roja: En el gráfico QQ, la línea roja representa una distribución normal perfecta. En este gráfico se observa que los puntos (cuantiles observados) están cerca de esta línea,lo cual significa que los residuos siguen una distribución normal. En otras palabras, esto indica que los residuos se distribuyen de manera similar a una distribución normal.
Puntos en la Línea Roja: Se observa que la mayoría de los puntos en el gráfico QQ están cerca de la línea roja, esto es una señal positiva de que los residuos se ajustan bien a una distribución normal.
Desviaciones de la Línea Roja: En la gráfica se observa que en os extremos los puntos se alejan significativamente de la línea roja en cualquier dirección, esto indica que los residuos no siguen una distribución normal para los cuartiles -3 y 3 . Las desviaciones de la línea roja en cualquiera de los extremos del gráfico pueden ser signos de residuos que no son normalmente distribuidos.
# Gráfico de la función de Autocorrelación parcial (PACF) de Residuos
pacf(residuos, main = "Autocorrelación parcial (PACF) de Residuos", xlab = "Lag", ylab = "PACF",col = "#2F4F4F")
El gráfico de la función de Autocorrelación Parcial (PACF) de los residuos es una herramienta útil para evaluar la independencia de los residuos en función del tiempo o del orden de observación.
Evaluación: En el gráfico PACF, se muestra la función de autocorrelación parcial de los residuos en función del “lag” o retraso. Los valores de la función PACF se representan en el eje y, mientras que el retraso (lag) se representa en el eje x. Se busca evaluar si los valores de la función PACF están dentro de las bandas de confianza (líneas punteadas) y si hay patrones significativos.
Interpretación: En este gráfico se observa que la mayoría de los valores PACF estén dentro de las bandas de confianza, lo que indica que no hay correlación significativa entre los residuos en función del tiempo. Los valores fuera de las bandas de confianza indican autocorrelación en los residuos.
Sugerencias: En este gráfico, la mayoría de los valores PACF están dentro de las bandas de confianza, lo que significa que los residuos son aproximadamente independientes en función del tiempo o del orden de observación. No se observan patrones significativos de autocorrelación.
El gráfico PACF de los residuos sugiere que los residuos son aproximadamente independientes en función del tiempo o del orden de observación, ya que la mayoría de los valores PACF están dentro de las bandas de confianza. Esto es una señal positiva en cuanto al supuesto de independencia de los residuos en un modelo de regresión. No se requieren correcciones importantes en este aspecto.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la segunda solicitud.
# Datos para la segunda solicitud
solicitud_2 <- data.frame(areaconst = 300,
estrato = 5,
habitaciones = 5,
parqueaderos = 3,
banios = 3)
# Realizar la predicción
precio_pred_2 <- predict(modelo, newdata = solicitud_2)
Precio_Vivienda_2 <- paste("La predicción para el precio de la vivienda para la segunda Solicitud es:", round(precio_pred_2, 2))
Precio_Vivienda_2
## [1] "La predicción para el precio de la vivienda para la segunda Solicitud es: 679.5"
El precio de la vivienda para la segunda solicitud es de aproximadamente 332,64 millones de COP, esta predicción se basa en las características específicas proporcionadas en la primera solicitud, como el área construida, el estrato, el número de habitaciones, parqueaderos y baños, utilizando el modelo de regresión lineal previamente ajustado
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.
# Calcular ofertas potenciales dentro del crédito preaprobado de 350 millones
credit_limit <- 850
# Crear una columna con las predicciones de precios en base2
base2 <- base2 %>%
mutate(pred_precio = predict(modelo))
# Filtrar ofertas potenciales
ofertas_potenciales <- base2 %>%
filter(pred_precio <= credit_limit)
# Ordenar ofertas_potenciales por la columna pred_precio en orden descendente
ofertas_potenciales_ordenadas <- ofertas_potenciales[order(-ofertas_potenciales$pred_precio), ]
# Crear una tabla con los resultados ordenados
tabla_ofertas <- datatable(
ofertas_potenciales_ordenadas,
extensions = 'Buttons', # Habilitar la extensión de botones
options = list(
paging = TRUE, # Activar paginación
searching = TRUE, # Activar búsqueda
lengthMenu = c(5, 10, 25, 50), # Opciones de longitud de página
pageLength = 10, # Longitud de página inicial
order = list(list(2, 'desc')), # Ordenar por la columna pred_precio en orden descendente
dom = 'Bfrtip', # Opciones de diseño con botones
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), # Botones de exportación
rownames = FALSE, # Ocultar números de fila
columnDefs = list(
list(className = 'dt-center', targets = '_all') # Centrar contenido de las celdas
)
)
)
# Imprimir la tabla
tabla_ofertas
| Variable | Peso % |
|---|---|
| areaconst | 20 |
| estrato | 10 |
| banios | 10 |
| habitaciones | 10 |
| parqueaderos | 10 |
| pred_precio | 40 |
# Asignar pesos a cada variable
peso_areaconst <- 0.2
peso_estrato <- 0.1
peso_banios <- 0.1
peso_habitaciones <- 0.1
peso_parqueaderos <- 0.1
peso_pred_precio <- 0.4
# Calcular un puntaje para cada oferta
ofertas_potenciales_ordenadas <- ofertas_potenciales_ordenadas %>%
mutate(
puntaje = peso_areaconst * areaconst +
peso_estrato * estrato +
peso_banios * banios +
peso_habitaciones * habitaciones +
peso_parqueaderos * parqueaderos +
peso_pred_precio * pred_precio
)
# Ordenar las ofertas potenciales por el campo "puntaje" en orden descendente
mejores_10_ofertas <- ofertas_potenciales_ordenadas %>%
arrange(desc(puntaje)) %>%
head(10)
# Mostrar las 10 mejores ofertas en una tabla interactiva
tabla_mejores_10_ofertas <- datatable(
mejores_10_ofertas,
options = list(paging = FALSE, searching = FALSE)
)
# Mostrar la tabla
tabla_mejores_10_ofertas
# Crear un mapa Leaflet
mapa_mejores_ofertas <- leaflet() %>%
addTiles()
# Obtener los datos de las 10 mejores ofertas desde la tabla
datos_mejores_ofertas <- as.data.frame(mejores_10_ofertas)
# Agregar marcadores al mapa usando los datos de la tabla
mapa_mejores_ofertas <- mapa_mejores_ofertas %>%
addMarkers(
data = datos_mejores_ofertas,
label = ~barrio,lng = ~longitud,lat = ~latitud,
popup = ~paste("Precio:", round(pred_precio, 2))
)
# Mostrar el mapa
mapa_mejores_ofertas
Oferta 1 (Pance - Apartamento - ID: 4526):
Área Construida: 520 metros cuadrados.
Estrato: 6.
Baños: 0.
Habitaciones: 5.
Parqueaderos: 0.
Precio Estimado: 766.92 millones de COP.
Razón: Aunque tiene un área construida muy amplia y un estrato alto, la falta de baños y parqueaderos resulta en un precio estimado muy alto en comparación con otras ofertas. Sin embargo, su puntaje es alto debido a su gran área construida.
Oferta 2 (Pance - Apartamento - ID: 5472):
Área Construida: 310 metros cuadrados.
Estrato: 6.
Baños: 4.
Habitaciones: 3.
Parqueaderos: 3.
Precio Estimado: 845.15 millones de COP.
Razón: A pesar de tener un precio estimado alto, esta oferta destaca por su cantidad de baños y parqueaderos, lo que la hace atractiva para compradores que valoran estos aspectos.
Oferta 3 (Pance - Apartamento - ID: 7176):
Área Construida: 344 metros cuadrados.
Estrato: 6.
Baños: 6.
Habitaciones: 4.
Parqueaderos: 0.
Precio Estimado: 824.22 millones de COP.
Razón: Esta oferta ofrece un gran número de baños y habitaciones, lo que podría ser adecuado para una familia numerosa. Sin embargo, su precio estimado es alto en comparación con otras ofertas similares.
Oferta 4 (Pance - Apartamento - ID: 6510):
Área Construida: 290 metros cuadrados.
Estrato: 6.
Baños: 5.
Habitaciones: 4.
Parqueaderos: 3.
Precio Estimado: 841.83 millones de COP.
Razón: Aunque tiene un precio estimado alto, esta oferta se destaca por tener una cantidad razonable de baños y parqueaderos. Su área construida también es adecuada.
Oferta 5 (Ciudad Jardín - Apartamento - ID: 6197):
Área Construida: 290 metros cuadrados.
Estrato: 6.
Baños: 4.
Habitaciones: 3.
Parqueaderos: 3.
Precio Estimado: 815.94 millones de COP.
Razón: Esta oferta tiene una buena cantidad de baños y parqueaderos, lo que la hace atractiva para familias. Aunque su precio estimado es alto, es una opción equilibrada.
Estas ofertas se seleccionaron en función de cómo se ajustan a las preferencias establecidas mediante los pesos asignados a las variables. Por ejemplo, algunas ofertas destacan por su amplitud, mientras que otras ofrecen una cantidad significativa de baños y parqueaderos. El precio estimado también fue un factor importante a considerar. En última instancia, las ofertas seleccionadas representan diferentes características y opciones para diferentes compradores potenciales.