Introdução

O uso de dados para prever comportamentos futuros tem se tornado uma ferramenta essencial em muitos setores, incluindo o transporte urbano. Neste artigo, exploraremos como a linguagem de programação R pode ser utilizada para prever o compartilhamento de bicicletas, uma atividade comum em muitas cidades ao redor do mundo. Utilizando um conjunto de dados sobre compartilhamento diário de bicicletas, aplicaremos técnicas de ciência de dados para construir e avaliar um modelo preditivo.

Preparação do Ambiente

Começamos configurando o ambiente R para suprimir avisos e mensagens, garantindo uma saída limpa. O pacote pacman é utilizado para carregar dinamicamente as bibliotecas necessárias, facilitando a gestão dos pacotes.

Carregamento dos Dados

Os dados são importados diretamente de um repositório online, usando read_csv do pacote tidyverse. O pré-processamento inclui a conversão de datas e a seleção de variáveis relevantes.

bike_data <- read_csv(file = "https://raw.githubusercontent.com/MicrosoftDocs/ml-basics/master/data/daily-bike-share.csv", show_col_types = FALSE)

bike_data <- bike_data %>%
  mutate(dteday = mdy(dteday)) %>% 
  mutate(day = day(dteday))

head(bike_data)
## # A tibble: 6 × 15
##   instant dteday     season    yr  mnth holiday weekday workingday weathersit
##     <dbl> <date>      <dbl> <dbl> <dbl>   <dbl>   <dbl>      <dbl>      <dbl>
## 1       1 2011-01-01      1     0     1       0       6          0          2
## 2       2 2011-01-02      1     0     1       0       0          0          2
## 3       3 2011-01-03      1     0     1       0       1          1          1
## 4       4 2011-01-04      1     0     1       0       2          1          1
## 5       5 2011-01-05      1     0     1       0       3          1          1
## 6       6 2011-01-06      1     0     1       0       4          1          1
## # ℹ 6 more variables: temp <dbl>, atemp <dbl>, hum <dbl>, windspeed <dbl>,
## #   rentals <dbl>, day <int>

Preparação dos Dados

Após a importação, os dados são preparados para a modelagem. Variáveis categóricas são transformadas em fatores, e os dados são divididos em conjuntos de treinamento e teste. A funcção “initial_split”: Divide os dados em conjuntos de treinamento e teste. Sendo que “training e testing”: Extrai os conjuntos de dados de treinamento e teste da divisão feita anteriormente.

bike_select <- bike_data %>% 
  select(c(season, mnth, holiday, weekday, workingday, weathersit, temp, atemp, hum, windspeed, rentals)) %>% 
  mutate(across(1:6, factor))

set.seed(2056)
bike_split <- initial_split(bike_select, prop = 0.7, strata = holiday)
bike_train <- training(bike_split)
bike_test <- testing(bike_split)

eval_metrics <- metric_set(rmse, mae, rsq)

Modelagem

Utilizamos o xgboost, um algoritmo de boosting, para construir nosso modelo preditivo. O processo inclui a especificação do modelo, treinamento e avaliação. A função “metric_set:” Define um conjunto de métricas para avaliação do modelo. A “boost_tree”: Especifica um modelo de árvore de decisão potencializado (boosted), utilizando o pacote xgboost. A “fit”: Ajusta o modelo aos dados de treinamento, e a “augment”: Adiciona previsões a um conjunto de dados de teste.

boost_spec <- boost_tree() %>% 
  set_engine('xgboost') %>% 
  set_mode('regression')

boost_mod <- boost_spec %>% 
  fit(rentals ~ ., data = bike_train)

boost_mod
## parsnip model object
## 
## ##### xgb.Booster
## raw: 59.4 Kb 
## call:
##   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
##     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
##     subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, 
##     verbose = 0, nthread = 1, objective = "reg:squarederror")
## params (as set within xgb.train):
##   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", nthread = "1", objective = "reg:squarederror", validate_parameters = "TRUE"
## xgb.attributes:
##   niter
## callbacks:
##   cb.evaluation.log()
## # of features: 34 
## niter: 15
## nfeatures : 34 
## evaluation_log:
##      iter training_rmse
##     <num>         <num>
##         1      799.0742
##         2      596.1309
## ---                    
##        14      108.1180
##        15      103.3744

Avaliação do Modelo

A performance do modelo é avaliada comparando as previsões com os dados reais. Métricas como RMSE (Root Mean Squared Error) e R² são utilizadas para quantificar a precisão do modelo.

results <- boost_mod %>% 
  augment(new_data = bike_test) %>% 
  rename(predictions = .pred)

boost_metrics <- eval_metrics(data = results, truth = rentals, estimate = predictions)

boost_metrics
## # A tibble: 3 × 3
##   .metric .estimator .estimate
##   <chr>   <chr>          <dbl>
## 1 rmse    standard     289.   
## 2 mae     standard     208.   
## 3 rsq     standard       0.829

Visualização dos Resultados

Visualizações são criadas para ilustrar a relação entre os valores previstos e os reais, facilitando a interpretação dos resultados do modelo.

boost_plt <- results %>% 
  ggplot(mapping = aes(x = rentals, y = predictions)) +
  geom_point(color = '#4D3161FF') +
  geom_smooth(method = 'lm', color = 'black', se = FALSE) +
  ggtitle("Previsões do Compartilhamento Diário de Bicicletas") +
  xlab("Valores Reais") +
  ylab("Valores Previstos")

boost_plt
## `geom_smooth()` using formula = 'y ~ x'

Conclusão

Este artigo demonstrou como a linguagem de programação R pode ser utilizada para prever o compartilhamento de bicicletas, uma aplicação prática e relevante de ciência de dados. Através da importação de dados, pré-processamento, modelagem, avaliação e visualização, fornecemos um roteiro completo para abordar problemas preditivos semelhantes em diferentes domínios.

Referências

Tidyverse. (2021). Welcome to the tidyverse. https://www.tidyverse.org
Kuhn, M., & Wickham, H. (2020). Tidymodels: Easily install and load the 'Tidymodels' packages. https://www.tidymodels.org
Chen, T., & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining.