Cargue los paquetes y las bases necesarias para poder trabajar con la base de datos de personas, hogares y viajes de la Encuesta Origen y Destino en clase data.table.
#install.packages("rpart")
#install.packages("rpart.plot")
#install.packages("caret")
#install.packages("data.table")
#install.packages("jtools")
library(rpart)
library(rpart.plot)
library(caret)
library(data.table)
library(jtools)
hogares<-fread("Base_Hogares.csv")
personas<-fread("Base_Personas.csv")
viajes<-fread("Base_Viajes.csv")
EOD<-merge(x=hogares,y=personas,by="Hogar")
b.Reemplaza el objeto “EOD” con un merge entre la base EOD y viajes, dados los identificadores de hogares y de personas. De esta forma, tendrá información más detallada de las familias, las personas y los flujos de viajes.
EOD<-merge(x=EOD,y=viajes,by=c("Hogar","Persona"))
El análisis se realizará a nivel de personas. Para esto crea un objeto denominado “personaseod” que contenga las variables edad, sexo, educ, IngresoFinal, Factor, comunahg, Macrozonahg, la distancia promedio que recorre cada persona y los minutos de viaje promedio. Además, borre todas las observaciones que tienen ´NA´ en alguna de las variables.
personaseod<-EOD[,.(edad,sexo,educ,IngresoFinal,Factor,comunahg,Macrozonahg,distancia,minutosviaje)]
personaseod<-na.omit(personaseod)
Realice dos modelos de regresión lineal para predecir los minutos promedios de viaje de cada persona ¿Cuál predice mejor dentro de muestra?. Trabaje con la base personaseod.
reg1<-lm(data= personaseod ,formula =minutosviaje~distancia+edad)
summ(reg1)
## MODEL INFO:
## Observations: 59161
## Dependent Variable: minutosviaje
## Type: OLS linear regression
##
## MODEL FIT:
## F(2,59158) = 15453.93, p = 0.00
## R² = 0.34
## Adj. R² = 0.34
##
## Standard errors: OLS
## ------------------------------------------------
## Est. S.E. t val. p
## ----------------- ------- ------ -------- ------
## (Intercept) 16.90 0.17 102.40 0.00
## distancia 0.00 0.00 175.60 0.00
## edad -0.03 0.00 -9.49 0.00
## ------------------------------------------------
personaseod[,pred1:=predict(reg1,na.action = na.exclude)]
reg2<-lm(data= personaseod ,formula =minutosviaje~distancia+edad+sexo+comunahg)
summ(reg2)
## MODEL INFO:
## Observations: 59161
## Dependent Variable: minutosviaje
## Type: OLS linear regression
##
## MODEL FIT:
## F(7,59153) = 4555.27, p = 0.00
## R² = 0.35
## Adj. R² = 0.35
##
## Standard errors: OLS
## ----------------------------------------------------------
## Est. S.E. t val. p
## --------------------------- ------- ------ -------- ------
## (Intercept) 10.64 0.35 30.30 0.00
## distancia 0.00 0.00 175.39 0.00
## edad -0.03 0.00 -9.91 0.00
## sexoMujer -0.09 0.14 -0.63 0.53
## comunahgQuilpue 5.38 0.35 15.52 0.00
## comunahgValparaiso 6.20 0.34 18.49 0.00
## comunahgVilla Alemana 5.51 0.36 15.27 0.00
## comunahgVina del Mar 7.80 0.33 23.71 0.00
## ----------------------------------------------------------
personaseod[,pred2:=predict(reg2,na.action = na.exclude)]
#Sacando los RMSE y MAE
predicciones1<-data.table(RMSE=RMSE(personaseod[,pred1],personaseod[,minutosviaje]),
MAE=MAE(personaseod[,pred1],personaseod[,minutosviaje]))
predicciones2<-data.table(RMSE=RMSE(personaseod[,pred2],personaseod[,minutosviaje]),
MAE=MAE(personaseod[,pred2],personaseod[,minutosviaje]))
A partir de los R cuadrados y de los RMSE y MAE, podemos concluir que el mejor modelo es el segundo, ya que es el que presenta mayor R cuadrado (0.35) y menor RMSE y MAE.
Realice validación cruzada (CV) a los modelos de la pregunta anterior por el método K-folds con 5 folds. ¿Se mantienen las conclusiones anteriores? Trabaje con la base personaseod.
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)
predkfolds1<-train(minutosviaje~distancia+edad,data=personaseod,method="lm",trControl= setupKCV)
predkfolds2<-train(minutosviaje~distancia+edad+sexo+comunahg,data=personaseod,method="lm",trControl= setupKCV)
print(predkfolds1)
## Linear Regression
##
## 59161 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 47329, 47328, 47329, 47329, 47329
## Resampling results:
##
## RMSE Rsquared MAE
## 16.48867 0.343459 11.67049
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(predkfolds2)
## Linear Regression
##
## 59161 samples
## 4 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 47329, 47328, 47329, 47329, 47329
## Resampling results:
##
## RMSE Rsquared MAE
## 16.39885 0.3505077 11.57631
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
#Interpretacion: Si, haciendo el metodo de validacion cruzada podemos notar que se mantienen las mismas conclusiones, en donde el modelo numero 2 es el que mejor predice.
Realice dos modelos de árboles de clasificación. Pruebe cuál clasifica mejor con validación cruzada. Entrene el modelo con un 80% de la muestra y testee con el 20% restante. Trabaje con la base personaseod.
arb1<-rpart(comunahg~., subset = IngresoFinal,
data = personaseod, method = "class")
rpart.plot(arb1)
set.seed(1234)
ind<-createDataPartition(personaseod$comunahg,times = 1,p = 0.8,list = F)
train1<-personaseod[ind]
test1<-personaseod[-ind,]
arb2<-rpart(comunahg~., subset = edad,
data = personaseod, method = "class")
rpart.plot(arb2)
set.seed(1234)
ind<-createDataPartition(personaseod$comunahg,times = 1,p = 0.8,list = F)
train2<-personaseod[ind]
test2<-personaseod[-ind,]
#Validacion Cruzada
matconf<-table(test$comunahg,pred)
precis<-sum(diag(matconf))/sum(matconf)
prec<-function(x,y,z) {
pred <- predict(x, y, type = "class")
matconf <- table(y[,z], pred)
test<- sum(diag(matconf)) / sum(matconf)
test
}
prec(arb2,test,"comunahg")