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:

Características 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

Caso : Vivienda 1

Pasos requeridos para la obtención de los resultados

1. Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

#head(vivienda,10)
knitr::kable(head(vivienda,5),align="ccccccccccccccc" , caption = "Base de Datos Vivienda") %>%
  kable_styling(font_size = 10)
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

Se realiza limpieza de datos longitud , latitud

head(base_1,3)

base_total <- vivienda[!is.na(vivienda$latitud) & !is.na(vivienda$longitud), ]
knitr::kable(head(base_total,5),align="ccccccccccccccc" , caption = "Base de Datos Vivienda") %>%
  kable_styling(font_size = 10)
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


En esta gráfica miramos como se traslapan las viviendas de las Zona Norte con otras zonas

leaflet() %>% addTiles() %>% 
  setView(lng = -76.52, lat = 3.44, zoom = 12)  %>%  # Centrar
  addCircleMarkers(
    lng = base_total$longitud,
    lat = base_total$latitud,
    popup = as.character(paste0(base_total$zona, " Tipo:", base_total$tipo, " Estrato:", base_total$estrato, " Precio:", base_total$preciom, "'000.000", " Pisos:", base_total$piso)),
    stroke = FALSE,
    fillOpacity = 1,
    radius = 4,
    fillColor = colorFactor(palette = "Set1", domain = base_total$zona)(base_total$zona)
  )

Para el estudio de las casas en el caso de los nulos se les imputa la media a los valores nulos en el campo “piso” y “parqueaderos”

base_casas <- subset(base_total, tipo == "Casa" )
base_1 <- subset(base_total, tipo == "Casa" & zona == "Zona Norte")

#Realizamos una inputación de nulos a pisos  ya que se va utilizar en el 
#analisis del punto 2
#la variable piso no se necestia en el modelo por eso no se realiza inputacion  solo la realizamos para parqueadores
#sacamos la media
media_parqueaderos <- round(mean(as.numeric(base_1$parqueaderos), na.rm = TRUE))
#asignamos la media

base_1$parqueaderos[is.na(base_1$parqueaderos)] <- media_parqueaderos
#connversion tipo numerico
base_1$parqueaderos<- as.numeric(base_1$parqueaderos)
knitr::kable(head(base_1,3),align="ccccccccccccccc" , caption = "Base 1") %>%
  kable_styling(font_size = 12)
Base 1
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
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
4057 Zona Norte 02 6 750 445 2 7 6 Casa acopi -76.52950 3.38527

Validamos los nulos

nulos_por_columna <- colSums(is.na(base_1))
# Mostrar el resultado en forma vertical
for (i in 1:length(nulos_por_columna)) {
  cat(names(nulos_por_columna)[i], ": ", nulos_por_columna[i], "\n")
}
## id :  0 
## zona :  0 
## piso :  372 
## estrato :  0 
## preciom :  0 
## areaconst :  0 
## parqueaderos :  0 
## banios :  0 
## habitaciones :  0 
## tipo :  0 
## barrio :  0 
## longitud :  0 
## latitud :  0

Visualizamos la distribución de las viviendas

leaflet() %>% addTiles() %>% 
  setView(lng = -76.52, lat = 3.44, zoom = 12)  %>%  # Centrar
  addCircleMarkers(
    lng = base_1$longitud,
    lat = base_1$latitud,
    popup = as.character(paste0(base_1$zona, " Tipo:", base_1$tipo, " Estrato:", base_1$estrato, " Precio:", base_1$preciom, "'000.000", " Pisos:", base_1$piso)),
    stroke = FALSE,
    fillOpacity = 1,
    radius = 4,
    color="blue"
  )

Error en datos : puede tener errrores en la adjudicación de la zona a la respectiva vivienda , puede ser un error en la digitación o desactualización de las zonas de Cali as mismo puede ser otro error en digitación el longitud y latitud

2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

Histograma Precio

# Calcular la media y la mediana
media_precio <- mean(base_1$preciom)
mediana_precio <- median(base_1$preciom)
#Histograma
histograma_precio <- plot_ly(data = base_1, x = ~preciom, type = "histogram", marker = list(color = "green"))  %>%
layout(title = "Histograma Precio de Casas")
histograma_precio
media_precio
## [1] 445.9058
mediana_precio
## [1] 390

Los precios varian en diferentes rango, la media del precio para la Zona Norte en Casas es de 445 millones y la mediana es 390 millones

Histograma Area Construida

# Calcular la media y la mediana
media_areaconst <- mean(base_1$areaconst)
mediana_areaconst <- median(base_1$areaconst)
#Histograma
histograma_areaconst <- plot_ly(data = base_1, x = ~areaconst, type = "histogram", marker = list(color = "blue"),name="Area Construida")  %>%
layout(title = "Histograma Area Construida en Casas")
histograma_areaconst
media_areaconst
## [1] 264.8505
mediana_areaconst
## [1] 240

El area construida varian en diferentes rango, la media del area para la Zona Norte en Casas es de 264 m2 y la mediana es 240 m2 , los valores son cercanos entre la media y la mediana

