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:
| Caracteristicas | Vivienda_1 | Vivienda_2 |
|---|---|---|
| Tipo | Casa | Apartamento |
| Área construida | 200 | 300 |
| Parqueaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 o 5 | 5 o 6 |
| Zona | Norte | Sur |
| Crédito preaprobado | 350 millones | 850 millones |
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).
Datos: los datos de los últimos tres meses se adjuntan en la base que puede obtener con el siguiente código en R:
| variable | descripcion |
|---|---|
| zona | ubicacion de la vivienda: Zona Centro, Zona Norte,… |
| piso | piso que ocupa la vivienda: primer piso, segundo piso… |
| estrato | estrato socio-economico: 3,4,5,6 |
| preciom | precio de la vivienda en millones de pesos |
| areaconst | area construida |
| parqueaderos | numero de parqueaderos |
| banios | numero de banios |
| habitaciones | numero de habitaciones |
| tipo | tipo de vivienda: Casa, Apartamento |
| barrio | barrio de ubicacion de la vivienda: 20 de Julio, alamos,… |
| longitud | coordenada geografica |
| latitud | coordenada geografica |
# Cargar base de datos
if (!requireNamespace("devtools", quietly = TRUE)) {
install.packages("devtools")
}
devtools::install_github("dgonxalex80/paqueteMODELOS", force =TRUE)
## Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
## digest (0.6.34 -> 0.6.35) [CRAN]
## curl (5.2.0 -> 5.2.1 ) [CRAN]
## Installing 2 packages: digest, curl
## Installing packages into 'C:/Users/PSL/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'digest' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'digest'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\PSL\AppData\Local\R\win-library\4.3\00LOCK\digest\libs\x64\digest.dll
## a C:\Users\PSL\AppData\Local\R\win-library\4.3\digest\libs\x64\digest.dll:
## Permission denied
## Warning: restored 'digest'
## package 'curl' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'curl'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\PSL\AppData\Local\R\win-library\4.3\00LOCK\curl\libs\x64\curl.dll a
## C:\Users\PSL\AppData\Local\R\win-library\4.3\curl\libs\x64\curl.dll: Permission
## denied
## Warning: restored 'curl'
##
## The downloaded binary packages are in
## C:\Users\PSL\AppData\Local\Temp\RtmpmY816T\downloaded_packages
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file 'C:\Users\PSL\AppData\Local\Temp\RtmpmY816T\remotes4d707f2640f9\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
checking for file 'C:\Users\PSL\AppData\Local\Temp\RtmpmY816T\remotes4d707f2640f9\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ...
✔ checking for file 'C:\Users\PSL\AppData\Local\Temp\RtmpmY816T\remotes4d707f2640f9\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' (538ms)
##
─ preparing 'paqueteMODELOS': (422ms)
## checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ building 'paqueteMODELOS_0.1.0.tar.gz'
##
##
## Installing package into 'C:/Users/PSL/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
data("vivienda")
print("Datos cargados correctamente")
## [1] "Datos cargados correctamente"
knitr::kable(head(vivienda, 10), caption = "Base de Datos Vivienda")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 01 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
| 2326 | Zona Norte | 01 | 4 | 220 | 52 | 2 | 2 | 3 | Apartamento | acopi | -76.51974 | 3.42627 |
| 4386 | Zona Norte | 01 | 5 | 310 | 137 | 2 | 3 | 4 | Apartamento | acopi | -76.53105 | 3.38296 |
| 1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
# Resumen de la base de datos
summary(vivienda)
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Crear la nueva columna "base"
vivienda <- vivienda %>%
mutate(base = case_when(
zona == "Zona Norte" & tipo == "Casa" ~ "Base 1",
zona == "Zona Centro" & tipo == "Casa" ~ "Base 2",
zona == "Zona Oeste" & tipo == "Casa" ~ "Base 3",
zona == "Zona Oriente" & tipo == "Casa" ~ "Base 4",
zona == "Zona Sur" & tipo == "Casa" ~ "Base 5",
TRUE ~ NA_character_
))
# Mostrar los primeros 10 registros para verificar
head(vivienda, 10)
## # A tibble: 10 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … <NA> 3 250 70 1 3 6
## 2 1169 Zona … <NA> 3 320 120 1 2 3
## 3 1350 Zona … <NA> 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Filtrar datos para incluir solo casas de la zona norte
base1 <- filter(vivienda, base == "Base 1")
# Mostrar los primeros 3 registros
head(base1, 3)
## # A tibble: 3 × 14
## 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 NA 7 6
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Comprobación de la consulta
table(base1$tipo)
##
## Casa
## 722
table(base1$zona)
##
## Zona Norte
## 722
table(base1$base)
##
## Base 1
## 722
# Instalar y cargar librerías necesarias
if (!requireNamespace("leaflet", quietly = TRUE)) {
install.packages("leaflet")
}
if (!requireNamespace("dplyr", quietly = TRUE)) {
install.packages("dplyr")
}
library(leaflet)
library(dplyr)
# Filtrar viviendas de tipo casa
vivienda_casas <- subset(vivienda, tipo == "Casa")
# Filtrar viviendas de tipo casa en la zona norte
vivienda_casasNorte <- subset(vivienda, tipo == "Casa" & zona == "Zona Norte")
# Convertir la columna "base" a tipo character
vivienda_casasNorte$base <- as.character(vivienda_casasNorte$base)
# Crear el mapa de la zona norte con las viviendas filtradas
mapaNorte <- leaflet(vivienda_casasNorte) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#FF3030", radius = 3)
# Mostrar el mapa de la zona norte
mapaNorte
Dado que se observan registros de la base 1: Zona Norte que no están ubicados geográficamente en la zona norte de la ciudad en el mapa, es probable que haya habido errores en la asignación de la zona de estas viviendas en la base de datos. Esto puede deberse a errores humanos en la captura de datos o a problemas con la calidad de los datos.
# Instalar "plotly"
if (!requireNamespace("plotly", quietly = TRUE)) {
install.packages("plotly")
}
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
# Crear un gráfico de dispersión 3D interactivo para explorar la relación entre el precio, el área construida, el estrato y el número de baños, coloreado por la zona
plot1 <- plot_ly(vivienda_casas, x = ~areaconst, y = ~estrato, z = ~banios, color = ~preciom,
colors = c('#0000FF', '#00FF00', '#FF0000', '#FFFF00', '#FF00FF'),
marker = list(size = 5, opacity = 0.5),
type = "scatter3d", mode = "markers", text = ~paste("Zona: ", zona)) %>%
layout(scene = list(xaxis = list(title = "Area Construida"),
yaxis = list(title = "Estrato"),
zaxis = list(title = "Baños"),
aspectmode = "cube"))
# Crear un gráfico de dispersión 2D interactivo para explorar la relación entre el precio y el número de habitaciones, coloreando por la zona
plot2 <- plot_ly(vivienda_casas, x = ~habitaciones, y = ~preciom, color = ~zona,
colors = c('#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'),
marker = list(size = 5, opacity = 0.5),
type = "scatter", mode = "markers", text = ~paste("Zona: ", zona)) %>%
layout(xaxis = list(title = "Habitaciones"),
yaxis = list(title = "Precio"))
# Mostrar los gráficos
subplot(plot1, plot2)
## Warning: 'layout' objects don't have these attributes: 'NA'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Visualización de la correlación
# Gráfico de correlación entre precio y área construida
plot_cor_area <- plot_ly(vivienda_casas, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Blue")
plot_cor_area <- plot_cor_area %>% layout(title = "Correlación entre Precio y Área Construida", xaxis = list(title = "Área Construida"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y estrato
plot_cor_estrato <- plot_ly(vivienda_casas, x = ~estrato, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Red")
plot_cor_estrato <- plot_cor_estrato %>% layout(title = "Correlación entre Precio y Estrato", xaxis = list(title = "Estrato"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y número de baños
plot_cor_banios <- plot_ly(vivienda_casas, x = ~banios, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Green")
plot_cor_banios <- plot_cor_banios %>% layout(title = "Correlación entre Precio y Número de Baños", xaxis = list(title = "Número de Baños"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y número de habitaciones
plot_cor_habitaciones <- plot_ly(vivienda_casas, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Orange")
plot_cor_habitaciones <- plot_cor_habitaciones %>% layout(title = "Correlación entre Precio y Número de Habitaciones", xaxis = list(title = "Número de Habitaciones"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y zona
plot_cor_zona <- plot_ly(vivienda_casas, x = ~zona, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Yellow")
plot_cor_zona <- plot_cor_zona %>% layout(title = "Correlación entre Precio y Zona", xaxis = list(title = "Zona"), yaxis = list(title = "Precio"))
# Mostrar los gráficos
subplot(plot_cor_area, plot_cor_estrato, plot_cor_banios, plot_cor_habitaciones, plot_cor_zona)
Precio Vs área construida: el gráfico 1 muestra la relación entre el precio de las casas y el área construida. Se observa una correlación positiva, es decir, a mayor área construida, mayor precio.El área construida es un factor importante que influye en el precio del inmueble. Las casas con mayor área construida generalmente tienen un precio más alto, aunque hay otros factores que también pueden influir en el precio, como la ubicación, el número de habitaciones y baños, y las condiciones del mercado.
Precio vs estrato: se evidencia en el gráfico 2 una tendencia positiva entre el estrato y el precio del inmueble, lo que sugiere que, en general, a medida que aumenta el estrato, también lo hace el precio. Sin embargo, es importante destacar que la relación no es perfecta, ya que hay puntos dispersos que se alejan de esta tendencia general. Esto indica que aunque el estrato es un factor significativo, no es el único que influye en el precio del apartamento.
Previo vs número de baños: en el gráfico 3 la dispersión de puntos sugiere una falta de una relación lineal clara entre el precio de las casas y el número de baños. Se identifica una tendencia a que las casas con más baños tengan precios más altos.El número de baños explica solo una parte de la variación en el precio de las casas.En conclusión, se evidencia una correlación positiva entre el precio de la casa y el número de baños. Aunque hay una ligera tendencia a que los apartamentos con más baños tengan precios más altos, esta relación no es estadísticamente significativa y otros factores pueden estar influyendo más en el precio del inmueble.
Precio Vs número de habitaciones: en el gráfico 4 no se identifica una relación lineal clara entre el precio y el número de habitaciones, ya que los puntos están dispersos en varias direcciones. Se evidencia una débil tendencia a que las casas con más habitaciones tiendan a tener precios más altos. Sin embargo, el número de habitaciones explica solo una pequeña parte de la variación en el precio del inmueble. En conclusión, no se encuentra una correlación significativa entre el precio de la casa y el número de habitaciones. Aunque existe una leve tendencia a que las casas con más habitaciones tengan precios más altos, esta relación no alcanza significancia estadística, lo que sugiere que otros factores pueden estar ejerciendo una influencia más importante en el precio del inmueble.
Precio vs Zona: El análisis visual de la imagen revela patrones interesantes sobre los precios de las casas en diferentes zonas: las zonas oeste y sur exhiben los precios más altos, mientras que la zona centro y la zona oriente muestran precios más económicos, lo que sugiere una diferencia significativa en los precios de las casas entre las diversas zonas analizadas. Esta observación resalta la importancia de la ubicación geográfica al determinar el precio de las casas, lo que puede ser de interés para Maria.
library(ggplot2)
library(GGally)
# Seleccionar las variables relevantes
cor_1 <- vivienda_casas[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "zona")]
# Crear la matriz de gráficos
ggpairs(cor_1, title = "Correlaciones en 'vivienda'")
## `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`.
La variable de respuesta, es decir, el precio de las casas, muestra correlaciones positivas significativas con el área construida, el número de baños y el estrato, según lo indicado en la matriz de correlaciones. Además, se observa una correlación positiva, aunque muy débil, entre el precio y el número de habitaciones. Estos hallazgos sugieren que el área construida es la variable que más influye en el precio del inmueble, seguida por el estrato y el número de baños. Aunque el número de habitaciones también influye, su efecto es relativamente más débil en comparación con las otras variables mencionadas.
# Modelo de regresiòn lineal
# Ajustar el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda_casas)
# Resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = vivienda_casas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1190.80 -114.52 -25.94 74.59 986.16
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -413.87536 25.58852 -16.174 < 2e-16 ***
## areaconst 0.74227 0.02941 25.235 < 2e-16 ***
## estrato 116.07109 5.26618 22.041 < 2e-16 ***
## habitaciones -14.74995 3.18137 -4.636 3.73e-06 ***
## parqueaderos 64.29943 3.47719 18.492 < 2e-16 ***
## banios 39.03498 4.05083 9.636 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 205.2 on 2480 degrees of freedom
## (733 observations deleted due to missingness)
## Multiple R-squared: 0.6834, Adjusted R-squared: 0.6828
## F-statistic: 1071 on 5 and 2480 DF, p-value: < 2.2e-16
El modelo de regresión lineal múltiple estimado muestra que todas las variables independientes son estadísticamente significativas para predecir el precio de las casas (p < 0.05). El coeficiente de cada variable representa el cambio promedio esperado en el precio por metro cuadrado por unidad de aumento en la variable independiente, manteniendo constantes las demás variables. Todos los coeficientes son estadísticamente significativos (valor p < 0.001), lo que indica que tienen un impacto real sobre el precio de la vivienda.
El coeficiente de determinación (R^2) del modelo es 0.6834, lo que significa que alrededor del 68.34% de la variabilidad en el precio de la casa se explica por las variables incluidas en el modelo. Esto sugiere que el modelo tiene un ajuste razonablemente bueno a los datos observados
Para mejorar el modelo, podríamos considerar incluir interacciones entre las variables, explorar transformaciones para variables no lineales y agregar variables adicionales que puedan mejorar la capacidad predictiva del modelo. Además, podríamos realizar diagnósticos de los residuos para verificar la validez de las suposiciones subyacentes del modelo de regresión lineal.
4.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).
# Paso 1: Verificar la linealidad de la relación
# Gráfico de dispersión de valores ajustados vs residuos
plot(modelo$fitted.values, modelo$residuals, main = "Linealidad de la Relación",
xlab = "Valores Ajustados", ylab = "Residuos", col = "green")
En el análisis del gráfico de linealidad de la relación, se percibe una ligera tendencia curvilínea en la dispersión de los puntos, con algunos puntos desviándose de la línea horizontal, especialmente en la parte superior del gráfico. Aunque no se observa una clara evidencia de no linealidad, estas señales sugieren que la relación entre las variables podría no ser completamente lineal.
# Paso 2: Comprobar la normalidad de los residuos
# Gráfico Q-Q de los residuos estandarizados
qqnorm(modelo$residuals, main = "Normalidad de los Residuos", col = "pink")
qqline(modelo$residuals)
El análisis del gráfico revela que, si bien la mayoría de los puntos se aproximan a la línea diagonal, existen desviaciones leves en la parte superior e inferior del gráfico, indicando la presencia de algunos residuos con valores más extremos de lo esperado en una distribución normal. Aunque no se evidencia de manera contundente que los residuos no se ajusten a una distribución normal, estas señales sugieren que la normalidad podría no ser perfecta.
# Paso 3: Evaluar la homogeneidad de la varianza
# Gráfico de dispersión de valores ajustados vs residuos estandarizados
plot(modelo$fitted.values, sqrt(abs(modelo$residuals)), main = "Homogeneidad de la Varianza",
xlab = "Valores Ajustados", ylab = "Raíz Cuadrada de los Residuos Estándarizados", , col = "red")
El análisis del grafico revela algunas señales que sugieren que la relación entre las variables podría no ser completamente lineal y que la normalidad de los residuos podría no ser perfecta.
# Paso 4: Verificar la independencia de los residuos
# Gráfico de residuos vs índice de observación
plot(modelo$residuals, main = "Independencia de los Residuos",
xlab = "Índice de Observación", ylab = "Residuos", , col = "blue")
La interpretación del gráfico de residuos vs índices de observación permite evaluar el supuesto de homocedasticidad, que implica una varianza constante de los residuos a lo largo de todas las observaciones. Observar una dispersión aleatoria de los residuos alrededor de la línea horizontal indicaría que se cumple este supuesto, mientras que la presencia de un patrón en la dispersión, como una tendencia creciente o decreciente, sugeriría heterocedasticidad. En el gráfico proporcionado, se observa una ligera tendencia creciente en la dispersión de los residuos, lo que sugiere que la homocedasticidad podría no ser perfecta.
# Paso 5: Identificar puntos influyentes y valores atípicos
# Gráfico de valores de Cook's distance
plot(cooks.distance(modelo), pch = 20, main = "Valores de Cook's Distance", , col = "orange")
La interpretación del gráfico de influencia de Cook revela la identificación de puntos que ejercen un mayor impacto en la estimación de los coeficientes del modelo de regresión lineal. Al observar el gráfico proporcionado, se destaca un punto con una distancia de Cook significativamente superior a 1, indicando su condición como punto altamente influyente. Esta observación resalta la importancia de examinar detalladamente este punto para evaluar si su exclusión del modelo es pertinente o si debe conservarse, dado su potencial impacto en la precisión de los coeficientes estimados.
# Resumen de los residuos del modelo
summary_resid <- summary(modelo$residuals)
print("Resumen de los residuos del modelo:")
## [1] "Resumen de los residuos del modelo:"
print(summary_resid)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1190.80 -114.52 -25.94 0.00 74.59 986.16
El resumen de los residuos del modelo muestra que la mediana de los residuos es -25.94, con un rango que va desde -1190.80 hasta 986.16, lo que sugiere cierta variabilidad en los errores del modelo. La media de los residuos es aproximadamente cero, lo cual es deseable en un buen modelo. Sin embargo, los residuos presentan una gran dispersión, como se evidencia en el rango intercuartílico. Esto podría indicar que el modelo no captura completamente la variabilidad en los datos o que hay otros factores no considerados que influyen en la respuesta.
# Prueba t para la media de los residuos
t_test <- t.test(modelo$residuals, mu = 0)
print("Prueba t para la media de los residuos:")
## [1] "Prueba t para la media de los residuos:"
print(t_test)
##
## One Sample t-test
##
## data: modelo$residuals
## t = 3.62e-15, df = 2485, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -8.063801 8.063801
## sample estimates:
## mean of x
## 1.488619e-14
La prueba t para la media de los residuos arrojó un valor t de 3.62e-15 con un p-valor de 1, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de que la media de los residuos es igual a cero. Por lo tanto, no hay evidencia estadística de sesgo en los residuos del modelo.
# Prueba de Breusch-Godfrey para autocorrelación
bg_test <- lmtest::bgtest(modelo)
print("Prueba de Breusch-Godfrey para autocorrelación de los residuos:")
## [1] "Prueba de Breusch-Godfrey para autocorrelación de los residuos:"
print(bg_test)
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: modelo
## LM test = 112.79, df = 1, p-value < 2.2e-16
La prueba de Breusch-Godfrey para autocorrelación de orden 1 arroja un valor de p-valor menor que 2.2e-16, lo que indica que existe evidencia estadísticamente significativa de autocorrelación de orden 1 en los residuos del modelo. La existencia de autocorrelación de orden 1 significa que los residuos del modelo no son independientes entre sí. Esto puede afectar la eficiencia de los estimadores del modelo y la validez de las pruebas de significancia.
# Coeficientes del modelo
intercepto <- -380.7629
coef_areaconst <- 0.74227
coef_estrato <- c(116.07109, 116.07109) # Coeficiente para estrato 4 y estrato 5
coef_parqueaderos <- 64.29943
coef_banios <- 39.03498
coef_habitaciones <- -14.74995
# Características de la primera solicitud
areaconst <- c(200, 200)
estrato <- c(4, 5)
parqueaderos <- c(1, 1)
banios <- c(2, 2)
habitaciones <- c(4, 4)
# Calcular la predicción para la primera solicitud
prediccion_vivienda1 <- intercepto + coef_areaconst * areaconst[1] +
coef_estrato[1] * estrato[1] + coef_parqueaderos * parqueaderos[1] +
coef_banios * banios[1] + coef_habitaciones * habitaciones[1]
# Imprimir el precio predicho para la primera solicitud
print(prediccion_vivienda1)
## [1] 315.3451
El precio de la vivienda predicho para las características de la primera solicitud es de $315.345.100 pero se debe tener en cuenta que esta es solo una estimación y el precio real puede ser mayor o menor.
# Filtrar las casas de acuerdo con los criterios especificados
Casa <- filter(vivienda_casas,
areaconst >= 200,
parqueaderos >= 1,
banios >= 2,
habitaciones >= 4,
zona == "Zona Norte",
estrato >= 4,
estrato <= 5,
preciom <= 350)
print(Casa)
## # A tibble: 34 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4210 Zona … 01 5 350 200 3 3 4
## 2 4267 Zona … 01 5 335 202 1 4 5
## 3 4800 Zona … 01 5 340 250 2 4 4
## 4 4209 Zona … 02 5 350 300 3 5 6
## 5 4422 Zona … 02 5 350 240 2 3 6
## 6 4458 Zona … 02 4 315 270 2 4 4
## 7 4483 Zona … 02 5 342 250 1 4 6
## 8 1009 Zona … <NA> 5 250 243 1 4 5
## 9 1270 Zona … <NA> 5 350 203 2 2 5
## 10 3352 Zona … <NA> 4 335 300 3 4 4
## # ℹ 24 more rows
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Calcular el precio mínimo y máximo de las casas filtradas
precio_minimo <- min(Casa$preciom)
precio_maximo <- max(Casa$preciom)
# Imprimir los precios mínimo y máximo
cat("Precio mínimo de las casas filtradas:", precio_minimo, "\n")
## Precio mínimo de las casas filtradas: 230
cat("Precio máximo de las casas filtradas:", precio_maximo, "\n")
## Precio máximo de las casas filtradas: 350
# Crear un mapa de las casas
mapaCasas <- leaflet(Casa) %>%
# Agregar azulejos base
addTiles() %>%
# Agregar marcadores circulares para las casas
addCircleMarkers(
lng = ~longitud, # Longitud de las casas
lat = ~latitud, # Latitud de las casas
color = ~rainbow(nrow(Casa)), # Generar una secuencia de colores utilizando la función rainbow()
radius = 4 # Radio de los marcadores
)
# Mostrar el mapa de las casas
mapaCasas
Al analizar los datos, se observa una amplia gama de casas disponibles en la zona Norte, cada una con características y precios diversos. Estas propiedades varían significativamente en términos de estrato, lo que influye directamente en su precio y las comodidades que ofrecen. Además, es notable que algunas de estas casas cuentan con un mayor número de habitaciones y baños, sugiriendo espacios más amplios y con más comodidades.
Es importante destacar que todas estas propiedades tienen un precio por debajo de los 350 millones de pesos, lo que las hace accesibles para una variedad de presupuestos.
En resumen, la zona Norte brinda una amplia oferta de viviendas que se adaptan a diversas necesidades y preferencias. La diversidad en las características de estas casas permite a los potenciales compradores encontrar la opción perfecta que se ajuste tanto a sus requisitos de espacio como a su presupuesto disponible.
Repetir el punto 1 al 6 para la solicitud 2:
Realice un filtro a la base de datos e incluya solo las ofertas de : base5: apartamento, 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?).
# Crear la nueva columna "base"
vivienda <- vivienda %>%
mutate(base = case_when(
zona == "Zona Norte" & tipo == "Apartamento" ~ "Base 1",
zona == "Zona Centro" & tipo == "Apartamento" ~ "Base 2",
zona == "Zona Oeste" & tipo == "Apartamento" ~ "Base 3",
zona == "Zona Oriente" & tipo == "Apartamento" ~ "Base 4",
zona == "Zona Sur" & tipo == "Apartamento" ~ "Base 5",
TRUE ~ NA_character_
))
# Mostrar los primeros 10 registros para verificar
head(vivienda, 10)
## # A tibble: 10 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … <NA> 3 250 70 1 3 6
## 2 1169 Zona … <NA> 3 320 120 1 2 3
## 3 1350 Zona … <NA> 3 350 220 2 2 4
## 4 5992 Zona … 02 4 400 280 3 5 3
## 5 1212 Zona … 01 5 260 90 1 2 3
## 6 1724 Zona … 01 5 240 87 1 3 3
## 7 2326 Zona … 01 4 220 52 2 2 3
## 8 4386 Zona … 01 5 310 137 2 3 4
## 9 1209 Zona … 02 5 320 150 2 4 6
## 10 1592 Zona … 02 5 780 380 2 3 3
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Filtrar datos para incluir solo apartamentos de la zona sur
base5 <- filter(vivienda, base == "Base 5")
# Mostrar los primeros 3 registros
head(base5, 3)
## # A tibble: 3 × 14
## 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… <NA> 6 875 194 2 5 3
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Comprobación de la consulta
table(base5$tipo)
##
## Apartamento
## 2787
table(base5$zona)
##
## Zona Sur
## 2787
table(base5$base)
##
## Base 5
## 2787
# Instalar y cargar librerías necesarias
if (!requireNamespace("leaflet", quietly = TRUE)) {
install.packages("leaflet")
}
if (!requireNamespace("dplyr", quietly = TRUE)) {
install.packages("dplyr")
}
library(leaflet)
library(dplyr)
# Filtrar viviendas de tipo casa
vivienda_apartamento <- subset(vivienda, tipo == "Apartamento")
# Filtrar viviendas de tipo casa en la zona norte
vivienda_apartamentoSur <- subset(vivienda, tipo == "Apartamento" & zona == "Zona Sur")
# Convertir la columna "base" a tipo character
vivienda_apartamentoSur$base <- as.character(vivienda_apartamentoSur$base)
# Crear el mapa de la zona sur con las viviendas filtradas
mapaSur <- leaflet(vivienda_apartamentoSur) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#FF3", radius = 3)
# Mostrar el mapa de la zona norte
mapaSur
Dado que se observan registros de la base 5: Zona Sur que no están ubicados geográficamente en la zona sur de la ciudad en el mapa, es probable que haya habido errores en la asignación de la zona de estas viviendas en la base de datos. Esto puede deberse a errores humanos en la captura de datos o a problemas con la calidad de los datos.
# Instalar "plotly"
if (!requireNamespace("plotly", quietly = TRUE)) {
install.packages("plotly")
}
library(plotly)
# Crear un gráfico de dispersión 3D interactivo para explorar la relación entre el precio, el área construida, el estrato y el número de baños, coloreado por la zona
plot1 <- plot_ly(vivienda_apartamento, x = ~areaconst, y = ~estrato, z = ~banios, color = ~preciom,
colors = c('#0000FF', '#00FF00', '#FF0000', '#FFFF00', '#FF00FF'),
marker = list(size = 5, opacity = 0.5),
type = "scatter3d", mode = "markers", text = ~paste("Zona: ", zona)) %>%
layout(scene = list(xaxis = list(title = "Area Construida"),
yaxis = list(title = "Estrato"),
zaxis = list(title = "Baños"),
aspectmode = "cube"))
# Crear un gráfico de dispersión 2D interactivo para explorar la relación entre el precio y el número de habitaciones, coloreando por la zona
plot2 <- plot_ly(vivienda_apartamento, x = ~habitaciones, y = ~preciom, color = ~zona,
colors = c('#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'),
marker = list(size = 5, opacity = 0.5),
type = "scatter", mode = "markers", text = ~paste("Zona: ", zona)) %>%
layout(xaxis = list(title = "Habitaciones"),
yaxis = list(title = "Precio"))
# Mostrar los gráficos
subplot(plot1, plot2)
## Warning: 'layout' objects don't have these attributes: 'NA'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Visualización de la correlación
# Gráfico de correlación entre precio y área construida
plot_cor_area <- plot_ly(vivienda_apartamento, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Blue")
plot_cor_area <- plot_cor_area %>% layout(title = "Correlación entre Precio y Área Construida", xaxis = list(title = "Área Construida"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y estrato
plot_cor_estrato <- plot_ly(vivienda_apartamento, x = ~estrato, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Red")
plot_cor_estrato <- plot_cor_estrato %>% layout(title = "Correlación entre Precio y Estrato", xaxis = list(title = "Estrato"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y número de baños
plot_cor_banios <- plot_ly(vivienda_apartamento, x = ~banios, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Green")
plot_cor_banios <- plot_cor_banios %>% layout(title = "Correlación entre Precio y Número de Baños", xaxis = list(title = "Número de Baños"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y número de habitaciones
plot_cor_habitaciones <- plot_ly(vivienda_apartamento, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Orange")
plot_cor_habitaciones <- plot_cor_habitaciones %>% layout(title = "Correlación entre Precio y Número de Habitaciones", xaxis = list(title = "Número de Habitaciones"), yaxis = list(title = "Precio"))
# Gráfico de correlación entre precio y zona
plot_cor_zona <- plot_ly(vivienda_apartamento, x = ~zona, y = ~preciom, type = "scatter", mode = "markers", marker = list(color = ~zona), colors = "Yellow")
plot_cor_zona <- plot_cor_zona %>% layout(title = "Correlación entre Precio y Zona", xaxis = list(title = "Zona"), yaxis = list(title = "Precio"))
# Mostrar los gráficos
subplot(plot_cor_area, plot_cor_estrato, plot_cor_banios, plot_cor_habitaciones, plot_cor_zona)
Precio Vs área construida: el análisis del Gráfico 1 muestra una correlación positiva entre el precio de los apartamentos y el área construida. Este hallazgo sugiere que, en promedio, a medida que aumenta el área construida, también lo hace el precio del inmueble.
Precio vs estrato: el Gráfico 2 evidencia una tendencia positiva entre el estrato y el precio del inmueble, lo que indica que, en general, a medida que aumenta el estrato, también lo hace el precio. No obstante, se observa dispersión en los datos, lo que sugiere que el estrato no es el único determinante del precio. Otros factores pueden estar influyendo en la variabilidad del precio de los apartamentos.
Precio vs número de baños:la dispersión de puntos en el Gráfico 3 sugiere una relación menos definida entre el precio de los apartamentos y el número de baños. Aunque se identifica una tendencia a que los apartamentos con más baños tengan precios más altos, esta relación no es estadísticamente significativa, lo que indica que el número de baños explica solo una parte limitada de la variación en el precio de los apartamentos. Otros factores deben considerarse al determinar el precio de un inmueble.
Precio Vs número de habitaciones:el Gráfico 4 muestra una dispersión de puntos en varias direcciones, lo que sugiere una relación poco clara entre el precio y el número de habitaciones. Aunque se observa una leve tendencia a que los apartamentos con más habitaciones tiendan a tener precios más altos, esta relación no alcanza significancia estadística. Por lo tanto, no se puede afirmar que el número de habitaciones tenga un impacto significativo en el precio del inmueble sin considerar otros factores relevantes.
Precio vs Zona:el análisis visual de los precios de los apartamentos en diferentes zonas revela patrones interesantes. Las zonas oeste y sur exhiben los precios más altos, mientras que la zona centro y oriente muestran precios más económicos. Esta observación destaca la importancia de la ubicación geográfica al determinar el precio de los apartamentos. Sin embargo, es necesario realizar un análisis estadístico más profundo para entender completamente la relación entre la zona y el precio, considerando otros factores influyentes.
library(ggplot2)
library(GGally)
# Seleccionar las variables relevantes
cor_1 <- vivienda_apartamento[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "zona")]
# Crear la matriz de gráficos
ggpairs(cor_1, title = "Correlaciones en 'vivienda'")
## `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`.
Los resultados revelan correlaciones significativas entre el precio de los apartamentos y varias características específicas. La variable de respuesta, el precio del apartamento, exhibe correlaciones positivas significativas con el área construida, el número de baños y el estrato, según lo indicado en la matriz de correlaciones. Además, se identifica una correlación positiva, aunque débil, entre el precio y el número de habitaciones.
Estos hallazgos sugieren que el área construida es la variable que ejerce mayor influencia en el precio del apartamento, seguida por el número de baños y el estrato. Aunque el número de habitaciones también influye en el precio, su efecto es relativamente más débil en comparación con las otras variables mencionadas. Este análisis estadístico proporciona una comprensión cuantitativa de cómo ciertas características afectan el precio de los apartamentos, lo que puede ser útil para tomar decisiones informadas en el mercado inmobiliario.
# Modelo de regresiòn lineal
# Ajustar el modelo de regresión lineal múltiple
modelo2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda_apartamento)
# Resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = vivienda_casas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1190.80 -114.52 -25.94 74.59 986.16
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -413.87536 25.58852 -16.174 < 2e-16 ***
## areaconst 0.74227 0.02941 25.235 < 2e-16 ***
## estrato 116.07109 5.26618 22.041 < 2e-16 ***
## habitaciones -14.74995 3.18137 -4.636 3.73e-06 ***
## parqueaderos 64.29943 3.47719 18.492 < 2e-16 ***
## banios 39.03498 4.05083 9.636 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 205.2 on 2480 degrees of freedom
## (733 observations deleted due to missingness)
## Multiple R-squared: 0.6834, Adjusted R-squared: 0.6828
## F-statistic: 1071 on 5 and 2480 DF, p-value: < 2.2e-16
El modelo de regresión lineal múltiple ajustado para predecir el precio de los apartamentos muestra un buen ajuste, con un coeficiente de determinación (R-cuadrado) de 0.7845, lo que indica que aproximadamente el 78.45% de la variabilidad en el precio de los apartamentos se explica por las variables predictoras incluidas en el modelo.
Los coeficientes estimados para las variables predictoras son todos significativos (p < 0.001), lo que sugiere que todas las variables explicativas (área construida, estrato, número de habitaciones, número de parqueaderos y número de baños) tienen un impacto significativo en el precio de los apartamentos.
Por cada unidad adicional en el área construida, se espera que el precio del apartamento aumente en promedio $2.00464. Por cada unidad adicional en el estrato, se espera que el precio del apartamento aumente en promedio $56.24218. Por cada unidad adicional en el número de habitaciones, se espera que el precio del apartamento disminuya en promedio $42.66447. Por cada unidad adicional en el número de parqueaderos, se espera que el precio del apartamento aumente en promedio $90.42324. Por cada unidad adicional en el número de baños, se espera que el precio del apartamento aumente en promedio $54.84690.
Estos hallazgos sugieren que características como el área construida, el estrato, el número de parqueaderos y el número de baños tienen un impacto positivo en el precio de los apartamentos, mientras que el número de habitaciones tiene un impacto negativo. Esto puede deberse a factores como la demanda del mercado y la disponibilidad de estas características en los apartamentos. En resumen, el modelo proporciona una base sólida para predecir el precio de los apartamentos utilizando estas variables explicativas.
4.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).
# Paso 1: Verificar la linealidad de la relación
# Gráfico de dispersión de valores ajustados vs residuos
plot(modelo2$fitted.values, modelo2$residuals,
main = "Linealidad de la Relación",
xlab = "Valores Ajustados",
ylab = "Residuos",
col = "blue")
# Paso 2: Comprobar la normalidad de los residuos
# Gráfico Q-Q de los residuos estandarizados
qqnorm(modelo2$residuals,
main = "Normalidad de los Residuos",
col = "green")
qqline(modelo$residuals)
# Paso 3: Evaluar la homogeneidad de la varianza
# Gráfico de dispersión de valores ajustados vs residuos estandarizados
plot(modelo2$fitted.values, sqrt(abs(modelo2$residuals)),
main = "Homogeneidad de la Varianza",
xlab = "Valores Ajustados",
ylab = "Raíz Cuadrada de los Residuos Estándarizados",
col = "red")
# Paso 4: Verificar la independencia de los residuos
# Gráfico de residuos vs índice de observación
plot(modelo2$residuals,
main = "Independencia de los Residuos",
xlab = "Índice de Observación",
ylab = "Residuos",
col = "purple")
# Paso 5: Identificar puntos influyentes y valores atípicos
# Gráfico de valores de Cook's distance
plot(cooks.distance(modelo2), pch = 20,
main = "Valores de Cook's Distance",
col = "orange")
El análisis de los gráficos revela algunas señales que sugieren que la relación entre las variables podría no ser completamente lineal y que la normalidad de los residuos podría no ser perfecta. En el gráfico de linealidad de la relación, se observa una leve tendencia curvilínea en la dispersión de los puntos, con desvíos visibles, especialmente en la parte superior. Aunque no se evidencia claramente la no linealidad, estas observaciones sugieren cierta discrepancia con la linealidad. En cuanto al gráfico de normalidad de los residuos, aunque la mayoría de los puntos se acercan a la línea diagonal, hay algunas desviaciones en los extremos, indicando la presencia de residuos con valores más extremos de lo esperado en una distribución normal. Asimismo, se observa una ligera tendencia creciente en la dispersión de los residuos en el gráfico de homogeneidad de la varianza, lo que sugiere que la homocedasticidad podría no ser perfecta. Además, se identifica un punto altamente influyente en el gráfico de influencia de Cook, destacando la importancia de su examen detallado para evaluar su posible exclusión del modelo y su impacto en la precisión de los coeficientes estimados.
# Resumen de los residuos del modelo
summary_resid <- summary(modelo2$residuals)
print("Resumen de los residuos del modelo:")
## [1] "Resumen de los residuos del modelo:"
print(summary_resid)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1699.032 -57.724 -0.665 0.000 48.591 1005.440
# Prueba t para la media de los residuos
t_test <- t.test(modelo2$residuals, mu = 0)
print("Prueba t para la media de los residuos:")
## [1] "Prueba t para la media de los residuos:"
print(t_test)
##
## One Sample t-test
##
## data: modelo2$residuals
## t = 5.3991e-15, df = 4230, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -4.148557 4.148557
## sample estimates:
## mean of x
## 1.142472e-14
# Prueba de Breusch-Godfrey para autocorrelación
bg_test <- lmtest::bgtest(modelo2)
print("Prueba de Breusch-Godfrey para autocorrelación de los residuos:")
## [1] "Prueba de Breusch-Godfrey para autocorrelación de los residuos:"
print(bg_test)
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: modelo2
## LM test = 127.06, df = 1, p-value < 2.2e-16
Residuos del modelo: El análisis de los residuos muestra que su distribución se centra alrededor de cero, con una media cercana a cero (-0.665), lo que sugiere que el modelo no tiene un sesgo sistemático en la predicción. Además, se observa una dispersión considerable de los residuos, con un rango desde -1699.032 hasta 1005.440.
Prueba t para la media de los residuos: La prueba t para la media de los residuos arroja un valor t extremadamente pequeño (5.3991e-15), lo que indica que no hay evidencia suficiente para rechazar la hipótesis nula de que la media de los residuos es igual a cero. Esto sugiere que, en promedio, los residuos no difieren significativamente de cero, lo que respalda la idoneidad del modelo.
Prueba de Breusch-Godfrey para autocorrelación de los residuos: La prueba de Breusch-Godfrey para detectar la autocorrelación de los residuos muestra un valor p extremadamente pequeño (< 2.2e-16), lo que indica que hay evidencia significativa para rechazar la hipótesis nula de no autocorrelación. Esto sugiere que existe autocorrelación en los residuos del modelo, lo cual puede tener implicaciones importantes en la validez de las inferencias estadísticas derivadas del modelo.
En resumen, mientras que el modelo parece tener residuos que se distribuyen alrededor de cero y no difieren significativamente de cero en promedio, se detecta autocorrelación en los residuos, lo que podría afectar la precisión de las estimaciones y las inferencias realizadas a partir del modelo.
# Coeficientes del modelo
intercepto2 <- -278.47706
coef_areaconst2 <- 2.00464
coef_estrato2 <- c( 56.24218 , 56.24218 ) # Coeficiente para estrato 5 y estrato 6
coef_parqueaderos2 <- 90.42324
coef_banios2 <- 54.84690
coef_habitaciones2 <- -42.66447
# Características de la segunda solicitud
areaconst2 <- c(300, 300)
estrato2 <- c(5, 6)
parqueaderos2 <- c(3, 3)
banios2 <- c(3, 3)
habitaciones2 <- c(5, 5)
# Calcular la predicción para la primera solicitud
prediccion_vivienda2 <- intercepto2 + coef_areaconst2 * areaconst2[1] +
coef_estrato2[1] * estrato2[1] + coef_parqueaderos2 * parqueaderos2[1] +
coef_banios2 * banios2[1] + coef_habitaciones2 * habitaciones2[1]
# Imprimir el precio predicho para la primera solicitud
print(prediccion_vivienda2)
## [1] 826.6139
El precio de la vivienda predicho para las características de la segunda solicitud es de $ 826.613.900 pero se debe tener en cuenta que esta es solo una estimación y el precio real puede ser mayor o menor.
# Filtrar las casas de acuerdo con los criterios especificados
apartamento <- filter(vivienda_apartamento,
areaconst >= 300,
parqueaderos >= 3,
banios >= 3,
habitaciones >= 5,
zona == "Zona Sur",
estrato >= 5,
estrato <= 6,
preciom <= 850)
print(apartamento)
## # A tibble: 2 × 14
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7182 Zona S… <NA> 5 730 573 3 8 5
## 2 7512 Zona S… <NA> 5 670 300 3 5 6
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## # base <chr>
# Calcular el precio mínimo y máximo de las casas filtradas
precio_minimo <- min(apartamento$preciom)
precio_maximo <- max(apartamento$preciom)
# Imprimir los precios mínimo y máximo
cat("Precio mínimo de los apartamentos filtrados:", precio_minimo, "\n")
## Precio mínimo de los apartamentos filtrados: 670
cat("Precio máximo de los apartamentos filtrados:", precio_maximo, "\n")
## Precio máximo de los apartamentos filtrados: 730
# Crear un mapa de las casas
mapaapto <- leaflet(apartamento) %>%
# Agregar azulejos base
addTiles() %>%
# Agregar marcadores circulares para los apartamentos
addCircleMarkers(
lng = ~longitud,
lat = ~latitud,
color = ~rainbow(nrow(apartamento)), # Generar una secuencia de colores utilizando la función rainbow()
radius = 4 # Radio de los marcadores
)
# Mostrar el mapa de las casas
mapaapto
Basándonos en los datos filtrados, se observa que hay pocas opciones disponibles que cumplan con los criterios específicos requeridos por la multinacional. Sin embargo, dentro de las opciones disponibles, se destaca la ubicación estratégica de algunos apartamentos en los barrios Guadalupe y Seminario, lo que podría ser beneficioso para la empresa en términos de accesibilidad y proximidad a otras áreas importantes de la ciudad. Aunque la selección es limitada, estas propiedades podrían satisfacer las necesidades básicas de alojamiento para el personal de la multinacional.