Agencia “Casas y Apartamentos de Cali S.A”

El propósito general del problema es poder realizar un análisis de datos de viviendas para la agencia de bienes raíces, respondiendo a la asesoría de compra de dos viviendas para poder ubicar a dos familias

Se procede a realizar el importe de la base de datos del casod e negocio de María con el importe de la librería paqueteMODELOS la cual permitirá identificar los datos y realizar análisis. Observemos las primeras observaciones del conujnto de datos:

library(paqueteMODELOS)
data("vivienda")
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>

Descripción del conjunto de datos

La base de datos consta de 8322 registros de viviendas de Cali, se caracterizan en las siguientes 13 variables:

  • Zona: Indica la ubicación de la vivienda, como “Zona Centro”, “Zona Norte”, “Zona Oeste”, “Zona Oriente”, “Zona Sur”. Ayuda a los clientes a tener una idea general de la dirección en la que se encuentra la propiedad.

  • Piso: El piso en el que se encuentra la vivienda. Representa la altura relativa de la propiedad en un edificio. Puede ser útil para aquellos que prefieren ciertas alturas o tienen restricciones de movilidad.

  • Estrato: Clasificación socioeconómica de la zona en la que se encuentra la vivienda. Puede influir en el valor de la propiedad y en los costos asociados, como los servicios públicos.

  • Preciom: Precio de la vivienda en moneda local. Es uno de los aspectos más críticos para los compradores y vendedores, ya que determina la inversión requerida.

  • Áreaconst: La superficie construida de la vivienda en metros cuadrados. Ayuda a los compradores a entender el espacio disponible y a comparar con sus necesidades.

  • Parqueaderos: Número de espacios de estacionamiento disponibles con la vivienda. Esto es importante para aquellos que tienen vehículos y requieren estacionamiento seguro.

  • Baños: Cantidad de baños completos en la vivienda. Ayuda a los compradores a evaluar la comodidad y la funcionalidad de la propiedad.

  • Habitaciones: Número de habitaciones disponibles en la vivienda. Influye en la capacidad de alojar a una familia y a las visitas.

  • Tipo: Clasificación del tipo de vivienda, como “apartamento”, “casa”. Define el estilo y la disposición básica de la propiedad.

  • Barrio: Esta variable especifica el barrio donde se encuentra ubicado el predio o vivienda.

  • Longitud: Coordenada geográfica de las viviendas en Cali.

  • Latitud: Coordenada geográfica de las viviendas en Cali.

Observemos algunas características descriptivas del conjunto de datos:

head(vivienda, n=3)
## # A tibble: 3 × 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 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
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

En la anterior salida, se observan los 3 primeros datos de 8322 que está compuesto el conjunto de datos, se logra visualizar como está estructurada la información. Adicionalmente se observa una salida que muestra algunas caracterísitas descriptivas más importantes. Existen variables de tipo categórico como es el caso de zona, piso, tipo, barrio, las demás son de tipo numérico y entero.

Observese el la siguiente salida una vista geográfica del conjunto de datos:

vivienda<-as.data.frame(vivienda)

##Análisis por latitudes y longitudes
require(dplyr)
vivienda_geo<-vivienda%>%filter(latitud!="null" | longitud!="null")#%>%select(Latitude,Longitude)
vivienda_geo$longitud <- as.numeric(vivienda_geo$longitud)
vivienda_geo$latitud <- as.numeric(vivienda_geo$latitud)
library(leaflet)
library(htmlwidgets)

map_vivienda <- vivienda_geo %>% 
  leaflet() %>% 
  addTiles() %>% 
  addMarkers(lat = ~latitud, lng = ~longitud, clusterOptions = markerClusterOptions())
map_vivienda

Del conjunto de datos total se puede identificar donde se encuentran las viviendas ubicadas en la ciudad de Cali. En esta gráfica se puede identificar que las viviendas usualmente se ubican en la zona sur, zona centro y zona norte. Observese la cantidad de predios por zona:

require(dplyr)
vivienda[c("zona")] %>% group_by(zona) %>% 
  summarise( n = n())
## # A tibble: 6 × 2
##   zona             n
##   <chr>        <int>
## 1 Zona Centro    124
## 2 Zona Norte    1920
## 3 Zona Oeste    1198
## 4 Zona Oriente   351
## 5 Zona Sur      4726
## 6 <NA>             3

En la anterior salida, se logra observar que existen datos faltantes en la variable zona, lo cual permite hacer un análisis mucho más detallado con respecto al conjunto de datos faltantes de todo el conjunto de datos.

library(mice)
colSums(is.na(vivienda))
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3

Se observa que todas las variables tienen valores faltantes, específicamente piso y parqueadero tienen la mayor proporción con 2638 y 1605 respectivamente

library(visdat) # visualización de datos
library(naniar)
vis_miss(vivienda ,sort_miss = TRUE)

La anterior gráfica permite visualizar los datos faltantes según la proporción de forma descendiente, permite identificar como se encuentra la informración y da miras a tomar desiciones en referencia a que procedimiento realizar para imputar. No obstante, filtremos la información necesaria para el análsis.

1.1 Filtrando viviendas de la zona Norte

Con la finalidad de hacer un análisis más detallado sobre los requerimientos del caso de negocio, se procede a filtrar las viviendas de tipo casa y que se encuentran en zona norte

#Llamando y filtrando la base de datos
require(dplyr)
base1 <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Norte")

head(base1, n=3)
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1209 Zona Norte   02       5     320       150            2      4
## 2 1592 Zona Norte   02       5     780       380            2      3
## 3 4057 Zona Norte   02       6     750       445           NA      7
##   habitaciones tipo barrio  longitud latitud
## 1            6 Casa  acopi -76.51341 3.47968
## 2            3 Casa  acopi -76.51674 3.48721
## 3            6 Casa  acopi -76.52950 3.38527
dim(base1)
## [1] 722  13

El nuevo conjunto de datos filtrado corresponde a 722 viviendas. Observemos cómo esta el conjunto de datos en términos de ubicación geográfica con los nuevos filtros realizados:

library(leaflet)
library(htmlwidgets)

map_base1 <- base1 %>% 
  leaflet() %>% 
  addTiles() %>% 
  addMarkers(lat = ~latitud, lng = ~longitud, clusterOptions = markerClusterOptions())
map_base1

Al observar el mapa de viviendas en cali para el caso de negocio de Maria, se puede establecer que podrían existir varios factores que pueden estar contribuyendo a que las viviendas se ubiquen en diferentes zonas dado que se graficó viviendas cuyo campo de zona es “Zona Norte”, estas discrepancias pueden ser debidas a:

  • Errores de entrada de datos: Es posible que se hayan introducido incorrectamente las coordenadas de latitud y longitud en la base de datos. Incluso un pequeño error en estas coordenadas puede hacer que las viviendas aparezcan en ubicaciones incorrectas en un mapa

  • Errores en la definición de “zona norte”: Asegúrate de que la definición de “zona norte” en tu filtro sea coherente con la distribución geográfica real de las viviendas en esa área. Si la definición no coincide con la ubicación real de las viviendas, podrías estar excluyendo viviendas que deberían estar en la zona norte o incluyendo viviendas que no deberían estar.

  • Falta de datos precisos de dirección: Si la base de datos no contiene direcciones geográficas precisas o si las direcciones están incompletas o incorrectas, esto podría afectar la capacidad de filtrar correctamente las viviendas por ubicación.

  • Problemas de geolocalización por software: Dependiendo de cómo se hayan asignado las coordenadas geográficas a las direcciones en la base de datos, podría haber problemas de precisión en la geolocalización. Algunas viviendas podrían estar asignadas incorrectamente a coordenadas geográficas erróneas.

1.2 Análisis exploratorio

Para poder determinar una caracterización sobre el conjunto de datos, se procede como primera medida en observar las variables preciom, areaconst, estrato, banios, habitaciones de forma conjunta. Para esto se realiza la siguiente salida donde muestra un correlograma del conjunto de datos:

library(plotly)
library(GGally)
p <- ggpairs(base1[c("preciom","areaconst", "estrato", "banios", "habitaciones", "zona")], title="correlogram with ggpairs()") 
ggplotly(p)

Considerando que el conjunto de datos hace referencia a casas ubicadas en la zona Norte, se logra observar las correlaciones entre pares de variables, de las cuales se identifica una alta correlación positiva de 0.7 para las varibles (preciom, areaconst), una correlación de 0.6 para las varibles (preciom, estrato). Observemos las siguientes gráficas del precio de las viviendas en función del area construída, estrato, baños y el número de habitaciones.

Análisis por Area Construída

Cuando tenemos una opción de compra de vivienda, unO de los aspectos más importantes a la hora de generar nuestra inversión a largo plazo es el area construída. Sabemos de atemano que esta variable metros cuadrados construídos es determinante en el precio de un inmueble. Nuestra perspectiva indicaría que entre mayor espacio construído, más costoso debe ser una vivienda, observemos el siguiente gráfico:

