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>
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.
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.
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.
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)
#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:
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
#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
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.
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
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:
\[\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.
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
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.
\[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.
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.
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
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.
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.
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)
#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:
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
#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
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.
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
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:
\[\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.
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
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.
\[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.
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.
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
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.