CASO 1 (CASAS ZONA NORTE)

Punto 1

Filtramos solamente las casas de la zona norte. Primero vemos como esta escrito el dato “Casa” y “Zona Norte”, analizamos esto

unique_tipos_vivienda <- unique(vivienda$tipo)
unique_zonas_vivienda <- unique(vivienda$zona)
print(unique_tipos_vivienda)
## [1] "Casa"        "Apartamento" NA
print(unique_zonas_vivienda)
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA

Ahora que vemos que todos los registros conteniendo “Zona Norte” y “Casa” estan escritos de una sola manera estandar (ejemplo, que no existan datos esxriots como “casa” y despues como “Casa”, etc) ya podemos filtrar el dataset por zona norte y casa:

casas_norte=subset(vivienda, tipo=="Casa" & zona=="Zona Norte")
head(casas_norte)

Posicionamos las casas en el mapa de Cali:

map <- leaflet(casas_norte) %>%
  addTiles() %>%  # Add default OpenStreetMap tiles
  setView(lng = -76.5182934, lat = 3.4420511, zoom = 12)  # Set the initial view

map <- map %>%
  addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("$",preciom, "Millones"))

map

Los puntos no estan en la zona norte, se encuentran en toda la geografia de la ciudad de Cali, los datos no fueron bien formateados.

Punto 2

Creamos variables dummy para el estrato y para las zonas

casas_norte$E4<-as.numeric(casas_norte$estrato==4)
casas_norte$E5<-as.numeric(casas_norte$estrato==5)
casas_norte$E6<-as.numeric(casas_norte$estrato==6)

casas_norte$Zor<-as.numeric(casas_norte$zona=="Zona Oriente")
casas_norte$Zs<-as.numeric(casas_norte$estrato=="Zona Sur")
casas_norte$Zn<-as.numeric(casas_norte$estrato=="Zona Norte")
casas_norte$Zoe<-as.numeric(casas_norte$estrato=="Zona Oeste")
glimpse(casas_norte)
## Rows: 722
## Columns: 20
## $ id           <dbl> 1209, 1592, 4057, 4460, 6081, 7824, 7987, 3495, 141, 243,…
## $ zona         <chr> "Zona Norte", "Zona Norte", "Zona Norte", "Zona Norte", "…
## $ piso         <chr> "02", "02", "02", "02", "02", "02", "02", "03", NA, NA, N…
## $ estrato      <dbl> 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, 4, 5, 5, 4, …
## $ preciom      <dbl> 320, 780, 750, 625, 750, 600, 420, 490, 230, 190, 180, 50…
## $ areaconst    <dbl> 150, 380, 445, 355, 237, 160, 200, 118, 160, 435, 120, 21…
## $ parqueaderos <dbl> 2, 2, NA, 3, 2, 1, 4, 2, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ banios       <dbl> 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, 3, 4, 5, 5, …
## $ habitaciones <dbl> 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, 3, 4, 6, 4, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
## $ barrio       <chr> "acopi", "acopi", "acopi", "acopi", "acopi", "acopi", "ac…
## $ longitud     <dbl> -76.51341, -76.51674, -76.52950, -76.53179, -76.54044, -7…
## $ latitud      <dbl> 3.47968, 3.48721, 3.38527, 3.40590, 3.36862, 3.42125, 3.4…
## $ E4           <dbl> 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, …
## $ E5           <dbl> 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, …
## $ E6           <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zor          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zs           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zn           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zoe          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

Asociación entre las variables:

ggpairs(casas_norte[,2:9], title=" ")
## Warning: Removed 287 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 96 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 372 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 287 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 287 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 287 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 287 rows containing non-finite outside the scale range
## (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 287 rows containing non-finite outside the scale range
## (`stat_bin()`).
## Warning: Removed 287 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 287 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 287 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 287 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 287 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 287 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 287 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 287 rows containing missing values or values outside the scale range
## (`geom_point()`).

Definimos la variable target precio:

target_var <- "preciom"

Definimos las otras variables numericas

other_vars <- c("banios", "areaconst", "habitaciones")
target_var <- "preciom"
plot_banios <- "banios"
plot_area <- "areaconst"
plot_habitaciones <- "habitaciones"
plot_estrato <- "estrato"

