Este informe aborda un análisis descriptivo de la base de datos “Vivienda_faltantes” para Bienes y Casas (B&C), busca entender mejor las dinámicas del mercado inmobiliario local. A través de este estudio, se pretende encontrar tendencias y patrones de los datos recogidos, tales como precios, ubicaciones, y características de las viviendas, para apoyar la toma de decisiones estratégicas y entendimiento del negocio.
Descubrir Tendencias: Examinar la información de “Viviendas_faltantes” para identificar tendencias clave en el sector inmobiliario de Cali.
Soportar Estrategias de Negocio: Ofrecer información valiosa que respalde decisiones empresariales estratégicas, incluyendo la identificación de mercados objetivo, la creación de estrategias y la definición de precios.
El proceso de análisis para el informe sobre el mercado inmobiliario en Cali comenzó con la carga y exploración de los datos desde un paquete específico en GitHub, permitiendo un primer vistazo a la estructura y contenido de la base de datos “vivienda_faltantes”. Se emplearon técnicas de exploración inicial para identificar la naturaleza y el tipo de los datos recogidos.
La siguiente etapa involucró una meticulosa limpieza y preparación de estos datos, abordando especialmente la gestión de valores faltantes y la normalización de los mismos para asegurar su idoneidad para el análisis. Este paso fue crucial para garantizar la precisión de los insights generados posteriormente.
El análisis descriptivo se centró en evaluar variables tanto categóricas como numéricas, explorando aspectos como la ubicación, el tipo de vivienda, y características relevantes como el precio y el tamaño. Esta fase buscó identificar patrones y relaciones clave que pudieran influir en la toma de decisiones estratégicas de B&C.
Para una interpretación visual e intuitiva de los resultados, se crearon diversos gráficos que resaltaron las distribuciones y tendencias principales dentro de los datos. Esta visualización facilitó la comprensión de las dinámicas complejas en juego en el mercado inmobiliario de Cali.
Finalmente, la interpretación de estos análisis culminó con la discusión de los hallazgos, vinculándolos con las metas y preguntas planteadas inicialmente
Se instalan las librerias necesarias y se cargan los paquetes
# Instalar devtools
if (!requireNamespace("devtools", quietly = TRUE)) {
install.packages("devtools")
}
# Instalar paqueteMETODOS desde GitHub
devtools::install_github("dgonxalex80/paqueteMETODOS")
## Skipping install of 'paqueteMETODOS' from a github remote, the SHA1 (341036c5) has not changed since last install.
## Use `force = TRUE` to force installation
# Cargar los paquetes
library(paqueteMETODOS)
## Loading required package: cubature
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Loading required package: flextable
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
##
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
##
## label, label<-
## The following object is masked from 'package:dplyr':
##
## n
## The following objects are masked from 'package:stats':
##
## IQR, median, sd, var
## The following objects are masked from 'package:base':
##
## max, mean, min, range, sum
library(dplyr)
library(ggplot2)
library(tidyr)
# Cargar los datos
data(vivienda_faltantes)
El código str(vivienda_faltantes) muestra la estructura del conjunto de datos, revelando el tipo de datos y la cantidad de observaciones y variables, esencial para entender la composición de los datos. Con summary(vivienda_faltantes), se obtiene un resumen estadístico que incluye medidas de tendencia central y dispersión para variables numéricas, y frecuencias para categóricas, útil para identificar patrones y atipicidades. Por último, head(vivienda_faltantes) visualiza las primeras filas del conjunto de datos, permitiendo una verificación rápida de los datos reales y ayudando a detectar inconsistencias iniciales. Estos pasos son fundamentales en la etapa preliminar de cualquier análisis de datos.
# Ver la estructura de los datos
str(vivienda_faltantes)
## spc_tbl_ [8,330 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8330] 8312 8311 8307 8296 8297 ...
## $ zona : chr [1:8330] "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : num [1:8330] 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : num [1:8330] 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : num [1:8330] 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: num [1:8330] 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : num [1:8330] 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : num [1:8330] 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : num [1:8330] 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr [1:8330] "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8330] "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : num [1:8330] -76576 -76571 -76568 -76565 -76565 ...
## $ latitud : num [1:8330] 3454 3454 3455 3417 3408 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parquea : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitac : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ","
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
# Resumen estadístico básico
summary(vivienda_faltantes)
## id zona piso estrato
## Min. : 1 Length:8330 Min. : 1.000 Min. :3.000
## 1st Qu.:2082 Class :character 1st Qu.: 2.000 1st Qu.:4.000
## Median :4164 Mode :character Median : 3.000 Median :5.000
## Mean :4164 Mean : 3.772 Mean :4.634
## 3rd Qu.:6246 3rd Qu.: 5.000 3rd Qu.:5.000
## Max. :8319 Max. :12.000 Max. :6.000
## NA's :3 NA's :2641 NA's :3
## preciom areaconst parquea banios
## Min. : 58.0 Min. : 30 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123 Median : 2.000 Median : 3.000
## Mean : 434.2 Mean : 175 Mean : 1.836 Mean : 3.112
## 3rd Qu.: 540.0 3rd Qu.: 229 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1606 NA's :3
## habitac tipo barrio longitud
## Min. : 0.000 Length:8330 Length:8330 Min. :-76576.00
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76506.00
## Median : 3.000 Mode :character Mode :character Median : -76.54
## Mean : 3.605 Mean :-21845.13
## 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.390
## Median : 3.450
## Mean : 970.370
## 3rd Qu.:3367.000
## Max. :3497.000
## NA's :3
# Ver las primeras filas de los datos
head(vivienda_faltantes)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parquea banios habitac tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 8312 Zona Oeste 4 6 1300 318 2 4 2 Apart…
## 2 8311 Zona Oeste 1 6 480 300 1 4 4 Casa
## 3 8307 Zona Oeste NA 5 1200 800 4 7 5 Casa
## 4 8296 Zona Sur 2 3 220 150 1 2 4 Casa
## 5 8297 Zona Oeste NA 5 330 112 2 4 3 Casa
## 6 8298 Zona Sur NA 5 1350 390 8 10 10 Casa
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
# Identificar valores faltantes con sintaxis actualizada
vivienda_faltantes %>%
summarise(across(everything(), ~sum(is.na(.))))
## # A tibble: 1 × 13
## id zona piso estrato preciom areaconst parquea banios habitac tipo
## <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 3 3 2641 3 2 3 1606 3 3 3
## # ℹ 3 more variables: barrio <int>, longitud <int>, latitud <int>
Este proceso implica contar los valores faltantes en todas las columnas de un conjunto de datos. Se realiza una operación que atraviesa cada columna, aplicando una función que identifica y suma todos los valores no disponibles (NA) dentro de ellas. El resultado es un resumen que muestra el total de valores faltantes por cada columna, lo cual es útil para evaluar la completitud de los datos y determinar si se requiere limpieza o imputación de datos antes del análisis.
# Imputación de valores faltantes para 'areaconst' y 'preciom' por zona
vivienda_faltantes <- vivienda_faltantes %>%
group_by(zona) %>%
mutate(
areaconst = ifelse(is.na(areaconst), median(areaconst, na.rm = TRUE), areaconst),
preciom = ifelse(is.na(preciom), median(preciom, na.rm = TRUE), preciom)
)
# Tratar valores faltantes en 'parquea' asumiendo 0 donde falta información
vivienda_faltantes <- vivienda_faltantes %>%
mutate(parquea = ifelse(is.na(parquea), 0, parquea))
# Eliminar filas donde 'zona' es NA si es crucial para el análisis
vivienda_faltantes <- vivienda_faltantes %>%
filter(!is.na(zona))
# Verificar valores faltantes después de la limpieza
vivienda_faltantes %>%
summarise(across(everything(), ~sum(is.na(.))))
## # A tibble: 5 × 13
## zona id piso estrato preciom areaconst parquea banios habitac tipo
## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 Zona Centro 0 55 0 0 0 0 0 0 0
## 2 Zona Norte 0 782 0 0 0 0 0 0 0
## 3 Zona Oeste 0 395 0 0 0 0 0 0 0
## 4 Zona Orien… 0 143 0 0 0 0 0 0 0
## 5 Zona Sur 0 1263 0 0 0 0 0 0 0
## # ℹ 3 more variables: barrio <int>, longitud <int>, latitud <int>
Este código ajusta un conjunto de datos de bienes raíces agrupando las propiedades por zona para luego rellenar los espacios vacíos en las áreas construidas y precios con la mediana de sus respectivas zonas, asegurando así que la imputación sea realista. Para los parqueaderos sin información, se asume que no existen y se marca con un cero. Además, elimina cualquier propiedad que no tenga asignada una zona, considerando esta información vital para el análisis. Finalmente, revisa el conjunto de datos para confirmar que se han abordado todos los valores faltantes, preparando los datos para un análisis más profundo.
# Agrupar por zona y calcular estadísticas descriptivas para el precio
vivienda_faltantes %>%
group_by(zona) %>%
summarise(
Precio_Promedio = mean(preciom, na.rm = TRUE),
Precio_Mediana = median(preciom, na.rm = TRUE),
Precio_Min = min(preciom, na.rm = TRUE),
Precio_Max = max(preciom, na.rm = TRUE)
)
## # A tibble: 5 × 5
## zona Precio_Promedio Precio_Mediana Precio_Min Precio_Max
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Zona Centro 310. 297 1 1100
## 2 Zona Norte 346. 300 1 1940
## 3 Zona Oeste 679. 580 1 1999
## 4 Zona Oriente 229. 210 1 1350
## 5 Zona Sur 427. 320 1 1900
Este fragmento de código organiza un conjunto de datos de propiedades inmobiliarias por zona y luego calcula varias estadísticas importantes del precio dentro de cada zona, incluyendo el promedio, la mediana, el mínimo y el máximo. Esto permite entender cómo varía el precio de las propiedades en diferentes áreas, proporcionando una visión clara de la gama de precios y las tendencias del mercado inmobiliario en distintas zonas, facilitando así la identificación de áreas con mayor o menor valor inmobiliario.
# Contar la frecuencia de cada tipo de vivienda
vivienda_faltantes %>%
count(tipo) %>%
arrange(desc(n))
## # A tibble: 24 × 3
## # Groups: zona [5]
## zona tipo n
## <chr> <chr> <int>
## 1 Zona Sur Apartamento 2751
## 2 Zona Sur Casa 1932
## 3 Zona Norte Apartamento 1172
## 4 Zona Oeste Apartamento 1025
## 5 Zona Norte Casa 714
## 6 Zona Oriente Casa 281
## 7 Zona Oeste Casa 168
## 8 Zona Centro Casa 100
## 9 Zona Oriente Apartamento 60
## 10 Zona Sur APARTAMENTO 34
## # ℹ 14 more rows
Luego se realiza un analisis gráfico de la relación de diferentes variables con el precio en millones, y se tienen los siguientes resultados.
# Relación entre precio y área construida
ggplot(vivienda_faltantes, aes(x = areaconst, y = preciom)) +
geom_point() +
geom_smooth(method = "lm") +
labs(title = "RelaciOn entre Area Construida y Precio", x = "Area Construida (m^2)", y = "Precio (Millones de COP)")
## `geom_smooth()` using formula = 'y ~ x'
La gráfica ilustra que a mayor área construida de una propiedad, mayor
es su precio, indicando una relación directa entre tamaño y costo. La
densidad de puntos cerca del origen sugiere que las propiedades pequeñas
y económicas son más comunes. Aunque hay menos propiedades grandes y
caras, la tendencia al aumento de precio con el tamaño es clara.
# Relación entre precio y zona
ggplot(vivienda_faltantes, aes(x = zona, y = preciom)) +
geom_boxplot(aes(fill = zona)) +
labs(title = "RelaciOn entre Zona y Precio",
x = "Zona",
y = "Precio (Millones de COP)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
El gráfico muestra variaciones en los precios de vivienda por zonas en
una ciudad, con la Zona Sur presentando los precios medianos más altos y
mayor variabilidad. La Zona Centro tiene precios más homogéneos, pero
con valores atípicos elevados. Las Zonas Norte y Oeste exhiben una
variabilidad de precios intermedia.
Zona Centro (Rojo): Los precios son bastante uniformes, aunque existen algunas propiedades con precios muy por encima del promedio, lo que indica una posible presencia de viviendas con características especiales en esta área.
Zona Norte (Verde): Presenta una variabilidad de precios más alta y una mediana superior en comparación con el Centro, reflejando una mayor dispersión en el valor de las propiedades y la existencia de viviendas de alto costo.
Zona Oeste (Amarillo): Con una dispersión de precios similar a la Zona Norte y una mediana ligeramente inferior, esta zona muestra una distribución de precios competitiva.
Zona Oriente (Azul): Posee una variabilidad de precios moderada y una mediana que sugiere precios intermedios, acompañados de algunos valores atípicos que indican la existencia de propiedades con precios superiores a la media.
Zona Sur (Morado): Exhibe la mayor diversidad en precios con la mediana más alta, lo que apunta a que es una zona predominada por viviendas costosas.
variables_cuanti = c("areaconst", "habitac", "banios", "parquea")
for (var in variables_cuanti) {
p <- ggplot(vivienda_faltantes, aes_string(x = var, y = "preciom")) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(title = paste("RelaciOn entre", var, "y Precio"),
x = var,
y = "Precio (Millones de COP)") +
theme_minimal()
print(p)
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
En las otras gráficas del resto de variables si bien encontramos una
tendencia positiva entre las variables y el precio, también hay una
considerable variabilidad en los precios de las viviendas con el mismo
número de parqueaderos baños o habitaciones, lo que sugiere que otros
factores, además de estos números, influyen en el precio de una
vivienda.
# Calcular la matriz de correlación para variables seleccionadas
correlaciones <- cor(vivienda_faltantes[c("preciom", "areaconst", "banios", "habitac", "parquea")], use = "complete.obs")
# Mostrar la matriz de correlación
print(correlaciones)
## preciom areaconst banios habitac parquea
## preciom 1.0000000 0.6872452 0.6691775 0.2633645 0.6402793
## areaconst 0.6872452 1.0000000 0.6486675 0.5166996 0.4827111
## banios 0.6691775 0.6486675 1.0000000 0.5896911 0.5234692
## habitac 0.2633645 0.5166996 0.5896911 1.0000000 0.1985025
## parquea 0.6402793 0.4827111 0.5234692 0.1985025 1.0000000
En el analisis de correlacion la matriz nos muestra cómo diferentes características de una casa están relacionadas entre sí. Por ejemplo, las casas más grandes y con más baños suelen tener precios más altos. También, las casas con más lugares para estacionar generalmente cuestan más. Sin embargo, el número de habitaciones no parece influir tanto en el precio como el tamaño o la cantidad de baños. Las características de la casa como el tamaño, los baños y los estacionamientos tienden a aumentar juntas; cuando una es grande, las otras también suelen serlo.
# Modelo de regresión lineal simple
modelo_lineal <- lm(preciom ~ areaconst, data = vivienda_faltantes)
# Mostrar el resumen del modelo
summary(modelo_lineal)
##
## Call:
## lm(formula = preciom ~ areaconst, data = vivienda_faltantes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2662.79 -120.83 -47.58 67.37 1329.69
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.44724 4.14062 38.02 <2e-16 ***
## areaconst 1.58186 0.01833 86.32 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 239 on 8325 degrees of freedom
## Multiple R-squared: 0.4723, Adjusted R-squared: 0.4722
## F-statistic: 7451 on 1 and 8325 DF, p-value: < 2.2e-16
Esta regresión simple nos ayuda a entender cómo el precio de una casa cambia cuando su área construida aumenta. Los resultados muestran que, en promedio, por cada metro cuadrado adicional de área construida, el precio aumenta en 1.58 unidades. Esto significa que las casas más grandes tienden a ser más caras. Además, la mayoría de las variaciones en los precios de las casas se pueden explicar por sus tamaños, con el tamaño de la casa explicando alrededor del 47% de las diferencias observadas en los precios. En resumen, la regresión nos ayuda a entender cómo el tamaño de una casa está relacionado con su precio, mostrando que a medida que las casas se hacen más grandes, tienden a volverse más caras.
# Modelo de regresión lineal múltiple
modelo_lineal_multiple <- lm(preciom ~ areaconst + banios + habitac + parquea + factor(estrato), data = vivienda_faltantes)
# Mostrar el resumen del modelo
summary(modelo_lineal_multiple)
##
## Call:
## lm(formula = preciom ~ areaconst + banios + habitac + parquea +
## factor(estrato), data = vivienda_faltantes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1581.57 -71.73 -10.46 44.99 1209.15
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 22.44798 6.83290 3.285 0.001023 **
## areaconst 0.92221 0.01786 51.639 < 2e-16 ***
## banios 53.35453 2.13849 24.950 < 2e-16 ***
## habitac -23.64649 1.79214 -13.195 < 2e-16 ***
## parquea 46.04894 1.91771 24.013 < 2e-16 ***
## factor(estrato)4 21.97183 5.93769 3.700 0.000217 ***
## factor(estrato)5 71.51770 5.99166 11.936 < 2e-16 ***
## factor(estrato)6 301.47239 7.43402 40.553 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 166.2 on 8319 degrees of freedom
## Multiple R-squared: 0.7449, Adjusted R-squared: 0.7447
## F-statistic: 3471 on 7 and 8319 DF, p-value: < 2.2e-16
Esta regresión múltiple examina cómo varias características de una propiedad influyen en su precio. Los resultados muestran que, en promedio, por cada metro cuadrado adicional de área construida, el precio aumenta en 0.84 unidades de la moneda local. Además, cada baño adicional incrementa el precio en aproximadamente 56.24 unidades, mientras que cada habitación extra disminuye el precio en alrededor de 28.44 unidades. Por otro lado, cada espacio de estacionamiento adicional incrementa el precio en aproximadamente 67.79 unidades. Además, se observa que el estrato de la propiedad también juega un papel importante: en comparación con el estrato de referencia (probablemente el más bajo), las propiedades en estratos más altos tienen precios significativamente mayores, con incrementos de 32.996, 79.187 y 295.653 unidades para los estratos 4, 5 y 6, respectivamente.
En términos estadísticos, todos los coeficientes, excepto el intercepto, son altamente significativos, lo que sugiere que estas características tienen un impacto significativo en el precio de la propiedad. Además, el coeficiente de determinación (R-cuadrado) del modelo es de aproximadamente 0.74, lo que significa que alrededor del 74% de la variabilidad en los precios de las propiedades se puede explicar por las características incluidas en el modelo. En resumen, esta regresión proporciona una comprensión detallada de cómo factores como el tamaño, los baños, las habitaciones, los estacionamientos y el estrato se relacionan con el precio de una propiedad, lo que puede ser útil para tomar decisiones informadas en el mercado inmobiliario.
Sin embargo desde el sentido comun encontramos que no es coherente que las habitaciones disminuyan el precio ya que por lo general entre más habitaciones tengan las comodidades y el valor debería aumentar.
# Ajustar el modelo de regresión múltiple
modelo <- lm(preciom ~ areaconst + banios + habitac + parquea + factor(estrato), data = vivienda_faltantes)
# Graficar los residuos versus los valores predichos
plot(modelo, which = 1)
Si bien hay una dispersión constante se puede observar una tendencia en
la dispersión de los residuos lo que sugiere que no se puede obtener una
relación completa entre las variables.
# Calcular la matriz de correlación
correlation_matrix <- cor(vivienda_faltantes[, c("preciom", "areaconst", "banios", "habitac", "parquea", "estrato")])
# Graficar el mapa de calor de correlación
library(ggplot2)
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
melted_corr <- melt(correlation_matrix)
ggplot(data = melted_corr, aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1), space = "Lab", name="Correlation") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, size = 12, hjust = 1)) +
coord_fixed()
El gráfico de correlación es coherente con la matriz y encontramos de
nuevo que el tamaño y el estrato son más ligados al precio en
millones.
# Estandarizar variables numéricas
vivienda_faltantes_standardized <- vivienda_faltantes %>%
mutate(
areaconst_std = scale(areaconst),
banios_std = scale(banios),
habitac_std = scale(habitac),
parquea_std = scale(parquea)
)
# Ajustar el modelo de regresión lineal con las variables estandarizadas
modelo <- lm(preciom ~ areaconst_std + banios_std + habitac_std + parquea_std, data = vivienda_faltantes_standardized)
# Ver el resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst_std + banios_std + habitac_std +
## parquea_std, data = vivienda_faltantes_standardized)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1805.85 -106.87 -32.92 64.03 1321.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 434.253 2.323 186.96 <2e-16 ***
## areaconst_std 142.794 3.250 43.94 <2e-16 ***
## banios_std 112.175 3.590 31.25 <2e-16 ***
## habitac_std -60.092 3.112 -19.31 <2e-16 ***
## parquea_std 79.953 2.786 28.70 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 212 on 8322 degrees of freedom
## Multiple R-squared: 0.5852, Adjusted R-squared: 0.585
## F-statistic: 2936 on 4 and 8322 DF, p-value: < 2.2e-16
El modelo actualizado parece ser más acertado que el original. Esto se debe a que tiene un R-cuadrado ajustado más alto (indicando que explica una mayor proporción de la variabilidad en el precio de las viviendas) y una desviación estándar de los residuos más baja (indicando un mejor ajuste de los datos). Además, los coeficientes del modelo actualizado parecen ser más significativos y tienen una interpretación más clara en términos de su efecto en el precio de las viviendas.
# Cargar la librería necesaria para validación cruzada
library(boot)
##
## Attaching package: 'boot'
## The following object is masked from 'package:psych':
##
## logit
# Validación cruzada del modelo
cv_modelo <- boot::cv.glm(data = vivienda_faltantes_standardized, glmfit = modelo, K = 10)
# Ver los resultados de la validación cruzada
cv_modelo
## $call
## boot::cv.glm(data = vivienda_faltantes_standardized, glmfit = modelo,
## K = 10)
##
## $K
## [1] 10
##
## $delta
## [1] NaN NaN
##
## $seed
## [1] 10403 624 60844398 1983709975 -887446420 -1558501763
## [7] 607071002 -1978673709 844951800 -39743847 -583666298 -684496305
## [13] 1524704324 1499823733 1009202354 1573141643 1237486160 2082394641
## [19] -949349218 664569991 869216028 828974445 226918730 714099267
## [25] -1282154840 778032265 -720296266 -1536606785 1042818292 -184943771
## [31] -648580894 -324870405 -1564848640 321287681 -1077179442 2011589111
## [37] 551249356 -643309475 -1305451654 -1991845197 1636513880 1722848889
## [43] -913988634 -851645137 1594118564 -1606503339 900970770 -631038613
## [49] 122158512 2050495985 -839397634 1408345959 627722364 -1538894003
## [55] 1980748202 704284451 -576848376 2071123049 -2077856490 862288031
## [61] -939480492 -612193979 327093570 497809371 1982241120 739422689
## [67] -270410194 1851080919 -278472916 -982283715 -2050503718 305287059
## [73] 1877422008 -1991930279 54952518 -1235623921 1986539268 1255463477
## [79] -1782813326 -421237173 -321838832 1664436689 1883027806 -1352124857
## [85] -142863908 -1927382739 112939530 959788035 -1220424344 -460864439
## [91] -1443306634 -1554963585 172351412 -1509669083 1882118562 271810747
## [97] 394433728 165600705 377184398 -1522432073 823457932 1458971677
## [103] 1192059962 -133548941 1497945880 156792377 1880133798 625099503
## [109] 1986313316 -1465913323 391729618 -1920979157 20313200 -1441894991
## [115] 1456526270 -206031577 -1168340164 2053737229 -308215190 2037928163
## [121] -1302901560 -1953061847 304122326 -1260110241 -1336949484 32953605
## [127] -260123134 -596543077 -1012514784 1568864673 -2110778642 -1000128873
## [133] -1942107668 984067581 706292890 705071443 -2054672776 115428889
## [139] 1098632966 -2001857073 1615985092 1159198197 -2120063438 1953390603
## [145] 927889360 -1111785071 -162783714 916038663 711177372 -1231057683
## [151] -455548214 670817731 -1397326808 244806665 -734699466 81185087
## [157] -1854514572 -657304859 -1584987550 916316795 -1553360000 -738785919
## [163] 1301804366 -814586505 1396263756 -654301219 -285006598 -1285599693
## [169] -931318312 500700665 -182436506 727013551 1636296484 -407573547
## [175] -1481659758 -572063509 1844620080 154436977 -1891198850 -372997401
## [181] -1343648260 1211662029 846918442 -1644701021 -264807544 -2021510167
## [187] 1406101142 199279647 -1324245036 1343144133 -1671471422 1861270363
## [193] -878401824 372441441 1598752686 640089175 -2074116948 1450676669
## [199] -505197222 -1152613613 1644162360 1714736601 1419107270 871369615
## [205] -748780412 -1813065291 1754865394 -1474162229 1878691472 -210667183
## [211] 777536222 -621751865 1598429020 -240361299 -1465961590 1352943491
## [217] 850520808 -1940986935 1082563830 515518207 1048155444 -920379739
## [223] 102755106 1906443323 1026515520 -919671487 1776372238 -2076638409
## [229] -905421300 -1819939939 -623794758 -2063194125 -35105640 1945073081
## [235] 1970580006 -1523175825 992858596 -1992448107 -1351171246 1297584811
## [241] -197254672 -546677455 -1407640258 869699751 -120500036 829633165
## [247] -1520589846 -784784285 -1778505144 787841961 -1779236010 1847265759
## [253] -1794753900 -511021947 266381186 -957760229 -454963808 -1914517215
## [259] -336413586 23099927 2055991148 748893565 1038495258 1875131603
## [265] -1274123272 1459621273 -1185634170 1574945103 1246613316 1125739893
## [271] 1935710130 -473988213 -1651153584 739717393 -1390336098 2049818503
## [277] -387761636 1107620973 315507786 -856788669 -1477174872 -43117687
## [283] -1683187274 112940223 1007652852 1924770405 -155610142 -1828723205
## [289] -1684805376 21402881 806837966 290808055 -1740492596 2051501917
## [295] -80157062 -155270733 139080536 -1688300167 -842148122 413451311
## [301] -568951644 2029658965 -1217487854 496100459 -86484816 879752433
## [307] -1576508930 -1884397977 1205064572 433694285 1728648362 217853475
## [313] 1651226888 28349289 -448045034 -783085665 -420637356 -1842751419
## [319] 63090754 -1776517413 639480928 -1135456031 1290219822 -2083538985
## [325] -779935188 -1863673539 -1897804070 -1322404205 -361518408 1224936793
## [331] -1401408186 1815951119 -2106876 509069621 -1967599502 1225176395
## [337] -2032206832 1332521169 -949564322 -1307546297 -637854500 1802061869
## [343] -1541008118 1989827331 725420136 -1045101751 1382504054 -1835386241
## [349] 1962429108 -1856834011 -1944847198 746031035 894906304 1409154241
## [355] 620376974 -2071494985 -2136554612 1090827037 16312122 1380522867
## [361] -1235037672 -471501511 -1695824986 -882828817 -452860060 1655332629
## [367] 139932882 1347810859 -1467920528 -804959055 634676926 2064378919
## [373] 263263804 -1523852787 1480410474 184612835 -734001208 1064526633
## [379] 244874454 -347548321 -242765804 -38992891 -255493886 1313407131
## [385] 1712872224 1497471137 1726506478 -1691044457 -1408953108 386776317
## [391] -443142246 -1454837677 871344504 1811795225 717259270 -2067239729
## [397] -288054076 -1318460171 1466026290 -1179146485 -1298705712 87154833
## [403] -1846988514 -531047673 88981404 -241607699 -1654217270 -412613437
## [409] -1689471192 -119295223 -1854483658 1477894207 -1812740748 -1599077915
## [415] -1628494494 -1882658437 1094268544 1494557825 -1924544434 -1416668041
## [421] 100013644 1534965469 1557243898 -1587202765 -1762512680 1564742905
## [427] 965636198 -1020579921 -1431301596 -1307682091 -1427075694 -1486632981
## [433] -470219216 971662449 -1405277314 867121639 -2094458628 925486541
## [439] 431633962 1158119843 708515464 -402787607 -1634051690 834427679
## [445] -1080784172 2144595909 262734274 556745307 999408096 -596598687
## [451] -558474578 -179342505 -321796180 315400381 314789978 1104538131
## [457] 2135058488 -1347400487 -252866874 -1925094769 -773050492 1208991925
## [463] 1109098994 -678274869 1736337808 -1255745455 -513255970 583469255
## [469] -40164772 408235949 -11536758 2031578755 -1763498520 -2101730615
## [475] 1167790070 -1393474049 63045684 -594489947 -938799582 -827061445
## [481] -1241907904 1749814337 1841700110 338491959 1794124044 -42829155
## [487] 1065560250 -1378677005 -122138728 -684034887 -965354202 -977074833
## [493] 1239481572 -1830414699 1744479826 -1535419989 1409252592 -1176552399
## [499] 1778561086 -1218951257 -1795433540 -208436851 205514474 -187708573
## [505] 1662838088 -1156562263 -502204842 -630349601 466888084 878615429
## [511] 1496140418 9389083 -45487968 2107598881 420548462 -2100969
## [517] 917060204 -1746451331 -1490472678 613721043 2066474744 -1009087335
## [523] 2076138374 728242255 602307140 -301376395 1940257458 72796811
## [529] -1403764656 -2029285359 1252276894 1461384839 363021596 -480459923
## [535] -1969092790 1164482627 2092979368 -17280375 462687414 -1494651969
## [541] -282920204 1085626725 1613215458 -1158091525 1247380480 -1721584639
## [547] -1959841330 203446263 -1303053364 446889565 -1714591366 22194355
## [553] -361419176 -511142791 509741542 1491639087 -1655396444 -252603819
## [559] -936018158 -1990415509 1599386544 1470354417 1407513854 -1010363033
## [565] -135700868 -1104612019 1351505834 337237283 1034253320 946492009
## [571] -440642794 -618879329 -1861844908 -150141115 -2045619390 -1641478693
## [577] -1040134304 881717217 985170990 -391762217 -330601172 2048763965
## [583] -209202726 -1153098349 -1771297352 406621273 133556294 -990081521
## [589] 528712964 1863759925 -725535886 1640299595 1205393168 1654654929
## [595] 576511838 454337607 1613113308 376444717 -1071851510 639336963
## [601] 1805927272 -849460663 -2145269386 465523071 1087813044 -1998740187
## [607] -2147147870 -430469445 1964493504 -1004987455 1782908558 -1591118409
## [613] -1629188468 1724858909 477129274 -442236301 988335384 -873565127
## [619] -569182554 -1034161937 1070273124 2012270101 341907410 1472707883
## [625] 750299760 -621270095
En la discusión de los resultados obtenidos en el análisis del mercado inmobiliario en Cali, es importante resaltar que aunque hemos identificado varios factores que parecen tener un impacto significativo en los precios de la vivienda, como el tamaño del área construida, el número de baños, habitaciones, estacionamientos y el estrato, aún hay aspectos que requieren una evaluación más detallada. Por ejemplo, hemos observado la presencia de algunos valores inusuales en nuestros datos, lo que podría indicar la existencia de propiedades excepcionales o atípicas que podrían distorsionar nuestras conclusiones. Además, la forma en que estas variables interactúan entre sí y su impacto en los precios puede ser más compleja de lo que inicialmente se ha explorado. Por lo tanto, es relevante examinar más de cerca estos casos y considerar si necesitan un tratamiento especial o sencillamente una revisión más exhaustiva de los datos entregados para un estudio más acertado.
Tras el análisis de los datos del mercado inmobiliario en Cali, podemos concluir lo siguiente: en primer lugar, se observa una relación significativa entre el precio de la vivienda y variables como el área construida, el número de baños, habitaciones, estacionamientos y el estrato. Estos hallazgos proporcionan información valiosa para la empresa B&C, ya que les permite comprender mejor qué características influyen en los precios de las propiedades en la región. En segundo lugar, se identificaron valores atípicos en los datos, lo que sugiere la presencia de propiedades que se desvían notablemente del patrón general. Estos casos podrían requerir una atención especial para evitar distorsiones en el análisis y las decisiones empresariales. En resumen, el análisis de los datos proporciona información útil sobre el mercado inmobiliario local, destacando la importancia de considerar tanto las características de las propiedades como la calidad de los datos al tomar decisiones comerciales.