Tarea 5

Suponga que a usted le han contratado desde la SEREMI de desarrollo social para encontrar algún modelo que haga una predicción del salario de las personas. Para ello, le han proporcionado algunos datos sobre el salario para distintos individuos, con los cuales usted deberá encontrar algún vínculo entre alguna variable interesante y el salario. Para esto:

P1

Cargue los paquetes “data.table”, “ggplot2” y “caret”, junto con la base de datos. (1 punto)

library(data.table)
library(caret)
library(ggplot2)
library(moderndive) 
Salarios <- fread("C:/Users/franc/Desktop/7° Semestre/Data science/11.1 Tarea 5/esi-2019---personas.csv")

P2

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)

Salarios[,ss_t:= as.numeric(ss_t)]
Salarios[,region:= as.numeric(region)]


Salarios <- Salarios [ ss_t != 0]
Salarios <- Salarios [ ss_t < 2000000]


ggplot(data=Salarios, aes(x=region, y=ss_t))+ 
geom_bar(stat="identity")

P3

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=Salarios, aes(x=region, y=ss_t, color=region))+ 
geom_bar(stat="identity")+ facet_wrap(~region,scale='free_y') + 
theme(axis.text.x = element_text(angle = 90, vjust=0,5)) +
scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) +
  
labs(x="Región", y="Ingreso", title="Ingresos por región", caption="Fuente: INE")

P4

Realice un gráfico de dispersión que muestre la relación entre el ingreso y la edad. (4 puntos)

ggplot(Salarios,aes(x=edad, y=ss_t,color = edad)) +  
  geom_point() + geom_smooth(color="aquamarine")+
  scale_color_gradient(low = "#F1948A", high = "#E74C3C")

P5

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)

Regresion1 <- lm(ss_t~sexo+nivel , data = Salarios)
summary(Regresion1)
## 
## Call:
## lm(formula = ss_t ~ sexo + nivel, data = Salarios)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -524298 -222331 -114755  116175 1533108 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 602422.41    9490.27  63.478   <2e-16 ***
## sexo        -69070.33    6195.71 -11.148   <2e-16 ***
## nivel          118.23      71.36   1.657   0.0976 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 332600 on 11655 degrees of freedom
## Multiple R-squared:  0.01074,    Adjusted R-squared:  0.01057 
## F-statistic: 63.28 on 2 and 11655 DF,  p-value: < 2.2e-16
# el modelo solo explica el 0,8% aproximadamente la variación del ingreso, por lo que el planteamiento descrito es incorrecto. 

P 5.1

Calcule el salario predicho para cada observación. (4 puntos)

Salarios <- Salarios[is.na(ss_t) == F]  
Salarios <- Salarios[is.na(sexo) == F]  
Salarios <- Salarios[is.na(nivel) == F]  


Salarios[,pred1:=predict(Regresion1,na.action = na.exclude)]

P 5.2

Dado el modelo anterior, calcule la predicción del salario para una mujer y para un hombre con educación Universitario (5 puntos)

Rhombres <- lm(ss_t~(sexo==1) + (nivel==9), data = Salarios)          #hombre 
Rmujeres <- lm(ss_t~(sexo==0) + (nivel==9), data = Salarios)          #Mujer

Salarios[,Rhombres:=predict(Rhombres,na.action = na.exclude)]
Salarios[,Rmujeres:=predict(Rmujeres,na.action = na.exclude)]

P 6

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)

NuestraRegresion  <- lm(ss_t~sexo+nivel+grupo_edad+region+edad , data = Salarios)
summary(NuestraRegresion)
## 
## Call:
## lm(formula = ss_t ~ sexo + nivel + grupo_edad + region + edad, 
##     data = Salarios)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -563853 -212186  -99877  109479 1568179 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 664701.25   17275.12  38.477   <2e-16 ***
## sexo        -70870.52    6145.48 -11.532   <2e-16 ***
## nivel          110.88      70.72   1.568    0.117    
## grupo_edad  110161.95    7563.83  14.564   <2e-16 ***
## region        1034.65     761.17   1.359    0.174    
## edad        -12192.14     933.22 -13.065   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 329300 on 11652 degrees of freedom
## Multiple R-squared:  0.0302, Adjusted R-squared:  0.02978 
## F-statistic: 72.56 on 5 and 11652 DF,  p-value: < 2.2e-16

P 6.1

Calcule el salario predicho para cada observación.. (5 puntos)

Salarios[,NuestraR:=predict(NuestraRegresion,na.action = na.exclude)]

P.7.1

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)

Salarios[,residuo:=resid(Regresion1)]
Salarios[,residuoNuestro:=resid(NuestraRegresion)]


xd <- Salarios [ , sum ( residuo)] 
xd2 <- Salarios [ , sum ( residuoNuestro)] 

P 8

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)

residuootromodelo <- xd*xd
residuonuestromodelo <- xd2*xd2

residuootromodelo = 2,343……..-0,8 residuonuestromodelo = 8,298……..-0,11

P 9

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) ## setear una semilla

nombre1 <- trainControl(method = "cv" , number = 5)

nombre2<-train(ss_t~sexo+nivel,data=Salarios,method="lm",trControl= nombre1)

nombre3<-train(ss_t~sexo+nivel+grupo_edad+region+edad,data=Salarios,method="lm",trControl= nombre1)

print(nombre2)
## Linear Regression 
## 
## 11658 samples
##     2 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 9326, 9326, 9326, 9327, 9327 
## Resampling results:
## 
##   RMSE      Rsquared    MAE     
##   332568.2  0.01086285  245977.4
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
print(nombre3)
## Linear Regression 
## 
## 11658 samples
##     5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 9326, 9327, 9326, 9326, 9327 
## Resampling results:
## 
##   RMSE      Rsquared    MAE     
##   329382.3  0.03031369  242555.3
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE

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.