Objetivo

Aplicar la técnica estadística de regresión lineal múltiple al conjunto de datos de la compañia C&A determinando el grado de influencia de las variables independientes sobre la variable dependiente.

Entendimiento base de datos

La dimensión de la base de datos inicial es de 8322 registros y 13 variables relacionadas con el mercado inmobiliario.

dim(vivienda)
[1] 8322   13

Un resumen inicial de la base de datos es el siguiente:

head(vivienda)
# A tibble: 6 × 13
     id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
  <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
1  1147 Zona O… <NA>        3     250        70            1      3            6
2  1169 Zona O… <NA>        3     320       120            1      2            3
3  1350 Zona O… <NA>        3     350       220            2      2            4
4  5992 Zona S… 02          4     400       280            3      5            3
5  1212 Zona N… 01          5     260        90            1      2            3
6  1724 Zona N… 01          5     240        87            1      3            3
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

En donde se puede validar que efectivamente la base suministrada cuenta con 13 variables, de las cuales 9 son de tipo cuantitativo (id, precio, piso, area construida, parqueadero, baños, habitaciones, latitud y longitud), 4 variables de tipo cualitativo (tipo de vivienda, zona de ubicación, barrio y estrato sociodemográfico). Adicionalmente esta vista nos muestra los 6 primeros valores que toma cada una de estas.

summary(vivienda)
       id           zona               piso              estrato     
 Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
 1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
 Median :4160   Mode  :character   Mode  :character   Median :5.000  
 Mean   :4160                                         Mean   :4.634  
 3rd Qu.:6240                                         3rd Qu.:5.000  
 Max.   :8319                                         Max.   :6.000  
 NA's   :3                                            NA's   :3      
    preciom         areaconst       parqueaderos        banios      
 Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
 1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
 Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
 Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
 3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
 Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
 NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
  habitaciones        tipo              barrio             longitud     
 Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
 1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
 Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
 Mean   : 3.605                                         Mean   :-76.53  
 3rd Qu.: 4.000                                         3rd Qu.:-76.52  
 Max.   :10.000                                         Max.   :-76.46  
 NA's   :3                                              NA's   :3       
    latitud     
 Min.   :3.333  
 1st Qu.:3.381  
 Median :3.416  
 Mean   :3.418  
 3rd Qu.:3.452  
 Max.   :3.498  
 NA's   :3      

Este resumen muestra que:

  • La variable estrato solo va desde 3 hasta 6.
  • Los precios de las viviendas van desde los 58 hasta los 1999 millones de pesos.
  • Las áreas construidas van desde los 30 hasta los 1745 metros cuadrados.
  • Con respecto a los parqueaderos 1605 viviendas indican que no cuentan con estos, aunque unas indican que tienen hasta 10 de estos, lo cual es curioso y hasta un poco irreal.
  • 3 viviendas no cuentan con baños ni habitaciones lo cual no es lógico ya que para ser una vivienda debería tener mínimo uno de cada uno.


Limpieza de la base de datos


Dado que la base cuenta con datos faltantes, en este apartado se analizaran y organizaran usando las técnicas más adecuadas para cada variable.

  • Validación datos faltantes

Para analizar más a fondo la información contenida en la base se evalúa en detalle los faltantes de cada variable.

vivienda_faltantes <- colSums(is.na(vivienda)) %>%   
  as.data.frame() 
vivienda_faltantes
                .
id              3
zona            3
piso         2638
estrato         3
preciom         2
areaconst       3
parqueaderos 1605
banios          3
habitaciones    3
tipo            3
barrio          3
longitud        3
latitud         3

Y efectivamente la base contiene datos faltantes en todas sus variables como se muestra en el resumen anterior, siendo la variable piso y parqueaderos las más afectadas con 2638 y 1605 registros faltantes respectivamente.

  • Imputación de datos
md.pattern(vivienda, rotate.names = TRUE)

     preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
