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:
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")
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")
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")
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")
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.
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)]
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)]
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
Calcule el salario predicho para cada observación.. (5 puntos)
Salarios[,NuestraR:=predict(NuestraRegresion,na.action = na.exclude)]
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)]
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
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.