Hacemos los PLOT:

plotly_banios <- plot_ly(data = casas_norte, x = ~get(plot_banios), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlation between", target_var, "and", plot_banios),
    xaxis = list(title = plot_banios),
    yaxis = list(title = target_var)
  )

plotly_area <- plot_ly(data = casas_norte, x = ~get(plot_area), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlation between", target_var, "and", plot_area),
    xaxis = list(title = plot_area),
    yaxis = list(title = target_var)
  )

plotly_habitaciones <- plot_ly(data = casas_norte, x = ~get(plot_habitaciones), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlation between", target_var, "and", plot_habitaciones),
    xaxis = list(title = plot_habitaciones),
    yaxis = list(title = target_var)
  )

plotly_estrato <- plot_ly(data = casas_norte, x = ~get(plot_estrato), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlation between", target_var, "and", plot_estrato),
    xaxis = list(title = plot_estrato),
    yaxis = list(title = target_var)
  )

Mostramos los PLOT:

print(plotly_banios)
print(plotly_habitaciones)
print(plotly_area)
print(plotly_estrato)

Podemos decir que la unica correlacion evidente es entre el area construida y el precio

Punto 3

modelo_R=lm(preciom ~ areaconst + E4 + E5 + E6 + habitaciones + parqueaderos + banios, data=casas_norte)
summary(modelo_R)
## 
## Call:
## lm(formula = preciom ~ areaconst + E4 + E5 + E6 + habitaciones + 
##     parqueaderos + banios, data = casas_norte)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -790.71  -74.72  -18.93   46.54  991.70 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   11.71883   27.15751   0.432  0.66631    
## areaconst      0.68098    0.05283  12.890  < 2e-16 ***
## E4            80.91006   24.55085   3.296  0.00106 ** 
## E5           147.53872   22.70871   6.497 2.29e-10 ***
## E6           281.68942   37.33161   7.546 2.74e-13 ***
## habitaciones   7.17906    5.69802   1.260  0.20839    
## parqueaderos  24.22922    5.86635   4.130 4.36e-05 ***
## banios        18.09024    7.62857   2.371  0.01816 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 154.9 on 427 degrees of freedom
##   (287 observations deleted due to missingness)
## Multiple R-squared:  0.607,  Adjusted R-squared:  0.6006 
## F-statistic: 94.24 on 7 and 427 DF,  p-value: < 2.2e-16

Interpretacion de los datos:

El intercepto no es estadísticamente significativo (p = 0.66631), idealmente debería ser menor que 0.05 lo que significa que no hay evidencia suficiente para afirmar que el valor predicho del precio es distinto de cero cuando todas las variables independientes son cero.

#areaconst: Por cada unidad de área construida, el precio de la vivienda aumenta en 0.68098 pesos, manteniendo constantes las otras variables. Este coeficiente es altamente significativo (p < 2e-16).

#Estratos Estrato 4: Las viviendas en estrato 4 cuestan 80.91 pesos mas las del estrato de referencia Estrato 5: Las viviendas en estrato 5 cuestan 147.53 pesos mas alto Estrato 6: Las viviendas en estrato 6 cuestan 281.68 pesos más alto. Los coeficientes de los estratos son altamente significativos

#habitaciones: Por cada habitación mas, el precio de la vivienda aumenta en 7.17 pesos manteniendo constantes las demás variables. El coeficiente no es estadísticamente significativo. Lo que significa que el número de habitaciones no tiene un alto impacto en el precio en este modelo.

#parqueaderos: Por cada parqueadero adicional, la vivienda cuesta 24.22 pesos mas

#banios: Por cada baño adicional, la vivienda cuesta 18 pesos mas.

#Significancia estadística Todos los coeficientes, excepto el intercepto y las habitaciones, son estadísticamente significativos. Esto indica que las demas variables incluidas en el modelo tienen un efecto significativo en el precio de la vivienda.

#Coeficiente de determinación R cuadrado

#Multiple R-squared: 0.607 (60.7%). Esto significa que el 60.7% de la variabilidad en el precio de las viviendas es explicada por las variables incluidas en el modelo.

#Adjusted R-squared: 0.60 (60%). El R cuadrado ajustado es muy similar al R cuadrado múltiple, lo que sugiere que el modelo no está sobreajustado.

