Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
CIENCIA DE DADOS
PROFESSOR:
PEDRO ALBERTO MORETTIN
ESTUDANTE:
JORGE EDUARDO ORTIZ AGUIRRE
11031541
jeortiza3@gmail.com
Para a solução da lista 4 use o Software RStudio - Version 1.2.5033, importando as seguentes li-
brerias: library(car), library(tidyverse), library(broom), library(caret), library(glmnet),
library(ggthemes), library(magrittr), library(gdata), library(ggplot2), library(ggpubr),
library(gridExtra), library(ISLR), library(leaps), library(psych), library(dplyr), library(sandwich);
library(lmtest); library(tseries); library(astsa); library(GGally); library(knitr); library(kableExtra);
library(corrplot); library(class); library(texreg); library(xtable); library(MASS); library(e1071);
library(kernlab); library(RColorBrewer)
1
1. Considere o conjunto de dados Weekly do pacote ISLR, contendo 1.089 retornos semanais de
açoes de 1990 a 2010.
a) Calcule algumas medidas numéricas dos dados, como média, variância, quantis etc.
b) Use o conjunto de dados e ajuste uma regressão logı́stica, com Direction (up and down)
como variável resposta e variável defasada Lag 1 como preditora. Comente os resultados.
c) Repita (b), agora tendo como preditores Lag1 e Lag2. Comente.
d) Ajuste uma regressão logı́stica usando como perı́odo de treinamento os dados de 1990 a 2008
como Lag2 como preditor. Obtenha a matriz de confusão e a taxa de erro de classificação
para o perı́odo de teste, 2009-2010.
e) Repita (d) usando KNN, com K=1.
d) Qual método fornece os melhores resultados.
Solução 1: a)
> set.seed(123)
> summary(Weekly)
2
Variable Direction Min Q1 Median Mean Q3 Max
Lag1 Down -9.399 -0.937 0.382 0.282 1.589 12.026
Lag1 Up -18.195 -1.237 0.099 0.045 1.313 10.707
Lag2 Down -18.195 -1.307 0.154 -0.040 1.302 10.491
Lag2 Up -11.050 -1.001 0.299 0.304 1.463 12.026
Lag3 Down -10.538 -1.155 0.250 0.208 1.406 10.491
Lag3 Up -18.195 -1.173 0.224 0.099 1.417 12.026
Lag4 Down -18.195 -1.154 0.224 0.200 1.442 12.026
Lag4 Up -9.399 -1.158 0.241 0.102 1.352 10.707
Lag5 Down -18.195 -1.094 0.328 0.188 1.502 10.491
Lag5 Up -11.050 -1.201 0.128 0.102 1.338 12.026
Today Down -18.195 -2.293 -1.334 -1.747 -0.592 -0.002
Today Up 0.010 0.630 1.247 1.667 2.215 12.026
Das anteriores tabelas podemos decir que o conjunto de dados Weekly, têm nove (9) variáveis.
Logo vamos a mostrar a correlação com sua respectiva gráfica.
A correlação entre as variaveis ”lag” e today’s são perto de zero. A unica correlação substancial é
entre ”Year” e ”Volumen”. Quando plotamos ”Volumen”, vemos que ele aumenta com o tempo.
3
> Weekly %>%
ggpairs(aes(col = Direction, fill = Direction),
lower = list(continuous = wrap(‘smooth loess’, alpha = 0.5),
combo = wrap(‘facetdensity’, alpha = 0.5)),
diag = list(continuous = wrap(‘densityDiag’,alpha = 0.5)),
upper = list(combo = wrap(‘dot’, alpha = 0.5)))
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.2302 0.0612 3.76 0.0002
Lag1 -0.0431 0.0262 -1.64 0.1000
- - -
Signif. codes: 0‘∗∗∗ ’ 0.001‘∗∗ ’ 0.01‘∗ ’ 0.5‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1496.2 on 1088 degrees of freedom
Residual deviance: 1493.5 on 1087 degrees of freedom
AIC: 1497.5
Number of Fisher Scoring iterations: 4
4
Podemos ver que “Lag1” não é predictor estatı́stico significante pois seu p-value é maior que 0.05
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.2212 0.0615 3.60 0.0003
Lag1 -0.0387 0.0262 -1.48 0.1397
Lag2 0.0602 0.0265 2.27 0.0232
- - -
Signif. codes: 0‘∗∗∗ ’ 0.001‘∗∗ ’ 0.01‘∗ ’ 0.5‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1496.2 on 1088 degrees of freedom
Residual deviance: 1488.2 on 1086 degrees of freedom
AIC: 1494.2
Vemos que “Lag2” é a unico predictor estatı́stico significante pois seu p-value é menor que 0.05.
d) Vamos ajustar os dados usando regressão logı́stica usando como perı́odo de treinamento < 2009
y teste 2009 - 2012.
> train.data <- Weekly[Weekly$Year <= 2008,]
> test.data <- Weekly[Weekly$Year > 2008,]
> model.logreg.lag2 <- glm(Direction ∼ Lag2, data = train.data, family = ’binomial’)
> summary(model.logreg.lag2)
Call:
glm(formula = Direction ∼ Lag2, family = ‘‘binomial’’, data = train.data)
Prior probabilities of groups:
Min 1Q Median 3Q Max
-1.536 -1.264 1.021 1.091 1.368
Coefficients:
Estimate Std. Error z value Pr(>|z|)
∗
(Intercept) 0.2033 0.0643 3.16 0.0016 ∗
∗
Lag2 0.0581 0.0287 2.02 0.0430
- - -
Signif. codes: 0‘∗∗∗ ’ 0.001‘∗∗ ’ 0.01‘∗ ’ 0.5‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1354.7 on 984 degrees of freedom
Residual deviance: 1350.5 on 983 degrees of freedom
AIC: 1354.5
5
> pred <- predict(model.logreg.lag2, newdata = test.data, type = ‘response’)
> pred values <- ifelse(pred >= 0.5, ‘Up’, ‘Down’)
> mat.conf <- table(pred values, test.data$Direction)
Real Value
Pred Value
Down Up
Down 9 5
Up 34 56
Accuracy: 0.625
Concluimos, que têm uma acurácia del 62.5%, isto quer dizer que 37.5% é o taxa de erro de
classifcação. Também podemos dizer que, durante semanas en que as ações ou mercado esten alto,
o modelo está certo em um 91.8% pois (56/(56+5). Logo para semanas en que as ações esten ou
mercado este baixo, o modelo está certo en um 20.9% pois (9/(9+34).
e)
> set.seed(1)
> model.knn <- knn(train = data.frame(train.data$Lag2),
test = data.frame(test.data$Lag2),
cl = train.data$Direction, k = 1)
> mat.conf <- table(model.knn, test.data$Direction)
Real Value
Pred Value
Down Up
Down 21 30
Up 22 31
Accuracy: 0.5
Concluimos, que têm uma acurácia del 50%, isto quer dizer que 50% é o taxa de erro de classifcação.
Também podemos dizer que, durante semanas en que as ações ou mercado esten alto, o modelo
está certo em um 51% pois (31/(31+30). Logo para semanas en que as ações esten ou mercado
este baixo, o modelo está certo en um 49% pois (21/(21+22).
f) Se comparamos a taxa de error de classificação, observamos que a regressão logı́stica têm taxa
de erro mı́nima, seguida do KNN.
6
2. Considere o conjunto de dados Auto do pacote ISLR.
a) Crie uma variável binária, mpg1, que é igual a 1 se mpg1 for maior que sua mediana, e
mpg1 iguak a zero, se mpg1 for menor que sua mediana. (Use a função (data.frame)()
para criar um conjunto de dados contendo mpg1 e as outras variáveis do conjunto Auto).
b) Faça gráficos para investigar a associação entre mpg1 e as outras variáveis (e.g., draftsman
display, boxplots. Divida os dados en conjunto de treinamento e de teste.
c) Use análise discriminante linear de Fisher para prever mpg1 usando os preditores que você
acha que sejam mais associados com ela, usando o item (b). Qual a taxa de erros do conjunto
teste?
d) Use KNN, com vários valores de K, e determine a taxa de erros do conjunto teste. Qual
valor de K é melhor nesse caso?.
e) Qual classificador você julga que é melhor.
Solução 2: a) Criando uma variável binária mpg1: 1 se for > mediana ou 0 caco contrario.
> data(‘Auto’)
> df = data.frame(Auto)
> mpg1 <- rep(0,length(df$mpg))
7
b) > pairs(Auto)
8
> boxplot(acceleration ∼ mpg1, data = Auto, main = “acceleration vs mpg1”)
> boxplot(year ∼ mpg1, data = Auto, main = “year vs mpg1”)
c) Os preditores que estan mais associados com“mpg1” são ”cylinder”; “displacement”; “horse-
power” and “weight”, fazemos um análise discriminante linear de fisher.
Call:
lda (Desc Disco ∼ cylinders + displacement + horsepower + weight, data = train.data)
Group means:
cylinders displacement horsepower weight
0 6.791139 273.9494 129.34177 3624.348
1 4.203822 116.5510 78.51592 2340.102
9
> pred.lda <- predict(model.lda, test.data)
> table(pred.lda$class, test.data$mpg1)
R V
P V
0 1
0 32 1
1 6 38
Accuracy: 0.9
R V
P V
0 1
0 34 16
1 4 23
Accuracy: 0.74
Concluimos que temos uma taxa de error de teste de 26% para K=1.
> model.knn <- knn(train = data.frame(train.data$cylinders, train.data$displacement,
train.data$horsepower, train.data$weight),
test = data.frame(test.data$cylinders, test.data$cylinders,
test.data$horsepower, test.data$weight),
cl = train.data$mpg1, k = 10)
> mat.conf <- table(model.knn, test.data$mpg1)
R V
P V
0 1
0 30 5
1 8 34
Accuracy: 0.83
Concluimos que temos uma taxa de error de teste de 17% para K=10.
10
> set.seed(1)
> model.knn <- knn(train = data.frame(train.data$cylinders, train.data$displacement,
train.data$horsepower, train.data$weight),
test = data.frame(test.data$cylinders, test.data$cylinders,
test.data$horsepower, test.data$weight),
cl = train.data$mpg1, k = 100)
> mat.conf <- table(model.knn, test.data$mpg1)
R V
P V
0 1
0 28 2
1 10 37
Accuracy: 0.84
Concluimos que temos uma taxa de error de teste de 16% para K=100.
Obs, X1 X1 Y
1 3 4 Azul
2 2 2 Azul
3 4 4 Azul
4 1 4 Azul
5 2 1 Vermelho
6 4 3 Vermelho
7 4 1 Vermelho
11
Solução 3: a)
> X1 <- c(3,2,4,1,2,4,4)
> X2 <- c(4,2,4,4,1,3,1)
> Y <- c(“Azul”,“Azul”,“Azul”,“Azul”,“Vermelho”,“Vermelho”,“Vermelho”)
> df <- data.frame(X1,X2,Y)
> p <- ggplot() +
geom point(data = df, aes(x = X1, y = X2, color = Y),size=3) +
scale color manual(values = c(“Azul” = “Blue”, “Vermelho” = “red”)) +
coord cartesian(xlim = c(0, 5), ylim = c(0, 5))
>p
Como vemos na gráfica, o separador ótimo no hiperplano deve estar entre as observações (2,1) e
(2,2), e entre as observações (4,3 ) e (4,4). Então é uma linha que passa pelos pontos (2,1.5) e
(4,3.5). Con essos dois pontos vamos a obter a equação
y2 − y1 3.5 − 1.5 2
m= = = =1
x2 − x1 4−2 2
Uma vez calculado a pendiente, temos:
b) Com respeto ao gráfico anterior, indicamos a margem e os vetores suporte para CMM.
> plot <- p + geom abline(intercept = -0.5, slope = 1) +
geom abline(intercept = 0, slope = 1, linetype=’dashed’) +
geom abline(intercept = -1, slope = 1, linetype=’dashed’)
12
> plot
Os vectores suporte para o classificador de margem máxima são os pontos (2,1), (2,2), (4,3) e (4,4).
13
4. Simule um conjunto de dados con n = 500 e p = 2, tal que as observações pertena̧m a duas
clases com uma fronteira de decisão não linear. Por ejemplo, você pode usar:
a) Faça um gráfico das observações, com sı́mbolos (ou cores) de acordo com cada classe.
b) Separe os dados em conjunto de treinamente e de teste. Obtenha o classificador de margem
máxima, tendo X1 e X2 com preditores. Obtenha as previsões para o conjunto de teste e a
acurácia do do classificador.
c) Obtenha o classificador de margem flexı́vel, tendo tendo X1 e X2 com preditores. Obtenha
as previsões para o conjunto de teste e a taxa de erros de classificacção.
d) Obtenha o classificador de margem não linear, usando um kernel apropiado. Calcule
a taxa de erros de classificação.
e) Compare os dois classificadores
Solução 4: a)
> set.seed(1)
> x1 <- runif(500) - 0.5
> x2 <- runif(500) - 0.5
> y <- 1 * (x1∧2 - x2∧2 ¿ 0)
> df <- data.frame(x1,x2,y=as.factor(y))
> ggplot(data = df, aes(x = x1, y = x2, color = y, shape = y)) +
geom point(size = 2) +
scale color manual(values=c(“#000000”, “#FF0000”)) +
theme(legend.position = ”none”)
14
b) Separamos os dados en conjunto de treinamento e teste para obter o Classificador de margem
máxima tendo como preditores X1 e X2 com preditores.
> summary(svm.model.1)
Call:
svm(formula = y ∼ x1 + x2, data = train.data, type = ‘‘C-classification’’, kernel = ‘‘linear’’)
Parameters:
SVM-Type C-classification
SVM-Kernel linear
cost 1
Number of Classes: 2
Levels:
0 1
R V
P V
0 1
0 52 47
1 0 0
Accuracy: 0.53
Concluimos, que têm uma acurácia del 53%, isto quer dizer que 47% é o taxa de erro de classifcação.
15
c) Classificador de margem flexı́vel, tendo como preditores X1 e X2 com preditores.
> escolhaparam <- tune.svm(y ∼ x1 + x2, data = train.data,
gamma = 2∧(-2:2), cost = 2∧2:5,
na.action(na.omit(c(1, NA))))
> summary(escolhaparam)
- best parameters:
gamma cost
4 4
> svm.model.2 <- svm(y ∼ x1 + x2, data = train.data, kernel = “linear”, gamma = 4, cost = 4)
> plot(svm.model.2,train.data)
16
> summary(svm.model.2)
Call:
svm(formula = y ∼ x1 + x2, data = train.data, kernel = ‘‘linear’’, gamma = 4, cost = 4)
Parameters:
SVM-Type C-classification
SVM-Kernel linear
cost 4
Number of Classes: 2
Levels:
0 1
R V
P V
0 1
0 52 47
1 0 0
Accuracy: 0.53
Concluimos, que têm uma acurácia del 53%, isto quer dizer que 47% é o taxa de erro de classifcação.
- best parameters:
degree gamma cost
3 0.5 4
17
degree gamma cost error dispersion
1 3 0.5 4 0.4191463 0.1129212
2 3 1.0 4 0.4191463 0.1129212
3 3 2.0 4 0.4191463 0.1129212
4 3 4.0 4 0.4191463 0.1129212
5 3 0.5 5 0.4191463 0.1129212
6 3 1.0 5 0.4191463 0.1129212
7 3 2.0 5 0.4191463 0.1129212
8 3 4.0 5 0.4191463 0.1129212
9 3 0.5 6 0.4191463 0.1129212
10 3 1.0 6 0.4191463 0.1129212
11 3 2.0 6 0.4191463 0.1129212
12 3 4.0 6 0.4341463 0.1330275
Polinomiais:
> svm.model.3 <- svm(y ∼ x1 + x2, data = train.data, kernel = “polynomial”, gamma = 0.5,
cost = 4)
> plot(svm.model.3,train.data)
> summary(svm.model.3)
Call:
svm(formula = y ∼ x1 + x2, data = train.data, kernel = ‘‘polynomial’’, gamma = 0.5, cost = 4)
Parameters:
SVM-Type C-classification
SVM-Kernel linear
cost 4
degree 3
coef.0 0
Number of Classes: 2
Levels:
0 1
18
R V
P V
0 1
0 52 40
1 0 7
Accuracy: 0.60
Concluimos, que têm uma acurácia del 60%, isto quer dizer que 40% é o taxa de erro de classifcação.
radiais:
> svm.model.4 <- svm(y ∼ x1 + x2, data = train.data, type = ”C-classification”, kernel = ”ra-
dial”, gamma = 4, cost = 4)
> plot(svm.model.4,train.data)
> summary(svm.model.4)
Call:
svm(formula = y ∼ x1 + x2, data = train.data, type = "C-classification", kernel = "radial", gamma = 4, cost = 4)
Parameters:
SVM-Type C-classification
SVM-Kernel radial
cost 4
Number of Classes: 2
Levels:
0 1
R V
P V
0 1
0 50 1
1 2 46
Accuracy: 0.97
19
Concluimos, que têm uma acurácia del 97%, isto quer dizer que 3% é o taxa de erro de classifcação.
tangentes hiperbólicas:
> svm.model.5 <- svm(y ∼ x1 + x2, data = train.data, kernel = ”sigmoid”, gamma = 4, cost=4)
> plot(svm.model.5,train.data)
> summary(svm.model.5)
Call:
svm(formula = y ∼ x1 + x2, data = train.data, kernel = "radial", gamma = 4, cost = 4)
Parameters:
SVM-Type C-classification
SVM-Kernel sigmoid
cost 4
coef.0 0
Number of Classes: 2
Levels:
0 1
R V
P V
0 1
0 30 26
1 22 21
Accuracy: 0.52
Concluimos, que têm uma acurácia del 52%, isto quer dizer que 48% é o taxa de erro de classifcação.
e) Observamos que no classificador não linear com kernel = radiais, têm a menor taxa de erro de
classificação com 3%. Por tanto é o melhor classificador não linear.
20