O objetivo deste conjunto de dados

Prever a decisão de “Jogar” (Sim ou Não) com base em condições climáticas e variáveis ambientais. Usei o algoritmo Naive Bayes, que é um classificador probabilístico adequado para problemas de classificação binária e multicategoria. Esse modelo assumirá a independência entre as variáveis preditoras para calcular a probabilidade de jogar ou não jogar, dadas as condições fornecidas.

Variáveis do Conjunto de Dados Panorama: estado do clima, com possíveis valores: Ensolarado Nublado Chuvoso

Temperatura: nível de calor no ambiente, com categorias: Quente Intermediária Fria

Umidade: nível de umidade no ar, podendo assumir dois valores: Alta Normal

Vento: intensidade do vento, com categorias: Fraco Forte

Jogar (Classe): Esta é a variável-alvo, indicando se a decisão final é jogar ou não. Sim: Representa uma decisão positiva para jogar. Não: Representa uma decisão negativa para não jogar.

Objetivo da Análise

Treinar um modelo Naive Bayes que possa prever, com base nas variáveis climáticas (Panorama, Temperatura, Umidade e Vento), se a decisão para um determinado conjunto de condições será jogar ou não jogar. O modelo se beneficiará das probabilidades condicionais calculadas para cada variável e usará essas probabilidades para fazer previsões.

Justificativa do Uso do Algoritmo Naive Bayes

O Naive Bayes é uma escolha adequada para este conjunto de dados devido às seguintes razões:

  1. Simplicidade e Eficiência: O Naive Bayes é um algoritmo simples e eficiente para conjuntos de dados de pequeno a médio porte, como é o caso deste conjunto de dados com 14 observações.
  2. Probabilidades Condicionais: O Naive Bayes usa a teoria de probabilidades para calcular a probabilidade de um evento (a decisão de jogar) dada a ocorrência de outras variáveis (condições climáticas).
  3. Independência: Embora as variáveis possam ter alguma correlação, o Naive Bayes assume independência condicional entre as variáveis preditoras. Isso permite que o modelo funcione bem mesmo em conjuntos de dados com poucas observações.

Aplicação e Expectativas Com base nas variáveis, o algoritmo Naive Bayes será treinado para identificar padrões que ajudem a prever a decisão de jogar ou não. A expectativa é que o modelo possa ser usado para fazer previsões em novos dados climáticos, possibilitando recomendações automáticas de decisão com base nas condições do dia.

library(e1071)
library(caret)
## Carregando pacotes exigidos: ggplot2
## Carregando pacotes exigidos: lattice
library(ggplot2)
library(reshape2)
dados <- data.frame(
  Dia = 1:14,
  Panorama = as.factor(c("Ensolarado", "Ensolarado", "Nublado", "Chuvoso", "Chuvoso", "Chuvoso", "Nublado", "Ensolarado", "Ensolarado", "Chuvoso", "Ensolarado", "Nublado", "Nublado", "Chuvoso")),
  Temperatura = as.factor(c("Quente", "Quente", "Quente", "Intermediária", "Fria", "Fria", "Fria", "Intermediária", "Fria", "Intermediária", "Intermediária", "Intermediária", "Quente", "Intermediária")),
  Umidade = as.factor(c("Alta", "Alta", "Alta", "Alta", "Normal", "Normal", "Normal", "Alta", "Normal", "Normal", "Normal", "Alta", "Normal", "Alta")),
  Vento = as.factor(c("Fraco", "Forte", "Fraco", "Fraco", "Fraco", "Forte", "Forte", "Fraco", "Fraco", "Fraco", "Forte", "Forte", "Fraco", "Forte")),
  Jogar = as.factor(c("Não", "Não", "Sim", "Sim", "Sim", "Não", "Sim", "Não", "Sim", "Sim", "Sim", "Sim", "Sim", "Não"))
)

Treinar o modelo para prever a variável “Jogar” (Sim ou Não) com base nas variáveis “Panorama”, “Temperatura”, “Umidade” e “Vento”, utilizando a função train do pacote caret, que facilita o treinamento de modelos com validação cruzada e ajustes de parâmetros.

controle <- trainControl(method = "cv", number = 5)
modelo_nb <- train(Jogar ~ Panorama + Temperatura + Umidade + Vento,
                   data = dados,
                   method = "nb",
                   trControl = controle,
                   tuneGrid = data.frame(usekernel = TRUE, fL = 1, adjust = 1))

Informações do Modelo

Amostras: 14 Preditores: 4 variáveis preditoras (“Panorama”, “Temperatura”, “Umidade” e “Vento”). Classes: 2 classes de saída — “Não” e “Sim”. Resampling: Validação cruzada com 5 folds (5-partições) para avaliar o modelo. Cada fold utiliza aproximadamente 11 ou 12 amostras para treinamento e o restante para teste.

