INTRODUCCIÓN

La inmobiliaria A&C está buscando entender mejor el mercado de viviendas de estrato 4 con menos de 200 metros cuadrados. Para lograrlo, la inmobiliaria A&C ha recopilado datos de ofertas de vivienda del portal Fincaraiz y quieren usar la ciencia de datos para predecir los precios de estas propiedades. El objetivo es crear un modelo que les ayude a fijar precios de manera más precisa en el futuro y facilitar las negociaciones inmobiliarias. Este esfuerzo les permitirá tomar decisiones más informadas y beneficiará tanto a la inmobiliaria como a sus clientes.

Revisión datos iniciales

Estos datos contienen información sobre caracteristicas de viviendas de la ciudad de Cali. Cuenta con un total de 1.706 registros y 5 variables, las cuales son:

  • zona: Zona de la ciudad en la que esta ubicado el inmueble (sur, norte, oriente, occidente)
  • estrato: Estrato socioeconómico
  • preciom: Precio del inmueble en millones de pesos
  • areaconst: Área construida en metros cuadrados
  • tipo: Tipo de inmueble (casa o apartamento)
# Cargar los datos
bdvvda <- vivienda4

# Visión general de los datos
glimpse(bdvvda)
## Rows: 1,706
## Columns: 5
## $ zona      <fct> Zona Norte, Zona Norte, Zona Norte, Zona Sur, Zona Norte, Zo…
## $ estrato   <fct> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
## $ preciom   <dbl> 232.2643, 272.3068, 254.8213, 257.7722, 250.1956, 261.1614, …
## $ areaconst <dbl> 52, 160, 108, 96, 82, 117, 75, 60, 84, 117, 118, 60, 75, 76,…
## $ tipo      <fct> Apartamento, Casa, Apartamento, Apartamento, Apartamento, Ca…

1. Análisis exploratorio de los datos

Durante esta fase, se llevó a cabo un análisis exploratorio de datos centrado en dos variables clave: el precio de la vivienda (en millones de pesos COP) y el área de la vivienda (en metros cuadrados). Para comprender mejor la naturaleza de estos datos, se utilizaron diversos gráficos e indicadores. Primero se realizó un análisis de las variables de forma individual, y luego se examinó la relación entre ellas.

De acuerdo con lo solicitado, se filtran los datos para seleccionar solo los apartamentos que pertenecen al estrato 4 y tienen un área construida menor a 200 metros cuadrados.

# Filtrar por apartamento, estrato 4 y área construida menor a 200 metros cuadrados
datos_filtrados <- bdvvda %>%
  filter(tipo == "Apartamento", estrato == 4, areaconst < 200)
head(datos_filtrados)

1.1. Análisis univariado

Se comenzará examinando la distribución de la variable precio de vivienda y área de la vivienda mediante histogramas para comprender su dispersión y posibles patrones.

Se calcularán medidas resumen como la media, la mediana y la desviación estándar para tener una idea de la centralidad y la dispersión de los datos.

variables <-  datos_filtrados[, c("preciom", "areaconst")]
describe(variables)
#Transformar datos a formato largo
variables_long <- gather(variables, key = "Variable", value = "Valor")

# Filtrar datos por variable
datos_filtrados_preciom <- subset(variables_long, Variable == "preciom")
datos_filtrados_areaconst <- subset(variables_long, Variable == "areaconst")

par(mfrow = c(1, 2))

# Histograma de "preciom"
hist(datos_filtrados_preciom$Valor, main = "Distribución Precio Inmueble",
     xlab = "Precio (millones de COP)", col = "lightblue")
abline(v = mean(datos_filtrados_preciom$Valor), col = "red", lwd = 2)
abline(v = median(datos_filtrados_preciom$Valor), col = "blue", lwd = 2)

# Boxplot de "preciom"
boxplot(datos_filtrados_preciom$Valor, main = "Distribución Precio Inmueble", 
        ylab = "Precio (millones de COP)", col = "lightgreen")

# Histograma de "areaconst"
hist(datos_filtrados_areaconst$Valor, main = "Distribución Área Construida", 
     xlab = "Área Construida (m2)", col = "lightblue")
abline(v = mean(datos_filtrados_areaconst$Valor), col = "red", lwd = 2) 
abline(v = median(datos_filtrados_areaconst$Valor), col = "blue", lwd = 2)