4808       1  1    1       1         1      1            1    1      1        1
1909       1  1    1       1         1      1            1    1      1        1
876        1  1    1       1         1      1            1    1      1        1
726        1  1    1       1         1      1            1    1      1        1
1          1  0    0       0         0      0            0    0      0        0
2          0  0    0       0         0      0            0    0      0        0
           2  3    3       3         3      3            3    3      3        3
     latitud parqueaderos piso     
4808       1            1    1    0
1909       1            1    0    1
876        1            0    1    1
726        1            0    0    2
1          0            0    0   12
2          0            0    0   13
           3         1605 2638 4275

Del gráfico anterior se logra identificar que tres registros no cuentan con la mayoría de los datos, solo uno de estos registros cuenta con la variable preciom y es por esto que se decide eliminar estos tres registros ya que en comparación con la base total es una cantidad muy pequeña, por lo cual esta no se verá afectada. Quedando con una base de 8319 registros.

#Eliminar los registros sin variables
vivienda_sf <- vivienda[!is.na(vivienda$id),]
dim(vivienda_sf)
[1] 8319   13

La variable piso y parqueaderos continuan con valores faltantes, siendo estos del 32% y 19% respectivamente.

vis_miss(vivienda_sf)

Es por esto que se procede a evaluar estas variables y definir la mejor forma de organizarlas.

  • Variable parqueaderos: Los datos faltantes de esta variable se deben a que cuando se recolecto la información se le indico a los propietarios omitir la respuesta en esta variable si la vivienda no contaba con parqueadero. Por tal motivo, en esta variable los datos NA serán reemplazados por cero indicando que estas propiedades no cuentan con parqueadero.
#Completar valores faltantes
vivienda_sf$parqueaderos[is.na(vivienda_sf$parqueaderos)] <- 0
  • Variable piso: Para esta variable no se tiene una explicación del porque se encuentran valores faltantes, por lo que se plantea analizar su comportamiento y realizar una imputación con el indicador de centro que más se ajuste a la necesidad.
barplot(table(vivienda_sf$piso), main = "Distribución de la variable piso", 
        ylab = "Frecuencia", xlab = "Piso",col = "cadetblue", 
        border =par("fg")) 

vivienda_sf$piso <- as.numeric(as.character(vivienda_sf$piso))
summary(vivienda_sf$piso)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  1.000   2.000   3.000   3.771   5.000  12.000    2635 

El gráfico de barras nos muestra que la variable piso tiene una asimetria positiva hacia la derecha como lo muestra su cola. Igualmente el resumen estadistico indica una media de 3.7 y una mediana de 3, por lo que trabajaremos con la mediana ya que es el valor que más se ajusta al tipo de esta variable.

#Completar valores faltantes
vivienda_sf$piso[is.na(vivienda_sf$piso)] <- 3

Con la imputación realizada a estas variables podemos evidenciar que la base de datos ya no tiene datos faltantes, como lo certifica el siguiente mapa de valores faltantes:

gg_miss_var(vivienda_sf)

Otra validación importante es garantizar que no se cuente con registros duplicados en la base ya que esto podria modificar los resultados.

duplicados <- duplicated(vivienda_sf) #identificar registros duplicados
table(duplicados) #Conocer la cantidad de registros duplicados
duplicados
FALSE 
 8319 

La base no cuenta con registros duplicados.

Y por último se procede a eliminar la variable id ya que es un identificador unico, por lo cual no aporta al analisis estadistico y también se eliminaran las variables latitud y longitud dado que no se hará ningun analisis espacial.

vivienda_sf <- vivienda_sf[,!names(vivienda_sf) %in% c("id","longitud","latitud")]

Esto contribuye a reducir la dimensionalidad de la base de datos, quedando con 10 variables.

dim(vivienda_sf)
[1] 8319   10


1. Base con solo ofertas de apartamentos

