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:
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"