# Boxplot de "areaconst"
boxplot(datos_filtrados_areaconst$Valor, main = "Distribución Área Construida", 
        ylab = "Área Construida (m2)", col = "lightgreen")

De acuerdo con los resultados, vemos que el precio promedio de los apartamentos es de $238.000.000 COP. Los precios presentan un baja dispersión alrededor de la media, con un valor de aproximadamente $13.000.000 COP. Se presentan pocos valores extremos, ya que la media y la mediana son muy cercanas.

El área promedio construida de los apartamentos es de aproximadamente 75,20 \(m^2\). La dispersión de las áreas construidas alrededor de la media es moderada, con un valor de aproximadamente 21,82 \(m^2\).

  • Los precios de los apartamentos en el conjunto de datos tienen una distribución bastante estrecha alrededor de la media, lo que sugiere que hay una consistencia en los precios.

  • Las áreas construidas también muestran una distribución moderada alrededor de la media, aunque hay una variabilidad un poco mayor en comparación con los precios.

Se cuenta con un total de 5 zonas en la ciudad de Cali, donde la zona sur es la que presenta mayor participación con un total de 1063 observaciones, lo que representa aproximadamente el 78,16% del total de inmuebles analizados, seguido por la zona norte con un total de 236 observaciones, lo representando aproximadamente el 17,35%.

summarytools::freq(datos_filtrados$zona)
## Frequencies  
## datos_filtrados$zona  
## Type: Factor  
## 
##                      Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ------------------ ------ --------- -------------- --------- --------------
##        Zona Centro      7      0.51           0.51      0.51           0.51
##         Zona Norte    236     17.35          17.87     17.35          17.87
##         Zona Oeste     52      3.82          21.69      3.82          21.69
##       Zona Oriente      2      0.15          21.84      0.15          21.84
##           Zona Sur   1063     78.16         100.00     78.16         100.00
##               <NA>      0                               0.00         100.00
##              Total   1360    100.00         100.00    100.00         100.00
frecuencia_zona <- table(datos_filtrados$zona)
porcentajes <- prop.table(frecuencia_zona) * 100
df <- data.frame(zona = names(porcentajes),
                 porcentaje = as.vector(porcentajes))

# Distribucion por zona
ggplot(df, aes(x = "", y = porcentaje, fill = zona)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Distribución por Zonas",
       fill = "Zona",
       y = "Porcentaje") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  geom_text(aes(label = paste(round(porcentaje, 1), "%")), 
            position = position_stack(vjust = 0.5), size = 5)

# Gráficos de caja por zona vs precio
ggplot(datos_filtrados, aes(x = zona, y = preciom)) +
  geom_boxplot() +
  labs(x = "Zona", y = "Precio (millones de COP)",
       title = "Distribución del Precio por Zona")

datos_promedio_por_zona <- aggregate(cbind(preciom, areaconst) ~ zona, 
                                     data = datos_filtrados, FUN = mean)

datos_tabla <- data.frame(
  "Zona" = datos_promedio_por_zona$zona,
  "Precio Promedio (millones de COP)" = datos_promedio_por_zona$preciom,
  "Área Promedio (metros cuadrados)" = datos_promedio_por_zona$areaconst)

names(datos_tabla) <- c("Zona","Precio Promedio (millones de COP)", 
                        "Área Promedio (metros cuadrados)")

tabla_completa_por_zona <- kable(datos_tabla, format = "markdown")
tabla_completa_por_zona
Zona Precio Promedio (millones de COP) Área Promedio (metros cuadrados)
Zona Centro 256.3724 107.71429
Zona Norte 238.8099 78.15254
Zona Oeste 238.9407 74.86538
Zona Oriente 240.3947 87.00000
Zona Sur 237.0597 74.32926

Se observa que el precio promedio de los inmuebles en las zonas norte, oeste, oriente y sur es inferior a los $240.000.000 COP y con areas contruidas inferiores a los 100\(m^2\), mientras que la zona centro se muestra sobre los $250.000.000 COP con un area construida superior a los 100\(m^2\).

1.2. Análisis bivariado

En este paso, se explorará la relación entre la variable respuesta (precio de la vivienda) y la variable predictora (área construida).

Se creará un diagrama de dispersión que muestre el precio de la vivienda en función del área construida. Este gráfico ayudará a visualizar la tendencia general de cómo varía el precio con respecto al tamaño de la vivienda.

