library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.2
## Warning: package 'tidyr' was built under R version 4.2.2
## Warning: package 'readr' was built under R version 4.2.2
## Warning: package 'purrr' was built under R version 4.2.2
## Warning: package 'dplyr' was built under R version 4.2.2
## Warning: package 'stringr' was built under R version 4.2.2
## Warning: package 'forcats' was built under R version 4.2.2
## Warning: package 'lubridate' was built under R version 4.2.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.0 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.1 ✔ tibble 3.1.8
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(Hmisc)
## Warning: package 'Hmisc' was built under R version 4.2.2
##
## Attaching package: 'Hmisc'
##
## The following objects are masked from 'package:dplyr':
##
## src, summarize
##
## The following objects are masked from 'package:base':
##
## format.pval, units
library("dplyr")
data = read.csv("C:/Users/franc/OneDrive/Escritorio/Maestria_Ciencia_Datos/Metodos_Estadisticos/ActividadMLM/datos_vivienda.csv")
summary(data)
## X id zona piso
## Min. : 1 Min. : 1 Length:8322 Min. : 1.000
## 1st Qu.:2081 1st Qu.:2080 Class :character 1st Qu.: 2.000
## Median :4162 Median :4160 Mode :character Median : 3.000
## Mean :4162 Mean :4160 Mean : 3.771
## 3rd Qu.:6242 3rd Qu.:6240 3rd Qu.: 5.000
## Max. :8322 Max. :8319 Max. :12.000
## NA's :3 NA's :2638
## estrato preciom areaconst parqueaderos
## Min. :3.000 Min. : 58.0 Min. : 30.0 Min. : 1.000
## 1st Qu.:4.000 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000
## Median :5.000 Median : 330.0 Median : 123.0 Median : 2.000
## Mean :4.634 Mean : 433.9 Mean : 174.9 Mean : 1.835
## 3rd Qu.:5.000 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000
## Max. :6.000 Max. :1999.0 Max. :1745.0 Max. :10.000
## NA's :3 NA's :2 NA's :3 NA's :1605
## banios habitaciones tipo barrio
## Min. : 0.000 Min. : 0.000 Length:8322 Length:8322
## 1st Qu.: 2.000 1st Qu.: 3.000 Class :character Class :character
## Median : 3.000 Median : 3.000 Mode :character Mode :character
## Mean : 3.111 Mean : 3.605
## 3rd Qu.: 4.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000
## NA's :3 NA's :3
## longitud latitud
## Min. :-76.59 Min. :3.333
## 1st Qu.:-76.54 1st Qu.:3.381
## Median :-76.53 Median :3.416
## Mean :-76.53 Mean :3.418
## 3rd Qu.:-76.52 3rd Qu.:3.452
## Max. :-76.46 Max. :3.498
## NA's :3 NA's :3
data$estrato = as.factor(data$estrato)
data$piso = as.factor(data$piso)
str(data)
## 'data.frame': 8322 obs. of 14 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ id : int 1147 1169 1350 5992 1212 1724 2326 4386 1209 1592 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : Factor w/ 12 levels "1","2","3","4",..: NA NA NA 2 1 1 1 1 2 2 ...
## $ estrato : Factor w/ 4 levels "3","4","5","6": 1 1 1 2 3 3 2 3 3 3 ...
## $ preciom : int 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: int 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : int 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: int 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
Se procede a ver comportamiento en registros con NAs en cada una de las variables
describe(data)
## data
##
## 14 Variables 8322 Observations
## --------------------------------------------------------------------------------
## X
## n missing distinct Info Mean Gmd .05 .10
## 8322 0 8322 1 4162 2774 417.1 833.1
## .25 .50 .75 .90 .95
## 2081.2 4161.5 6241.8 7489.9 7905.9
##
## lowest : 1 2 3 4 5, highest: 8318 8319 8320 8321 8322
## --------------------------------------------------------------------------------
## id
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 8319 1 4160 2773 416.9 832.8
## .25 .50 .75 .90 .95
## 2080.5 4160.0 6239.5 7487.2 7903.1
##
## lowest : 1 2 3 4 5, highest: 8315 8316 8317 8318 8319
## --------------------------------------------------------------------------------
## zona
## n missing distinct
## 8319 3 5
##
## lowest : Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## highest: Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##
## Value Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## Frequency 124 1920 1198 351 4726
## Proportion 0.015 0.231 0.144 0.042 0.568
## --------------------------------------------------------------------------------
## piso
## n missing distinct
## 5684 2638 12
##
## lowest : 1 2 3 4 5 , highest: 8 9 10 11 12
##
## Value 1 2 3 4 5 6 7 8 9 10 11
## Frequency 860 1450 1097 607 567 245 204 211 146 130 84
## Proportion 0.151 0.255 0.193 0.107 0.100 0.043 0.036 0.037 0.026 0.023 0.015
##
## Value 12
## Frequency 83
## Proportion 0.015
## --------------------------------------------------------------------------------
## estrato
## n missing distinct
## 8319 3 4
##
## Value 3 4 5 6
## Frequency 1453 2129 2750 1987
## Proportion 0.175 0.256 0.331 0.239
## --------------------------------------------------------------------------------
## preciom
## n missing distinct Info Mean Gmd .05 .10
## 8320 2 539 1 433.9 326.7 121 145
## .25 .50 .75 .90 .95
## 220 330 540 870 1200
##
## lowest : 58 62 65 69 70, highest: 1850 1900 1940 1950 1999
## --------------------------------------------------------------------------------
## areaconst
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 652 1 174.9 135.7 57 60
## .25 .50 .75 .90 .95
## 80 123 229 350 450
##
## lowest : 30 35 40 42 43, highest: 1440 1500 1586 1600 1745
## --------------------------------------------------------------------------------
## parqueaderos
## n missing distinct Info Mean Gmd .05 .10
## 6717 1605 10 0.846 1.835 1.039 1 1
## .25 .50 .75 .90 .95
## 1 2 2 3 4
##
## lowest : 1 2 3 4 5, highest: 6 7 8 9 10
##
## Value 1 2 3 4 5 6 7 8 9 10
## Frequency 3155 2475 520 384 68 68 18 17 4 8
## Proportion 0.470 0.368 0.077 0.057 0.010 0.010 0.003 0.003 0.001 0.001
## --------------------------------------------------------------------------------
## banios
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 11 0.935 3.111 1.525 1 2
## .25 .50 .75 .90 .95
## 2 3 4 5 6
##
## lowest : 0 1 2 3 4, highest: 6 7 8 9 10
##
## Value 0 1 2 3 4 5 6 7 8 9 10
## Frequency 45 496 2946 1993 1456 890 314 107 48 15 9
## Proportion 0.005 0.060 0.354 0.240 0.175 0.107 0.038 0.013 0.006 0.002 0.001
## --------------------------------------------------------------------------------
## habitaciones
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 11 0.87 3.605 1.4 2 2
## .25 .50 .75 .90 .95
## 3 3 4 5 7
##
## lowest : 0 1 2 3 4, highest: 6 7 8 9 10
##
## Value 0 1 2 3 4 5 6 7 8 9 10
## Frequency 66 59 926 4097 1729 679 318 173 138 83 51
## Proportion 0.008 0.007 0.111 0.492 0.208 0.082 0.038 0.021 0.017 0.010 0.006
## --------------------------------------------------------------------------------
## tipo
## n missing distinct
## 8319 3 2
##
## Value Apartamento Casa
## Frequency 5100 3219
## Proportion 0.613 0.387
## --------------------------------------------------------------------------------
## barrio
## n missing distinct
## 8319 3 436
##
## lowest : 20 de julio 3 de julio acopi agua blanca aguablanca
## highest: zona norte los zona oeste zona oriente zona residencial zona sur
## --------------------------------------------------------------------------------
## longitud
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 2928 1 -76.53 0.0193 -76.55 -76.55
## .25 .50 .75 .90 .95
## -76.54 -76.53 -76.52 -76.50 -76.50
##
## lowest : -76.58915 -76.58876 -76.58744 -76.58732 -76.58530
## highest: -76.46498 -76.46478 -76.46438 -76.46400 -76.46300
## --------------------------------------------------------------------------------
## latitud
## n missing distinct Info Mean Gmd .05 .10
## 8319 3 3679 1 3.418 0.04911 3.351 3.365
## .25 .50 .75 .90 .95
## 3.381 3.416 3.452 3.477 3.486
##
## lowest : 3.33300 3.33308 3.33324 3.33333 3.33367
## highest: 3.49659 3.49666 3.49684 3.49700 3.49770
## --------------------------------------------------------------------------------
Se puede ver que las variables “piso” y “parqueaderos” tienen datos faltantes en2638 y 1605 registros respectivamente.
Solución:
Se realiza filtro por “tipo” == “Casa” y por “zona” == “Zona Norte”
data1 <- filter(data, tipo == "Casa" & zona == "Zona Norte")
#Datos de los 3 primeros registros filtrados
data_casas_3 = data1[0:3,]
head(data_casas_3)
## X id zona piso estrato preciom areaconst parqueaderos banios
## 1 9 1209 Zona Norte 2 5 320 150 2 4
## 2 10 1592 Zona Norte 2 5 780 380 2 3
## 3 11 4057 Zona Norte 2 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
Construcción de análisis georeferenciado con la libreria “leaflet”
require(leaflet)
## Loading required package: leaflet
## Warning: package 'leaflet' was built under R version 4.2.2
leaflet() %>% addTiles() %>%
addCircleMarkers(lng = data_casas_3$longitud,
lat = data_casas_3$latitud)
Se evidencia que el tercer registro (id= 4057) aparece en la zona sur de la ciudad de Cali, despues de haber corroborado su ubicación en google maps, se puede ver que el error se debe a una mala clasificación de la zona para esta casa.
Solución:
construcción de datos con las variables a analizar y filtrando por tipo == “Casa”
data2 <- subset(data, tipo == "Casa" ,select = c(preciom,areaconst,estrato,banios,habitaciones,zona,parqueaderos))
data2$estrato = as.factor(data2$estrato)
data2$zona = as.factor(data2$zona)
head(data2,10)
## preciom areaconst estrato banios habitaciones zona parqueaderos
## 1 250 70 3 3 6 Zona Oriente 1
## 2 320 120 3 2 3 Zona Oriente 1
## 3 350 220 3 2 4 Zona Oriente 2
## 4 400 280 4 5 3 Zona Sur 3
## 9 320 150 5 4 6 Zona Norte 2
## 10 780 380 5 3 3 Zona Norte 2
## 11 750 445 6 7 6 Zona Norte NA
## 12 625 355 4 5 5 Zona Norte 3
## 13 750 237 5 6 6 Zona Norte 2
## 15 600 160 4 4 5 Zona Norte 1
str(data2)
## 'data.frame': 3219 obs. of 7 variables:
## $ preciom : int 250 320 350 400 320 780 750 625 750 600 ...
## $ areaconst : num 70 120 220 280 150 380 445 355 237 160 ...
## $ estrato : Factor w/ 4 levels "3","4","5","6": 1 1 1 2 3 3 4 2 3 2 ...
## $ banios : int 3 2 2 5 4 3 7 5 6 4 ...
## $ habitaciones: int 6 3 4 3 6 3 6 5 6 5 ...
## $ zona : Factor w/ 5 levels "Zona Centro",..: 4 4 4 5 2 2 2 2 2 2 ...
## $ parqueaderos: int 1 1 2 3 2 2 NA 3 2 1 ...
Se procede graficar la variable “preciom” contra cada una de las variables predictoras con el objetivo de ver posibles correlaciones.
Preciom vs areaconst
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:Hmisc':
##
## subplot
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
gprecio_estrato <- plot_ly(data=data2, x= ~areaconst, y= ~preciom)
gprecio_estrato
## 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
ggplot(data2, aes(x=areaconst,y=preciom)) + geom_point() + geom_smooth(method ="lm")
## `geom_smooth()` using formula = 'y ~ x'
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.2.3
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'xts'
## The following object is masked from 'package:leaflet':
##
## addLegend
## The following objects are masked from 'package:dplyr':
##
## first, last
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
dat21 <- data.frame(data2$preciom, data2$areaconst)
chart.Correlation(dat21)
## Warning in par(usr): argument 1 does not name a graphical parameter
Se puede ver que hay una correlación entre la variable “preciom” y “areacost” del 65%, lo cual muestra una relación positiva debil.
Preciom vs estrato
gprecio_estrato <- plot_ly(data=data2, x= ~estrato, y= ~preciom)
gprecio_estrato
## No trace type specified:
## Based on info supplied, a 'bar' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#bar
#dat22 <- data.frame(data2$preciom, data2$estrato)
#chart.Correlation(dat22)
En el caso del estrato, no se puede determinar una correlación matematica con el precio en millones, ya que el estrato es una variable catégorica, sin embargo, se puede ver en la grafica que a mayor estrato, mayor precio , por ende, se puede decir que el estrato es una variable que explica la variabilidad en el precio final.
Preciom vs banios
gprecio_banios <- plot_ly(data=data2, x= ~banios, y= ~preciom)
gprecio_banios
## 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
dat23 <- data.frame(data2$preciom, data2$banios)
chart.Correlation(dat23)
## Warning in par(usr): argument 1 does not name a graphical parameter
Se puede ver que hay una correlación entre la variable “preciom” y
“banios” del 56%, lo cual muestra una relación positiva
debil
Preciom vs habitaciones
gprecio_habitaciones <- plot_ly(data=data2, x= ~habitaciones, y= ~preciom)
gprecio_habitaciones
## 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
dat24 <- data.frame(data2$preciom, data2$habitaciones)
chart.Correlation(dat24)
## Warning in par(usr): argument 1 does not name a graphical parameter
Se puede ver que hay una correlación entre la variable “preciom” y
“estrato” del 9.7%, lo cual muestra una relación
inexistente
Preciom vs parqueaderos
gprecio_parqueaderos <- plot_ly(data=data2, x= ~parqueaderos, y= ~preciom)
gprecio_parqueaderos
## 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
## Warning: Ignoring 733 observations
dat25 <- data.frame(data2$preciom, data2$parqueaderos)
chart.Correlation(dat25)
## Warning in par(usr): argument 1 does not name a graphical parameter
Se puede ver que existe una correlación positiva debil entre el precio
de la vivienda y la cantidad de parqueaderos (64%)
Preciom vs zona
gprecio_zona <- plot_ly(data=data2, x= ~zona, y= ~preciom)
gprecio_zona
## No trace type specified:
## Based on info supplied, a 'bar' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#bar
No se puede establecer una correlación de person entre una variable númerica y una variable categoríca, sin embargo, se puede ver que el precio en millones de las casas en la zona sur tiende a ser mas alto que en las otras zonas de la ciudad.
Se realizará un análisis del comportamiento de las variables predictoras, buscando posibles relaciones lineales entre dichas variables, con el objetivo de evitar problemar de multicolinealidad
library(GGally)
## Warning: package 'GGally' was built under R version 4.2.2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
data_cuanti <- select(data2,areaconst,banios,habitaciones,parqueaderos,preciom)
ggpairs(data_cuanti)
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 733 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 733 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 733 rows containing missing values
## Warning: Removed 733 rows containing missing values (`geom_point()`).
## Removed 733 rows containing missing values (`geom_point()`).
## Removed 733 rows containing missing values (`geom_point()`).
## Warning: Removed 733 rows containing non-finite values (`stat_density()`).
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 733 rows containing missing values
## Warning: Removed 733 rows containing missing values (`geom_point()`).
3.1.1 Creación de modelo LM para preciom vs estrato
mod_p_estr = lm(preciom~estrato,data=data2)
summary(mod_p_estr)
##
## Call:
## lm(formula = preciom ~ estrato, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -711.83 -134.18 -47.09 85.82 1453.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 274.182 8.887 30.85 <2e-16 ***
## estrato4 132.904 12.948 10.27 <2e-16 ***
## estrato5 271.104 12.013 22.57 <2e-16 ***
## estrato6 707.653 13.090 54.06 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 253.5 on 3215 degrees of freedom
## Multiple R-squared: 0.4995, Adjusted R-squared: 0.499
## F-statistic: 1069 on 3 and 3215 DF, p-value: < 2.2e-16
Se puede ver el intercepto del modelo de regresión lineal de preciom vs estrato esta en el estrato == “3”, con un valor de 274, de tal manera que cuando el estrato es 4, el intercepto subre a 406 (274+132), y así susesivamente con los demas valores de esta variable.
Adicionalmente, el R2 de este modelo es del 49%, por lo tanto, este modelo no explica a cabalidad el comportamiento de la variable objetivo
Para determinar la significancia de una variable categórica a la hora de explicar la variabilidad de la variable objetivo se utiliza la prueba ANOVA, la cual compara las medias de los diferentes grupos y determina si existen diferencias estadísticamente significativas. Se tiene por H0: no existe diferencia entre medias.
anova(mod_p_estr)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## estrato 3 206223906 68741302 1069.3 < 2.2e-16 ***
## Residuals 3215 206675207 64285
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
el estadístico P-value de la prueba ANOVA es de 2e-16, el cual es inferior a la significancia de la prueba del 5%, por ende se rechaza la hipotesis nula y se determina que hay diferencias estadísticamente significativas entre las medias de precios totales para cada una de las categorias de los estratos.
Prueba PosANOVA
require(agricolae)
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 4.2.3
##
## Attaching package: 'agricolae'
## The following objects are masked from 'package:PerformanceAnalytics':
##
## kurtosis, skewness
comparacion1 = LSD.test(mod_p_estr,"estrato")
comparacion1
## $statistics
## MSerror Df Mean CV
## 64284.67 3215 539.9935 46.9532
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none estrato 4 0.05
##
## $means
## preciom std r LCL UCL Min Max Q25 Q50 Q75
## 3 274.1818 143.8472 814 256.7576 291.6060 77 1600 180 250 330
## 4 407.0855 186.3038 725 388.6228 425.5483 125 1800 300 360 460
## 5 545.2856 256.3909 984 529.4378 561.1333 125 1999 380 480 650
## 6 981.8348 379.5196 696 962.9913 1000.6782 270 1950 700 890 1250
##
## $comparison
## NULL
##
## $groups
## preciom groups
## 6 981.8348 a
## 5 545.2856 b
## 4 407.0855 c
## 3 274.1818 d
##
## attr(,"class")
## [1] "group"
Se puever ver que la agrupación del metodo PosANOVA no agrega ninguno de los estratos, por lo tanto, cada nivel es estadísticamente diferente a los demas.
sin embargo, este modelo tiene un R2 de 49%, por lo tanto no explica a cabalidad el comportamiento de la variables objetivo.
3.1.2 Creación de modelo LM para preciom vs zona
mod_p_zona = lm(preciom~zona,data=data2)
summary(mod_p_zona)
##
## Call:
## lm(formula = preciom ~ zona, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -601.36 -237.26 -82.26 124.09 1494.09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 339.24 33.50 10.127 < 2e-16 ***
## zonaZona Norte 106.67 35.74 2.984 0.00286 **
## zonaZona Oeste 397.12 42.26 9.396 < 2e-16 ***
## zonaZona Oriente -94.42 38.86 -2.429 0.01517 *
## zonaZona Sur 273.02 34.35 7.948 2.6e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 335 on 3214 degrees of freedom
## Multiple R-squared: 0.1265, Adjusted R-squared: 0.1254
## F-statistic: 116.4 on 4 and 3214 DF, p-value: < 2.2e-16
Se puede ver el intercepto del modelo de regresión lineal de preciom vs zona esta en zona == “Zona Centro”, con un valor de 339, de tal manera que cuando la zona es “Zona Norte”, el intercepto sube a 445 (339+106), y así susesivamente con los demas valores de esta variable.
Prueba ANOVA
anova(mod_p_zona)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## zona 4 52244372 13061093 116.39 < 2.2e-16 ***
## Residuals 3214 360654741 112214
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
el estadístico P-value de la prueba ANOVA es de 2e-16, el cual es inferior a la significancia de la prueba del 5%, por ende se rechaza la hipotesis nula y se determina que hay diferencias estadísticamente significativas entre las medias de precios en millones para cada una de las categorias de las zonas.
comparacion2 = LSD.test(mod_p_zona,"zona")
comparacion2
## $statistics
## MSerror Df Mean CV
## 112213.7 3214 539.9935 62.03466
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none zona 5 0.05
##
## $means
## preciom std r LCL UCL Min Max Q25 Q50 Q75
## Zona Centro 339.2400 161.8457 100 273.5598 404.9202 148 1100 238.75 310 382.5
## Zona Norte 445.9058 268.3646 722 421.4622 470.3495 89 1940 261.25 390 550.0
## Zona Oeste 736.3550 397.7289 169 685.8318 786.8783 135 1999 430.00 680 930.0
## Zona Oriente 244.8201 103.9378 289 206.1846 283.4555 80 750 160.00 235 310.0
## Zona Sur 612.2610 377.6854 1939 597.3452 627.1767 77 1900 350.00 480 780.0
##
## $comparison
## NULL
##
## $groups
## preciom groups
## Zona Oeste 736.3550 a
## Zona Sur 612.2610 b
## Zona Norte 445.9058 c
## Zona Centro 339.2400 d
## Zona Oriente 244.8201 e
##
## attr(,"class")
## [1] "group"
El análisis PosANOVA muestra que hay diferencias de clasificación para el precio en millones según las diferentes zonas de la ciudad.
sin embargo, este modelo tiene un R2 de 12%, por lo tanto no explica a cabalidad el comportamiento de la variables objetivo.
3.1.3 Modelo cruzado de estrato y zona
mod_p_estr_zona = lm(preciom ~ estrato + zona + estrato*zona, data = data2)
summary(mod_p_estr_zona)
##
## Call:
## lm(formula = preciom ~ estrato + zona + estrato * zona, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -723.60 -133.66 -43.66 81.75 1390.47
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 314.000 26.286 11.945 < 2e-16 ***
## estrato4 214.571 98.354 2.182 0.02921 *
## estrato5 336.000 252.130 1.333 0.18274
## estrato6 686.000 252.130 2.721 0.00655 **
## zonaZona Norte -69.847 30.960 -2.256 0.02414 *
## zonaZona Oeste 170.880 56.622 3.018 0.00257 **
## zonaZona Oriente -70.454 30.232 -2.330 0.01984 *
## zonaZona Sur -2.221 32.224 -0.069 0.94505
## estrato4:zonaZona Norte -19.954 101.645 -0.196 0.84438
## estrato5:zonaZona Norte -30.626 253.118 -0.121 0.90370
## estrato6:zonaZona Norte -111.899 254.912 -0.439 0.66071
## estrato4:zonaZona Oeste -230.259 120.860 -1.905 0.05685 .
## estrato5:zonaZona Oeste -142.049 259.134 -0.548 0.58361
## estrato6:zonaZona Oeste -152.711 259.134 -0.589 0.55569
## estrato4:zonaZona Oriente -137.284 142.746 -0.962 0.33625
## estrato5:zonaZona Oriente -431.546 355.908 -1.213 0.22540
## estrato6:zonaZona Oriente NA NA NA NA
## estrato4:zonaZona Sur -132.691 100.701 -1.318 0.18771
## estrato5:zonaZona Sur -115.893 253.008 -0.458 0.64694
## estrato6:zonaZona Sur -4.180 253.032 -0.017 0.98682
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 250.8 on 3200 degrees of freedom
## Multiple R-squared: 0.5127, Adjusted R-squared: 0.5099
## F-statistic: 187 on 18 and 3200 DF, p-value: < 2.2e-16
medelo ANOVA
anova(mod_p_estr_zona)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## estrato 3 206223906 68741302 1093.2421 < 2.2e-16 ***
## zona 4 2477143 619286 9.8489 6.433e-08 ***
## estrato:zona 11 2987218 271565 4.3189 1.962e-06 ***
## Residuals 3200 201210845 62878
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El modelo ANOVA para estrato|zona arroja que las variables “estrato”, “zona” y el cruce entre estrato|zona son estadísticamente significativas para explicar la varianza del precio de las viviendas
sin embargo, este modelo tiene un R2 de 51%, por lo tanto no explica a cabalidad el comportamiento de la variables objetivo.
3.2.1 Modelo de regresión lineal precio vs área construida
mod_p_area = lm(preciom ~ areaconst, data= data2)
summary(mod_p_area)
##
## Call:
## lm(formula = preciom ~ areaconst, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2292.81 -152.75 -57.09 86.26 1296.44
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 166.9621 9.0041 18.54 <2e-16 ***
## areaconst 1.3644 0.0279 48.90 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 271.3 on 3217 degrees of freedom
## Multiple R-squared: 0.4263, Adjusted R-squared: 0.4262
## F-statistic: 2391 on 1 and 3217 DF, p-value: < 2.2e-16
El modelo tiene un R2 de 42%, por lo cual no explica a cabalidad el comportamiento de la variable objetivo
3.2.2 Modelo de regresión lineal precio vs parqueaderos
mod_p_par = lm(preciom ~ parqueaderos, data= data2)
summary(mod_p_par)
##
## Call:
## lm(formula = preciom ~ parqueaderos, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1457.60 -158.81 -48.81 105.87 1421.19
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 220.054 10.425 21.11 <2e-16 ***
## parqueaderos 158.755 3.833 41.42 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 280.3 on 2484 degrees of freedom
## (733 observations deleted due to missingness)
## Multiple R-squared: 0.4085, Adjusted R-squared: 0.4083
## F-statistic: 1716 on 1 and 2484 DF, p-value: < 2.2e-16
El modelo tiene un R2 de 40%, por lo cual no explica a cabalidad el comportamiento de la variable objetivo
3.2.3 Modelo de regresión lineal precio vs habitaciones
mod_p_hab = lm(preciom ~ habitaciones, data= data2)
summary(mod_p_hab)
##
## Call:
## lm(formula = preciom ~ habitaciones, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -456.4 -237.6 -117.2 122.4 1451.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 449.700 17.528 25.656 < 2e-16 ***
## habitaciones 19.587 3.549 5.518 3.69e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 356.6 on 3217 degrees of freedom
## Multiple R-squared: 0.009377, Adjusted R-squared: 0.009069
## F-statistic: 30.45 on 1 and 3217 DF, p-value: 3.694e-08
En el caso de la variable Habitaciones, no se realiza el análisis por ANOVA y PosANOVA, ya que es una variable númerica, el R2 de esta prueba es de 0.9%
3.3.1 Modelo de regresión lineal precio vs areaconst + estrato + zona
mod_area_es = lm(preciom~areaconst:estrato + areaconst:zona , data= data2)
summary(mod_area_es)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1349.20 -108.07 -40.13 60.19 1187.91
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 266.21673 7.67810 34.672 < 2e-16 ***
## areaconst:estrato3 0.32646 0.09431 3.462 0.000544 ***
## areaconst:estrato4 0.68604 0.10206 6.722 2.12e-11 ***
## areaconst:estrato5 1.00458 0.10059 9.987 < 2e-16 ***
## areaconst:estrato6 1.62822 0.09945 16.372 < 2e-16 ***
## areaconst:zonaZona Norte -0.11623 0.09772 -1.189 0.234370
## areaconst:zonaZona Oeste 0.18044 0.10484 1.721 0.085313 .
## areaconst:zonaZona Oriente -0.30152 0.10153 -2.970 0.003002 **
## areaconst:zonaZona Sur 0.04864 0.09693 0.502 0.615822
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 216.6 on 3210 degrees of freedom
## Multiple R-squared: 0.6353, Adjusted R-squared: 0.6344
## F-statistic: 698.9 on 8 and 3210 DF, p-value: < 2.2e-16
Este modelo tiene un R2 de 63%, por lo cual presenta un mejor desempeño a la hora de explicar el comportamiento de la variable objetivo.
3.3.2 Modelo de regresión lineal precio vs areaconst + habitaciones + estrato + zona
mod_completo = lm(preciom~areaconst:estrato + areaconst:zona + habitaciones , data= data2)
summary(mod_area_es)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona, data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1349.20 -108.07 -40.13 60.19 1187.91
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 266.21673 7.67810 34.672 < 2e-16 ***
## areaconst:estrato3 0.32646 0.09431 3.462 0.000544 ***
## areaconst:estrato4 0.68604 0.10206 6.722 2.12e-11 ***
## areaconst:estrato5 1.00458 0.10059 9.987 < 2e-16 ***
## areaconst:estrato6 1.62822 0.09945 16.372 < 2e-16 ***
## areaconst:zonaZona Norte -0.11623 0.09772 -1.189 0.234370
## areaconst:zonaZona Oeste 0.18044 0.10484 1.721 0.085313 .
## areaconst:zonaZona Oriente -0.30152 0.10153 -2.970 0.003002 **
## areaconst:zonaZona Sur 0.04864 0.09693 0.502 0.615822
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 216.6 on 3210 degrees of freedom
## Multiple R-squared: 0.6353, Adjusted R-squared: 0.6344
## F-statistic: 698.9 on 8 and 3210 DF, p-value: < 2.2e-16
Este modelo tiene un R2 de 63%, que comparado con el modelo de area + estrato + zona, solo da un incremento marginal de la explicabilidad del modelo del 1%, por ende, se decide quitar del modelo, este comportamiento se puede explicar al ver que a mayor área, se va a tender a tener un mayor número de habitaciones, lo cual se pudó ver en el análisis de correlaciones, en el cual la correlación entre el área construida y las habitaciones fue del 51%.
3.3.3 Modelo de regresión lineal precio vs areaconst + estrato + zona + parqueaderos
mod_area_es = lm(preciom~areaconst:estrato + areaconst:zona +parqueaderos , data= data2)
summary(mod_area_es)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona + parqueaderos,
## data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1131.14 -96.44 -32.32 60.05 1125.65
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 197.7286 9.9114 19.950 < 2e-16 ***
## parqueaderos 71.0035 3.4443 20.615 < 2e-16 ***
## areaconst:estrato3 0.2741 0.1240 2.210 0.0272 *
## areaconst:estrato4 0.5519 0.1395 3.957 7.80e-05 ***
## areaconst:estrato5 0.8493 0.1364 6.225 5.65e-10 ***
## areaconst:estrato6 1.3815 0.1360 10.156 < 2e-16 ***
## areaconst:zonaZona Norte -0.2642 0.1333 -1.982 0.0475 *
## areaconst:zonaZona Oeste 0.1026 0.1392 0.737 0.4612
## areaconst:zonaZona Oriente -0.2748 0.1346 -2.042 0.0413 *
## areaconst:zonaZona Sur -0.1057 0.1326 -0.798 0.4252
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 206.7 on 2476 degrees of freedom
## (733 observations deleted due to missingness)
## Multiple R-squared: 0.6795, Adjusted R-squared: 0.6783
## F-statistic: 583.3 on 9 and 2476 DF, p-value: < 2.2e-16
este modelo tiene un R2 de 67%, el cual muestra el mejor desempeño en terminos de explicabilidad de la variable objetivo.
Adicionalmente, si se grafican “preciom” vs “areaconst”, categorizando las observaciones por las variables “estrato” y “zona” respectivamente, se puede evidenciar que estas 3 variables dan una buena explicación a la variable objetivo.
ggplot(data2, aes(x=areaconst, y = preciom, color=estrato)) + geom_point()+geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(data2, aes(x=areaconst, y = preciom, color=zona)) + geom_point()+geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
####CONCLUSIONES MOLDELOS DE REGRESIÓN LINEAL
1.Debido a la alta correlación entre la variables “banios” y “areacosnt”, se decidió quitar del análisis a la variable “banios” con el objetivo de evitar problemas de multicolinealidad 2.El modelo que mejor desempeño, según el R2 (67%), fue el de precio ~ areaconst + estrato + zona + parqueaderos, esto tiene sentido, ya que las variables categóricas “estrato” y “zona” ayudan a complementar la explicación que el área en metros cuadrados da al precio de las viviendas. 3.Se decide quitar del modelo la variable “habitaciones”, debido a que su aporte marginal en la explicacón del comportamiento de la variable objetivo es del 1%.
3.1.7 Creación del modelo de regresión lineal para caso de estudio
El enunciado dicta que se quiere hacer un modelo para predecir el valor por metro cuadrado de una vivienda tipo “Casa”, con un área construida de 200 m2, en estrato 4-5 en la zona norte
#Creación del modelo de regresión lineal
mod_final = lm(preciom ~ areaconst:estrato + areaconst:zona + parqueaderos, data= data2)
summary(mod_final)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona + parqueaderos,
## data = data2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1131.14 -96.44 -32.32 60.05 1125.65
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 197.7286 9.9114 19.950 < 2e-16 ***
## parqueaderos 71.0035 3.4443 20.615 < 2e-16 ***
## areaconst:estrato3 0.2741 0.1240 2.210 0.0272 *
## areaconst:estrato4 0.5519 0.1395 3.957 7.80e-05 ***
## areaconst:estrato5 0.8493 0.1364 6.225 5.65e-10 ***
## areaconst:estrato6 1.3815 0.1360 10.156 < 2e-16 ***
## areaconst:zonaZona Norte -0.2642 0.1333 -1.982 0.0475 *
## areaconst:zonaZona Oeste 0.1026 0.1392 0.737 0.4612
## areaconst:zonaZona Oriente -0.2748 0.1346 -2.042 0.0413 *
## areaconst:zonaZona Sur -0.1057 0.1326 -0.798 0.4252
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 206.7 on 2476 degrees of freedom
## (733 observations deleted due to missingness)
## Multiple R-squared: 0.6795, Adjusted R-squared: 0.6783
## F-statistic: 583.3 on 9 and 2476 DF, p-value: < 2.2e-16
Se procede a realizar la validación de los siguientes supuestos para el modelo:
4.1 Validación de distribución normal de los errores
Se utilizará la prueba de Shapiro-Wilks y Cramer Von Mises para validar la distribución normal de los errores
## Ploteo de los valores predichos por el modelo RL vs los errores de cada predicción
plot(mod_final$residuals)
##Prueba Shapiro-Wilks para los residuos del modelo final
muestra = sample(mod_final$residuals)
shapiro.test(muestra)
##
## Shapiro-Wilk normality test
##
## data: muestra
## W = 0.855, p-value < 2.2e-16
#cvm.test(mod_final$residuals, 'pnorm')
En el Shapiro-Wilk, con un P-Value del 2.2e-16 < 5%, por ende, los errores del modelo no se distribuyen normal. En el Cramer test, con P-value del 2.2e-16, tambien se muestra que los errores no se distribuyen normal
4.2 Validación de errores tienen media cero
mean(mod_final$residuals)
## [1] -1.677893e-14
La media de los errores tienden a cero
4.3 Validación de errores tienen varianza constante
Para validar el supuesto varianza constante en los errores se utilizará la prueba de Goldfeld-Quandt, la cual tiene por hipotesis nula que hay homocedasticidad en los errores, lo cual quiere decir que la varianza en los datos es homogenea de manera trasversal, esto indica que no existe una dispersión heterogenea de los residuos (heterocedasticidad)
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.2.2
gqtest(mod_final)
##
## Goldfeld-Quandt test
##
## data: mod_final
## GQ = 1.3954, df1 = 1233, df2 = 1233, p-value = 2.686e-09
## alternative hypothesis: variance increases from segment 1 to 2
Se puede ver que el P-Value de la prueba es inferior a la significancia del 5%, por ende, se rechaza la hipotesis nula, y se podría afirmar que hay problemas de heterocedasticidad en los errores
4.4 Validación de errores mutuamente independientes
Para validar la independencia de los errores se utilizará la prueba de Durbin-Watson, la cual tiene por hipotesis nula que los datos no estan autocorrelacionados.
dwtest(mod_final)
##
## Durbin-Watson test
##
## data: mod_final
## DW = 1.7418, p-value = 3.532e-11
## alternative hypothesis: true autocorrelation is greater than 0
Se puede ver que el P-Value de la prueba es inferior a la significancia del 5%, por ende, se rechaza la hipotesis nula, y se podría afirmar que hay problemas de autocorrelación en los errores
SUGERENCIAS:
Para subsanar estos problemas encontrados en este modelo, se deben abordar diferentes técnicas, en primer lugar, se podrian hacer transformaciones a las relaciones entre la variable “areaconst” y “preciom”, con el objetivo de identificar si con dicha transformación se puede llegar a una relación lineal.
prediccion1 = predict(mod_final,list(areaconst=200,parqueaderos=1, zona ="Zona Norte", estrato ="4"))
prediccion2 = predict(mod_final,list(areaconst=200,parqueaderos=1, zona ="Zona Norte", estrato ="5"))
prediccion1
## 1
## 326.2699
prediccion2
## 1
## 385.7566
Una vivienda tipo “casa”, con 1 parqueadero, en la “Zona Norte”,va a costar alrededor de 326 millones para estrato 4 y 385 millones para estrato 5
Teniendo en cuenta que se tiene preaprobado un máximo de 350 millones, María podría ofrecerle la vivienda en estrato 4 por 353 millones, obteniendo así una posible ganancia de 24 millones (7% sobre la compra), sin embargo, la venta de la vivienda en estrato 5 no le generaría ganancia, ya que esta en 385 millones.
data1 <- filter(data, tipo == "Apartamento" & zona == "Zona Sur")
#Datos de los 3 primeros registros filtrados
data_apto_3 = data1[0:3,]
head(data_apto_3)
## X id zona piso estrato preciom areaconst parqueaderos banios
## 1 24 5098 Zona Sur 5 4 290 96 1 2
## 2 164 698 Zona Sur 2 3 78 40 1 1
## 3 264 8199 Zona Sur <NA> 6 875 194 2 5
## habitaciones tipo barrio longitud latitud
## 1 3 Apartamento acopi -76.53464 3.44987
## 2 2 Apartamento aguablanca -76.50100 3.40000
## 3 3 Apartamento aguacatal -76.55700 3.45900
require(leaflet)
leaflet() %>% addTiles() %>%
addCircleMarkers(lng = data_apto_3$longitud,
lat = data_apto_3$latitud)
Se evidencia que hay udos registros que a pesar de estar etiquetados como “Zona NSur”, espacialmente estan en otra zona
data3 <- subset(data, tipo == "Apartamento" ,select = c(preciom,areaconst,estrato,banios,habitaciones,zona,parqueaderos,piso,tipo))
data3$estrato = as.factor(data3$estrato)
data3$zona = as.factor(data3$zona)
head(data3,10)
## preciom areaconst estrato banios habitaciones zona parqueaderos piso
## 5 260 90 5 2 3 Zona Norte 1 1
## 6 240 87 5 3 3 Zona Norte 1 1
## 7 220 52 4 2 3 Zona Norte 2 1
## 8 310 137 5 3 4 Zona Norte 2 1
## 14 520 98 6 2 2 Zona Norte 2 2
## 18 320 108 4 3 3 Zona Norte 2 3
## 19 385 103 5 2 3 Zona Norte 2 3
## 20 100 49 3 1 2 Zona Norte NA 3
## 21 175 80 3 2 3 Zona Norte 1 4
## 22 820 377 6 4 4 Zona Norte 1 5
## tipo
## 5 Apartamento
## 6 Apartamento
## 7 Apartamento
## 8 Apartamento
## 14 Apartamento
## 18 Apartamento
## 19 Apartamento
## 20 Apartamento
## 21 Apartamento
## 22 Apartamento
Previo vs área
gprecio_area <- plot_ly(data=data3, x= ~areaconst, y= ~preciom)
gprecio_area
## 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
ggplot(data3, aes(x=areaconst,y=preciom)) + geom_point() + geom_smooth(method ="lm")
## `geom_smooth()` using formula = 'y ~ x'
library(PerformanceAnalytics)
dat31 <- data.frame(data3$preciom, data3$areaconst)
chart.Correlation(dat31)
## Warning in par(usr): argument 1 does not name a graphical parameter
Se puede ver que hay una correlación entre la variable “preciom” y
“areacost” del 83%, lo cual muestra una relación positiva fuerte.
Previo vs estrato
gprecio_estrato2 <- plot_ly(data=data3, x= ~estrato, y= ~preciom)
gprecio_estrato2
## No trace type specified:
## Based on info supplied, a 'bar' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#bar
En el caso del estrato, no se puede determinar una correlación matematica con el precio en millones, ya que el estrato es una variable catégorica, sin embargo, se puede ver en la grafica que a mayor estrato, mayor precio , por ende, se puede decir que el estrato es una variable que explica la variabilidad en el precio final.
Precio vs Banios
gprecio_banios <- plot_ly(data=data2, x= ~banios, y= ~preciom)
gprecio_banios
## 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
dat33 <- data.frame(data3$preciom, data3$banios)
chart.Correlation(dat33)
## Warning in par(usr): argument 1 does not name a graphical parameter
correlación entre la variable “preciom” y “banios” del 74%, lo cual
muestra una relación positiva fuerte
precio vs habitaciones
gprecio_habitaciones2 <- plot_ly(data=data3, x= ~habitaciones, y= ~preciom)
gprecio_habitaciones2
## 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
dat34 <- data.frame(data3$preciom, data3$habitaciones)
chart.Correlation(dat34)
## Warning in par(usr): argument 1 does not name a graphical parameter
correlación entre la variable “preciom” y “estrato” del 30%, lo cual
muestra una relación inexistente
Preciom vs parqueaderos
gprecio_parqueaderos2 <- plot_ly(data=data3, x= ~parqueaderos, y= ~preciom)
gprecio_parqueaderos2
## 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
## Warning: Ignoring 869 observations
dat35 <- data.frame(data3$preciom, data3$parqueaderos)
chart.Correlation(dat35)
## Warning in par(usr): argument 1 does not name a graphical parameter
correlación positiva fuerte entre el precio de la vivienda y la cantidad
de parqueaderos (74%)
Preciom vs zona
gprecio_zona2 <- plot_ly(data=data3, x= ~zona, y= ~preciom)
gprecio_zona2
## No trace type specified:
## Based on info supplied, a 'bar' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#bar
No se puede establecer una correlación de person entre una variable númerica y una variable categoríca, sin embargo, se puede ver que el precio en millones de las casas en la zona sur tiende a ser mas alto que en las otras zonas de la ciudad.
Se realizará un análisis del comportamiento de las variables predictoras, buscando posibles relaciones lineales entre dichas variables, con el objetivo de evitar problemar de multicolinealidad
library(GGally)
data_cuanti2 <- select(data3,areaconst,banios,habitaciones,parqueaderos,preciom)
ggpairs(data_cuanti2)
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 869 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 869 rows containing missing values
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 869 rows containing missing values
## Warning: Removed 869 rows containing missing values (`geom_point()`).
## Removed 869 rows containing missing values (`geom_point()`).
## Removed 869 rows containing missing values (`geom_point()`).
## Warning: Removed 869 rows containing non-finite values (`stat_density()`).
## Warning in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
## Removed 869 rows containing missing values
## Warning: Removed 869 rows containing missing values (`geom_point()`).
Se evidencia que la variable baños y área construida esta fuertemente correlacionadas (72%), por ende, se quita baños del análisis para evitar problemas de multicolinealidad
7.3.1.1 Creación de modelo LM para preciom vs estrato
mod_p_estr2 = lm(preciom~estrato,data=data3)
summary(mod_p_estr2)
##
## Call:
## lm(formula = preciom ~ estrato, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -574.41 -77.49 -23.98 38.06 1564.99
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 128.977 7.979 16.165 < 2e-16 ***
## estrato4 77.968 9.625 8.101 6.77e-16 ***
## estrato5 206.034 9.311 22.128 < 2e-16 ***
## estrato6 573.438 9.756 58.781 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 201.7 on 5096 degrees of freedom
## Multiple R-squared: 0.514, Adjusted R-squared: 0.5137
## F-statistic: 1796 on 3 and 5096 DF, p-value: < 2.2e-16
Adicionalmente, el R2 de este modelo es del 51%, por lo tanto, este modelo no explica a cabalidad el comportamiento de la variable objetivo
anova(mod_p_estr2)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## estrato 3 219218319 73072773 1796.3 < 2.2e-16 ***
## Residuals 5096 207302072 40679
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
el estadístico P-value de la prueba ANOVA es de 2e-16, el cual es inferior a la significancia de la prueba del 5%, por ende se rechaza la hipotesis nula y se determina que hay diferencias estadísticamente significativas entre las medias de precios totales para cada una de las categorias de los estratos.
require(agricolae)
comparacion21 = LSD.test(mod_p_estr2,"estrato")
comparacion21
## $statistics
## MSerror Df Mean CV
## 40679.37 5096 366.9435 54.96521
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none estrato 4 0.05
##
## $means
## preciom std r LCL UCL Min Max Q25 Q50 Q75
## 3 128.9765 50.50141 639 113.3347 144.6184 58 580 105 120.0 140.00
## 4 206.9444 80.26785 1404 196.3920 217.4969 78 1350 155 189.5 240.00
## 5 335.0108 160.03434 1766 325.6018 344.4197 89 1900 250 300.0 379.75
## 6 702.4144 342.62111 1291 691.4098 713.4190 128 1950 450 610.0 870.00
##
## $comparison
## NULL
##
## $groups
## preciom groups
## 6 702.4144 a
## 5 335.0108 b
## 4 206.9444 c
## 3 128.9765 d
##
## attr(,"class")
## [1] "group"
Se puever ver que la agrupación del metodo PosANOVA no agrega ninguno de los estratos, por lo tanto, cada nivel es estadísticamente diferente a los demas.
7.3.1.2 Creación de modelo LM para preciom vs zona
mod_p_zona2 = lm(preciom~zona,data=data3)
summary(mod_p_zona2)
##
## Call:
## lm(formula = preciom ~ zona, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -582.93 -141.29 -52.29 57.71 1452.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 186.58 50.20 3.717 0.000204 ***
## zonaZona Norte 98.58 50.70 1.944 0.051906 .
## zonaZona Oeste 481.34 50.78 9.479 < 2e-16 ***
## zonaZona Oriente -33.99 59.12 -0.575 0.565415
## zonaZona Sur 110.71 50.41 2.196 0.028140 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 245.9 on 5095 degrees of freedom
## Multiple R-squared: 0.2776, Adjusted R-squared: 0.277
## F-statistic: 489.3 on 4 and 5095 DF, p-value: < 2.2e-16
anova(mod_p_zona2)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## zona 4 118380819 29595205 489.35 < 2.2e-16 ***
## Residuals 5095 308139573 60479
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
el estadístico P-value de la prueba ANOVA es de 2e-16, el cual es inferior a la significancia de la prueba del 5%, por ende se rechaza la hipotesis nula y se determina que hay diferencias estadísticamente significativas entre las medias de precios en millones para cada una de las categorias de las zonas. R2 = 27%
comparacion22 = LSD.test(mod_p_zona2,"zona")
comparacion22
## $statistics
## MSerror Df Mean CV
## 60478.82 5095 366.9435 67.01969
##
## $parameters
## test p.ajusted name.t ntr alpha
## Fisher-LSD none zona 5 0.05
##
## $means
## preciom std r LCL UCL Min Max Q25 Q50
## Zona Centro 186.5833 90.80601 24 88.17151 284.9952 100 400 120.00 152.5
## Zona Norte 285.1619 199.76693 1198 271.23279 299.0911 65 1580 138.25 250.0
## Zona Oeste 667.9271 389.91315 1029 652.89759 682.9566 85 1950 385.00 570.0
## Zona Oriente 152.5968 165.43123 62 91.36779 213.8258 58 1350 99.00 115.0
## Zona Sur 297.2917 191.55058 2787 288.15932 306.4241 75 1750 175.00 245.0
## Q75
## Zona Centro 210
## Zona Norte 360
## Zona Oeste 900
## Zona Oriente 150
## Zona Sur 335
##
## $comparison
## NULL
##
## $groups
## preciom groups
## Zona Oeste 667.9271 a
## Zona Sur 297.2917 b
## Zona Norte 285.1619 bc
## Zona Centro 186.5833 cd
## Zona Oriente 152.5968 d
##
## attr(,"class")
## [1] "group"
7.3.1.3 Modelo cruzado de estrato y zona
mod_p_estr_zona2 = lm(preciom ~ estrato + zona + estrato*zona, data = data3)
summary(mod_p_estr_zona2)
##
## Call:
## lm(formula = preciom ~ estrato + zona + estrato * zona, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -616.27 -68.60 -18.71 41.40 1405.67
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 140.7857 51.5146 2.733 0.00630 **
## estrato4 95.2143 89.2260 1.067 0.28597
## estrato5 144.2143 122.6294 1.176 0.23964
## estrato6 453.3784 16.2867 27.837 < 2e-16 ***
## zonaZona Norte -21.1210 52.5738 -0.402 0.68789
## zonaZona Oeste 6.5246 62.7286 0.104 0.91716
## zonaZona Oriente -11.8030 57.3962 -0.206 0.83708
## zonaZona Sur 0.3337 53.2785 0.006 0.99500
## estrato4:zonaZona Norte 0.1414 90.6783 0.002 0.99876
## estrato5:zonaZona Norte 83.6672 123.3808 0.678 0.49773
## estrato6:zonaZona Norte 70.7518 26.3257 2.688 0.00722 **
## estrato4:zonaZona Oeste -12.3522 99.4131 -0.124 0.90112
## estrato5:zonaZona Oeste 202.8044 128.3741 1.580 0.11422
## estrato6:zonaZona Oeste 180.5841 39.9829 4.517 6.43e-06 ***
## estrato4:zonaZona Oriente 38.3030 164.8580 0.232 0.81628
## estrato5:zonaZona Oriente -168.1970 229.8503 -0.732 0.46434
## estrato6:zonaZona Oriente 767.6388 195.0857 3.935 8.43e-05 ***
## estrato4:zonaZona Sur -32.7333 90.4443 -0.362 0.71743
## estrato5:zonaZona Sur 8.3749 123.5264 0.068 0.94595
## estrato6:zonaZona Sur NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 192.8 on 5081 degrees of freedom
## Multiple R-squared: 0.5574, Adjusted R-squared: 0.5558
## F-statistic: 355.5 on 18 and 5081 DF, p-value: < 2.2e-16
anova(mod_p_estr_zona2)
## Analysis of Variance Table
##
## Response: preciom
## Df Sum Sq Mean Sq F value Pr(>F)
## estrato 3 219218319 73072773 1966.8271 < 2.2e-16 ***
## zona 4 15620096 3905024 105.1076 < 2.2e-16 ***
## estrato:zona 11 2909536 264503 7.1194 3.951e-12 ***
## Residuals 5081 188772441 37153
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El modelo ANOVA para estrato|zona arroja que las variables “estrato”, “zona” y el cruce entre estrato|zona son estadísticamente significativas para explicar la varianza del precio de las viviendas
sin embargo, este modelo tiene un R2 de 55%, por lo tanto no explica a cabalidad el comportamiento de la variables objetivo.
7.3.1.4 Modelo de regresión lineal precio vs área construida
mod_p_area2 = lm(preciom ~ areaconst, data= data3)
summary(mod_p_area2)
##
## Call:
## lm(formula = preciom ~ areaconst, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2898.98 -60.08 -14.98 44.76 1020.85
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -22.80585 4.32723 -5.27 1.42e-07 ***
## areaconst 3.45578 0.03268 105.73 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 161.9 on 5098 degrees of freedom
## Multiple R-squared: 0.6868, Adjusted R-squared: 0.6868
## F-statistic: 1.118e+04 on 1 and 5098 DF, p-value: < 2.2e-16
El modelo tiene un R2 de 68%, por lo cual no explica a cabalidad el comportamiento de la variable objetivo
7.3.1.5 Modelo de regresión lineal precio vs parqueaderos
mod_p_par2 = lm(preciom ~ parqueaderos, data= data3)
summary(mod_p_par2)
##
## Call:
## lm(formula = preciom ~ parqueaderos, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2698.4 -103.9 -14.0 66.0 1321.1
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -60.934 7.181 -8.485 <2e-16 ***
## parqueaderos 294.931 4.140 71.241 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 199.9 on 4229 degrees of freedom
## (869 observations deleted due to missingness)
## Multiple R-squared: 0.5455, Adjusted R-squared: 0.5454
## F-statistic: 5075 on 1 and 4229 DF, p-value: < 2.2e-16
El modelo tiene un R2 de 54%, por lo cual no explica a cabalidad el comportamiento de la variable objetivo
7.3.1.6 Modelo de regresión lineal precio vs habitaciones
mod_p_hab2 = lm(preciom ~ habitaciones, data= data3)
summary(mod_p_hab2)
##
## Call:
## lm(formula = preciom ~ habitaciones, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -894.31 -171.62 -80.59 69.41 1556.70
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11.276 17.434 -0.647 0.518
## habitaciones 127.288 5.721 22.248 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 276.2 on 5098 degrees of freedom
## Multiple R-squared: 0.0885, Adjusted R-squared: 0.08832
## F-statistic: 495 on 1 and 5098 DF, p-value: < 2.2e-16
Modelo con R2= 8%, explicación no significativa
7.3.1.7 Modelo de regresión lineal precio vs piso
mod_p_piso = lm(preciom ~ piso, data= data3)
summary(mod_p_piso)
##
## Call:
## lm(formula = preciom ~ piso, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -372.40 -168.78 -83.78 64.24 1588.90
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 311.105 13.086 23.775 < 2e-16 ***
## piso2 24.653 17.749 1.389 0.165
## piso3 20.138 17.313 1.163 0.245
## piso4 4.859 17.502 0.278 0.781
## piso5 -22.328 17.372 -1.285 0.199
## piso6 131.809 21.777 6.053 1.57e-09 ***
## piso7 111.695 23.225 4.809 1.57e-06 ***
## piso8 128.431 22.808 5.631 1.92e-08 ***
## piso9 184.642 25.991 7.104 1.45e-12 ***
## piso10 145.606 27.321 5.329 1.04e-07 ***
## piso11 201.300 32.369 6.219 5.56e-10 ***
## piso12 178.522 32.532 5.488 4.35e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 271.3 on 3707 degrees of freedom
## (1381 observations deleted due to missingness)
## Multiple R-squared: 0.05775, Adjusted R-squared: 0.05495
## F-statistic: 20.65 on 11 and 3707 DF, p-value: < 2.2e-16
Modelo con R2= 3%, explicación no significativa
7.3.1.8 Modelo de regresión lineal precio vs areaconst + estrato + zona
mod_area_es2 = lm(preciom~areaconst:estrato + areaconst:zona , data= data3)
summary(mod_area_es2)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1526.67 -46.63 -11.90 37.05 870.74
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.155e+02 4.425e+00 26.103 < 2e-16 ***
## areaconst:estrato3 2.491e-01 2.723e-01 0.915 0.3604
## areaconst:estrato4 1.231e+00 2.700e-01 4.558 5.28e-06 ***
## areaconst:estrato5 1.832e+00 2.681e-01 6.834 9.21e-12 ***
## areaconst:estrato6 2.982e+00 2.680e-01 11.124 < 2e-16 ***
## areaconst:zonaZona Norte 4.897e-02 2.676e-01 0.183 0.8548
## areaconst:zonaZona Oeste 5.193e-01 2.680e-01 1.938 0.0527 .
## areaconst:zonaZona Oriente 2.156e-01 3.029e-01 0.712 0.4766
## areaconst:zonaZona Sur 2.693e-03 2.670e-01 0.010 0.9920
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 128.6 on 5091 degrees of freedom
## Multiple R-squared: 0.8025, Adjusted R-squared: 0.8022
## F-statistic: 2585 on 8 and 5091 DF, p-value: < 2.2e-16
Modelo con R2 del 80%
7.3.1.9 Modelo de regresión lineal precio vs areaconst + habitaciones + estrato + zona
mod_completo2 = lm(preciom~areaconst:estrato + areaconst:zona + habitaciones , data= data3)
summary(mod_area_es2)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1526.67 -46.63 -11.90 37.05 870.74
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.155e+02 4.425e+00 26.103 < 2e-16 ***
## areaconst:estrato3 2.491e-01 2.723e-01 0.915 0.3604
## areaconst:estrato4 1.231e+00 2.700e-01 4.558 5.28e-06 ***
## areaconst:estrato5 1.832e+00 2.681e-01 6.834 9.21e-12 ***
## areaconst:estrato6 2.982e+00 2.680e-01 11.124 < 2e-16 ***
## areaconst:zonaZona Norte 4.897e-02 2.676e-01 0.183 0.8548
## areaconst:zonaZona Oeste 5.193e-01 2.680e-01 1.938 0.0527 .
## areaconst:zonaZona Oriente 2.156e-01 3.029e-01 0.712 0.4766
## areaconst:zonaZona Sur 2.693e-03 2.670e-01 0.010 0.9920
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 128.6 on 5091 degrees of freedom
## Multiple R-squared: 0.8025, Adjusted R-squared: 0.8022
## F-statistic: 2585 on 8 and 5091 DF, p-value: < 2.2e-16
Este modelo tiene un R2 de 80%, que comparado con el modelo de area + estrato + zona, solo da un incremento marginal de la explicabilidad del modelo del 0%, por ende, se decide quitar habitaciones del modelo, este comportamiento se puede explicar al ver que a mayor área, se va a tender a tener un mayor número de habitaciones, lo cual se pudó ver en el análisis de correlaciones, en el cual la correlación entre el área construida y las habitaciones fue del 72%.
7.3.1.10 Modelo de regresión lineal precio vs areaconst + estrato + zona + parqueaderos
mod_area_es2 = lm(preciom~areaconst:estrato + areaconst:zona +parqueaderos , data= data3)
summary(mod_area_es2)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona + parqueaderos,
## data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1094.03 -49.46 -4.69 43.31 913.43
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.14580 5.94604 6.247 4.59e-10 ***
## parqueaderos 87.81114 3.78249 23.215 < 2e-16 ***
## areaconst:estrato3 0.36744 0.38044 0.966 0.334173
## areaconst:estrato4 1.21389 0.36755 3.303 0.000966 ***
## areaconst:estrato5 1.54943 0.36662 4.226 2.43e-05 ***
## areaconst:estrato6 2.58732 0.36692 7.051 2.06e-12 ***
## areaconst:zonaZona Norte -0.04211 0.36651 -0.115 0.908523
## areaconst:zonaZona Oeste 0.30790 0.36629 0.841 0.400630
## areaconst:zonaZona Oriente -0.12002 0.42598 -0.282 0.778154
## areaconst:zonaZona Sur -0.18883 0.36539 -0.517 0.605329
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 127.1 on 4221 degrees of freedom
## (869 observations deleted due to missingness)
## Multiple R-squared: 0.8168, Adjusted R-squared: 0.8164
## F-statistic: 2091 on 9 and 4221 DF, p-value: < 2.2e-16
este modelo tiene un R2 de 81%, el cual tiene un aumento marginal en la explicabilidad de solo el 1%, por ende no se incluye la variable parqueaderos en el modelo final.
7.3.1.11 Modelo de regresión lineal precio vs areaconst + estrato + zona + piso
mod_area_es_piso = lm(preciom~areaconst:estrato + areaconst:zona +piso , data= data3)
summary(mod_area_es_piso)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona + piso,
## data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1439.31 -43.09 -10.36 35.17 885.74
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 120.74276 7.49021 16.120 < 2e-16 ***
## piso2 -10.43543 8.09309 -1.289 0.197331
## piso3 -6.83438 7.89349 -0.866 0.386642
## piso4 -11.42479 7.98436 -1.431 0.152544
## piso5 -11.01449 7.92796 -1.389 0.164819
## piso6 14.59073 9.99871 1.459 0.144578
## piso7 13.76788 10.66743 1.291 0.196907
## piso8 24.46754 10.44685 2.342 0.019228 *
## piso9 53.69111 11.92827 4.501 6.97e-06 ***
## piso10 36.60069 12.50516 2.927 0.003445 **
## piso11 67.75824 14.90992 4.545 5.68e-06 ***
## piso12 46.28130 14.93743 3.098 0.001961 **
## areaconst:estrato3 -0.01306 0.35969 -0.036 0.971033
## areaconst:estrato4 0.82653 0.36158 2.286 0.022318 *
## areaconst:estrato5 1.40075 0.36013 3.890 0.000102 ***
## areaconst:estrato6 2.59702 0.35985 7.217 6.42e-13 ***
## areaconst:zonaZona Norte 0.34316 0.35933 0.955 0.339636
## areaconst:zonaZona Oeste 0.82642 0.35995 2.296 0.021734 *
## areaconst:zonaZona Oriente 0.33022 0.39206 0.842 0.399691
## areaconst:zonaZona Sur 0.32007 0.35906 0.891 0.372776
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 123.6 on 3699 degrees of freedom
## (1381 observations deleted due to missingness)
## Multiple R-squared: 0.805, Adjusted R-squared: 0.804
## F-statistic: 803.9 on 19 and 3699 DF, p-value: < 2.2e-16
El modelo incluyendo piso no tiene un aumento marginal en la explicabilidad del modelo al incluir la variable “piso”, por ende se quita del modelo final
Adicionalmente, si se grafican “preciom” vs “areaconst”, categorizando las observaciones por las variables “estrato” y “zona” respectivamente, se puede evidenciar que estas 3 variables dan una buena explicación a la variable objetivo.
ggplot(data3, aes(x=areaconst, y = preciom, color=estrato)) + geom_point()+geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(data3, aes(x=areaconst, y = preciom, color=zona)) + geom_point()+geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
####CONCLUSIONES MOLDELOS DE REGRESIÓN LINEAL APARTAMENTOS
mod_final2 = lm(preciom~areaconst:estrato + areaconst:zona , data= data3)
summary(mod_final2)
##
## Call:
## lm(formula = preciom ~ areaconst:estrato + areaconst:zona, data = data3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1526.67 -46.63 -11.90 37.05 870.74
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.155e+02 4.425e+00 26.103 < 2e-16 ***
## areaconst:estrato3 2.491e-01 2.723e-01 0.915 0.3604
## areaconst:estrato4 1.231e+00 2.700e-01 4.558 5.28e-06 ***
## areaconst:estrato5 1.832e+00 2.681e-01 6.834 9.21e-12 ***
## areaconst:estrato6 2.982e+00 2.680e-01 11.124 < 2e-16 ***
## areaconst:zonaZona Norte 4.897e-02 2.676e-01 0.183 0.8548
## areaconst:zonaZona Oeste 5.193e-01 2.680e-01 1.938 0.0527 .
## areaconst:zonaZona Oriente 2.156e-01 3.029e-01 0.712 0.4766
## areaconst:zonaZona Sur 2.693e-03 2.670e-01 0.010 0.9920
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 128.6 on 5091 degrees of freedom
## Multiple R-squared: 0.8025, Adjusted R-squared: 0.8022
## F-statistic: 2585 on 8 and 5091 DF, p-value: < 2.2e-16
Validación de distribución normal de los errores
plot(mod_final2$residuals)
muestra2 = sample(mod_final2$residuals, 4000)
shapiro.test(muestra2)
##
## Shapiro-Wilk normality test
##
## data: muestra2
## W = 0.78839, p-value < 2.2e-16
En el Shapiro-Wilk, con un P-Value del 2.2e-16 < 5%, por ende, los errores del modelo no se distribuyen normal. En el Cramer test, con P-value del 2.2e-16, tambien se muestra que los errores no se distribuyen normal
Validación de errores tienen media cero
mean(mod_final2$residuals)
## [1] -3.928764e-15
La media de los errores tienden a cero
Validación de errores tienen varianza constante
library(lmtest)
gqtest(mod_final2)
##
## Goldfeld-Quandt test
##
## data: mod_final2
## GQ = 1.6177, df1 = 2541, df2 = 2541, p-value < 2.2e-16
## alternative hypothesis: variance increases from segment 1 to 2
Se puede ver que el P-Value de la prueba es inferior a la significancia del 5%, por ende, se rechaza la hipotesis nula, y se podría afirmar que hay problemas de heterocedasticidad en los errores
Validación de errores mutuamente independientes
dwtest(mod_final2)
##
## Durbin-Watson test
##
## data: mod_final2
## DW = 1.8028, p-value = 6.583e-13
## alternative hypothesis: true autocorrelation is greater than 0
Se puede ver que el P-Value de la prueba es inferior a la significancia del 5%, por ende, se rechaza la hipotesis nula, y se podría afirmar que hay problemas de autocorrelación en los errores
SUGERENCIAS:
Para subsanar estos problemas encontrados en este modelo, se deben abordar diferentes técnicas, en primer lugar, se podrian hacer transformaciones a las relaciones entre la variable “areaconst” y “preciom”, con el objetivo de identificar si con dicha transformación se puede llegar a una relación lineal.
prediccion21 = predict(mod_final2,list(areaconst=300, zona ="Zona Sur", estrato ="4"))
prediccion22 = predict(mod_final2,list(areaconst=300, zona ="Zona Sur", estrato ="5"))
prediccion21
## 1
## 485.5011
prediccion22
## 1
## 665.9959
Una vivienda tipo “Apartamento”, con 1 parqueadero, en la “Zona Norte”,va a costar alrededor de 485 millones para estrato 4 y 665 millones para estrato 5
Teniendo en cuenta que se tiene preaprobado un máximo de 850 millones, el María podría ofrecerle la vivienda en estrato 4 por 582 millones, obteniendo así una posible ganancia de 97 millones (20% sobre la compra), para la compra del apartamento en estrato 5, se sugiere venderlo en 798 para así optener el mismo margen del 20% sobre el precio estimado por el modelo.