El R cuadrado es alto, lo que indica que el modelo tiene un buen ajuste y explica una gran parte de la variabilidad en el precio.

Prueba F

F-statistic: 94.24. p-value: < 2.2e-16. El valor p es muy pequeño, lo que indica que el modelo en su conjunto es estadísticamente significativo. Es decir, al menos una de las variables independientes tiene un efecto significativo en el precio.

#Observaciones faltantes 287 observaciones fueron eliminadas debido a valores faltantes (missing values). Esto podría afectar la generalización del modelo si los datos faltantes no son aleatorios.

#Discusión y mejoras Resultados lógicos: Los coeficientes de areaconst, parqueaderos, banios, y los estratos (E4, E5, E6) tienen signos y magnitudes esperados.

#Variables omitidas: Falta incluir variables relevantes que podrían estar afectando el precio.

Punto 4

Validación de los supuestos:

Linealidad:

Dado que el modelo tiene un R-squared de 0.607, es probable que haya cierta linealidad.

Homocedasticidad:

Dado el rango amplio de los residuos (de -790.71 a 991.70), es posible que haya heterocedasticidad.

Normalidad

Dado que los residuos tienen una distribución asimétrica (mediana cerca de cero pero con valores extremos), es posible que no sean normales.

Multicolinealidad:

Dado que las variables E4, E5 y E6 son dummys, es poco probable que haya multicolinealidad entre ellas.

Punto 5

Crear el dataframe con las características:

vivienda_caso1 <- data.frame(
  areaconst = 200,
  parqueaderos = 1,
  banios = 2,
  habitaciones = 4,
  E4 = c(1, 0),  # 1 para estrato 4, 0 para estrato 5
  E5 = c(0, 1),  # 0 para estrato 4, 1 para estrato 5
  E6 = c(0, 0)   # 0 para ambos casos (no es estrato 6)
)

Mostrar el dataframe:

print(vivienda_caso1)
##   areaconst parqueaderos banios habitaciones E4 E5 E6
## 1       200            1      2            4  1  0  0
## 2       200            1      2            4  0  1  0

Predecir el precio:

prediccion_caso1 <- predict(modelo_R, newdata = vivienda_caso1)

Mostrar las predicciones:

print(prediccion_caso1)
##        1        2 
## 317.9507 384.5793

Para el estrato 4 se predice un precio de 317.9 millones de pesos para una vivienda con las características asignadas

Para el estrato 5 se predice un precio de 384.5 millones de pesos para una vivienda con las características asignadas

Punto 6

Para encontrar ofertas en la zona norte debemos encontrar precios por debajo de 317.9 millones en el estrato 4 y precios por debajo de 384.5 millones en estrato 5 (por lo predicho en el modelo)

casas_norte_ofertas_E4=subset(casas_norte, preciom<317.9 & estrato==4 & 
                                areaconst>=200 & parqueaderos>=1 & banios>=2 & 
                                habitaciones>=4)
casas_norte_ofertas_E4

Al tener un credito preaprobado de 350 millones se asume que las ofertas del estrato 4 no satisfacen el negocio por lo que hay ofertas por debajo de 317 millones y el crédito preaprobado es de 350 millones Se filtra mejor por el valor del crédito preaprobado en vez de el valor predicho por el modelo.

casas_norte_ofertas_E4=subset(casas_norte, preciom>350 & estrato==4 & 
                                areaconst>=200 & parqueaderos>=1 & banios>=2 & 
                                habitaciones>=4)
casas_norte_ofertas_E4 <- casas_norte_ofertas_E4[order(casas_norte_ofertas_E4$preciom),]
casas_norte_ofertas_E4

Se toman las primeras cinco ofertas (las 3 de 360 y las dos de 370 millones)

casas_norte_ofertas_E4
casas_norte_ofertas_E4 = casas_norte_ofertas_E4[1:5,]
casas_norte_ofertas_E4

Se ve que las ofertas superan las espectativas, hay casas de mas de 4 habitaciones, mas de 2 baños, mas de un parqueadero, mas de 200 metros cuadrados