Se calculará el coeficiente de correlación para cuantificar la fuerza y la dirección de la relación entre el precio y el área.

ggplot(datos_filtrados, aes(x = areaconst, y = preciom)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "blue") +
  labs(x = "Area Construida (m2)", y = "Precio (millones de COP)",
       title = "Relacion entre Precio y Area Construida",
       encoding = "UTF-8")
## `geom_smooth()` using formula = 'y ~ x'

correlation <- cor(datos_filtrados[, c("preciom", "areaconst")])
correlation
##             preciom areaconst
## preciom   1.0000000 0.8370114
## areaconst 0.8370114 1.0000000
corrplot(correlation, method = "color")

De acuerdo con lo obtenido, con una correlación entre el precio y el área construida de aproximadamente 0,837 sugiere una correlación positiva fuerte entre las variables. En otras palabras, a medida que aumenta el precio, también tiende a aumentar el área construida y viceversa.

2. Modelo de regresión lineal

2.1. Estimación del modelo

Se procede a estimar un modelo de regresión lineal simple:

\[ \text{Precio} = \beta_0 + \beta_1 \times \text{Área Construida} + \epsilon \]

Donde:

  • \(\text{Precio}\) es la variable dependiente, que representa el precio de la vivienda en millones de pesos.
  • \(\text{Área Construida}\) es la variable independiente, que representa el área construida de la vivienda en metros cuadrados.
  • \(\beta_0\) es el intercepto del modelo, que representa el precio esperado de la vivienda cuando el área construida es igual a cero.
  • \(\beta_1\) es la pendiente del modelo, que representa el cambio esperado en el precio de la vivienda por cada unidad de cambio en el área construida.
  • \(\epsilon\) es el término de error, que representa la variabilidad no explicada por el modelo.
modelo <- lm(preciom ~ areaconst, data = datos_filtrados)
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst, data = datos_filtrados)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -26.4010  -5.0783  -0.0175   4.6173  24.3353 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.002e+02  6.899e-01  290.15   <2e-16 ***
## areaconst   4.967e-01  8.811e-03   56.37   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.087 on 1358 degrees of freedom
## Multiple R-squared:  0.7006, Adjusted R-squared:  0.7004 
## F-statistic:  3178 on 1 and 1358 DF,  p-value: < 2.2e-16
  • Intercepto (B0): El valor estimado del intercepto es de 200,1863. Esto significa que cuando el área construida es cero, el precio estimado de la vivienda es de aproximadamente $200.000.000 COP. Sin embargo, esta interpretación puede no ser práctica, ya que es poco probable que existan viviendas con un área construida de cero.

  • Coeficiente de área construida (B1): El coeficiente estimado para el área construida es de 0.4967. Esto indica que, en promedio, se espera un aumento de aproximadamente 0.4967 millones de COP en el precio de la vivienda por cada metro cuadrado adicional de área construida. Esto sugiere una relación positiva entre el precio de la vivienda y el área construida. A medida que aumenta el área construida, se espera que el precio de la vivienda también aumente.

En resumen, el modelo sugiere que el precio de la vivienda tiende a aumentar a medida que aumenta el área construida, con un incremento promedio de alrededor de 0.4967 millones de COP por cada metro cuadrado adicional de área construida.

conf_int <- confint(modelo, level = 0.95)
print(conf_int)
##                   2.5 %      97.5 %
## (Intercept) 198.8328481 201.5398110
## areaconst     0.4794099   0.5139806

2.2. Intervalo de confianza, prueba t y \(R^2\)

  • Intervalo de confianza: El intervalo de confianza del 95% para el coeficiente \(B_1\) (correspondiente a areaconst) es de \([0.4794099, 0.5139806]\). Como el intervalo de confianza no incluye el valor cero en ningún punto, podemos concluir que hay evidencia suficiente para afirmar que el coeficiente \(B_1\) es significativamente diferente de cero al nivel de confianza del 95%. Esto indica que el área construida tiene un efecto significativo en el precio de la vivienda.

  • Para el coeficiente del intercepto (\(B_0\)), el valor t es 290.15 y el valor p asociado es prácticamente cero (\(<2 \times 10^{-16}\)), lo que indica que el intercepto es significativamente diferente de cero.

  • Para el coeficiente de la variable areaconst (\(B_1\)), el valor t es 56.37 y el valor p asociado es también prácticamente cero (\(<2 \times 10^{-16}\)), lo que indica que el coeficiente de área construida es significativamente diferente de cero.

  • El indicador de bondad \(R^2\) (coeficiente de determinación) ajustado es de aproximadamente 0,7004. Esto significa que alrededor del 70.04% de la variabilidad en el precio de la vivienda se explica por el modelo de regresión lineal simple que incluye solo la variable de área construida. En otras palabras, el modelo captura el 70.04% de la variabilidad observada en los precios de la vivienda a partir de la variabilidad en el área construida.

