Cargue los paquetes “data.table”, “ggplot2” y “caret”, junto con la base de datos.
rm(list=ls())
library(data.table)
library(ggplot2)
library(caret)
library(scales)
library(moderndive)
library(knitr)
library(dplyr)
Base_datos <-fread("/Users/hassansantiago/Downloads/esi-2019---personas.csv")
Muestre un histograma de ingreso por region. Limite el histograma a las observaciones con ingresos (ss_t) mayores a 0 y menores a 2 millones de pesos. Recuerde ver la clase de las variables
Base_datos[,ss_t:=as.numeric(ss_t)]
ggplot(Base_datos[ss_t >0 & ss_t<2000000], aes(x=ss_t, fill=region)) +
geom_histogram(bins=16)+ facet_wrap(~region)
Arregle los gráficos para que cada uno tenga un eje x legible, además arregle el eje y. Agregue color a cada gráfico:(4 puntos) Hint: utilice la función scales = ‘free_y’ dentro de facet_wrap para dejar libre el eje y. También recuerde chequear la clase de la variable region para que se asigne correctamente un color a cada región.
class(Base_datos[,region])
## [1] "integer"
Base_datos[,region:=as.numeric(region)]
ggplot(Base_datos[ss_t >0 & ss_t<2000000], aes(x=ss_t, fill=region, color=region))+geom_histogram(bins=16)+ labs(x="Ingresos", title="Ingresos por regiones", caption = "Fuente: Instituto nacional de estadísticas-Chile") + theme(axis.text.x = element_text(angle=90,vjust=0.5))+ facet_wrap(facets="region", scales="free_y")
Realice un gráfico de dispersión que muestre la relación entre el ingreso y la edad.
ggplot(Base_datos,aes(x=edad, y=ss_t)) + geom_point(color="green")+scale_y_continuous(labels = number_format(scale = 1))
Un miembro de su equipo propone un modelo que calcule la incidencia del sexo y la educación en el ingreso, sin considerar variables adicionales. Usted quiere mostrarle que aquel modelo está incompleto. Para lograr esto, haga el modelo de regresión anteriormente mencionado.
Base_datos2<- mutate_all(Base_datos, ~replace(., is.na(.), 0))
reg_ing <- lm(ss_t~ cine+ sexo , data = Base_datos2)
Calcule el salario predicho para cada observación.
get_regression_table(reg_ing) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 132173.429 | 2869.307 | 46.065 | 0 | 126549.620 | 137797.237 |
| cine | 153.649 | 22.054 | 6.967 | 0 | 110.424 | 196.875 |
| sexo | -40065.659 | 1790.118 | -22.382 | 0 | -43574.269 | -36557.048 |
Base_datos[,prediccion1 :=predict(reg_ing)]
Dado el modelo anterior, calcule la predicción del salario para una mujer y para un hombre con educación Universitario
nuevo = data.frame(sexo=c(1,2), cine=c(7))
predict(object = reg_ing, newdata = nuevo)
## 1 2
## 93183.31 53117.66
Teniendo ya el modelo propuesto por su colega, contrarreste usted con un modelo de predicción en base a los datos con los que ya cuenta. Utilice el argumento na.action por los datos nulos en la función de la regresión.
reg_ing2 <- lm(ss_t~ cine+ sexo+ grupo_edad+ b1+ region , data = Base_datos2)
Calcule el salario predicho para cada observación..
Base_datos[,prediccion2 :=predict(reg_ing2)]
Contando ya con su modelo, usted puede realizar una comparación directa entre ambos. Calcule los errores de predicción dentro de muestra para ambos modelos.
Base_datos[,residuo:=resid(reg_ing)]
Base_datos[,residuo2:=resid(reg_ing2)]
Interprete la diferencia en los errores de predicción entre el Modelo 1 y el Modelo 2. ¿Qué modelo hace una mejor predicción dentro de muestra?
get_regression_table(reg_ing) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 132173.429 | 2869.307 | 46.065 | 0 | 126549.620 | 137797.237 |
| cine | 153.649 | 22.054 | 6.967 | 0 | 110.424 | 196.875 |
| sexo | -40065.659 | 1790.118 | -22.382 | 0 | -43574.269 | -36557.048 |
get_regression_table(reg_ing2) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 58182.041 | 3701.516 | 15.718 | 0 | 50927.113 | 65436.970 |
| cine | 121.618 | 21.868 | 5.561 | 0 | 78.757 | 164.479 |
| sexo | -30175.781 | 1814.693 | -16.629 | 0 | -33732.558 | -26619.003 |
| grupo_edad | 5458.634 | 365.000 | 14.955 | 0 | 4743.238 | 6174.029 |
| b1 | 9331.390 | 284.457 | 32.804 | 0 | 8773.857 | 9888.923 |
| region | 1865.468 | 218.437 | 8.540 | 0 | 1437.334 | 2293.603 |
Dado los resultados,se puede de notar que todas las variables agregadas al modelo 2 ( reg_ing2) son estadisticamente significativas y tienen un efecto en la predicción del ingreso; dado que sus estimadores son distintos a 0. Al considerar mas variables que tienene incidencia en el ingreso la proyeccion 2 es mas precisa que el modelo 1.
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 obtenidas en el análisis dentro de muestra?
set.seed(12345) ## setear una semilla
setupKCV <- trainControl(method = "cv" , number = 5)
CVBase_datos_reg1<-train(ss_t~ cine+ sexo , data = Base_datos2,method="lm",trControl= setupKCV)
CVBase_datos_reg2<-train(ss_t~ cine+ sexo+ grupo_edad+ b1+ region , data = Base_datos2,method="lm",trControl= setupKCV)
print(CVBase_datos_reg1)
## Linear Regression
##
## 96240 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 76992, 76992, 76992, 76992, 76992
## Resampling results:
##
## RMSE Rsquared MAE
## 277341.9 0.005646889 125483.2
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(CVBase_datos_reg2)
## Linear Regression
##
## 96240 samples
## 5 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 76992, 76992, 76992, 76992, 76992
## Resampling results:
##
## RMSE Rsquared MAE
## 274773.6 0.02382866 118432.4
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
SI se mantienen, se ratifica que el modelo 2 predice de mejor manera los ingresos; al comparar los “Rsquared” vemos que el modelo 2 tiene un mayor valor (0.02382866>0.005646889) lo que indica que el modelo 2 explica en mayor medida la predicción.