map <- leaflet(casas_norte_ofertas_E4) %>%
  addTiles() %>%  # Add default OpenStreetMap tiles
  setView(lng = -76.5182934, lat = 3.4420511, zoom = 12)  # Set the initial view

map <- map %>%
  addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("$",preciom, "Millones"))

map

Con el estrato 5:

Como el precio predicho está por encima del credito preaprobado filtramos El precio entre 350 y 384 millones, los que haya son una gran oferta para el cliente

casas_norte_ofertas_E5=subset(casas_norte, preciom>350 & preciom<384.5 & estrato==5 & 
                              areaconst>=200 & parqueaderos>=1 & banios>=2 & 
                                habitaciones>=4)
casas_norte_ofertas_E5
casas_norte_ofertas_E5 <- casas_norte_ofertas_E5[order(casas_norte_ofertas_E5$preciom),]
casas_norte_ofertas_E5
map <- leaflet(casas_norte_ofertas_E5) %>%
  addTiles() %>%  # Add default OpenStreetMap tiles
  setView(lng = -76.5182934, lat = 3.4420511, zoom = 12)  # Set the initial view

map <- map %>%
  addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("$",preciom, "Millones","Casa con ID: ",id))

map

Lastimosamente, debido a la mala estandarizacion de las coordenadas del dataset Se han colado 2 casas en zona sur, nos quedamos con las 3 de zona norte: 380 millones con area 264 metros cuadrados 370 millones 355 millones

Caso 2

Apartamentos zona sur

Punto 1

apartamentos_sur=subset(vivienda, tipo=="Apartamento" & zona=="Zona Sur")
head(apartamentos_sur)

Posicionamos las casas en el mapa de Cali:

map <- leaflet(apartamentos_sur) %>%
  addTiles() %>%  # Add default OpenStreetMap tiles
  setView(lng = -76.5182934, lat = 3.4420511, zoom = 12)  # Set the initial view

map <- map %>%
  addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("$",preciom, "Millones"))

map

Los puntos no estan en la zona sur, se encuentran en toda la geografia de la ciudad de Cali, los datos no fueron bien formateados en sus coordenadas.

Punto 2

Creamos variables dummy para el estrato y para las zonas

apartamentos_sur$E4<-as.numeric(apartamentos_sur$estrato==4)
apartamentos_sur$E5<-as.numeric(apartamentos_sur$estrato==5)
apartamentos_sur$E6<-as.numeric(apartamentos_sur$estrato==6)

apartamentos_sur$Zor<-as.numeric(apartamentos_sur$zona=="Zona Oriente")
apartamentos_sur$Zs<-as.numeric(apartamentos_sur$estrato=="Zona Sur")
apartamentos_sur$Zn<-as.numeric(apartamentos_sur$estrato=="Zona Norte")
apartamentos_sur$Zoe<-as.numeric(apartamentos_sur$estrato=="Zona Oeste")
glimpse(apartamentos_sur)
## Rows: 2,787
## Columns: 20
## $ id           <dbl> 5098, 698, 8199, 1241, 5370, 6975, 5615, 6262, 7396, 6949…
## $ zona         <chr> "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur", "Zona Sur…
## $ piso         <chr> "05", "02", NA, NA, NA, "06", "08", NA, NA, NA, "10", "05…
## $ estrato      <dbl> 4, 3, 6, 3, 3, 4, 3, 3, 3, 4, 3, 5, 6, 3, 3, 5, 5, 5, 6, …
## $ preciom      <dbl> 290, 78, 875, 135, 135, 220, 210, 105, 115, 220, 230, 344…
## $ areaconst    <dbl> 96, 40, 194, 117, 78, 75, 72, 68, 58, 84, 63, 107, 182, 7…
## $ parqueaderos <dbl> 1, 1, 2, NA, NA, 1, 2, NA, 1, NA, 1, 2, 2, 1, 1, 2, 1, 2,…
## $ banios       <dbl> 2, 1, 5, 2, 1, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 4, 2, 4, 3, …
## $ habitaciones <dbl> 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 3, 3, …
## $ tipo         <chr> "Apartamento", "Apartamento", "Apartamento", "Apartamento…
## $ barrio       <chr> "acopi", "aguablanca", "aguacatal", "alameda", "alameda",…
## $ longitud     <dbl> -76.53464, -76.50100, -76.55700, -76.51400, -76.53600, -7…
## $ latitud      <dbl> 3.44987, 3.40000, 3.45900, 3.44100, 3.43600, 3.39109, 3.4…
## $ E4           <dbl> 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ E5           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, …
## $ E6           <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, …
## $ Zor          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zs           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zn           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Zoe          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