ggplot(base_1, aes(x = areaconst, y = preciom)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Área Construida", y = "Precio", title = "Correlación entre Área Construida y Precio en Casas")
## `geom_smooth()` using formula = 'y ~ x'

Se puede observar que a media que aumenta el area construida aumenta el precio del tipo Casa en esta zona Norte, a medida que aumenta el precio se va dispensando como se puede apreciar cuando el area mide mas de 500 m2

Histograma Baños

# Calcular la media y la mediana
media_banios <- mean(base_1$banios)
mediana_banios <- median(base_1$banios)
#Histograma
histograma_banios <- plot_ly(data = base_1, x = ~banios, type = "histogram", marker = list(color = "pink"),name="banio") %>%
layout(title = "Histograma Baños en Casas")
histograma_banios
media_banios
## [1] 3.555402
mediana_banios
## [1] 3

Los baños de la viviendas analizados para la Zona Norte en Casas es de 3 baños igual a la mediana , y estan dentro del rango de el primer cuartil 2 baños y tercel cuartil 4 baños

ggplot(base_1, aes(x = factor(banios), y = preciom, fill = factor(banios))) +
  geom_boxplot() +
  labs(x = "Cantidad de Baños", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Baños en Casas") +
  scale_fill_discrete(name = "Cantidad de Baños")

La cantidad de baños sigue una tendencia creciente a medida que el precio aumenta, sin embaro apreciamos informacion done no existen baños ,puede ser un error en la inscripción de los datos.

Histograma Habitaciones

# Calcular la media y la mediana
media_habitaciones <- mean(base_1$habitaciones)
mediana_habitaciones <- median(base_1$habitaciones)
#Histograma
histograma_habitaciones <- plot_ly(data = base_1, x = ~habitaciones, type = "histogram", marker = list(color = "blue")) %>%
layout(title = "Histograma Habitaciones en Casas")
histograma_habitaciones
media_habitaciones
## [1] 4.506925
mediana_habitaciones
## [1] 4

Las habitaciones de las viviendas analizadas para la Zona Norte en Casas es de 4 habitaciones igual a la mediana , y estan dentro del rango de el primer cuartil 3 habitaciones y tercel cuartil 5 habitaciones

ggplot(base_1, aes(x = factor(habitaciones), y = preciom, fill = factor(habitaciones))) +
  geom_boxplot() +
  labs(x = "Cantidad de Habitaciones", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Habitaciones") +
  scale_fill_discrete(name = "Cantidad de Habitaciones en Casas")

En le boxplot el numero de habitaciones no es tan notable una tendencia según su cantidad.

Distribución Zonas en Viviendas tipo Casa

La distribución del tipo de vivienda Casas , para nuestro caso de estudio la Zona Norte en segunda posicion contiene un 22.9% del total de la población estudiada de casas.

plot_ly(base_casas, labels = ~zona, type = 'pie')  %>%
  layout(title = "Distribución de zona si la vivienda es Casa")

Análisis de Correlación

summary(base_1)
##        id             zona               piso              estrato     
##  Min.   :  58.0   Length:722         Length:722         Min.   :3.000  
##  1st Qu.: 766.2   Class :character   Class :character   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Mode  :character   Median :4.000  
##  Mean   :2574.6                                         Mean   :4.202  
##  3rd Qu.:4225.0                                         3rd Qu.:5.000  
##  Max.   :8319.0                                         Max.   :6.000  
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 2.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 2.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 2.109   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:722         Length:722         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.452  
##  Median :3.468  
##  Mean   :3.460  
##  3rd Qu.:3.482  
##  Max.   :3.496
knitr::kable(head(base_1),align="ccccccccccccccc" , caption = "Base 1") %>%
  kable_styling(font_size = 12)
Base 1
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
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
4057 Zona Norte 02 6 750 445 2 7 6 Casa acopi -76.52950 3.38527
4460 Zona Norte 02 4 625 355 3 5 5 Casa acopi -76.53179 3.40590
6081 Zona Norte 02 5 750 237 2 6 6 Casa acopi -76.54044 3.36862
7824 Zona Norte 02 4 600 160 1 4 5 Casa acopi -76.55210 3.42125
library(corrplot)
correlacion<-round(cor(base_1[,c("preciom","areaconst","estrato","banios","habitaciones")]), 2)
corrplot(correlacion, method="number", type="upper")

La tabla de correlación por medio de la libreria corrplot nos muestra la relación de las variables numericas, para nuestro análisis vamos a validar la clase de correlación de la variable y (precionm) contra las diferentes X, dentro de gráfica se puede observar lo siguiente:

  1. Existe una correlacion moderada positiva entre la variable “preciom” y “areaconst” del 0.73, lo que quiere decir es que a mayor área construida, mayor precio.

  2. Existe una correlacion moderada positiva entre la variable “preciom” y “estrato” del 0.61, lo que quiere decir es que a mayor sea el estrato, mayor es el precio.

  3. Existe una correlacion moderada positiva entre la variable “preciom” y “baños” del 0.52, lo que quiere decir es que a mayor sea la cantidad de baños sea mayor es el precio.

  4. Entre las variables preciom y habitaciones hay una correlación debil de 0.32

3.Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

modelo = lm(preciom~areaconst+estrato+habitaciones+parqueaderos+banios, data = base_1)
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -924.94  -77.71  -17.66   45.90 1081.29 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -251.05177   30.11848  -8.335 3.94e-16 ***
## areaconst       0.81090    0.04352  18.634  < 2e-16 ***
## estrato        84.61108    7.17727  11.789  < 2e-16 ***
## habitaciones    0.95948    4.10569   0.234  0.81529    
## parqueaderos   16.55976    5.70396   2.903  0.00381 ** 
## banios         24.57669    5.35583   4.589 5.26e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.2 on 716 degrees of freedom
## Multiple R-squared:  0.6548, Adjusted R-squared:  0.6524 
## F-statistic: 271.6 on 5 and 716 DF,  p-value: < 2.2e-16

Modelo seria el siguiente :

Y= -251.05 +0.81X1+84.61X2+0.95X3+16.55X4 +24.57X5

Análisis del modelo

B0 (intercepto) es significativo ya que si se compara con  α= 0.05 con p-value=3.94e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es-251.05

B1 (areaconst) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B1=0.81 lo que quiere decir es que por cada metro cuadrado construido aumentaría 0.81 millones de pesos si las demás variables equivalen a cero

B2 (estrato) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=84.6 lo que quiere decir es que por cada estrato más alto, aumenta 84 millones de pesos si las demás variables equivalen a cero

B3 (habitaciones) No es significativo ya que si se compara con  α= 0.05 con p-value=0.81 NO se rechaza la hipótesis nula , B3=0.95 lo que quiere decir es que a medida de que aumenta las habitaciones, aumentaría 0.95 millones de pesos

B4 (parqueadores) es significativo ya que si se compara con  α= 0.05 con p-value=0.00381, se rechaza la hipótesis nula , B4=16.5 lo que quiere decir es que por cada parqueadero, aumentaría 16.5 millones de pesos si las demás variables equivalen a cero

B5 (banios) es significativo ya que si se compara con  α= 0.05 con p-value=5.26e-06, se rechaza la hipótesis nula , B5=24.5 lo que quiere decir es que por cada baño, aumentaría 24.5 millones de pesos si las demás variables equivalen a cero

R2 0.6548 lo que intepreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo

R2 Ajustado 0.6524 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2

A continuación se va a seleccionar las variables independientes que si aportan al modelo , vamos hacer un modelo de seleccion por pasos con el paquete “MASS” con la función “stepAIC”

seleccion=stepAIC(modelo,direction=c("both"))
## Start:  AIC=7318.44
## preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios
## 
##                Df Sum of Sq      RSS    AIC
## - habitaciones  1      1367 17926987 7316.5
## <none>                      17925620 7318.4
## - parqueaderos  1    211017 18136636 7324.9
## - banios        1    527174 18452794 7337.4
## - estrato       1   3479343 21404963 7444.5
## - areaconst     1   8693418 26619038 7601.9
## 
## Step:  AIC=7316.49
## preciom ~ areaconst + estrato + parqueaderos + banios
## 
##                Df Sum of Sq      RSS    AIC
## <none>                      17926987 7316.5
## + habitaciones  1      1367 17925620 7318.4
## - parqueaderos  1    211907 18138894 7323.0
## - banios        1    758683 18685670 7344.4
## - estrato       1   3653015 21580002 7448.4
## - areaconst     1   9180206 27107193 7613.0
summary(seleccion)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = base_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -923.02  -77.48  -17.46   45.35 1083.51 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -248.00942   27.14165  -9.138  < 2e-16 ***
## areaconst       0.81313    0.04244  19.162  < 2e-16 ***
## estrato        84.21240    6.96698  12.087  < 2e-16 ***
## parqueaderos   16.59030    5.69870   2.911  0.00371 ** 
## banios         25.22467    4.57920   5.509 5.05e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.1 on 717 degrees of freedom
## Multiple R-squared:  0.6548, Adjusted R-squared:  0.6528 
## F-statistic:   340 on 4 and 717 DF,  p-value: < 2.2e-16

Con lo anterior el modelo seleccionado “modelo2var” tendria la siguiente forma

modelo2var =lm(preciom~areaconst+estrato+parqueaderos+banios, data = base_1)
summary(modelo2var)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = base_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -923.02  -77.48  -17.46   45.35 1083.51 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -248.00942   27.14165  -9.138  < 2e-16 ***
## areaconst       0.81313    0.04244  19.162  < 2e-16 ***
## estrato        84.21240    6.96698  12.087  < 2e-16 ***
## parqueaderos   16.59030    5.69870   2.911  0.00371 ** 
## banios         25.22467    4.57920   5.509 5.05e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 158.1 on 717 degrees of freedom
## Multiple R-squared:  0.6548, Adjusted R-squared:  0.6528 
## F-statistic:   340 on 4 and 717 DF,  p-value: < 2.2e-16

Modelo seleccionado

modelo2var= -248.00 +0.81X1+84.21X2+16.59X3+25.22X4

Al comparar los dos modelos se ve lo siguiente:

  • El Error residual se redujo de 158.2 a 158.1.

  • R2 0.6548 lo que intepreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo

  • R2 ajustado el modelo aumento a 0.6528 el modelo anterior daba 0.6524 , es decir explica 65.28% aportan ala variabilidad

Análisis del modelo

B0 (intercepto) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es-248

B1 (areaconst) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B1=0.81 lo que quiere decir es que por cada metro cuadrado construido aumentaría 0.81 millones de pesos si las demás variables equivalen a cero

B2 (estrato) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=84.21 lo que quiere decir es que por cada estrato más alto, aumenta 84.21 millones de pesos si las demás variables equivalen a cero

B3 (parqueadores) es significativo ya que si se compara con  α= 0.05 con p-value=0.00371, se rechaza la hipótesis nula , B3=16.59 lo que quiere decir es que por cada parqueadero, aumentaría 16.59 millones de pesos si las demás variables equivalen a cero

B4 (banios) es significativo ya que si se compara con  α= 0.05 con p-value=5.05e-06, se rechaza la hipótesis nula , B4=25.22 lo que quiere decir es que por cada baño, aumentaría 25.22 millones de pesos si las demás variables equivalen a cero

Tabla Anova

anova_modelo2=aov(modelo2var)
summary(anova_modelo2)
##               Df   Sum Sq  Mean Sq F value   Pr(>F)    
## areaconst      1 27773710 27773710 1110.83  < 2e-16 ***
## estrato        1  5069012  5069012  202.74  < 2e-16 ***
## parqueaderos   1   397712   397712   15.91 7.34e-05 ***
## banios         1   758683   758683   30.34 5.05e-08 ***
## Residuals    717 17926987    25003                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A continuación se puede ver la significancia de la regresión, por medio de la prueba F la cual es la prueba de hipotesis cOmo tenemos 4 variables, tenemos 4 hipotesis.

Variable 1(areaconst )H0: B1 = 0, H1: B1 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el area contruida si es significativa para el modelo de regresión.

Variable 2(estrato )H0: B2 = 0, H1: B2 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el estrato si es significativa para el modelo de regresión.

Variable 3(parqueaderos)H0: B3 = 0, H1: B3 <> 0 , pR(>f)< 7.34e-05 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el parqueadero si es significativa para el modelo de regresión.

Variable 4(banios)H0: B4 = 0, H1: B4 <> 0 , pR(>f)< 5.05e-08 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , los baños son significativos para el modelo de regresión.

Con esto confirmamos que todas las variables aportan al modelo de regresión lineal múltiple por lo cual se mantiene el modelo donde explicaria el precio del tipo de vivienda Casa en la zona Norte

modelo2var= -248.00 +0.81X1+84.21X2+16.59X3+25.22X4

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

par(mfrow = c(2, 2))
plot(modelo2var, pch=16)

El grafico Residuals Se puede apreciar que tiene valores que se van abriendo al final logrando visualizar atipicos como son 208, 513 ,632

El grafico Q-Q plot muestra en el lado derecho hay una desviación lo que puede hacer que no halla normalidad

El grafico de Residuals vs Leverage se puede apreciar que solo hay un dato que se sale de las bandas , por lo cual es poco probable que afecte las estimaciones

Supuesto de normalidad Jarque

# Prueba Jarque -Bera
#h0 Normalidad (a=0,k=3)
#h1 No hay Normalidad 

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
jarque.bera.test(resid(modelo2var))
## 
##  Jarque Bera Test
## 
## data:  resid(modelo2var)
## X-squared = 3514.8, df = 2, p-value < 2.2e-16

H0 provienen de una poblacion normal com media igual a 0

H1 no provienen de una poblacion normal con media igual a 0

El valor P de la prueba es menor a 0.05 se descarta H0 , por lo cual no hay normalidad en los residuales y las pruebas de hipótesis no es confiable

Supuesto de normalidad Shapiro

residual=shapiro.test(resid(modelo2var))
residual
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo2var)
## W = 0.83408, p-value < 2.2e-16

H0 provienen de una poblacion normal com media igual a 0

H1 no provienen de una poblacion normal con media igual a 0

El valor P es menor a 00.5 se descarta la H0 por lo cual se acepta H1 no proviene de una distribucion normal

Supuesto varianza constante o de Homocedasticidad

varianza_cons=bartlett.test(list(base_1$preciom ,base_1$areaconst,base_1$estrato,base_1$parqueaderos,base_1$banios))
varianza_cons
## 
##  Bartlett test of homogeneity of variances
## 
## data:  list(base_1$preciom, base_1$areaconst, base_1$estrato, base_1$parqueaderos, base_1$banios)
## Bartlett's K-squared = 19533, df = 4, p-value < 2.2e-16

H0 =varianza 1= varianza 2 = varianza j = cte

H1 =varianza 1 <> varianza 2 <> varianza j <> cte

como p-value <0.05 se rechaza la hipotesis nula se acepta H1

La hipotesis alterna la varianza no es constante , lo cual sugiere un problema con las observaciones

Supuesto de independencia

La prueba de este supuesto se conoce como autocorrelacion , lo que se espera a manera grafica es ver una dispersión sin patron para validar su independencia

#grafico residual
res_indep<- resid(modelo2var)
plot(res_indep)

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
dwtest(modelo2var ,alternative ="greater")
## 
##  Durbin-Watson test
## 
## data:  modelo2var
## DW = 1.6319, p-value = 2.995e-07
## alternative hypothesis: true autocorrelation is greater than 0

H0 = Independencia

H1 = Dependencia

El p valor es menor a 0.05 de significancia, por lo cual se rechaza la hipótesis nula y se acepta la alternativa

5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

Predicción Estrato 4

predict(modelo2var, data.frame(areaconst=200, estrato=4, parqueaderos=1, banios=2 ),interval = "confidence")
##       fit      lwr      upr
## 1 318.505 299.4819 337.5282

Para una vivienda de tipo Casa en la Zona Norte estrato 4 , el valor promedio es de 318 millones , como minimo 299 millones y por maximo 338 millones.

Predicción Estrato 5

predict(modelo2var, data.frame(areaconst=200, estrato=5, parqueaderos=1, banios=2 ),interval = "confidence")
##        fit     lwr      upr
## 1 402.7174 377.644 427.7908

Para una vivienda de tipo Casa en la Zona Norte estrato 5 , el valor promedio es de 402 millones , como minimo 377 millones y por maximo 428 millones.

6. Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

credito_aprob <- 350
#Se toma la base utilizada que ya filtra Zona Norte y Casa
 oferta_casa <- subset(base_1 , areaconst >= 200 & parqueaderos >=1 & 
                   banios >= 2 & habitaciones >= 4 & estrato >= 4) %>%
  mutate(precio = predict(modelo2var, .)) %>%
  filter(precio <= credito_aprob)

#Se ordena por el area construida 
oferta_casa  <- oferta_casa[order(-oferta_casa$areaconst), ]
oferta_casa  <- head(oferta_casa,5)


knitr::kable(oferta_casa,align="ccccccccccccccc" , caption = "Ofertas Casas") %>%
  kable_styling(font_size = 12)
Ofertas Casas
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud precio
1222 Zona Norte 02 4 360 216 2 2 4 Casa la merced -76.5139 3.48386 348.1054
require(leaflet)

leaflet() %>% addTiles() %>% 
  setView(lng =  -76.5159, lat = 3.499, zoom = 13)  %>%
  addCircleMarkers(lng = oferta_casa$longitud,
                   lat = oferta_casa$latitud,
                   label = as.character(paste0(oferta_casa$tipo, " est:", oferta_casa$estrato, " Precio:",oferta_casa$preciom, "'000.000", " Pisos:", oferta_casa$piso, " Parqueaderos: ", oferta_casa$parqueaderos)), 
                   stroke = FALSE, 
                   fillOpacity = 0.5,
                   radius = 8,
                   color = 'blue'
                   )

Caso : Vivienda 2

1. Realice un filtro a la base de datos e incluya solo las ofertas de : base2: Apartamentos, de la zona sur de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

Filtramos la base total la cual ya tenia limpieza dela informacion de los nulos

base_aptos <- subset(base_total, tipo == "Apartamento" )

knitr::kable(head(base_aptos),align="ccccccccccccccc" , caption = "Base Apartamentos") %>%
  kable_styling(font_size = 12)
Base Apartamentos
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
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
7497 Zona Norte 02 6 520 98 2 2 2 Apartamento acopi -76.54999 3.43505
5424 Zona Norte 03 4 320 108 2 3 3 Apartamento acopi -76.53638 3.40770
base_2 <- subset(base_aptos, zona == "Zona Sur")

knitr::kable(head(base_2),align="ccccccccccccccc" , caption = "Base Apartamentos Zona Sur") %>%
  kable_styling(font_size = 12)
Base Apartamentos Zona Sur
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5098 Zona Sur 05 4 290 96 1 2 3 Apartamento acopi -76.53464 3.44987
698 Zona Sur 02 3 78 40 1 1 2 Apartamento aguablanca -76.50100 3.40000
8199 Zona Sur NA 6 875 194 2 5 3 Apartamento aguacatal -76.55700 3.45900
1241 Zona Sur NA 3 135 117 NA 2 3 Apartamento alameda -76.51400 3.44100
5370 Zona Sur NA 3 135 78 NA 1 3 Apartamento alameda -76.53600 3.43600
6975 Zona Sur 06 4 220 75 1 2 3 Apartamento alférez real -76.54627 3.39109
#Realizamos una inputación de nulos a pisos  ya que se va utilizar en el 
#analisis del punto 2

#sacamos la media
media_piso_aptos <- round(mean(as.numeric(base_2$piso), na.rm = TRUE))
media_parqueaderos_aptos <- round(mean(as.numeric(base_2$parqueaderos), na.rm = TRUE))
#asignamos la media
base_2$piso[is.na(base_2$piso)] <- media_piso_aptos
base_2$parqueaderos[is.na(base_2$parqueaderos)] <- media_parqueaderos_aptos
#connversion tipo numerico
base_2$piso<- as.numeric(base_2$piso)
base_2$parqueaderos<- as.numeric(base_2$parqueaderos)


Validamos nulos

nulos_por_columna_aptos <- colSums(is.na(base_2))
# Mostrar el resultado en forma vertical
for (i in 1:length(nulos_por_columna_aptos)) {
  cat(names(nulos_por_columna_aptos)[i], ": ", nulos_por_columna_aptos[i], "\n")
}
## id :  0 
## zona :  0 
## piso :  0 
## estrato :  0 
## preciom :  0 
## areaconst :  0 
## parqueaderos :  0 
## banios :  0 
## habitaciones :  0 
## tipo :  0 
## barrio :  0 
## longitud :  0 
## latitud :  0
leaflet() %>% addTiles() %>% 
  setView(lng = -76.5159, lat = 3.4368, zoom = 12)  %>%  # Centrar
  addCircleMarkers(
    lng = base_2$longitud,
    lat = base_2$latitud,
    popup = as.character(paste0(base_1$zona, " Tipo:", base_2$tipo, " Estrato:", base_2$estrato, " Precio:", base_2$preciom, "'000.000", " Pisos:", base_2$piso)),
    stroke = FALSE,
    fillOpacity = 1,
    radius = 4,
    color="orange"
  )

Error en datos : puede tener errrores en la adjudicación de la zona a la respectiva vivienda , puede ser un error en la digitación o desactualización de las zonas de Cali ,asi mismo puede ser otro error en digitación el longitud y latitud

2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

Histograma Precio

# Calcular la media y la mediana
media_precio_apto <- mean(base_2$preciom)
mediana_precio_apto <- median(base_2$preciom)
#Histograma
histograma_precio_apto <- plot_ly(data = base_2, x = ~preciom, type = "histogram", marker = list(color = "green")) %>%
layout(title = "Histograma Precios de Apartamentos")
histograma_precio_apto
media_precio_apto
## [1] 297.2917
mediana_precio_apto
## [1] 245

Los precios varian en diferentes rango, la media del precio para la Zona Sur en Apartamentos es de 297 millones y la mediana es 245 millones

# Calcular la media y la mediana
media_area_apto <- mean(base_2$areaconst)
mediana_area_apto <- median(base_2$areaconst)
#Histograma
histograma_area_apto <- plot_ly(data = base_2, x = ~areaconst, type = "histogram", marker = list(color = "blue"),name="Area Construida")
histograma_area_apto
media_area_apto
## [1] 97.47028
mediana_area_apto
## [1] 85

El area construida cuando la vivienda e varian en diferentes rango, la media del area para la Zona Sur en Apartamento es de 97.47 m2 y la mediana es 85m2 , los valores son cercanos entre la media y la mediana

ggplot(base_2, aes(x = areaconst, y = preciom)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Área Construida", y = "Precio", title = "Correlación entre Área Construida y Precio en Apartamentos")
## `geom_smooth()` using formula = 'y ~ x'

Se puede observar que a media que aumenta el area construida aumenta el precio del tipo Apartamento en esta zona Sur, a medida que aumenta el precio se va dispersando mas el area especialmente apartir de aproximadamente de 200 m2

Histograma Baños

# Calcular la media y la mediana
media_banios_apto <- mean(base_2$banios)
mediana_banios_apto <- median(base_2$banios)
#Histograma
histograma_banios_apto <- plot_ly(data = base_2, x = ~banios, type = "histogram", marker = list(color = "pink"),name="banio") %>%
layout(title = "Histograma Baños en Apartamentos")
histograma_banios
media_banios_apto
## [1] 2.488339
mediana_banios_apto
## [1] 2

Los baños de la viviendas analizados para la Zona Sur en Apartamentos es de 2 baños igual a la mediana

ggplot(base_2, aes(x = factor(banios), y = preciom, fill = factor(banios))) +
  geom_boxplot() +
  labs(x = "Cantidad de Baños", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Baños en Apartamentos") +
  scale_fill_discrete(name = "Cantidad de Baños")

En el Box Plot podemos apreciar que a medidas de que los apartamentos tiene mas baños aumenta el precio de la vivienda a comparación de las casas este tiene una tendencia más marcada.

Histograma de Habitaciones

# Calcular la media y la mediana
media_habita_apto <- mean(base_2$habitaciones)
mediana_habita_apto <- median(base_2$habitaciones)
#Histograma
histograma_habita_apto <- plot_ly(data = base_1, x = ~habitaciones, type = "histogram", marker = list(color = "blue")) %>%
layout(title = "Histograma Habitaciones en Apartamentos")
histograma_habita_apto
media_habita_apto
## [1] 2.965554
mediana_habita_apto
## [1] 3

Las habitaciones de las viviendas analizadas para la Zona Sur en Apartamentos es de 3 habitaciones igual a la mediana .

ggplot(base_2, aes(x = factor(habitaciones), y = preciom, fill = factor(habitaciones))) +
  geom_boxplot() +
  labs(x = "Cantidad de Habitaciones", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Habitaciones") +
  scale_fill_discrete(name = "Cantidad de Habitaciones en Apartamentos")

En le boxplot el número de habitaciones a medida que aumenta la cantidad de habitaciones aumenta el precio

Distribución Zonas en Viviendas tipo Apartamento

La distribución del tipo de vivienda Casas , para nuestro caso de estudio la Zona Sur encabeza la zona con 54.6% del total de la población estudiada de apartamentos , por lo cual se vuelve una zona mas factible para encontrar apartamentos de acuerdo alas necesidades del cliente

plot_ly(base_aptos, labels = ~zona, type = 'pie')  %>%
  layout(title = "Distribución de zona si la vivienda es Apartamento")

Análisis de Correlación

library(corrplot)
correlacion_apto<-round(cor(base_2[,c("preciom","areaconst","estrato","banios","habitaciones", "piso")]), 3)

corrplot(correlacion_apto, method="number", type="upper")

`La tabla de correlacion por medio de la libreria corrplot nos muestra la relación de las variables numericas, para nuestro análisis vamos a validar la clase de correlación de la variable y (preciom) contra las diferentes X, dentro de gráfica se puede observar lo siguiente:

  1. Existe una correlacion fuerte positiva entre la variable “preciom” y “areaconst” del 0.76, lo que quiere decir es que a mayor área construida, mayor precio.

  2. Existe una correlacion moderada positiva entre la variable “preciom” y “estrato” del 0.67, lo que quiere decir es que a mayor sea el estrato, mayor es el precio.

  3. Existe una correlacion moderada positiva entre la variable “preciom” y “baños” del 0.72, lo que quiere decir es que a mayor sea la cantidad de baños sea mayor es el precio.

  4. Entre las variables preciom y habitaciones hay una correlación debil de 0.33

3.Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

modelo_apto = lm(preciom~areaconst+estrato+habitaciones+parqueaderos+banios, data = base_2)
summary(modelo_apto)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base_2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1151.66   -37.75    -2.59    38.06   922.20 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -266.91089   12.89132 -20.705  < 2e-16 ***
## areaconst       1.36019    0.04843  28.084  < 2e-16 ***
## estrato        59.23620    2.66624  22.217  < 2e-16 ***
## habitaciones  -17.89121    3.32828  -5.376 8.27e-08 ***
## parqueaderos   73.20959    3.65913  20.007  < 2e-16 ***
## banios         44.71978    2.98956  14.959  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared:  0.7648, Adjusted R-squared:  0.7643 
## F-statistic:  1808 on 5 and 2781 DF,  p-value: < 2.2e-16

Análisis del modelo

B0 (intercepto) es significativo ya que si se compara con  α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es -266.91

B1 (areaconst) es significativo ya que si se compara con  α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula , B1= 1.36 lo que quiere decir es que por cada metro cuadrado construido aumentaría 1.36 millones de pesos si las demás variables equivalen a cero.

B2 (estrato) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=59.2 lo que quiere decir es que por cada estrato más alto, aumenta 59 millones de pesos si las demás variables equivalen a cero

B3 (habitaciones) es significativo ya que si se compara con  α= 0.05 con p-value=8.27e-08 se rechaza la hipótesis nula , B3=-17.89 lo que quiere decir es que por cada habitación disminuye 17.89 millones de pesos

B4 (parqueadores) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 , se rechaza la hipótesis nula , B4=73.2 lo que quiere decir es que por cada parqueadero, aumentaría 73 millones de pesos si las demás variables equivalen a cero

B5 (banios) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16, se rechaza la hipótesis nula , B5=44.7 lo que quiere decir es que por cada baño, aumentaría 44 millones de pesos si las demás variables equivalen a cero

R2 0.7648 lo que intepreta como el 76.48% de las variaciones del precio son explicadas por las variables del modelo

R2 Ajustado 0.7643 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2.

A continuación se va a seleccionar las variables independientes que si aportan al modelo , vamos hacer un modelo de seleccion por pasos con el paquete “MASS” con la función “stepAIC”

seleccion_apto=stepAIC(modelo_apto,direction=c("both"))
## Start:  AIC=25270.02
## preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios
## 
##                Df Sum of Sq      RSS   AIC
## <none>                      24046940 25270
## - habitaciones  1    249861 24296801 25297
## - banios        1   1934830 25981770 25484
## - parqueaderos  1   3461298 27508239 25643
## - estrato       1   4268103 28315044 25723
## - areaconst     1   6819946 30866886 25964
summary(seleccion_apto)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base_2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1151.66   -37.75    -2.59    38.06   922.20 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -266.91089   12.89132 -20.705  < 2e-16 ***
## areaconst       1.36019    0.04843  28.084  < 2e-16 ***
## estrato        59.23620    2.66624  22.217  < 2e-16 ***
## habitaciones  -17.89121    3.32828  -5.376 8.27e-08 ***
## parqueaderos   73.20959    3.65913  20.007  < 2e-16 ***
## banios         44.71978    2.98956  14.959  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared:  0.7648, Adjusted R-squared:  0.7643 
## F-statistic:  1808 on 5 and 2781 DF,  p-value: < 2.2e-16

Con lo anterior la seleccionar el paquete MASS se puede apreciar que el modelo incial no tiene modificaciones ya que no exceptua ninguna de las variable

Intervalos de confianza

Se crean los intervalos y se le asigna el nivel de confianza

intervalos=predict(modelo_apto,interval="confidence",level=0.95)
head(intervalos,10)
##          fit       lwr       upr
## 1  209.58759 204.68024 214.49493
## 2   47.35223  38.46923  56.23523
## 3  668.72743 657.04338 680.41149
## 4  178.91535 169.76342 188.06728
## 5   81.14820  71.90969  90.38671
## 6  181.02362 176.51411 185.53312
## 7  190.91643 179.78321 202.04964
## 8  112.26609 104.30481 120.22737
## 9  116.55541 106.67867 126.43214
## 10 193.26532 188.68632 197.84431
anova_modelo_apto=aov(modelo_apto)
summary(anova_modelo_apto)
##                Df   Sum Sq  Mean Sq  F value Pr(>F)    
## areaconst       1 58732885 58732885 6792.388 <2e-16 ***
## estrato         1 12599342 12599342 1457.099 <2e-16 ***
## habitaciones    1      234      234    0.027  0.869    
## parqueaderos    1  4908634  4908634  567.678 <2e-16 ***
## banios          1  1934830  1934830  223.761 <2e-16 ***
## Residuals    2781 24046940     8647                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A continuación se puede ver la significancia de la regresión, por medio de la prueba F la cual es la prueba de hipotesis como tenemos 5 variables, tenemos 5 hipótesis.

Variable 1(areaconst )H0: B1 = 0, H1: B1 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el area contruida si es significativa para el modelo de regresión.

Variable 2(estrato )H0: B2 = 0, H1: B2 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el estrato si es significativa para el modelo de regresión.

Variable 3(habitaciones)H0: B3 = 0, H1: B3 <> 0 , pR(>f)> 0.869 es evidentemente mayor a 0.05 , por lo cual se acepta la hipotesis nula , la cantidad de habitaciones no son significativas para el modelo de regresión.

Variable 4(parqueaderos)H0: B3 = 0, H1: B3 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el parqueadero si es significativa para el modelo de regresión.

Variable 5(banios)H0: B4 = 0, H1: B4 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , los baños son significativos para el modelo de regresión.

Con la prueba anterior descartamos la variable habitaciones ya que no aporta al modelo de regresion lineal multiple

modelo2var_apto =lm(preciom~areaconst+estrato+parqueaderos+banios, data = base_2)
summary(modelo2var_apto)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = base_2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1109.27   -37.72    -2.73    36.70   934.82 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -310.70124   10.04119  -30.94   <2e-16 ***
## areaconst       1.31221    0.04784   27.43   <2e-16 ***
## estrato        60.97828    2.65971   22.93   <2e-16 ***
## parqueaderos   74.80319    3.66534   20.41   <2e-16 ***
## banios         38.76629    2.79074   13.89   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 93.45 on 2782 degrees of freedom
## Multiple R-squared:  0.7623, Adjusted R-squared:  0.762 
## F-statistic:  2231 on 4 and 2782 DF,  p-value: < 2.2e-16

Análisis del modelo

B0 (intercepto) es significativo ya que si se compara con  α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es -310.7

B1 (areaconst) es significativo ya que si se compara con  α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula , B1= 1.31 lo que quiere decir es que por cada metro cuadrado construido aumentaría 1.31 millones de pesos si las demás variables equivalen a cero.

B2 (estrato) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=60.9 lo que quiere decir es que por cada estrato más alto, aumenta 60.9 millones de pesos si las demás variables equivalen a cero

B3 (parqueadores) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16 , se rechaza la hipótesis nula , B4=74.8 lo que quiere decir es que por cada parqueadero, aumentaría 74.8 millones de pesos si las demás variables equivalen a cero

B5 (banios) es significativo ya que si se compara con  α= 0.05 con p-value=2e-16, se rechaza la hipótesis nula , B5=38.7 lo que quiere decir es que por cada baño, aumentaría 38.7millones de pesos si las demás variables equivalen a cero

R2 0.7623 lo que intepreta como el 76.23% de las variaciones del precio son explicadas por las variables del modelo

R2 Ajustado 0.762 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2.

Por lo cual nuevo modelo que explicaria el precio en el tipo de vivienda Apartamentos en la Zona Sur seria:

modelo2var_apto= -310.70 +1.31X1+60.97X2+74.8X3+38.76X4

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

par(mfrow = c(2, 2))
plot(modelo2var_apto, pch=16)

El grafico Residuals Se puede apreciar que tiene valores que se van abriendo al final logrando visualizar atipicos como son 1533, 2383

El grafico Q-Q plot muestra en el lado izquierdo donde inica hay una desviación hacia abajo , asi mismo ala drecha , lo que puede hacer que no halla normalidad

El grafico de Residuals vs Leverage se puede apreciar que solo hay un dato que se sale de las bandas , por lo cual es poco probable que afecte las estimaciones

Supuesto de normalidad Jarque

# Prueba Jarque -Bera
#h0 Normalidad (a=0,k=3)
#h1 No hay Normalidad 

library(tseries)
jarque.bera.test(resid(modelo2var_apto))
## 
##  Jarque Bera Test
## 
## data:  resid(modelo2var_apto)
## X-squared = 86810, df = 2, p-value < 2.2e-16

H0 provienen de una poblacion normal com media igual a 0

H1 no provienen de una poblacion normal con media igual a 0

El valor P de la prueba es menor a 0.05 se descarta H0 , por lo cual no hay normalidad en los residuales y las pruebas de hipótesis no es confiable

Supuesto de normalidad Shapiro

residual_apto=shapiro.test(resid(modelo2var_apto))
residual_apto
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo2var_apto)
## W = 0.78303, p-value < 2.2e-16

H0 provienen de una poblacion normal com media igual a 0

H1 no provienen de una poblacion normal con media igual a 0

El valor P es menor a 00.5 se descarta la H0 por lo cual se acepta H1 no proviene de una distribucion normal.

Supuesto varianza constante o de Homocedasticidad

varianza_cons_apto=bartlett.test(list(base_2$preciom ,base_2$areaconst,base_2$estrato,base_2$parqueaderos,base_2$banios))
varianza_cons_apto
## 
##  Bartlett test of homogeneity of variances
## 
## data:  list(base_2$preciom, base_2$areaconst, base_2$estrato, base_2$parqueaderos, base_2$banios)
## Bartlett's K-squared = 77493, df = 4, p-value < 2.2e-16

H0 =varianza 1= varianza 2 = varianza j = cte

H1 =varianza 1 <> varianza 2 <> varianza j <> cte

como p-value <0.05 se rechaza la hipotesis nula se acepta H1

La hipotesis alterna la varianza no es constante , lo cual sugiere un problema con las observaciones

Supuesto de independencia

La prueba de este supuesto se conoce como autocorrelacion , lo que se espera a manera grafica es ver una dispersión sin patron para validar su independencia, en este modelo se ve un patron de una agromeración en linea recta

#grafico residual
res_indep_apto<- resid(modelo2var_apto)
plot(res_indep_apto)

library(lmtest)
dwtest(modelo2var_apto ,alternative ="greater")
## 
##  Durbin-Watson test
## 
## data:  modelo2var_apto
## DW = 1.5293, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

Predicción Estrato 4

predict(modelo2var_apto, data.frame(areaconst=200, estrato=4, parqueaderos=1, banios=2 ),interval = "confidence")
##        fit      lwr      upr
## 1 347.9895 335.3314 360.6476

Para una vivienda de tipo Apartamento en la Zona Sur estrato 4 , el valor promedio es de 347.9 millones , como minimo 335.3 millones y por maximo 360.6 millones.

Predicción Estrato 5

predict(modelo2var_apto, data.frame(areaconst=200, estrato=5, parqueaderos=1, banios=2 ),interval = "confidence")
##        fit      lwr      upr
## 1 408.9678 396.3707 421.5649

Para una vivienda de tipo Apartamento en la Zona Sur estrato 5 , el valor promedio es de 408.9 millones , como minimo 396.3 millones y por maximo 421.5 millones.

6. Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 850 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

credito_aprob_apto=850
#Se toma la base utilizada que ya filtra Zona sur y tipo de vivienda apartamento
 oferta_apto <- subset(base_2 , areaconst >= 300 & parqueaderos >=3 & 
                   banios >= 3 & habitaciones >= 5 & estrato >= 5  
                  )%>%
  mutate(precio = predict(modelo2var_apto, .)) %>%
  filter(precio <= credito_aprob_apto)

#Se ordena por el area construida 
oferta_apto  <- oferta_apto[order(-oferta_apto$areaconst), ]
oferta_apto  <- head(oferta_apto,10)


knitr::kable(oferta_apto,align="ccccccccccccccc" , caption = "Ofetas Apartamentos") %>%
  kable_styling(font_size = 12)
Ofetas Apartamentos
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud precio
7512 Zona Sur 4 5 670 300 3 5 6 Apartamento seminario -76.55 3.409 806.094
require(leaflet)

leaflet() %>% addTiles() %>% 
  setView(lng =    -76.551, lat = 3.4091, zoom = 17)  %>%
  addCircleMarkers(lng = oferta_apto$longitud,
                   lat = oferta_apto$latitud,
                   label = as.character(paste0(oferta_apto$tipo, " est:", oferta_apto$estrato, " Precio:",oferta_apto$preciom, "'000.000", " Pisos:", oferta_apto$piso, " Parqueaderos: ", oferta_apto$parqueaderos)), 
                   stroke = FALSE, 
                   fillOpacity = 0.5,
                   radius = 8,
                   color = 'blue'
                   )

Conclusiones

Según nuestro análisis de datos para predecir el precio de la vivienda en casas y en apartamentos se toman las variables más significativas como son, área construida, estrato, parqueaderos, baños, por otro lado en ambos ejercicios el número de habitaciones no aportaba significativamente al modelo de predicción.

Para el estudio de tipo de vivienda “Casa” en la zona “Norte” el R2 0.6548 lo que interpreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo. R2 ajustado el modelo aumento a 0.6528 el modelo anterior daba 0.6524 , es decir explica 65.28% aportan a la variabilidad

Para el estudio de tipo de vivienda “Apartamento” en la zona “Sur” el R2 0.7623 lo que interpreta como el 76.23% de las variaciones del precio son explicadas por las variables del modelo, R2 Ajustado 0.762 Si alguna de las variables no aporta en términos de variabilidad por eso disminuye en comparación de R2.

En la validación de los supuestos se encuentra que no hay normalidad en los residuales, por lo cual la hipótesis no es confiable. así mismo se encuentra que la varianza no es constante lo que sugiere un problema con las observaciones

Oferta Casas: al realizar el análisis se encuentra una casa con valor de 348 millones en la Zona Norte, en el estrato 4 , 216 mt. cuadrados, 4 habitaciones, 2 baños y 2 parqueaderos, sería una buena oportunidad ya que el valor comercial es de 670 millones en un buen sector al lado de la carrera 56 con Calle 3 , sector residencial con múltiples zonas verdes.

Oferta Apartamentos: al realizar el análisis se encuentra una vivienda con valor de 806 millones en la Zona Sur, en el estrato 5 ,300 mts cuadrados , 6 habitaciones , 5 baños y 3 parqueaderos, sería una buena oportunidad ya que el valor comercial es de 360 millones en un buen sector al lado de la calle 52 con Avenida 3 , una zona residencial con buen acceso al transporte público.