Cargue los paquetes “data.table”, “ggplot2” y “caret”, junto con la base de datos. (1 punto)
library(data.table)
library(ggplot2)
library(caret)
esi2019<-fread("C:/Users/Constanza/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 (4 puntos)
esi2019[,ss_t:=as.numeric(ss_t)]
str(esi2019$ss_t)
## num [1:96240] 0 229822 0 0 1100000 ...
esi2019[,region:=as.character(region)]
str(esi2019$region)
## chr [1:96240] "13" "13" "11" "11" "11" "11" "11" "11" "8" "8" "8" "11" ...
ggplot(data=esi2019[ss_t>0 & ss_t<2000000], aes(x=ss_t)) + geom_histogram() + facet_wrap(facets = "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.
esi2019[,ss_t:=as.numeric(ss_t)]
esi2019[,region:=as.character(region)]
ggplot(data=esi2019[ss_t>0 & ss_t<2000000], aes(x=ss_t, fill=region)) +
geom_histogram(color="black") +
facet_wrap(~region, scale="free_y") + theme(axis.text.x = element_text(angle=75, vjust=0.6)) + labs(x="Ingresos", y="", title = "Ingresos por región", caption = "Fuente: INE" )
Realice un gráfico de dispersión que muestre la relación entre el ingreso y la edad. (4 puntos)
esi2019<-esi2019[!is.na(esi2019$ss_t)]
ggplot(esi2019, aes(x=edad, y=ss_t)) + geom_point() + labs(title="Relación Edad-Ingreso", x="Edad", y="Ingresos", caption="Fuente: INE") + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})
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. (5 puntos)
reg_1 <- lm(ss_t~ sexo + cine , data = esi2019)
get_regression_table(reg_1) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 170227.110 | 3498.074 | 48.663 | 0 | 163370.906 | 177083.31 |
| sexo | -54407.560 | 2163.093 | -25.153 | 0 | -58647.209 | -50167.91 |
| cine | 202.736 | 26.849 | 7.551 | 0 | 150.112 | 255.36 |
Calcule el salario predicho para cada observación.(4 puntos)
esi2019[,prediccion_1:=predict(reg_1)]
Dado el modelo anterior, calcule la predicción del salario para una mujer y para un hombre con educación Universitario (5 puntos)
esi2019_2<-esi2019[cine==7]
esi2019_2[,mean(prediccion_1), by= "sexo"]
## sexo V1
## 1: 1 117238.70
## 2: 2 62831.14
La predicción de salario para una mujer con educación universitaria será de 62831,14 y para un hombre con educación universitaria será de 117238,7.
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. (7 puntos)
reg_2 <- lm(ss_t~ sexo+cine+edad+region , data = esi2019, na.action(esi2019))
get_regression_table(reg_2) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 129401.481 | 6986.795 | 18.521 | 0.000 | 115707.406 | 143095.556 |
| sexo | -57576.095 | 2153.554 | -26.735 | 0.000 | -61797.048 | -53355.142 |
| cine | 166.899 | 26.688 | 6.254 | 0.000 | 114.591 | 219.207 |
| edad | 956.663 | 43.742 | 21.871 | 0.000 | 870.929 | 1042.398 |
| region10 | 347.659 | 7153.907 | 0.049 | 0.961 | -13673.956 | 14369.273 |
| region11 | 18748.520 | 8819.281 | 2.126 | 0.034 | 1462.782 | 36034.258 |
| region12 | 57918.561 | 9621.285 | 6.020 | 0.000 | 39060.899 | 76776.223 |
| region13 | 53681.685 | 6490.757 | 8.270 | 0.000 | 40959.839 | 66403.530 |
| region14 | 3595.879 | 8245.925 | 0.436 | 0.663 | -12566.084 | 19757.842 |
| region15 | -19177.859 | 8270.124 | -2.319 | 0.020 | -35387.253 | -2968.466 |
| region16 | -22530.338 | 8771.861 | -2.568 | 0.010 | -39723.134 | -5337.542 |
| region2 | 57365.309 | 8414.961 | 6.817 | 0.000 | 40872.036 | 73858.581 |
| region3 | 10311.325 | 8752.041 | 1.178 | 0.239 | -6842.623 | 27465.272 |
| region4 | -15232.933 | 7442.489 | -2.047 | 0.041 | -29820.167 | -645.699 |
| region5 | 8488.458 | 6748.328 | 1.258 | 0.208 | -4738.225 | 21715.140 |
| region6 | -10040.376 | 7510.290 | -1.337 | 0.181 | -24760.499 | 4679.747 |
| region7 | -18659.604 | 7322.094 | -2.548 | 0.011 | -33010.864 | -4308.343 |
| region8 | -13940.893 | 6926.813 | -2.013 | 0.044 | -27517.404 | -364.382 |
| region9 | -19130.623 | 7573.619 | -2.526 | 0.012 | -33974.871 | -4286.374 |
Calcule el salario predicho para cada observación. (5 puntos)
esi2019[,prediccion_2:=predict(reg_2)]
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. (8 puntos)
prediccion_1<-predict(reg_1)
esi2019[,prediccion_1:=predict(reg_1)]
predicciones1<-data.table(RMSE=RMSE(prediccion_1,esi2019$ss_t), MAE=MAE(prediccion_1,esi2019$ss_t))
prediccion_2<-predict(reg_2)
predicciones2<-data.table(RMSE=RMSE(prediccion_2,esi2019$ss_t), MAE=MAE(prediccion_2,esi2019$ss_t))
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? (5 puntos)
La raíz del error cuadrático medio de la predicción del modelo 1 (de nuestro colega) es 303322.1 mientras que la de la predicción del modelo 2 es 301121.3, siendo la diferencia entre modelo 1 y modelo 2 de 2200,8. Por otro lado, la media absoluta del error de la predicción del modelo 1 es de 147367 y la de la predicción del modelo 2 es de 144524.1, siendo la diferencia entre el modelo 1 y el modelo 2 de 2842,9. Estos datos nos muestran que los indicadores son menores en el segundo modelo y, por ende, este hace una mejor predicción de la muestra.
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? (9 puntos)
Importante: Utilice set.seed(12345). Si no sabe qué hacer con los NA, lea la documentación de la fución para saber como omitirlos.
set.seed(12345)
setup <- trainControl(method = "cv" , number = 5)
predkfolds1<-train(ss_t ~ sexo + cine,data=esi2019,method="lm",trControl= setup)
predkfolds2<-train(ss_t ~ sexo+cine+edad+region, data=esi2019, method="lm", trControl= setup)
print(predkfolds1)
## Linear Regression
##
## 79088 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 63270, 63270, 63271, 63271, 63270
## Resampling results:
##
## RMSE Rsquared MAE
## 302710.7 0.008607358 147381.8
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(predkfolds2)
## Linear Regression
##
## 79088 samples
## 4 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 63270, 63270, 63270, 63271, 63271
## Resampling results:
##
## RMSE Rsquared MAE
## 301062.8 0.02257009 144564.2
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Dado lo anterior, podemos concluir que se mantienen las conclusiones obtenidas dentro de la muestra ya que siguen siendo menores los errores del modelo 2, sugiriendo que es un mejor predictor.