Métodos estadísticos para la toma de deciones

3. Caso Datos de precios de vivienda

library(dplyr)
library(readxl)
Datos_Vivienda <- read_excel("C:/Users/pocho/Desktop/R/Datos_Viviend.xlsx", 
    col_types = c("text", "text", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "text", "text", 
        "numeric", "numeric"), na = "0")
Datos_Viviend <- mutate_all(Datos_Vivienda, ~replace(., is.na(.), 0))

a.

Filtro:

Se presenta la manera paso a paso para poder filtrar y la manera con el uso del ampersand

## Manera paso a paso
pos=which(Datos_Viviend$Tipo == "Apartamento")
filtrov=Datos_Viviend[pos,]

pos2=which(filtrov$Zona == "Zona Norte")
filtrov2=filtrov[pos2,]

pos3=which(filtrov2$precio_millon < 500)
filtrov3=filtrov2[pos3,]

pos4=which(filtrov3$Area_contruida < 300)
filtrov4=filtrov3[pos4,]


### Manera &

posj= which(Datos_Viviend$Tipo == "Apartamento" & Datos_Viviend$Zona == "Zona Norte" & Datos_Viviend$precio_millon < 500 & Datos_Viviend$Area_contruida < 300)

datos_fil=Datos_Viviend[posj,]

Presentación de los 3 primeros datos y tablas

## Tres primeros registros
head(datos_fil,3)
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Norte 2 3 135 56 1 1 3 Apartamento torres de comfandi -76.46745 3.40763
Zona Norte NA 3 78 54 2 1 3 Apartamento chiminangos -76.47820 3.44898
Zona Norte NA 5 340 106 2 2 3 Apartamento la flora -76.48200 3.43500
## Tablas evidencia (las tablas precio y area se limitan a 8 registros por masividad de los datos en la presentacióm)

par(mfrow=c(2,2))
data.frame(table(datos_fil$Zona))
Var1 Freq
Zona Norte 1077
data.frame(b=table(datos_fil$Tipo))
b.Var1 b.Freq
Apartamento 1077
head(data.frame(table(datos_fil$precio_millon)),8)
Var1 Freq
65 1
69 1
70 4
72 2
73 1
75 6
76 1
77 1
head(data.frame(table(datos_fil$Area_contruida)),8)
Var1 Freq
35 1
42 1
43 1
44 3
45 2
46 4
47 2
48 5

Mapa

require(leaflet)
## Loading required package: leaflet
leaflet() %>% addCircleMarkers(lng = datos_fil$cordenada_longitud, lat = datos_fil$Cordenada_latitud,radius = 0.3, color = "red", label = datos_fil$Barrio) %>% addTiles()

Pese que en el mapa se muestra gran cantidad de puntos en el norte se evidencia también que hay personas que diligenciaron mas lo datos de referenciacion y por ello es que hay errores en la geolocalizacion

b.

Análisis exploratorio de los datos.

Se establece primero la base de datos con la variable respuesta (precio del apartamento) en función del área construida, estrato y si tiene parqueadero.

datos_ana=data.frame(datos_fil$precio_millon,datos_fil$Area_contruida,datos_fil$Estrato,datos_fil$parqueaderos)

names(datos_ana)=c("Precio_mill","Area_constr","Estrat","Parquead")

##datos_ana$Estrat=factor(datos_ana$Estrat,levels = c(3,4,5,6))

##datos_ana$Parquead=factor(datos_ana$Parquead,levels = c(1,2,3,NA))

