XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX DISTRIBUIÇÃO T STUDENT

Uma pesquisa mostra que cientistas de dados ganham R$ 75,00 por hora. Uma amostra de 9 cientistas é selecionado e perguntado o salário. O desvio padrão da amostra é 10. Qual a probabilidade do salário ser menor que R$ 80 a hora? t=1.5, graus de liberdade=8 (ver tabela)

pt(1.5, 8)
[1] 0.9139984

Qual a proabilidade de ser maior que 80

pt(1.5,8,lower.tail=F)
[1] 0.08600165
1 - pt(1.5,8)
[1] 0.08600165

Somando as 2 caudas

pt(1.5, 8) + pt(1.5,8,lower.tail=F)
[1] 1

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX DISTRIBUIÇÃO BINOMIAL

x = eventos, p = probabilidades, size = eventos Se jogar uma moeda 5 vezes, qual a prob. de dar cara 3 vezes?

***quando se usa dbinom vamos achar a probabilidade pontual, ou seja, a probabilidade de encontrar 3 vezes.

dbinom(x=3,size=5,prob=0.5)
[1] 0.3125

Se eu passar 4 sinais de quatro tempos cada. Qual a probabilidade de eu pegar 0,1,2,3 e 4 sinais verdes?

pbinom(q=4, size=4, prob=0.25)
[1] 1

XXXXXXXXXXXXXXXX Diferença entre dbinom e pbinom

Função dbinom: Suponha que na nossa amostra de 10 pacotes, n = 10, estejamos interessados na probabilidade de encontrarmos 8 pacotes com peso ideal, k =8, com p =0.90. Calculamos a probabilidade P(X = 8 ) da seguinte maneira:

dbinom(x = 8, size = 10, prob = 0.9)
[1] 0.1937102

E para P(X =9)?

dbinom(x = 9, size = 10, prob = 0.9)
[1] 0.3874205

Repare que o argumento size em dbinom representa o número de replicações do experimento (peso ideal ou não), referente ao parâmetro n da binomial.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Se você fizer a prova de um concurso com 12 questões. “chutando” todas as questões, qual a probabilidade de acertar 7 questões? (4 alternativas cada questão)

dbinom(x=7,size=12,prob=0.25)
[1] 0.01147127

Se eu passar 4 sinais de quatro tempos cada. Qual a probabilidade de eu pegar 3 OU MAIS sinais verdes?

pbinom(q=2, size=4, prob=0.25, lower.tail = F)
[1] 0.05078125
dbinom(x=3,size=4,prob=0.25) + dbinom(x=4,size=4,prob=0.25)
[1] 0.05078125
1 - pbinom(q=2, size=4, prob=0.25)
[1] 0.05078125

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX DISTRIBUIÇÃO DE POISSON

Distribuição de Poisson dpois = probabilidade pontual ppois = cumulativa lower.tail False = maior que, cauda direta da distribuição

O número de acidentes em um dia é igual a 2, qual a proabilidade de ocorrerem 3 em 1 dia?

dpois(3,lambda=2)
[1] 0.180447

O número de acidentes em um dia é igual a 2, qual a proabilidade de ocorrerem 3 OU MENOS em 1 dia?

ppois(3,lambda=2)
[1] 0.8571235

O número de acidentes em um dia é igual a 2, qual a proabilidade de ocorrerem MENOS DO QUE 3 em 1 dia?

ppois(2,lambda = 2)
[1] 0.6766764
dpois(0,lambda=2) + dpois(1,lambda=2) + dpois(2,lambda=2)
[1] 0.6766764

O número de acidentes em um dia é igual a 2, qual a proabilidade de ocorrerem MAIS DO QUE 3 em 1 dia?

ppois(3,lambda=2, lower.tail = F) 
[1] 0.1428765
1 - ppois(3,lambda=2) 
[1] 0.1428765

XXXXXXXXXXXXXXXX

Criamos o conjunto de dados para teste

novela = matrix(c(19,6,43,32),nrow=2, byrow=T)
rownames(novela) = c("Masculino","Feminino")
colnames(novela) = c("Assiste","NaoAssiste")
novela
          Assiste NaoAssiste
Masculino      19          6
Feminino       43         32

Executar Quiquadrado Valor de p é maior que 0,05 não há evidências de diferença significativa (hipótese nula) - portanto não há diferença significativa entre homens e mulheres que assistem novela.

chisq.test(novela)

    Pearson's Chi-squared test with Yates' continuity correction

data:  novela
X-squared = 2.0374, df = 1, p-value = 0.1535

Alteramos a proporção de homens que assiste e não. Executamos o teste novamente, agora valor de p menor que 0,05

novela = matrix(c(22,3,43,32),nrow=2, byrow=T)
rownames(novela) = c("Masculino","Feminino")
colnames(novela) = c("Assiste","NaoAssiste")
novela
          Assiste NaoAssiste
Masculino      22          3
Feminino       43         32
chisq.test(novela)

    Pearson's Chi-squared test with Yates' continuity correction

data:  novela
X-squared = 6.4615, df = 1, p-value = 0.01102

Agora temos evidencias em favor de nossa hipótese alternativa, pois p-value é menor do que 0,05.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ANOVA

Carrega dados

Visualizando a distribuição dos remédios por horas

Executamos Análise de variância. Observar valor de p maior que 0,05 (Pr(>F)). Hipótese nula de que não há diferença significativa entre os diferentes remédios.

an =  aov(Horas ~ Remedio, data=tratamento)
summary(an)
            Df Sum Sq Mean Sq F value Pr(>F)
Remedio      2   4.08   2.042   0.538  0.592
Residuals   21  79.75   3.798               

Anova de dois fatores. Nenhum valor de P mostra diferença significativa

an =  aov(Horas ~ Remedio * Sexo, data=tratamento)
summary(an)
             Df Sum Sq Mean Sq F value Pr(>F)
Remedio       2   4.08   2.042   0.533  0.596
Sexo          1   4.17   4.167   1.087  0.311
Remedio:Sexo  2   6.58   3.292   0.859  0.440
Residuals    18  69.00   3.833               

Se houver diferença o teste de Tukey é executado

tukey = TukeyHSD(an)
tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Horas ~ Remedio * Sexo, data = tratamento)

$Remedio
      diff       lwr      upr     p adj
B-A -0.625 -3.123427 1.873427 0.8011051
C-A  0.375 -2.123427 2.873427 0.9226431
C-B  1.000 -1.498427 3.498427 0.5732500

$Sexo
         diff        lwr      upr     p adj
M-F 0.8333333 -0.8459446 2.512611 0.3109477

$`Remedio:Sexo`
                 diff      lwr     upr     p adj
B:F-A:F -1.500000e+00 -5.89979 2.89979 0.8816496
C:F-A:F  7.500000e-01 -3.64979 5.14979 0.9935270
A:M-A:F  5.000000e-01 -3.89979 4.89979 0.9990466
B:M-A:F  7.500000e-01 -3.64979 5.14979 0.9935270
C:M-A:F  5.000000e-01 -3.89979 4.89979 0.9990466
C:F-B:F  2.250000e+00 -2.14979 6.64979 0.5936233
A:M-B:F  2.000000e+00 -2.39979 6.39979 0.7010347
B:M-B:F  2.250000e+00 -2.14979 6.64979 0.5936233
C:M-B:F  2.000000e+00 -2.39979 6.39979 0.7010347
A:M-C:F -2.500000e-01 -4.64979 4.14979 0.9999681
B:M-C:F  8.881784e-16 -4.39979 4.39979 1.0000000
C:M-C:F -2.500000e-01 -4.64979 4.14979 0.9999681
B:M-A:M  2.500000e-01 -4.14979 4.64979 0.9999681
C:M-A:M  0.000000e+00 -4.39979 4.39979 1.0000000
C:M-B:M -2.500000e-01 -4.64979 4.14979 0.9999681

