P1 Instale y cargue todos los paquetes que necesita para trabajar con data.table, modelos de predicción de regresión y CART y Cross-Validation.

rm(list=ls())

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.4     ✓ purrr   0.3.4
## ✓ tibble  3.1.1     ✓ dplyr   1.0.5
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(data.table)
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## The following object is masked from 'package:purrr':
## 
##     transpose
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(dbscan)
library(ggplot2)
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
library(rpart)
library(rpart.plot)
library(moderndive)
library(knitr)
library(jtools)

P2 Cargar base de datos Chile que viene en el paquete car. Recuerde que la base debe transofrmarse a data.table y que con ?Chile puede ver más detalles de esta base.

Chile= Chile
?Chile
class(Chile)
## [1] "data.frame"
Chile=as.data.table(Chile)
class(Chile)
## [1] "data.table" "data.frame"

P3 Cree una muestra de la base que solo contenga los votos Yes y No. A partir de ahora todo el trabajo se realizará con esa base!

Chile2=Chile[!vote=="NA"]
Chile2=Chile2[!vote=="U"]

P4 Plantee dos modelos de predcción distintos que logren predecir en ingreso de las personas. (recuerde eliminar las observaciones que tengan NA en las variables de interés)

Chile2=Chile2[!income=="NA"]
Chile2=Chile2[!education=="NA"]
Chile2=Chile2[!sex=="NA"]
reg_sex <- lm(income~sex , data = Chile2)
reg_education <- lm(income~education , data = Chile2)
get_regression_table(reg_sex) %>% kable()
term estimate std_error statistic p_value lower_ci upper_ci
intercept 34737.418 1391.629 24.962 0.000 32008.12 37466.717
sexM 3376.617 1939.933 1.741 0.082 -428.03 7181.264

P5 Evalue cuál modelo predice mejor el ingreso. Sea claro/a con su criterio de evaluación. Recuerde que no es lo mismo predecir dentro de muestra que fuera de muestra.

pred <-  predict(reg_sex)
Chile2[,prediccion:=predict(reg_sex)]
prediccion_1 <- data.table(RMSE=RMSE(pred, Chile2$income), MAE=MAE (pred,Chile2$income))
prediccion_1
##        RMSE      MAE
## 1: 42049.98 27304.49
pred2 <- predict(reg_education)
prediccion_2 <- data.table (RMSE=RMSE(pred2, Chile2$income), MAE=MAE (pred2, Chile2$income))
prediccion_2
##        RMSE      MAE
## 1: 37573.43 24119.36

P6 Ahora queremos predecir el voto de una persona en el plebiscito, es decir, si el computador es premium yes o no utilizando árboles de decisión.

str(Chile2)
## Classes 'data.table' and 'data.frame':   1883 obs. of  9 variables:
##  $ region    : Factor w/ 5 levels "C","M","N","S",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ population: int  175000 175000 175000 175000 175000 175000 175000 175000 175000 175000 ...
##  $ sex       : Factor w/ 2 levels "F","M": 2 2 1 1 1 1 2 1 2 2 ...
##  $ age       : int  65 29 38 49 23 28 26 24 41 64 ...
##  $ education : Factor w/ 3 levels "P","PS","S": 1 2 1 1 3 1 2 3 1 1 ...
##  $ income    : int  35000 7500 15000 35000 35000 7500 35000 15000 15000 15000 ...
##  $ statusquo : num  1.01 -1.3 1.23 -1.03 -1.1 ...
##  $ vote      : Factor w/ 4 levels "A","N","U","Y": 4 2 4 2 2 2 2 2 2 4 ...
##  $ prediccion: num  38114 38114 34737 34737 34737 ...
##  - attr(*, ".internal.selfref")=<externalptr>
arbol_1 <- rpart(vote~ region + sex + education, data=Chile2, method = "class")
rpart.plot(arbol_1, main = "Árbol de Clasificación: Votos")

P7 Explique los resultados de su modelo. Ahora utilizaremos el método de validación cruzada para estimar la precisión de su modelo.

Del modelo podemos ver que 46% votara que no y 44% votara por el si.

En cuanto a las personas que tienen educacion la probabilidad de que voten que no es de un 62%, en cuanto a las personas que no presentan educacion el 38% votara que si, de los cuales los que viven en region solo un 19% votara si y de los que viven en Santiago un 20%.Las personas del sexo femenino votaran que no con probabilidad de un 9% y que si con 10%.

P8 Cree el set de entrenamiento y de prueba. Utilice set.seed(1234). Muestre los resultados del set de entrenamiento.

set.seed(1234)
div <- createDataPartition(Chile2$vote,times = 1, p=0.8, list=F)
## Warning in createDataPartition(Chile2$vote, times = 1, p = 0.8, list = F): Some
## classes have no records ( U ) and these will be ignored
train <- Chile2[div,]
test <- Chile2[-div,]

arbol2 <- rpart(vote~sex+education+region, data=train, method = "class")
rpart.plot(arbol2)

P9 Calcule la predicción del modelo

prediccion <- predict(arbol2, newdata = test, type = "class")

P10 Calcule la matriz de confusión y la precisión del modelo. Muestre y explique ambos.

matriz <- table(test$vote, prediccion)
matriz
##    prediccion
##       A   N   U   Y
##   A   0  21   0  14
##   N   0 120   0  53
##   U   0   0   0   0
##   Y   0  77   0  90
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.56

Nuestro modelo predijo que 218 personas votaron por el NO de las que 120 estuvieron correctamente pronosticadas.

Nuestro modelo predijo que 157 personas votaban por el SI, de las cuales 90 fueron correctamente pronosticadas.

Nuestro modelo tiene una presición de 56%,por lo cual pudimos predecir el 56% de los votos correctamente.