as.numeric(datos_ana$Parquead)
##    [1] 1 2 2 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 2 2 0 1 0 1 1 0 0 1 1 1 1
##   [38] 2 0 0 2 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0
##   [75] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 2 1 1 2 0 1 0 0 1 0 1
##  [112] 1 1 1 1 1 1 0 1 1 1 0 0 1 1 1 2 1 0 0 1 0 2 0 0 1 1 0 0 0 1 0 0 0 2 0 0 0
##  [149] 0 0 0 1 1 0 1 0 1 2 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
##  [186] 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 0 2 1 2 1 0 1 1 0 0 0 0
##  [223] 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 2 1 1 1 1 1 1 1 0 1 1 2
##  [260] 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 2 0 0 1 0 1 0 0
##  [297] 1 0 0 1 0 2 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 0
##  [334] 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 2 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1
##  [371] 1 1 1 1 0 1 2 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 2 0 1 1 0 1 1
##  [408] 1 1 1 2 1 1 0 1 1 1 1 1 2 1 1 1 1 2 1 1 0 1 0 2 1 1 1 1 1 0 1 1 1 1 2 2 1
##  [445] 1 0 2 1 1 1 2 2 1 0 1 1 2 1 1 2 0 0 0 1 1 1 0 1 1 1 2 1 0 0 1 2 1 0 0 1 1
##  [482] 1 1 0 1 1 0 0 1 0 2 0 0 1 1 1 0 1 2 1 2 1 1 2 2 2 0 1 1 1 1 0 0 2 2 0 1 1
##  [519] 0 0 0 0 1 2 1 1 0 2 1 1 1 0 1 1 0 1 1 1 1 1 1 1 2 2 1 1 2 1 2 1 2 2 0 0 1
##  [556] 1 0 2 1 1 1 1 1 1 2 0 1 1 2 2 1 0 0 2 2 2 1 1 1 2 1 2 1 1 0 1 1 1 2 2 1 2
##  [593] 2 2 0 1 0 1 1 2 1 2 2 1 1 2 0 1 1 1 2 2 1 2 1 1 2 1 0 1 1 1 2 2 1 1 1 1 1
##  [630] 1 1 1 2 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 0 1 2 0 1 2 2 1
##  [667] 1 0 1 1 1 1 0 2 0 0 2 1 2 2 2 1 1 1 0 0 2 1 1 1 1 1 2 2 2 2 1 2 2 1 1 0 1
##  [704] 2 2 1 2 0 2 2 1 0 2 1 2 2 1 1 1 1 1 0 1 2 1 2 2 1 1 1 1 2 1 1 1 1 1 2 1 0
##  [741] 1 2 1 2 1 1 1 1 0 2 0 0 1 2 2 2 2 1 2 1 1 1 1 1 1 1 0 2 1 1 0 2 1 1 0 1 2
##  [778] 1 1 1 2 0 1 1 1 1 0 2 0 2 2 1 1 1 1 1 1 1 1 1 1 0 2 0 0 0 1 2 0 0 0 1 0 1
##  [815] 2 1 1 1 0 1 1 1 1 1 2 1 1 1 1 1 1 0 0 0 2 1 0 1 1 1 2 0 2 1 2 0 1 1 2 0 1
##  [852] 2 1 0 1 2 2 1 1 1 2 3 2 1 0 1 1 1 0 0 2 2 2 1 0 0 2 1 2 1 1 2 1 2 0 1 2 2
##  [889] 1 1 2 1 1 1 1 0 1 2 0 1 4 1 1 1 1 1 1 0 1 0 0 2 0 2 2 1 0 1 2 2 2 1 0 1 1
##  [926] 2 2 0 0 1 2 1 1 2 0 2 1 1 2 2 3 2 1 1 1 2 1 1 0 0 1 1 1 1 2 2 1 0 1 2 1 1
##  [963] 1 1 1 2 1 2 2 1 1 1 2 1 1 1 1 2 0 1 0 2 2 1 1 1 0 2 1 0 1 0 1 0 1 1 1 1 0
## [1000] 1 0 0 0 1 0 1 0 2 1 2 2 2 2 1 2 0 2 0 2 2 1 2 2 0 2 0 1 1 2 1 0 1 0 3 0 2
## [1037] 2 2 1 1 2 0 1 0 0 0 0 0 2 0 1 0 1 2 1 3 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
## [1074] 1 0 0 1
head(datos_ana,7)
Precio_mill Area_constr Estrat Parquead
135 56 3 1
78 54 3 2
340 106 5 2
135 103 3 1
75 54 3 1
175 77 4 1
99 58 3 0

Luego se analiza cada variable independiente con la variable respuesta (precio del apartamento) con graficos de correlación y plotly

Variable Area Construida

require(GGally)
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(GGally)
dat_ana1=data.frame(datos_ana$Precio_mill,datos_ana$Area_constr)
GGally::ggpairs(dat_ana1)

require(ggplot2)
library(ggplot2)
require(plotly)
## Loading required package: plotly
## 
## Attaching package: 'plotly'
## 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
library(plotly)

g3=ggplot(data = datos_ana, mapping = aes(x=Area_constr,y=Precio_mill))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g3)
## `geom_smooth()` using formula 'y ~ x'

En esta corelacioón se puede encontrar un 69,4%

Variable Estrato

dat_ana2=data.frame(datos_ana$Precio_mill,datos_ana$Estrat)
GGally::ggpairs(dat_ana2)

g4=ggplot(data = datos_ana, mapping = aes(x=Estrat,y=Precio_mill))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g4)
## `geom_smooth()` using formula 'y ~ x'

En esta corelacioón se puede encontrar un 82,3%

Variable Parqueadero

Como esta variable cuenta con NA se debe de hacer depuración de los NA a 0

dat_ana3=data.frame(datos_ana$Precio_mill,datos_ana$Parquead)
GGally::ggpairs(dat_ana3)

dat_ana3=data.frame(datos_ana$Precio_mill,datos_ana$Parquead)
GGally::ggpairs(dat_ana3)