Se crea una sub-base llamada aptos para filtrar en esta solo los registros que cumplan con la condición de ser tipo = Apartamento y se muestran los 3 primeros registos de este.

aptos <- subset(vivienda_sf, tipo == "Apartamento")
head(aptos, 3)
# A tibble: 3 × 10
  zona     piso estrato preciom areaconst parqueaderos banios habitaciones tipo 
  <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
1 Zona N…     1       5     260        90            1      2            3 Apar…
2 Zona N…     1       5     240        87            1      3            3 Apar…
3 Zona N…     1       4     220        52            2      2            3 Apar…
# ℹ 1 more variable: barrio <chr>

Algunas tablas de frecuencia que comprueban que la sub-base quedo bien establecida:

est_tipo <- table(aptos$estrato, aptos$tipo)
print("Tabla de frecuencia estrato vs tipo")
[1] "Tabla de frecuencia estrato vs tipo"
est_tipo
   
    Apartamento
  3         639
  4        1404
  5        1766
  6        1291
zona_tipo <- table(aptos$zona, aptos$tipo)
print("Tabla de frecuencia zona vs tipo")
[1] "Tabla de frecuencia zona vs tipo"
zona_tipo
              
               Apartamento
  Zona Centro           24
  Zona Norte          1198
  Zona Oeste          1029
  Zona Oriente          62
  Zona Sur            2787
piso_tipo <- table(aptos$piso, aptos$tipo)
print("Tabla de frecuencia piso vs tipo")
[1] "Tabla de frecuencia piso vs tipo"
piso_tipo
    
     Apartamento
  1          430
  2          512
  3         1954
  4          545
  5          564
  6          243
  7          200
  8          211
  9          146
  10         128
  11          84
  12          83


2. Análisis exploratorio de datos

Realizar un análisis exploratorio enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda.

Comenzaremos con el análisis de correlación entre variables cuantitativas especificamente entre el precio del apartamento vs el número de baños y el número de habitaciones.

# Gráfico entre el precio del apartamento vs el número de baños y el número de habitaciones
grafico_bh <- plot_ly()
grafico_bh <- add_trace(grafico_bh, data = aptos, x = ~banios, y = ~preciom, type = 'scatter', mode = 'markers', name = 'Número de baños')
grafico_bh <- add_trace(grafico_bh, data = aptos, x = ~habitaciones, y = ~preciom, type = 'scatter', mode = 'markers', name = 'Número de habitaciones')
grafico_bh <- layout(grafico_bh, title = "Relación entre diferentes variables y el precio",
                            xaxis = list(title = "Valor de la variable"),
                            yaxis = list(title = "Precio (millones)"))
# Mostrar el gráfico
grafico_bh

Como se puede observar el número de habitaciones oscila entre 0 y 9, asi mismo el número de baños va de 0 a 8 con precios desde 58 hasta 1950 millones de pesos. Y según el gráfico se evidencia una pequeña relación entre el número de baños y el precio de los apartamentos, donde a medida que se tienen más baños el precio comienza a aumentar. Y para la variable número de habitaciones no es tan evidente esta relación, aunque evaluaremos la matriz de correlaciones.

Adicionalmente, las variables número de baños y de habitaciones presentan datos extraños como lo es el valor de cero, ya que entendiendo el contexto del análisis no es lógico que una vivienda no cuente con ningún baño o ninguna habitación, esto se debe tener presente para la interpretación de los resultados.

# Gráfico entre precio, area y estrato
grafico_est <- plot_ly(data = aptos, 
                   x = ~areaconst, 
                   y = ~preciom, 
                   color = ~factor(estrato), 
                   type = 'scatter', 
                   mode = 'markers',
                   colors = "Dark2") %>%
  layout(title = "Precio vs Área construida por Estrato",
         xaxis = list(title = "Área construida (m^2)"),
         yaxis = list(title = "Precio (millones)"),
         legend = list(title = list(text = "Estrato")))

