---
title: "Caso 03: Classificador de digitos - Análise Discriminante"
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>)
-   Mass (<https://cran.r-project.org/web/packages/MASS/index.html>)
-   Dplyr (<https://cran.r-project.org/web/packages/dplyr/index.html>)
  
```{r include = TRUE}
library(ggplot2)
library(caret)
library(e1071)
library(klaR)
library(MASS)
library(dplyr)
```

  
***  
  
### Etapa 1: Seleção dos dados  
  
```{r include = TRUE}
load(file="df_classificador.Rdata")
str(DADOS)
```
  
  
***  
 
### Etapa 2: Pré-processamento  
  
#### Análise exploratória inicial:
  
- 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")
ggplot(DADOS,aes(x_1,fill=y))+geom_density(alpha=0.1)
ggplot(DADOS,aes(x_2,fill=y))+geom_density(alpha=0.1)
boxplot(x_1~y,data=DADOS,main="x_1")
boxplot(x_2~y,data=DADOS,main="x_2")
```


---  

#### Análise exploratória multivariada:  
  
  
- Distribuição de x_1 x x_2 (por classe):
  
```{r include = TRUE}
ggplot(DADOS,aes(x_1,x_2,color=y))+geom_point()
ggplot(DADOS,aes(x_1,x_2,color=y))+geom_density2d()
```
  
-   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
```
  

-   Covariância: geral e por classe

```{r}
cov(DADOS[,2:3])
df.2 <- DADOS %>% filter(y=="2"); cov(df.2$x_1,df.2$x_2)
df.7 <- DADOS %>% filter(y=="7"); cov(df.7$x_1,df.7$x_2)
```

***  
 
### Etapa 3: Transformação dos dados  
  
  Como não há a necessidade 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étodos de classificação, os casos discriminante linear e quadrático.
  

##### Análise discriminante linear:
  

```{r include = TRUE}
partimat(y~x_2+x_1,data=treino,method="lda")
fit.LDA = train(y~., method ='lda',
                 trControl=trainControl(method='cv',number=5),
                 metric     = "Accuracy",
                 data       = treino)
fit.LDA
```

  

---   
  
##### Análise discriminante quadrática:   
  

```{r include = TRUE}
partimat(y~x_2+x_1,data=treino,method="qda")
fit.QDA = train(y~., method ='qda',
                 trControl=trainControl(method='cv',number=5),
                 metric     = "Accuracy",
                 data       = treino)
fit.QDA
```
  
- Performance consolidada, no conjunto de treino:   
   
```{r}
Prev.treino <- predict(fit.QDA,newdata = treino)
confusionMatrix(factor(Prev.treino), factor(treino$y))
```
      
***  
 
#### Etapa 5: Avaliação dos resultados  
  
  
Para validar a performance da análise discriminante quadrática, na etapa de avaliação dos resultados, vamos aplicar o modelo no conjunto de teste. Assim:

```{r, include = TRUE, warning=FALSE, message=FALSE}
Prev.teste <- predict(fit.QDA,newdata = teste)
confusionMatrix(factor(teste$y),Prev.teste)
```
   
   
- Resultado do classificador:   
   
```{r}
x_1 = seq(0,0.5,0.001)
x_2 = seq(0,0.6,0.001)
z = data.frame(expand.grid(x_1,x_2))
colnames(z) = c("x_1","x_2")
P.CLASS.QDA <- predict(fit.QDA,newdata = z)
plot(z,col=unclass(P.CLASS.QDA))
```


***  
    
#### Aplicação da regra de classificação:  
  
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.QDA,nova.observacao)
predict(fit.QDA,nova.observacao,type="prob")
```
  
Portanto, será da classe 2.
  
***  


