1 Apresentação do Problema

Este relatório apresenta a resolução completa da Atividade Prática 2 focada no classificador probabilístico Naive Bayes. O contexto da atividade envolve uma aplicação prática de visão computacional na agricultura, onde um sistema de monitoramento automático analisa fotos de folhas de plantações e registra três características para cada folha:

  1. cor: Predominância da folha, categorizada em verde ou amarelada.
  2. manchas: Presença ou ausência de manchas físicas na superfície (ausentes ou presentes).
  3. textura: Aspecto sensorial ou de relevo da folha (uniforme ou irregular).

O objetivo é treinar um classificador estatístico para inferir a classe final da folha: se ela está saudável ou doente.


2 Preparação do Ambiente e Carga de Dados

Para realizar esta análise, utilizaremos a biblioteca e1071, que fornece a implementação robusta do algoritmo Naive Bayes no R.

# Instale se necessário: install.packages("e1071")
library(e1071)

Agora, realizamos a importação da base de dados histórica. O arquivo base_naive_bayes_folhas_simples.csv contém o registro histórico de observações que servirá como base de treinamento (treino) para o nosso classificador.

# Importação garantindo fatores para variáveis categóricas
nome_arquivo <- "base_naive_bayes_folhas_simples.csv"
if (!file.exists(nome_arquivo) & file.exists("base_naive_bayes_folhas_simples_(1).csv")) {
  nome_arquivo <- "base_naive_bayes_folhas_simples_(1).csv"
}

dados <- read.csv(nome_arquivo, stringsAsFactors = TRUE, fileEncoding = "UTF-8-BOM")

# Visualização das primeiras linhas e das dimensões dos dados
head(dados)
#>   id       cor   manchas  textura   classe
#> 1  1     verde presentes uniforme saudavel
#> 2  2     verde  ausentes uniforme saudavel
#> 3  3     verde  ausentes uniforme saudavel
#> 4  4 amarelada presentes uniforme   doente
#> 5  5     verde presentes uniforme saudavel
#> 6  6     verde presentes uniforme saudavel
dim(dados)
#> [1] 40  5

3 Exercício 1: Análise Estrutural dos Dados

Pergunta: 1. Quantas observações existem? 2. Qual é a variável resposta? 3. Quais são as duas classes? 4. Quais características serão utilizadas para a classificação?

Resposta:

A partir das funções estruturais do R, podemos obter essas informações diretamente:

# Contagem de observações (linhas)
nrow(dados)
#> [1] 40
# Classes da variável resposta
levels(dados$classe)
#> [1] "doente"   "saudavel"
  1. Quantas observações existem? Existem exatamente 40 observações registradas na base de dados.
  2. Qual é a variável resposta? A variável resposta (também chamada de rótulo ou variável dependente) é a coluna classe.
  3. Quais são as duas classes? As duas classes possíveis são saudavel (saudável) e doente (doente).
  4. Quais características serão utilizadas para a classificação? As características preditivas (variáveis independentes ou atributos) são: cor, manchas e textura. A coluna id é apenas um identificador numérico único e deve ser descartada para a construção do modelo preditivo.

4 Probabilidades a Priori

As probabilidades a priori representam o nosso conhecimento de base sobre a distribuição das classes antes de observarmos qualquer característica de uma folha específica.

4.1 Exercício 2: Cálculo das Probabilidades a Priori

Executamos a contagem absoluta e o cálculo das proporções relativas na base de dados histórica:

# Tabela de contagem absoluta
tabela_priori <- table(dados$classe)
tabela_priori
#> 
#>   doente saudavel 
#>       16       24
# Tabela de proporções (probabilidade a priori)
proporcoes_priori <- prop.table(tabela_priori)
proporcoes_priori
#> 
#>   doente saudavel 
#>      0.4      0.6

Registro: * \(P( ext{Saudável}) =\) 0.60 (60% das observações na base histórica são de folhas saudáveis). * \(P( ext{Doente}) =\) 0.40 (40% das observações na base histórica são de folhas doentes).

Pergunta: Antes de observarmos a nova folha, qual das duas classes é mais provável? Resposta: A priori, a classe saudavel é a mais provável, apresentando uma chance de 60% de ocorrência contra 40% da classe doente.


5 Probabilidades Condicionais (Verossimilhanças)

As probabilidades condicionais determinam o comportamento de cada característica dadas as classes. No Naive Bayes, estas probabilidades correspondem à verossimilhança de observar determinado atributo se soubermos de antemão que a folha pertence àquela classe específica.

5.1 Análise de Características

Geramos as tabelas de contingência cruzadas com as proporções condicionais calculadas por coluna (parâmetro margin = 2), garantindo que a soma de cada classe seja igual a 1 (100%):

