Tópicos Especiais de Estatística I

palmerpenguins_extended <- read_excel("palmerpenguins_extended.xlsm")
View(palmerpenguins_extended)

Caret

Introdução

O pacote caret (Classification And REgression Training) no R é uma das ferramentas mais versáteis e abrangentes para a construção de modelos de machine learning. Ele fornece uma interface unificada para a aplicação de diferentes técnicas de modelagem e inclui funções para pré-processamento de dados, seleção de características, avaliação de modelos, e muito mais. Este trabalho explora o uso do caret para construir e avaliar um modelo preditivo com dados de pinguins, além de fornecer exemplos práticos e interpretar os resultados.

Métodos

O pacote caret suporta uma ampla gama de métodos de machine learning para classificação, regressão e outras tarefas. Em nosso caso, utilizamos a regressão logística (glm com a função de link logit) é uma escolha apropriada para este tipo de problema, levando em consideração a variável resposta que é sex, que tem duas classes: “female” e “male”. A seguir veremos exemplos dos principais métodos usando caret:

Métodos de Classificação

  • Árvores de Decisão: rpart: Recursive Partitioning and Regression Trees

  • Floresta Aleatória: rf: Random Forest

  • Support Vector Machines (SVM): svmLinear: Support Vector Machines with Linear Kernel svmRadial: Support Vector Machines with Radial Kernel

  • K-Nearest Neighbors (KNN): knn: K-Nearest Neighbors

  • Redes Neurais: nnet: Neural Networks

  • Logistic Regression: glm: Generalized Linear Model

Métodos de Regressão

  • Regressão Linear: lm: Linear Model

  • Support Vector Machines (SVM): svmLinear: Support Vector Machines with Linear Kernel svmRadial: Support Vector Machines with Radial Kernel

  • Floresta Aleatória: rf: Random Forest

  • K-Nearest Neighbors (KNN): knn: K-Nearest Neighbors

  • Redes Neurais: nnet: Neural Networks

  • Métodos de Clustering

  • kmeans: K-Means Clustering

  • Hierarchical Clustering: hclust: Hierarchical Clustering

Aplicações

  • O pacote caret (Classification And REgression Training) é amplamente aplicável em diversos campos que envolvem análise de dados e machine learning. A seguir, apresento algumas áreas e exemplos específicos onde caret pode ser aplicado:

1 . Ciências de Dados e Análise Preditiva: Previsão de Vendas: Desenvolver modelos que prevejam vendas futuras com base em dados históricos de vendas, promoções, e outras variáveis.

2 . Saúde: Diagnóstico Médico: Criar modelos que auxiliem no diagnóstico de doenças com base em sintomas, resultados de exames, e histórico médico do paciente. Predição de Internações: Estimar a probabilidade de um paciente ser internado novamente após a alta, com base em dados de saúde e histórico de internações.

3 . Finanças: Análise de Crédito: Avaliar a probabilidade de um cliente inadimplente com base em histórico financeiro, crédito passado, e outras características. Detecção de Fraude: Identificar transações fraudulentas em tempo real usando dados de transações e comportamentos de compra.

4 . Marketing: Segmentação de Clientes: Agrupar clientes em segmentos distintos com base em comportamentos de compra, demografia, e outras características. Modelos de Propensão: Prever quais clientes são mais propensos a responder positivamente a campanhas de marketing específicas.

5 . Educação: Previsão de Desempenho Acadêmico: Criar modelos que prevejam o desempenho dos alunos com base em dados anteriores, identificando aqueles que precisam de suporte adicional. Análise de Retenção de Alunos: Identificar fatores que contribuem para a desistência de alunos e desenvolver estratégias para melhorar a retenção.

Dados

# prepareção dos dados
# Remover as linhas com valores NA
palmerpenguins_extended <- na.omit(palmerpenguins_extended)

# Verificando se estao nas funções certas
str(palmerpenguins_extended)
## tibble [3,430 × 11] (S3: tbl_df/tbl/data.frame)
##  $ species          : chr [1:3430] "Adelie" "Adelie" "Adelie" "Adelie" ...
##  $ island           : chr [1:3430] "Biscoe" "Biscoe" "Biscoe" "Biscoe" ...
##  $ bill_length_mm   : chr [1:3430] "53.4" "49.3" "55.7" "38.0" ...
##  $ bill_depth_mm    : chr [1:3430] "17.8" "18.1" "16.6" "15.6" ...
##  $ flipper_length_mm: chr [1:3430] "219.0" "245.0" "226.0" "221.0" ...
##  $ body_mass_g      : chr [1:3430] "5687.0" "6811.0" "5388.0" "6262.0" ...
##  $ sex              : chr [1:3430] "female" "female" "female" "female" ...
##  $ diet             : chr [1:3430] "fish" "fish" "fish" "fish" ...
##  $ life_stage       : chr [1:3430] "adult" "adult" "adult" "adult" ...
##  $ health_metrics   : chr [1:3430] "overweight" "overweight" "overweight" "overweight" ...
##  $ year             : num [1:3430] 2021 2021 2021 2021 2021 ...
# Não estão, então vamos orgaizar