2.3. Estimación precio promedio

Para estimar el precio promedio de un apartamento de 110 metros cuadrados utilizando el modelo de regresión lineal simple, es sustituido el valor de 110 metros cuadrados en la ecuación del modelo y se calcula el precio estimado.

Dado que el modelo tiene la forma:

\[ Precio = B_0 + B_1 \times Area \]

Donde \(B_0\) es el intercepto y \(B_1\) es el coeficiente asociado al área.

En tu caso, los coeficientes del modelo son:

\[ B_0 = 200.1863 \] \[ B_1 = 0.4967 \]

Por lo tanto, el precio estimado para un apartamento de 110 metros cuadrados sería:

\[ Precio = 200.1863 + 0.4967 \times 110 \]

B0 <- 200.1863
B1 <- 0.4967
area_apartamento <- 110

precio_estimado <- B0 + B1 * area_apartamento
cat("Precio =", precio_estimado)
## Precio = 254.8233

El precio promedio estimado para un apartamento de 110 metros cuadrados sería de aproximadamente $255.000.000 COP.

Si un apartamento en la misma zona con 110 metros cuadrados tiene un precio de 200 millones, esto sería una oferta atractiva si el precio estimado es significativamente mayor que el precio de mercado. Sin embargo, es importante considerar otras variables además del tamaño del apartamento, como la ubicación, comodidades adicionales, la oferta y la demanda en el mercado inmobiliario, entre otros factores.

2.4. Validación de supuestos

Para validar los supuestos del modelo de regresión lineal, se evalúan los aspectos como linealidad, homocedasticidad, normalidad de los residuos, independencia de los residuos.

# Análisis de residuos
par(mfrow = c(2, 2))  # Configurar diseño de gráficos

# Gráfico de residuos vs. valores ajustados
plot(modelo, which = 1)

# Histograma de residuos
hist(residuals(modelo))

# Gráfico Q-Q plot de los residuos
qqnorm(residuals(modelo))
qqline(residuals(modelo))

# Gráfico de residuos vs. área construida
plot(datos_filtrados$areaconst, residuals(modelo))

# Análisis de homocedasticidad
library(ggplot2)
ggplot(data.frame(x = fitted(modelo), y = residuals(modelo)), aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "loess", se = FALSE) +
  labs(x = "Valores Ajustados", y = "Residuos") +
  ggtitle("Gráfico de Residuos vs. Valores Ajustados")
## `geom_smooth()` using formula = 'y ~ x'

shapiro.test(residuals(modelo))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo)
## W = 0.99883, p-value = 0.5243
# R cuadrado y estadísticas relacionadas
rsq <- summary(modelo)$r.squared
adj_rsq <- summary(modelo)$adj.r.squared
mse <- summary(modelo)$sigma

estadisticas <- data.frame(
  "R cuadrado" = rsq,
  "R cuadrado ajustado" = adj_rsq,
  "Error estándar de la estimación" = mse)

kable(estadisticas, format = "markdown")
R.cuadrado R.cuadrado.ajustado Error.estándar.de.la.estimación
0.700588 0.7003675 7.086765

Los residuos muestran seguir una distribución normal, pues la curva que se evidenciada en el histograma y los puntos en el gráfico se ajustan bien a la línea diagonal en el grafico “Normal Q-Q Plot”, sugiere que los residuos siguen una distribución normal. El resultado del test de normalidad de Shapiro-Wilk sugiere que no hay suficiente evidencia para rechazar la hipótesis nula de normalidad de los residuos del modelo. Un valor de p-valor de 0.5243 indica que no hay suficiente evidencia para concluir que los residuos no siguen una distribución normal. Por lo tanto, no hay violación del supuesto de normalidad en este caso.Tanto el \(R^2\) como el \(R^2\) ajustado son relativamente altos (\(0.70\)), lo que sugiere que el modelo explica una cantidad significativa de la variabilidad en el precio de la vivienda, el error estándar de la estimación es \(7.086765\), lo que indica que, en promedio, las predicciones del modelo tienen un error de aproximadamente \(7.086765\) millones de pesos.

