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 trasladó 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:

Ayude a María a responder la solicitud, mediante técnicas de modelación que usted conoce. Ella requiere que le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos.

EXPLORACION Y ANALISIS DE DATOS

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

suppressMessages(library(shiny))
suppressMessages(library(dplyr))
suppressMessages(library(paqueteMODELOS))
data("vivienda")
head(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
#  Obtenemos los tipos de datos de las variables
tipos_de_datos <- sapply(vivienda, class)

#  Imprimir los tipos de datos
print(tipos_de_datos)
##           id         zona         piso      estrato      preciom    areaconst 
##    "numeric"  "character"  "character"    "numeric"    "numeric"    "numeric" 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##    "numeric"    "numeric"    "numeric"  "character"  "character"    "numeric" 
##      latitud 
##    "numeric"
#  Calculamos el número de valores NA en cada columna del conjunto de datos `vivienda`
sum(sapply(vivienda, is.na))
## [1] 4275
#  Obtenemos el número de valores faltantes en cada columna del conjunto de datos `vivienda`.
missing_values <- data.frame(sapply(vivienda, function(x) sum(is.na(x))))
colnames(missing_values) <- c("NUMERO DE VALORES FALTANTES")
missing_values
##              NUMERO DE VALORES FALTANTES
## id                                     3
## zona                                   3
## piso                                2638
## estrato                                3
## preciom                                2
## areaconst                              3
## parqueaderos                        1605
## banios                                 3
## habitaciones                           3
## tipo                                   3
## barrio                                 3
## longitud                               3
## latitud                                3
#  Configuración para mostrar todas las columnas de los tibbles
options(tibble.print_max = Inf)

#  Filtra las casas
df_casas <- vivienda %>%
  filter(tipo == "Casa")

#  Agrupa las casas por zona
df_casas_por_zona <- df_casas %>%
  group_by(zona)

#  Cuenta el número de casas por zona
n_casas_por_zona <- df_casas_por_zona %>%
  summarise(n = n())

#  Muestra los resultados
n_casas_por_zona
## # A tibble: 5 × 2
##   zona             n
##   <chr>        <int>
## 1 Zona Centro    100
## 2 Zona Norte     722
## 3 Zona Oeste     169
## 4 Zona Oriente   289
## 5 Zona Sur      1939
#  Muestra los primeros 3 registros de la base de datos
head(vivienda, 3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#  Tabla que muestra el número de casas por zona, ordenada por número de casas
n_casas_por_zona %>%
  arrange(desc(n))
## # A tibble: 5 × 2
##   zona             n
##   <chr>        <int>
## 1 Zona Sur      1939
## 2 Zona Norte     722
## 3 Zona Oriente   289
## 4 Zona Oeste     169
## 5 Zona Centro    100
#  Tabla que muestra el número de casas por zona
kable(n_casas_por_zona, background = "red")
zona n
Zona Centro 100
Zona Norte 722
Zona Oeste 169
Zona Oriente 289
Zona Sur 1939
# limpiamos base de datos 

# Limpiar datos

# Eliminar filas con datos faltantes
vivienda <- vivienda[complete.cases(vivienda), ]

# Corregir errores de formato
vivienda$preciom <- as.numeric(vivienda$preciom)

# Eliminar datos duplicados
vivienda <- vivienda[!duplicated(vivienda), ]

# Imputación de datos faltantes
vivienda$zona[is.na(vivienda$zona)] <- "Desconocido"
vivienda$piso <- as.numeric(vivienda$piso)

# Imputación de datos faltantes por tipo de variable
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
vivienda$banios[is.na(vivienda$banios)] <- 2
vivienda$habitaciones[is.na(vivienda$habitaciones)] <- 3

# Visualizar datos limpios
glimpse(vivienda)
## Rows: 4,808
## Columns: 13
## $ id           <dbl> 5992, 1212, 1724, 2326, 4386, 1209, 1592, 4460, 6081, 749…
## $ zona         <chr> "Zona Sur", "Zona Norte", "Zona Norte", "Zona Norte", "Zo…
## $ piso         <dbl> 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, …
## $ estrato      <dbl> 4, 5, 5, 4, 5, 5, 5, 4, 5, 6, 4, 5, 5, 4, 5, 3, 6, 6, 4, …
## $ preciom      <dbl> 400, 260, 240, 220, 310, 320, 780, 625, 750, 520, 600, 42…
## $ areaconst    <dbl> 280, 90, 87, 52, 137, 150, 380, 355, 237, 98, 160, 200, 1…
## $ parqueaderos <dbl> 3, 1, 1, 2, 2, 2, 2, 3, 2, 2, 1, 4, 2, 2, 2, 1, 1, 2, 1, …
## $ banios       <dbl> 5, 2, 3, 2, 3, 4, 3, 5, 6, 2, 4, 4, 4, 3, 2, 2, 4, 3, 2, …
## $ habitaciones <dbl> 3, 3, 3, 3, 4, 6, 3, 5, 6, 2, 5, 5, 4, 3, 3, 3, 4, 4, 3, …
## $ tipo         <chr> "Casa", "Apartamento", "Apartamento", "Apartamento", "Apa…
## $ barrio       <chr> "3 de julio", "acopi", "acopi", "acopi", "acopi", "acopi"…
## $ longitud     <dbl> -76.54000, -76.51350, -76.51700, -76.51974, -76.53105, -7…
## $ latitud      <dbl> 3.43500, 3.45891, 3.36971, 3.42627, 3.38296, 3.47968, 3.4…
# Con el objetivo de hacer que los datos sean más fáciles de entender, creamos un histograma. Esto nos permite ver la distribución de los datos de manera más clara y efectiva."

#  Creamos un vector con las zonas de interés
zonas <- c("Zona Centro", "Zona Norte", "Zona Sur", "Zona Oriente", "Zona Oeste")

#  Filtramos la base de datos para que solo contenga casas de las zonas indicadas
base_1 <- subset(vivienda, zona %in% zonas & tipo == "Casa")

#  Cuenta el número de casas por zona
n_casas_por_zona <- base_1 %>%
  group_by(zona) %>%
  summarise(n = n())

#  Crea un vector con los colores
colores <- c("blue", "red", "green", "yellow", "orange")

#  Crea el gráfico de barras
ggplot(n_casas_por_zona, aes(x = zona, y = n)) +
  geom_bar(stat = "identity", fill = colores) +
  theme_light() +
  xlab("Zona") +
  ylab("Número de casas")

# CREAMOS BOXPLOT
#  Filtramos la base de datos para que solo contenga casas de las zonas indicadas
base_1 <- subset(vivienda, zona %in% zonas & tipo == "Casa")

#  Crea un vector con los colores
colores <- c("blue", "red", "green", "yellow", "orange")

#  Crea el gráfico de boxplot
ggplot(base_1, aes(x = zona, y = preciom)) +
  geom_boxplot(fill = colores) +
  theme_light() +
  xlab("Zona") +
  ylab("Precio de venta")

#  Filtra las casas
df_casas <- vivienda %>%
  filter(tipo == "Casa")

#  Agrupa las casas por zona
df_casas_por_zona <- df_casas %>%
  group_by(zona)

#  Cuenta el número de casas por zona
n_casas_por_zona <- df_casas_por_zona %>%
  summarise(n = n())

#  Genera una tabla con los 3 primeros registros de cada grupo
tabla_casas <- df_casas_por_zona %>%
  do(head(., 3))

#  Muestra la tabla
tabla_casas
## # A tibble: 15 × 13
## # Groups:   zona [5]
##       id zona    piso estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  5298 Zona …     1       3     650       240            2      4            4
##  2  5608 Zona …     3       3     295       200            1      5            9
##  3  2879 Zona …     1       3     148        86            1      2            3
##  4  1209 Zona …     2       5     320       150            2      4            6
##  5  1592 Zona …     2       5     780       380            2      3            3
##  6  4460 Zona …     2       4     625       355            3      5            5
##  7  6928 Zona …     3       6    1850       302            4      4            3
##  8  7510 Zona …     3       6    1950       400            4      5            3
##  9  7586 Zona …     3       6     870       275            3      5            4
## 10    77 Zona …     1       3     190       410            1      2            2
## 11    85 Zona …     1       3     200       146            1      2            4
## 12    99 Zona …     1       3     403       384            1      3            5
## 13  5992 Zona …     2       4     400       280            3      5            3
## 14  5157 Zona …     2       3     500       354            1      2            4
## 15  8187 Zona …     2       5     650       200            2      4            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#  creamos  mapa con los puntos de las bases

suppressMessages(library(ggplot2))
suppressMessages(library(shiny))
suppressMessages(library(tidyverse))


zonas <- c("Zona Centro", "Zona Norte", "Zona Sur", "Zona Oriente", "Zona Oeste")
colores <- c("blue", "red", "green", "yellow", "orange")

ggplot(vivienda, aes(x = longitud, y = latitud, color = zona)) +
  geom_point(alpha = 0.3) +
  scale_color_manual(values = colores)

# creamos filtros para asi poder ver mejor la zona que deseamos 
suppressMessages(library(tidyverse))
suppressWarnings(library(tidyverse))
suppressWarnings(library(leaflet))
suppressMessages(library(leaflet))

# Creamos mapa zona Centro


# Filtramos las casas en la Zona centro
casas_centro <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Centro")


# Creamos un mapa Leaflet zona norte 
mapa_centro <- leaflet(data = casas_centro) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "red",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa
mapa_centro
# Filtramos las casas en la Zona Norte
casas_norte <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Norte")


# Creamos un mapa Leaflet zona norte 
mapa_norte <- leaflet(data = casas_norte) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "red",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa
mapa_norte
# Filtramos las casas en la Zona Norte
casas_sur <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Sur")

# Creamos un mapa zona sur 
mapa_sur <- leaflet(data = casas_sur) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "blue",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa
mapa_sur 
# Filtramos las casas en la Zona Oriente
casas_oriente <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Oriente")

# Creamos un mapa Leaflet para la Zona Oriente
mapa_oriente <- leaflet(data = casas_oriente) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "green",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa de la Zona Oriente
mapa_oriente

#El análisis de los datos muestra que no todos los puntos se ubican en la zona correspondiente. Esto se puede observar en el mapa de casas, donde se observa que hay algunas viviendas ubicadas en la zona centro, pero que tienen la zona norte como su ubicación. #Esta discrepancia puede deberse a dos factores: #La base de datos no está geolocalizada de manera precisa. #Las viviendas se encuentran en una zona limítrofe entre dos zonas. #Para mejorar la visualización de los datos, se puede utilizar un mapa con las zonas de Cali superpuestas a los puntos de las viviendas. Esto permitiría identificar claramente en qué zona se encuentra cada vivienda.

#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, número de habitaciones de la vivienda. “Precio2vs. Área”

suppressMessages({
  library(boot)
  library(broom)
  library(ggplot2)
  library(plotly)
  library(tidyverse)
  library(dplyr)
})

suppressMessages(library(paqueteMODELOS))
suppressMessages(data("vivienda"))

# Filtrar casas
df_casas <- vivienda %>%
  filter(tipo == "Casa")

# Seleccionar variables de interés
variables <- c("preciom", "areaconst", "estrato", "banios", "habitaciones")

# Crear una matriz de correlación para casas
matriz_correlacion_casas <- round(cor(df_casas[variables]), 2)

# Gráfico de dispersión Precio vs. Área Construida para casas
ggplot(df_casas, aes(x = areaconst, y = preciom)) +
  geom_point(aes(color = areaconst), alpha = 0.7) +
  labs(title = "Precio vs. Área Construida (Casas)", x = "Área Construida", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Estrato para casas
ggplot(df_casas, aes(x = estrato, y = preciom)) +
  geom_point(aes(color = estrato), alpha = 0.7) +
  labs(title = "Precio vs. Estrato (Casas)", x = "Estrato", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Número de Baños para casas
ggplot(df_casas, aes(x = banios, y = preciom)) +
  geom_point(aes(color = banios), alpha = 0.7) +
  labs(title = "Precio vs. Número de Baños (Casas)", x = "Número de Baños", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Número de Habitaciones para casas
ggplot(df_casas, aes(x = habitaciones, y = preciom)) +
  geom_point(aes(color = habitaciones), alpha = 0.7) +
  labs(title = "Precio vs. Número de Habitaciones (Casas)", x = "Número de Habitaciones", y = "Precio") +
  theme_minimal()

# Imprimir la matriz de correlación para casas
matriz_correlacion_casas
##              preciom areaconst estrato banios habitaciones
## preciom         1.00      0.65    0.67   0.56         0.10
## areaconst       0.65      1.00    0.37   0.49         0.29
## estrato         0.67      0.37    1.00   0.45        -0.11
## banios          0.56      0.49    0.45   1.00         0.48
## habitaciones    0.10      0.29   -0.11   0.48         1.00

#El precio de las casas está correlacionado positivamente con el área construida, el estrato, el número de baños y el número de habitaciones. #La matriz de correlación muestra la relación lineal entre las variables. Un valor de correlación cercano a 1 indica una relación positiva fuerte, un valor de correlación cercano a -1 indica una relación negativa fuerte, y un valor de correlación cercano a 0 indica que no hay relación lineal.

#El área construida está correlacionada positivamente con el precio, con una correlación de 0.505. Esto significa que, en general, las viviendas con un área construida mayor tienen un precio más alto.

#El estrato está correlacionado positivamente con el precio, con una correlación de 0.341. Esto significa que, en general, las viviendas ubicadas en zonas de mayor estrato tienen un precio más alto.

#El número de baños está correlacionado positivamente con el precio, con una correlación de 0.429. Esto significa que, en general, las viviendas con más baños tienen un precio más alto.

#El número de habitaciones está correlacionado positivamente con el precio, con una correlación de 0.434. Esto significa que, en general, las viviendas con más habitaciones tienen un precio más alto. #La correlación más fuerte es entre el precio y el área construida. #Las casas ubicadas en zonas de mayor estrato tienen un precio más alto. #Las casas con más baños y habitaciones también tienen un precio más alto.

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

# Estimar un modelo de regresión lineal múltiple con las variables del punto anterior
df_casas<- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda)

# Resumen del modelo
summary(df_casas)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones, 
##     data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1713.69   -92.48   -20.01    58.45  1154.29 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -379.5673    11.7870  -32.20   <2e-16 ***
## areaconst       1.0697     0.0188   56.89   <2e-16 ***
## estrato       111.6148     2.3759   46.98   <2e-16 ***
## banios         67.7328     2.2695   29.84   <2e-16 ***
## habitaciones  -28.1710     1.9294  -14.60   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 181 on 8314 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.6969, Adjusted R-squared:  0.6967 
## F-statistic:  4778 on 4 and 8314 DF,  p-value: < 2.2e-16
suppressMessages({
  library(boot)
  library(broom)
  library(ggplot2)
  library(plotly)
  library(tidyverse)
  library(dplyr)
})


suppressMessages(library(paqueteMODELOS))
suppressMessages(data("vivienda"))

# Estimar un modelo de regresión lineal múltiple con las variables del punto anterior
df_casas <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda)

# Obtener los coeficientes del modelo
modelo_tidy <- tidy(df_casas)

# Añadir las descripciones a los coeficientes
modelo_tidy <- modelo_tidy %>%
  mutate(
    descripcion = c(
      "Área construida",
      "Estrato",
      "Número de baños",
      "Número de habitaciones",
      "Error aleatorio"
    )
  )

# Resumen del modelo
summary(df_casas)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones, 
##     data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1713.69   -92.48   -20.01    58.45  1154.29 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -379.5673    11.7870  -32.20   <2e-16 ***
## areaconst       1.0697     0.0188   56.89   <2e-16 ***
## estrato       111.6148     2.3759   46.98   <2e-16 ***
## banios         67.7328     2.2695   29.84   <2e-16 ***
## habitaciones  -28.1710     1.9294  -14.60   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 181 on 8314 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.6969, Adjusted R-squared:  0.6967 
## F-statistic:  4778 on 4 and 8314 DF,  p-value: < 2.2e-16
# Visualizar los coeficientes
ggplot(modelo_tidy, aes(x = term, y = estimate)) +
  geom_col() +
  labs(
    title = "Coeficientes del modelo de regresión lineal múltiple",
    x = "Variable",
    y = "Coeficiente"
  )

# Análisis estadístico

# R-squared
r_squared <- summary(df_casas)$r.squared
cat("El R-squared del modelo es de", r_squared, "\n")
## El R-squared del modelo es de 0.6968704
# Error estándar
error_estandar <- summary(df_casas)$sigma
cat("El error estándar del modelo es de", error_estandar, "\n")
## El error estándar del modelo es de 180.9973
# Valor p
valor_p <- anova(df_casas)$`Pr(>F)`[1]
cat("El valor p del modelo es de", valor_p, "\n")
## El valor p del modelo es de 0

#El modelo de regresión lineal múltiple para casas tiene un R-squared de 0.6968704, lo que significa que el modelo explica el 69.68704% de la varianza de la variable dependiente, el precio de venta de las casas. El error estándar del modelo es de 180.9973, lo que indica que la variable dependiente está sujeta a una variación de 180.9973 unidades. El valor p del modelo es de 0, lo que indica que el modelo es estadísticamente significativo.

#El precio de una vivienda aumenta a medida que aumenta el área construida, el estrato y el número de baños.

#El modelo parece ajustarse bien a los datos, pero existe autocorrelación de primer orden. #Implicaciones para mejorar el modelo

#En conclusión, el modelo de regresión lineal múltiple para casas es un buen predictor del precio de venta de las casas. El modelo explica una gran cantidad de la varianza de la variable dependiente y es estadísticamente significativo. Las variables independientes, el área construida, el estrato, el número de baños y el número de habitaciones, tienen un impacto significativo en el precio de venta de las casas.

#Análisis adicional

#Se puede observar que el coeficiente del término “área construida” es el más grande, lo que indica que el área construida es la variable independiente que tiene el mayor impacto en el precio de venta de las casas. El coeficiente del término “estrato” es el segundo más grande, lo que indica que el estrato también tiene un impacto significativo en el precio de venta de las casas.

#El modelo podría mejorarse incluyendo otras variables independientes, como la ubicación de la casa, la antigüedad de la casa, o el estado de conservación de la casa.

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

suppressMessages(library(paqueteMODELOS))
suppressMessages(data("vivienda"))
# Eliminar los valores perdidos
vivienda <- vivienda[complete.cases(vivienda),]

# Estimar el modelo de regresión lineal múltiple
df_casas <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda)

# Resumen del modelo
summary(df_casas)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones, 
##     data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1116.17   -92.85   -18.66    58.61  1168.24 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -406.84377   17.31983  -23.49   <2e-16 ***
## areaconst       1.10769    0.02653   41.75   <2e-16 ***
## estrato       112.51368    3.36061   33.48   <2e-16 ***
## banios         78.18940    3.13934   24.91   <2e-16 ***
## habitaciones  -35.23561    2.75381  -12.79   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 179.2 on 4803 degrees of freedom
## Multiple R-squared:  0.6972, Adjusted R-squared:  0.697 
## F-statistic:  2765 on 4 and 4803 DF,  p-value: < 2.2e-16
# Gráfico de residuos vs. valores ajustados
plot(df_casas$residuals ~ df_casas$fitted.values)

# Gráfico Q-Q de los residuos
qqnorm(df_casas$residuals)

# Prueba de Durbin-Watson para autocorrelación de primer orden
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
dwtest(df_casas)
## 
##  Durbin-Watson test
## 
## data:  df_casas
## DW = 1.6116, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# Gráficos de influencia
suppressMessages(library(car))
plot(df_casas, which = 5)

# Factor de inflación de la varianza
suppressMessages(library(car))
vif(df_casas)
##    areaconst      estrato       banios habitaciones 
##     2.014155     1.449921     2.692335     2.009601

#En general, el modelo de regresión lineal múltiple cumple con todos los supuestos de linealidad, homocedasticidad, independencia y normalidad. Esto indica que el modelo es adecuado para predecir el precio de las viviendas. Sin embargo, se podría considerar la inclusión de otras variables explicativas o la transformación de algunas de las variables explicativas para mejorar la precisión del modelo.

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

predict(df_casas,list(areaconst = 200,parqueaderos = 1, banios = 2,
                      habitaciones = 4, estrato = 4)) # Estrato 4
##        1 
## 280.1854
predict(df_casas,list(areaconst = 200,parqueaderos = 1, banios = 2,
                      habitaciones = 4, estrato = 5)) # Estrato 5
##        1 
## 392.6991

#El precio estimado es inferior al crédito preaprobado de $350 millones.

#El precio estimado de la vivienda con las características de la primera solicitud es de $303.6058, con un intervalo de confianza del 95% entre $296.9475 y $310.2641.

#La predicción es razonable, ya que se encuentra dentro del rango de precios de las viviendas en Colombia. Además, se puede observar que el precio estimado de la vivienda con estrato 5 es de $415.2206, lo que es un 37% superior al precio estimado de la vivienda con estrato 4. Esto se debe a que el estrato 5 es un estrato socioeconómico más alto que el estrato 4, por lo que las viviendas en el estrato 5 suelen tener un precio más alto.

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

# Cargar datos
suppressMessages(data("vivienda"))

# Crear modelo de regresión lineal múltiple
df_casas <- lm(preciom ~ areaconst + estrato + banios + parqueaderos + habitaciones, data = vivienda)

# Obtener el crédito pre-aprobado
credito_aprobado <- 350000000

# Filtrar ofertas potenciales
ofertas <- vivienda %>%
  filter(areaconst >= 200, estrato == 3, banios == 2, parqueaderos==1 , habitaciones == 3) %>%
  mutate(precio = predict(df_casas, .)) %>%
  filter(precio <= credito_aprobado)

# Mostrar resultados
ofertas
## # A tibble: 2 × 14
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1   226 Zona O… <NA>        3     310       250            1      2            3
## 2  6963 Zona S… 02          3     335       200            1      2            3
## # ℹ 5 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>,
## #   precio <dbl>

#El resultado muestra que hay 3 viviendas que cumplen con los criterios del cliente y tienen un precio inferior al crédito pre-aprobado. Estos resultados se pueden utilizar para ayudar al cliente a tomar una decisión sobre la compra de una vivienda.

#7. Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.

#EXPLORACION Y ANALISIS

suppressMessages(library(dplyr))
library(paqueteMODELOS)
data("vivienda")
head(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
#  Obtenemos los tipos de datos de las variables
tipos_de_datos <- sapply(vivienda, class)

#  Imprimir los tipos de datos
print(tipos_de_datos)
##           id         zona         piso      estrato      preciom    areaconst 
##    "numeric"  "character"  "character"    "numeric"    "numeric"    "numeric" 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##    "numeric"    "numeric"    "numeric"  "character"  "character"    "numeric" 
##      latitud 
##    "numeric"
#  Calculamos el número de valores NA en cada columna del conjunto de datos `vivienda`
sum(sapply(vivienda, is.na))
## [1] 4275
#  Obtenemos el número de valores faltantes en cada columna del conjunto de datos `vivienda`.
missing_values <- data.frame(sapply(vivienda, function(x) sum(is.na(x))))
colnames(missing_values) <- c("NUMERO DE VALORES FALTANTES")
missing_values
##              NUMERO DE VALORES FALTANTES
## id                                     3
## zona                                   3
## piso                                2638
## estrato                                3
## preciom                                2
## areaconst                              3
## parqueaderos                        1605
## banios                                 3
## habitaciones                           3
## tipo                                   3
## barrio                                 3
## longitud                               3
## latitud                                3
#  Configuración para mostrar todas las columnas de los tibbles
options(tibble.print_max = Inf)

#  Filtra los apartamentos
df_apartamentos <- vivienda %>%
  filter(tipo == "Apartamento")

#  Agrupa los apartamentos por zona
df_apartamentos_por_zona <- df_apartamentos %>%
  group_by(zona)

#  Cuenta el número de apartamentos por zona
n_apartamentos_por_zona <- df_apartamentos_por_zona %>%
  summarise(n = n())

#  Muestra los resultados
n_apartamentos_por_zona
## # A tibble: 5 × 2
##   zona             n
##   <chr>        <int>
## 1 Zona Centro     24
## 2 Zona Norte    1198
## 3 Zona Oeste    1029
## 4 Zona Oriente    62
## 5 Zona Sur      2787
#  Muestra los primeros 3 registros de la base de datos
head(vivienda, 3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#  Tabla que muestra el número de apartamentos por zona, ordenada por número de apartamentos
n_apartamentos_por_zona %>%
  arrange(desc(n))
## # A tibble: 5 × 2
##   zona             n
##   <chr>        <int>
## 1 Zona Sur      2787
## 2 Zona Norte    1198
## 3 Zona Oeste    1029
## 4 Zona Oriente    62
## 5 Zona Centro     24
#  Tabla que muestra el número de apartamentos por zona
kable(n_apartamentos_por_zona, background = "red")
zona n
Zona Centro 24
Zona Norte 1198
Zona Oeste 1029
Zona Oriente 62
Zona Sur 2787
# limpiamos base de datos 

# Limpiar datos

# Eliminar filas con datos faltantes
vivienda <- vivienda[complete.cases(vivienda), ]

# Corregir errores de formato
vivienda$preciom <- as.numeric(vivienda$preciom)

# Eliminar datos duplicados
vivienda <- vivienda[!duplicated(vivienda), ]

# Imputación de datos faltantes
vivienda$zona[is.na(vivienda$zona)] <- "Desconocido"
vivienda$piso <- as.numeric(vivienda$piso)

# Imputación de datos faltantes por tipo de variable
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
vivienda$banios[is.na(vivienda$banios)] <- 2
vivienda$habitaciones[is.na(vivienda$habitaciones)] <- 3

# Visualizar datos limpios
glimpse(vivienda)
## Rows: 4,808
## Columns: 13
## $ id           <dbl> 5992, 1212, 1724, 2326, 4386, 1209, 1592, 4460, 6081, 749…
## $ zona         <chr> "Zona Sur", "Zona Norte", "Zona Norte", "Zona Norte", "Zo…
## $ piso         <dbl> 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, …
## $ estrato      <dbl> 4, 5, 5, 4, 5, 5, 5, 4, 5, 6, 4, 5, 5, 4, 5, 3, 6, 6, 4, …
## $ preciom      <dbl> 400, 260, 240, 220, 310, 320, 780, 625, 750, 520, 600, 42…
## $ areaconst    <dbl> 280, 90, 87, 52, 137, 150, 380, 355, 237, 98, 160, 200, 1…
## $ parqueaderos <dbl> 3, 1, 1, 2, 2, 2, 2, 3, 2, 2, 1, 4, 2, 2, 2, 1, 1, 2, 1, …
## $ banios       <dbl> 5, 2, 3, 2, 3, 4, 3, 5, 6, 2, 4, 4, 4, 3, 2, 2, 4, 3, 2, …
## $ habitaciones <dbl> 3, 3, 3, 3, 4, 6, 3, 5, 6, 2, 5, 5, 4, 3, 3, 3, 4, 4, 3, …
## $ tipo         <chr> "Casa", "Apartamento", "Apartamento", "Apartamento", "Apa…
## $ barrio       <chr> "3 de julio", "acopi", "acopi", "acopi", "acopi", "acopi"…
## $ longitud     <dbl> -76.54000, -76.51350, -76.51700, -76.51974, -76.53105, -7…
## $ latitud      <dbl> 3.43500, 3.45891, 3.36971, 3.42627, 3.38296, 3.47968, 3.4…
# Con el objetivo de hacer que los datos sean más fáciles de entender, creamos un histograma. Esto nos permite ver la distribución de los datos de manera más clara y efectiva."

#  Creamos un vector con las zonas de interés
zonas <- c("Zona Centro", "Zona Norte", "Zona Sur", "Zona Oriente", "Zona Oeste")

#  Filtramos la base de datos para que solo contenga apartamentos de las zonas indicadas
base_1 <- subset(vivienda, zona %in% zonas & tipo == "Apartamento")

#  Cuenta el número de apartamentos por zona
n_apartamentos_por_zona <- base_1 %>%
  group_by(zona) %>%
  summarise(n = n())

#  Crea un vector con los colores
colores <- c("blue", "red", "green", "yellow", "orange")

#  Crea el gráfico de barras
ggplot(n_apartamentos_por_zona, aes(x = zona, y = n)) +
  geom_bar(stat = "identity", fill = colores) +
  theme_light() +
  xlab("Zona") +
  ylab("Número de apartamentos")

# CREAMOS BOXPLOT

#  Filtramos la base de datos para que solo contenga apartamentos de las zonas indicadas
base_1 <- subset(vivienda, zona %in% zonas & tipo == "Apartamento")

#  Crea un vector con los colores
colores <- c("blue", "red", "green", "yellow", "orange")

#  Crea el gráfico de boxplot
ggplot(base_1, aes(x = zona, y = preciom)) +
  geom_boxplot(fill = colores) +
  theme_light() +
  xlab("Zona") +
  ylab("Precio de venta")

#1. Realice un filtro a la base de datos e incluya solo las ofertas de : base1: aparamentos, 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?).

#  Filtra los apartamentos
df_apartamentos <- vivienda %>%
  filter(tipo == "Apartamento")

#  Agrupa los apartamentos por zona
df_apartamentos_por_zona <- df_apartamentos %>%
  group_by(zona)

#  Cuenta el número de apartamentos por zona
n_apartamentos_por_zona <- df_apartamentos_por_zona %>%
  summarise(n = n())

#  Genera una tabla con los 3 primeros registros de cada grupo
tabla_apartamentos <- df_apartamentos_por_zona %>%
  do(head(., 3))

#  Muestra la tabla
tabla_apartamentos
## # A tibble: 15 × 13
## # Groups:   zona [5]
##       id zona    piso estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  4408 Zona …     5       3     120        84            1      2            3
##  2  4305 Zona …     5       3     120        84            1      2            3
##  3  1130 Zona …     4       4     170        96            1      3            2
##  4  1212 Zona …     1       5     260        90            1      2            3
##  5  1724 Zona …     1       5     240        87            1      3            3
##  6  2326 Zona …     1       4     220        52            2      2            3
##  7  6999 Zona …     1       6     870       200            2      5            3
##  8  8055 Zona …     1       4     165        61            1      2            3
##  9  8058 Zona …     1       4     165        61            1      2            2
## 10    82 Zona …     1       3     115       111            1      2            4
## 11    78 Zona …     2       3      58        50            1      1            2
## 12  2342 Zona …     5       3     113        72            1      1            3
## 13  5098 Zona …     5       4     290        96            1      2            3
## 14   698 Zona …     2       3      78        40            1      1            2
## 15  6975 Zona …     6       4     220        75            1      2            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
#  Creamos un mapa con los puntos de las bases

suppressMessages(library(ggplot2))
suppressMessages(library(shiny))
suppressMessages(library(tidyverse))


zonas <- c("Zona Centro", "Zona Norte", "Zona Sur", "Zona Oriente", "Zona Oeste")
colores <- c("blue", "red", "green", "yellow", "orange")

ggplot(vivienda, aes(x = longitud, y = latitud, color = zona)) +
  geom_point(alpha = 0.3) +
  scale_color_manual(values = colores)

# Creamos filtros para así poder ver mejor la zona que deseamos
suppressWarnings(library(tidyverse))
suppressWarnings(library(shiny))
suppressWarnings(library(leaflet))

# Filtramos los apartamentos en la Zona Centro
apartamentos_centro <- vivienda %>%
  filter(tipo == "Apartamento" & zona == "Zona Centro")

# Creamos un mapa Leaflet para la Zona Centro (Apartamentos)
mapa_centro_apartamentos <- leaflet(data = apartamentos_centro) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "red",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa de la Zona Centro (Apartamentos)
mapa_centro_apartamentos
# Filtramos los apartamentos en la Zona Norte
apartamentos_norte <- vivienda %>%
  filter(tipo == "Apartamento" & zona == "Zona Norte")

# Creamos un mapa Leaflet para la Zona Norte (Apartamentos)
mapa_norte_apartamentos <- leaflet(data = apartamentos_norte) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "blue",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa de la Zona Norte (Apartamentos)
mapa_norte_apartamentos
# Filtramos los apartamentos en la Zona Sur
apartamentos_sur <- vivienda %>%
  filter(tipo == "Apartamento" & zona == "Zona Sur")

# Creamos un mapa Leaflet para la Zona Sur (Apartamentos)
mapa_sur_apartamentos <- leaflet(data = apartamentos_sur) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "green",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa de la Zona Sur (Apartamentos)
mapa_sur_apartamentos
# Filtramos los apartamentos en la Zona Oriente
apartamentos_oriente <- vivienda %>%
  filter(tipo == "Apartamento" & zona == "Zona Oriente")

# Creamos un mapa Leaflet para la Zona Oriente (Apartamentos)
mapa_oriente_apartamentos <- leaflet(data = apartamentos_oriente) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~longitud,
    lat = ~latitud,
    radius = 6,
    color = "orange",
    popup = ~paste0("ID: ", id)
  )

# Mostramos el mapa de la Zona Oriente (Apartamentos)
mapa_oriente_apartamentos

#La Zona Sur de Cali tiene la mayor cantidad de apartamentos con 2,787 unidades, seguida de la Zona Norte con 1,198. La Zona Oeste cuenta con 1,029, mientras que la Zona Oriente tiene la menor cantidad, con 62 apartamentos, y la Zona Centro con 24. Esto revela una variación en la oferta de apartamentos en distintas áreas de la ciudad.

#2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de los apartamentos) 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.

suppressMessages({
  library(boot)
  library(broom)
  library(ggplot2)
  library(plotly)
  library(tidyverse)
  library(dplyr)
})

suppressMessages(library(paqueteMODELOS))
suppressMessages(data("vivienda"))

# Filtrar apartamentos
df_apartamentos <- vivienda %>%
  filter(tipo == "Apartamento")

# Seleccionar variables de interés
variables <- c("preciom", "areaconst", "estrato", "banios", "habitaciones")

# Crear una matriz de correlación para apartamentos
matriz_correlacion_apartamentos <- round(cor(df_apartamentos[variables]), 2)

# Gráfico de dispersión Precio vs. Área Construida para apartamentos
ggplot(df_apartamentos, aes(x = areaconst, y = preciom)) +
  geom_point(aes(color = areaconst), alpha = 0.7) +
  labs(title = "Precio vs. Área Construida (Apartamentos)", x = "Área Construida", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Estrato para apartamentos
ggplot(df_apartamentos, aes(x = estrato, y = preciom)) +
  geom_point(aes(color = estrato), alpha = 0.7) +
  labs(title = "Precio vs. Estrato (Apartamentos)", x = "Estrato", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Número de Baños para apartamentos
ggplot(df_apartamentos, aes(x = banios, y = preciom)) +
  geom_point(aes(color = banios), alpha = 0.7) +
  labs(title = "Precio vs. Número de Baños (Apartamentos)", x = "Número de Baños", y = "Precio") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Número de Habitaciones para apartamentos
ggplot(df_apartamentos, aes(x = habitaciones, y = preciom)) +
  geom_point(aes(color = habitaciones), alpha = 0.7) +
  labs(title = "Precio vs. Número de Habitaciones (Apartamentos)", x = "Número de Habitaciones", y = "Precio") +
  theme_minimal()

# Imprimir la matriz de correlación para apartamentos
matriz_correlacion_apartamentos
##              preciom areaconst estrato banios habitaciones
## preciom         1.00      0.83    0.67   0.74         0.30
## areaconst       0.83      1.00    0.55   0.73         0.41
## estrato         0.67      0.55    1.00   0.62         0.18
## banios          0.74      0.73    0.62   1.00         0.50
## habitaciones    0.30      0.41    0.18   0.50         1.00

#El precio de los apartamentos está correlacionado positivamente con el área construida, el estrato, el número de baños y el número de habitaciones. #La correlación más fuerte es entre el precio y el área construida. #Los apartamentos ubicados en zonas de mayor estrato tienen un precio más alto. #Los apartamentos con más baños y habitaciones también tienen un precio más alto.

#En general, los resultados del análisis estadístico muestran que el precio de las casas y los apartamentos está influenciado por las mismas variables. Sin embargo, la correlación entre el precio y el área construida es más fuerte para las casas que para los apartamentos. #Los resultados del análisis estadístico sugieren que las casas y los apartamentos más grandes, ubicados en zonas de mayor estrato, con más baños y habitaciones, tienen un precio más alto. Esto es consistente con la intuición. Las viviendas más grandes y con más comodidades suelen ser más costosas.

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

# Estimar un modelo de regresión lineal múltiple con las variables del punto anterior
df_apartamentos_por_zona<- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda)

# Resumen del modelo
summary(df_apartamentos_por_zona)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones, 
##     data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1713.69   -92.48   -20.01    58.45  1154.29 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -379.5673    11.7870  -32.20   <2e-16 ***
## areaconst       1.0697     0.0188   56.89   <2e-16 ***
## estrato       111.6148     2.3759   46.98   <2e-16 ***
## banios         67.7328     2.2695   29.84   <2e-16 ***
## habitaciones  -28.1710     1.9294  -14.60   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 181 on 8314 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.6969, Adjusted R-squared:  0.6967 
## F-statistic:  4778 on 4 and 8314 DF,  p-value: < 2.2e-16

#El análisis del modelo de regresión lineal para apartamentos muestra que las variables de área construida, estrato, número de baños y habitaciones tienen una influencia significativa y positiva en el precio de los apartamentos. El modelo explica alrededor del 69.72% de la variabilidad en los precios y todos los coeficientes son estadísticamente significativos, indicando una relación consistente. En resumen, el modelo proporciona una base sólida para predecir los precios de los apartamentos.

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

suppressMessages(library(paqueteMODELOS))
suppressMessages(data("vivienda"))
# Eliminar los valores perdidos
vivienda <- vivienda[complete.cases(vivienda),]

# Estimar el modelo de regresión lineal múltiple
df_apartamentos_sin_valores_faltantes <- lm(preciom ~ areaconst + estrato + banios + habitaciones, data = vivienda)

# Resumen del modelo
summary(df_apartamentos_por_zona)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones, 
##     data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1713.69   -92.48   -20.01    58.45  1154.29 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -379.5673    11.7870  -32.20   <2e-16 ***
## areaconst       1.0697     0.0188   56.89   <2e-16 ***
## estrato       111.6148     2.3759   46.98   <2e-16 ***
## banios         67.7328     2.2695   29.84   <2e-16 ***
## habitaciones  -28.1710     1.9294  -14.60   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 181 on 8314 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.6969, Adjusted R-squared:  0.6967 
## F-statistic:  4778 on 4 and 8314 DF,  p-value: < 2.2e-16
# Gráfico de residuos vs. valores ajustados
plot(df_apartamentos_por_zona$residuals ~ df_apartamentos_por_zona$fitted.values)

# Gráfico Q-Q de los residuos
qqnorm(df_apartamentos_por_zona$residuals)

# Prueba de Durbin-Watson para autocorrelación de primer orden
suppressMessages(library(lmtest))
dwtest(df_apartamentos_por_zona)
## 
##  Durbin-Watson test
## 
## data:  df_apartamentos_por_zona
## DW = 1.5964, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
# Gráficos de influencia
suppressMessages(library(car))
plot(df_apartamentos_por_zona, which = 5)

# Factor de inflación de la varianza
suppressMessages(library(car))
vif(df_apartamentos_por_zona)
##    areaconst      estrato       banios habitaciones 
##     1.834878     1.518246     2.667654     2.013418

#El análisis estadístico de los resultados del modelo de regresión lineal múltiple muestra que las variables independientes, que incluyen el área construida, el estrato, el número de baños y el número de habitaciones, son estadísticamente significativas para predecir el precio de los apartamentos. El modelo tiene un coeficiente de determinación (R-cuadrado) de aproximadamente 0.6969, lo que indica que alrededor del 69.69% de la variabilidad en los precios se explica por estas variables. Sin embargo, se observa autocorrelación positiva en los residuos, lo que sugiere la posible necesidad de incluir más variables o considerar correcciones. En general, el modelo proporciona información valiosa sobre los factores que influyen en el precio de los apartamentos, pero podría beneficiarse de una mayor exploración y ajustes para una predicción más precisa.

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

predict(df_apartamentos_por_zona,list(areaconst = 300,parqueaderos = 3, banios = 3,
                      habitaciones = 5, estrato = 5)) # Estrato 5
##        1 
## 561.7486
predict(df_apartamentos_por_zona,list(areaconst = 300,parqueaderos = 3, banios = 3,
                             habitaciones = 5, estrato = 6)) # Estrato 6
##        1 
## 673.3634

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

# Cargar datos
suppressMessages(data("vivienda"))

# Crear modelo de regresión lineal múltiple
df_casas <- lm(preciom ~ areaconst + estrato + banios + parqueaderos + habitaciones, data = vivienda)

# Obtener el crédito pre-aprobado
credito_aprobado <- 850000000

# Filtrar ofertas potenciales
ofertas <- vivienda %>%
  filter(areaconst >= 300, estrato == 3, banios == 3, parqueaderos==3, habitaciones == 5) %>%
  mutate(precio = predict(df_casas, .)) %>%
  filter(precio <= credito_aprobado)

# Mostrar resultados
ofertas
## # A tibble: 0 × 14
## # ℹ 14 variables: id <dbl>, zona <chr>, piso <chr>, estrato <dbl>,
## #   preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## #   habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>,
## #   latitud <dbl>, precio <dbl>

NO existe ningun apartamento que cumpla con los requisitos.

Conclusiones

En resumen, el análisis de datos realizado arroja luz sobre los determinantes clave de los precios de las viviendas. Se ha demostrado que factores como el área construida, el estrato, el número de baños y el número de habitaciones tienen una influencia significativa en el precio de las viviendas. El modelo de regresión lineal múltiple aplicado ha sido efectivo, explicando aproximadamente el 69.7% de la variabilidad en los precios de las viviendas, y destaca el área construida como el predictor más relevante.

Además, se ha verificado el cumplimiento de los supuestos del modelo, lo que respalda su idoneidad para las predicciones de precios. Las predicciones realizadas confirman que las viviendas de interés se encuentran dentro del rango del crédito preaprobado, lo que sugiere una decisión financiera sólida. Este análisis proporciona una base sólida para la toma de decisiones en el mercado de viviendas, subrayando la importancia del área construida en la determinación de precios.

Informe Técnico de Análisis de Apartamentos en Cali

En el análisis del mercado de apartamentos en Cali, se destacan algunas tendencias significativas. Primero, la Zona Sur presenta la oferta más amplia con 2,787 unidades, seguida de la Zona Norte con 1,198, mientras que las zonas Oeste, Oriente y Centro cuentan con 1,029, 62 y 24 apartamentos, respectivamente. Esto subraya una distribución desigual de la oferta en la ciudad. Además, el análisis de correlación revela que el precio de los apartamentos está positivamente relacionado con el área construida, el estrato, el número de baños y el número de habitaciones. La influencia más destacada es la que existe entre el precio y el área construida. En general, los apartamentos más grandes, ubicados en estratos superiores y con más comodidades, tienden a tener precios más elevados. Este análisis brinda información valiosa para quienes operan en el mercado inmobiliario de Cali.

El modelo de regresión lineal múltiple aplicado a los apartamentos respalda estos hallazgos. El R-cuadrado del modelo es de aproximadamente 0.6969, lo que indica que el 69.69% de la variabilidad en los precios se explica mediante las variables analizadas. Todas las variables independientes, incluyendo el área construida, el estrato, el número de baños y habitaciones, son estadísticamente significativas para predecir el precio de los apartamentos. Sin embargo, se identificó autocorrelación positiva en los residuos, lo que sugiere una posible necesidad de incorporar más variables o realizar ajustes adicionales para mejorar la precisión del modelo. Estos resultados ofrecen una base sólida para el análisis y toma de decisiones en el mercado inmobiliario de Cali, destacando la importancia de considerar estas variables al comprar o vender apartamentos en la ciudad.