Gráficos do teste

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

REGRESSÃO LINEAR SIMPLES NO R

Curso do YouTube

#**O material está todo no diretório (c:\Users\Usuario\R_dados) **

if(!require(pacman)) install.packages("pacman")
library(pacman)

pacman::p_load(dplyr,ggplot2,car,rstatix,lmtest,ggpubr)
glimpse(dados)
Rows: 187
Columns: 2
$ Publicidade <dbl> 985.69, 1445.56, 1188.19, 574.51, 568.95, 471.81, 537.35, 514.07, 611.48, 251.19, 97.97, 406.81, 265.40, 1323.29, 196.65, 1326.60, 1…
$ Vendas      <int> 120, 360, 270, 220, 170, 70, 210, 200, 70, 150, 190, 240, 100, 250, 210, 280, 230, 210, 230, 210, 230, 250, 60, 330, 150, 150, 180, …

COMENTÁRIOS Nesta etapa temos de analisar a relação entre a variável dependente (é sempre a que eu quero prever:Vendas) e a variável independente(é a que consideramos que tenha uma influência sobre a variável dependente). Normalmente o eixo vertical y recebe a variável Dependente (Resposta) - ou seja, o queremos prever. No eixo horizontal x recebe a variável Independente (Explanatória) - ou seja, o que usamos para prever.

    VD: Vendas
    VI: Publicidade

      Construção do modelo

      mod <- lm(Vendas ~ Publicidade, dados)
      mod
      
      Call:
      lm(formula = Vendas ~ Publicidade, data = dados)
      
      Coefficients:
      (Intercept)  Publicidade  
         125.1795       0.1049  

      Análise Gráfica

      par(mfrow=c(2,2))
      plot(mod)

      par(mfrow=c(1,1))
      
      #normalidade dos resíduos
      shapiro.test(mod$residuals)
      
          Shapiro-Wilk normality test
      
      data:  mod$residuals
      W = 0.99193, p-value = 0.3856
      #Outiliers nos resíduos
      summary(rstandard(mod))
            Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
      -2.1981347 -0.7064734  0.0392186 -0.0000075  0.6828619  2.3753897 
      #independência dos resíduos
      durbinWatsonTest(mod)
       lag Autocorrelation D-W Statistic p-value
         1     -0.01039454       1.98891    0.88
       Alternative hypothesis: rho != 0
      #Homocedasticidade (Breusch-Pagan)
      bptest(mod)
      
      
          studentized Breusch-Pagan test
      
      data:  mod
      BP = 1.4245, df = 1, p-value = 0.2327
      #analise do modelo
      summary(mod)
      
      
      Call:
      lm(formula = Vendas ~ Publicidade, data = dados)
      
      Residuals:
           Min       1Q   Median       3Q      Max 
      -131.840  -42.283    2.344   40.945  142.455 
      
      Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
      (Intercept) 125.17951    7.43140   16.84   <2e-16 ***
      Publicidade   0.10495    0.01021   10.28   <2e-16 ***
      ---
      Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      
      Residual standard error: 60.14 on 185 degrees of freedom
      Multiple R-squared:  0.3634,    Adjusted R-squared:   0.36 
      F-statistic: 105.6 on 1 and 185 DF,  p-value: < 2.2e-16
      ggplot(data = dados, mapping = aes(x = Publicidade, y = Vendas)) +
        geom_point() +
        geom_smooth(method = "lm", col = "red") +
        stat_regline_equation(aes(label = paste(..eq.label.., ..adj.rr.label..,
                                       sep = "*plain(\",\")~~")),
                     label.x = 0, label.y = 400,
                     parse = TRUE, coef.digits = 5) +
        theme_classic()
      Warning: Duplicated aesthetics after name standardisation: parseWarning: Ignoring unknown parameters: coef.digits

      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX REGRESSÃO LINEAR SIMPLES

      Cars: mostra a velocidade e distância de parada.

      #install.packages("corrgram")
      library(corrgram)
      cars
      dim(cars)
      [1] 50  2

      Correlação entre distância e velocidade de parada

      cor(cars)
                speed      dist
      speed 1.0000000 0.8068949
      dist  0.8068949 1.0000000
      corrgram(cars, order=TRUE, lower.panel=panel.shade,
               upper.panel=panel.pie, text.panel=panel.txt,
               main="Carros")

      Geramos o modelo usando função lm Queremos prever a velocidade que o carro estava baseado na distância de parada Interceptação e Inclinação o quanto a variável depe. aumenta com o aumento da variavel indepenente

      modelo
      
      
      Call:
      lm(formula = speed ~ dist, data = cars)
      
      Coefficients:
      (Intercept)         dist  
           8.2839       0.1656  

      Visualização da relação entre variáveis e linha de melhor ajuste

      #Executar com Crtrl+ Shift + Enter
      plot(speed ~ dist, data=cars, ylab = "Velocidade", xlab=" Distância", main="Carros")
      abline(modelo)

      Podemos fazer uma previsão usando diretamente os coeficientes Qual velocidade se levou 22 pra parar?

      modelo$coefficients
      (Intercept)        dist 
        8.2839056   0.1655676 
      modelo$coefficients[1] + modelo$coefficients[2] * 22
      (Intercept) 
         11.92639 

      Usando predict

      predict(modelo,data.frame(dist = 22))
      
             1 
      11.92639 

      Analisando Melhor o Modelo

      summary(modelo)
      
      Call:
      lm(formula = speed ~ dist, data = cars)
      
      Residuals:
          Min      1Q  Median      3Q     Max 
      -7.5293 -2.1550  0.3615  2.4377  6.4179 
      
      Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
      (Intercept)  8.28391    0.87438   9.474 1.44e-12 ***
      dist         0.16557    0.01749   9.464 1.49e-12 ***
      ---
      Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      
      Residual standard error: 3.156 on 48 degrees of freedom
      Multiple R-squared:  0.6511,    Adjusted R-squared:  0.6438 
      F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12
      modelo$coefficients
      (Intercept)        dist 
        8.2839056   0.1655676 
      modelo$residuals
                1           2           3           4           5           6           7           8           9          10          11          12 
      -4.61504079 -5.93958139 -1.94617594 -4.92639228 -2.93298684 -0.93958139 -1.26412199 -2.58866258 -3.91320318 -0.09855441 -1.91979773  1.39814831 
               13          14          15          16          17          18          19          20          21          22          23          24 
       0.40474287 -0.25752743 -0.91979773  0.41133742 -0.91320318 -0.91320318 -2.90001408  1.41133742 -0.24433833 -4.21796012 -7.52931161  3.40474287 
               25          26          27          28          29          30          31          32          33          34          35          36 
       2.41133742 -2.22455467  2.41793197  1.09339137  3.41793197  2.09339137  0.43771563  2.76225622  0.44431018 -2.86704131 -4.19158191  4.75566167 
               37          38          39          40          41          42          43          44          45          46          47          48 
       3.09998592 -0.54250072  6.41793197  3.76885078  3.10658048  2.44431018  1.11976958  2.78863443  5.77544533  4.12636413  0.48387749  0.31830992 
               49          50 
      -4.15201460  2.64285051 
      hist(modelo$residuals)

      modelo$fitted.values
              1         2         3         4         5         6         7         8         9        10        11        12        13        14        15 
       8.615041  9.939581  8.946176 11.926392 10.932987  9.939581 11.264122 12.588663 13.913203 11.098554 12.919798 10.601852 11.595257 12.257527 12.919798 
             16        17        18        19        20        21        22        23        24        25        26        27        28        29        30 
      12.588663 13.913203 13.913203 15.900014 12.588663 14.244338 18.217960 21.529312 11.595257 12.588663 17.224555 13.582068 14.906609 13.582068 14.906609 
             31        32        33        34        35        36        37        38        39        40        41        42        43        44        45 
      16.562284 15.237744 17.555690 20.867041 22.191582 14.244338 15.900014 19.542501 13.582068 16.231149 16.893420 17.555690 18.880230 19.211366 17.224555 
             46        47        48        49        50 
      19.873636 23.516123 23.681690 28.152015 22.357149 
      plot(modelo$fitted.values, cars$dist)

      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX REGRESSÃO LINEAR MÚLTIPLA

      Carros,com consumo e outros aspectos mpg: consumo, hp cavalos, cyl numero de cilindros, disp cilindradas

      #install.packages("corrgram")
      library(corrgram)
      mtcars
      dim(mtcars)
      [1] 32 11

      Correlação

      cor(mtcars[1:4])
                  mpg        cyl       disp         hp
      mpg   1.0000000 -0.8521620 -0.8475514 -0.7761684
      cyl  -0.8521620  1.0000000  0.9020329  0.8324475
      disp -0.8475514  0.9020329  1.0000000  0.7909486
      hp   -0.7761684  0.8324475  0.7909486  1.0000000
      corrgram(mtcars[1:4], order=TRUE, lower.panel=panel.shade,
               upper.panel=panel.pie, text.panel=panel.txt,
               main="Carros")

      Correlação

      cor(mtcars[1:4])
                  mpg        cyl       disp         hp
      mpg   1.0000000 -0.8521620 -0.8475514 -0.7761684
      cyl  -0.8521620  1.0000000  0.9020329  0.8324475
      disp -0.8475514  0.9020329  1.0000000  0.7909486
      hp   -0.7761684  0.8324475  0.7909486  1.0000000
      corrgram(mtcars[1:11], order=TRUE, lower.panel=panel.shade,
               upper.panel=panel.pie, text.panel=panel.txt,
               main="Carros")

      Analisamos cilindradas vs consumo

      Modelo usando cilindradas para prever consumo Interceptação e Inclinação

      modelo = lm(mpg ~ disp, data=mtcars)
      modelo
      
      Call:
      lm(formula = mpg ~ disp, data = mtcars)
      
      Coefficients:
      (Intercept)         disp  
         29.59985     -0.04122  

      Coeficiente de Determinação (71% da variavel dependente é explicada pela variavel explanatória) R2 ajustado

      summary(modelo)$r.squared 
      [1] 0.7183433
      summary(modelo)$adj.r.squared
      [1] 0.7089548

      Gráfico com linha do modelo

      #Executar com Crtrl+ Shif + Enter
      plot(mpg ~ disp, data=mtcars,ylab="Consumo", xlab="Cilindradas", main="Carros")
      abline(modelo)

      Prevendo consumo com 200 cilindradas

      predict(modelo,data.frame(disp = 200))
      
             1 
      21.35683 

      Adicionamos mais duas variável indepedentes, hp e cilindros

      modelo = lm(mpg ~ disp +  hp + cyl, data=mtcars)
      modelo
      
      Call:
      lm(formula = mpg ~ disp + hp + cyl, data = mtcars)
      
      Coefficients:
      (Intercept)         disp           hp          cyl  
         34.18492     -0.01884     -0.01468     -1.22742  

      Coeficiente de Determinação (71% da variavel dependente é explicada pela variavel explanatória) R2 ajustado

      summary(modelo)$r.squared 
      [1] 0.7678877
      summary(modelo)$adj.r.squared
      [1] 0.7430186

      Prevendo consumo com 200 cilindradas, 100 hp e 4 cilindros

      predict(modelo,data.frame(disp = 200, hp=100, cyl=4))
      
             1 
      24.03969 

      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX REGRESSÃO LOGÍSTICA

      Carga dos dados

      Gráfico de Visualização

      plot(eleicao$DESPESAS,eleicao$SITUACAO)

      summary(eleicao)
        CANDIDATO            SITUACAO         DESPESAS   
       Length:47          Min.   :0.0000   Min.   :  10  
       Class :character   1st Qu.:0.0000   1st Qu.: 300  
       Mode  :character   Median :1.0000   Median : 800  
                          Mean   :0.5106   Mean   :1086  
                          3rd Qu.:1.0000   3rd Qu.:1700  
                          Max.   :1.0000   Max.   :3300  

      Correlação

      cor(eleicao$DESPESAS,eleicao$SITUACAO)
      
      [1] 0.8121872

      Comentário: Existe uma relação positiva forte (pelo menos matemática) entre o investimento e a eleição

      Modelo de Regressão Logística

      modelo=glm(SITUACAO ~ DESPESAS,data=eleicao,family = "binomial")
      summary(modelo)
      
      Call:
      glm(formula = SITUACAO ~ DESPESAS, family = "binomial", data = eleicao)
      
      Deviance Residuals: 
           Min        1Q    Median        3Q       Max  
      -1.79020  -0.29574   0.00379   0.20326   2.10968  
      
      Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
      (Intercept) -4.602880   1.315934  -3.498 0.000469 ***
      DESPESAS     0.004984   0.001404   3.550 0.000385 ***
      ---
      Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      
      (Dispersion parameter for binomial family taken to be 1)
      
          Null deviance: 65.135  on 46  degrees of freedom
      Residual deviance: 18.540  on 45  degrees of freedom
      AIC: 22.54
      
      Number of Fisher Scoring iterations: 7

      Modelo Comparado aos Dados Geração de um gráfico comparando os dados reais com o modelo ajustado

      plot(eleicao$DESPESAS,eleicao$SITUACAO,col='red',pch=20)
      points(eleicao$DESPESAS,modelo$fitted,pch=4)

      Comentário: Os pontos vermelhos são os candidatos, e os x fazem parte do nosso modelo ajustado de regressão linear


      XXXXXXXXXXXX TESTAR O MODELO COM OS PRÓPRIOS CANDIDATOS XXXXXXXXXXXXXXXX

      prever=predict(modelo,newdata=eleicao,type="response")
      prever=prever >= 0.5
      prever
          1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25 
      FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE 
         26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47 
       TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE 

      Avaliar Performance

      confusao=table(prever,eleicao$SITUACAO)
      confusao
             
      prever   0  1
        FALSE 21  3
        TRUE   2 21
      taxaacerto=(confusao[1]+confusao[4])/sum(confusao)
      taxaacerto
      [1] 0.893617
      Comentários:
    1. A diagonal (21, 21) ou seja, é dos que acertaram, ou seja, 42 acertos; e a diagonal (2,3) faz parte dos que errara, ou seja 5 erros.
    2. Agora vamos ver em percentual como isso será representado: (21+24)/47=0,893617

    3. Novos Candidatos

      prevereleicao=read.csv("NovosCandidatos.csv",sep=';',header=T)
      prevereleicao


      PREVISAO

      prevereleicao$RESULT=predict(modelo,newdata=prevereleicao,type="response")
      prevereleicao$RESULT
      [1] 0.009923466 0.010425261 0.026438255 0.108027149 0.470635921 0.946475247 0.999967947
      prevereleicao$RESULT >=0.5
      [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
      LS0tDQp0aXRsZTogIkRBVEEgU0NJRU5DRSBwYXJhIENJRU5USVNUQSBERSBEQURPUyAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYDQo8Yj5ESVNUUklCVUnDh8ODTyBUIFNUVURFTlQ8L2I+DQoNClVtYSBwZXNxdWlzYSBtb3N0cmEgcXVlIGNpZW50aXN0YXMgZGUgZGFkb3MgZ2FuaGFtIFIkIDc1LDAwIHBvciBob3JhLiBVbWEgYW1vc3RyYSBkZSA5IGNpZW50aXN0YXMgw6kgc2VsZWNpb25hZG8gZSBwZXJndW50YWRvIG8gc2Fsw6FyaW8uIE8NCmRlc3ZpbyBwYWRyw6NvIGRhIGFtb3N0cmEgw6kgMTAuIFF1YWwgYSBwcm9iYWJpbGlkYWRlIGRvIHNhbMOhcmlvIHNlciBtZW5vciBxdWUgUiQgODAgYSBob3JhPw0KdD0xLjUsIGdyYXVzIGRlIGxpYmVyZGFkZT04ICh2ZXIgdGFiZWxhKQ0KDQoNCmBgYHtyfQ0KcHQoMS41LCA4KQ0KYGBgDQpRdWFsIGEgcHJvYWJpbGlkYWRlIGRlIHNlciBtYWlvciBxdWUgODANCmBgYHtyfQ0KcHQoMS41LDgsbG93ZXIudGFpbD1GKQ0KMSAtIHB0KDEuNSw4KQ0KYGBgDQpTb21hbmRvIGFzIDIgY2F1ZGFzDQpgYGB7cn0NCnB0KDEuNSwgOCkgKyBwdCgxLjUsOCxsb3dlci50YWlsPUYpDQpgYGANCg0KWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KPEI+RElTVFJJQlVJw4fDg08gQklOT01JQUw8L0I+DQoNCnggPSBldmVudG9zLCBwID0gcHJvYmFiaWxpZGFkZXMsIHNpemUgPSBldmVudG9zDQpTZSBqb2dhciB1bWEgbW9lZGEgNSB2ZXplcywgcXVhbCBhIHByb2IuIGRlIGRhciBjYXJhIDMgdmV6ZXM/DQoNCioqKnF1YW5kbyBzZSB1c2EgZGJpbm9tIHZhbW9zIGFjaGFyIGEgcHJvYmFiaWxpZGFkZSBwb250dWFsLCBvdSBzZWphLCBhIHByb2JhYmlsaWRhZGUgZGUgZW5jb250cmFyIDMgdmV6ZXMuIA0KDQpgYGB7cn0NCmRiaW5vbSh4PTMsc2l6ZT01LHByb2I9MC41KQ0KYGBgDQpTZSBldSBwYXNzYXIgNCBzaW5haXMgZGUgcXVhdHJvIHRlbXBvcyBjYWRhLiBRdWFsIGEgcHJvYmFiaWxpZGFkZSBkZSBldSBwZWdhciAwLDEsMiwzIGUgNCBzaW5haXMgdmVyZGVzPw0KDQpgYGB7cn0NCnBiaW5vbShxPTQsIHNpemU9NCwgcHJvYj0wLjI1KQ0KYGBgDQpYWFhYWFhYWFhYWFhYWFhYIERpZmVyZW7Dp2EgZW50cmUgZGJpbm9tIGUgcGJpbm9tDQoNCkZ1bsOnw6NvIGRiaW5vbTogU3Vwb25oYSBxdWUgbmEgbm9zc2EgYW1vc3RyYSBkZSAxMCBwYWNvdGVzLCBuID0gMTAsIGVzdGVqYW1vcyBpbnRlcmVzc2Fkb3MgbmEgcHJvYmFiaWxpZGFkZSBkZSBlbmNvbnRyYXJtb3MgOCBwYWNvdGVzIGNvbSBwZXNvIGlkZWFsLCBrID04LCBjb20gcCA9MC45MC4gQ2FsY3VsYW1vcyBhIHByb2JhYmlsaWRhZGUgUChYID0gOCApIGRhIHNlZ3VpbnRlIG1hbmVpcmE6DQoNCmBgYHtyfQ0KZGJpbm9tKHggPSA4LCBzaXplID0gMTAsIHByb2IgPSAwLjkpDQpgYGANCkUgcGFyYSBQKFggPTkpPw0KDQpgYGB7cn0NCmRiaW5vbSh4ID0gOSwgc2l6ZSA9IDEwLCBwcm9iID0gMC45KQ0KYGBgDQpSZXBhcmUgcXVlIG8gYXJndW1lbnRvIHNpemUgZW0gZGJpbm9tIHJlcHJlc2VudGEgbyBuw7ptZXJvIGRlIHJlcGxpY2HDp8O1ZXMgZG8gZXhwZXJpbWVudG8gKHBlc28gaWRlYWwgb3UgbsOjbyksIHJlZmVyZW50ZSBhbyBwYXLDom1ldHJvIG4gZGEgYmlub21pYWwuDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgNCg0KDQpTZSB2b2PDqiBmaXplciBhIHByb3ZhIGRlIHVtIGNvbmN1cnNvIGNvbSAxMiBxdWVzdMO1ZXMuIOKAnGNodXRhbmRv4oCdIHRvZGFzIGFzIHF1ZXN0w7VlcywgcXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgYWNlcnRhciA3IHF1ZXN0w7Vlcz8gKDQgYWx0ZXJuYXRpdmFzIGNhZGEgcXVlc3TDo28pDQoNCmBgYHtyfQ0KZGJpbm9tKHg9NyxzaXplPTEyLHByb2I9MC4yNSkNCmBgYA0KU2UgZXUgcGFzc2FyIDQgc2luYWlzIGRlIHF1YXRybyB0ZW1wb3MgY2FkYS4gUXVhbCBhIHByb2JhYmlsaWRhZGUgZGUgZXUgcGVnYXIgMyBPVSBNQUlTIHNpbmFpcyB2ZXJkZXM/DQoNCmBgYHtyfQ0KcGJpbm9tKHE9Miwgc2l6ZT00LCBwcm9iPTAuMjUsIGxvd2VyLnRhaWwgPSBGKQ0KZGJpbm9tKHg9MyxzaXplPTQscHJvYj0wLjI1KSArIGRiaW5vbSh4PTQsc2l6ZT00LHByb2I9MC4yNSkNCjEgLSBwYmlub20ocT0yLCBzaXplPTQsIHByb2I9MC4yNSkNCmBgYA0KDQpYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KPGI+RElTVFJJQlVJw4fDg08gREUgUE9JU1NPTjwvYj4NCg0KRGlzdHJpYnVpw6fDo28gZGUgUG9pc3Nvbg0KZHBvaXMgPSBwcm9iYWJpbGlkYWRlIHBvbnR1YWwNCnBwb2lzID0gY3VtdWxhdGl2YQ0KbG93ZXIudGFpbCBGYWxzZSA9IG1haW9yIHF1ZSwgY2F1ZGEgZGlyZXRhIGRhIGRpc3RyaWJ1acOnw6NvDQoNCk8gbsO6bWVybyBkZSBhY2lkZW50ZXMgZW0gdW0gZGlhIMOpIGlndWFsIGEgMiwgcXVhbCBhIHByb2FiaWxpZGFkZSBkZSBvY29ycmVyZW0gMyBlbSAxIGRpYT8NCmBgYHtyfQ0KZHBvaXMoMyxsYW1iZGE9MikNCmBgYA0KTyBuw7ptZXJvIGRlIGFjaWRlbnRlcyBlbSB1bSBkaWEgw6kgaWd1YWwgYSAyLCBxdWFsIGEgcHJvYWJpbGlkYWRlIGRlIG9jb3JyZXJlbSAzIE9VIE1FTk9TIGVtIDEgZGlhPw0KYGBge3J9DQpwcG9pcygzLGxhbWJkYT0yKQ0KYGBgDQpPIG7Dum1lcm8gZGUgYWNpZGVudGVzIGVtIHVtIGRpYSDDqSBpZ3VhbCBhIDIsIHF1YWwgYSBwcm9hYmlsaWRhZGUgZGUgb2NvcnJlcmVtIE1FTk9TIERPIFFVRSAzIGVtIDEgZGlhPw0KYGBge3J9DQpwcG9pcygyLGxhbWJkYSA9IDIpDQpkcG9pcygwLGxhbWJkYT0yKSArIGRwb2lzKDEsbGFtYmRhPTIpICsgZHBvaXMoMixsYW1iZGE9MikNCmBgYA0KTyBuw7ptZXJvIGRlIGFjaWRlbnRlcyBlbSB1bSBkaWEgw6kgaWd1YWwgYSAyLCBxdWFsIGEgcHJvYWJpbGlkYWRlIGRlIG9jb3JyZXJlbSBNQUlTIERPIFFVRSAzIGVtIDEgZGlhPw0KYGBge3J9DQpwcG9pcygzLGxhbWJkYT0yLCBsb3dlci50YWlsID0gRikgDQoxIC0gcHBvaXMoMyxsYW1iZGE9MikgDQpgYGANCg0KWFhYWFhYWFhYWFhYWFhYWDwvYj4NCg0KQ3JpYW1vcyBvIGNvbmp1bnRvIGRlIGRhZG9zIHBhcmEgdGVzdGUNCmBgYHtyfQ0Kbm92ZWxhID0gbWF0cml4KGMoMTksNiw0MywzMiksbnJvdz0yLCBieXJvdz1UKQ0Kcm93bmFtZXMobm92ZWxhKSA9IGMoIk1hc2N1bGlubyIsIkZlbWluaW5vIikNCmNvbG5hbWVzKG5vdmVsYSkgPSBjKCJBc3Npc3RlIiwiTmFvQXNzaXN0ZSIpDQpub3ZlbGENCmBgYA0KDQpFeGVjdXRhciBRdWlxdWFkcmFkbw0KVmFsb3IgZGUgcCDDqSBtYWlvciBxdWUgMCwwNSBuw6NvIGjDoSBldmlkw6puY2lhcyBkZSBkaWZlcmVuw6dhIHNpZ25pZmljYXRpdmEgKGhpcMOzdGVzZSBudWxhKSAtIHBvcnRhbnRvIG7Do28gaMOhIGRpZmVyZW7Dp2Egc2lnbmlmaWNhdGl2YSBlbnRyZSBob21lbnMgZSBtdWxoZXJlcyBxdWUgYXNzaXN0ZW0gbm92ZWxhLg0KYGBge3J9DQpjaGlzcS50ZXN0KG5vdmVsYSkNCmBgYA0KQWx0ZXJhbW9zIGEgcHJvcG9yw6fDo28gZGUgaG9tZW5zIHF1ZSBhc3Npc3RlIGUgbsOjby4gRXhlY3V0YW1vcyBvIHRlc3RlIG5vdmFtZW50ZSwgYWdvcmEgdmFsb3IgZGUgcCBtZW5vciBxdWUgMCwwNQ0KYGBge3J9DQpub3ZlbGEgPSBtYXRyaXgoYygyMiwzLDQzLDMyKSxucm93PTIsIGJ5cm93PVQpDQpyb3duYW1lcyhub3ZlbGEpID0gYygiTWFzY3VsaW5vIiwiRmVtaW5pbm8iKQ0KY29sbmFtZXMobm92ZWxhKSA9IGMoIkFzc2lzdGUiLCJOYW9Bc3Npc3RlIikNCm5vdmVsYQ0KY2hpc3EudGVzdChub3ZlbGEpDQpgYGANCkFnb3JhIHRlbW9zIGV2aWRlbmNpYXMgZW0gZmF2b3IgZGUgbm9zc2EgaGlww7N0ZXNlIGFsdGVybmF0aXZhLCBwb2lzIHAtdmFsdWUgw6kgbWVub3IgZG8gcXVlIDAsMDUuDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYDQo8Yj5BTk9WQTwvYj4NCg0KQ2FycmVnYSBkYWRvcw0KYGBge3J9DQp0cmF0YW1lbnRvPXJlYWQuY3N2KCJhbm92YS5jc3YiLHNlcD0iOyIpDQp0cmF0YW1lbnRvDQpgYGANCg0KVmlzdWFsaXphbmRvIGEgZGlzdHJpYnVpw6fDo28gZG9zIHJlbcOpZGlvcyBwb3IgaG9yYXMNCmBgYHtyfQ0KYm94cGxvdCh0cmF0YW1lbnRvJEhvcmFzIH4gdHJhdGFtZW50byRSZW1lZGlvKQ0KYGBgDQoNCkV4ZWN1dGFtb3MgQW7DoWxpc2UgZGUgdmFyacOibmNpYS4gT2JzZXJ2YXIgdmFsb3IgZGUgcCBtYWlvciBxdWUgMCwwNSAoUHIoPkYpKS4gSGlww7N0ZXNlIG51bGEgZGUgcXVlIG7Do28gaMOhIGRpZmVyZW7Dp2Egc2lnbmlmaWNhdGl2YSBlbnRyZSBvcyBkaWZlcmVudGVzIHJlbcOpZGlvcy4NCmBgYHtyfQ0KYW4gPSAgYW92KEhvcmFzIH4gUmVtZWRpbywgZGF0YT10cmF0YW1lbnRvKQ0Kc3VtbWFyeShhbikNCmBgYA0KDQpBbm92YSBkZSBkb2lzIGZhdG9yZXMuIE5lbmh1bSB2YWxvciBkZSBQIG1vc3RyYSBkaWZlcmVuw6dhIHNpZ25pZmljYXRpdmENCmBgYHtyfQ0KYW4gPSAgYW92KEhvcmFzIH4gUmVtZWRpbyAqIFNleG8sIGRhdGE9dHJhdGFtZW50bykNCnN1bW1hcnkoYW4pDQpgYGANClNlIGhvdXZlciBkaWZlcmVuw6dhIG8gdGVzdGUgZGUgVHVrZXkgw6kgZXhlY3V0YWRvDQpgYGB7cn0NCnR1a2V5ID0gVHVrZXlIU0QoYW4pDQp0dWtleQ0KYGBgDQpHcsOhZmljb3MgZG8gdGVzdGUNCg0KYGBge3J9DQpwbG90KHR1a2V5KQ0KYGBgDQoNCg0KWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgNCg0KPGI+PGZvbnQgc2l6ZT0iNSI+IFJFR1JFU1PDg08gTElORUFSIFNJTVBMRVMgTk8gUiA8L2ZvbnQ+PC9iPg0KDQo8Yj4gPGZvbnQgc2l6ZT0iNCI+Q3Vyc28gZG8gWW91VHViZSA8L2ZvbnQ+IDwvYj4NCg0KDQoNCmBgYHtyfQ0KIyoqTyBtYXRlcmlhbCBlc3TDoSB0b2RvIG5vIGRpcmV0w7NyaW8gKGM6XFVzZXJzXFVzdWFyaW9cUl9kYWRvcykgKioNCg0KaWYoIXJlcXVpcmUocGFjbWFuKSkgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikNCmxpYnJhcnkocGFjbWFuKQ0KDQpwYWNtYW46OnBfbG9hZChkcGx5cixnZ3Bsb3QyLGNhcixyc3RhdGl4LGxtdGVzdCxnZ3B1YnIpDQoNCmBgYA0KDQpgYGB7cn0NCmRhZG9zIDwtIHJlYWQuY3N2MignQmFuY28gZGUgRGFkb3MgMTEuY3N2JykNClZpZXcoZGFkb3MpDQpnbGltcHNlKGRhZG9zKQ0KYGBgDQo8Yj4gQ09NRU5Uw4FSSU9TIDwvYj4NCk5lc3RhIGV0YXBhIHRlbW9zIGRlIGFuYWxpc2FyIGEgcmVsYcOnw6NvIGVudHJlIGEgdmFyacOhdmVsIGRlcGVuZGVudGUgKMOpIHNlbXByZSBhIHF1ZSBldSBxdWVybyBwcmV2ZXI6VmVuZGFzKSBlIGEgdmFyacOhdmVsIGluZGVwZW5kZW50ZSjDqSBhIHF1ZSBjb25zaWRlcmFtb3MgcXVlIHRlbmhhIHVtYSBpbmZsdcOqbmNpYSBzb2JyZSBhIHZhcmnDoXZlbCBkZXBlbmRlbnRlKS4gDQpOb3JtYWxtZW50ZSBvIGVpeG8gdmVydGljYWwgeSByZWNlYmUgYSB2YXJpw6F2ZWwgRGVwZW5kZW50ZSAoUmVzcG9zdGEpIC0gb3Ugc2VqYSwgbyBxdWVyZW1vcyBwcmV2ZXIuIE5vIGVpeG8gaG9yaXpvbnRhbCB4IHJlY2ViZSBhIHZhcmnDoXZlbCBJbmRlcGVuZGVudGUgKEV4cGxhbmF0w7NyaWEpIC0gb3Ugc2VqYSwgbyBxdWUgdXNhbW9zIHBhcmEgcHJldmVyLg0KDQo8b2w+DQo8ZGw+VkQ6IFZlbmRhcw0KPGRsPlZJOiBQdWJsaWNpZGFkZQ0KPG9sPg0KYGBge3J9DQpwbG90KGRhZG9zJFB1YmxpY2lkYWRlLCBkYWRvcyRWZW5kYXMpDQoNCmBgYA0KDQpDb25zdHJ1w6fDo28gZG8gbW9kZWxvDQoNCmBgYHtyfQ0KbW9kIDwtIGxtKFZlbmRhcyB+IFB1YmxpY2lkYWRlLCBkYWRvcykNCm1vZA0KYGBgDQpBbsOhbGlzZSBHcsOhZmljYQ0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KG1vZCkNCmBgYA0KYGBge3J9DQpwYXIobWZyb3c9YygxLDEpKQ0KDQojbm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcw0Kc2hhcGlyby50ZXN0KG1vZCRyZXNpZHVhbHMpDQoNCiNPdXRpbGllcnMgbm9zIHJlc8OtZHVvcw0Kc3VtbWFyeShyc3RhbmRhcmQobW9kKSkNCg0KI2luZGVwZW5kw6puY2lhIGRvcyByZXPDrWR1b3MNCmR1cmJpbldhdHNvblRlc3QobW9kKQ0KYGBgDQoNCmBgYHtyfQ0KI0hvbW9jZWRhc3RpY2lkYWRlIChCcmV1c2NoLVBhZ2FuKQ0KYnB0ZXN0KG1vZCkNCmBgYA0KDQpgYGB7cn0NCiNhbmFsaXNlIGRvIG1vZGVsbw0Kc3VtbWFyeShtb2QpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gZGFkb3MsIG1hcHBpbmcgPSBhZXMoeCA9IFB1YmxpY2lkYWRlLCB5ID0gVmVuZGFzKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2wgPSAicmVkIikgKw0KICBzdGF0X3JlZ2xpbmVfZXF1YXRpb24oYWVzKGxhYmVsID0gcGFzdGUoLi5lcS5sYWJlbC4uLCAuLmFkai5yci5sYWJlbC4uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIipwbGFpbihcIixcIil+fiIpKSwNCiAgICAgICAgICAgICAgIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gNDAwLA0KICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFLCBjb2VmLmRpZ2l0cyA9IDUpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCmBgYA0KDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYDQo8Yj4gPGZvbnQgc2l6ZT0iNCI+UkVHUkVTU8ODTyBMSU5FQVIgU0lNUExFUyA8L2ZvbnQ+IDwvYj4NCg0KQ2FyczogbW9zdHJhIGEgdmVsb2NpZGFkZSBlIGRpc3TDom5jaWEgZGUgcGFyYWRhLiANCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImNvcnJncmFtIikNCmxpYnJhcnkoY29ycmdyYW0pDQpjYXJzDQpkaW0oY2FycykNCmBgYA0KDQpDb3JyZWxhw6fDo28gZW50cmUgZGlzdMOibmNpYSBlIHZlbG9jaWRhZGUgZGUgcGFyYWRhDQpgYGB7cn0NCmNvcihjYXJzKQ0KY29ycmdyYW0oY2Fycywgb3JkZXI9VFJVRSwgbG93ZXIucGFuZWw9cGFuZWwuc2hhZGUsDQogICAgICAgICB1cHBlci5wYW5lbD1wYW5lbC5waWUsIHRleHQucGFuZWw9cGFuZWwudHh0LA0KICAgICAgICAgbWFpbj0iQ2Fycm9zIikNCmBgYA0KDQpHZXJhbW9zIG8gbW9kZWxvIHVzYW5kbyBmdW7Dp8OjbyBsbQ0KUXVlcmVtb3MgcHJldmVyIGEgdmVsb2NpZGFkZSBxdWUgbyBjYXJybyBlc3RhdmEgYmFzZWFkbyBuYSBkaXN0w6JuY2lhIGRlIHBhcmFkYQ0KSW50ZXJjZXB0YcOnw6NvIGUgSW5jbGluYcOnw6NvIG8gcXVhbnRvIGEgdmFyacOhdmVsIGRlcGUuIGF1bWVudGEgY29tIG8gYXVtZW50byBkYSB2YXJpYXZlbCBpbmRlcGVuZW50ZQ0KYGBge3J9DQptb2RlbG8gPSBsbShzcGVlZCB+IGRpc3QsIGRhdGE9Y2FycykNCm1vZGVsbw0KYGBgDQoNClZpc3VhbGl6YcOnw6NvIGRhIHJlbGHDp8OjbyBlbnRyZSB2YXJpw6F2ZWlzIGUgbGluaGEgZGUgbWVsaG9yIGFqdXN0ZQ0KYGBge3J9DQojRXhlY3V0YXIgY29tIENydHJsKyBTaGlmdCArIEVudGVyDQpwbG90KHNwZWVkIH4gZGlzdCwgZGF0YT1jYXJzLCB5bGFiID0gIlZlbG9jaWRhZGUiLCB4bGFiPSIgRGlzdMOibmNpYSIsIG1haW49IkNhcnJvcyIpDQphYmxpbmUobW9kZWxvKQ0KYGBgDQoNClBvZGVtb3MgZmF6ZXIgdW1hIHByZXZpc8OjbyB1c2FuZG8gZGlyZXRhbWVudGUgb3MgY29lZmljaWVudGVzDQpRdWFsIHZlbG9jaWRhZGUgc2UgbGV2b3UgMjIgcHJhIHBhcmFyPw0KYGBge3J9DQptb2RlbG8kY29lZmZpY2llbnRzDQptb2RlbG8kY29lZmZpY2llbnRzWzFdICsgbW9kZWxvJGNvZWZmaWNpZW50c1syXSAqIDIyDQpgYGANCg0KVXNhbmRvIHByZWRpY3QNCmBgYHtyfQ0KcHJlZGljdChtb2RlbG8sZGF0YS5mcmFtZShkaXN0ID0gMjIpKQ0KYGBgDQoNCjxiPiBBbmFsaXNhbmRvIE1lbGhvciBvIE1vZGVsbyA8L2I+DQpgYGB7cn0NCnN1bW1hcnkobW9kZWxvKQ0KbW9kZWxvJGNvZWZmaWNpZW50cw0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxvJHJlc2lkdWFscw0KaGlzdChtb2RlbG8kcmVzaWR1YWxzKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxvJGZpdHRlZC52YWx1ZXMNCnBsb3QobW9kZWxvJGZpdHRlZC52YWx1ZXMsIGNhcnMkZGlzdCkNCmBgYA0KDQpYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KPGI+IDxmb250IHNpemU9IjQiPlJFR1JFU1PDg08gTElORUFSIE3DmkxUSVBMQSA8L2ZvbnQ+IDwvYj4NCg0KQ2Fycm9zLGNvbSBjb25zdW1vIGUgb3V0cm9zIGFzcGVjdG9zDQptcGc6IGNvbnN1bW8sIGhwIGNhdmFsb3MsIGN5bCBudW1lcm8gZGUgY2lsaW5kcm9zLCBkaXNwIGNpbGluZHJhZGFzDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJjb3JyZ3JhbSIpDQpsaWJyYXJ5KGNvcnJncmFtKQ0KbXRjYXJzDQpkaW0obXRjYXJzKQ0KYGBgDQoNCkNvcnJlbGHDp8Ojbw0KYGBge3J9DQpjb3IobXRjYXJzWzE6NF0pDQpjb3JyZ3JhbShtdGNhcnNbMTo0XSwgb3JkZXI9VFJVRSwgbG93ZXIucGFuZWw9cGFuZWwuc2hhZGUsDQogICAgICAgICB1cHBlci5wYW5lbD1wYW5lbC5waWUsIHRleHQucGFuZWw9cGFuZWwudHh0LA0KICAgICAgICAgbWFpbj0iQ2Fycm9zIikNCmBgYA0KDQpDb3JyZWxhw6fDo28NCmBgYHtyfQ0KY29yKG10Y2Fyc1sxOjRdKQ0KY29ycmdyYW0obXRjYXJzWzE6MTFdLCBvcmRlcj1UUlVFLCBsb3dlci5wYW5lbD1wYW5lbC5zaGFkZSwNCiAgICAgICAgIHVwcGVyLnBhbmVsPXBhbmVsLnBpZSwgdGV4dC5wYW5lbD1wYW5lbC50eHQsDQogICAgICAgICBtYWluPSJDYXJyb3MiKQ0KYGBgDQoNCg0KQW5hbGlzYW1vcyBjaWxpbmRyYWRhcyB2cyBjb25zdW1vDQpgYGB7cn0NCnBsb3QobXRjYXJzJG1wZyB+IG10Y2FycyRkaXNwLCB5bGFiPSJDb25zdW1vIiwgeGxhYj0iQ2lsaW5kcmFkYXMiLCBtYWluPSJDYXJyb3MiKQ0KYGBgDQoNCk1vZGVsbyB1c2FuZG8gY2lsaW5kcmFkYXMgcGFyYSBwcmV2ZXIgY29uc3Vtbw0KSW50ZXJjZXB0YcOnw6NvIGUgSW5jbGluYcOnw6NvDQpgYGB7cn0NCm1vZGVsbyA9IGxtKG1wZyB+IGRpc3AsIGRhdGE9bXRjYXJzKQ0KbW9kZWxvDQpgYGANCg0KQ29lZmljaWVudGUgZGUgRGV0ZXJtaW5hw6fDo28gKDcxJSBkYSB2YXJpYXZlbCBkZXBlbmRlbnRlIMOpIGV4cGxpY2FkYSBwZWxhIHZhcmlhdmVsIGV4cGxhbmF0w7NyaWEpDQpSMiBhanVzdGFkbw0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsbykkci5zcXVhcmVkIA0Kc3VtbWFyeShtb2RlbG8pJGFkai5yLnNxdWFyZWQNCmBgYA0KDQpHcsOhZmljbyBjb20gbGluaGEgZG8gbW9kZWxvDQpgYGB7cn0NCiNFeGVjdXRhciBjb20gQ3J0cmwrIFNoaWYgKyBFbnRlcg0KcGxvdChtcGcgfiBkaXNwLCBkYXRhPW10Y2Fycyx5bGFiPSJDb25zdW1vIiwgeGxhYj0iQ2lsaW5kcmFkYXMiLCBtYWluPSJDYXJyb3MiKQ0KYWJsaW5lKG1vZGVsbykNCmBgYA0KDQoNClByZXZlbmRvIGNvbnN1bW8gY29tIDIwMCBjaWxpbmRyYWRhcw0KYGBge3J9DQpwcmVkaWN0KG1vZGVsbyxkYXRhLmZyYW1lKGRpc3AgPSAyMDApKQ0KYGBgDQoNCkFkaWNpb25hbW9zIG1haXMgZHVhcyB2YXJpw6F2ZWwgaW5kZXBlZGVudGVzLCBocCBlIGNpbGluZHJvcw0KYGBge3J9DQptb2RlbG8gPSBsbShtcGcgfiBkaXNwICsgIGhwICsgY3lsLCBkYXRhPW10Y2FycykNCm1vZGVsbw0KYGBgDQoNCkNvZWZpY2llbnRlIGRlIERldGVybWluYcOnw6NvICg3MSUgZGEgdmFyaWF2ZWwgZGVwZW5kZW50ZSDDqSBleHBsaWNhZGEgcGVsYSB2YXJpYXZlbCBleHBsYW5hdMOzcmlhKQ0KUjIgYWp1c3RhZG8NCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbG8pJHIuc3F1YXJlZCANCnN1bW1hcnkobW9kZWxvKSRhZGouci5zcXVhcmVkDQpgYGANClByZXZlbmRvIGNvbnN1bW8gY29tIDIwMCBjaWxpbmRyYWRhcywgMTAwIGhwIGUgNCBjaWxpbmRyb3MNCmBgYHtyfQ0KcHJlZGljdChtb2RlbG8sZGF0YS5mcmFtZShkaXNwID0gMjAwLCBocD0xMDAsIGN5bD00KSkNCmBgYA0KDQpYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KPGI+IDxmb250IHNpemU9IjQiPlJFR1JFU1PDg08gTE9Hw41TVElDQSA8L2ZvbnQ+IDwvYj4NCg0KQ2FyZ2EgZG9zIGRhZG9zDQoNCmBgYHtyfQ0KZWxlaWNhbz1yZWFkLmNzdigiRWxlaWNhby5jc3YiLHNlcD0nOycsaGVhZGVyPVQpDQoNCmVsZWljYW8NCmBgYA0KDQpHcsOhZmljbyBkZSBWaXN1YWxpemHDp8Ojbw0KDQpgYGB7cn0NCnBsb3QoZWxlaWNhbyRERVNQRVNBUyxlbGVpY2FvJFNJVFVBQ0FPKQ0Kc3VtbWFyeShlbGVpY2FvKQ0KYGBgDQoNCkNvcnJlbGHDp8Ojbw0KDQpgYGB7cn0NCmNvcihlbGVpY2FvJERFU1BFU0FTLGVsZWljYW8kU0lUVUFDQU8pDQpgYGANCjxpPiBDb21lbnTDoXJpbzogRXhpc3RlIHVtYSByZWxhw6fDo28gcG9zaXRpdmEgZm9ydGUgKHBlbG8gbWVub3MgbWF0ZW3DoXRpY2EpIGVudHJlIG8gaW52ZXN0aW1lbnRvIGUgYSBlbGVpw6fDo28gPC9pPg0KDQpNb2RlbG8gZGUgUmVncmVzc8OjbyBMb2fDrXN0aWNhDQoNCmBgYHtyfQ0KbW9kZWxvPWdsbShTSVRVQUNBTyB+IERFU1BFU0FTLGRhdGE9ZWxlaWNhbyxmYW1pbHkgPSAiYmlub21pYWwiKQ0Kc3VtbWFyeShtb2RlbG8pDQpgYGANCg0KTW9kZWxvIENvbXBhcmFkbyBhb3MgRGFkb3MNCjxpPkdlcmHDp8OjbyBkZSB1bSBncsOhZmljbyBjb21wYXJhbmRvIG9zIGRhZG9zIHJlYWlzIGNvbSBvIG1vZGVsbyBhanVzdGFkbyA8L2k+DQoNCmBgYHtyfQ0KcGxvdChlbGVpY2FvJERFU1BFU0FTLGVsZWljYW8kU0lUVUFDQU8sY29sPSdyZWQnLHBjaD0yMCkNCnBvaW50cyhlbGVpY2FvJERFU1BFU0FTLG1vZGVsbyRmaXR0ZWQscGNoPTQpDQpgYGANCg0KPGk+IENvbWVudMOhcmlvOiBPcyBwb250b3MgdmVybWVsaG9zIHPDo28gb3MgY2FuZGlkYXRvcywgZSBvcyB4IGZhemVtIHBhcnRlIGRvIG5vc3NvIG1vZGVsbyBhanVzdGFkbyBkZSByZWdyZXNzw6NvIGxpbmVhciA8L2k+DQoNCjxicj4NCg0KWFhYWFhYWFhYWFhYIFRFU1RBUiBPIE1PREVMTyBDT00gT1MgUFLDk1BSSU9TIENBTkRJREFUT1MgWFhYWFhYWFhYWFhYWFhYWA0KDQpgYGB7cn0NCnByZXZlcj1wcmVkaWN0KG1vZGVsbyxuZXdkYXRhPWVsZWljYW8sdHlwZT0icmVzcG9uc2UiKQ0KcHJldmVyPXByZXZlciA+PSAwLjUNCnByZXZlcg0KYGBgDQoNCkF2YWxpYXIgUGVyZm9ybWFuY2UNCg0KYGBge3J9DQpjb25mdXNhbz10YWJsZShwcmV2ZXIsZWxlaWNhbyRTSVRVQUNBTykNCmNvbmZ1c2FvDQp0YXhhYWNlcnRvPShjb25mdXNhb1sxXStjb25mdXNhb1s0XSkvc3VtKGNvbmZ1c2FvKQ0KdGF4YWFjZXJ0bw0KYGBgDQoNCjxpPkNvbWVudMOhcmlvczogDQo8bGk+QSBkaWFnb25hbCAoMjEsIDIxKSBvdSBzZWphLCDDqSBkb3MgcXVlIGFjZXJ0YXJhbSwgb3Ugc2VqYSwgNDIgYWNlcnRvczsgZSBhIGRpYWdvbmFsICgyLDMpIGZheiBwYXJ0ZSBkb3MgcXVlIGVycmFyYSwgb3Ugc2VqYSA1IGVycm9zLjwvbGk+DQo8bGk+QWdvcmEgdmFtb3MgdmVyIGVtIHBlcmNlbnR1YWwgY29tbyBpc3NvIHNlcsOhIHJlcHJlc2VudGFkbzogKDIxKzI0KS80Nz0wLDg5MzYxNyA8L2xpPiA8L2k+DQoNCjxicj4NCg0KDQpOb3ZvcyBDYW5kaWRhdG9zDQoNCmBgYHtyfQ0KcHJldmVyZWxlaWNhbz1yZWFkLmNzdigiTm92b3NDYW5kaWRhdG9zLmNzdiIsc2VwPSc7JyxoZWFkZXI9VCkNCnByZXZlcmVsZWljYW8NCmBgYA0KPGJyPg0KUFJFVklTQU8NCg0KYGBge3J9DQpwcmV2ZXJlbGVpY2FvJFJFU1VMVD1wcmVkaWN0KG1vZGVsbyxuZXdkYXRhPXByZXZlcmVsZWljYW8sdHlwZT0icmVzcG9uc2UiKQ0KcHJldmVyZWxlaWNhbyRSRVNVTFQNCnByZXZlcmVsZWljYW8kUkVTVUxUID49MC41DQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==