g4=ggplot(data = datos_ana, mapping = aes(x=Estrat,y=Precio_mill))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g4)
## `geom_smooth()` using formula 'y ~ x'

En esta corelacioón se puede encontrar un 54,7%

En definitiva con todas las variables tiene una mejor correlación entre el precio de la vivienda es el estrato con un 82%

library(corrplot)
## corrplot 0.92 loaded
data=cbind(datos_ana[1],datos_ana[2],datos_ana[3],datos_ana[4])
mcor=cor(data)
mcor
##             Precio_mill Area_constr    Estrat  Parquead
## Precio_mill   1.0000000   0.6937608 0.8230851 0.5472535
## Area_constr   0.6937608   1.0000000 0.5807031 0.4276430
## Estrat        0.8230851   0.5807031 1.0000000 0.4764230
## Parquead      0.5472535   0.4276430 0.4764230 1.0000000
corrplot::corrplot(mcor,method = "number")

c.

Modelo de Regresión Lienal Múltiple.

modelo1=lm(Precio_mill~.,data = datos_ana)
modelo1
## 
## Call:
## lm(formula = Precio_mill ~ ., data = datos_ana)
## 
## Coefficients:
## (Intercept)  Area_constr       Estrat     Parquead  
##   -157.3822       0.9494      68.9944      22.6491

La ecuación de regresión es \[y=-157.3822 + (0.9494x) + (68.9944x) + (22.6491x)\] ESto quiere decir que el valor de una viviendia sin estimar variables como el area, estrato y parqueadero en la zona norte de Cali es de -157.3822 pesos y:

  1. Por cada metro cuadrado crece el valor de la vivienda 0.9494 pesos

  2. Por subir una categoria de estrato crece el valor de la vivienda 68.9944 pesos

  3. Por tener parqueadero crece el valor de la vivienda 68.9944 pesos

Ahora, para poder determinar que tanto el precio de la vivienda es explicado por las variables se encontrara el r\(^2\) y determinar la significancia de los de los supuestos

summary(modelo1)
## 
## Call:
## lm(formula = Precio_mill ~ ., data = datos_ana)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -216.571  -31.564   -1.213   27.889  224.053 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -157.38220    7.71190 -20.408  < 2e-16 ***
## Area_constr    0.94938    0.06054  15.682  < 2e-16 ***
## Estrat        68.99436    2.26623  30.445  < 2e-16 ***
## Parquead      22.64906    2.73064   8.294 3.24e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 53.75 on 1073 degrees of freedom
## Multiple R-squared:  0.7629, Adjusted R-squared:  0.7623 
## F-statistic:  1151 on 3 and 1073 DF,  p-value: < 2.2e-16

Con lo anterior se puede apreciar que todas las variables son significativas para el modelo y le aportan altamente ***, adicional el p-value: < 2.2e-16 con un r\(^2\) de 76%

modelo2=step(modelo1)
## Start:  AIC=8586.39
## Precio_mill ~ Area_constr + Estrat + Parquead
## 
##               Df Sum of Sq     RSS    AIC
## <none>                     3100324 8586.4
## - Parquead     1    198783 3299107 8651.3
## - Area_constr  1    710544 3810868 8806.6
## - Estrat       1   2678106 5778430 9255.0

d.

Validación de modelos.

Hipotesis:

¿Cuál sera el valor de un apartamento en la zona norte de Cali con un área de 92 mtr\(^2\), estrato 4 y 1 parqueadero?

R// El precio sera de 228.5872 y se moverá entre un rango entre 225.0252 y 232.1492

phm1=predict(modelo1,list(Area_constr=92,Estrat=4,Parquead=1),interval = "confidence",level = 0.95)
phm1
##        fit      lwr      upr
## 1 228.5872 225.0252 232.1492

e.

Validación de modelos.

Hipotesis:

¿Cuál sera el valor correcto de un apartamento en la zona norte de Cali con un área de 100 mtr\(^2\), estrato 4 y 1 parqueadero?

R// El precio sera de 236.1822 millones y se moverá entre un rango entre 232.2449 y 240.1195, por lo cual el valor estaría por encima de lo que se arroja el modelo.

phm1=predict(modelo1,list(Area_constr=100,Estrat=4,Parquead=1),interval = "confidence",level = 0.95)
phm1
##        fit      lwr      upr
## 1 236.1822 232.2449 240.1195

Tambien se puede comprobar con los datos que tenemos para corroborar la proyección

posm= which(datos_ana$Area_constr == 100 & datos_ana$Estrat == 4 & datos_ana$Parquead == 1)

datos_ana_fil=datos_ana[posm,]
datos_ana_fil
Precio_mill Area_constr Estrat Parquead
412 270 100 4 1
952 240 100 4 1