# 6.1 Cor por Classe
table(dados$cor, dados$classe)
#>            
#>             doente saudavel
#>   amarelada     13        1
#>   verde          3       23
prop.table(table(dados$cor, dados$classe), margin = 2)
#>            
#>                 doente   saudavel
#>   amarelada 0.81250000 0.04166667
#>   verde     0.18750000 0.95833333
# 6.2 Manchas por Classe
table(dados$manchas, dados$classe)
#>            
#>             doente saudavel
#>   ausentes       4       15
#>   presentes     12        9
prop.table(table(dados$manchas, dados$classe), margin = 2)
#>            
#>             doente saudavel
#>   ausentes   0.250    0.625
#>   presentes  0.750    0.375
# 6.3 Textura por Classe
table(dados$textura, dados$classe)
#>            
#>             doente saudavel
#>   irregular     12        4
#>   uniforme       4       20
prop.table(table(dados$textura, dados$classe), margin = 2)
#>            
#>                doente  saudavel
#>   irregular 0.7500000 0.1666667
#>   uniforme  0.2500000 0.8333333

5.2 Exercício 3: Interpretação das Probabilidades Condicionais

Com base nos resultados das tabelas probabilísticas condicionais calculadas acima:

  1. Folhas amareladas aparecem com maior frequência em qual classe? Aparecem com maior frequência na classe doente. Exatamente 81,25% (13 de 16) das folhas doentes apresentam coloração amarelada, enquanto apenas 4,17% (1 de 24) das folhas saudáveis exibem essa cor.

  2. Manchas presentes aparecem com maior frequência em qual classe? Aparecem com maior frequência na classe doente. Das folhas doentes, 75,00% (12 de 16) contam com a presença de manchas, em comparação com 37,50% (9 de 24) das folhas saudáveis.

  3. Textura irregular aparece com maior frequência em qual classe? Aparecem com maior frequência na classe doente. Cerca de 75,00% (12 de 16) das folhas doentes apresentam textura irregular, ao passo que apenas 16,67% (4 de 24) das folhas saudáveis são irregulares.

  4. Qual conjunto de características parece mais associado a uma folha doente? O conjunto de características fortemente associado ao estado patológico (doente) é a combinação de cor amarelada, presença de manchas e textura irregular, uma vez que todas essas categorias apresentam forte dominância proporcional dentro da classe doente.


6 Construção do Modelo Naive Bayes

Agora que extraímos todas as contagens necessárias para ilustrar a matemática por trás do algoritmo, construímos o classificador preditivo no R. Antes disso, removemos a variável id, que não possui valor preditivo.

# Filtra colunas de interesse
dados_modelo <- dados[, c("cor", "manchas", "textura", "classe")]

# Treina o modelo Naive Bayes
modelo <- naiveBayes(classe ~ cor + manchas + textura, data = dados_modelo)
print(modelo)
#> 
#> Naive Bayes Classifier for Discrete Predictors
#> 
#> Call:
#> naiveBayes.default(x = X, y = Y, laplace = laplace)
#> 
#> A-priori probabilities:
#> Y
#>   doente saudavel 
#>      0.4      0.6 
#> 
#> Conditional probabilities:
#>           cor
#> Y           amarelada      verde
#>   doente   0.81250000 0.18750000
#>   saudavel 0.04166667 0.95833333
#> 
#>           manchas
#> Y          ausentes presentes
#>   doente      0.250     0.750
#>   saudavel    0.625     0.375
#> 
#>           textura
#> Y          irregular  uniforme
#>   doente   0.7500000 0.2500000
#>   saudavel 0.1666667 0.8333333

7 Classificação de uma Nova Folha

7.1 Exercício 4 e 5: Folha Amarelada, com Manchas Presentes e Textura Irregular

Considere o caso de uma nova observação colhida em campo que exibe as seguintes propriedades: * cor: amarelada * manchas: presentes * textura: irregular

Expectativa Teórica: Pela análise do Exercício 3, todas as três características individuais estão altamente associadas a folhas doentes. Multiplicando essas probabilidades com a probabilidade a priori, espera-se fortemente que o Naive Bayes a classifique como doente.

Executando a predição e obtendo as probabilidades a posteriori exatas no R:

# Criação do data frame para a nova folha
nova_folha <- data.frame(
  cor = factor("amarelada", levels = levels(dados_modelo$cor)),
  manchas = factor("presentes", levels = levels(dados_modelo$manchas)),
  textura = factor("irregular", levels = levels(dados_modelo$textura))
)

