Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
Características Vivienda 1 Vivienda 2 Tipo Casa Apartamento área construida 200 300 parqueaderos 1 3 baños 2 3 habitaciones 4 5 estrato 4 o 5 5 o 6 zona Norte Sur crédito preaprobado 350 millones 850 millones
Se requiere realizar un análisis de datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de casas en la zona Norte para ayudar a María a responder la solicitud, mediante técnicas modelación.
La base de datos arroja 8322 observaciones de 13 variables: Id, zona, pisos, estrato, precio, area construida,parqueaderos, baños,habitaciones, tipo de vivienda, barrio, longitud y latitud.
####Pasos requeridos para la obtención de los resultados
#####Paso 1. Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).
library(paqueteMODELOS)
Cargando paquete requerido: boot
Cargando paquete requerido: broom
Warning: package 'broom' was built under R version 4.4.2
Cargando paquete requerido: GGally
Registered S3 method overwritten by 'GGally':
method from
+.gg ggplot2
Cargando paquete requerido: gridExtra
Cargando paquete requerido: knitr
Warning: package 'knitr' was built under R version 4.4.2
Cargando paquete requerido: summarytools
data(vivienda)
attach(vivienda)
head(vivienda,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>
Se crea un dataset nuevo sin la variable ruido que genera ruido y no es requerida en el analisis y se realiza la imputacion de la variable parqueadero que presenta valores 1605 datosfaltantes asumiendo que tienen o parqueaderos algunas casas y apartamentos
sapply(vivienda, function(x) sum(is.na(x)))
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
viviendaclean <- subset(vivienda, select = -c(piso))
viviendaclean$parqueaderos[is.na(viviendaclean$parqueaderos)] <- 0
Se unifica la codificacion de la variable tipo debido a que los registros de interes correspondientes a las casas estan codificados de 2 maneras: Casa y CASA
viviendaclean$tipo <- ifelse(viviendaclean$tipo=="Casa","CASA",ifelse(viviendaclean$tipo=="casa","CASA",viviendaclean$tipo))
Se crea el dataset solicitado base1 con los datos correspondientes a las casas de la zona norte lo que arroja 722 registros
base1 <- dplyr::filter(viviendaclean, tipo=="CASA" & zona=="Zona Norte")
nrow(base1)
[1] 722
cat(nrow(base1))
722
Se verifica que el dataset base 1 no tenga datos faltantes
sapply(base1, function(x) sum(is.na(x)))
id zona estrato preciom areaconst parqueaderos
0 0 0 0 0 0
banios habitaciones tipo barrio longitud latitud
0 0 0 0 0 0
table(base1$zona, base1$tipo)
CASA
Zona Norte 722
Se elabora mapa encontrando que no todos los registros se ubican en la zona norte lo que puede mostrar sesgos de seleccion e informacion en la toma de las observaciones de latitud y longitud, otra posibilidad puede deberse al cambio geografico y a la definicion actual de las zonas de la ciudad que contempla 6 zonas geograficas, en vez de las 4 de esta base de datos (no incluye las zonas:Zona Centro Histórico y Comercial y Zona Centro Geográfico).Para efectos del presente analisis solo se tendran en cuenta en el punto 6 los barrios que esten tipicados en la zona norte
Zona Norte: Para su definición, se tuvieron en cuenta aspectos como los sectores de las calles y carreras norte establecidos en la guía para la nomenclatura urbana de Santiago de Cali, pero también aquellos barrios y sectores que la comunidad reconoce como norte de la ciudad. Esta zona comprende el territorio que va desde la KR 1 entre la CL 1 OESTE hasta el separador vial ubicado entre las CL 25 y CL 26, vía por la cual se continúa hasta la KR 7, y desde este punto, siguiendo el trazado del corredor férreo hasta llegar a la CL 88, a partir de la cual, se continua hacia el norte por el límite del suelo urbano hasta finalizar en el punto de inicio en la KR 1.Se ajusta el datada set con un registro de 522 casas en la zona norte
base1 <- dplyr::filter(viviendaclean, tipo=="CASA" & zona=="Zona Norte" & banios>0 & habitaciones>0
& latitud>=3.4556 & longitud>=-76.5403)
library(DT)
Warning: package 'DT' was built under R version 4.4.2
datatable(base1, list(pageLength=3))
leaflet() %>% addCircleMarkers(lng=base1$longitud,lat=base1$latitud,radius= 0.2,label = base1$preciom) %>% addTiles()
# Filtrar solo las viviendas de la Zona Norte
zona_norte <- base1 %>% filter(zona == "Zona Norte")
# Definir límites esperados para la Zona Norte en Cali
lat_min_norte <- 3.33
lat_max_norte <- 3.50
lon_min_norte <- -76.55
lon_max_norte <- -76.45
# Identificar viviendas fuera del rango esperado
fuera_rango <- zona_norte %>%
filter(latitud < lat_min_norte | latitud > lat_max_norte |
longitud < lon_min_norte | longitud > lon_max_norte)
# Contar cuántos registros están fuera de los límites
n_fuerarango <- nrow(fuera_rango)
print(paste("Número de viviendas fuera de la zona esperada:", n_fuerarango))
[1] "Número de viviendas fuera de la zona esperada: 0"
####Paso2. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
Se efectua este paso en 2 partes, en la primera parte se realiza un analisis bivariado
Precio de la casa vs Area construida Precio de la casa vs Estrato
Precio de la casa vs Numero de baños, Precio de la casa vs Numero de
habitaciones
Precio de la casa vs Zona donde se ubica la vivienda (no se realizo
debido a que la base1 solo corresponde a la zona Norte que es el objeto
de interes del presente informe)
cor_data1 <- base1 %>%
select(preciom, areaconst, estrato, banios, habitaciones)
fig <- plot_ly(data = cor_data1, x = base1$preciom, y = base1$areaconst)
fig <- fig %>% layout(title = 'Precio vs Area construida', xaxis = list(title = 'Precio'), yaxis = list(title = 'Area construida'))
fig
No trace type specified:
Based on info supplied, a 'scatter' trace seems appropriate.
Read more about this trace type -> https://plotly.com/r/reference/#scatter
No scatter mode specifed:
Setting the mode to markers
Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
Se encuentra una relacion directamente proporcional entre el area construida y el precio con tendencia a una concentracion por debajo de los 460 m2 y los 600 millones de pesos
fig2 <- ggplot(base1, aes(x = preciom, y = banios, color = factor(estrato))) +
geom_jitter(width = 0.2) +
theme_minimal() +
labs(title = "Precio vs Número de Baños",
x = "Precio",
y = "Número de Baños",
color = "Estrato")
ggplotly(fig2)
Se encuentra una relacion entre precio y numero de baños, con una concentracion entre 2 y 5 baños por debajo de 750 millones para el estrato de interes (4 o 5).
plot_ly(base1, x = ~estrato, y = ~preciom, type = "box", color = ~factor(estrato)) %>%
layout(title = "Precio vs. Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio"))
Se encuentra una relacion entre el precio y el estrato con una concentracion entre estrato 4 y 5 por debajo de 750 millones. Los estrator 4 y 5 presentan mas datos atipicos al ser comparados con otros estratos
fig2 <- ggplot(base1, aes(x = preciom, y = habitaciones, color = factor(estrato))) +
geom_jitter(width = 0.2) +
theme_minimal() +
labs(title = "Precio vs Número de Habitaciones",
x = "Precio",
y = "Número de Habitaciones",
color = "Estrato")
ggplotly(fig2)
Se encuentra una relacion entre precio y numero de habitaciones, con una concentracion entre 2 y 6 habitaciones por debajo de 700 millones para el estrato de interes (4 o 5).
####Parte 2.Analisis de las correlaciones
cor_data <- base1 %>%
select(preciom, areaconst,estrato, banios, habitaciones) %>%
cor()
print(cor_data)
preciom areaconst estrato banios habitaciones
preciom 1.0000000 0.7419315 0.6113759 0.5549638 0.4209557
areaconst 0.7419315 1.0000000 0.4987112 0.5272118 0.4860610
estrato 0.6113759 0.4987112 1.0000000 0.4483985 0.1423496
banios 0.5549638 0.5272118 0.4483985 1.0000000 0.6110157
habitaciones 0.4209557 0.4860610 0.1423496 0.6110157 1.0000000
ggcorrplot(cor_data,
hc.order = TRUE,
type = "lower",
lab = TRUE)
Precio - Area construida: Tiene una correlacion positiva fuerte de 0.74, esto indica que a mayor area construida en m2 de una casa en la zona norte aumenta el costo, el grafico de dispersion correspondiente muestra esta relacion lineal. Precio - Estrato: Tiene una correlacion positiva medianamente fuerte de 0.61, a mayor estrato de la vivienda mayor precio Precio - Cantidad de baños: Tiene una correlacion positiva medianamente fuerte de 0.55, indica que a mayor cantidad de baños es mayorel precio de la casa. Precio - Cantidad de habitaciones: Tiene una correlacion positiva leve de 0.42, es una correlacion baja, a mayor cantidad de habitaciones, el precio de la casa es mas alto.
La variable zona no se utilizo pues las casas estan en la zona norte. La correlacion mas grande es el area construida y la de menos correlacion es la cantidad de habitaciones.Una hipotesis sobre esta ultima correlacion podria ser que las personas tiene predileccion por areas grandes para zonas comunes como jardin, terraza, sala o comedor.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo)
modelocasa=lm(preciom ~ areaconst + parqueaderos + banios + habitaciones + estrato, data=base1)
summary(modelocasa)
Call:
lm(formula = preciom ~ areaconst + parqueaderos + banios + habitaciones +
estrato, data = base1)
Residuals:
Min 1Q Median 3Q Max
-885.50 -64.57 -16.04 31.42 1118.73
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -180.83327 35.49236 -5.095 4.90e-07 ***
areaconst 0.73581 0.05215 14.109 < 2e-16 ***
parqueaderos 14.11769 4.69322 3.008 0.00276 **
banios 17.59657 6.45442 2.726 0.00662 **
habitaciones 8.36383 5.14403 1.626 0.10458
estrato 69.54350 8.68239 8.010 7.69e-15 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 145 on 516 degrees of freedom
Multiple R-squared: 0.6523, Adjusted R-squared: 0.6489
F-statistic: 193.6 on 5 and 516 DF, p-value: < 2.2e-16
Precio=−180.83327+0.73581(areaconst)+69.54350(estrato)+14.11769(parqueaderos)+17.59657(banios)+8.36383(habitaciones)
El R2 indica que en el modelo el precio es explicado en un 65% por las variables area construida, estrato, parqueaderos, baños y habitaciones,Esto sugiere que es necesario ajustar el modelo para obtener un mejor rendimiento teniendo en cuenta que el precio de la vivienda puede ser explicado por muchas variables y algunas de estas variables podrian no ser relevantes en el analisis de costos.La variable numero de habitaciones no presenta significancia estadistica para el modelo por lo cual se podria correr el modelo sin ella.
modelocasa=lm(preciom ~ areaconst + parqueaderos + banios + estrato, data=base1)
summary(modelocasa)
Call:
lm(formula = preciom ~ areaconst + parqueaderos + banios + estrato,
data = base1)
Residuals:
Min 1Q Median 3Q Max
-880.80 -62.89 -16.17 33.76 1134.44
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -151.39967 30.57721 -4.951 9.99e-07 ***
areaconst 0.76356 0.04936 15.470 < 2e-16 ***
parqueaderos 14.51840 4.69419 3.093 0.00209 **
banios 23.04606 5.52476 4.171 3.55e-05 ***
estrato 65.32252 8.29835 7.872 2.07e-14 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 145.2 on 517 degrees of freedom
Multiple R-squared: 0.6505, Adjusted R-squared: 0.6478
F-statistic: 240.6 on 4 and 517 DF, p-value: < 2.2e-16
El nuevo R2 es de 0.65 con este ajuste lo cual indica que el modelo podria omitirse la variable numero de habitaciones, en este ajuste se observa que las variables restantes presentan significancia estadistica para el modelo. Otra opcion podria ser realizar transformaciones a un modelo logaritmico pero esto podria sesgar los resultados al forzar el modelo. Una tercera opcion seria correr el modelo con otras variables que no esten contempladas: tipo de familia, cercania a centros comerciales, vias de acceso, seguridad en la zona, entre otras.
##Paso 4 Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
par(mfrow=c(2,2))
plot(modelocasa)
Se efectua la validacion de supuestos
a.Normalidad Ho los errores se distribuyen normal Ha Los errores NO se distribuyen normal
resmod = modelocasa$residuals
shapiro.test(resmod)
Shapiro-Wilk normality test
data: resmod
W = 0.77094, p-value < 2.2e-16
Como el valor p es menor que el alfa (0.05) acepta Ho, se asume que los errores tienen una distribucion normal
b.Independencia:Los errores son independientes
Ho los errores no estan autocorrelacionados Ha Los errores estan autocorrelacionados
dwtest(modelocasa)
Durbin-Watson test
data: modelocasa
DW = 1.8205, p-value = 0.01776
alternative hypothesis: true autocorrelation is greater than 0
Como el valor p es menor que el alfa (0.05) se rechaza Ho, se asume que los errores estan autocorrelacionados o sea que no se cumple el supuesto de independencia
c)Homoscedasticidad: Los errores presentan una varianza constante
Ho los errores tiene varianza constante Ha Los errores NO tiene varianza constante
gqtest(modelocasa)
Goldfeld-Quandt test
data: modelocasa
GQ = 1.057, df1 = 256, df2 = 256, p-value = 0.3288
alternative hypothesis: variance increases from segment 1 to 2
Como el valor p es mayor que el alfa (0.05) se rechaza Ho, se asume que los errores no tienen varianza constante
En conclusion el analisis de supuestos cumplen solo el supuesto de normalidad. Se sugiere validar el numero de supuestos cuando se corra el modelo ajustando las variables por ejemplo se podria correr sin la variable numero de habitaciones o numero de baños. Se propone efectuar un ACP con las variables numericas.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud
Características Vivienda 1 Tipo Casa área construida 200 parqueaderos 1 baños 2 habitaciones 4 estrato 4 o 5 zona Norte crédito preaprobado 350 millones
predict(modelocasa,list(areaconst = 200,parqueaderos = 1, banios = 2,
habitaciones = 4, estrato = 4))
1
323.2128
predict(modelocasa,list(areaconst = 200,parqueaderos = 1, banios = 2,
habitaciones = 4, estrato = 5))
1
388.5354
Con el credito preaprobado de 350 millones se sugiere una vivienda en estrato 4
Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
basecasa1=subset(base1, areaconst>=200 & preciom<=350 & habitaciones>=4 & estrato==4 & parqueaderos>=1 & banios >= 2)
basecasa1 = head(basecasa1,5)
basecasa1
# A tibble: 5 × 12
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 4458 Zona N… 4 315 270 2 4 4 CASA
2 937 Zona N… 4 350 280 2 3 4 CASA
3 952 Zona N… 4 330 275 2 3 5 CASA
4 1020 Zona N… 4 230 250 2 3 5 CASA
5 1108 Zona N… 4 330 260 1 3 4 CASA
# ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
De acuerdo al analisis se recomienda la zona norte de Cali con las siguientes caracteristicas: Mejor ubicación para vida nocturna, restaurantes & hoteles de lujo. Con epicentro en la Zona Rosa, el principal distrito de vida nocturna y restaurantes de la ciudad, el norte de Cali se compone de una sucesión de barrios residenciales y comerciales de alto nivel con muchos hoteles de lujo. El resultado arroja 4 resultados en el Barrio La Merced el cual se recomienda por sus elementos religiosos y culturales.Las opciones 3 y 4 tienen igual numero de baños, habitaciones y parqueaderos, se encuentran por las coordenadas muy cercanas entre si.
leaflet() %>% addCircleMarkers(lng=basecasa1$longitud,lat=basecasa1$latitud,radius= 0.2,label = basecasa1$preciom) %>% addTiles()