Asociación entre las variables:

ggpairs(apartamentos_sur[,2:9], title=" ")
## Warning: Removed 406 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 305 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## Removed 622 rows containing missing values or values outside the scale range
## (`stat_boxplot()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 406 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 406 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 406 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 406 rows containing non-finite outside the scale range
## (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 406 rows containing non-finite outside the scale range
## (`stat_bin()`).
## Warning: Removed 406 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 406 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 406 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 406 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 406 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 406 rows containing missing values
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 406 rows containing missing values or values outside the scale range
## (`geom_point()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 406 rows containing missing values or values outside the scale range
## (`geom_point()`).

Definimos la variable target:

target_var <- "preciom"

Definimos las otras variables numericas importantes:

other_vars <- c("banios", "areaconst", "habitaciones")
target_var <- "preciom"
plot_banios <- "banios"
plot_area <- "areaconst"
plot_habitaciones <- "habitaciones"
plot_estrato <- "estrato"

Creamos los PLOT:

plotly_banios <- plot_ly(data = apartamentos_sur, x = ~get(plot_banios), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlacion entre", target_var, "y", plot_banios),
    xaxis = list(title = plot_banios),
    yaxis = list(title = target_var)
  )

plotly_area <- plot_ly(data = apartamentos_sur, x = ~get(plot_area), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlacion entre", target_var, "y", plot_area),
    xaxis = list(title = plot_area),
    yaxis = list(title = target_var)
  )

plotly_habitaciones <- plot_ly(data = apartamentos_sur, x = ~get(plot_habitaciones), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlacion entre", target_var, "y", plot_habitaciones),
    xaxis = list(title = plot_habitaciones),
    yaxis = list(title = target_var)
  )

plotly_estrato <- plot_ly(data = apartamentos_sur, x = ~get(plot_estrato), y = ~get(target_var), type = "scatter", mode = "markers") %>%
  layout(
    title = paste("Correlacion entre", target_var, "y", plot_estrato),
    xaxis = list(title = plot_estrato),
    yaxis = list(title = target_var)
  )

Mostramos los PLOT:

print(plotly_banios)
print(plotly_habitaciones)
print(plotly_area)
print(plotly_estrato)

Podemos decir que la unica correlacion evidente es entre el area construida y el precio

Punto 3

modelo_R=lm(preciom ~ areaconst + E4 + E5 + E6 + habitaciones + parqueaderos + banios, data=apartamentos_sur)
summary(modelo_R)
## 
## Call:
## lm(formula = preciom ~ areaconst + E4 + E5 + E6 + habitaciones + 
##     parqueaderos + banios, data = apartamentos_sur)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1058.69   -39.21     0.38    36.96   898.14 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -28.38462   12.93336  -2.195  0.02828 *  
## areaconst      1.28595    0.05105  25.189  < 2e-16 ***
## E4            30.40026    9.55717   3.181  0.00149 ** 
## E5            50.88889    9.61940   5.290 1.33e-07 ***
## E6           204.40443   11.17300  18.294  < 2e-16 ***
## habitaciones -17.10675    3.70357  -4.619 4.06e-06 ***
## parqueaderos  62.13696    3.79229  16.385  < 2e-16 ***
## banios        41.95467    3.24893  12.913  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.52 on 2373 degrees of freedom
##   (406 observations deleted due to missingness)
## Multiple R-squared:  0.7762, Adjusted R-squared:  0.7755 
## F-statistic:  1175 on 7 and 2373 DF,  p-value: < 2.2e-16

Interpretacion de los datos:

Cuando todas las variables independientes son cero, el precio predicho es -28.38 pesos. Este valor es estadísticamente significativo (p = 0.02828), pero su interpretación práctica no es relevante, ya que no tiene sentido un precio negativo.

#areaconst: Por cada unidad en el área construida, el precio del apartamento aumenta en 1.29 pesos, manteniendo constantes las demás variables. Este efecto es altamente significativo (p < 2e-16).