# Mostrar el gráfico
grafico_est

En el gráfico anterior se observa que los apartamentos de todos los estratos estan mayormente concentrados entre los 35 y 400 m^2. También se evidencia que son que escasos los apartamentos con más de 500 m^2. Y respecto al precio oscilan en su mayoria entre 58 y 500 millones.

Aqui se evidencia, una relación directa entre el precio y el área construida. En la mayoría de los casos, a medida que el precio aumenta, también lo hace el área construida. Con esto se comprueba que el tamaño de la vivienda es un factor muy importante y un predictor siginificativo en la determinación del precio de la misma. También podemos concluir que entre más alto el estrato del apartamento, también tiende a ser más alto el precio.

# Gráfico distribución de precios por zona
grafico_z <- plot_ly(data = aptos, 
                           x = ~zona, 
                           y = ~preciom, 
                           type = 'box', 
                           color=~zona) %>%
  layout(title = "Distribución de precios por zonas",
         yaxis = list(title = "Precio (millones)"),
         xaxis = list(title = "Zona"),
         showlegend = FALSE)

# Mostrar el gráfico
grafico_z

Ahora comparando las variables precio versus la zona, podemos darnos cuenta que la Zona Oriente y Centro son las que cuentan con el precio más bajo y la Zona Oeste tiene el precio más alto. Por otro lado las medianas de las Zonas Norte y Sur son muy similares entre si.

# Codificar 'zona' como factor
aptos$zona <- as.factor(aptos$zona)
# Ajuste del modelo de regresión
mod_pz <- lm(preciom ~ zona, data = aptos)

# Resumen del modelo
summary(mod_pz)

Call:
lm(formula = preciom ~ zona, data = aptos)

Residuals:
    Min      1Q  Median      3Q     Max 
-582.93 -141.29  -52.29   57.71 1452.71 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)        186.58      50.20   3.717 0.000204 ***
zonaZona Norte      98.58      50.70   1.944 0.051906 .  
zonaZona Oeste     481.34      50.78   9.479  < 2e-16 ***
zonaZona Oriente   -33.99      59.12  -0.575 0.565415    
zonaZona Sur       110.71      50.41   2.196 0.028140 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 245.9 on 5095 degrees of freedom
Multiple R-squared:  0.2776,    Adjusted R-squared:  0.277 
F-statistic: 489.3 on 4 and 5095 DF,  p-value: < 2.2e-16

Al realizar un modelo de regresión simple entre el precio y la zona, nos damos cuenta que la categoria Zona Oeste es la que más significancia tiene por lo cual se utilizara en el modelo de regresión lineal múltiple.

aptos_num <- cor(aptos[c("preciom", "areaconst", "estrato", "banios", "habitaciones")])

# Visualizar la matriz de correlación con plotly
plot_ly(z = aptos_num, colorscale = "Viridis", type = "heatmap", 
        x = colnames(aptos_num), y = colnames(aptos_num)) %>%
  layout(title = "Matriz de Correlación")

Con la matriz de correlaciones verificamos la relación entre el área construida, el número de baños, el estrato y el precio siendo de 82%, 74% y 66% respectivamente. Y la variable que menos relación tiene con el precio es el número de las habitaciones con un 30%.

3. Modelo de regresión lineal múltiple

aptos$D1=as.numeric(aptos$zona=="Zona Oeste")
mod <- lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos + D1, data = aptos)

summary(mod)

Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
    parqueaderos + D1, data = aptos)

Residuals:
     Min       1Q   Median       3Q      Max 
