library(data.table)
library(factoextra)
library(dbscan)
library(ggplot2)
library(data.table)
library(rpart.plot)
library(rpart)
library(caret)
path <- 'C:/Users/matir/OneDrive/Escritorio/Mati/Universidad/2021/Segundo Semestre/Data Science/Tarea 6/'
casen <- fread(paste0(path,'CASEN 2020 Valpo.csv'))
Filtre la base “casen”, quedandose con solo aquellas observaciones cuya edad sea igual o mayor a 15 y donde la variable “activ” no sea NA. Que dicha base se siga llamando “casen”. Cree una nueva variable que se llame “cae_general”, la cual será valor “Ocupado” si “activ” = 1, “Desocupado” si “activ” = 2 e “Inactivo” si “activ” = 3.(2 pts.)
Luego, cree una nueva base llamada “casen_inf” que contenga solo aquellas observaciones que cumplan que “ocup_inf” sea 1 o 2. Cree una nueva variable “informalidad”, la cual aquiera valor “Informal” si “ocup_inf” = 1 e “Formal” si “ocup_inf” = 2. (2 pts.)
casen <- casen[edad>=15]
casen <- casen[!is.na(activ),]
casen[activ== 1, cae_general := "Ocupado"]
casen[activ== 2, cae_general := "Desocupado"]
casen[activ== 3, cae_general := "Inactivo"]
casen_inf <- casen[ocup_inf==1 | ocup_inf==2]
casen_inf[ocup_inf== 1, Informalidad := "Informal"]
casen_inf[ocup_inf== 2, Informalidad := "Formal"]
Clasifique a los trabajadores formales e informales de acuerdo con su edad “edad” y años de escolaridad “esc2”. (2 pts) Posteriormente, muestre el gráfico del arbol de decisión. Interprete los resultados. (4 pts.)
casen_inf2 <- casen_inf[,.(Informalidad, edad, esc2)]
Realizamos arbol de decision:
arbol_1 <- rpart(Informalidad~edad+esc2, data=casen_inf, method = "class")
rpart.plot(arbol_1, main = "Árbol de Clasificación: Trabajadores por Condicion Laboral",extra = 104,
box.palette = "GnBu",
branch.lty = 3,
shadow.col = "gray",
nn = TRUE,)
rpart.rules(arbol_1, style = "tall")
## Informalidad is 0.34 when
## esc2 < 11
## edad >= 66
##
## Informalidad is 0.39 when
## esc2 < 11
## edad < 41
##
## Informalidad is 0.54 when
## esc2 < 11
## edad is 41 to 66
##
## Informalidad is 0.74 when
## esc2 >= 11
Interpretacion: La gracia de este arbol decision es que se podrá predecir si la calidad de ocupacion de una persona es Formal o Informal. Por ejemplo: si tiene menos de 41 años y además tiene menos de 11 años de escolaridad, entonces su calidad de ocupacion será Formal (un 3% de la muestra teniendo en cuenta los datos anteriores.) Cada nodo muestra la proporcion de cada categoria y la prporcion del total de datos, donde nos entregan una nocion sobre la precision del modelo al hacer las predicciones. Para entender una toma de decision, recomendamos ver el arbol de arriba hacia abajo.
Volviendo a la base “casen”, cree una nueva base llamada “casen_sal” que contenga aquellas observaciones donde sist_salud va del 1 al 4. Luego, en esta nueva base, cree una columna llamada “sistema de salud” que adquiere el valor de “FONASA” si “sist_salud” = 1, “ISAPRE” si “sist_salud” = 2, “CAPREDENA” si “sist_salud” es = 3 y “PARTICULAR” si “sist_salud” es igual a 4. (2 pts.)
Clasifique a a las personas segun su sistema de salud. Para eso, considere las variables de años de escolaridad “esc2” e ingreso del trabajo “ytrabajocor”. (2 pts)
Posteriormente, muestre el gráfico del arbol de decisión. Interprete los resultados. (4 pts.)
casen_sal <- casen[,.(sist_salud, esc2, ytrabajocor)]
casen_sal <- casen_sal[sist_salud== 1 | sist_salud== 2 | sist_salud==3 | sist_salud== 4]
casen_sal[sist_salud== 1, Sistema_de_Salud := "FONASA"]
casen_sal[sist_salud== 2, Sistema_de_Salud := "ISAPRE"]
casen_sal[sist_salud== 3, Sistema_de_Salud := "CAPREDENA"]
casen_sal[sist_salud== 4, Sistema_de_Salud := "PARTICULAR"]
Realizamos Arbol de decision:
arbol_2 <- rpart(Sistema_de_Salud~esc2+ytrabajocor, data=casen_sal, cp = 0.005)
rpart.plot(arbol_2, main = "Árbol de Clasificación: Trabajadores por Sistema de Salud")
rpart.plot(arbol_2, type = 3, clip.right.labs = FALSE,
branch = .4,
box.palette = "Blues",
main = "Árbol de Clasificación: Trabajadores por Sistema de Salud")
rpart.plot(arbol_2, shadow.col = "gray",
main = "Árbol de Clasificación: Trabajadores por Sistema de Salud")
rpart.plot(arbol_2, extra = 104,
box.palette = "GnBu",
branch.lty = 3,
shadow.col = "gray",
nn = TRUE,
main = "Árbol de Clasificación: Trabajadores por Sistema de Salud")
rpart.rules(arbol_2, style = "tall")
## CAP FON ISA PAR
## Sistema_de_Salud is FONASA [.07 .68 .21 .04] when
## ytrabajocor is 883542 to 1582292
## esc2 < 13
##
## Sistema_de_Salud is FONASA [.04 .84 .07 .05] when
## ytrabajocor < 883542
##
## Sistema_de_Salud is ISAPRE [.05 .45 .50 .00] when
## ytrabajocor is 883542 to 1582292
## esc2 >= 13
##
## Sistema_de_Salud is ISAPRE [.04 .22 .72 .02] when
## ytrabajocor >= 1582292
conteo sist salud
conteo <- casen_sal[,.N,(Sistema_de_Salud)]
Entrenamos nuestros datos para evaluar precision de las predicciones:
set.seed(12345)
div <- createDataPartition(casen_sal$Sistema_de_Salud, times = 1, p = 0.8, list = F)
train <- casen_sal[div,]
test <- casen_sal[-div,]
arbol_3 <- rpart(Sistema_de_Salud~esc2+ytrabajocor, data = train, method = "class")
rpart.plot(arbol_2)
prediccion_1 <- predict(arbol_3, newdata = test, type = "class")
matriz <- table(test$Sistema_de_Salud, prediccion_1)
matriz
## prediccion_1
## CAPREDENA FONASA ISAPRE PARTICULAR
## CAPREDENA 0 110 9 0
## FONASA 0 2343 65 0
## ISAPRE 0 216 111 0
## PARTICULAR 0 142 0 0
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.8190921
Interpretacion: Automaticamente, el paquete ha tomado las variables con mas preopodnerancia. Esto se debe a que el paquete “rpart” tiene limitaciones en su modelo y por lo mismo no puede crear arboles de decision de variables multicategoricas (omitirá las demas, solo toma las 2 mas significantes).
Si un trabajador tiene ingresos mayores a 884.000 pesos, se clasificará inmediatamente como sistema de salud de “fonasa”, con un alto grado de certeza (84%).
samp <- casen_inf[,.(esc2,dau)][complete.cases(casen_inf[,.(esc2,dau)])]
samp <- samp[sample(.N,1000),.(esc2,dau)]
Primero graficamos, para asi tener una nocion de como distribuyen los datos:
ggplot(data = casen_inf,aes(x=esc2,y=dau))+
geom_point()
Grafico de codo:
fviz_nbclust(x = samp, FUNcluster = kmeans, method = "wss", k.max = 25,
diss = get_dist(samp, method = "euclidean"), nstart = 50)
Pregunta 4: Vemos que en el grafico de codo realizado, entre el k=3 y k=2 existe un incremento exponencial. Por lo tanto, el numero optimo de clusters podría ser 3. Sin embargo, podriamos hacerlo desde el 5 porque a partir de este cluster no disminuiría tanto el valor de la concentracion (N) de cada cluster. De todas formas, encuentro que la diferencia entre el k=3 y k=6 es relativamente poca (no mas de 2.500).
A pesar de lo anterior, haré la prueba con ambos numeros de cluster. No obstante, podría ser relativo el término “optimo” en base a lo que busquemos.
Pregunta 5: CON 3 CLUSTERS:
k1<-kmeans(x=samp,centers=3,nstart=25)
fviz_cluster(k1,data=samp,geom = "point")
Pregunta 5: CON 6 CLUSTERS:
k2<-kmeans(x=samp,centers=6,nstart=25)
fviz_cluster(k2,data=samp,geom = "point")
Sin embargo, analizandolo bien, creo que el numero optimo de clusters sería 6, de separarlos mas no se disminuirá tanto la concentracion en N de cada cluster.