palmerpenguins_extendedc <- palmerpenguins_extended %>%
  mutate(
    bill_length_mm = as.numeric(bill_length_mm),
    bill_depth_mm = as.numeric(bill_depth_mm),
    flipper_length_mm = as.numeric(flipper_length_mm),
    body_mass_g = as.numeric(body_mass_g),
    year = as.numeric(year)  # Adicione outras colunas conforme necessário
  )

Descritiva

summary(palmerpenguins_extendedc)
##    species             island          bill_length_mm  bill_depth_mm  
##  Length:3430        Length:3430        Min.   :13.60   Min.   : 9.10  
##  Class :character   Class :character   1st Qu.:28.90   1st Qu.:16.60  
##  Mode  :character   Mode  :character   Median :34.50   Median :18.40  
##                                        Mean   :38.53   Mean   :18.45  
##                                        3rd Qu.:46.60   3rd Qu.:20.30  
##                                        Max.   :88.20   Max.   :27.90  
##  flipper_length_mm  body_mass_g        sex                diet          
##  Min.   :140       Min.   : 2477   Length:3430        Length:3430       
##  1st Qu.:185       1st Qu.: 3844   Class :character   Class :character  
##  Median :203       Median : 4634   Mode  :character   Mode  :character  
##  Mean   :207       Mean   : 4835                                        
##  3rd Qu.:226       3rd Qu.: 5622                                        
##  Max.   :308       Max.   :10549                                        
##   life_stage        health_metrics          year     
##  Length:3430        Length:3430        Min.   :2021  
##  Class :character   Class :character   1st Qu.:2022  
##  Mode  :character   Mode  :character   Median :2024  
##                                        Mean   :2023  
##                                        3rd Qu.:2024  
##                                        Max.   :2025
  • Power bi

Gráfico de Correlação

# Selecionamos apenas as variáveis numéricas
data_numeric <- palmerpenguins_extendedc[, sapply(palmerpenguins_extendedc, is.numeric)]

# Criar o gráfico de pares
pairs.panels(data_numeric,
             method = "pearson", # Correlação de Pearson
             hist.col = "#00AFBB",
             density = TRUE,  # Adiciona curvas de densidade
             ellipses = TRUE  # Adiciona elipses de confiança
)

  • A variável year mostra que os dados foram coletados de maneira uniforme entre 2021 e 2025. A falta de correlação significativa entre year e as outras variáveis indica que as características físicas dos pinguins medidas no estudo não variaram significativamente durante esses anos. Isso sugere que, ao longo do período de coleta dos dados, não houve mudanças ambientais ou evolutivas que impactassem essas características específicas dos pinguins.

Aplicação do Caret

  • Dividimos os dados em conjuntos de treinamento e teste: 0.8 e 0.2.
set.seed(123)
indice <- createDataPartition(palmerpenguins_extendedc$sex, p = 0.8, list = FALSE)
dados_treino <- palmerpenguins_extendedc[indice, ]
dados_teste <- palmerpenguins_extendedc[-indice, ]
  • Treinamos o modelo de árvore de decisão usando Caret e o método ‘glm’

  • Avaliamos o desempenho do modelo

Matriz de Confusão

confusionMatrix(previsoes, dados_teste$sex)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction female male
##     female    332   25
##     male       13  315
##                                           
##                Accuracy : 0.9445          
##                  95% CI : (0.9246, 0.9604)
##     No Information Rate : 0.5036          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.889           
##                                           
##  Mcnemar's Test P-Value : 0.07435         
##                                           
##             Sensitivity : 0.9623          
##             Specificity : 0.9265          
##          Pos Pred Value : 0.9300          
##          Neg Pred Value : 0.9604          
##              Prevalence : 0.5036          
##          Detection Rate : 0.4847          
##    Detection Prevalence : 0.5212          
##       Balanced Accuracy : 0.9444          
##                                           
##        'Positive' Class : female          
## 

Curva ROC

# Fazer previsões nos dados de teste
previsoes_prob <- predict(modelo, newdata = dados_teste, type = "prob")

# Verificar as previsões
head(previsoes_prob)
##         female         male
## 1 0.9999510137 4.898634e-05
## 2 0.9954516993 4.548301e-03
## 3 0.3991183770 6.008816e-01
## 4 0.0009863929 9.990136e-01
## 5 0.9007233056 9.927669e-02
## 6 0.0063457507 9.936542e-01
# Calcular a curva ROC
roc_obj <- roc(dados_teste$sex, previsoes_prob$male)
## Setting levels: control = female, case = male
## Setting direction: controls < cases
# Plotar a curva ROC
plot(roc_obj, col = "blue", main = "Curva ROC para o Modelo Random Forest")

  • Alta taxa de verdadeiros positivos e uma baixa taxa de falsos positivos. Em outras palavras, o modelo tem uma boa capacidade de discriminar entre as classes positivas e negativas.