-1749.75   -51.83    -1.10    45.19   983.47 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -184.26484   13.08348  -14.08   <2e-16 ***
areaconst       2.05636    0.04165   49.37   <2e-16 ***
estrato        42.47348    2.65952   15.97   <2e-16 ***
banios         51.61264    2.95121   17.49   <2e-16 ***
habitaciones  -34.01179    3.22812  -10.54   <2e-16 ***
parqueaderos   51.32050    2.89475   17.73   <2e-16 ***
D1             87.95927    5.29621   16.61   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 130.6 on 5093 degrees of freedom
Multiple R-squared:  0.7962,    Adjusted R-squared:  0.796 
F-statistic:  3316 on 6 and 5093 DF,  p-value: < 2.2e-16

Interpretación de los coeficientes

  • Intercepto (Intercept): El estimado del intercepto es de -184.26, esto significa que cuando todas las variables predictores sean cero, el precio estimado de un apartamento es de -$184.26. Este valor es estadisticamente significativo con un valor de p< 2e-16 Esto es una situación que no refleja la realidad, ya que es ilogico que un apartamento tenga un área, estrato, número de baños, habitaciones y parqueaderos igual a cero.

  • Área construida (areaconst): El estimado para el área construida es de 2.05, esto significa que manteniendo todas las demás variables constantes se espera que, por cada metro cuadrado adicional de área construida, el precio del apartamento aumente $2.05 millones. Este valor es razonable, aunque este valor también puede depender de la que zona u obra en la que este construido el apartamento.

  • Estrato (estrato): El estimado para el estrato es de 42.47, esto significa que manteniendo todas las demás variables constantes se espera que, cuando se pasa de un estrato a otro el precio del apartamento aumenta en $42.47 millones.

  • Números de baños (banios): El estimado para el número de baños es de 51.61, esto significa que manteniendo todas las demás variables constantes se espera que, por cada baño adicional el precio del apartamento aumente $51.61 millones.

  • Número de habitaciones (habitaciones): El estimado para el número de habitaciones es de -34.01, esto significa que manteniendo todas las demás variables constantes se espera que, por cada habitación adicional el precio del apartamento disminuya $34.01 millones. Esto es algo ilogico, ya que al tener habitaciones adicionales el precio deberia aumentar más no disminuir como lo indica este coeficiente. Aunque también puede ser razonable que entre mas habitaciones disminuir el precio si el espacio total no aumenta.

  • Número de parqueaderos (parqueaderos): El estimado para el número de parqueaderos es de 51.32, esto significa que manteniendo todas las demás variables constantes se espera que, por cada parqueadero adicional el precio del apartamento aumente $51.32 millones.

  • Zona Oeste (D1): El estimado es de esta zona es de 87.95, esto significa que, manteniendo constantes todas las demás variables del modelo el precio del apartamento en la “Zona Oeste” es, en promedio, $87.96 millones más alto que el precio de la vivienda en las demás zonas.

Algo en común que tienen todos estos coeficientes es que sus valores son estadisticamente significativos con un valor de p< 2e-16

Análisis R2

Este coeficiente de determinación indica la proporción de la varianza en la variable dependiente que es explicada por las variables independientes. En este caso con un 0.7962 (79.62%) podemos afirmar que la variables independientes explican en muy buena proporción la variabilidad de la variable precio, lo que indica que el modelo tiene un buen ajuste.

Aunque tenemos un buen R2, se podria revisar diferentes opciones para mejorar, como eliminar la variable número de habitaciones ya que vimos en la matriz de correlaciones que era la que menos relación tenia con el precio y otra cosa que podriamos hacer es aplicar transformaciones al modelo en todas la variables para ver si su explicación de la variabilidad mejora.

4. Validación de supuestos del modelo

errores <- mod$residuals
ajustados <- mod$fitted.values

1. Relación lineal

#Prueba grafica
plot(ajustados, errores,
    main = "Errores vs Valores ajustados",
    ylab = "Errores",
    xlab = "Valores ajustados")
abline(h = 0, col = "red", lwd=2, lty=2)

El gráfico de errores vs valores ajustados muestra un estilo de embudo aumentando la dispersión de los puntos con respecto a la linea cero a medida que los valores ajustados van aumentando, evidenciando que no están dispersos de manera aleatoria sugiriendo una posible no linealidad.

