Ciudad
El siguiente informe estadístico muestra un análisis descriptivo de los datos del mercado inmobiliario en la ciudad de Cali, dirigido a su compañía inmobiliaria B&C para la toma de decisiones, como: definir su nicho de mercado, desarrollar estrategias de marketing, establecer precios de venta y ofrecer servicios personalizados a sus clientes.
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 ciudadInicialmente, para dar solución a los objetivos, se es necesario realizar un entendimiento de los datos para contextualizarlos, entenderlos y dar partida, si es necesario, la corrección de los mismos.
#install.packages("devtools") # solo la primera vez
#devtools::install_github("dgonxalex80/paqueteMODELOS", force =TRUE)
#library(paqueteMODELOS)
#data("vivienda")
Como medida de accesibilidad y seguridad, se guarda el dataset en formato Excel, para la lectura del archivo y ser trabajado desde cualquier instancia.
#library(xlsx)
#write.xlsx(vivienda, "vivienda.xlsx")
library(readxl)
vivienda<-read_excel("C:/Users/john.diaz/Dropbox/Ciencia de Datos/Modelos Estadísticos para la Toma de Decisiones/vivienda.xlsx")
## New names:
## • `` -> `...1`
###Descripción de los datos
Se inicia con la visualización, descripción y tipos de datos de las variables o atributos contenidos en el dataset o base de datos:
head(vivienda)
## # A tibble: 6 × 14
## ...1 id zona piso estrato preciom areaconst parqueaderos banios
## <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1147 Zona Oriente <NA> 3 250 70 1 3
## 2 2 1169 Zona Oriente <NA> 3 320 120 1 2
## 3 3 1350 Zona Oriente <NA> 3 350 220 2 2
## 4 4 5992 Zona Sur 02 4 400 280 3 5
## 5 5 1212 Zona Norte 01 5 260 90 1 2
## 6 6 1724 Zona Norte 01 5 240 87 1 3
## # ℹ 5 more variables: habitaciones <dbl>, tipo <chr>, barrio <chr>,
## # longitud <dbl>, latitud <dbl>
str(vivienda)
## tibble [8,322 × 14] (S3: tbl_df/tbl/data.frame)
## $ ...1 : chr [1:8322] "1" "2" "3" "4" ...
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
Posteriormente, se procede con la Limpieza de los datos, para lo cual lo primero es evidenciar los campos vacíos en el dataset:
faltantes <- colSums(is.na(vivienda))
faltantes
## ...1 id zona piso estrato preciom
## 0 3 3 2638 3 2
## areaconst parqueaderos banios habitaciones tipo barrio
## 3 1605 3 3 3 3
## longitud latitud
## 3 3
En el reporte anterior se observan una gran cantidad de datos vacíos, la mayoría corresponde a la variable parqueadero y piso, las demás variables presentan vacíos, pero de manera muy mínima, por lo cual se procede a:
vivienda$parquea<-NULL
vivienda$piso<-NULL
vivienda<- na.omit(vivienda)
Para el informe de Vivienda tipo Casa, se debe realizar un filtro a la base de datos e incluya solo las ofertas de: base1: casas, de la zona norte de la ciudad. Se presenta los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
Base1 <- subset(vivienda, zona == "Zona Norte" & tipo == "Casa")
head(Base1, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 9 1209 Zona N… 5 320 150 2 4 6
## 2 10 1592 Zona N… 5 780 380 2 3 3
## 3 12 4460 Zona N… 4 625 355 3 5 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base2 <- subset(vivienda, zona == "Zona Oeste" & tipo == "Casa")
head(Base2, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 181 6928 Zona O… 6 1850 302 4 4 3
## 2 183 7510 Zona O… 6 1950 400 4 5 3
## 3 184 7586 Zona O… 6 870 275 3 5 4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base3 <- subset(vivienda, zona == "Zona Oriente" & tipo == "Casa")
head(Base3, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1147 Zona O… 3 250 70 1 3 6
## 2 2 1169 Zona O… 3 320 120 1 2 3
## 3 3 1350 Zona O… 3 350 220 2 2 4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base4 <- subset(vivienda, zona == "Zona Centro" & tipo == "Casa")
head(Base4, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 275 5298 Zona C… 3 650 240 2 4 4
## 2 282 5608 Zona C… 3 295 200 1 5 9
## 3 285 3355 Zona C… 4 1100 217 1 3 1
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base5 <- subset(vivienda, zona == "Zona Sur" & tipo == "Casa")
head(Base5, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 5992 Zona S… 4 400 280 3 5 3
## 2 278 5157 Zona S… 3 500 354 1 2 4
## 3 288 5156 Zona S… 3 420 369 1 5 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Adicionalmente se crea un mapa con los puntos de longitud y latitud de las bases de datos, con el fin de discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas.
#install.packages("leaflet")
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.3.3
mapa <- leaflet() %>%
addTiles() # Agregar capa base de mapas
mapa <- mapa %>%
addCircleMarkers(data = Base1, lng = ~longitud, lat = ~latitud, color = "red") %>%
addCircleMarkers(data = Base2, lng = ~longitud, lat = ~latitud, color = "blue") %>%
addCircleMarkers(data = Base3, lng = ~longitud, lat = ~latitud, color = "green") %>%
addCircleMarkers(data = Base4, lng = ~longitud, lat = ~latitud, color = "orange") %>%
addCircleMarkers(data = Base5, lng = ~longitud, lat = ~latitud, color = "purple")
mapa
Observación: Efectivamente se observan Viviendas que están en Zonas que no corresponden, como viviendas de la zona norte en la zona oriente de la ciudad, se recomienda verificar los registros de la base de datos.
Se realiza un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, número de baños, número de habitaciones y zona donde se ubica la vivienda. Se usan gráficos interactivos con el paquete plotly para su interpretación con los resultados.
#install.packages("plotly")
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
##
## 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
Vivienda_Casas <- subset(vivienda, tipo == "Casa")
#Área Construida
plot <- plot_ly(data = Vivienda_Casas, x = ~preciom, y = ~areaconst, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Area Construida",
xaxis = list(title = "Precio"),
yaxis = list(title = "Area"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Área Construida, en donde a nivel general se observa que la correlación tiende en agruparse en una línea recta, aunque en el caso de los precios y áreas altas, muestra una dispersión, en relación con la dirección se observa que a medida que los precios aumentan las áreas igualmente, en referencia a la relación se observa una relación fuerte para precios y áreas bajas, pero a medida que crece baja la relación, y finalmente se observan valores atípicos (outliers) para áreas extremadamente grandes.
#Estrato
plot <- plot_ly(data = Vivienda_Casas, x = ~preciom, y = ~estrato, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Estrato",
xaxis = list(title = "Precio"),
yaxis = list(title = "Estrato"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Estrato, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada estrato, en relación con la dirección se observa que a medida que los precios aumentan independientemente por estraro, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada estrato, y finalmente no se observan valores atípicos (outliers).
#Número de Baños
plot <- plot_ly(data = Vivienda_Casas, x = ~preciom, y = ~banios, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Numero de Baños",
xaxis = list(title = "Precio"),
yaxis = list(title = "Número de Baños"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Número de Baños, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada número de baños, en relación con la dirección se observa que a medida que los precios aumentan independientemente por el número de baños, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada número de baños, y finalmente se observan valores atípicos (outliers) entre los números de baños 6 y 10, que puede corresponder a baños con la mitad de la funcionalidad.
#Número de Habitaciones
plot <- plot_ly(data = Vivienda_Casas, x = ~preciom, y = ~habitaciones, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Número de Habitaciones",
xaxis = list(title = "Precio"),
yaxis = list(title = "Número de Habitaciones"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Número de Habitaciones, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada número de Habitaciones, en relación con la dirección se observa que a medida que los precios aumentan independientemente por el número de Habitaciones, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada número de habitaciones, y finalmente se observan valores atípicos (outliers) entre los números de habitaciones 0 y 10, que se debe revisar y sobre todo el número de habitaciones 0.
#Zona
plot <- plot_ly(data = Vivienda_Casas, x = ~preciom, y = ~zona, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Zona",
xaxis = list(title = "Precio"),
yaxis = list(title = "Zona"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. la Zona, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada Zona, en relación con la dirección se observa que a medida que los precios aumentan independientemente por Zona, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada Zona, y finalmente no se observan valores atípicos (outliers).
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número 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, data = Vivienda_Casas)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones,
## data = Vivienda_Casas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1388.05 -128.96 -33.44 83.12 1114.50
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -471.55507 27.08664 -17.409 < 2e-16 ***
## areaconst 0.89922 0.03004 29.939 < 2e-16 ***
## estrato 140.99904 5.42925 25.970 < 2e-16 ***
## banios 52.36735 4.25123 12.318 < 2e-16 ***
## habitaciones -17.31540 3.38970 -5.108 3.5e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 218.9 on 2481 degrees of freedom
## Multiple R-squared: 0.6397, Adjusted R-squared: 0.6392
## F-statistic: 1101 on 4 and 2481 DF, p-value: < 2.2e-16
resumen_modelo <- summary(modelo)
r_squared <- resumen_modelo$r.squared
r_squared
## [1] 0.6397414
Para comprender el coeficiente R2, se debe tener claro que un valor de 1 indica que el modelo explica toda la variabilidad en la variable de respuesta, mientras que un valor de 0 indica que el modelo no explica ninguna variabilidad en la variable de respuesta.
En este caso el valor es de 0.63 por lo cual se deme mejorar el modelo, para dar mejor explicación y predicción.
Para mejorar el modelo se sugiere; revisar y evaluar la selección de variables nuevamente, y realizar un tratamiento a los valores atípicos encontrados.
Se realiza la validación de supuestos del modelo e interpretación de los resultados, aclaración: no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer.
qqnorm(resid(modelo))
El gráfico cuantil-cuantil,se comparar la distribución de una muestra de
datos con una distribución teórica normal, y se observa que los datos
siguen una distribución normal, y los puntos en el gráfico se alinean a
lo largo de una línea recta.
plot(modelo, which = 1)
La gráfica residuos vs ajustados se utiliza para evaluar la
homocedasticidad y la linealidad en un modelo de regresión lineal
múltiple, en este caso, se observa una buena homocedasticidad debido a
que se ve una constancia de la varianza de los residuos a lo largo de
los valores ajustados, adicionalmente los puntos estan dispersos
aleatoriamente alrededor de la línea horizontal.
summary(lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda))$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -413.602930 15.17401292 -27.25732 2.999241e-155
## areaconst 1.075152 0.02203221 48.79911 0.000000e+00
## estrato 116.587653 2.92369306 39.87684 2.860450e-312
## banios 77.335744 2.71870341 28.44582 3.753622e-168
## habitaciones -35.226849 2.39204721 -14.72665 2.454247e-48
En esta tabla se incluye los coeficientes estimados, sus errores estándar, los valores t y los valores p asociados con cada coeficiente:
Con el modelo identificado se predice el precio de la vivienda con las características de la primera solicitud.
Opcion1 <- data.frame(areaconst = 200, estrato = 4, banios = 2, habitaciones = 4)
Prediccion1 <- predict(modelo, Opcion1, interval = "confidence")
Prediccion1
## fit lwr upr
## 1 307.7585 292.3319 323.185
En la predicción de la Opción 1 en donde el estrato es 4, el valor del precio del metro cuadrado es de $307 millones, con un valor inferior y superior en el intervalo de confianza indica la incertidumbre de $292 a $323 millones respectivamente.
Opcion2 <- data.frame(areaconst = 200, estrato = 5, banios = 2, habitaciones = 4)
Prediccion2 <- predict(modelo, Opcion2, interval = "confidence")
Prediccion2
## fit lwr upr
## 1 448.7575 429.9893 467.5257
En la predicción de la Opción 2 en donde el estrato es 5, el valor del precio del metro cuadrado es de $448 millones, con un valor inferior y superior en el intervalo de confianza indica la incertidumbre de $429 a $467 millones respectivamente.
Con las predicciones del modelo se sugiere potenciales ofertas que responda a la solicitud de la vivienda 1. Se tiene encuenta 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.
Oferta1 <- subset(Vivienda_Casas, areaconst == 200 & parqueaderos == 1 & banios == 2 & habitaciones == 4 & estrato == 4 & zona == "Zona Norte" & preciom >=292 & preciom <= 323)
head(Oferta1)
## # A tibble: 0 × 13
## # ℹ 13 variables: ...1 <chr>, id <dbl>, zona <chr>, estrato <dbl>,
## # preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## # habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Dada la solicitud 1, actualmente no se tienen un predio que cumpla con las características solicitadas.
Oferta2 <- subset(vivienda, areaconst == 200 & parqueaderos == 1 & banios == 2 & habitaciones == 4 & estrato == 5 & zona == "Zona Norte" & preciom >=429 & preciom <= 467)
head(Oferta1)
## # A tibble: 0 × 13
## # ℹ 13 variables: ...1 <chr>, id <dbl>, zona <chr>, estrato <dbl>,
## # preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## # habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Dada la solicitud 2, igualmente no se tienen un predio que cumpla con las características solicitadas.
mapa <- leaflet() %>% addTiles()
mapa <- mapa1 %>% addCircleMarkers(data = Oferta1, lng = ~longitud, lat = ~latitud, color = “red”) %>% addCircleMarkers(data = Oferta2, lng = ~longitud, lat = ~latitud, color = “blue”) %>%
mapa
Para el informe de Vivienda tipo Apartamento, se debe realizar un filtro a la base de datos e incluya solo las ofertas de: base: apartamentos, de la zona norte de la ciudad. Se presenta los primeros 3 registros de las bases y algunas tablas que comprueben la consulta.
Base6 <- subset(vivienda, zona == "Zona Norte" & tipo == "Apartamento")
head(Base6, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5 1212 Zona N… 5 260 90 1 2 3
## 2 6 1724 Zona N… 5 240 87 1 3 3
## 3 7 2326 Zona N… 4 220 52 2 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base7 <- subset(vivienda, zona == "Zona Oeste" & tipo == "Apartamento")
head(Base7, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 166 6999 Zona O… 6 870 200 2 5 3
## 2 168 8055 Zona O… 4 165 61 1 2 3
## 3 169 8058 Zona O… 4 165 61 1 2 2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base8 <- subset(vivienda, zona == "Zona Oriente" & tipo == "Apartamento")
head(Base8, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 321 82 Zona O… 3 115 111 1 2 4
## 2 326 78 Zona O… 3 58 50 1 1 2
## 3 1871 2342 Zona O… 3 113 72 1 1 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base9 <- subset(vivienda, zona == "Zona Centro" & tipo == "Apartamento")
head(Base9, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 283 4408 Zona C… 3 120 84 1 2 3
## 2 583 4305 Zona C… 3 120 84 1 2 3
## 3 987 1132 Zona C… 5 325 89 1 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Base10 <- subset(vivienda, zona == "Zona Sur" & tipo == "Apartamento")
head(Base10, 3)
## # A tibble: 3 × 13
## ...1 id zona estrato preciom areaconst parqueaderos banios habitaciones
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 24 5098 Zona S… 4 290 96 1 2 3
## 2 164 698 Zona S… 3 78 40 1 1 2
## 3 264 8199 Zona S… 6 875 194 2 5 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Adicionalmente se crea un mapa con los puntos de longitud y latitud de las bases de datos, con el fin de discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas.
#install.packages("leaflet")
library(leaflet)
mapa <- leaflet() %>%
addTiles()
mapa <- mapa %>%
addCircleMarkers(data = Base6, lng = ~longitud, lat = ~latitud, color = "red") %>%
addCircleMarkers(data = Base7, lng = ~longitud, lat = ~latitud, color = "blue") %>%
addCircleMarkers(data = Base8, lng = ~longitud, lat = ~latitud, color = "green") %>%
addCircleMarkers(data = Base9, lng = ~longitud, lat = ~latitud, color = "orange") %>%
addCircleMarkers(data = Base10, lng = ~longitud, lat = ~latitud, color = "purple")
mapa
Observación: Efectivamente se observan Apartamentos que están en Zonas que no corresponden, como viviendas de la zona norte en la zona oriente de la ciudad, se recomienda verificar los registros de la base de datos.
Se realiza un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, número de baños, número de habitaciones y zona donde se ubica la vivienda. Se usan gráficos interactivos con el paquete plotly para su interpretación con los resultados.
#install.packages("plotly")
library(plotly)
Vivienda_Apartamentos <- subset(vivienda, tipo == "Apartamento")
#Área Construida
plot <- plot_ly(data = Vivienda_Apartamentos, x = ~preciom, y = ~areaconst, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Area Construida",
xaxis = list(title = "Precio"),
yaxis = list(title = "Area"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Área Construida de los Apartamentos, en donde a nivel general se observa que la correlación tiende en agruparse en una línea recta, aunque en el caso de los precios y áreas altas, muestra una dispersión, en relación con la dirección se observa que a medida que los precios aumentan las áreas igualmente, en referencia a la relación se observa una relación fuerte para precios y áreas bajas, pero a medida que crece baja la relación, y finalmente se observan valores atípicos (outliers) para áreas extremadamente grandes.
#Estrato
plot <- plot_ly(data = Vivienda_Apartamentos, x = ~preciom, y = ~estrato, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Estrato",
xaxis = list(title = "Precio"),
yaxis = list(title = "Estrato"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Estrato de los Apartamentos, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada estrato, en relación con la dirección se observa que a medida que los precios aumentan independientemente por estraro, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada estrato, y finalmente no se observan valores atípicos (outliers).
#Número de Baños
plot <- plot_ly(data = Vivienda_Apartamentos, x = ~preciom, y = ~banios, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Numero de Baños",
xaxis = list(title = "Precio"),
yaxis = list(title = "Número de Baños"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Número de Baños en los Apartamentos, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada número de baños, en relación con la dirección se observa que a medida que los precios aumentan independientemente por el número de baños, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada número de baños, y finalmente se observan valores atípicos (outliers) entre los números de baños 4 y 10, que puede corresponder a baños con la mitad de la funcionalidad.
#Número de Habitaciones
plot <- plot_ly(data = Vivienda_Apartamentos, x = ~preciom, y = ~habitaciones, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Número de Habitaciones",
xaxis = list(title = "Precio"),
yaxis = list(title = "Número de Habitaciones"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. el Número de Habitaciones de los Apartamentos, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada número de Habitaciones, en relación con la dirección se observa que a medida que los precios aumentan independientemente por el número de Habitaciones, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada número de habitaciones, y finalmente se observan valores atípicos (outliers) entre los números de habitaciones 0 y 10, que se debe revisar y sobre todo el número de habitaciones 0.
#Zona
plot <- plot_ly(data = Vivienda_Apartamentos, x = ~preciom, y = ~zona, type = "scatter", mode = "markers")
plot <- plot %>%
layout(title = "Gráfico de Correlación entre Precio y Zona",
xaxis = list(title = "Precio"),
yaxis = list(title = "Zona"))
plot
En este gráfico de dispersión de la Correlación entre Precio vs. la Zona de los Apartamentos, en donde a nivel general se observa que la correlación tiende en agruparse en varias líneas por cada Zona, en relación con la dirección se observa que a medida que los precios aumentan independientemente por Zona, en referencia a la relación se observa una relación fuerte para precios que disminuye en cada Zona, y finalmente no se observan valores atípicos (outliers).
Nota: Las Correlaciones del tipo de Vivienda; Casas y Apartamentos, presentan un comportamiento muy similar.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número 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).
modelo1 <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = Vivienda_Apartamentos)
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones,
## data = Vivienda_Apartamentos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2092.41 -60.11 -1.86 47.54 992.38
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -282.68009 16.73576 -16.89 <2e-16 ***
## areaconst 2.41972 0.04693 51.55 <2e-16 ***
## estrato 71.26960 3.14377 22.67 <2e-16 ***
## banios 68.58350 3.54375 19.35 <2e-16 ***
## habitaciones -47.73153 4.00796 -11.91 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 145.3 on 4226 degrees of freedom
## Multiple R-squared: 0.7602, Adjusted R-squared: 0.76
## F-statistic: 3350 on 4 and 4226 DF, p-value: < 2.2e-16
resumen_modelo1 <- summary(modelo)
r_squared <- resumen_modelo1$r.squared
r_squared
## [1] 0.6397414
En este caso el valor es de 0.76 por lo cual se mejora el modelo, y da una mejor explicación y predicción.
Si se quiere mejorar el modelo se sugiere; realizar un tratamiento a los valores atípicos encontrados.
Se realiza la validación de supuestos del modelo e interpretación de los resultados, aclaración: no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer.
qqnorm(resid(modelo1))
El gráfico cuantil-cuantil,se comparar la distribución de una muestra de
datos con una distribución teórica normal, y se observa que los datos
siguen una distribución normal, y los puntos en el gráfico se alinean a
lo largo de una línea recta.
plot(modelo1, which = 1)
La gráfica residuos vs ajustados se utiliza para evaluar la
homocedasticidad y la linealidad en un modelo de regresión lineal
múltiple, en este caso, se observa una buena homocedasticidad debido a
que se ve una constancia de la varianza de los residuos a lo largo de
los valores ajustados, adicionalmente los puntos estan dispersos
aleatoriamente alrededor de la línea horizontal.
summary(lm(preciom ~ areaconst + estrato + banios + habitaciones, data = Vivienda_Apartamentos))$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -282.680085 16.7357576 -16.89079 5.454197e-62
## areaconst 2.419724 0.0469347 51.55511 0.000000e+00
## estrato 71.269601 3.1437699 22.67011 1.789572e-107
## banios 68.583499 3.5437463 19.35339 5.055014e-80
## habitaciones -47.731533 4.0079561 -11.90920 3.451060e-32
En esta tabla se incluye los coeficientes estimados, sus errores estándar, los valores t y los valores p asociados con cada coeficiente:
Con el modelo identificado se predice el precio de los apartamentos con las características de la primera solicitud.
Opcion3 <- data.frame(areaconst = 300, estrato = 5, banios = 3, habitaciones = 5)
Prediccion3 <- predict(modelo1, Opcion3, interval = "confidence")
Prediccion3
## fit lwr upr
## 1 766.6779 745.5157 787.8401
En la predicción de la Opción 3 en donde el estrato es 5, el valor del precio del metro cuadrado es de $766 millones, con un valor inferior y superior en el intervalo de confianza indica la incertidumbre de $745 a $787 millones respectivamente.
Opcion4 <- data.frame(areaconst = 300, estrato = 6, banios = 3, habitaciones = 5)
Prediccion4 <- predict(modelo1, Opcion4, interval = "confidence")
Prediccion4
## fit lwr upr
## 1 837.9475 815.9726 859.9224
En la predicción de la Opción 2 en donde el estrato es 6, el valor del precio del metro cuadrado es de $837 millones, con un valor inferior y superior en el intervalo de confianza indica la incertidumbre de $815 a $859 millones respectivamente.
Con las predicciones del modelo se sugiere potenciales ofertas que responda a la solicitud de la vivienda 1. Se tiene encuenta 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.
Oferta3 <- subset(Vivienda_Apartamentos, areaconst == 300 & parqueaderos == 3 & banios == 3 & habitaciones == 5 & estrato == 5 & zona == "Zona Sur" & preciom >=745 & preciom <= 787)
head(Oferta1)
## # A tibble: 0 × 13
## # ℹ 13 variables: ...1 <chr>, id <dbl>, zona <chr>, estrato <dbl>,
## # preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## # habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Dada la solicitud 3, actualmente no se tienen un predio que cumpla con las características solicitadas.
Oferta2 <- subset(Vivienda_Apartamentos, areaconst == 300 & parqueaderos == 3 & banios == 3 & habitaciones == 5 & estrato == 6 & zona == "Zona Sur" & preciom >=815 & preciom <= 859)
head(Oferta1)
## # A tibble: 0 × 13
## # ℹ 13 variables: ...1 <chr>, id <dbl>, zona <chr>, estrato <dbl>,
## # preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## # habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Dada la solicitud 4, igualmente no se tienen un predio que cumpla con las características solicitadas.
mapa1 <- leaflet() %>% addTiles()
mapa1 <- mapa %>% addCircleMarkers(data = Oferta1, lng = ~longitud, lat = ~latitud, color = “green”) %>% addCircleMarkers(data = Oferta2, lng = ~longitud, lat = ~latitud, color = “yellow”) %>%
mapa1
Para dar cumplimiento a la Solicitud se debe Ofrecer una Vivivienda de Tipo Casa con Estrato 4 para que este alineado con el el crédito preaprobado.
En el caso de los Apartamentos según la predicción del Modelo, se pueden ofrecer los apartamentos con los estratos 5 y 6.