print("Modelo Naive Bayes treinado:")
## [1] "Modelo Naive Bayes treinado:"
print(modelo_nb)
## Naive Bayes 
## 
## 14 samples
##  4 predictor
##  2 classes: 'Não', 'Sim' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 11, 11, 12, 11, 11 
## Resampling results:
## 
##   Accuracy  Kappa
##   0.5       -0.02
## 
## Tuning parameter 'fL' was held constant at a value of 1
## Tuning
##  parameter 'usekernel' was held constant at a value of TRUE
## Tuning
##  parameter 'adjust' was held constant at a value of 1
previsoes <- predict(modelo_nb, dados)
matriz_confusao <- confusionMatrix(data = previsoes, reference = dados$Jogar)
print("Matriz de Confusão:")
## [1] "Matriz de Confusão:"
print(matriz_confusao)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Não Sim
##        Não   2   0
##        Sim   3   9
##                                          
##                Accuracy : 0.7857         
##                  95% CI : (0.492, 0.9534)
##     No Information Rate : 0.6429         
##     P-Value [Acc > NIR] : 0.2044         
##                                          
##                   Kappa : 0.4615         
##                                          
##  Mcnemar's Test P-Value : 0.2482         
##                                          
##             Sensitivity : 0.4000         
##             Specificity : 1.0000         
##          Pos Pred Value : 1.0000         
##          Neg Pred Value : 0.7500         
##              Prevalence : 0.3571         
##          Detection Rate : 0.1429         
##    Detection Prevalence : 0.1429         
##       Balanced Accuracy : 0.7000         
##                                          
##        'Positive' Class : Não            
## 

Métricas e Estatísticas:

Accuracy (Acurácia): 0,7857 (ou 78,57%) proporção de previsões corretas sobre o total de previsões Acurácia e Kappa: A acurácia de 78,57% e o Kappa de 0,4615 indicam um desempenho moderado, mas não ótimo.

CI (Intervalo de Confiança de 95%): (0,492, 0,9534) com 95% de confiança, a acurácia real do modelo está entre 49,2% e 95,34%, intervalo relativamente amplo, possivelmente devido ao pequeno tamanho do conjunto de dados.

No Information Rate (NIR): 0,6429 (ou 64,29%) proporção da classe mais frequente nos dados, a mais comum (“Sim”) representa 64,29% dos casos, Comparando a acurácia do modelo (78,57%) com o NIR, o modelo supera o desempenho esperado ao acaso (NIR).

P-Value [Acc > NIR]: 0,2044, testou se a acurácia do modelo é significativamente maior que o No Information Rate, p > 0,05 indica que a diferença não é estatisticamente significativa, ou seja, o modelo não é significativamente melhor que uma previsão aleatória baseada apenas na classe mais frequente.

confusion_df <- as.data.frame(matriz_confusao$table)
colnames(confusion_df) <- c("Previsto", "Real", "Freq")
ggplot(data = confusion_df, aes(x = Real, y = Previsto, fill = Freq)) +
  geom_tile(color = "white") +
  geom_text(aes(label = Freq), vjust = 1) +
  scale_fill_gradient(low = "white", high = "blue") +
  labs(title = "Matriz de Confusão do Modelo Naive Bayes Otimizado",
       x = "Valor Real",
       y = "Valor Previsto") +
  theme_minimal()

Analise da Matriz de confusão e modelo

O modelo tem um desempenho muito bom em identificar casos onde o valor real é “Sim”, com recall de 100% e uma precisão de 79%. Isso significa que o modelo é confiável para prever “Sim” e dificilmente deixa de identificar um caso positivo.

A especificidade de 40% e os 3 falsos positivos indicam que o modelo tende a classificar muitos casos “Não” como “Sim”. Isso pode ser um problema se for importante minimizar os falsos positivos.

A adequação do modelo depende do objetivo. Se for mais importante capturar todos os casos “Sim”, mesmo que haja alguns falsos positivos, o modelo está adequado. Porém, se for necessário um equilíbrio melhor entre prever “Sim” e “Não” corretamente, talvez seja necessário ajustar o modelo ou considerar outros algoritmos que possam lidar melhor com a distinção entre as duas classes.

exemplo <- data.frame(Panorama = "Nublado", Temperatura = "Intermediária", Umidade = "Alta", Vento = "Fraco")
previsao <- predict(modelo_nb, exemplo)
print(paste("Previsão para o exemplo:", previsao))
## [1] "Previsão para o exemplo: Sim"
print(paste("Acurácia do modelo:", round(matriz_confusao$overall["Accuracy"], 2)))
## [1] "Acurácia do modelo: 0.79"