2. Normalidad: se cumple si los errores siguen una distribución normal

\[ H_0: \text{ Los errores siguen una distribución normal} \\ H_1: \text{ Los errores no siguen una distribución normal} \]

#Prueba grafica
par(mfrow=c(1,2))
hist(errores, main="Histograma de residuales",
    xlab="Residuos", ylab="Frecuencia", col="azure3")
qqnorm(errores, main="QQplot de residuales",
    xlab="Cuantiles teóricos", ylab="Cuantiles de muestra", col="cadetblue2")
qqline(errores, col = "red", lwd=2, lty=2)

#Prueba Estadistica Shapiro Wilk
if (length(errores) > 5000) {
  errores_sample <- sample(errores, 5000)
  shapiro.test(errores_sample)
} else {
  shapiro.test(errores)
}

    Shapiro-Wilk normality test

data:  errores_sample
W = 0.82675, p-value < 2.2e-16

Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por lo cual los errores no siguen una distribución normal, lo cual indica que no esta capturando completamente la estructura de los datos. Esto lo apoya el gráfico qqplot donde todos los puntos no se ajustan a la línea recta (roja) y tienen una curvatura muy pronunciada en la parte superior derecha.

3. Homocedasticidad: se cumple si los errores tiene una varianza constante

\[ H_0: \text{ Los errores tiene varianza constante (Homogeneidad)} \\ H_1: \text{ Los errores no tienen varianza constante (Heterocedasticidad)} \]

plot(ajustados, errores,
    main = "Errores vs Valores ajustados",
    ylab = "Errores",
    xlab = "Valores ajustados")
abline(h = 0, col = "red", lwd=2, lty=2)

#Prueba estadistica Breusch-Pagan
library(lmtest)
bptest(mod)

    studentized Breusch-Pagan test

data:  mod
BP = 1442.4, df = 6, p-value < 2.2e-16

Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por tal motivo hay evidencia de heterocedasticidad, lo que afirma el gráfico mostrando una especie de cono o embudo haciendo evidente la varianza creciente de los errores. La presencia de heterocedasticidad puede afectar la precisión de las estimaciones y los intervalos de confianza del modelo, y puede requerir ajustes adicionales.

4. No Autocorrelación (Independencia)

\[ H_0: \text{ No existe correlación serial entre los residuales} \\ H_1: \text{ Existe correlación serial entre los residuales} \]

#Prueba grafica
plot(aptos$preciom, errores, xlab="Precio", ylab="Residuos",
    main = "Precio vs Residuales", col="coral3")

#Prueba estadística Durbin-Watson:
dwtest(mod)

    Durbin-Watson test

data:  mod
DW = 1.6544, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

Como el p-valor es menor al nivel de significancia 0.05, se concluye que H0 no es cierta por lo cual existe correlación serial entre los residuales del modelo, igualmente en el gráfico se evidencia una dependencia positiva.

5. Ausencia de multicolinealidad

# Cálculo de factores de inflación de la varianza (VIF)
library(car)
vif(mod)
   areaconst      estrato       banios habitaciones parqueaderos           D1 
    2.493726     2.018892     2.971594     1.422506     2.015041     1.349925 

Cuando los valores de VIF son bajos y están por debajo de ciertos umbrales (generalmente 10), indica que no hay multicolinealidad significativa entre esas variables. De esta manera, se puede concluir que no hay preocupaciones relevantes de multicolinealidad en el modelo.

En resumen: El modelo de regresión lineal múltiple planteado no cumple con los supuestos de linealidad, normalidad, homocedasticidad y no autocorrelación. Por lo tanto, no es un modelo valido ni preciso al momento de predecir el precio de los apartamentos en términos de las variables independientes planteadas. Aún es importante resaltar que no presenta multicolinealidad.

5. Estime el modelo con la muestra del 70%

