Señores: Directivos de C&A.

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.

Enunciado

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

Objetivos

  • Filtrar los datos de las ofertas para determinar si los predios están ubicados en las zonas correctas.
  • Análisis exploratorio de las correlaciones del precio en función de otras variables.
  • Estimación del modelo de regresión lineal múltiple e interpretación de los coeficientes.
  • Validación de supuestos del modelo e interpretación de los resultados.
  • Predicciones del precio de la vivienda según las solicitudes.
  • sugerencias potenciales de ofertas que responda a la solicitud de la vivienda.

Compresión de los Datos

Inicialmente, 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.

Procedimiento y obtención y cargue del la Información para el Informe.

#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 ...
  • id = Es de tipo numérico, que representa el identificador único de cada registro (propiedad).
  • zona = Es de tipo carácter, indicando la zona geográfica de Cali en la que se encuentra la propiedad.
  • piso = Es de tipo numérico, que podría indicar el número del nivel del piso o la cantidad que tiene la propiedad.
  • estrato: Es de tipo numérico, que representa el estrato socioeconómico de la propiedad.
  • preciom: Es de tipo numérico con el precio por metro cuadrado de la propiedad, expresada en milles.
  • areaconst: Es de tipo numérico que indica el área construida de la propiedad.
  • parquea: Es de tipo numérico con la cantidad de estacionamiento de la propiedad.
  • banios: Es de tipo numérico con la cantidad de baños de la propiedad.
  • habitac: Es de tipo numérico con la cantidad de habitaciones en la propiedad.
  • tipo: Es de tipo carácter que indica el tipo de propiedad, “Apartamento” o “Casa”.
  • barrio: Es de tipo carácter con el nombre el barrio de la propiedad.
  • longitud y latitud: Es de tipo numérico con las coordenadas de la ubicación geográfica de la propiedad.

Preparación y limpieza de los datos

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:

  • Se elimina la variable Parqueadero que contienen 1.605 con NA, ya que son demasiados y se debe tener exactitud en su cantidad para dar una mejor apreciación.
  • Se elimina la variable Piso con 2.638 datos NA, ya que la variable no es Clara ¿Son Pisos (Nivel) por apartamentos o el número de Pisos por Casa?
  • Posteriormente, Eliminar los registros con datos vacíos, los cuales son muy pocos.
vivienda$parquea<-NULL
vivienda$piso<-NULL
vivienda<- na.omit(vivienda)

Informe Vivienda 1: Casa - Crédito Preaprobado 350 millones

Punto 1:

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.

Punto 2:

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).

Punto 3:

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.

Punto 4:

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:

  • La estimación del número de habitaciones hay una relación negativa entre la variable independiente correspondiente y la variable de respuesta.
  • En los errores estándar, se observan relativamente pequeños y asi se obtiene una mejor precisión de la estimación.
  • En los los valores t, el coeficiente es significativamente diferente de cero.
  • Los los valores p, son un valor p bajo (generalmente <0.05), en todos es menor el valor p.

Punto 5:

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.

Punto 6:

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

Informe Vivienda 2: Apartamento - Crédito Preaprobado 850 millones

Punto 1:

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.

Punto 2:

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.

Punto 3:

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.

Punto 4:

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:

  • La estimación del número de habitaciones hay una relación negativa entre la variable independiente correspondiente y la variable de respuesta.
  • En los errores estándar, se observan relativamente pequeños y asi se obtiene una mejor precisión de la estimación.
  • Los los valores p, son un valor p bajo (generalmente <0.05), en todos es menor el valor p.

Punto 5:

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.

Punto 6:

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

Conclusiones gerenciales:

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.