---
title: "Caso 02: Classificador de digitos - Naive Bayes"
output:
  html_document: default
  pdf_document: default
---

## autor: *Rodrigo A. Scarpel*

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

------------------------------------------------------------------------

### Pacotes do R utilizados:

-   Ggplot2 (<https://cran.r-project.org/web/packages/ggplot2/index.html>)
-   Caret (<https://cran.r-project.org/web/packages/caret/index.html>)
-   E1071 (<https://cran.r-project.org/web/packages/e1071/index.html>)
-   KlaR (<https://cran.r-project.org/web/packages/klaR/index.html>)

```{r, include = TRUE, warning=FALSE, message=FALSE}
library(ggplot2)
library(caret)
library(e1071)
library(klaR)
```

------------------------------------------------------------------------

### Etapa 1: Seleção dos dados

```{r include = TRUE}
load(file="df_classificador.Rdata")
str(DADOS)
```

------------------------------------------------------------------------

### Etapa 2: Pré-processamento

#### Análise exploratória dos dados:

-   Estatísticas descritivas:

```{r include = TRUE}
summary(DADOS)
```

Pela análise descritiva dos dados e' possivel verificar:

-   Na variável resposta (y), 48,5% das observações são da classe "2" e 51,5% das observações são da classe "7". Portanto, não há a necessidade de fazer o balanceamento dos dados.

-   Em nenhuma das variáveis há observações com dados faltantes (*missing values*).

-   Gráficos univariados exploratórios:

```{r include = TRUE}
barplot(table(DADOS[,1]), col = "brown3", main="CLASSE")
hist(DADOS[,2],breaks=10, col = "red3", main="x_1")
hist(DADOS[,3],breaks=10, col = "red1", main="x_2")
```

-   Distribuição / Densidade (por classe):

```{r include = TRUE}
ggplot(DADOS,aes(x_1,fill=y))+geom_density(alpha=0.1)
ggplot(DADOS,aes(x_2,fill=y))+geom_density(alpha=0.1)
```

-   Estatísticas por classe: variável x_1

```{r}
MEDIAS <- aggregate(x=DADOS$x_1,by=list(CLASSE=DADOS$y),FUN=mean); MEDIAS
VARIANCIAS <- aggregate(x=DADOS$x_1,by=list(CLASSE=DADOS$y),FUN=var); VARIANCIAS
```

-   Estatísticas por classe: variável x_2

```{r}
MEDIAS <- aggregate(x=DADOS$x_2,by=list(CLASSE=DADOS$y),FUN=mean); MEDIAS
VARIANCIAS <- aggregate(x=DADOS$x_2,by=list(CLASSE=DADOS$y),FUN=var); VARIANCIAS
```

------------------------------------------------------------------------

### Etapa 3: Transformação dos dados

Como não há a necessidade de balancear os dados e de tratar dados faltantes, nem *outliers*, nessa etapa a única tarefa é dividir os dados em amostra de treinamento e amostra de teste.

#### Amostras de treinamento e teste do modelo:

Nesta etapa os dados serão divididos de forma a ficar 60% para treinamento do modelo e 40% para teste do modelo. Assim:

```{r include = TRUE}
set.seed(101)  
amostra <- sample.int(n = nrow(DADOS), size = floor(.60*nrow(DADOS)), replace = F)
treino <- DADOS[amostra, ]
teste  <- DADOS[-amostra, ]
message('Distribuicao das classes na base de treino:');table(treino$y)
message('')
message('Distribuicao das classes na base de teste:');table(teste$y)
```

------------------------------------------------------------------------

#### Etapa 4: Mineração dos dados

Na etapa de mineração de dados vamos avaliar, como método de classificação, o Naive Bayes considerando 2 situações: i. Só utilizando x_1, ii. Utilizando x_1 e x_2.

##### Situação 1 - Naive Bayes - variável x_1:

```{r, include = TRUE, warning=FALSE, message=FALSE}
fit.NB.1 = train(y~x_1, method ='nb',
                trControl=trainControl(method='cv',number=5),
                metric     = "Accuracy",
                data       = treino)
fit.NB.1
```

Verifica-se, a partir dos resultados obtidos, que na situação 1 (utilizando apenas x_1) 78,8% das observações foram corretamente classificadas (no conjunto de treinamento).

##### Situação 2 - Naive Bayes - variáveis PW e PRF:

```{r, include = TRUE, warning=FALSE, message=FALSE}
partimat(y~x_2+x_1,data=treino,method="naiveBayes")
fit.NB.2 = train(y~x_1+x_2, method ='nb',
                trControl=trainControl(method='cv',number=5),
                metric     = "Accuracy",
                data       = treino)
fit.NB.2
```

Verifica-se, a partir dos resultados obtidos, que na situação 2 (utilizando x_1 e x_2) houve um aumento na performance do modelo (no conjunto de treinamento).
   
- Performance consolidada, no conjunto de treino:   
   
```{r}
Prev.treino <- predict(fit.NB.2,newdata = treino)
confusionMatrix(factor(Prev.treino), factor(treino$y))
```
   

------------------------------------------------------------------------

#### Etapa 5: Avaliação dos resultados

Na etapa de avaliação dos resultados, vamos aplicar o modelo selecionado no conjunto de teste. Assim:
   
```{r, include = TRUE, warning=FALSE, message=FALSE}
Prev.teste <- predict(fit.NB.2,newdata = teste)
confusionMatrix(factor(teste$y),Prev.teste)
```

------------------------------------------------------------------------

#### Aplicacao da regra de classificacao:

Qual sera a classificacao de um digito com:\
- x_1: 0.1253\
- x_2: 0.2714

```{r include = TRUE}
nova.observacao = data.frame(
  x_1 = 0.1253,
  x_2 = 0.2714)
predict(fit.NB.2,nova.observacao)
predict(fit.NB.2,nova.observacao,type="prob")
```

Portanto, é classificado como "2".

------------------------------------------------------------------------
