Cargue los paquetes “data.table”, “ggplot2” y “caret”, junto con la base de datos. (1 punto)
rm(list=ls())
library(data.table)
library(ggplot2)
library(caret)
personas <- fread("esi-2019---personas.csv")
library(plotly)
library(RColorBrewer)
library(janitor)
library(tidyverse)
library(broom)
library(rgbif)
library(scales)
library(stringr)
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)
###Clase de ingreso
str(personas$ss_t)
## chr [1:96240] "0" "229822" "0" "0" "1100000" "6e+05" "0" "0" "242305" "0" ...
###Cambiar clase de ingreso de caracter a numerico
personas[,ingreso:=as.numeric(ss_t)]
###Crear variable con nombre de regiones
personas[region==1,nombre_region:='Tarapacá']
personas[region==2 ,nombre_region:='Antofagasta']
personas[region==3 ,nombre_region:='Atacama']
personas[region==4 ,nombre_region:='Coquimbo']
personas[region==5 ,nombre_region:='Valparaíso']
personas[region==6 ,nombre_region:="O'Higgins"]
personas[region==7 ,nombre_region:='Maule']
personas[region==8 ,nombre_region:='Biobío']
personas[region==9 ,nombre_region:='Araucanía']
personas[region==10 ,nombre_region:='Los Lagos']
personas[region==11 ,nombre_region:='Aysén']
personas[region==12 ,nombre_region:='Magallanes']
personas[region==13 ,nombre_region:='Metropolitana']
personas[region==14 ,nombre_region:='Los Ríos']
personas[region==15 ,nombre_region:='Arica y Parinacota']
personas[region==16 ,nombre_region:='Ñuble']
###Hitograma
ggplot(data=personas[ingreso>0 & ingreso<2000000],mapping = aes(x=ingreso))+
geom_histogram()+
facet_wrap(facets = "nombre_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.
ggplot(data=personas[ingreso>0 & ingreso<2000000],mapping = aes(x=ingreso,fill=nombre_region))+
geom_histogram()+
facet_wrap(facets = "nombre_region",scales = 'free_y')+
theme(axis.text.x = element_text(angle=90, vjust=0.5)) +
theme(legend.position = 'none') +
labs(title = 'Ingresos', subtitle = 'Por región',
caption = 'Esta Suplementaria de Ingresos (ESI) elaborada por INE',
x = 'Ingresos',y = 'N° de personas') +
scale_x_continuous(labels = number_format(scale = 0.000001, suffix = " M."))
Realice un gráfico de dispersión que muestre la relación entre el ingreso y la edad. (4 puntos)
ggplot(personas,aes(x=edad,y=ingreso)) +
geom_point() +
geom_smooth() +
labs(title = 'Relación entre ingreso y edad',
caption = 'Esta Suplementaria de Ingresos (ESI) elaborada por INE',
x = 'Edad',y = 'Ingreso') +
scale_y_continuous(labels = number_format(scale = 0.000001, suffix = "M."))
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)
personas1<-personas[is.na(ingreso)==FALSE]
personas1<-personas1[is.na(habituales)==FALSE]
personas1<-personas1[is.na(b1)==FALSE]
personas1<-personas1[is.na(c1)==FALSE]
Dado que en la segunda regresión agregaremos las variables habituales, c1 y b1, es que se tomó la decisión de eliminar los NA asociados a estas, para de esta forma realizar una comparación óptima de los resultados de ambas regresiones, pues se tendra la misma cantidad de observaciones.
reg1<-lm(data=personas1,formula=ingreso~sexo+cine)
summary(reg1)
##
## Call:
## lm(formula = ingreso ~ sexo + cine, data = personas1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -543810 -292308 -238998 109973 9706681
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 344607.22 9265.54 37.192 < 2e-16 ***
## sexo -53310.05 6111.23 -8.723 < 2e-16 ***
## cine 252.77 63.09 4.007 6.17e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 485200 on 25701 degrees of freedom
## Multiple R-squared: 0.003558, Adjusted R-squared: 0.003481
## F-statistic: 45.89 on 2 and 25701 DF, p-value: < 2.2e-16
Al realizar la regresión 1 se pudo observar que el modelo está incompleto puesto que R cuadrado posee un valor cercano a 0, siendo este un 0,3%, lo cual implica que las variables sexo y educación explican un porcentaje muy bajo del ingreso.
Calcule el salario predicho para cada observación. (4 puntos)
pred1<-predict(reg1) ##Calcular los y predichos para cada observación
personas1[,pred1:=predict(reg1)] ##Agregar columna de predicción para cada observación
Dado el modelo anterior, calcule la predicción del salario para una mujer y para un hombre con educación Universitario (5 puntos)
pred_uni<-personas1[,c("sexo", "cine", "pred1")]
pred_uni[cine==7]
## sexo cine pred1
## 1: 1 7 293066.5
## 2: 1 7 293066.5
## 3: 1 7 293066.5
## 4: 2 7 239756.5
## 5: 1 7 293066.5
## ---
## 4797: 1 7 293066.5
## 4798: 1 7 293066.5
## 4799: 1 7 293066.5
## 4800: 2 7 239756.5
## 4801: 1 7 293066.5
pred_uni <- pred_uni[!duplicated(pred1)]
pred_uni[cine==7]
## sexo cine pred1
## 1: 1 7 293066.5
## 2: 2 7 239756.5
El salario predicho para mujer (2) con educacion universitaria es de 239.756 pesos y el salario predicho para hombre (1) con educacion universitaria es de 293.066 pesos.
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)
#filtramos por fila, que sean personas con horas habituales mayores a 900
personas2<-personas1[!habituales %like% "999",]
reg2<-lm(data=personas2,formula=ingreso~sexo+cine+edad+habituales+c1+b1, na.action = na.omit)
summary(reg2)
##
## Call:
## lm(formula = ingreso ~ sexo + cine + edad + habituales + c1 +
## b1, data = personas2, na.action = na.omit)
##
## Residuals:
## Min 1Q Median 3Q Max
## -725738 -253452 -63753 148605 9384855
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1223481.13 22914.99 53.392 < 2e-16 ***
## sexo -72715.97 5739.36 -12.670 < 2e-16 ***
## cine 233.42 57.33 4.071 4.69e-05 ***
## edad -1456.28 186.67 -7.802 6.35e-15 ***
## habituales -1434.41 224.76 -6.382 1.78e-10 ***
## c1 -276441.74 8939.41 -30.924 < 2e-16 ***
## b1 -66177.91 1154.78 -57.308 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 440800 on 25696 degrees of freedom
## Multiple R-squared: 0.1778, Adjusted R-squared: 0.1776
## F-statistic: 926.1 on 6 and 25696 DF, p-value: < 2.2e-16
Calcule el salario predicho para cada observación. (5 puntos)
pred2<-predict(reg2) ## calcular los y predichos para cada observación
personas2[,pred2:=predict(reg2)]
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)
predicciones1<-data.table(RMSE=RMSE(pred1,personas1$ingreso), ###Error cuadratico medio
MAE=MAE(pred1,personas1$ingreso)) ###Media absoluta del error
predicciones1
## RMSE MAE
## 1: 485208.6 301705.4
predicciones2<-data.table(RMSE=RMSE(pred2,personas2$ingreso), ###Error cuadratico medio
MAE=MAE(pred2,personas2$ingreso)) ###Media absoluta del error
predicciones2
## RMSE MAE
## 1: 440760.2 268614.5
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)
El error cuadrático medio del modelo 1 en comparación al del modelo 2 es mayor, por ende, las variables que se consideran en el modelo 1 no son suficientemente significativas para realizar una buena predicción de los ingresos. Por el contrario, en el modelo 2 se decidió incluir las siguientes variables:
En la realidad estas variables si afectan el ingreso de una persona, ya que influye en cuanto sera remunerado el trabajador, por ende se deben considerar. Esto se corrobora a través del resultado del error cuadrático medio, el cual fue inferior al del primer modelo, además de un R-cuadrado igual a 17% mayor que un 0,3% del modelo 1, esto se traduce en una menor dispersión entre la línea de tendencia y los datos observados, por ende una menor desviación estándar.
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)
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)
kfolds1<-train(ingreso~sexo+cine,data=personas1,method="lm",trControl= setupKCV)
kfolds2<-train(ingreso~sexo+cine+edad+habituales+c1+b1,data=personas2,method="lm",trControl= setupKCV)
print(kfolds1)
## Linear Regression
##
## 25704 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 20563, 20563, 20563, 20564, 20563
## Resampling results:
##
## RMSE Rsquared MAE
## 485109 0.003733476 301722.9
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(kfolds2)
## Linear Regression
##
## 25703 samples
## 6 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 20562, 20562, 20562, 20563, 20563
## Resampling results:
##
## RMSE Rsquared MAE
## 440325.4 0.1784431 268665.1
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Los magnitud de variación del RMSE, MAE y R-cuadrado son mínimas, por ende las conclusiones obtenidas del análisis dentro de la muestra que se hicieron en un principio se mantienen.