2.5. Transformación y ajuste del modelo

No se encontró necesidad de realizar ninguna transformación adicional en el modelo, ya que los residuos parecen seguir una distribución normal y los indicadores de ajuste (como \(R^2\) y \(R^2\) ajustado) son altos, lo que sugiere que el modelo actual explica una cantidad significativa de la variabilidad en el precio de la vivienda. Por lo tanto, no se realizaron cambios adicionales en el modelo inicial.

2.6. Estimación de modelos y comparación

Se realiza la comparación con 3 modelos transformaciones diferentes, transformación logaritmica y raíz cuadrada.

# Modelo original
modelo_inicial <- lm(preciom ~ areaconst, data = datos_filtrados)

# Modelo con transformación logarítmica
modelo_log <- lm(preciom ~ log(areaconst), data = datos_filtrados)

# Modelo con transformación raíz cuadrada
modelo_sqrt <- lm(preciom ~ sqrt(areaconst), data = datos_filtrados)

# Resumen de los modelos
resumen_modelo_inicial <- summary(modelo_inicial)
resumen_modelo_log <- summary(modelo_log)
resumen_modelo_sqrt <- summary(modelo_sqrt)

# Crear una tabla con los resultados
tabla_resultados <- data.frame(
  Modelo = c("Modelo Inicial", "Modelo Log", "Modelo Raíz Cuadrada"),
  R_cuadrado = c(resumen_modelo_inicial$r.squared, resumen_modelo_log$r.squared, resumen_modelo_sqrt$r.squared),
  R_cuadrado_ajustado = c(resumen_modelo_inicial$adj.r.squared, resumen_modelo_log$adj.r.squared, resumen_modelo_sqrt$adj.r.squared),
  Error_estandar_estimacion = c(resumen_modelo_inicial$sigma, resumen_modelo_log$sigma, resumen_modelo_sqrt$sigma)
)

# Mostrar la tabla
print(tabla_resultados)
##                 Modelo R_cuadrado R_cuadrado_ajustado Error_estandar_estimacion
## 1       Modelo Inicial  0.7005880           0.7003675                  7.086765
## 2           Modelo Log  0.6707439           0.6705014                  7.431567
## 3 Modelo Raíz Cuadrada  0.6920276           0.6918008                  7.187359

De acuero con los valores de \(R^2\) y \(R^2\) ajustado de los tres modelos, podemos hacer las siguientes deducciones:

  • El modelo inicial, que utiliza la variable original areaconst, tiene el \(R^2\) más alto, con un valor de 0.7006. Esto indica que alrededor del 70.06% de la variabilidad en el precio de la vivienda se explica por la variable areaconst. El \(R^2\) ajustado es muy similar, lo que sugiere que no hay mucha diferencia en la explicación de la variabilidad después de ajustar por el número de predictores en el modelo.

  • El modelo logarítmico tiene un \(R^2\) de 0.6707 y un \(R^2\) ajustado de 0.6705. Estos valores son ligeramente más bajos que los del modelo inicial. Esto sugiere que el modelo logarítmico explica un poco menos de la variabilidad en el precio de la vivienda en comparación con el modelo original.

  • El modelo con transformación de raíz cuadrada tiene un \(R^2\) de 0.6920 y un \(R^2\) ajustado de 0.6918. Estos valores están entre los del modelo inicial y el modelo logarítmico. Esto sugiere que la transformación de raíz cuadrada mejora ligeramente la capacidad del modelo para explicar la variabilidad en el precio de la vivienda en comparación con el modelo logarítmico, pero aún no alcanza el nivel del modelo original.

Dado que el modelo inicial tiene el \(R^2\) más alto y el \(R^2\) ajustado más alto, indicando que explica una mayor proporción de la variabilidad en el precio de la vivienda, y considerando que no hay una mejora significativa en el ajuste al utilizar transformaciones logarítmicas o de raíz cuadrada, optaría por el modelo inicial que utiliza la variable original areaconst.