Descargar la base de datos:
library(readxl)
Datos_Vivienda <- read_excel("C:/Users/user/Downloads/Datos_Vivienda.xlsx",
col_types = c("text", "numeric", "text",
"numeric", "numeric", "numeric",
"numeric", "numeric", "text", "text",
"numeric", "numeric"))
View(Datos_Vivienda)
Hacer una tabla para identificar los barrios que tengan más de 30 observaciones:
# Tabla de frecuencias por barrio
tabla_barrios = sort(table(Datos_Vivienda$Barrio),
decreasing = TRUE)
View(tabla_barrios)
tabla_barrios[tabla_barrios > 30]
##
## valle del lili ciudad jardin pance
## 1008 540 409
## la flora santa teresita el caney
## 366 262 208
## el ingenio la hacienda normandia
## 202 164 159
## acopi los cristales el limonar
## 158 154 135
## prados del norte el refugio aguacatal
## 126 120 109
## ciudad 2000 caney cristales
## 95 88 83
## urbanizacion la flora brisas de los melendez
## 83 81 75
## zona sur nueva tequendama quintas de don
## 74 73 72
## versalles santa isabel parcelaciones pance
## 71 63 61
## el penon el lido torres de comfandi
## 60 59 57
## capri juanambu san fernando
## 56 55 54
## santa monica villa del prado el bosque
## 54 51 49
## ciudad bochalema san vicente santa anita
## 48 48 48
## mayapan las vegas santa rita colseguros
## 46 45 44
## cuarto de legua tequendama bellavista
## 44 44 43
## salomia santa mónica residencial arboledas
## 40 39 38
## Cali primero de mayo camino real
## 37 37 35
## ciudad cordoba bochalema seminario
## 35 33 32
## vipasa zona norte los cambulos
## 32 32 31
## napoles
## 31
Entonces debido a que el barrio Pance tiene 409 observaciones, haremos el análisis en base a este barrio:
Primero cargamos las librerias necesarias:
# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr) #Facilita la creación de informes con R Markdown, combinando texto, código y resultados.
library(kableExtra) #Para crear tablas con formato más avanzado y estilizado
library(tidyr) #Ayuda a transformar y reorganizar los datos
library(RecordLinkage) #Realiza tareas de emparejamiento de registros,
library(leaflet) #Permite crear mapas interactivos con datos geoespaciale
library(htmltools) #Ayuda a generar y manipular contenido HTML
Filtramos todas las observaciones del barrio pance:
# Filtrar el barrio Pance
pos = which(jarowinkler("pance", Datos_Vivienda$Barrio) > 0.98)
datos_sub = Datos_Vivienda[pos,]
head(datos_sub)
## # A tibble: 6 × 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Zona Sur 2 6 880 237 2 5
## 2 Zona Sur 2 6 1300 600 4 7
## 3 Zona Sur 3 6 513 160 2 4
## 4 Zona Sur 6 6 690 150 2 5
## 5 Zona Sur 3 6 550 136 2 4
## 6 Zona Sur 1 6 900 330 2 4
## # ℹ 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
Obtener los nombres de las variables:
library(dplyr)
names(datos_sub)
## [1] "Zona" "piso" "Estrato"
## [4] "precio_millon" "Area_contruida" "parqueaderos"
## [7] "Banos" "Habitaciones" "Tipo"
## [10] "Barrio" "cordenada_longitud" "Cordenada_latitud"
Confirmar el numero de observaciones:
length(pos)
## [1] 409
cantidad_ofertas= length(datos_sub$Zona)
promedio_precio= mean(datos_sub$precio_millon,na.rm=TRUE)
promedio_area= mean(datos_sub$Area_contruida,na.rm =TRUE)
promedio_habitaciones= mean(datos_sub$Habitaciones,na.rm=TRUE)
promedio_banos= mean(datos_sub$Banos,na.rm=TRUE)
resultado_prom=data.frame(cantidad_ofertas,promedio_precio,promedio_area,promedio_habitaciones,promedio_banos)
resultado_prom
## cantidad_ofertas promedio_precio promedio_area promedio_habitaciones
## 1 409 881.8044 275.0059 3.696822
## promedio_banos
## 1 4.466993
Inicialmente, Pance presenta un precio promedio de $881,8 millones y un área construida promedio de 275 m².
promedio_precio=mean(datos_sub$precio_millon,na.rm = TRUE)
mediana_precio=median(datos_sub$precio_millon,na.rm = TRUE)
minimo_precio=min(datos_sub$precio_millon,na.rm = TRUE)
maximo_precio=max(datos_sub$precio_millon,na.rm = TRUE)
desvest_precio=sd(datos_sub$precio_millon,na.rm = TRUE)
indic_precio=data.frame(promedio_precio,mediana_precio,minimo_precio,maximo_precio,desvest_precio)
indic_precio
## promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
## 1 881.8044 780 245 1900 389.5001
Los precios presentan una dispersión considerable: el promedio ($881,8 millones) supera la mediana ($780 millones), lo que sugiere la presencia de viviendas con precios elevados. Además, la desviación estándar de $389,5 millones evidencia una alta variabilidad entre las ofertas.
# Crear y mostrar el histograma interactivo
ggplotly(
ggplot(datos_sub, aes(x=precio_millon)) +
geom_histogram(binwidth=150, fill="steelblue", color="black", alpha=0.6) +
labs(title="Figura 1. Histograma del Precio de Viviendas en Pance",
x="Precio (millones de pesos)",
y="Frecuencia") +
theme_minimal()
)
Interpretación:
Distribución de precios: La mayor concentración de viviendas se encuentra entre los $400 y $1.000 millones, especialmente entre $500 y $700 millones.
Modos y agrupaciones: Se observa un pico principal entre $500 y $700 millones. A partir de los $1.000 millones, la frecuencia disminuye.
Dispersión y rango: Los precios presentan una amplia variabilidad, con valores que van aproximadamente desde $245 hasta $1.900 millones.
Posibles valores atípicos: Las viviendas con precios superiores a $1.500 millones son menos frecuentes y podrían corresponder a propiedades de alto valor.
# Crear y mostrar el histograma interactivo
ggplotly(
ggplot(datos_sub, aes(x=Area_contruida)) +
geom_histogram(binwidth=30, fill="green", color="black", alpha=0.6) +
labs(title="Figura 2. Histograma del Área Construida de Viviendas en Pance",
x="Área construida (m²)",
y="Frecuencia") +
theme_minimal()
)
Distribución del área construida:
La mayoría de las viviendas tienen áreas inferiores a 300 m², con una concentración importante entre 100 y 200 m².
Modos y agrupaciones: Se observa una mayor frecuencia alrededor de los 100 a 200 m². A medida que aumenta el área, disminuye la cantidad de viviendas.
Dispersión y rango: Las áreas presentan una amplia variabilidad, desde aproximadamente 50 hasta 1.500 m².
Posibles valores atípicos: Se identifican algunas viviendas con áreas superiores a 500 m², que son poco frecuentes y podrían corresponder a propiedades de grandes dimensiones.
# Crear y mostrar el boxplot interactivo
ggplotly(
ggplot(datos_sub, aes(y=precio_millon)) +
geom_boxplot(fill="lightblue", color="black", outlier.colour="red", outlier.shape=16, outlier.size=3) +
labs(title="Figura 3. Boxplot del Precio de Viviendas en Pance",
y="Precio (millones de pesos)") +
theme_minimal()
)
Interpretación:
Mediana: El precio mediano se ubica aproximadamente en $780 millones. Dispersión: El 50 % central de las viviendas presenta precios entre aproximadamente $590 y $1.200 millones, lo que evidencia una dispersión considerable.
Rango: Los precios se extienden aproximadamente desde $245 hasta $1.900 millones.
Valores atípicos: No se observan puntos por fuera de los bigotes, por lo que el gráfico no identifica valores atípicos según este criterio.
# Crear y mostrar el boxplot interactivo
ggplotly(
ggplot(datos_sub, aes(y=Area_contruida)) +
geom_boxplot(fill="green", color="black", outlier.colour="red", outlier.shape=16, outlier.size=3) +
labs(title="Figura 4. Boxplot del Área Construida de Viviendas en Pance",
y="Área construida (m²)") +
theme_minimal()
)
Interpretación:
Mediana: El área mediana se encuentra alrededor de los 190 m². Dispersión: El 50 % central de las viviendas tiene áreas aproximadas entre 130 y 350 m².
Rango: Los valores no atípicos se extienden aproximadamente entre 45 y 650 m².
Valores atípicos: Se identifican varias viviendas con áreas superiores a 650 m², alcanzando incluso los 1.500 m². Estos casos representan propiedades de dimensiones considerablemente mayores al resto de la muestra.
# Crear gráfico interactivo con correlación
ggplotly(
ggplot(datos_sub, aes(x = Area_contruida, y = precio_millon)) +
geom_point(color = "purple", alpha = 0.8, size = 2) +
geom_smooth(method = "loess", color = "grey", se = TRUE) +
labs(
title = paste("Figura 5. Relación entre Área Construida y Precio\nCoef. de correlación: ",
round(cor(datos_sub$precio_millon, datos_sub$Area_contruida, use = "complete.obs"), 2)),
x = "Área Construida (m²)",
y = "Precio (Millones)",
caption = "Fuente: Datos de Vivienda"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)
)
)
Interpretación:
El valor de 0,71 indica una relación lineal positiva fuerte entre el área construida y el precio. Esto significa que ambas variables tienden a aumentar conjuntamente.
Hallazgo principal: El área construida presenta una relación importante con el precio de las viviendas; sin embargo, no es el único factor que determina su valor, pues también pueden influir características como la ubicación, los acabados y las condiciones del inmueble.
# Mapa 1
leaflet() %>%
addCircleMarkers(
lng = datos_sub$cordenada_longitud,
lat = datos_sub$Cordenada_latitud,
radius = 1.0,
color = "purple",
label = paste0("Precio: ", datos_sub$precio_millon, " millones")
) %>%
addTiles()
table(datos_sub\(Barrio) summary(datos_sub\)cordenada_longitud) summary(datos_sub$Cordenada_latitud)
Como se observa en el mapa 1, existen algunos puntos alejados de la zona de Pance, al analizar las coordenadas se ve que algunos registros llegan hasta 3.470, una ubicación bastante más al norte que el sector habitual de Pance.
# Identificar las 10 observaciones más al norte
datos_sub[order(datos_sub$Cordenada_latitud, decreasing = TRUE),
c("Barrio", "cordenada_longitud", "Cordenada_latitud")][1:10, ]
## # A tibble: 10 × 3
## Barrio cordenada_longitud Cordenada_latitud
## <chr> <dbl> <dbl>
## 1 pance -76.5 3.47
## 2 pance -76.5 3.47
## 3 pance -76.5 3.47
## 4 pance -76.5 3.46
## 5 pance -76.5 3.46
## 6 pance -76.5 3.46
## 7 pance -76.5 3.46
## 8 pance -76.5 3.45
## 9 pance -76.5 3.45
## 10 pance -76.5 3.45
# Identificar las 10 observaciones más al sur
datos_sub[order(datos_sub$Cordenada_latitud),
c("Barrio", "cordenada_longitud", "Cordenada_latitud")][1:10, ]
## # A tibble: 10 × 3
## Barrio cordenada_longitud Cordenada_latitud
## <chr> <dbl> <dbl>
## 1 pance -76.5 3.33
## 2 pance -76.5 3.33
## 3 pance -76.5 3.33
## 4 pance -76.5 3.33
## 5 pance -76.5 3.33
## 6 pance -76.5 3.33
## 7 pance -76.5 3.33
## 8 pance -76.5 3.33
## 9 pance -76.5 3.33
## 10 pance -76.5 3.33
plot(datos_sub$cordenada_longitud,
datos_sub$Cordenada_latitud,
xlab = "Longitud",
ylab = "Latitud",
main = "Distribución de coordenadas de viviendas en Pance",
col = "purple",
pch = 16)
Aunque los 409 registros tienen el barrio «pance» en la base de datos, sus coordenadas muestran ubicaciones muy dispersas. Esto sugiere posibles inconsistencias en la georreferenciación de algunas viviendas.
Se identificó que las 409 observaciones seleccionadas corresponden al barrio «pance», de acuerdo con la variable Barrio. Sin embargo, al representar sus coordenadas geográficas se observa que algunos registros aparecen alejados de la concentración principal de viviendas. Esta situación evidencia una posible inconsistencia en la georreferenciación de la base de datos original, aunque no es posible determinar su causa únicamente con la información disponible. Para mantener la consistencia metodológica con el procedimiento de filtrado, se decidió conservar las 409 observaciones, sin eliminar ni modificar registros por su ubicación geográfica. Por tanto, el mapa debe interpretarse como una representación de las coordenadas reportadas en la base, teniendo presente esta limitación.
# Mapa 2
leaflet() %>%
addCircleMarkers(
lng = datos_sub$cordenada_longitud,
lat = datos_sub$Cordenada_latitud,
radius = 1,
color = "purple",
label = paste0(
"Precio: ", datos_sub$precio_millon,
", Area: ", datos_sub$Area_contruida,
", Barrio: ", datos_sub$Barrio,
", Lat: ", datos_sub$Cordenada_latitud,
", Long: ", datos_sub$cordenada_longitud
)
) %>%
addTiles()
modsimple=lm(precio_millon~Area_contruida, data=datos_sub)
summary (modsimple)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1086.2 -163.3 -60.4 100.8 934.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 499.16581 23.38332 21.35 <2e-16 ***
## Area_contruida 1.39138 0.06905 20.15 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 275.9 on 407 degrees of freedom
## Multiple R-squared: 0.4994, Adjusted R-squared: 0.4981
## F-statistic: 406 on 1 and 407 DF, p-value: < 2.2e-16
Interpretaciones:
Por cada metro cuadrado adicional de área construida, el precio de la vivienda aumenta, en promedio, $1,39138 millones.
El área construida explica aproximadamente el 49,94 % de la variación del precio de las viviendas de Pance.
Teniendo en cuenta el valor del estadistico F, el modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modsimple)
Interpretación:
Residuos vs valores ajustados: sugiere que podría existir una relación no completamente lineal entre el área construida y el precio. Además, la variabilidad de los errores parece aumentar para las viviendas de mayor precio, lo que constituye una señal de posible heterocedasticidad.
Gráfico Q-Q: os residuos no parecen seguir una distribución normal. Esto sugiere la presencia de valores extremos y una distribución de errores diferente a la normal.
Con el propósito de evaluar si una transformación logarítmica mejora el ajuste del modelo y permite reducir los problemas identificados en la validación de supuestos, se estima una nueva especificación utilizando el logaritmo del área construida.
modsimple2=lm(precio_millon~log(Area_contruida),data = datos_sub)
summary(modsimple2)
##
## Call:
## lm(formula = precio_millon ~ log(Area_contruida), data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -799.68 -118.99 -21.42 68.96 809.18
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2039.76 101.45 -20.11 <2e-16 ***
## log(Area_contruida) 538.44 18.59 28.97 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 222.9 on 407 degrees of freedom
## Multiple R-squared: 0.6734, Adjusted R-squared: 0.6726
## F-statistic: 839.2 on 1 and 407 DF, p-value: < 2.2e-16
Interpretaciones:
Un aumento del 1 % en el área construida se relaciona con un incremento aproximado de $5,3844 millones en el precio de la vivienda.
El coeficiente del logaritmo del área construida es estadísticamente significativo, dado que su valor p es menor que 0.001.
El logaritmo del área construida explica aproximadamente el 67,34 % de la variación del precio de las viviendas. El modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modsimple2)
Interpretación:
Residuos vs valores ajustados: Aunque la transformación logarítmica modificó el comportamiento de los residuos, todavía se observan patrones y una dispersión desigual. Esto sugiere que podrían persistir problemas de especificación y heterocedasticidad.
Gráfico Q-Q: La transformación logarítmica del área construida no logró corregir el problema de normalidad de los errores, ya que persisten desviaciones importantes respecto a la línea teórica.
Conclusión primer modelo: La transformación logarítmica mejoró el ajuste estadístico del modelo, como vimos en el aumento del R² de 49,94 % a 67,34 %. Sin embargo, al revisar las dos primeras gráficas, observamos que no solucionó completamente los problemas identificados en el modelo original
modsimple3=lm(precio_millon~Habitaciones, data=datos_sub)
summary(modsimple3)
##
## Call:
## lm(formula = precio_millon ~ Habitaciones, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -701.4 -243.2 -93.2 196.8 1046.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 199.52 72.81 2.740 0.0064 **
## Habitaciones 184.56 19.12 9.651 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 351.8 on 407 degrees of freedom
## Multiple R-squared: 0.1862, Adjusted R-squared: 0.1842
## F-statistic: 93.14 on 1 and 407 DF, p-value: < 2.2e-16
Interpretación:
Por cada habitación adicional, el precio de la vivienda aumenta, en promedio, $184,56 millones.
El número de habitaciones explica aproximadamente el 18,62 % de la variación del precio de las viviendas.
El modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modsimple3)
Interpretación:
Residuos vs valores ajustados: No se identifica una curvatura marcada que evidencie un problema importante de linealidad. Sin embargo, la dispersión de los residuos sugiere que podría existir heterocedasticidad.
Gráfico Q-Q: Existe evidencia gráfica de que los residuos no siguen perfectamente una distribución normal, por lo que este supuesto podría estar incumpliéndose.
modsimple4=lm(log(precio_millon)~Habitaciones, data=datos_sub)
summary(modsimple4)
##
## Call:
## lm(formula = log(precio_millon) ~ Habitaciones, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.94334 -0.28795 -0.03987 0.25996 1.23404
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.85603 0.07846 74.64 <2e-16 ***
## Habitaciones 0.22536 0.02061 10.94 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3791 on 407 degrees of freedom
## Multiple R-squared: 0.2271, Adjusted R-squared: 0.2252
## F-statistic: 119.6 on 1 and 407 DF, p-value: < 2.2e-16
Interpretación:
Una habitación adicional se relaciona con un incremento aproximado del 22,54 % en el precio de la vivienda.
El número de habitaciones explica aproximadamente el 22,71 % de la variación del logaritmo del precio.
El modelo es estadísticamente significativo en conjunto. La capacidad explicativa del modelo continua siendo muy limitada teniendo en cuenta el R2.
par(mfrow=c(2,2))
plot(modsimple4)
Interpretación:
Residuos vs valores ajustados: La transformación logarítmica del precio parece mejorar el comportamiento de los residuos frente a los valores ajustados. No obstante, todavía se observan algunas desviaciones y observaciones alejadas de cero.
Gráfico Q-Q: Los puntos se aproximan a la línea diagonal en buena parte del gráfico. Sin embargo, se observan desviaciones en los extremos, especialmente en la cola derecha.Algunas observaciones se alejan de la distribución normal teórica.
Conclusión: La transformación logarítmica representa una mejora frente a la especificación original, aunque no corrige completamente los problemas identificados en la validación de supuestos.
modsimple5=lm(precio_millon~Banos, data=datos_sub)
summary(modsimple5)
##
## Call:
## lm(formula = precio_millon ~ Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -611.30 -217.09 -88.49 140.10 1128.52
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 71.48 60.26 1.186 0.236
## Banos 181.40 13.01 13.939 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 320.8 on 407 degrees of freedom
## Multiple R-squared: 0.3231, Adjusted R-squared: 0.3215
## F-statistic: 194.3 on 1 and 407 DF, p-value: < 2.2e-16
Interpretación:
Por cada baño adicional, el precio de la vivienda aumenta, en promedio, $181,40 millones.
El número de baños explica aproximadamente el 32,31 % de la variación del precio de las viviendas.
El modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modsimple5)
Interpretación:
Residuos vs valores ajustados: El patrón de la línea roja sugiere que la relación entre el número de baños y el precio podría no estar completamente representada por una relación lineal. También hay indicios de una posible varianza no constante de los errores.
Gráfico Q-Q: Los residuos no parecen seguir una distribución normal, debido a las desviaciones que presentan frente a la distribución teórica.
modsimple6=lm(log(precio_millon)~Banos, data=datos_sub)
summary(modsimple6)
##
## Call:
## lm(formula = log(precio_millon) ~ Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.82756 -0.24541 -0.04371 0.19662 1.38392
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.70615 0.06331 90.13 <2e-16 ***
## Banos 0.22006 0.01367 16.09 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3371 on 407 degrees of freedom
## Multiple R-squared: 0.3889, Adjusted R-squared: 0.3874
## F-statistic: 259 on 1 and 407 DF, p-value: < 2.2e-16
Interpretación:
Una unidad adicional en el número de baños se relaciona con un incremento aproximado del 22,01 % en el precio.
El número de baños explica aproximadamente el 38,89 % de la variación del logaritmo del precio.
El modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modsimple6)
Interpretación:
Residuos vs valores ajustados: Los residuos se distribuyen alrededor de la línea horizontal de cero. La línea roja presenta algunas variaciones, pero no evidencia una curvatura pronunciada.Se mantienen algunas observaciones alejadas de cero, especialmente las identificadas como 163 y 167.
Gráfico Q-Q: La mayoría de los puntos siguen aproximadamente la línea diagonal en la parte central. Sin embargo, se observan desviaciones en las colas, especialmente en la cola derecha. Las observaciones 163 y 167 se alejan considerablemente de la línea de referencia.
Conclusión: La transformación logarítmica del precio mejora el comportamiento gráfico de los residuos respecto al modelo original, especialmente en la relación entre los residuos y los valores ajustados. Sin embargo, persisten desviaciones respecto a la normalidad en las colas de la distribución y posibles problemas de heterocedasticidad.
Conclusión entre los 3 modelos:
Los resultados de los tres modelos de regresión simple muestran que el área construida, el número de habitaciones y el número de baños presentan una relación positiva y estadísticamente significativa con el precio de las viviendas del barrio Pance. Entre las variables analizadas, el área construida presenta la mayor capacidad explicativa, seguida del número de baños y, finalmente, del número de habitaciones.
Asimismo, en los tres modelos la transformación logarítmica del precio permitió aumentar el coeficiente de determinación R2, lo que sugiere una mejora en su capacidad explicativa. Sin embargo, la validación gráfica evidenció que estas transformaciones no solucionaron completamente los posibles incumplimientos de los supuestos de normalidad y homocedasticidad, ni eliminaron la presencia de observaciones potencialmente influyentes.
Se estima un modelo de regresión lineal múltiple con el propósito de analizar la relación conjunta entre el área construida, el número de habitaciones y el número de baños con el precio de las viviendas del barrio Pance.
# Modelo de regresión lineal múltiple 1
modmult1=lm(precio_millon~Area_contruida+Habitaciones+Banos, data=datos_sub)
summary(modmult1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -856.62 -142.02 -60.06 84.14 902.01
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 163.27516 57.36820 2.846 0.00465 **
## Area_contruida 1.11071 0.07539 14.732 < 2e-16 ***
## Habitaciones -1.90397 18.60466 -0.102 0.91854
## Banos 94.04870 14.32087 6.567 1.58e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 258.1 on 405 degrees of freedom
## Multiple R-squared: 0.5643, Adjusted R-squared: 0.561
## F-statistic: 174.8 on 3 and 405 DF, p-value: < 2.2e-16
Interpretación de los coeficientes:
Área Construida: Manteniendo constantes el número de habitaciones y baños, un metro cuadrado adicional de área construida se relaciona con un aumento promedio de $1,11 millones en el precio. Se considera estadisticamente significativo.
Habitaciones: Manteniendo constantes el área construida y el número de baños, una habitación adicional se relaciona con una disminución estimada de $1,90 millones en el precio. Aunque, no es estadísticamente significativo, porque su valor p es 0.91854, superior a 0.05.
Baños: Manteniendo constantes el área construida y las habitaciones, un baño adicional se relaciona con un aumento promedio de $94,05 millones en el precio.Se considera estadisticamente significativo.
R2 ajustado: El área construida, el número de habitaciones y el número de baños explican conjuntamente aproximadamente el 56,10 % de la variación del precio de las viviendas de Pance.
# Selección de variables mediante Stepwise
modmult1_step=step(modmult1)
## Start: AIC=4546.51
## precio_millon ~ Area_contruida + Habitaciones + Banos
##
## Df Sum of Sq RSS AIC
## - Habitaciones 1 697 26972575 4544.5
## <none> 26971877 4546.5
## - Banos 1 2872254 29844131 4585.9
## - Area_contruida 1 14454054 41425931 4720.0
##
## Step: AIC=4544.52
## precio_millon ~ Area_contruida + Banos
##
## Df Sum of Sq RSS AIC
## <none> 26972575 4544.5
## - Banos 1 4014703 30987277 4599.3
## - Area_contruida 1 14924245 41896820 4722.6
summary(modmult1_step)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -855.74 -141.71 -60.95 81.61 901.94
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 160.19344 48.76990 3.285 0.00111 **
## Area_contruida 1.10929 0.07401 14.988 < 2e-16 ***
## Banos 93.25045 11.99561 7.774 6.33e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 257.7 on 406 degrees of freedom
## Multiple R-squared: 0.5642, Adjusted R-squared: 0.5621
## F-statistic: 262.9 on 2 and 406 DF, p-value: < 2.2e-16
Interpretación:
El procedimiento Step by Step determinó que la variable Habitaciones no era necesaria para la especificación seleccionada, pues su eliminación redujo el AIC de 4546.51 a 4544.52.
Esto es coherente con el resultado inicial: habitaciones tenía un valor p de 0.91854, por lo que no era estadísticamente significativa al controlar por área construida y baños.
par(mfrow=c(2,2))
plot(modmult1_step)
Interpretación:
Residuales vs valores ajustados: El comportamiento de los residuos sugiere que podría existir cierta falta de linealidad en la relación entre las variables explicativas y el precio. Además, se observan patrones de dispersión que pueden indicar heterocedasticidad.
Gráfico Q-Q: Los puntos no siguen completamente la línea diagonal de referencia y se presentan desviaciones importantes en ambas colas de la distribución. Además, algunas observaciones, como la 224, se alejan considerablemente de la línea.
# Modelo múltiple con transformación logarítmica
modmult1_log=lm(log(precio_millon)~Area_contruida+Banos, data=datos_sub)
summary(modmult1_log)
##
## Call:
## lm(formula = log(precio_millon) ~ Area_contruida + Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.84777 -0.17716 -0.03874 0.14130 0.95330
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.798e+00 5.172e-02 112.09 <2e-16 ***
## Area_contruida 1.145e-03 7.849e-05 14.59 <2e-16 ***
## Banos 1.290e-01 1.272e-02 10.14 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2734 on 406 degrees of freedom
## Multiple R-squared: 0.5991, Adjusted R-squared: 0.5972
## F-statistic: 303.4 on 2 and 406 DF, p-value: < 2.2e-16
Interpretación de los coeficientes:
Área construida: Manteniendo constante el número de baños, un metro cuadrado adicional de área construida se relaciona con un incremento aproximado del 0,1145 % en el precio.
Baños: Manteniendo constante el área construida, un baño adicional se relaciona con un incremento aproximado del 12,90 % en el precio.
El área construida y el número de baños explican conjuntamente el 59,72 % de la variabilidad del logaritmo del precio, teniendo en cuenta la cantidad de variables explicativas incluidas.
El modelo es estadísticamente significativo en conjunto.
par(mfrow=c(2,2))
plot(modmult1_log)
Interpretación:
Residuales vs valores ajustados: el supuesto de linealidad presenta indicios de incumplimiento, aunque la transformación permite observar una distribución más centrada alrededor de cero.
Gráfico Q-Q: la transformación logarítmica mejora algunos aspectos del comportamiento de los residuos, pero no logra garantizar el cumplimiento del supuesto de normalidad.
Conclusión: la transformación logarítmica mejora el ajuste del modelo, pero no corrige completamente los problemas identificados en los supuestos de linealidad y normalidad. Por tanto, su aplicación resulta conveniente en términos de capacidad explicativa, aunque persisten algunas limitaciones estadísticas.
# Predicción con el modelo transformado
pred_log = predict(modmult1_log)
# Convertimos las predicciones a la escala original
pred_precio = exp(pred_log)
head(pred_precio)
## 1 2 3 4 5 6
## 824.1885 1616.8642 663.2599 746.0205 645.2762 805.8341
Interpretación: La función predict() permitió obtener los precios estimados de las viviendas a partir del modelo de regresión múltiple con transformación logarítmica. Posteriormente, mediante la función exponencial, se expresaron las predicciones en su escala original, es decir, en millones de pesos. Por ejemplo, para la primera observación, el modelo estimó un precio de aproximadamente $824,19 millones. ## Calcular MAE:
# Calcular el error absoluto medio
MAE_log = mean(abs(datos_sub$precio_millon - pred_precio))
MAE_log
## [1] 199.2522
Interpretación:
La transformación logarítmica permitió mejorar el ajuste del modelo, alcanzando un R² ajustado de 59,72 %. Sin embargo, el MAE de $199,25 millones evidencia que todavía existe una diferencia considerable entre los precios observados y estimados.
table(datos_sub$Tipo)
##
## Apartamento Casa
## 206 203
str(datos_sub$Tipo)
## chr [1:409] "Casa" "Casa" "Casa" "Apartamento" "Apartamento" "Casa" ...
# Convertir Tipo en variable categórica
datos_sub$Tipo = as.factor(datos_sub$Tipo)
# Verificar los niveles de la variable
levels(datos_sub$Tipo)
## [1] "Apartamento" "Casa"
# Modelo de regresión múltiple con variable dummy
modmult2 = lm(precio_millon ~ Area_contruida + Banos + Tipo,
data = datos_sub)
summary(modmult2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Banos + Tipo, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -785.17 -134.03 -47.85 90.25 967.44
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 211.97177 48.80820 4.343 1.78e-05 ***
## Area_contruida 0.91616 0.08303 11.034 < 2e-16 ***
## Banos 76.22542 12.24318 6.226 1.20e-09 ***
## TipoCasa 155.91141 33.16030 4.702 3.54e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 251.3 on 405 degrees of freedom
## Multiple R-squared: 0.5868, Adjusted R-squared: 0.5837
## F-statistic: 191.7 on 3 and 405 DF, p-value: < 2.2e-16
Interpretaciones:
Manteniendo constantes los baños y el tipo de vivienda, un metro cuadrado adicional de área construida incrementa el precio estimado en aproximadamente $0,916 millones.
Manteniendo constantes el área y el tipo de vivienda, un baño adicional incrementa el precio estimado en aproximadamente $76,23 millones.
Manteniendo constantes el área construida y los baños, una casa tiene un precio estimado aproximadamente $155,91 millones superior al de un apartamento.
Los tres coeficientes son estadísticamente significativos al 1 %, dado que sus valores p son inferiores a 0,01.
El modelo explica aproximadamente el 58,37 % de la variabilidad del precio de las viviendas.
Teniendo en cuenta que el valor p es inferior a 0,05, rechazamos la hipótesis nula de que todos los coeficientes de las variables explicativas sean simultáneamente iguales a cero.
par(mfrow=c(2,2))
plot(modmult2)
Interpretaciones:
Residuos vs valores ajustados: los residuos no presentan una distribución completamente aleatoria alrededor de cero, además, la dispersión de los residuos aumenta a medida que crecen los valores ajustados.
Gráfico Q-Q: los residuos presentan desviaciones respecto a la distribución normal, particularmente en la cola superior. Por tanto, el supuesto de normalidad no se cumple completamente.
modmult2_step = step(modmult2)
## Start: AIC=4524.78
## precio_millon ~ Area_contruida + Banos + Tipo
##
## Df Sum of Sq RSS AIC
## <none> 25576511 4524.8
## - Tipo 1 1396064 26972575 4544.5
## - Banos 1 2447921 28024432 4560.2
## - Area_contruida 1 7688607 33265118 4630.3
summary(modmult2_step)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Banos + Tipo, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -785.17 -134.03 -47.85 90.25 967.44
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 211.97177 48.80820 4.343 1.78e-05 ***
## Area_contruida 0.91616 0.08303 11.034 < 2e-16 ***
## Banos 76.22542 12.24318 6.226 1.20e-09 ***
## TipoCasa 155.91141 33.16030 4.702 3.54e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 251.3 on 405 degrees of freedom
## Multiple R-squared: 0.5868, Adjusted R-squared: 0.5837
## F-statistic: 191.7 on 3 and 405 DF, p-value: < 2.2e-16
Interpretación:
El step by step sugiere que el modelo que conserve las tres variables explicativas: área construida, número de baños y tipo de inmueble. Ya que, el menor criterio AIC (4524.78) se obtiene al mantener todas las variables.
# Modelo 2 con transformación logarítmica
modmult2_log = lm(log(precio_millon) ~ Area_contruida + Banos + Tipo,
data = datos_sub)
summary(modmult2_log)
##
## Call:
## lm(formula = log(precio_millon) ~ Area_contruida + Banos + Tipo,
## data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.72290 -0.16176 -0.02751 0.14845 0.90893
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.860e+00 5.133e-02 114.169 < 2e-16 ***
## Area_contruida 9.114e-04 8.732e-05 10.437 < 2e-16 ***
## Banos 1.084e-01 1.288e-02 8.420 6.60e-16 ***
## TipoCasa 1.889e-01 3.487e-02 5.416 1.05e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2643 on 405 degrees of freedom
## Multiple R-squared: 0.6262, Adjusted R-squared: 0.6234
## F-statistic: 226.2 on 3 and 405 DF, p-value: < 2.2e-16
Interpretación:
Manteniendo constantes los baños y el tipo de vivienda, un metro cuadrado adicional incrementa el precio aproximadamente un 0,0911 %.
Manteniendo constantes el área y el tipo de vivienda, un baño adicional incrementa el precio aproximadamente un 11,45 %.
Manteniendo constantes el área y los baños, una casa tiene un precio estimado aproximadamente 20,80 % superior al de un apartamento.
El modelo explica aproximadamente el 62,34 % de la variabilidad del logaritmo del precio de las viviendas, teniendo en cuenta las variables explicativas incluidas.
El modelo es globalmente significativo, por lo que rechazamos la hipótesis nula de que todos los coeficientes de las variables explicativas sean simultáneamente iguales a cero.
par(mfrow=c(2,2))
plot(modmult2_log)
Interpretación:
Residuales vs valores ajustados: aunque los residuos se concentran alrededor de cero, la curvatura de la línea roja sugiere que podría persistir cierta falta de linealidad en el modelo.
Gráfico Q-Q: los residuos no siguen completamente una distribución normal, debido principalmente a las desviaciones observadas en la cola superior.
En conclusión, la transformación logarítmica mejora el ajuste del modelo, pero no corrige completamente las posibles desviaciones de linealidad y normalidad.
# Predicción con el modelo transformado
pred_log2 = predict(modmult2_log)
# Convertir las predicciones a la escala original
pred_precio2 = exp(pred_log2)
# Mostrar las primeras seis predicciones
head(pred_precio2)
## 1 2 3 4 5 6
## 904.5461 1564.1443 756.6059 691.7729 612.8280 883.3999
Interpretación:
Las predicciones indican que, para las características de cada vivienda (área construida, número de baños y tipo de inmueble), el modelo estima precios diferenciados. Por ejemplo, la primera vivienda presenta un precio estimado de $904,55 millones, mientras que la segunda alcanza $1.564,14 millones. Esto refleja las diferencias de precio que el modelo atribuye a las características de las viviendas.
# Calcular el error absoluto medio del modelo 2
MAE_log2 = mean(abs(datos_sub$precio_millon - pred_precio2))
MAE_log2
## [1] 187.9335
Interpretación:
El modelo presenta un error absoluto medio de aproximadamente $187,93 millones, lo que significa que, en promedio, los precios estimados se alejan de los precios reales en esa cantidad. Este resultado representa una mejora frente al primer modelo transformado, cuyo MAE fue de $199,25 millones.
El análisis de las 409 ofertas de vivienda del barrio Pance permitió identificar una relación positiva entre las características de los inmuebles y sus precios. En el análisis exploratorio se evidenció una considerable variabilidad en los precios y las áreas construidas, así como una correlación positiva fuerte entre el área construida y el precio (0,71).
En los modelos de regresión simple, el área construida presentó la mayor capacidad explicativa frente al número de baños y de habitaciones. Asimismo, las transformaciones logarítmicas permitieron mejorar el ajuste de las tres especificaciones, aunque no corrigieron completamente los posibles incumplimientos de los supuestos del modelo.
En cuanto a los modelos de regresión múltiple, se encontró que el área construida y el número de baños son variables relevantes para explicar el precio de las viviendas, mientras que el número de habitaciones no resultó estadísticamente significativo en la primera especificación. Por su parte, la incorporación de la variable dummy Tipo permitió identificar que, manteniendo constantes el área construida y el número de baños, las casas presentan precios estimados superiores a los apartamentos.
Finalmente, al comparar los dos modelos múltiples transformados logarítmicamente, el segundo modelo, que incorpora la variable Tipo, presentó el mejor desempeño: alcanzó un R2 ajustado de 62,34 %, frente al 59,72 % del primer modelo, y un MAE de $187,93 millones, inferior a los $199,25 millones del primero. Por tanto, la inclusión del tipo de vivienda aporta información adicional para explicar las diferencias de precios en Pance.