Para lograr esta estimación, primero se dividen los datos en dos subconjuntos (entrenamiento y prueba) de manera aleatoria. Y luego se estima el modelo con el subconjunto de datos de entrenamiento.

Para esto se utilizo la libreria caret.

# Semilla para reproducir
set.seed(50) 

#library(caret)
dividir_datos <- createDataPartition(aptos$preciom, p = 0.7, list = FALSE)

train_data <- aptos[dividir_datos, ]
test_data <- aptos[-dividir_datos, ]

mod70 = lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos + D1, data = train_data)

summary(mod70)

Call:
lm(formula = preciom ~ areaconst + estrato + banios + habitaciones + 
    parqueaderos + D1, data = train_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-1701.40   -52.53    -0.26    45.52   994.55 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -190.03065   15.48218 -12.274  < 2e-16 ***
areaconst       2.00069    0.04949  40.425  < 2e-16 ***
estrato        42.05355    3.17120  13.261  < 2e-16 ***
banios         51.33953    3.55953  14.423  < 2e-16 ***
habitaciones  -30.82108    3.83569  -8.035 1.26e-15 ***
parqueaderos   53.96492    3.55891  15.163  < 2e-16 ***
D1             90.58090    6.35285  14.258  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 131.6 on 3565 degrees of freedom
Multiple R-squared:  0.7948,    Adjusted R-squared:  0.7945 
F-statistic:  2302 on 6 and 3565 DF,  p-value: < 2.2e-16

6. Prediga el modelo con los datos de prueba del 30%

# Hacer predicciones en el conjunto de prueba
prediciones <- predict(mod70, newdata = test_data)

# Evaluar el rendimiento del modelo
resultados <- data.frame(Real = test_data$preciom, Prediccion = prediciones)

# Imprimir los 6 primeros resultados
print("Primeros 6 resultados de las predicciones")
[1] "Primeros 6 resultados de las predicciones"
print(head(resultados))
  Real Prediccion
1  240   309.8174
2  310   432.9957
3  385   344.4538
4  420   491.7727
5  620   471.0479
6  170   175.9380

7. Calcular el error cuadrático medio, el error absoluto medio y el R2

# Calcular métricas de evaluación
mse <- mean((resultados$Real - resultados$Prediccion)^2)
cat("MSE:", mse)
MSE: 16509.06
metricas = postResample(pred = resultados$Prediccion, obs = resultados$Real)
print(metricas)
       RMSE    Rsquared         MAE 
128.4875853   0.7993801  78.4573985 

Error Cuadrático Medio (MSE): El MSE es el promedio de los errores al cuadrado. Este valor muestra que, en promedio, el cuadrado de las diferencias entre los valores reales y los predichos es 16509.06.

Raíz del Error Cuadrático Medio (RMSE): El RMSE es la raíz cuadrada del MSE y está en la misma unidad que la variable dependiente preciom, lo que indica este resultado es que en promedio las predicciones del modelo se encuentran 128.48 millones de distancia al valor real.

Error Absoluto Medio (MAE): El MAE nos dice cuánto se desvían en promedio las predicciones del modelo respecto a los valores reales, lo que nos significa que en promedio el valor predicho se encuentra a 78.45 millones del valor real.

R2 (Rsquared): El R2 indica cuanta varianza en la variable respuesta es explicada por el modelo, en este caso se habla de que el modelo explica un 79.93% de la varianza de los precios de los apartamentos.

En conclusión:

  • Precisión del Modelo: El R2 sugiere que el modelo explica bastante bien la variabilidad en el precio de los apartamentos.

  • Error de Predicción: Aunque el RMSE y el MAE son relativamente bajos, indicando que las predicciones no están demasiado lejos de los valores reales.

Estas métricas muestran que el modelo es razonablemente bueno, pero también pueden sugerir que existe espacio para mejorar si se consideran más variables o se aplica al modelo alguna transformación.