fig0 <- plot_ly(base1, x = ~areaconst, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>% layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el área construída (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig0

La nube de puntos del scatter plot, evidentemente muestra una correlación positiva en el conjunto de datos, permitiendo concluír que las variables precio y area construída son directamente proporcionales, esto significa que entre mayor sea el área construída, mayor será el precio de la vivienda. Adicionalmente, la incusión del Estrato permite concluír que:

  • Los agrupamientos por color, identifican al grupo de casas azules en el extremo inferior izquierdo, lo cual significa que las viviendas de estrato 3 son las que menor tienen area construída y evidentemente cuestan menos. Existen viviendas con precios muy altos considerado outlier.(para mejor análisis ver la gráfica boxplot del análisis por Estrato)

Los agrupamientos por color naranja, identifican al grupo de casas de estrato socioeconómico 4. Este tipo de viviendas tienden a agruparse en area construída baja y precios un poco mayores. En este grupo de viviendas se identifican 4 predios que tienen un precio superior a 900 millones de pesos, estas viviendas se consideran atipicas.(Ver la gráfica boxplot del análisis por Estrato para un mejor análisis)

Los agrupamientos por color verde y rojo, identifican al grupo de casas de estrato socioeconómico 5 y 6 respectivamente. Este tipo de viviendas tienden a agruparse en area construída alta y precios altos. en el estrato 5 se encuentra el 37% y en las viviendas estrato 6 el 7.6% del cunjunto de 722 viviendas (Ver gráfica de cantidad de viviendas por estrato, del próximo subtítulo). En este grupo de viviendas se identifica el predio más costoso y corresponde al estrato 5, las casas que tienen un precio superior a 1400 millones de pesos en el estrato 6 se consideran atipicas.(Ver la gráfica boxplot del análisis por Estrato para un mejor análisis)

Análisis por Estrato

#Gráfica estrato
df2 <- base1 %>% group_by(estrato) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p <-ggplot(df2, aes(x = estrato, y=Cantidad, fill=estrato) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR ESTRATO")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p)

En la gráfica anterior se logra observar la proporción de estratos que caracteriza al conjunto de viviendas (casas ubicadas en la zona norte), de esta representación gráfica se observa que:

  • El 37.5% de las viviendas pertenece al estrato 5 y es este estrato donde se evidencia el mayor número de vivinedas con 271.
  • El 32.5% de las viviendas son del estrato 3 con un equivalente de 235 casas.
  • El estrato 6 es el nivel socioeconómico menos usual en este tipo de viviendas, corresponde a una poblacion de viviendas del 7.6%.
p7 <- plot_ly(
  data = base1,
  x = ~estrato,
  y = ~preciom,
  color = ~factor(estrato),
  text = ~estrato,
  type = "box",
  mode = "markers") %>%
  layout(legend=list(title=list(text='Estrato')), title = "PRECIO DE LAS VIVIENDAS SEGÚN EL ESTRATO",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
p7

En la gráfica anterior se logra identificar el precio de las viviendas en función del estrato socioeconómico. Estableciéndose efectivamente que entre mayor estrato mayor precio, se pueden identificar algunas viviendas atípicas en el conjunto de datos especialmente para el estrato 5 donde se encuentra la vivienda más costosa con un valor de 1949 millones de pesos, para el estrato 4 las viviendas que sobrepasan los 900 millones de pesos se consideran atipicas (en este caso 4 viviendas) y en el estrato 3 se tiene que las viviendas que superren los 500 millones son costosas para este grupo de viviendas.

Analicemos el precio de las viviendas en función al número de baños

Análisis por #baños

#Gráfica banios
df3 <- base1 %>% group_by(banios) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p3 <-ggplot(df3, aes(x = banios, y=Cantidad, fill=banios) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR BAÑOS")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p3)

Para el caso de la variable baños, la cual indica la cantidad respectiva en cada casa ubicada en zona norte se logra identificar que para estas 722 viviendas:

  • El 25.9% que corresponde a 187 tienen 3 baños, este se convierte en la cantidad de baños más usual en el conjunto de casas ubicadas en zona norte.

  • La segunda cantidad de baños más usual es 4, el cual corresponde a 171 casas y con respecto a las 722 viviendas hace referencia al 23.1%.

  • El caso de viviendas con 2 baños también es muy frecuente, del conjunto de casas de la zona norte se puede afirmar que con el 22.9% , esta cantidad de baños se convierte en la tercera opción más frecuente.

fig1 <- plot_ly(base1, x = ~banios, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>%
  layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el número de baños (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig1

Al observar la anterior gráfica se puede identificar el precio de las 722 viviendas con respecto al número de baños. Para hacer un análisis mucho más preciso uso la variable estrato para identificar más características alusivas a este tipo de viviendas tipo casa de la zona norte:

Evidentemente entre mayor sea el número de baños, se espera que el precio de las viviendas aumente

Análisis por #Habitaciones

La cantidad de habitaciones, igualmente es un aspecto escencial al momento de compra de vivienda, se ha convertido en una de las más importantes y que más influye en el precio. Observemos el siguiente gráfico:

#Gráfica habitaciones
df4 <- base1 %>% group_by(habitaciones) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p4 <-ggplot(df4, aes(x = habitaciones , y=Cantidad, fill=habitaciones ) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR HABITACIONES")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p4)

En el conjunto de viviendas se observan casas que tienen hasta 10 habitaciones, no obstante se identifican viviendas con 0 habtaciones, esto podría ser el caso de apartaestudios. Esta variable es un poco diferente a las demás comentadas, dado que solamnet para el caso de viviendas con 10 habitaciones cumple nuestra perspectiva de más costosas, No obstante, con las demás cantidades de habitaciones es muy diferente.

  • Existen 222 casas con 4 habitaciones, 171 con 3 habitaciones y 137 con 4 habitaciones que corresponden al 30.7%, 23.7% y el 19% respectivamente, esta es una de las características de este tipo de viviendas ubicadas en la zona norte.

  • De forma global, los predios más atipicos del cunjunto de datos son viviendas de estrato 4 que tienen 0, 8 y 10 habitaciones lo cual es muy extraño para este tipo de estrato 4. Sus precios se encuentran entre 1200 a 1800 millones de pesos.

fig2 <- plot_ly(base1, x = ~habitaciones, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>%
  layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el número de baños (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig2

1.3 Modelo de Regresión

Se desea establecer un modelo de regresión múltiple con las variables preciom, area construida, estrato, habitaciones, baños, parqueaderos

Se propone analizar los datos usando modelos en los que se asume:

  • preciom: \(Y_k\) –> La respuesta es el precio de las viviendas en millones de pesos.
  • areaconst : \(x_{k2}\) –> Area construída de la k-esima vivienda (en metros cuadrados).
  • estrato: \(x_{k3}\) –> El estrato de la k-ésima vivienda.
  • habitaciones: \(x_{k4}\) –> Cantidad de habitaciones en la k-ésima vivienda.
  • baños: \(x_{k5}\) –> Cantidad de baños en la k-ésima vivienda.
  • parqueaderos: \(x_{k6}\) –> Cantidad de parqueaderos en la k-ésima vivienda.

\[\begin{equation*} \left\{ \begin{array}{ll} Y_k = \mu_k + \epsilon_k\\ \mu_k=\beta_1 + \beta_2 x_{k2} + \beta_3 x_{k3} + \beta_4 x_{k2} + \beta_5 x_{k2} x_{k3} + \beta_6 x_{k2} x_{k4} + \beta_7 x_{k3} x_{k4}+ \beta_8 x_{k2} x_{k3} x_{k4} + ... + \beta_p x_{k2} x_{k3} x_{k4} x_{k5} x_{k6}\\ \epsilon_k \overset{\text{iid}}{\sim} Normal(0, \sigma^2) \end{array} \right. \end{equation*}\]

Para poder realizar el modelo de regresión, se usa la funcion lm la cual permite encontrar la estimación de los parámetros de regresión de un modelo de regresión lineal. Como primer paso involucro el modelo saturado de variables (es decír aquel que es combinacion de todas las variables, con efectos entre variables), todo lo anterior para poder identificar que posibles interacciones puedes ser significativas en el modelo. (ver siguiente salida)

basemod <- base1[c("preciom", "areaconst","estrato", "habitaciones", "banios","parqueaderos")]
basemod <- na.omit(basemod)
basemod$estrato<-factor(basemod$estrato)
basemod2<-within(basemod,{estrato <-factor(estrato, levels=c(3,4,5,6))}) 

fit1<-lm(preciom  ~ areaconst*estrato*banios*parqueaderos*habitaciones, 
         data=basemod2 )
summary(fit1)
## 
## Call:
## lm(formula = preciom ~ areaconst * estrato * banios * parqueaderos * 
##     habitaciones, data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -412.53  -59.78   -8.73   46.59  885.79 
## 
## Coefficients:
##                                                       Estimate Std. Error
## (Intercept)                                          1.897e+02  7.813e+02
## areaconst                                           -7.389e-01  3.974e+00
## estrato4                                             1.272e+03  1.303e+03
## estrato5                                             3.156e+01  9.728e+02
## estrato6                                             7.486e+03  5.000e+03
## banios                                              -1.710e+02  2.783e+02
## parqueaderos                                        -1.004e+02  5.529e+02
## habitaciones                                         2.330e+01  1.970e+02
## areaconst:estrato4                                  -3.165e+00  5.327e+00
## areaconst:estrato5                                   1.030e+00  4.326e+00
## areaconst:estrato6                                  -1.858e+01  1.648e+01
## areaconst:banios                                     1.122e+00  1.493e+00
## estrato4:banios                                     -2.332e+02  3.936e+02
## estrato5:banios                                      2.154e+02  3.065e+02
## estrato6:banios                                     -8.921e+02  7.094e+02
## areaconst:parqueaderos                               6.932e-01  2.282e+00
## estrato4:parqueaderos                               -3.645e+02  6.959e+02
## estrato5:parqueaderos                               -1.436e+02  5.819e+02
## estrato6:parqueaderos                               -4.048e+03  3.020e+03
## banios:parqueaderos                                  1.497e+02  1.988e+02
## areaconst:habitaciones                               6.313e-02  8.710e-01
## estrato4:habitaciones                               -2.937e+02  3.261e+02
## estrato5:habitaciones                               -3.014e+01  2.390e+02
## estrato6:habitaciones                               -1.961e+03  8.998e+02
## banios:habitaciones                                  2.132e+01  5.296e+01
## parqueaderos:habitaciones                           -1.291e+01  1.418e+02
## areaconst:estrato4:banios                            4.023e-01  1.770e+00
## areaconst:estrato5:banios                           -1.099e+00  1.528e+00
## areaconst:estrato6:banios                            1.321e+00  2.089e+00
## areaconst:estrato4:parqueaderos                      9.071e-01  2.651e+00
## areaconst:estrato5:parqueaderos                      4.399e-01  2.357e+00
## areaconst:estrato6:parqueaderos                      8.973e+00  9.327e+00
## areaconst:banios:parqueaderos                       -7.808e-01  9.032e-01
## estrato4:banios:parqueaderos                        -1.039e+01  2.208e+02
## estrato5:banios:parqueaderos                        -8.530e+01  2.027e+02
## estrato6:banios:parqueaderos                         4.234e+02  3.853e+02
## areaconst:estrato4:habitaciones                      8.029e-01  1.224e+00
## areaconst:estrato5:habitaciones                      4.433e-03  9.564e-01
## areaconst:estrato6:habitaciones                      5.147e+00  3.091e+00
## areaconst:banios:habitaciones                       -1.407e-01  2.354e-01
## estrato4:banios:habitaciones                         6.556e+01  7.918e+01
## estrato5:banios:habitaciones                        -3.244e+01  5.925e+01
## estrato6:banios:habitaciones                         3.140e+02  1.526e+02
## areaconst:parqueaderos:habitaciones                  3.784e-02  5.537e-01
## estrato4:parqueaderos:habitaciones                   9.178e+01  1.713e+02
## estrato5:parqueaderos:habitaciones                   3.873e+01  1.469e+02
## estrato6:parqueaderos:habitaciones                   1.054e+03  5.722e+02
## banios:parqueaderos:habitaciones                    -1.584e+01  3.439e+01
## areaconst:estrato4:banios:parqueaderos               2.950e-01  9.580e-01
## areaconst:estrato5:banios:parqueaderos               5.102e-01  9.103e-01
## areaconst:estrato6:banios:parqueaderos              -2.163e-01  1.305e+00
## areaconst:estrato4:banios:habitaciones              -1.501e-01  2.999e-01
## areaconst:estrato5:banios:habitaciones               1.584e-01  2.452e-01
## areaconst:estrato6:banios:habitaciones              -6.540e-01  3.439e-01
## areaconst:estrato4:parqueaderos:habitaciones        -2.782e-01  6.320e-01
## areaconst:estrato5:parqueaderos:habitaciones        -1.697e-01  5.658e-01
## areaconst:estrato6:parqueaderos:habitaciones        -2.568e+00  1.804e+00
## areaconst:banios:parqueaderos:habitaciones           8.323e-02  1.338e-01
## estrato4:banios:parqueaderos:habitaciones           -8.362e+00  3.863e+01
## estrato5:banios:parqueaderos:habitaciones            1.045e+01  3.515e+01
## estrato6:banios:parqueaderos:habitaciones           -1.466e+02  6.614e+01
## areaconst:estrato4:banios:parqueaderos:habitaciones -4.092e-03  1.444e-01
## areaconst:estrato5:banios:parqueaderos:habitaciones -5.469e-02  1.354e-01
## areaconst:estrato6:banios:parqueaderos:habitaciones  2.565e-01  2.012e-01
##                                                     t value Pr(>|t|)  
## (Intercept)                                           0.243   0.8083  
## areaconst                                            -0.186   0.8526  
## estrato4                                              0.976   0.3297  
## estrato5                                              0.032   0.9741  
## estrato6                                              1.497   0.1352  
## banios                                               -0.615   0.5393  
## parqueaderos                                         -0.182   0.8560  
## habitaciones                                          0.118   0.9059  
## areaconst:estrato4                                   -0.594   0.5528  
## areaconst:estrato5                                    0.238   0.8120  
## areaconst:estrato6                                   -1.127   0.2604  
## areaconst:banios                                      0.751   0.4529  
## estrato4:banios                                      -0.592   0.5539  
## estrato5:banios                                       0.703   0.4827  
## estrato6:banios                                      -1.258   0.2093  
## areaconst:parqueaderos                                0.304   0.7615  
## estrato4:parqueaderos                                -0.524   0.6008  
## estrato5:parqueaderos                                -0.247   0.8052  
## estrato6:parqueaderos                                -1.340   0.1809  
## banios:parqueaderos                                   0.753   0.4521  
## areaconst:habitaciones                                0.072   0.9423  
## estrato4:habitaciones                                -0.901   0.3684  
## estrato5:habitaciones                                -0.126   0.8997  
## estrato6:habitaciones                                -2.179   0.0299 *
## banios:habitaciones                                   0.403   0.6874  
## parqueaderos:habitaciones                            -0.091   0.9275  
## areaconst:estrato4:banios                             0.227   0.8204  
## areaconst:estrato5:banios                            -0.720   0.4722  
## areaconst:estrato6:banios                             0.632   0.5275  
## areaconst:estrato4:parqueaderos                       0.342   0.7324  
## areaconst:estrato5:parqueaderos                       0.187   0.8521  
## areaconst:estrato6:parqueaderos                       0.962   0.3366  
## areaconst:banios:parqueaderos                        -0.864   0.3879  
## estrato4:banios:parqueaderos                         -0.047   0.9625  
## estrato5:banios:parqueaderos                         -0.421   0.6741  
## estrato6:banios:parqueaderos                          1.099   0.2726  
## areaconst:estrato4:habitaciones                       0.656   0.5121  
## areaconst:estrato5:habitaciones                       0.005   0.9963  
## areaconst:estrato6:habitaciones                       1.665   0.0967 .
## areaconst:banios:habitaciones                        -0.598   0.5504  
## estrato4:banios:habitaciones                          0.828   0.4082  
## estrato5:banios:habitaciones                         -0.548   0.5843  
## estrato6:banios:habitaciones                          2.057   0.0403 *
## areaconst:parqueaderos:habitaciones                   0.068   0.9456  
## estrato4:parqueaderos:habitaciones                    0.536   0.5924  
## estrato5:parqueaderos:habitaciones                    0.264   0.7922  
## estrato6:parqueaderos:habitaciones                    1.842   0.0662 .
## banios:parqueaderos:habitaciones                     -0.461   0.6453  
## areaconst:estrato4:banios:parqueaderos                0.308   0.7583  
## areaconst:estrato5:banios:parqueaderos                0.560   0.5755  
## areaconst:estrato6:banios:parqueaderos               -0.166   0.8685  
## areaconst:estrato4:banios:habitaciones               -0.500   0.6171  
## areaconst:estrato5:banios:habitaciones                0.646   0.5186  
## areaconst:estrato6:banios:habitaciones               -1.901   0.0580 .
## areaconst:estrato4:parqueaderos:habitaciones         -0.440   0.6601  
## areaconst:estrato5:parqueaderos:habitaciones         -0.300   0.7643  
## areaconst:estrato6:parqueaderos:habitaciones         -1.423   0.1556  
## areaconst:banios:parqueaderos:habitaciones            0.622   0.5343  
## estrato4:banios:parqueaderos:habitaciones            -0.216   0.8288  
## estrato5:banios:parqueaderos:habitaciones             0.297   0.7663  
## estrato6:banios:parqueaderos:habitaciones            -2.216   0.0273 *
## areaconst:estrato4:banios:parqueaderos:habitaciones  -0.028   0.9774  
## areaconst:estrato5:banios:parqueaderos:habitaciones  -0.404   0.6864  
## areaconst:estrato6:banios:parqueaderos:habitaciones   1.275   0.2030  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 136.1 on 371 degrees of freedom
## Multiple R-squared:  0.7364, Adjusted R-squared:  0.6916 
## F-statistic: 16.45 on 63 and 371 DF,  p-value: < 2.2e-16

En la anterior salida, se observa la estimación de los parámetros de un modelo de regresión saturado, según el p-valor se puede establecer que según la evidencia de los datos las variables en este modelo de regresión la mayoría de sus efectos no son significativos (caso contrario con los efectos estrato6:habitaciones , estrato6:banios:parqueaderos:habitaciones ). En consecuencia se propone realizar un modelo simple sin interacciones e ir involucrando el procedimiento stepwise paso a paso para identificar las variables significativas de un modelo de regresión. (véase la sigueinte salida):

fit1<-lm(preciom  ~ areaconst+estrato+banios+parqueaderos+ habitaciones, data=basemod2 )
summary(fit1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos + 
##     habitaciones, data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -790.71  -74.72  -18.93   46.54  991.70 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   11.71883   27.15751   0.432  0.66631    
## areaconst      0.68098    0.05283  12.890  < 2e-16 ***
## estrato4      80.91006   24.55085   3.296  0.00106 ** 
## estrato5     147.53872   22.70871   6.497 2.29e-10 ***
## estrato6     281.68942   37.33161   7.546 2.74e-13 ***
## banios        18.09024    7.62857   2.371  0.01816 *  
## parqueaderos  24.22922    5.86635   4.130 4.36e-05 ***
## habitaciones   7.17906    5.69802   1.260  0.20839    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 154.9 on 427 degrees of freedom
## Multiple R-squared:  0.607,  Adjusted R-squared:  0.6006 
## F-statistic: 94.24 on 7 and 427 DF,  p-value: < 2.2e-16

Se ha tomado la desicion de colocar a la variable estrato como dummy, dado que es aquella que mejores resultados nos arroja. En este orden de ideas se procede a realizar el proceso de estimación de parámetros para el modelo (preciom ~ areaconst+estrato+banios+parqueaderos+ habitaciones). La salida generada permite establecer que la varaible habitaciones en este análisis no está aportando en la explicacion de la variable de respuesta Precio, esto es debido a que la prueba individual de significacia de la variable habitaciones no es significativa según la prueba t.

Considerando lo anterior, se procede a usar la función step(), su objetivo es ayudar a identificar un modelo de regresión óptimo eliminando o agregando variables predictoras de manera iterativa, utilizando diferentes criterios de selección, como el criterio AIC (Criterio de Información de Akaike) o el criterio BIC (Criterio de Información Bayesiana). La idea principal es encontrar el modelo más parsimonioso y efectivo que explique los datos. Vease la siguiente salida

summary(step(fit1,direction = "backward"))
## Start:  AIC=4395.13
## preciom ~ areaconst + estrato + banios + parqueaderos + habitaciones
## 
##                Df Sum of Sq      RSS    AIC
## - habitaciones  1     38087 10283123 4394.7
## <none>                      10245037 4395.1
## - banios        1    134924 10379961 4398.8
## - parqueaderos  1    409287 10654324 4410.2
## - estrato       3   1697193 11942230 4455.8
## - areaconst     1   3986618 14231655 4536.1
## 
## Step:  AIC=4394.74
## preciom ~ areaconst + estrato + banios + parqueaderos
## 
##                Df Sum of Sq      RSS    AIC
## <none>                      10283123 4394.7
## - banios        1    304157 10587281 4405.4
## - parqueaderos  1    413107 10696230 4409.9
## - estrato       3   1674264 11957387 4454.4
## - areaconst     1   4494777 14777900 4550.5
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos, 
##     data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -780.51  -77.28  -18.56   48.71 1001.78 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   28.15518   23.83533   1.181 0.238165    
## areaconst      0.69827    0.05105  13.678  < 2e-16 ***
## estrato4      74.34893   24.00866   3.097 0.002085 ** 
## estrato5     139.48701   21.80589   6.397 4.17e-10 ***
## estrato6     272.59519   36.65228   7.437 5.66e-13 ***
## banios        23.12920    6.50058   3.558 0.000415 ***
## parqueaderos  24.33931    5.86973   4.147 4.07e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155 on 428 degrees of freedom
## Multiple R-squared:  0.6056, Adjusted R-squared:  0.6001 
## F-statistic: 109.5 on 6 and 428 DF,  p-value: < 2.2e-16

Al usar el procedimiento backward, se parte inicialmente del modelo saturado, se comienzan a sacar variables y se calcula ya sea el AIC o BIC, entre más pequeño sea el BIC O AIC, mejor modelo tendremos. Ambos criterios son útiles cuando se ajustan modelos de regresión y otros tipos de modelos estadísticos para determinar cuál es el mejor modelo entre un conjunto de modelos candidatos. Finalmente el procedimiento establece que el mejor modelo es (preciom ~ areaconst + estrato + banios + parqueaderos)

Ahora bien, realicemos nuevamente el proceso de estimación de parámetros para nuestro nuevo modelo:

fit2<-lm(preciom  ~ areaconst+estrato+banios+parqueaderos, data=basemod2 )
summary(fit2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos, 
##     data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -780.51  -77.28  -18.56   48.71 1001.78 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   28.15518   23.83533   1.181 0.238165    
## areaconst      0.69827    0.05105  13.678  < 2e-16 ***
## estrato4      74.34893   24.00866   3.097 0.002085 ** 
## estrato5     139.48701   21.80589   6.397 4.17e-10 ***
## estrato6     272.59519   36.65228   7.437 5.66e-13 ***
## banios        23.12920    6.50058   3.558 0.000415 ***
## parqueaderos  24.33931    5.86973   4.147 4.07e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155 on 428 degrees of freedom
## Multiple R-squared:  0.6056, Adjusted R-squared:  0.6001 
## F-statistic: 109.5 on 6 and 428 DF,  p-value: < 2.2e-16

La salida anterior, nos permite establecer que por el moemento es el modelo que mejor ajuste tiene a los datos de viviendas. Interpretemos la estimación de los parámetros del modelo generado junto a su intercepto:

  • preciom: \(Y_k\) –> La respuesta es el precio de las viviendas en millones de pesos.

  • areaconst : \(x_{k2}\) –> Area construída de la k-esima vivienda (en metros cuadrados).

  • variable dummy estrato:

\[\begin{equation*} x_{k3}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;4\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;4 \end{matrix}\right. \end{equation*}\]

\[\begin{equation*} x_{k4}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;5\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;5 \end{matrix}\right. \end{equation*}\]

\[\begin{equation*} x_{k5}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;6\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;6 \end{matrix}\right. \end{equation*}\]

  • baños: \(x_{k6}\) –> Cantidad de baños en la k-ésima vivienda.

  • parqueaderos: \(x_{k7}\) –> Cantidad de parqueaderos en la k-ésima vivienda.

  • \(\hat{\beta_1}:\) Intercepto de la recta, Permitiéndose pensar en la existencia de viviendas con area construida 0\(m^2\), pertenecientes al estrato 3, sin baños y sin parqueaderos. 28.15 representa que el precio medio de una propiedad con estas condiciones se estima en 28.15518 millones de pesos colombianos (COP).

  • \(\hat{\beta_2}:\) Dejando fijo el número de parqueaderos y baños, se tiene que por cada metro cuadrado adicional en las viviendas de estrato 3 (estrato base), el precio promedio de la vivienda con mayor metros cuadrados aumentará 0.69 unidades monetarias.

Considerando que en el modelo de regresión la variable estrato es dummy, la interpretación de los parámetros \(\beta_3\) , \(\beta_4\) y \(\beta_5\),asociados a estas variables dummies es la siguiente:

  • \(\hat{\beta_3}:\) Al ser 74.34893 una estimación positiva de \(\beta_3"\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 4 sea 74.35 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_4}:\) Al ser 139.48701 una estimación positiva de \(\beta_4\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 5 sea 139.4 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_5}:\) Al ser 272.59519 una estimación positiva de \(\beta_5\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 6 sea 272.59 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_6}:\) Si una propiedad tiene un baño adicional en comparación con otra propiedad con todas las demás características iguales, se espera que el precio medio de la propiedad sea aproximadamente 23.13 unidades más alto esto para viviendas de estrato 3. Esto asumiendo que todas las demás variables en el modelo, como “area_construida” , “area” y “parqueaderos” se mantengan constantes.

  • \(\hat{\beta_7}:\) Cuando el número de parqueaderos en una propiedad de estrato 3 aumenta en una unidad, y todas las demás variables se mantienen constantes, se espera que el precio de la propiedad sea mayor en aproximadamente 24.34 unidades en promedio.

El coeficiente de determinación (\(R^2\)) es una medida que proporciona información sobre cuánta varianza en la variable de respuesta es explicada por las variables predictoras en un modelo de regresión múltiple. Un \(R^2\) de 0.6001 significa que aproximadamente el 60.01% de la variabilidad en la variable de respuesta precio es explicada por las variables predictoras incluidas en el modelo.

Considerando que la última estimacion de parámetros es la que corresponde a un modelo de regresión que describe el precio de las viviendas tipo casa de la zona norte de cali. Es posible mejorar aún más el modelo, haciendo un analisis de influencia. Este tipo de análsis, se centra en identificar observaciones o puntos de datos que tienen un impacto desproporcionado en los resultados del modelo. Estas observaciones se llaman “influyentes” y pueden afectar significativamente los coeficientes de regresión, los valores ajustados, las predicciones y las conclusiones del modelo. Aquí están algunas de las medidas e indicadores comunes utilizados en el análisis de influencia:

  • Residuos Estandarizados: Los residuos estandarizados son los residuos divididos por su error estándar. Pueden proporcionar información sobre la distancia relativa de cada punto de datos a la línea de regresión. Los valores absolutos de los residuos estandarizados grandes pueden indicar puntos influyentes.

  • Leverage (Apalancamiento): El leverage mide cuánto una observación se aleja de la media de las variables predictoras. Las observaciones con valores de leverage altos pueden ser influyentes porque tienen un alto grado de apalancamiento en la estimación de los coeficientes.

  • Distancias de Cook : Las distancias de Cook es una medida que combina la información sobre los residuos estandarizados y el leverage. Las observaciones con valores altos de Cook’s Distance tienen un impacto significativo en el modelo y en la eliminación de esas observaciones, los resultados del modelo pueden cambiar notablemente.

El análisis de influencia es importante porque puede ayudar a identificar puntos de datos que pueden estar afectando negativamente la calidad del modelo.

1.4 Validación de supuestos

La validación de supuestos en un modelo de regresión lineal es una parte crucial del análisis de regresión para garantizar que los resultados del modelo sean válidos y confiables. Aquí hay una descripción de los supuestos comunes en un modelo de regresión lineal

  • Normalidad de los Residuos:

    El supuesto de normalidad de los residuos implica que los residuos siguen una distribución normal. Existen pruebas de normalidad, como la prueba de Shapiro-Wilk o gráficos QQ (quantile-quantile) de los residuos, para evaluar si los residuos se distribuyen normalmente. Si los residuos no son normalmente distribuidos, es posible que debas considerar transformaciones de datos. Veámos esta información en el conjunto de datos de viviendas en cali.

library(car)
qqPlot(fit2$residuals, col.lines = "green")

## 513 405 
## 309 239
#lillie.test(fit2$residuals)
shapiro.test(fit2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  fit2$residuals
## W = 0.84766, p-value < 2.2e-16
#Opcion 3 Anderson Darling
#ad.test(fit2$residuals)

El supuesto de Normalidad en los errores no se está cumpliendo,es decír que hay evidencia estadística significativa en contra de la hipótesis nula de que los residuos provienen de una población con una distribución normal.

  • Homocedasticidad: La homocedasticidad significa que la varianza de los residuos es constante en todos los niveles de las variables predictoras. Una forma de verificar la homocedasticidad es trazando los residuos estandarizados frente a los valores ajustados. Si existe un patrón de cono o embudo en el gráfico, puede indicar heterocedasticidad, lo que sugiere que la varianza de los residuos no es constante. No obstante se cosiderará la prueba de Brench Pagan donde el contraste de hipótesisis es:

\[H_o : Varianza\;\;constante \;\;\;\;\;\;\;v.s\;\;\;\;\;\;\; H_1 : Varianza\;\;no\;\;constante\]

library(lmtest)
bptest(fit2)
## 
##  studentized Breusch-Pagan test
## 
## data:  fit2
## BP = 83.408, df = 6, p-value = 7.054e-16

Cuando el valor p de la prueba de Breusch-Pagan para la homocedasticidad es extremadamente bajo, como en este caso (p-value = 7.054e-16), indica que hay evidencia estadística significativa en contra de la hipótesis nula de homocedasticidad. En otras palabras, los datos no cumplen con el supuesto de homocedasticidad en el contexto de tu modelo de regresión.

  • Prueba de no correlación de los errores: La prueba de no correlación de errores, también conocida como prueba de autocorrelación de errores, se utiliza en el análisis de regresión para evaluar si los errores (residuos) del modelo de regresión están correlacionados entre sí a lo largo de las observaciones. Esta prueba es importante porque verifica uno de los supuestos clave de los modelos de regresión lineal, que es la independencia de los errores.

a prueba de no correlación de errores tiene como objetivo determinar si hay algún patrón sistemático de correlación entre los errores en un modelo de regresión. En un modelo de regresión ideal, los errores deben ser independientes entre sí, lo que significa que el error en una observación no debe estar relacionado con el error en otra observación. Observese el contraste de hipótesis

\[H_o : No\;\;existe\;\;correlacion\;\;serial\;\;de\;\;orden\;\;1 \;\;\;\;\;\;\;v.s\;\;\;\;\;\;\; H_1 : Existe\;\;correlacion\;\;serial\;\;de\;\;orden\;\;1\]

library(lmtest)
dwtest(fit2)
## 
##  Durbin-Watson test
## 
## data:  fit2
## DW = 1.8015, p-value = 0.01547
## alternative hypothesis: true autocorrelation is greater than 0

Dado que el valor p (0.01547) es menor que el nivel de significancia comúnmente utilizado de 0.05, podemos concluir que existe evidencia estadística significativa de autocorrelación de primer orden en los residuos del modelo de regresión. Esto significa que los residuos no son independientes y están correlacionados entre observaciones adyacentes en algún grado

Cuando los supuestos de un modelo de regresión no se cumplen, es importante tomar medidas para abordar estos problemas y obtener resultados más confiables y precisos. Algunas opciones para solucionar el problema es:

  • Transformar los datos: Una de las soluciones más comunes es aplicar transformaciones a las variables predictoras o a la variable de respuesta. Esto puede ayudar a estabilizar la varianza, linealizar relaciones no lineales y cumplir con los supuestos. Algunas transformaciones comunes incluyen logaritmos, raíces cuadradas o inversos.

  • Agregar Variables de Interacción: Si los supuestos de linealidad no se cumplen, puedes considerar agregar términos de interacción entre las variables predictoras para capturar relaciones no lineales en el modelo.

  • Eliminar Valores Atípicos: Los valores atípicos pueden afectar significativamente la estimación de los coeficientes y los supuestos del modelo. Puedes considerar eliminar valores atípicos si tienes razones para creer que son errores de medición o no representativos de la población.

  • Evaluar la Homocedasticidad: Si la varianza de los errores no es constante (heterocedasticidad), considera la posibilidad de transformar las variables o utilizar modelos que sean robustos a la heterocedasticidad.

1.5 Predicción vivienda tipo 1 para la agente comercial.

Considerando que se desea conocer cuando costará una casa en la zona norte para este cliente, se generan las siguientes líneas de código:

df <- data.frame(
  areaconst = c(200),
  estrato = factor(c(4)),  
  habitaciones = c(4),
  banios = c(2),
  parqueaderos = c(1)
)

# Realizar la predicción
predicciones <- predict(fit2, df)

# Mostrar las predicciones
print(predicciones)
##       1 
## 312.755

Para una casa en la zona norte con estas especificaciones se espera que cueste 312 millones de pesos

2.1 Filtrando viviendas tipo “casa” de la zona Sur

Con la finalidad de hacer un análisis más detallado sobre los requerimientos del segundo caso de negocio, se procede a filtrar las viviendas de tipo casa y que se encuentran en zona Sur

#Llamando y filtrando la base de datos
require(dplyr)
base2 <- vivienda %>%
  filter(tipo == "Casa" & zona == "Zona Sur")

head(base2, n=3)
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 5992 Zona Sur   02       4     400       280            3      5            3
## 2 5157 Zona Sur   02       3     500       354            1      2            4
## 3 5501 Zona Sur   02       3     175       102           NA      2            4
##   tipo     barrio longitud latitud
## 1 Casa 3 de julio  -76.540   3.435
## 2 Casa    alameda  -76.535   3.437
## 3 Casa    alameda  -76.537   3.435
dim(base2)
## [1] 1939   13

El nuevo conjunto de datos filtrado corresponde a 1939 viviendas. Observemos cómo esta el conjunto de datos en términos de ubicación geográfica con los nuevos filtros realizados:

library(leaflet)
library(htmlwidgets)

map_base2 <- base2 %>% 
  leaflet() %>% 
  addTiles() %>% 
  addMarkers(lat = ~latitud, lng = ~longitud, clusterOptions = markerClusterOptions())
map_base2

Al observar el mapa de viviendas en cali para el caso de negocio de Maria, se puede establecer que podrían existir varios factores que pueden estar contribuyendo a que las viviendas se ubiquen en diferentes zonas dado que se graficó viviendas cuyo campo de zona es “Zona Sur”, estas discrepancias pueden ser debidas a:

  • Errores de entrada de datos: Es posible que se hayan introducido incorrectamente las coordenadas de latitud y longitud en la base de datos. Incluso un pequeño error en estas coordenadas puede hacer que las viviendas aparezcan en ubicaciones incorrectas en un mapa

  • Errores en la definición de “zona norte”: Asegúrate de que la definición de “zona norte” en tu filtro sea coherente con la distribución geográfica real de las viviendas en esa área. Si la definición no coincide con la ubicación real de las viviendas, podrías estar excluyendo viviendas que deberían estar en la zona norte o incluyendo viviendas que no deberían estar.

  • Falta de datos precisos de dirección: Si la base de datos no contiene direcciones geográficas precisas o si las direcciones están incompletas o incorrectas, esto podría afectar la capacidad de filtrar correctamente las viviendas por ubicación.

  • Problemas de geolocalización por software: Dependiendo de cómo se hayan asignado las coordenadas geográficas a las direcciones en la base de datos, podría haber problemas de precisión en la geolocalización. Algunas viviendas podrían estar asignadas incorrectamente a coordenadas geográficas erróneas.

2.2 Análisis exploratorio

Para poder determinar una caracterización sobre el conjunto de datos, se procede como primera medida en observar las variables preciom, areaconst, estrato, banios, habitaciones de forma conjunta. Para esto se realiza la siguiente salida donde muestra un correlograma del conjunto de datos:

library(plotly)
library(GGally)
p <- ggpairs(base2[c("preciom","areaconst", "estrato", "banios", "habitaciones", "zona")], title="correlogram with ggpairs()") 
ggplotly(p)

Considerando que el conjunto de datos hace referencia a casas ubicadas en la zona sur, se logra observar las correlaciones entre pares de variables, de las cuales se identifica una alta correlación positiva de 0.67 para las varibles (preciom, areaconst), una correlación de 0.63 para las varibles (preciom, estrato). Observemos las siguientes gráficas del precio de las viviendas en función del area construída, estrato, baños y el número de habitaciones.

Análisis por Area Construída

Cuando tenemos una opción de compra de vivienda, uno de los aspectos más importantes a la hora de generar nuestra inversión a largo plazo es el area construída. Sabemos de atemano que esta variable metros cuadrados construídos es determinante en el precio de un inmueble. Nuestra perspectiva indicaría que entre mayor espacio construído, más costoso debe ser una vivienda, observemos el siguiente gráfico:

fig0 <- plot_ly(base2, x = ~areaconst, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>% layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el área construída (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig0

La nube de puntos del scatter plot, evidentemente muestra una correlación positiva en el conjunto de datos, permitiendo concluír que las variables precio y area construída son directamente proporcionales, esto significa que entre mayor sea el área construída, mayor será el precio de la vivienda. Adicionalmente, la incusión del Estrato permite concluír que:

  • Los agrupamientos por color, identifican al grupo de casas azules en el extremo inferior izquierdo, lo cual significa que las viviendas de estrato 3 son las que menor tienen area construída y evidentemente cuestan menos. Existen viviendas con precios demasiado altos y estas son consideradas outlier.(para mejor análisis ver la gráfica boxplot del análisis por Estrato)

Los agrupamientos por color naranja, identifican al grupo de casas de estrato socioeconómico 4. Este tipo de viviendas tienden a agruparse en area construída baja y precios un poco mayores. En este grupo de viviendas se identifican 4 predios que tienen un precio superior a 736 millones de pesos (este es el limite superior en millones para ser considerado outlier), estas viviendas se consideran atipicas.(Ver la gráfica boxplot del análisis por Estrato para un mejor análisis)

Los agrupamientos por color verde y rojo, identifican al grupo de casas de estrato socioeconómico 5 y 6 respectivamente. Este tipo de viviendas tienden a agruparse en area construída alta y precios altos. en el estrato 5 se encuentra el 33% y en las viviendas estrato 6 el 30% de un total de 1939 viviendas (Ver gráfica de cantidad de viviendas por estrato, del próximo subtítulo). En este grupo de viviendas se identifica el predio más costoso y corresponde al estrato 6. (Ver la gráfica boxplot del análisis por Estrato para un mejor análisis)

Análisis por Estrato

#Gráfica estrato
df2 <- base2 %>% group_by(estrato) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p <-ggplot(df2, aes(x = estrato, y=Cantidad, fill=estrato) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR ESTRATO")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p)

En la gráfica anterior se logra observar la proporción de estratos que caracteriza al conjunto de viviendas (casas ubicadas en la zona Sur), de esta representación gráfica se observa que:

  • El 33.6% de las viviendas pertenece al estrato 5 y es este estrato donde se evidencia el mayor número de vivinedas con 652.
  • El 30% de las viviendas son del estrato 6 con un equivalente de 235 casas.
  • El estrato 3 es el nivel socioeconómico menos usual en este tipo de viviendas, corresponde a una poblacion de viviendas del 9.3%.
p7 <- plot_ly(
  data = base2,
  x = ~estrato,
  y = ~preciom,
  color = ~factor(estrato),
  text = ~estrato,
  type = "box",
  mode = "markers") %>%
  layout(legend=list(title=list(text='Estrato')), title = "PRECIO DE LAS VIVIENDAS SEGÚN EL ESTRATO",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
p7

En la gráfica anterior se logra identificar el precio de las viviendas en función del estrato socioeconómico. Estableciéndose efectivamente que entre mayor estrato mayor precio, se pueden identificar algunas viviendas atípicas en el conjunto de datos especialmente para el estrato 3,4 y 5. Para el estrato 3 las viviendas que sobrepasan los 550 millones de pesos se consideran atipicas, en el estrato 5 se tiene que las viviendas que superren los 980 millones son costosas para este grupo de viviendas.

Analicemos el precio de las viviendas en función al número de baños

Análisis por #baños

#Gráfica banios
df3 <- base2 %>% group_by(banios) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p3 <-ggplot(df3, aes(x = banios, y=Cantidad, fill=banios) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR BAÑOS")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p3)

Para el caso de la variable baños, la cual indica la cantidad respectiva en cada casa ubicada en zona sur se logra identificar que para estas 1939 viviendas:

  • El 27.6% que corresponde a 536 tienen 4 baños, este se convierte en la cantidad de baños más usual en el conjunto de casas ubicadas en zona Sur.

  • La segunda cantidad de baños más usual es 3, el cual corresponde a 474 casas y con respecto a las 1939 viviendas hace referencia al 24.4%.

  • El caso de viviendas con 5 baños también es muy frecuente, del conjunto de casas de la zona sur se puede afirmar que con el 21.8% , esta cantidad de baños se convierte en la tercera opción más frecuente.

fig22 <- plot_ly(base2, x = ~banios, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>%
  layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el número de baños (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig22

Al observar la anterior gráfica se puede identificar el precio de las 1939 viviendas con respecto al número de baños. Para hacer un análisis mucho más preciso uso la variable estrato para identificar más características alusivas a este tipo de viviendas tipo casa de la zona sur:

Evidentemente entre mayor sea el número de baños, se espera que el precio de las viviendas aumente

Análisis por #Habitaciones

La cantidad de habitaciones, igualmente es un aspecto escencial al momento de compra de vivienda, se ha convertido en una de las más importantes y que más influye en el precio. Observemos el siguiente gráfico:

#Gráfica habitaciones
df4 <- base2 %>% group_by(habitaciones) %>% summarise(Cantidad=n()) %>%   
  dplyr::mutate(Porcentaje = round(Cantidad/sum(Cantidad)*100, 1))            

p4 <-ggplot(df4, aes(x = habitaciones , y=Cantidad, fill=habitaciones ) ) +     
  geom_bar(width = 0.9, stat="identity", position = position_dodge()) +
  labs(title = "CANTIDAD DE VIVIENDAS POR HABITACIONES")+ theme(plot.title = element_text(hjust = 0.5))+
  geom_text(aes(label=paste0(Cantidad," ", "", "\n(", Porcentaje, "%",")")),  
            vjust=1.3,                         
            color="black",                     
            hjust=0.5,                         
            position = position_dodge(0.9),    
            angle=0,                           
            size=4.0                            
  )
plotly::ggplotly(p4)

En el conjunto de viviendas se observan casas que tienen hasta 10 habitaciones, no obstante se identifican viviendas con 0 habtaciones, esto podría ser el caso de apartaestudios. Esta variable es un poco diferente a las demás comentadas, dado que solamnet para el caso de viviendas con 10 habitaciones cumple nuestra perspectiva de más costosas, No obstante, con las demás cantidades de habitaciones es muy diferente.

  • Existen 678 casas con 4 habitaciones, 448 con 3 habitaciones y 391 con 5 habitaciones que corresponden al 35%, 23.1% y el 20.2% respectivamente, esta es una de las características de este tipo de viviendas ubicadas en la zona sur.

  • De forma global, los predios de estrato 3,4,5 y 6 teinen precios muy dispersos. Aquellas casas con 8 tienen precios muy atipicos.

fig2 <- plot_ly(base2, x = ~habitaciones, y = ~preciom, split = ~estrato, type = 'scatter', mode = 'markers') %>%
  layout(legend=list(title=list(text='Estrato')), title = "Precio de las viviendas según el número de baños (Clasificación por Estrato)",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff') )
fig2

2.3 Modelo de Regresión

Se desea establecer un modelo de regresión múltiple con las variables preciom, area construida, estrato, habitaciones, baños, parqueaderos

Se propone analizar los datos usando modelos en los que se asume:

  • preciom: \(Y_k\) –> La respuesta es el precio de las viviendas en millones de pesos.
  • areaconst : \(x_{k2}\) –> Area construída de la k-esima vivienda (en metros cuadrados).
  • estrato: \(x_{k3}\) –> El estrato de la k-ésima vivienda.
  • habitaciones: \(x_{k4}\) –> Cantidad de habitaciones en la k-ésima vivienda.
  • baños: \(x_{k5}\) –> Cantidad de baños en la k-ésima vivienda.
  • parqueaderos: \(x_{k6}\) –> Cantidad de parqueaderos en la k-ésima vivienda.

\[\begin{equation*} \left\{ \begin{array}{ll} Y_k = \mu_k + \epsilon_k\\ \mu_k=\beta_1 + \beta_2 x_{k2} + \beta_3 x_{k3} + \beta_4 x_{k2} + \beta_5 x_{k2} x_{k3} + \beta_6 x_{k2} x_{k4} + \beta_7 x_{k3} x_{k4}+ \beta_8 x_{k2} x_{k3} x_{k4} + ... + \beta_p x_{k2} x_{k3} x_{k4} x_{k5} x_{k6}\\ \epsilon_k \overset{\text{iid}}{\sim} Normal(0, \sigma^2) \end{array} \right. \end{equation*}\]

Para poder realizar el modelo de regresión, se usa la funcion lm la cual permite encontrar la estimación de los parámetros de regresión de un modelo de regresión lineal. Como primer paso involucro el modelo saturado de variables (es decír aquel que es combinacion de todas las variables, con efectos entre variables), todo lo anterior para poder identificar que posibles interacciones puedes ser significativas en el modelo. (ver siguiente salida)

basemod <- base2[c("preciom", "areaconst","estrato", "habitaciones", "banios","parqueaderos")]
basemod <- na.omit(basemod)
basemod$estrato<-factor(basemod$estrato)
basemod2<-within(basemod,{estrato <-factor(estrato, levels=c(3,4,5,6))}) 

fit1<-lm(preciom  ~ areaconst*estrato*banios*parqueaderos*habitaciones, 
         data=basemod2 )
summary(fit1)
## 
## Call:
## lm(formula = preciom ~ areaconst * estrato * banios * parqueaderos * 
##     habitaciones, data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -685.82  -88.41  -20.25   55.92 1056.84 
## 
## Coefficients:
##                                                       Estimate Std. Error
## (Intercept)                                         -542.62104 1038.16542
## areaconst                                              4.25442    4.72727
## estrato4                                             571.99299 1101.48822
## estrato5                                             777.77046 1085.97975
## estrato6                                             641.66028 1302.29016
## banios                                               153.35646  299.66272
## parqueaderos                                         475.51198  913.36463
## habitaciones                                         136.69523  266.58246
## areaconst:estrato4                                    -2.59155    4.86594
## areaconst:estrato5                                    -3.95785    4.85713
## areaconst:estrato6                                    -1.83658    5.14571
## areaconst:banios                                      -0.89020    1.13772
## estrato4:banios                                     -150.79724  316.21234
## estrato5:banios                                     -166.38842  311.05374
## estrato6:banios                                     -268.22721  340.81351
## areaconst:parqueaderos                                -2.49580    3.78110
## estrato4:parqueaderos                               -445.05161  947.93004
## estrato5:parqueaderos                               -542.82932  921.53065
## estrato6:parqueaderos                               -142.86567  945.42225
## banios:parqueaderos                                 -115.64971  242.55475
## areaconst:habitaciones                                -0.62740    1.04663
## estrato4:habitaciones                               -112.53479  280.39906
## estrato5:habitaciones                               -116.71415  278.78380
## estrato6:habitaciones                               -186.24505  319.12994
## banios:habitaciones                                  -27.25683   69.41144
## parqueaderos:habitaciones                            -86.94003  236.89916
## areaconst:estrato4:banios                              0.77643    1.17845
## areaconst:estrato5:banios                              0.98111    1.16652
## areaconst:estrato6:banios                              1.05936    1.20536
## areaconst:estrato4:parqueaderos                        2.29012    3.86110
## areaconst:estrato5:parqueaderos                        2.91364    3.79079
## areaconst:estrato6:parqueaderos                        1.54878    3.82860
## areaconst:banios:parqueaderos                          0.67012    0.89912
## estrato4:banios:parqueaderos                         123.88650  249.51530
## estrato5:banios:parqueaderos                         132.78355  244.52057
## estrato6:banios:parqueaderos                         115.09734  247.27638
## areaconst:estrato4:habitaciones                        0.48844    1.07267
## areaconst:estrato5:habitaciones                        0.67311    1.07709
## areaconst:estrato6:habitaciones                        0.38429    1.12827
## areaconst:banios:habitaciones                          0.13526    0.25361
## estrato4:banios:habitaciones                          30.18993   72.05093
## estrato5:banios:habitaciones                          28.04709   71.46200
## estrato6:banios:habitaciones                          67.88824   77.75135
## areaconst:parqueaderos:habitaciones                    0.40521    0.90785
## estrato4:parqueaderos:habitaciones                    77.04702  243.43816
## estrato5:parqueaderos:habitaciones                    82.16137  238.09084
## estrato6:parqueaderos:habitaciones                    43.37437  242.32125
## banios:parqueaderos:habitaciones                      20.22536   60.75411
## areaconst:estrato4:banios:parqueaderos                -0.65482    0.91300
## areaconst:estrato5:banios:parqueaderos                -0.69155    0.90175
## areaconst:estrato6:banios:parqueaderos                -0.60270    0.90633
## areaconst:estrato4:banios:habitaciones                -0.12669    0.25838
## areaconst:estrato5:banios:habitaciones                -0.15032    0.25849
## areaconst:estrato6:banios:habitaciones                -0.16986    0.26605
## areaconst:estrato4:parqueaderos:habitaciones          -0.35597    0.92028
## areaconst:estrato5:parqueaderos:habitaciones          -0.45029    0.90973
## areaconst:estrato6:parqueaderos:habitaciones          -0.23260    0.91591
## areaconst:banios:parqueaderos:habitaciones            -0.10009    0.22518
## estrato4:banios:parqueaderos:habitaciones            -20.50102   61.84781
## estrato5:banios:parqueaderos:habitaciones            -19.70516   60.91095
## estrato6:banios:parqueaderos:habitaciones            -19.88108   61.53596
## areaconst:estrato4:banios:parqueaderos:habitaciones    0.09721    0.22693
## areaconst:estrato5:banios:parqueaderos:habitaciones    0.10269    0.22544
## areaconst:estrato6:banios:parqueaderos:habitaciones    0.08521    0.22632
##                                                     t value Pr(>|t|)
## (Intercept)                                          -0.523    0.601
## areaconst                                             0.900    0.368
## estrato4                                              0.519    0.604
## estrato5                                              0.716    0.474
## estrato6                                              0.493    0.622
## banios                                                0.512    0.609
## parqueaderos                                          0.521    0.603
## habitaciones                                          0.513    0.608
## areaconst:estrato4                                   -0.533    0.594
## areaconst:estrato5                                   -0.815    0.415
## areaconst:estrato6                                   -0.357    0.721
## areaconst:banios                                     -0.782    0.434
## estrato4:banios                                      -0.477    0.634
## estrato5:banios                                      -0.535    0.593
## estrato6:banios                                      -0.787    0.431
## areaconst:parqueaderos                               -0.660    0.509
## estrato4:parqueaderos                                -0.469    0.639
## estrato5:parqueaderos                                -0.589    0.556
## estrato6:parqueaderos                                -0.151    0.880
## banios:parqueaderos                                  -0.477    0.634
## areaconst:habitaciones                               -0.599    0.549
## estrato4:habitaciones                                -0.401    0.688
## estrato5:habitaciones                                -0.419    0.676
## estrato6:habitaciones                                -0.584    0.560
## banios:habitaciones                                  -0.393    0.695
## parqueaderos:habitaciones                            -0.367    0.714
## areaconst:estrato4:banios                             0.659    0.510
## areaconst:estrato5:banios                             0.841    0.400
## areaconst:estrato6:banios                             0.879    0.380
## areaconst:estrato4:parqueaderos                       0.593    0.553
## areaconst:estrato5:parqueaderos                       0.769    0.442
## areaconst:estrato6:parqueaderos                       0.405    0.686
## areaconst:banios:parqueaderos                         0.745    0.456
## estrato4:banios:parqueaderos                          0.497    0.620
## estrato5:banios:parqueaderos                          0.543    0.587
## estrato6:banios:parqueaderos                          0.465    0.642
## areaconst:estrato4:habitaciones                       0.455    0.649
## areaconst:estrato5:habitaciones                       0.625    0.532
## areaconst:estrato6:habitaciones                       0.341    0.733
## areaconst:banios:habitaciones                         0.533    0.594
## estrato4:banios:habitaciones                          0.419    0.675
## estrato5:banios:habitaciones                          0.392    0.695
## estrato6:banios:habitaciones                          0.873    0.383
## areaconst:parqueaderos:habitaciones                   0.446    0.655
## estrato4:parqueaderos:habitaciones                    0.316    0.752
## estrato5:parqueaderos:habitaciones                    0.345    0.730
## estrato6:parqueaderos:habitaciones                    0.179    0.858
## banios:parqueaderos:habitaciones                      0.333    0.739
## areaconst:estrato4:banios:parqueaderos               -0.717    0.473
## areaconst:estrato5:banios:parqueaderos               -0.767    0.443
## areaconst:estrato6:banios:parqueaderos               -0.665    0.506
## areaconst:estrato4:banios:habitaciones               -0.490    0.624
## areaconst:estrato5:banios:habitaciones               -0.582    0.561
## areaconst:estrato6:banios:habitaciones               -0.638    0.523
## areaconst:estrato4:parqueaderos:habitaciones         -0.387    0.699
## areaconst:estrato5:parqueaderos:habitaciones         -0.495    0.621
## areaconst:estrato6:parqueaderos:habitaciones         -0.254    0.800
## areaconst:banios:parqueaderos:habitaciones           -0.444    0.657
## estrato4:banios:parqueaderos:habitaciones            -0.331    0.740
## estrato5:banios:parqueaderos:habitaciones            -0.324    0.746
## estrato6:banios:parqueaderos:habitaciones            -0.323    0.747
## areaconst:estrato4:banios:parqueaderos:habitaciones   0.428    0.668
## areaconst:estrato5:banios:parqueaderos:habitaciones   0.456    0.649
## areaconst:estrato6:banios:parqueaderos:habitaciones   0.376    0.707
## 
## Residual standard error: 191.5 on 1660 degrees of freedom
## Multiple R-squared:  0.7572, Adjusted R-squared:  0.748 
## F-statistic: 82.19 on 63 and 1660 DF,  p-value: < 2.2e-16

En la anterior salida, se observa la estimación de los parámetros de un modelo de regresión saturado, según el p-valor se puede establecer que según la evidencia de los datos las variables en este modelo de regresión sus efectos no son significativos. En consecuencia se propone realizar un modelo simple sin interacciones e ir involucrando el procedimiento stepwise paso a paso para identificar las variables significativas de un modelo de regresión. (véase la sigueinte salida):

fit1<-lm(preciom  ~ areaconst+estrato+banios+parqueaderos+ habitaciones, data=basemod2 )
summary(fit1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos + 
##     habitaciones, data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -793.73 -102.37  -23.12   58.29 1044.57 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6.07122   26.20041  -0.232  0.81678    
## areaconst      0.76820    0.03578  21.473  < 2e-16 ***
## estrato4      39.33174   22.20354   1.771  0.07667 .  
## estrato5      92.49155   22.32420   4.143 3.59e-05 ***
## estrato6     347.91245   24.92704  13.957  < 2e-16 ***
## banios        39.94538    4.93753   8.090 1.12e-15 ***
## parqueaderos  61.81447    4.20128  14.713  < 2e-16 ***
## habitaciones -13.32161    4.20450  -3.168  0.00156 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 200.5 on 1716 degrees of freedom
## Multiple R-squared:  0.7251, Adjusted R-squared:  0.7239 
## F-statistic: 646.5 on 7 and 1716 DF,  p-value: < 2.2e-16

Se ha tomado la desicion de colocar a la variable estrato como dummy, dado que es aquella que mejores resultados nos arroja. En este orden de ideas se procede a realizar el proceso de estimación de parámetros para el modelo (preciom ~ areaconst+estrato+banios+parqueaderos+ habitaciones). La salida generada permite establecer que la varaible habitaciones en este análisis no está aportando en la explicacion de la variable de respuesta Precio, esto es debido a que la prueba individual de significacia de la variable habitaciones no es significativa según la prueba t.

Considerando lo anterior, se procede a usar la función step(), su objetivo es ayudar a identificar un modelo de regresión óptimo eliminando o agregando variables predictoras de manera iterativa, utilizando diferentes criterios de selección, como el criterio AIC (Criterio de Información de Akaike) o el criterio BIC (Criterio de Información Bayesiana). La idea principal es encontrar el modelo más parsimonioso y efectivo que explique los datos. Vease la siguiente salida

summary(step(fit1,direction = "backward"))
## Start:  AIC=18284.68
## preciom ~ areaconst + estrato + banios + parqueaderos + habitaciones
## 
##                Df Sum of Sq      RSS   AIC
## <none>                      68963342 18285
## - habitaciones  1    403445 69366787 18293
## - banios        1   2630360 71593702 18347
## - parqueaderos  1   8699961 77663304 18488
## - areaconst     1  18529824 87493166 18693
## - estrato       3  18977471 87940814 18698
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos + 
##     habitaciones, data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -793.73 -102.37  -23.12   58.29 1044.57 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6.07122   26.20041  -0.232  0.81678    
## areaconst      0.76820    0.03578  21.473  < 2e-16 ***
## estrato4      39.33174   22.20354   1.771  0.07667 .  
## estrato5      92.49155   22.32420   4.143 3.59e-05 ***
## estrato6     347.91245   24.92704  13.957  < 2e-16 ***
## banios        39.94538    4.93753   8.090 1.12e-15 ***
## parqueaderos  61.81447    4.20128  14.713  < 2e-16 ***
## habitaciones -13.32161    4.20450  -3.168  0.00156 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 200.5 on 1716 degrees of freedom
## Multiple R-squared:  0.7251, Adjusted R-squared:  0.7239 
## F-statistic: 646.5 on 7 and 1716 DF,  p-value: < 2.2e-16

Al usar el procedimiento backward, se parte inicialmente del modelo saturado, se comienzan a sacar variables y se calcula ya sea el AIC o BIC, entre más pequeño sea el BIC O AIC, mejor modelo tendremos. Ambos criterios son útiles cuando se ajustan modelos de regresión y otros tipos de modelos estadísticos para determinar cuál es el mejor modelo entre un conjunto de modelos candidatos. Finalmente el procedimiento establece que el mejor modelo es (preciom ~ areaconst + estrato + banios + parqueaderos)

Ahora bien, realicemos nuevamente el proceso de estimación de parámetros para nuestro nuevo modelo:

basemod <- base2[c("preciom", "areaconst","estrato", "habitaciones", "banios","parqueaderos")]
basemod <- na.omit(basemod)
basemod$estrato<-factor(basemod$estrato)
basemod2<-within(basemod,{estrato <-factor(estrato, levels=c(3,4,5,6))}) 
fit2<-lm(preciom  ~ 1+ areaconst+estrato+banios+parqueaderos, data=basemod2 )
summary(fit2)
## 
## Call:
## lm(formula = preciom ~ 1 + areaconst + estrato + banios + parqueaderos, 
##     data = basemod2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -781.68 -102.87  -21.56   60.16 1051.75 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -44.9547    23.2094  -1.937   0.0529 .  
## areaconst      0.7463     0.0352  21.205  < 2e-16 ***
## estrato4      52.4597    21.8709   2.399   0.0166 *  
## estrato5     109.0103    21.7639   5.009 6.04e-07 ***
## estrato6     376.8198    23.2583  16.201  < 2e-16 ***
## banios        32.0177     4.2678   7.502 1.00e-13 ***
## parqueaderos  62.1103     4.2113  14.749  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 201 on 1717 degrees of freedom
## Multiple R-squared:  0.7235, Adjusted R-squared:  0.7225 
## F-statistic: 748.6 on 6 and 1717 DF,  p-value: < 2.2e-16

La salida anterior, nos permite establecer que por el moemento es el modelo que mejor ajuste tiene a los datos de viviendas. Interpretemos la estimación de los parámetros del modelo generado junto a su intercepto:

  • preciom: \(Y_k\) –> La respuesta es el precio de las viviendas en millones de pesos.

  • areaconst : \(x_{k2}\) –> Area construída de la k-esima vivienda (en metros cuadrados).

  • variable dummy estrato:

\[\begin{equation*} x_{k3}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;4\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;4 \end{matrix}\right. \end{equation*}\]

\[\begin{equation*} x_{k4}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;5\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;5 \end{matrix}\right. \end{equation*}\]

\[\begin{equation*} x_{k5}= \left\{\begin{matrix} & 1 & Si\;\;la\;\;vivienda\;\;pertenece\;\;al\;\;estrato\;\;6\\ & 0 & Si\;\;no\;\;pertenece\;\;a\;\;estrato\;\;6 \end{matrix}\right. \end{equation*}\]

  • baños: \(x_{k6}\) –> Cantidad de baños en la k-ésima vivienda.

  • parqueaderos: \(x_{k7}\) –> Cantidad de parqueaderos en la k-ésima vivienda.

  • \(\hat{\beta_2}:\) Dejando fijo el número de parqueaderos y baños, se tiene que por cada metro cuadrado adicional en las viviendas de estrato 3 (estrato base), el precio promedio de la vivienda con mayor metros cuadrados aumentará 0.74 unidades monetarias.

Considerando que en el modelo de regresión la variable estrato es dummy, la interpretación de los parámetros \(\beta_3\) , \(\beta_4\) y \(\beta_5\),asociados a estas variables dummies es la siguiente:

  • \(\hat{\beta_3}:\) Al ser 52.4597 una estimación positiva de \(\beta_3"\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 4 sea 52.4 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_4}:\) Al ser 109.0103 una estimación positiva de \(\beta_4\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 5 sea 109.01 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_5}:\) Al ser 376.8198 una estimación positiva de \(\beta_5\) y significativa, se tiene que dejando fija la cantidad de baños y el número de parqueaderos, se espera que el precio promedio de una vivienda de estrato 6 sea 376.81 unidades monetarias mayor que una vivienda de estrato 3 (estrato base).

  • \(\hat{\beta_6}:\) Si una propiedad tiene un baño adicional en comparación con otra propiedad con todas las demás características iguales, se espera que el precio medio de la propiedad sea aproximadamente 32.01 unidades más alto esto para viviendas de estrato 3. Esto asumiendo que todas las demás variables en el modelo, como “area_construida” , “area” y “parqueaderos” se mantengan constantes.

  • \(\hat{\beta_7}:\) Cuando el número de parqueaderos en una propiedad de estrato 3 aumenta en una unidad, y todas las demás variables se mantienen constantes, se espera que el precio de la propiedad sea mayor en aproximadamente 62.11 unidades en promedio.

El coeficiente de determinación (\(R^2\)) es una medida que proporciona información sobre cuánta varianza en la variable de respuesta es explicada por las variables predictoras en un modelo de regresión múltiple. Un \(R^2\) de 0.722 significa que aproximadamente el 72.2% de la variabilidad en la variable de respuesta precio es explicada por las variables predictoras incluidas en el modelo.

Considerando que la última estimacion de parámetros es la que corresponde a un modelo de regresión que describe el precio de las viviendas tipo casa de la zona Sur de cali. Es posible mejorar aún más el modelo, haciendo un analisis de influencia. Este tipo de análsis, se centra en identificar observaciones o puntos de datos que tienen un impacto desproporcionado en los resultados del modelo. Estas observaciones se llaman “influyentes” y pueden afectar significativamente los coeficientes de regresión, los valores ajustados, las predicciones y las conclusiones del modelo. Aquí están algunas de las medidas e indicadores comunes utilizados en el análisis de influencia:

  • Residuos Estandarizados: Los residuos estandarizados son los residuos divididos por su error estándar. Pueden proporcionar información sobre la distancia relativa de cada punto de datos a la línea de regresión. Los valores absolutos de los residuos estandarizados grandes pueden indicar puntos influyentes.

  • Leverage (Apalancamiento): El leverage mide cuánto una observación se aleja de la media de las variables predictoras. Las observaciones con valores de leverage altos pueden ser influyentes porque tienen un alto grado de apalancamiento en la estimación de los coeficientes.

  • Distancias de Cook : Las distancias de Cook es una medida que combina la información sobre los residuos estandarizados y el leverage. Las observaciones con valores altos de Cook’s Distance tienen un impacto significativo en el modelo y en la eliminación de esas observaciones, los resultados del modelo pueden cambiar notablemente.

El análisis de influencia es importante porque puede ayudar a identificar puntos de datos que pueden estar afectando negativamente la calidad del modelo.

2.4 Validación de supuestos

La validación de supuestos en un modelo de regresión lineal es una parte crucial del análisis de regresión para garantizar que los resultados del modelo sean válidos y confiables. Aquí hay una descripción de los supuestos comunes en un modelo de regresión lineal

  • Normalidad de los Residuos:

    El supuesto de normalidad de los residuos implica que los residuos siguen una distribución normal. Existen pruebas de normalidad, como la prueba de Shapiro-Wilk o gráficos QQ (quantile-quantile) de los residuos, para evaluar si los residuos se distribuyen normalmente. Si los residuos no son normalmente distribuidos, es posible que debas considerar transformaciones de datos. Veámos esta información en el conjunto de datos de viviendas en cali.

library(car)
qqPlot(fit2$residuals, col.lines = "green")

## 1050 1286 
##  937 1139
#lillie.test(fit2$residuals)
shapiro.test(fit2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  fit2$residuals
## W = 0.89088, p-value < 2.2e-16
#Opcion 3 Anderson Darling
#ad.test(fit2$residuals)

El supuesto de Normalidad en los errores no se está cumpliendo,es decír que hay evidencia estadística significativa en contra de la hipótesis nula de que los residuos provienen de una población con una distribución normal.

  • Homocedasticidad: La homocedasticidad significa que la varianza de los residuos es constante en todos los niveles de las variables predictoras. Una forma de verificar la homocedasticidad es trazando los residuos estandarizados frente a los valores ajustados. Si existe un patrón de cono o embudo en el gráfico, puede indicar heterocedasticidad, lo que sugiere que la varianza de los residuos no es constante. No obstante se cosiderará la prueba de Brench Pagan donde el contraste de hipótesisis es:

\[H_o : Varianza\;\;constante \;\;\;\;\;\;\;v.s\;\;\;\;\;\;\; H_1 : Varianza\;\;no\;\;constante\]

library(lmtest)
bptest(fit2)
## 
##  studentized Breusch-Pagan test
## 
## data:  fit2
## BP = 224.17, df = 6, p-value < 2.2e-16

Cuando el valor p de la prueba de Breusch-Pagan para la homocedasticidad es extremadamente bajo, como en este caso (p-value = 2.2e-16), indica que hay evidencia estadística significativa en contra de la hipótesis nula de homocedasticidad. En otras palabras, los datos no cumplen con el supuesto de homocedasticidad en el contexto de tu modelo de regresión.

  • Prueba de no correlación de los errores: La prueba de no correlación de errores, también conocida como prueba de autocorrelación de errores, se utiliza en el análisis de regresión para evaluar si los errores (residuos) del modelo de regresión están correlacionados entre sí a lo largo de las observaciones. Esta prueba es importante porque verifica uno de los supuestos clave de los modelos de regresión lineal, que es la independencia de los errores.

a prueba de no correlación de errores tiene como objetivo determinar si hay algún patrón sistemático de correlación entre los errores en un modelo de regresión. En un modelo de regresión ideal, los errores deben ser independientes entre sí, lo que significa que el error en una observación no debe estar relacionado con el error en otra observación. Observese el contraste de hipótesis

\[H_o : No\;\;existe\;\;correlacion\;\;serial\;\;de\;\;orden\;\;1 \;\;\;\;\;\;\;v.s\;\;\;\;\;\;\; H_1 : Existe\;\;correlacion\;\;serial\;\;de\;\;orden\;\;1\]

library(lmtest)
dwtest(fit2)
## 
##  Durbin-Watson test
## 
## data:  fit2
## DW = 1.7613, p-value = 2.737e-07
## alternative hypothesis: true autocorrelation is greater than 0

Dado que el valor p (2.737e-07) es menor que el nivel de significancia comúnmente utilizado de 0.05, podemos concluir que existe evidencia estadística significativa de autocorrelación de primer orden en los residuos del modelo de regresión. Esto significa que los residuos no son independientes y están correlacionados entre observaciones adyacentes en algún grado

Cuando los supuestos de un modelo de regresión no se cumplen, es importante tomar medidas para abordar estos problemas y obtener resultados más confiables y precisos. Algunas opciones para solucionar el problema es:

  • Transformar los datos: Una de las soluciones más comunes es aplicar transformaciones a las variables predictoras o a la variable de respuesta. Esto puede ayudar a estabilizar la varianza, linealizar relaciones no lineales y cumplir con los supuestos. Algunas transformaciones comunes incluyen logaritmos, raíces cuadradas o inversos.

  • Agregar Variables de Interacción: Si los supuestos de linealidad no se cumplen, puedes considerar agregar términos de interacción entre las variables predictoras para capturar relaciones no lineales en el modelo.

  • Eliminar Valores Atípicos: Los valores atípicos pueden afectar significativamente la estimación de los coeficientes y los supuestos del modelo. Puedes considerar eliminar valores atípicos si tienes razones para creer que son errores de medición o no representativos de la población.

  • Evaluar la Homocedasticidad: Si la varianza de los errores no es constante (heterocedasticidad), considera la posibilidad de transformar las variables o utilizar modelos que sean robustos a la heterocedasticidad.

2.5 Predicción vivienda tipo 2 para la agente comercial.

Considerando que se desea conocer cuando costará una casa en la zona norte para este cliente, se generan las siguientes líneas de código:

df <- data.frame(
  areaconst = c(300),
  estrato = factor(c(5)),  
  habitaciones = c(5),
  banios = c(3),
  parqueaderos = c(3)
)

# Realizar la predicción
predicciones <- predict(fit2, df)

# Mostrar las predicciones
print(predicciones)
##        1 
## 570.3388

Para una casa en la zona Sur con estas especificaciones se espera que cueste 570 millones de pesos

Conclusiones

En base a la información proporcionada y a las estimaciones de los modelos de regresión para la zona norte y la zona sur, María podría proporcionar el siguiente informe a la empresa que realizó la consulta:

Informe de Asesoría para Compra de Viviendas

Resumen: La asesoría se basa en modelos de regresión múltiple aplicados a las viviendas disponibles en la zona norte y la zona sur de la ciudad. Los modelos consideran diversas características de las viviendas, como el área construida, el estrato, el número de habitaciones, baños y parqueaderos. A continuación, se presentan las principales conclusiones y recomendaciones:

En la Zona Norte:

  • Por cada metro cuadrado adicional en las viviendas de estrato 3, el precio promedio aumenta en 0.69 unidades monetarias.

  • Cada baño adicional en una vivienda de estrato 3 aumenta el precio en aproximadamente 23.13 unidades monetarias.

  • Cada parqueadero adicional en una vivienda de estrato 3 aumenta el precio en aproximadamente 24.34 unidades monetarias.

  • El coeficiente de determinación (R2) es del 60.01%, lo que significa que el modelo explica aproximadamente el 60.01% de la variabilidad en el precio de las viviendas en la zona norte.

En la Zona Sur:

  • Por cada metro cuadrado adicional en las viviendas de estrato 3, el precio promedio aumenta en 0.74 unidades monetarias.

  • Cada baño adicional en una vivienda de estrato 3 aumenta el precio en aproximadamente 32.01 unidades monetarias.

  • Si una propiedad tiene un baño adicional en comparación con otra propiedad con todas las demás características iguales, se espera que el precio medio de la propiedad sea aproximadamente 32.01 unidades más alto esto para viviendas de estrato 3.

  • Cuando el número de parqueaderos en una propiedad de estrato 3 aumenta en una unidad, y todas las demás variables se mantienen constantes, se espera que el precio de la propiedad sea mayor en aproximadamente 62.11 unidades monetarias en promedio.

  • El coeficiente de determinación (R2) es del 72.2%, lo que significa que el modelo explica aproximadamente el 72.2% de la variabilidad en el precio de las viviendas en la zona sur.

Diferencias Significativas entre Zona Norte y Zona Sur:

  • Los modelos de regresión aplicados a las viviendas en la zona norte y sur revelan diferencias significativas en los precios de las propiedades en ambas áreas.

  • En la zona norte, el precio de las viviendas está influenciado principalmente por factores como el área construida, el estrato, el número de baños y parqueaderos. Según el modelo, para una casa en la zona norte con las especificaiones de la empresa a María, se espera que cueste aproximadamente 312 millones de pesos colombianos.

  • En la zona sur, los mismos factores tienen un impacto similar en los precios, pero las estimaciones sugieren precios más altos en comparación con la zona norte. Según el modelo, para una casa en la zona sur con las mismas especificaciones que la empresa sugiere según sus características (), se espera que cueste aproximadamente 570 millones de pesos colombianos.

Estas conclusiones, resumen las diferencias clave en los precios de viviendas entre las dos zonas y proporcionan estimaciones específicas para las propiedades en cada área. Esto ayudará a la empresa a tomar decisiones informadas al seleccionar viviendas para sus empleados en la ciudad.