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:

Análisis exploratorio de datos para el barrio Pance:

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

Indicadores de centralidad:

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

Indicadores de centralidad y variabilidad de precio:

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.

Histograma del precio:

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

Histograma del area construida:

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

Boxplot del precio de las viviendas:

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

Boxplot para el área construida:

Crear y mostrar el boxplot interactivo

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

Gráfico de dispersión: precio y área construida:

# 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. Ubicación de las viviendas en Pance:

# 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 observaciones más alejadas 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.

Nota:

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.Ubicación de las viviendas en Pance con información detallada:

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

Regresión lineal simple para el barrio Pance:

Modelo 1:

Se plantea el modelo utilizando como variable explicativa el área construida.

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.

Validación de supuestos modelo 1:

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.

Transformación logarítmica:

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.

Validación de supuestos:

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

Modelo 2:

Se plantea nuevamente el modelo, utilizando como variable explicativa las habitaciones.

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.

Validación de supuestos modelo 2:

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.

Transformación logarítmica:

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.

Validación de supuestos:

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.

Modelo 3:

Se plantea nuevamente el modelo, utilizando como variable explicativa el número de baños.

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.

Validación de supuestos:

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.

Transformación logarítmica

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.

Validación de supuestos:

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.

Punto 2:

Modelo 1:

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.

Step by Step:

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

Validación de supuestos:

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.

Transformación logaritmica:

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

Validación de supuestos del modelo transformado:

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 que contiene logaritmo:

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

Modelo 2:

table(datos_sub$Tipo)
## 
## Apartamento        Casa 
##         206         203
str(datos_sub$Tipo)
##  chr [1:409] "Casa" "Casa" "Casa" "Apartamento" "Apartamento" "Casa" ...

Convertir la variable tipo en una variable factor:

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

Definir modelo 2:

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

Validación de supuestos:

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.

Step by Step:

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.

Transformación logarítmica:

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

Validación de supuestos del modelo transformado:

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 del modelo 2:

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

MAE segundo modelo:

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

Conclusión general:

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.