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.
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:
# 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…
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)
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\).
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.
Se procede a estimar un modelo de regresión lineal simple:
\[ \text{Precio} = \beta_0 + \beta_1 \times \text{Área Construida} + \epsilon \]
Donde:
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
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.
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.
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.
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.
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.