# 1. Predição da Classe
classe_prevista_1 <- predict(modelo, nova_folha)
classe_prevista_1
#> [1] doente
#> Levels: doente saudavel
# 2. Obtenção das Probabilidades Posteriores
probabilidades_1 <- predict(modelo, nova_folha, type = "raw")
round(probabilidades_1, 4)
#>      doente saudavel
#> [1,] 0.9915   0.0085

Registro de Resultados: * Classe prevista: doente * $P( ext{Saudável} X) = \(** **0.0085** (0,85%) * **\)P( ext{Doente} X) = $ 0.9915 (99,15%)

Interpretação das Perguntas: 1. Qual probabilidade é maior? A probabilidade a posteriori da classe doente (\(99,15\%\)) é expressivamente maior do que a da classe saudavel (\(0,85\%\)). 2. As duas probabilidades somam aproximadamente 1? Sim. \(0.9915 + 0.0085 = 1.0000\) (exatamente 100%). 3. A classe prevista corresponde à maior probabilidade? Sim, o comando predict(modelo, nova_folha) escolheu a classe de maior probabilidade, classificando a folha como doente. 4. O resultado coincide com sua expectativa inicial? Sim. Como todas as características observadas eram fortes indícios de doença, o modelo combinou-as para gerar uma decisão de alta confiança.


8 Análise de um Segundo Caso

8.1 Exercício 6: Folha Verde, sem Manchas e com Textura Uniforme

Agora, avaliaremos um segundo espécime com características opostas: * cor: verde * manchas: ausentes * textura: uniforme

Executando a classificação:

# Criação do data frame para a folha 2
nova_folha_2 <- data.frame(
  cor = factor("verde", levels = levels(dados_modelo$cor)),
  manchas = factor("ausentes", levels = levels(dados_modelo$manchas)),
  textura = factor("uniforme", levels = levels(dados_modelo$textura))
)

# 1. Predição da Classe
classe_prevista_2 <- predict(modelo, nova_folha_2)
classe_prevista_2
#> [1] saudavel
#> Levels: doente saudavel
# 2. Obtenção das Probabilidades Posteriores
probabilidades_2 <- predict(modelo, nova_folha_2, type = "raw")
round(probabilidades_2, 4)
#>      doente saudavel
#> [1,] 0.0154   0.9846

Respostas Comparativas:

  1. Qual foi classificada como doente? A primeira folha (amarelada, com manchas e textura irregular).
  2. Qual foi classificada como saudável? A segunda folha (verde, sem manchas e com textura uniforme).
  3. Como as probabilidades posteriores mudaram? Elas se inverteram completamente. Enquanto a primeira folha obteve \(99,15\%\) de probabilidade de estar doente, a segunda folha registrou \(98,46\%\) de probabilidade de estar saudável (\(P( ext{Saudável} \mid X_2) = 0.9846\) contra \(P( ext{Doente} \mid X_2) = 0.0154\)).
  4. O Naive Bayes utiliza apenas uma característica para decidir? Explique. Não. O Naive Bayes utiliza todas as características observadas simultaneamente para tomar a sua decisão. Ele calcula de forma separada a probabilidade de ocorrência de cada atributo dentro de cada classe (verossimilhança) e multiplica esses valores de maneira combinada com a probabilidade de base (priori). É a força do produto dessas probabilidades individuais que determina a classe final, permitindo que características complementares influenciem juntas a predição.

9 Desafio Final

Criação de um exemplo personalizado combinando características mistas. Escolheremos uma folha com a seguinte configuração: * cor: verde (comum em saudável) * manchas: presentes (comum em doente) * textura: uniforme (comum em saudável)

# Criação da folha personalizada
minha_folha <- data.frame(
  cor = factor("verde", levels = levels(dados_modelo$cor)),
  manchas = factor("presentes", levels = levels(dados_modelo$manchas)),
  textura = factor("uniforme", levels = levels(dados_modelo$textura))
)

# Predição
class_desafio <- predict(modelo, minha_folha)
prob_desafio <- predict(modelo, minha_folha, type = "raw")

cat("Classe Predita:
")
#> Classe Predita:
class_desafio
#> [1] saudavel
#> Levels: doente saudavel
cat("
Probabilidades:
")
#> 
#> Probabilidades:
round(prob_desafio, 4)
#>      doente saudavel
#> [1,] 0.0726   0.9274

Interpretação Estatística do Desafio: Nesse caso de dados mistos, o classificador prediz que a folha é saudavel com \(92,74\%\) de probabilidade (\(0.9274\)), restando apenas \(7,26\%\) de chance de ser doente.

Isso ocorre porque, apesar da presença de manchas (que pontua a favor de doença), as características de cor verde (altamente saudável) e textura uniforme (também altamente saudável) juntas superam o impacto negativo das manchas, ilustrando como o Naive Bayes equilibra as evidências ponderadas de forma elegante.