#Estratos Estrato 4: Los apartamentos en estrato 4 aumentan en 30.4 pesos Estrato 5: Las viviendas en estrato 5 cuestan 50.89 pesos mas alto Estrato 6: Las viviendas en estrato 6 cuestan 204.4 pesos más alto. Los coeficientes de los estratos son altamente significativos

#habitaciones: Por cada habitación mas, el precio de la vivienda disminuye en 17.10 pesos manteniendo constantes las demás variables. Esto no tiene sentido aunque el modelo nos dice que es altamente significativo (p < 2e-16)

#parqueaderos: Por cada parqueadero adicional, el apartamento cuesta 62.13 pesos mas

#banios: Por cada baño adicional, la vivienda cuesta 41.95 pesos mas.

#Significancia estadística Todos los coeficientes, excepto el intercepto son altamente significativos

Coeficiente de determinación R cuadrado

Multiple R-squared: 0.776 (77.6%). Esto significa que el 77.6% de la variabilidad en el precio de los apartamentos es explicada por las variables incluidas en el modelo.

Adjusted R-squared: 0.77 (77%). El R cuadrado ajustado es muy similar al R cuadrado múltiple, lo que sugiere que el modelo no está sobreajustado.

Prueba F

F-statistic: 1175 p-value: < 2.2e-16. El valor p es muy pequeño, lo que indica que el modelo en su conjunto es estadísticamente significativo. Es decir, al menos una de las variables independientes tiene un efecto significativo en el precio.

#Observaciones faltantes 406 observaciones fueron eliminadas debido a valores faltantes (missing values). Esto podría afectar la generalización del modelo si los datos faltantes no son aleatorios.

Punto 5

Crear el dataframe con las características

vivienda_caso2 <- data.frame(
  areaconst = 300,
  parqueaderos = 3,
  banios = 3,
  habitaciones = 5,
  E4 = c(0, 0),  # 1 para estrato 4, 0 para estrato 5
  E5 = c(1, 1),  # 0 para estrato 4, 1 para estrato 5
  E6 = c(0, 1)   # 0 para ambos casos (no es estrato 6)
)

Mostrar el dataframe:

print(vivienda_caso2)
##   areaconst parqueaderos banios habitaciones E4 E5 E6
## 1       300            3      3            5  0  1  0
## 2       300            3      3            5  0  1  1

Predecir el precio:

prediccion_caso2 <- predict(modelo_R, newdata = vivienda_caso2)

Mostrar las predicciones:

print(prediccion_caso2)
##        1        2 
## 635.0311 839.4355

Para el estrato 5 se predice un precio de 635.03 millones de pesos para una vivienda con las características asignadas Para el estrato 6 se predice un precio de 839.43 millones de pesos para una vivienda con las características asignadas

Punto 6

Para encontrar ofertas en la zona norte debemos encontrar precios por debajo de 635 millones en el estrato 5 y precios por debajo de 839 millones en estrato 6 (por lo predicho en el modelo)

como 635 millones es menos que el credito preaprobado de 850 millones, en vez de filtrar por 635 filtraremos por apartamentos de mas de 850 millones

aptos_sur_ofertas_E5=subset(apartamentos_sur, preciom>850 & estrato==5 & 
                                areaconst>=300 & parqueaderos>=3 & banios>=3 & 
                                habitaciones>=5)
aptos_sur_ofertas_E5

Desafortunadamente no hay ofertas de estrato 5 con esas caracteristicas de vivienda.

Revisamos el estrato 6:

aptos_sur_ofertas_E6=subset(apartamentos_sur, preciom>850 & estrato==6 & 
                              areaconst>=300 & parqueaderos>=3 & banios>=3 & 
                              habitaciones>=5)
aptos_sur_ofertas_E6

Solo encontramos 3 ofertas para las caracteristicas planteadas en estrato 6.

A continuacion se situan en el mapa:

map <- leaflet(aptos_sur_ofertas_E6) %>%
  addTiles() %>%  # Add default OpenStreetMap tiles
  setView(lng = -76.5182934, lat = 3.4420511, zoom = 12)  # Set the initial view

map <- map %>%
  addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("$",preciom, "Millones","Casa con ID: ",id))
map