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 |
Pasos requeridos para la obtención de los resultados
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?).
#head(vivienda,10)
knitr::kable(head(vivienda,5),align="ccccccccccccccc" , caption = "Base de Datos Vivienda") %>%
kable_styling(font_size = 10)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
Se realiza limpieza de datos longitud , latitud
head(base_1,3)
base_total <- vivienda[!is.na(vivienda$latitud) & !is.na(vivienda$longitud), ]
knitr::kable(head(base_total,5),align="ccccccccccccccc" , caption = "Base de Datos Vivienda") %>%
kable_styling(font_size = 10)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
En esta gráfica miramos como se traslapan las viviendas de las Zona
Norte con otras zonas
leaflet() %>% addTiles() %>%
setView(lng = -76.52, lat = 3.44, zoom = 12) %>% # Centrar
addCircleMarkers(
lng = base_total$longitud,
lat = base_total$latitud,
popup = as.character(paste0(base_total$zona, " Tipo:", base_total$tipo, " Estrato:", base_total$estrato, " Precio:", base_total$preciom, "'000.000", " Pisos:", base_total$piso)),
stroke = FALSE,
fillOpacity = 1,
radius = 4,
fillColor = colorFactor(palette = "Set1", domain = base_total$zona)(base_total$zona)
)
Para el estudio de las casas en el caso de los nulos se les imputa la
media a los valores nulos en el campo “piso” y
“parqueaderos”
base_casas <- subset(base_total, tipo == "Casa" )
base_1 <- subset(base_total, tipo == "Casa" & zona == "Zona Norte")
#Realizamos una inputación de nulos a pisos ya que se va utilizar en el
#analisis del punto 2
#la variable piso no se necestia en el modelo por eso no se realiza inputacion solo la realizamos para parqueadores
#sacamos la media
media_parqueaderos <- round(mean(as.numeric(base_1$parqueaderos), na.rm = TRUE))
#asignamos la media
base_1$parqueaderos[is.na(base_1$parqueaderos)] <- media_parqueaderos
#connversion tipo numerico
base_1$parqueaderos<- as.numeric(base_1$parqueaderos)
knitr::kable(head(base_1,3),align="ccccccccccccccc" , caption = "Base 1") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
4057 | Zona Norte | 02 | 6 | 750 | 445 | 2 | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
Validamos los nulos
nulos_por_columna <- colSums(is.na(base_1))
# Mostrar el resultado en forma vertical
for (i in 1:length(nulos_por_columna)) {
cat(names(nulos_por_columna)[i], ": ", nulos_por_columna[i], "\n")
}
## id : 0
## zona : 0
## piso : 372
## estrato : 0
## preciom : 0
## areaconst : 0
## parqueaderos : 0
## banios : 0
## habitaciones : 0
## tipo : 0
## barrio : 0
## longitud : 0
## latitud : 0
Visualizamos la distribución de las viviendas
leaflet() %>% addTiles() %>%
setView(lng = -76.52, lat = 3.44, zoom = 12) %>% # Centrar
addCircleMarkers(
lng = base_1$longitud,
lat = base_1$latitud,
popup = as.character(paste0(base_1$zona, " Tipo:", base_1$tipo, " Estrato:", base_1$estrato, " Precio:", base_1$preciom, "'000.000", " Pisos:", base_1$piso)),
stroke = FALSE,
fillOpacity = 1,
radius = 4,
color="blue"
)
Error en datos : puede tener errrores en la adjudicación de la zona a la respectiva vivienda , puede ser un error en la digitación o desactualización de las zonas de Cali as mismo puede ser otro error en digitación el longitud y latitud
2. Realice un análisis exploratorio de datos enfocado en la
correlación entre la variable respuesta (precio del apartamento) en
función del área construida, estrato, numero de baños, numero de
habitaciones y zona donde se ubica la vivienda. Use gráficos
interactivos con el paquete plotly
e interprete los
resultados.
Histograma Precio
# Calcular la media y la mediana
media_precio <- mean(base_1$preciom)
mediana_precio <- median(base_1$preciom)
#Histograma
histograma_precio <- plot_ly(data = base_1, x = ~preciom, type = "histogram", marker = list(color = "green")) %>%
layout(title = "Histograma Precio de Casas")
histograma_precio
media_precio
## [1] 445.9058
mediana_precio
## [1] 390
Los precios varian en diferentes rango, la media del precio para la Zona Norte en Casas es de 445 millones y la mediana es 390 millones
Histograma Area Construida
# Calcular la media y la mediana
media_areaconst <- mean(base_1$areaconst)
mediana_areaconst <- median(base_1$areaconst)
#Histograma
histograma_areaconst <- plot_ly(data = base_1, x = ~areaconst, type = "histogram", marker = list(color = "blue"),name="Area Construida") %>%
layout(title = "Histograma Area Construida en Casas")
histograma_areaconst
media_areaconst
## [1] 264.8505
mediana_areaconst
## [1] 240
El area construida varian en diferentes rango, la media del area para la Zona Norte en Casas es de 264 m2 y la mediana es 240 m2 , los valores son cercanos entre la media y la mediana
ggplot(base_1, aes(x = areaconst, y = preciom)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(x = "Área Construida", y = "Precio", title = "Correlación entre Área Construida y Precio en Casas")
## `geom_smooth()` using formula = 'y ~ x'
Se puede observar que a media que aumenta el area construida aumenta el precio del tipo Casa en esta zona Norte, a medida que aumenta el precio se va dispensando como se puede apreciar cuando el area mide mas de 500 m2
Histograma Baños
# Calcular la media y la mediana
media_banios <- mean(base_1$banios)
mediana_banios <- median(base_1$banios)
#Histograma
histograma_banios <- plot_ly(data = base_1, x = ~banios, type = "histogram", marker = list(color = "pink"),name="banio") %>%
layout(title = "Histograma Baños en Casas")
histograma_banios
media_banios
## [1] 3.555402
mediana_banios
## [1] 3
Los baños de la viviendas analizados para la Zona Norte en Casas es de 3 baños igual a la mediana , y estan dentro del rango de el primer cuartil 2 baños y tercel cuartil 4 baños
ggplot(base_1, aes(x = factor(banios), y = preciom, fill = factor(banios))) +
geom_boxplot() +
labs(x = "Cantidad de Baños", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Baños en Casas") +
scale_fill_discrete(name = "Cantidad de Baños")
La cantidad de baños sigue una tendencia creciente a medida que el precio aumenta, sin embaro apreciamos informacion done no existen baños ,puede ser un error en la inscripción de los datos.
Histograma Habitaciones
# Calcular la media y la mediana
media_habitaciones <- mean(base_1$habitaciones)
mediana_habitaciones <- median(base_1$habitaciones)
#Histograma
histograma_habitaciones <- plot_ly(data = base_1, x = ~habitaciones, type = "histogram", marker = list(color = "blue")) %>%
layout(title = "Histograma Habitaciones en Casas")
histograma_habitaciones
media_habitaciones
## [1] 4.506925
mediana_habitaciones
## [1] 4
Las habitaciones de las viviendas analizadas para la Zona Norte en Casas es de 4 habitaciones igual a la mediana , y estan dentro del rango de el primer cuartil 3 habitaciones y tercel cuartil 5 habitaciones
ggplot(base_1, aes(x = factor(habitaciones), y = preciom, fill = factor(habitaciones))) +
geom_boxplot() +
labs(x = "Cantidad de Habitaciones", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Habitaciones") +
scale_fill_discrete(name = "Cantidad de Habitaciones en Casas")
En le boxplot el numero de habitaciones no es tan notable una tendencia según su cantidad.
Distribución Zonas en Viviendas tipo Casa
La distribución del tipo de vivienda Casas , para nuestro caso de estudio la Zona Norte en segunda posicion contiene un 22.9% del total de la población estudiada de casas.
plot_ly(base_casas, labels = ~zona, type = 'pie') %>%
layout(title = "Distribución de zona si la vivienda es Casa")
Análisis de Correlación
summary(base_1)
## id zona piso estrato
## Min. : 58.0 Length:722 Length:722 Min. :3.000
## 1st Qu.: 766.2 Class :character Class :character 1st Qu.:3.000
## Median :2257.0 Mode :character Mode :character Median :4.000
## Mean :2574.6 Mean :4.202
## 3rd Qu.:4225.0 3rd Qu.:5.000
## Max. :8319.0 Max. :6.000
## preciom areaconst parqueaderos banios
## Min. : 89.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 261.2 1st Qu.: 140.0 1st Qu.: 2.000 1st Qu.: 2.000
## Median : 390.0 Median : 240.0 Median : 2.000 Median : 3.000
## Mean : 445.9 Mean : 264.9 Mean : 2.109 Mean : 3.555
## 3rd Qu.: 550.0 3rd Qu.: 336.8 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1940.0 Max. :1440.0 Max. :10.000 Max. :10.000
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:722 Length:722 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.53
## Median : 4.000 Mode :character Mode :character Median :-76.52
## Mean : 4.507 Mean :-76.52
## 3rd Qu.: 5.000 3rd Qu.:-76.50
## Max. :10.000 Max. :-76.47
## latitud
## Min. :3.333
## 1st Qu.:3.452
## Median :3.468
## Mean :3.460
## 3rd Qu.:3.482
## Max. :3.496
knitr::kable(head(base_1),align="ccccccccccccccc" , caption = "Base 1") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
4057 | Zona Norte | 02 | 6 | 750 | 445 | 2 | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
4460 | Zona Norte | 02 | 4 | 625 | 355 | 3 | 5 | 5 | Casa | acopi | -76.53179 | 3.40590 |
6081 | Zona Norte | 02 | 5 | 750 | 237 | 2 | 6 | 6 | Casa | acopi | -76.54044 | 3.36862 |
7824 | Zona Norte | 02 | 4 | 600 | 160 | 1 | 4 | 5 | Casa | acopi | -76.55210 | 3.42125 |
library(corrplot)
correlacion<-round(cor(base_1[,c("preciom","areaconst","estrato","banios","habitaciones")]), 2)
corrplot(correlacion, method="number", type="upper")
La tabla de correlación por medio de la libreria corrplot nos muestra la relación de las variables numericas, para nuestro análisis vamos a validar la clase de correlación de la variable y (precionm) contra las diferentes X, dentro de gráfica se puede observar lo siguiente:
Existe una correlacion moderada positiva entre la variable “preciom” y “areaconst” del 0.73, lo que quiere decir es que a mayor área construida, mayor precio.
Existe una correlacion moderada positiva entre la variable “preciom” y “estrato” del 0.61, lo que quiere decir es que a mayor sea el estrato, mayor es el precio.
Existe una correlacion moderada positiva entre la variable “preciom” y “baños” del 0.52, lo que quiere decir es que a mayor sea la cantidad de baños sea mayor es el precio.
Entre las variables preciom y habitaciones hay una correlación debil de 0.32
3.Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero 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).
modelo = lm(preciom~areaconst+estrato+habitaciones+parqueaderos+banios, data = base_1)
summary(modelo)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -924.94 -77.71 -17.66 45.90 1081.29
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -251.05177 30.11848 -8.335 3.94e-16 ***
## areaconst 0.81090 0.04352 18.634 < 2e-16 ***
## estrato 84.61108 7.17727 11.789 < 2e-16 ***
## habitaciones 0.95948 4.10569 0.234 0.81529
## parqueaderos 16.55976 5.70396 2.903 0.00381 **
## banios 24.57669 5.35583 4.589 5.26e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 158.2 on 716 degrees of freedom
## Multiple R-squared: 0.6548, Adjusted R-squared: 0.6524
## F-statistic: 271.6 on 5 and 716 DF, p-value: < 2.2e-16
Modelo seria el siguiente :
Y= -251.05 +0.81X1+84.61X2+0.95X3+16.55X4 +24.57X5
B0 (intercepto) es significativo ya que si se compara con α= 0.05 con p-value=3.94e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es-251.05
B1 (areaconst) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B1=0.81 lo que quiere decir es que por cada metro cuadrado construido aumentaría 0.81 millones de pesos si las demás variables equivalen a cero
B2 (estrato) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=84.6 lo que quiere decir es que por cada estrato más alto, aumenta 84 millones de pesos si las demás variables equivalen a cero
B3 (habitaciones) No es significativo ya que si se compara con α= 0.05 con p-value=0.81 NO se rechaza la hipótesis nula , B3=0.95 lo que quiere decir es que a medida de que aumenta las habitaciones, aumentaría 0.95 millones de pesos
B4 (parqueadores) es significativo ya que si se compara con α= 0.05 con p-value=0.00381, se rechaza la hipótesis nula , B4=16.5 lo que quiere decir es que por cada parqueadero, aumentaría 16.5 millones de pesos si las demás variables equivalen a cero
B5 (banios) es significativo ya que si se compara con α= 0.05 con p-value=5.26e-06, se rechaza la hipótesis nula , B5=24.5 lo que quiere decir es que por cada baño, aumentaría 24.5 millones de pesos si las demás variables equivalen a cero
R2 0.6548 lo que intepreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo
R2 Ajustado 0.6524 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2
A continuación se va a seleccionar las variables independientes que si aportan al modelo , vamos hacer un modelo de seleccion por pasos con el paquete “MASS” con la función “stepAIC”
seleccion=stepAIC(modelo,direction=c("both"))
## Start: AIC=7318.44
## preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios
##
## Df Sum of Sq RSS AIC
## - habitaciones 1 1367 17926987 7316.5
## <none> 17925620 7318.4
## - parqueaderos 1 211017 18136636 7324.9
## - banios 1 527174 18452794 7337.4
## - estrato 1 3479343 21404963 7444.5
## - areaconst 1 8693418 26619038 7601.9
##
## Step: AIC=7316.49
## preciom ~ areaconst + estrato + parqueaderos + banios
##
## Df Sum of Sq RSS AIC
## <none> 17926987 7316.5
## + habitaciones 1 1367 17925620 7318.4
## - parqueaderos 1 211907 18138894 7323.0
## - banios 1 758683 18685670 7344.4
## - estrato 1 3653015 21580002 7448.4
## - areaconst 1 9180206 27107193 7613.0
summary(seleccion)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios,
## data = base_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -923.02 -77.48 -17.46 45.35 1083.51
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -248.00942 27.14165 -9.138 < 2e-16 ***
## areaconst 0.81313 0.04244 19.162 < 2e-16 ***
## estrato 84.21240 6.96698 12.087 < 2e-16 ***
## parqueaderos 16.59030 5.69870 2.911 0.00371 **
## banios 25.22467 4.57920 5.509 5.05e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 158.1 on 717 degrees of freedom
## Multiple R-squared: 0.6548, Adjusted R-squared: 0.6528
## F-statistic: 340 on 4 and 717 DF, p-value: < 2.2e-16
Con lo anterior el modelo seleccionado “modelo2var” tendria la siguiente forma
modelo2var =lm(preciom~areaconst+estrato+parqueaderos+banios, data = base_1)
summary(modelo2var)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios,
## data = base_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -923.02 -77.48 -17.46 45.35 1083.51
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -248.00942 27.14165 -9.138 < 2e-16 ***
## areaconst 0.81313 0.04244 19.162 < 2e-16 ***
## estrato 84.21240 6.96698 12.087 < 2e-16 ***
## parqueaderos 16.59030 5.69870 2.911 0.00371 **
## banios 25.22467 4.57920 5.509 5.05e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 158.1 on 717 degrees of freedom
## Multiple R-squared: 0.6548, Adjusted R-squared: 0.6528
## F-statistic: 340 on 4 and 717 DF, p-value: < 2.2e-16
Al comparar los dos modelos se ve lo siguiente:
El Error residual se redujo de 158.2 a 158.1.
R2 0.6548 lo que intepreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo
R2 ajustado el modelo aumento a 0.6528 el modelo anterior daba 0.6524 , es decir explica 65.28% aportan ala variabilidad
B0 (intercepto) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es-248
B1 (areaconst) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B1=0.81 lo que quiere decir es que por cada metro cuadrado construido aumentaría 0.81 millones de pesos si las demás variables equivalen a cero
B2 (estrato) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=84.21 lo que quiere decir es que por cada estrato más alto, aumenta 84.21 millones de pesos si las demás variables equivalen a cero
B3 (parqueadores) es significativo ya que si se compara con α= 0.05 con p-value=0.00371, se rechaza la hipótesis nula , B3=16.59 lo que quiere decir es que por cada parqueadero, aumentaría 16.59 millones de pesos si las demás variables equivalen a cero
B4 (banios) es significativo ya que si se compara con α= 0.05 con p-value=5.05e-06, se rechaza la hipótesis nula , B4=25.22 lo que quiere decir es que por cada baño, aumentaría 25.22 millones de pesos si las demás variables equivalen a cero
anova_modelo2=aov(modelo2var)
summary(anova_modelo2)
## Df Sum Sq Mean Sq F value Pr(>F)
## areaconst 1 27773710 27773710 1110.83 < 2e-16 ***
## estrato 1 5069012 5069012 202.74 < 2e-16 ***
## parqueaderos 1 397712 397712 15.91 7.34e-05 ***
## banios 1 758683 758683 30.34 5.05e-08 ***
## Residuals 717 17926987 25003
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A continuación se puede ver la significancia de la regresión, por medio de la prueba F la cual es la prueba de hipotesis cOmo tenemos 4 variables, tenemos 4 hipotesis.
Variable 1(areaconst )H0: B1 = 0, H1: B1 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el area contruida si es significativa para el modelo de regresión.
Variable 2(estrato )H0: B2 = 0, H1: B2 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el estrato si es significativa para el modelo de regresión.
Variable 3(parqueaderos)H0: B3 = 0, H1: B3 <> 0 , pR(>f)< 7.34e-05 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el parqueadero si es significativa para el modelo de regresión.
Variable 4(banios)H0: B4 = 0, H1: B4 <> 0 , pR(>f)< 5.05e-08 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , los baños son significativos para el modelo de regresión.
Con esto confirmamos que todas las variables aportan al modelo de regresión lineal múltiple por lo cual se mantiene el modelo donde explicaria el precio del tipo de vivienda Casa en la zona Norte
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(modelo2var, pch=16)
El grafico Residuals Se puede apreciar que tiene valores que se van abriendo al final logrando visualizar atipicos como son 208, 513 ,632
El grafico Q-Q plot muestra en el lado derecho hay una desviación lo que puede hacer que no halla normalidad
El grafico de Residuals vs Leverage se puede apreciar que solo hay un dato que se sale de las bandas , por lo cual es poco probable que afecte las estimaciones
Supuesto de normalidad Jarque
# Prueba Jarque -Bera
#h0 Normalidad (a=0,k=3)
#h1 No hay Normalidad
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
jarque.bera.test(resid(modelo2var))
##
## Jarque Bera Test
##
## data: resid(modelo2var)
## X-squared = 3514.8, df = 2, p-value < 2.2e-16
H0 provienen de una poblacion normal com media igual a 0
H1 no provienen de una poblacion normal con media igual a 0
El valor P de la prueba es menor a 0.05 se descarta H0 , por lo cual no hay normalidad en los residuales y las pruebas de hipótesis no es confiable
Supuesto de normalidad Shapiro
residual=shapiro.test(resid(modelo2var))
residual
##
## Shapiro-Wilk normality test
##
## data: resid(modelo2var)
## W = 0.83408, p-value < 2.2e-16
H0 provienen de una poblacion normal com media igual a 0
H1 no provienen de una poblacion normal con media igual a 0
El valor P es menor a 00.5 se descarta la H0 por lo cual se acepta H1 no proviene de una distribucion normal
Supuesto varianza constante o de Homocedasticidad
varianza_cons=bartlett.test(list(base_1$preciom ,base_1$areaconst,base_1$estrato,base_1$parqueaderos,base_1$banios))
varianza_cons
##
## Bartlett test of homogeneity of variances
##
## data: list(base_1$preciom, base_1$areaconst, base_1$estrato, base_1$parqueaderos, base_1$banios)
## Bartlett's K-squared = 19533, df = 4, p-value < 2.2e-16
H0 =varianza 1= varianza 2 = varianza j = cte
H1 =varianza 1 <> varianza 2 <> varianza j <> cte
como p-value <0.05 se rechaza la hipotesis nula se acepta H1
La hipotesis alterna la varianza no es constante , lo cual sugiere un problema con las observaciones
Supuesto de independencia
La prueba de este supuesto se conoce como autocorrelacion , lo que se espera a manera grafica es ver una dispersión sin patron para validar su independencia
#grafico residual
res_indep<- resid(modelo2var)
plot(res_indep)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
dwtest(modelo2var ,alternative ="greater")
##
## Durbin-Watson test
##
## data: modelo2var
## DW = 1.6319, p-value = 2.995e-07
## alternative hypothesis: true autocorrelation is greater than 0
H0 = Independencia
H1 = Dependencia
El p valor es menor a 0.05 de significancia, por lo cual se rechaza la hipótesis nula y se acepta la alternativa
5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Predicción Estrato 4
predict(modelo2var, data.frame(areaconst=200, estrato=4, parqueaderos=1, banios=2 ),interval = "confidence")
## fit lwr upr
## 1 318.505 299.4819 337.5282
Para una vivienda de tipo Casa en la Zona Norte estrato 4 , el valor promedio es de 318 millones , como minimo 299 millones y por maximo 338 millones.
Predicción Estrato 5
predict(modelo2var, data.frame(areaconst=200, estrato=5, parqueaderos=1, banios=2 ),interval = "confidence")
## fit lwr upr
## 1 402.7174 377.644 427.7908
Para una vivienda de tipo Casa en la Zona Norte estrato 5 , el valor promedio es de 402 millones , como minimo 377 millones y por maximo 428 millones.
6. 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.
credito_aprob <- 350
#Se toma la base utilizada que ya filtra Zona Norte y Casa
oferta_casa <- subset(base_1 , areaconst >= 200 & parqueaderos >=1 &
banios >= 2 & habitaciones >= 4 & estrato >= 4) %>%
mutate(precio = predict(modelo2var, .)) %>%
filter(precio <= credito_aprob)
#Se ordena por el area construida
oferta_casa <- oferta_casa[order(-oferta_casa$areaconst), ]
oferta_casa <- head(oferta_casa,5)
knitr::kable(oferta_casa,align="ccccccccccccccc" , caption = "Ofertas Casas") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | precio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1222 | Zona Norte | 02 | 4 | 360 | 216 | 2 | 2 | 4 | Casa | la merced | -76.5139 | 3.48386 | 348.1054 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.5159, lat = 3.499, zoom = 13) %>%
addCircleMarkers(lng = oferta_casa$longitud,
lat = oferta_casa$latitud,
label = as.character(paste0(oferta_casa$tipo, " est:", oferta_casa$estrato, " Precio:",oferta_casa$preciom, "'000.000", " Pisos:", oferta_casa$piso, " Parqueaderos: ", oferta_casa$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = 'blue'
)
1. Realice un filtro a la base de datos e incluya solo las ofertas de : base2: Apartamentos, de la zona sur 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?).
Filtramos la base total la cual ya tenia limpieza dela informacion de los nulos
base_aptos <- subset(base_total, tipo == "Apartamento" )
knitr::kable(head(base_aptos),align="ccccccccccccccc" , caption = "Base Apartamentos") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
1724 | Zona Norte | 01 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
2326 | Zona Norte | 01 | 4 | 220 | 52 | 2 | 2 | 3 | Apartamento | acopi | -76.51974 | 3.42627 |
4386 | Zona Norte | 01 | 5 | 310 | 137 | 2 | 3 | 4 | Apartamento | acopi | -76.53105 | 3.38296 |
7497 | Zona Norte | 02 | 6 | 520 | 98 | 2 | 2 | 2 | Apartamento | acopi | -76.54999 | 3.43505 |
5424 | Zona Norte | 03 | 4 | 320 | 108 | 2 | 3 | 3 | Apartamento | acopi | -76.53638 | 3.40770 |
base_2 <- subset(base_aptos, zona == "Zona Sur")
knitr::kable(head(base_2),align="ccccccccccccccc" , caption = "Base Apartamentos Zona Sur") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
---|---|---|---|---|---|---|---|---|---|---|---|---|
5098 | Zona Sur | 05 | 4 | 290 | 96 | 1 | 2 | 3 | Apartamento | acopi | -76.53464 | 3.44987 |
698 | Zona Sur | 02 | 3 | 78 | 40 | 1 | 1 | 2 | Apartamento | aguablanca | -76.50100 | 3.40000 |
8199 | Zona Sur | NA | 6 | 875 | 194 | 2 | 5 | 3 | Apartamento | aguacatal | -76.55700 | 3.45900 |
1241 | Zona Sur | NA | 3 | 135 | 117 | NA | 2 | 3 | Apartamento | alameda | -76.51400 | 3.44100 |
5370 | Zona Sur | NA | 3 | 135 | 78 | NA | 1 | 3 | Apartamento | alameda | -76.53600 | 3.43600 |
6975 | Zona Sur | 06 | 4 | 220 | 75 | 1 | 2 | 3 | Apartamento | alférez real | -76.54627 | 3.39109 |
#Realizamos una inputación de nulos a pisos ya que se va utilizar en el
#analisis del punto 2
#sacamos la media
media_piso_aptos <- round(mean(as.numeric(base_2$piso), na.rm = TRUE))
media_parqueaderos_aptos <- round(mean(as.numeric(base_2$parqueaderos), na.rm = TRUE))
#asignamos la media
base_2$piso[is.na(base_2$piso)] <- media_piso_aptos
base_2$parqueaderos[is.na(base_2$parqueaderos)] <- media_parqueaderos_aptos
#connversion tipo numerico
base_2$piso<- as.numeric(base_2$piso)
base_2$parqueaderos<- as.numeric(base_2$parqueaderos)
Validamos nulos
nulos_por_columna_aptos <- colSums(is.na(base_2))
# Mostrar el resultado en forma vertical
for (i in 1:length(nulos_por_columna_aptos)) {
cat(names(nulos_por_columna_aptos)[i], ": ", nulos_por_columna_aptos[i], "\n")
}
## id : 0
## zona : 0
## piso : 0
## estrato : 0
## preciom : 0
## areaconst : 0
## parqueaderos : 0
## banios : 0
## habitaciones : 0
## tipo : 0
## barrio : 0
## longitud : 0
## latitud : 0
leaflet() %>% addTiles() %>%
setView(lng = -76.5159, lat = 3.4368, zoom = 12) %>% # Centrar
addCircleMarkers(
lng = base_2$longitud,
lat = base_2$latitud,
popup = as.character(paste0(base_1$zona, " Tipo:", base_2$tipo, " Estrato:", base_2$estrato, " Precio:", base_2$preciom, "'000.000", " Pisos:", base_2$piso)),
stroke = FALSE,
fillOpacity = 1,
radius = 4,
color="orange"
)
Error en datos : puede tener errrores en la adjudicación de la zona a la respectiva vivienda , puede ser un error en la digitación o desactualización de las zonas de Cali ,asi mismo puede ser otro error en digitación el longitud y latitud
2. Realice un análisis exploratorio de datos enfocado en la
correlación entre la variable respuesta (precio del apartamento) en
función del área construida, estrato, numero de baños, numero de
habitaciones y zona donde se ubica la vivienda. Use gráficos
interactivos con el paquete plotly
e interprete los
resultados.
Histograma Precio
# Calcular la media y la mediana
media_precio_apto <- mean(base_2$preciom)
mediana_precio_apto <- median(base_2$preciom)
#Histograma
histograma_precio_apto <- plot_ly(data = base_2, x = ~preciom, type = "histogram", marker = list(color = "green")) %>%
layout(title = "Histograma Precios de Apartamentos")
histograma_precio_apto
media_precio_apto
## [1] 297.2917
mediana_precio_apto
## [1] 245
Los precios varian en diferentes rango, la media del precio para la Zona Sur en Apartamentos es de 297 millones y la mediana es 245 millones
# Calcular la media y la mediana
media_area_apto <- mean(base_2$areaconst)
mediana_area_apto <- median(base_2$areaconst)
#Histograma
histograma_area_apto <- plot_ly(data = base_2, x = ~areaconst, type = "histogram", marker = list(color = "blue"),name="Area Construida")
histograma_area_apto
media_area_apto
## [1] 97.47028
mediana_area_apto
## [1] 85
El area construida cuando la vivienda e varian en diferentes rango, la media del area para la Zona Sur en Apartamento es de 97.47 m2 y la mediana es 85m2 , los valores son cercanos entre la media y la mediana
ggplot(base_2, aes(x = areaconst, y = preciom)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(x = "Área Construida", y = "Precio", title = "Correlación entre Área Construida y Precio en Apartamentos")
## `geom_smooth()` using formula = 'y ~ x'
Se puede observar que a media que aumenta el area construida aumenta el precio del tipo Apartamento en esta zona Sur, a medida que aumenta el precio se va dispersando mas el area especialmente apartir de aproximadamente de 200 m2
Histograma Baños
# Calcular la media y la mediana
media_banios_apto <- mean(base_2$banios)
mediana_banios_apto <- median(base_2$banios)
#Histograma
histograma_banios_apto <- plot_ly(data = base_2, x = ~banios, type = "histogram", marker = list(color = "pink"),name="banio") %>%
layout(title = "Histograma Baños en Apartamentos")
histograma_banios
media_banios_apto
## [1] 2.488339
mediana_banios_apto
## [1] 2
Los baños de la viviendas analizados para la Zona Sur en Apartamentos es de 2 baños igual a la mediana
ggplot(base_2, aes(x = factor(banios), y = preciom, fill = factor(banios))) +
geom_boxplot() +
labs(x = "Cantidad de Baños", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Baños en Apartamentos") +
scale_fill_discrete(name = "Cantidad de Baños")
En el Box Plot podemos apreciar que a medidas de que los apartamentos tiene mas baños aumenta el precio de la vivienda a comparación de las casas este tiene una tendencia más marcada.
Histograma de Habitaciones
# Calcular la media y la mediana
media_habita_apto <- mean(base_2$habitaciones)
mediana_habita_apto <- median(base_2$habitaciones)
#Histograma
histograma_habita_apto <- plot_ly(data = base_1, x = ~habitaciones, type = "histogram", marker = list(color = "blue")) %>%
layout(title = "Histograma Habitaciones en Apartamentos")
histograma_habita_apto
media_habita_apto
## [1] 2.965554
mediana_habita_apto
## [1] 3
Las habitaciones de las viviendas analizadas para la Zona Sur en Apartamentos es de 3 habitaciones igual a la mediana .
ggplot(base_2, aes(x = factor(habitaciones), y = preciom, fill = factor(habitaciones))) +
geom_boxplot() +
labs(x = "Cantidad de Habitaciones", y = "Precio", title = "Boxplot de Precio vs. Cantidad de Habitaciones") +
scale_fill_discrete(name = "Cantidad de Habitaciones en Apartamentos")
En le boxplot el número de habitaciones a medida que aumenta la cantidad de habitaciones aumenta el precio
Distribución Zonas en Viviendas tipo Apartamento
La distribución del tipo de vivienda Casas , para nuestro caso de estudio la Zona Sur encabeza la zona con 54.6% del total de la población estudiada de apartamentos , por lo cual se vuelve una zona mas factible para encontrar apartamentos de acuerdo alas necesidades del cliente
plot_ly(base_aptos, labels = ~zona, type = 'pie') %>%
layout(title = "Distribución de zona si la vivienda es Apartamento")
Análisis de Correlación
library(corrplot)
correlacion_apto<-round(cor(base_2[,c("preciom","areaconst","estrato","banios","habitaciones", "piso")]), 3)
corrplot(correlacion_apto, method="number", type="upper")
`La tabla de correlacion por medio de la libreria corrplot nos muestra la relación de las variables numericas, para nuestro análisis vamos a validar la clase de correlación de la variable y (preciom) contra las diferentes X, dentro de gráfica se puede observar lo siguiente:
Existe una correlacion fuerte positiva entre la variable “preciom” y “areaconst” del 0.76, lo que quiere decir es que a mayor área construida, mayor precio.
Existe una correlacion moderada positiva entre la variable “preciom” y “estrato” del 0.67, lo que quiere decir es que a mayor sea el estrato, mayor es el precio.
Existe una correlacion moderada positiva entre la variable “preciom” y “baños” del 0.72, lo que quiere decir es que a mayor sea la cantidad de baños sea mayor es el precio.
Entre las variables preciom y habitaciones hay una correlación debil de 0.33
3.Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, numero de cuartos, numero de parqueaderos, numero 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).
modelo_apto = lm(preciom~areaconst+estrato+habitaciones+parqueaderos+banios, data = base_2)
summary(modelo_apto)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1151.66 -37.75 -2.59 38.06 922.20
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -266.91089 12.89132 -20.705 < 2e-16 ***
## areaconst 1.36019 0.04843 28.084 < 2e-16 ***
## estrato 59.23620 2.66624 22.217 < 2e-16 ***
## habitaciones -17.89121 3.32828 -5.376 8.27e-08 ***
## parqueaderos 73.20959 3.65913 20.007 < 2e-16 ***
## banios 44.71978 2.98956 14.959 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared: 0.7648, Adjusted R-squared: 0.7643
## F-statistic: 1808 on 5 and 2781 DF, p-value: < 2.2e-16
B0 (intercepto) es significativo ya que si se compara con α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es -266.91
B1 (areaconst) es significativo ya que si se compara con α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula , B1= 1.36 lo que quiere decir es que por cada metro cuadrado construido aumentaría 1.36 millones de pesos si las demás variables equivalen a cero.
B2 (estrato) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=59.2 lo que quiere decir es que por cada estrato más alto, aumenta 59 millones de pesos si las demás variables equivalen a cero
B3 (habitaciones) es significativo ya que si se compara con α= 0.05 con p-value=8.27e-08 se rechaza la hipótesis nula , B3=-17.89 lo que quiere decir es que por cada habitación disminuye 17.89 millones de pesos
B4 (parqueadores) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 , se rechaza la hipótesis nula , B4=73.2 lo que quiere decir es que por cada parqueadero, aumentaría 73 millones de pesos si las demás variables equivalen a cero
B5 (banios) es significativo ya que si se compara con α= 0.05 con p-value=2e-16, se rechaza la hipótesis nula , B5=44.7 lo que quiere decir es que por cada baño, aumentaría 44 millones de pesos si las demás variables equivalen a cero
R2 0.7648 lo que intepreta como el 76.48% de las variaciones del precio son explicadas por las variables del modelo
R2 Ajustado 0.7643 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2.
A continuación se va a seleccionar las variables independientes que si aportan al modelo , vamos hacer un modelo de seleccion por pasos con el paquete “MASS” con la función “stepAIC”
seleccion_apto=stepAIC(modelo_apto,direction=c("both"))
## Start: AIC=25270.02
## preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios
##
## Df Sum of Sq RSS AIC
## <none> 24046940 25270
## - habitaciones 1 249861 24296801 25297
## - banios 1 1934830 25981770 25484
## - parqueaderos 1 3461298 27508239 25643
## - estrato 1 4268103 28315044 25723
## - areaconst 1 6819946 30866886 25964
summary(seleccion_apto)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = base_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1151.66 -37.75 -2.59 38.06 922.20
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -266.91089 12.89132 -20.705 < 2e-16 ***
## areaconst 1.36019 0.04843 28.084 < 2e-16 ***
## estrato 59.23620 2.66624 22.217 < 2e-16 ***
## habitaciones -17.89121 3.32828 -5.376 8.27e-08 ***
## parqueaderos 73.20959 3.65913 20.007 < 2e-16 ***
## banios 44.71978 2.98956 14.959 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared: 0.7648, Adjusted R-squared: 0.7643
## F-statistic: 1808 on 5 and 2781 DF, p-value: < 2.2e-16
Con lo anterior la seleccionar el paquete MASS se puede apreciar que el modelo incial no tiene modificaciones ya que no exceptua ninguna de las variable
Intervalos de confianza
Se crean los intervalos y se le asigna el nivel de confianza
intervalos=predict(modelo_apto,interval="confidence",level=0.95)
head(intervalos,10)
## fit lwr upr
## 1 209.58759 204.68024 214.49493
## 2 47.35223 38.46923 56.23523
## 3 668.72743 657.04338 680.41149
## 4 178.91535 169.76342 188.06728
## 5 81.14820 71.90969 90.38671
## 6 181.02362 176.51411 185.53312
## 7 190.91643 179.78321 202.04964
## 8 112.26609 104.30481 120.22737
## 9 116.55541 106.67867 126.43214
## 10 193.26532 188.68632 197.84431
anova_modelo_apto=aov(modelo_apto)
summary(anova_modelo_apto)
## Df Sum Sq Mean Sq F value Pr(>F)
## areaconst 1 58732885 58732885 6792.388 <2e-16 ***
## estrato 1 12599342 12599342 1457.099 <2e-16 ***
## habitaciones 1 234 234 0.027 0.869
## parqueaderos 1 4908634 4908634 567.678 <2e-16 ***
## banios 1 1934830 1934830 223.761 <2e-16 ***
## Residuals 2781 24046940 8647
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A continuación se puede ver la significancia de la regresión, por medio de la prueba F la cual es la prueba de hipotesis como tenemos 5 variables, tenemos 5 hipótesis.
Variable 1(areaconst )H0: B1 = 0, H1: B1 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el area contruida si es significativa para el modelo de regresión.
Variable 2(estrato )H0: B2 = 0, H1: B2 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el estrato si es significativa para el modelo de regresión.
Variable 3(habitaciones)H0: B3 = 0, H1: B3 <> 0 , pR(>f)> 0.869 es evidentemente mayor a 0.05 , por lo cual se acepta la hipotesis nula , la cantidad de habitaciones no son significativas para el modelo de regresión.
Variable 4(parqueaderos)H0: B3 = 0, H1: B3 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , el parqueadero si es significativa para el modelo de regresión.
Variable 5(banios)H0: B4 = 0, H1: B4 <> 0 , pR(>f)< 2e-16 es evidentemente menor a 0.05 , por lo cual rechazamos la hipotesis nula , los baños son significativos para el modelo de regresión.
Con la prueba anterior descartamos la variable habitaciones ya que no aporta al modelo de regresion lineal multiple
modelo2var_apto =lm(preciom~areaconst+estrato+parqueaderos+banios, data = base_2)
summary(modelo2var_apto)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios,
## data = base_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1109.27 -37.72 -2.73 36.70 934.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -310.70124 10.04119 -30.94 <2e-16 ***
## areaconst 1.31221 0.04784 27.43 <2e-16 ***
## estrato 60.97828 2.65971 22.93 <2e-16 ***
## parqueaderos 74.80319 3.66534 20.41 <2e-16 ***
## banios 38.76629 2.79074 13.89 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 93.45 on 2782 degrees of freedom
## Multiple R-squared: 0.7623, Adjusted R-squared: 0.762
## F-statistic: 2231 on 4 and 2782 DF, p-value: < 2.2e-16
B0 (intercepto) es significativo ya que si se compara con α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula en caso de que las demás variables fuera 0 el valor del intercepto es -310.7
B1 (areaconst) es significativo ya que si se compara con α= 0.05 con p-value= 2e-16 se rechaza la hipótesis nula , B1= 1.31 lo que quiere decir es que por cada metro cuadrado construido aumentaría 1.31 millones de pesos si las demás variables equivalen a cero.
B2 (estrato) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 se rechaza la hipótesis nula , B2=60.9 lo que quiere decir es que por cada estrato más alto, aumenta 60.9 millones de pesos si las demás variables equivalen a cero
B3 (parqueadores) es significativo ya que si se compara con α= 0.05 con p-value=2e-16 , se rechaza la hipótesis nula , B4=74.8 lo que quiere decir es que por cada parqueadero, aumentaría 74.8 millones de pesos si las demás variables equivalen a cero
B5 (banios) es significativo ya que si se compara con α= 0.05 con p-value=2e-16, se rechaza la hipótesis nula , B5=38.7 lo que quiere decir es que por cada baño, aumentaría 38.7millones de pesos si las demás variables equivalen a cero
R2 0.7623 lo que intepreta como el 76.23% de las variaciones del precio son explicadas por las variables del modelo
R2 Ajustado 0.762 Si alguna de las variables no aportan en terminos de variabilidad por eso disminuye en comparacion de R2.
Por lo cual nuevo modelo que explicaria el precio en el tipo de vivienda Apartamentos en la Zona Sur seria:
modelo2var_apto= -310.70 +1.31X1+60.97X2+74.8X3+38.76X4
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(modelo2var_apto, pch=16)
El grafico Residuals Se puede apreciar que tiene valores que se van abriendo al final logrando visualizar atipicos como son 1533, 2383
El grafico Q-Q plot muestra en el lado izquierdo donde inica hay una desviación hacia abajo , asi mismo ala drecha , lo que puede hacer que no halla normalidad
El grafico de Residuals vs Leverage se puede apreciar que solo hay un dato que se sale de las bandas , por lo cual es poco probable que afecte las estimaciones
Supuesto de normalidad Jarque
# Prueba Jarque -Bera
#h0 Normalidad (a=0,k=3)
#h1 No hay Normalidad
library(tseries)
jarque.bera.test(resid(modelo2var_apto))
##
## Jarque Bera Test
##
## data: resid(modelo2var_apto)
## X-squared = 86810, df = 2, p-value < 2.2e-16
H0 provienen de una poblacion normal com media igual a 0
H1 no provienen de una poblacion normal con media igual a 0
El valor P de la prueba es menor a 0.05 se descarta H0 , por lo cual no hay normalidad en los residuales y las pruebas de hipótesis no es confiable
Supuesto de normalidad Shapiro
residual_apto=shapiro.test(resid(modelo2var_apto))
residual_apto
##
## Shapiro-Wilk normality test
##
## data: resid(modelo2var_apto)
## W = 0.78303, p-value < 2.2e-16
H0 provienen de una poblacion normal com media igual a 0
H1 no provienen de una poblacion normal con media igual a 0
El valor P es menor a 00.5 se descarta la H0 por lo cual se acepta H1 no proviene de una distribucion normal.
Supuesto varianza constante o de Homocedasticidad
varianza_cons_apto=bartlett.test(list(base_2$preciom ,base_2$areaconst,base_2$estrato,base_2$parqueaderos,base_2$banios))
varianza_cons_apto
##
## Bartlett test of homogeneity of variances
##
## data: list(base_2$preciom, base_2$areaconst, base_2$estrato, base_2$parqueaderos, base_2$banios)
## Bartlett's K-squared = 77493, df = 4, p-value < 2.2e-16
H0 =varianza 1= varianza 2 = varianza j = cte
H1 =varianza 1 <> varianza 2 <> varianza j <> cte
como p-value <0.05 se rechaza la hipotesis nula se acepta H1
La hipotesis alterna la varianza no es constante , lo cual sugiere un problema con las observaciones
Supuesto de independencia
La prueba de este supuesto se conoce como autocorrelacion , lo que se espera a manera grafica es ver una dispersión sin patron para validar su independencia, en este modelo se ve un patron de una agromeración en linea recta
#grafico residual
res_indep_apto<- resid(modelo2var_apto)
plot(res_indep_apto)
library(lmtest)
dwtest(modelo2var_apto ,alternative ="greater")
##
## Durbin-Watson test
##
## data: modelo2var_apto
## DW = 1.5293, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Predicción Estrato 4
predict(modelo2var_apto, data.frame(areaconst=200, estrato=4, parqueaderos=1, banios=2 ),interval = "confidence")
## fit lwr upr
## 1 347.9895 335.3314 360.6476
Para una vivienda de tipo Apartamento en la Zona Sur estrato 4 , el valor promedio es de 347.9 millones , como minimo 335.3 millones y por maximo 360.6 millones.
Predicción Estrato 5
predict(modelo2var_apto, data.frame(areaconst=200, estrato=5, parqueaderos=1, banios=2 ),interval = "confidence")
## fit lwr upr
## 1 408.9678 396.3707 421.5649
Para una vivienda de tipo Apartamento en la Zona Sur estrato 5 , el valor promedio es de 408.9 millones , como minimo 396.3 millones y por maximo 421.5 millones.
6. 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 850 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
credito_aprob_apto=850
#Se toma la base utilizada que ya filtra Zona sur y tipo de vivienda apartamento
oferta_apto <- subset(base_2 , areaconst >= 300 & parqueaderos >=3 &
banios >= 3 & habitaciones >= 5 & estrato >= 5
)%>%
mutate(precio = predict(modelo2var_apto, .)) %>%
filter(precio <= credito_aprob_apto)
#Se ordena por el area construida
oferta_apto <- oferta_apto[order(-oferta_apto$areaconst), ]
oferta_apto <- head(oferta_apto,10)
knitr::kable(oferta_apto,align="ccccccccccccccc" , caption = "Ofetas Apartamentos") %>%
kable_styling(font_size = 12)
id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud | precio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7512 | Zona Sur | 4 | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | seminario | -76.55 | 3.409 | 806.094 |
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.551, lat = 3.4091, zoom = 17) %>%
addCircleMarkers(lng = oferta_apto$longitud,
lat = oferta_apto$latitud,
label = as.character(paste0(oferta_apto$tipo, " est:", oferta_apto$estrato, " Precio:",oferta_apto$preciom, "'000.000", " Pisos:", oferta_apto$piso, " Parqueaderos: ", oferta_apto$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = 'blue'
)
Conclusiones
Según nuestro análisis de datos para predecir el precio de la vivienda en casas y en apartamentos se toman las variables más significativas como son, área construida, estrato, parqueaderos, baños, por otro lado en ambos ejercicios el número de habitaciones no aportaba significativamente al modelo de predicción.
Para el estudio de tipo de vivienda “Casa” en la zona “Norte” el R2 0.6548 lo que interpreta como el 65.48% de las variaciones del precio son explicadas por las variables del modelo. R2 ajustado el modelo aumento a 0.6528 el modelo anterior daba 0.6524 , es decir explica 65.28% aportan a la variabilidad
Para el estudio de tipo de vivienda “Apartamento” en la zona “Sur” el R2 0.7623 lo que interpreta como el 76.23% de las variaciones del precio son explicadas por las variables del modelo, R2 Ajustado 0.762 Si alguna de las variables no aporta en términos de variabilidad por eso disminuye en comparación de R2.
En la validación de los supuestos se encuentra que no hay normalidad en los residuales, por lo cual la hipótesis no es confiable. así mismo se encuentra que la varianza no es constante lo que sugiere un problema con las observaciones
Oferta Casas: al realizar el análisis se encuentra una casa con valor de 348 millones en la Zona Norte, en el estrato 4 , 216 mt. cuadrados, 4 habitaciones, 2 baños y 2 parqueaderos, sería una buena oportunidad ya que el valor comercial es de 670 millones en un buen sector al lado de la carrera 56 con Calle 3 , sector residencial con múltiples zonas verdes.
Oferta Apartamentos: al realizar el análisis se encuentra una vivienda con valor de 806 millones en la Zona Sur, en el estrato 5 ,300 mts cuadrados , 6 habitaciones , 5 baños y 3 parqueaderos, sería una buena oportunidad ya que el valor comercial es de 360 millones en un buen sector al lado de la calle 52 con Avenida 3 , una zona residencial con buen acceso al transporte público.