Introdução

1.1 Declaração do problema

Prever a duração de corridas de táxi em ambientes urbanos complexos, como a cidade de Nova Iorque, é um desafio com aplicações diretas na logística urbana, precificação dinâmica e satisfação do cliente. A imprevisibilidade do tráfego, condições climáticas e comportamento de passageiros tornam difícil oferecer estimativas confiáveis em tempo real. O objetivo deste projeto é entender os padrões que influenciam a duração das viagens e detectar anomalias — como corridas com durações incoerentes ou localizações inconsistentes — que possam distorcer análises ou indicar comportamentos atípicos.

O interesse nesse problema vem do seu potencial prático e analítico: ele permite explorar aspectos de ciência de dados como limpeza de dados, engenharia de variáveis, análise temporal e espacial, e modelagem supervisionada e não supervisionada. Além disso, anomalias podem sinalizar erros, fraudes ou eventos únicos que são críticos em muitas aplicações reais.

1.2 Abordagem e dados utilizados

Utilizaremos o conjunto de dados da competição “NYC Taxi Trip Duration”, disponível no Kaggle. Esse dataset contém registros detalhados de corridas de táxi realizados em 2016, incluindo atributos como data/hora de início, duração da viagem (em segundos), coordenadas geográficas de origem e destino, número de passageiros e identificadores de empresa de táxi.

Nossa abordagem será estruturada da seguinte forma: - Importação, limpeza e transformação dos dados; - Criação de variáveis derivadas, como: hora do dia, dia da semana, distância geográfica e velocidade média; - Análise exploratória com foco espacial e temporal; - Aplicação de técnicas de detecção de anomalias para identificar corridas incomuns ou inconsistentes; - Construção de modelos preditivos para estimar a duração das corridas.

1.3 Técnica adotada

Além dos modelos clássicos de regressão supervisionada (como Regressão Linear, Árvores de Decisão e XGBoost), será aplicada detecção de anomalias com métodos não supervisionados como: - Análise de outliers por z-score ou IQR; - Algoritmos baseados em densidade, como DBSCAN; - Avaliação visual de dispersões em scatterplots (ex: duração vs. distância, velocidade vs. hora do dia).

Essas técnicas permitirão tanto identificar outliers que prejudiquem a modelagem quanto extrair perfis interessantes e inesperados do comportamento das corridas.

1.4 Impacto da análise

A análise permitirá: - Criar modelos mais robustos ao identificar e tratar outliers; - Melhorar a estimativa de tempo de viagem para usuários e empresas; - Fornecer insights operacionais, como identificar horários com maior risco de desvios anômalos; - Detectar eventos atípicos (como corridas suspeitas ou incoerentes) que podem sinalizar fraudes, erros ou exceções operacionais.

O dataset é especialmente rico para esse tipo de trabalho, pois reúne dados temporais, espaciais, categóricos e numéricos — permitindo uma exploração profunda e significativa, com aplicações em machine learning, estatística e visualização de dados.

Pacotes Requeridos

A seguir, estão listados os pacotes utilizados neste projeto, junto com uma explicação breve sobre o papel de cada um no processo de análise. Embora os pacotes sejam carregados no script, esta seção tem o objetivo de documentar claramente os requisitos para reprodutibilidade do trabalho.

Preparação dos Dados

3.1 Fonte dos dados

Os dados utilizados neste projeto foram obtidos da competição NYC Taxi Trip Duration - Kaggle. O dataset contém registros públicos de corridas de táxi realizadas em Nova Iorque durante o ano de 2016.

3.2 Descrição dos dados

O conjunto de dados utilizado neste projeto tem como propósito original subsidiar a modelagem preditiva da duração das corridas de táxi na cidade de Nova York. Ele foi originalmente disponibilizado pela plataforma Kaggle, no contexto de uma competição realizada em 2016, e contém registros detalhados de corridas de táxi realizadas ao longo do ano de 2016 (período de coleta).

A amostra selecionada para este projeto contém 145.864 registros (linhas), e a versão original da base incluía 11 variáveis principais:

  • id: identificador único da corrida.
  • vendor_id: código da empresa fornecedora do táxi (1 ou 2).
  • pickup_datetime: data e hora da coleta do passageiro.
  • dropoff_datetime: data e hora da finalização da corrida.
  • passenger_count: número de passageiros na corrida.
  • pickup_longitude e pickup_latitude: coordenadas de origem.
  • dropoff_longitude e dropoff_latitude: coordenadas de destino.
  • store_and_fwd_flag: indica se os dados foram armazenados no veículo antes de serem enviados (Y/N).
  • trip_duration: duração da corrida em segundos (variável-alvo).

Peculiaridades do conjunto de dados

Durante a análise exploratória e preparação dos dados, foram identificadas as seguintes peculiaridades:

  • Valores ausentes ou inválidos: embora a maioria das variáveis esteja completa, há registros com contagens de passageiros inválidas (ex.: 0 passageiros) ou coordenadas que não correspondem a pontos geográficos plausíveis (ex.: latitudes/longitudes zeradas ou fora do range da cidade).
  • Outliers extremos na variável trip_duration: foram encontradas corridas com duração de apenas 1 segundo ou mais de 10 horas, o que pode indicar erros de coleta ou registros atípicos.
  • Horários não padronizados: os campos de data e hora estão em formato de texto (string) e requerem transformação para tipos apropriados para análise temporal.
  • Formato do campo store_and_fwd_flag: essa variável categórica aparece como string (‘Y’ ou ‘N’), o que exige tratamento prévio antes de ser usada em modelos preditivos.

Essas características exigiram uma etapa cuidadosa de limpeza, transformação e amostragem para garantir que o conjunto de dados estivesse adequado às análises subsequentes.

3.3 Importação e limpeza dos dados

Para realizar a análise e modelagem das corridas de táxi, foi conduzido um processo estruturado de importação, limpeza e transformação dos dados. Esta etapa teve como objetivo garantir a qualidade, consistência e relevância das informações, eliminando registros inadequados que poderiam distorcer os resultados dos modelos preditivos.

Os dados utilizados foram extraídos de um arquivo .csv contendo informações detalhadas sobre corridas realizadas na cidade de Nova York. A leitura e manipulação das informações foi facilitada pelo uso de pacotes especializados para tratamento de dados e manipulação de datas e variáveis.

Durante a etapa de limpeza, foram definidos critérios específicos para excluir registros que apresentavam inconsistências ou valores atípicos. Foram removidas:

  • Corridas com duração inferior a 1 minuto ou superior a 3 horas, uma vez que esses casos são considerados erros de coleta ou situações não representativas da operação normal dos táxis;
  • Corridas cujas coordenadas geográficas de origem ou destino estavam zeradas, ou seja, iguais a (0,0), indicando provável falha no registro por GPS;
  • Registros com número de passageiros inválido, como zero passageiros ou mais de seis, o que foge do padrão de atendimento dos táxis convencionais.

Além da limpeza, o conjunto de dados foi enriquecido com variáveis derivadas relevantes para análise, tais como:

  • A distância percorrida entre os pontos de embarque e desembarque, estimada por fórmulas geográficas apropriadas que consideram a curvatura da Terra;
  • A velocidade média de cada corrida, calculada com base na distância estimada e no tempo de duração;
  • A hora do dia e o dia da semana em que a corrida foi iniciada, informações extraídas da data e hora de embarque para identificar padrões temporais de comportamento.

Essas etapas garantiram que apenas dados confiáveis e coerentes fossem mantidos no conjunto final, aumentando a robustez da análise e a acurácia dos modelos que seriam aplicados na fase seguinte.

Após a limpeza, o conjunto foi enriquecido com variáveis auxiliares importantes para a análise:

  • A distância em quilômetros entre os pontos de embarque e desembarque foi calculada com base na fórmula de Haversine, que considera a curvatura da Terra;
  • A velocidade média estimada de cada corrida foi derivada da distância e da duração;
  • Também foram extraídas a hora do dia e o dia da semana da corrida, informações úteis para avaliar padrões temporais de demanda e duração.

Essas transformações possibilitaram uma base de dados mais confiável, reduzindo ruídos e inconsistências que poderiam impactar negativamente a performance dos modelos preditivos.

3.4 Visualização do conjunto de dados limpo

Abaixo está uma visualização condensada do conjunto de dados final, limitado a 200 linhas para fins de clareza.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(geosphere)
library(knitr)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
dados <- readr::read_csv("/Users/lucasaraujo/Projects/R_Projects/CPAD/nyc-taxi-trip-duration/train.csv")
## Rows: 1458644 Columns: 11
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (2): id, store_and_fwd_flag
## dbl  (7): vendor_id, passenger_count, pickup_longitude, pickup_latitude, dro...
## dttm (2): pickup_datetime, dropoff_datetime
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
dados <- dados %>%
  mutate(
    trip_duration = as.numeric(difftime(dropoff_datetime, pickup_datetime, units = "secs")),
    distance_km = distHaversine(
      cbind(pickup_longitude, pickup_latitude),
      cbind(dropoff_longitude, dropoff_latitude)
    ) / 1000,
    speed_kmph = distance_km / (trip_duration / 3600)
  )

dados %>%
  select(id, pickup_datetime, passenger_count, trip_duration, distance_km, speed_kmph) %>%
  head(200) %>%
  kable() %>%
  kable_styling(full_width = FALSE)
id pickup_datetime passenger_count trip_duration distance_km speed_kmph
id2875421 2016-03-14 17:24:55 1 455 1.5001995 11.869710
id2377394 2016-06-12 00:43:35 1 663 1.8075298 9.814641
id3858529 2016-01-19 11:35:24 1 2124 6.3922513 10.834324
id3504673 2016-04-06 19:32:31 1 429 1.4871625 12.479686
id2181028 2016-03-26 13:30:55 1 435 1.1899200 9.847613
id0801584 2016-01-30 22:01:40 6 443 1.1001735 8.940462
id1813257 2016-06-17 22:34:59 4 341 1.3277643 14.017453
id1324603 2016-05-21 07:54:58 1 1551 5.7213827 13.279805
id1301050 2016-05-27 23:12:23 1 255 1.3118212 18.519828
id0012891 2016-03-10 21:45:01 1 1225 5.1268985 15.066804
id1436371 2016-05-10 22:08:41 1 1274 3.8104032 10.767230
id1299289 2016-05-15 11:16:11 4 1128 3.7773227 12.055285
id1187965 2016-02-19 09:52:46 2 1114 1.8615661 6.015833
id0799785 2016-06-01 20:58:29 1 260 0.9927958 13.746403
id2900608 2016-05-27 00:43:36 1 1414 6.3899860 16.268706
id3319787 2016-05-16 15:29:02 1 211 0.6573135 11.214828
id3379579 2016-04-11 17:29:50 1 2316 3.4319262 5.334600
id1154431 2016-04-14 08:48:26 1 731 2.5415157 12.516357
id3552682 2016-06-27 09:55:13 1 1317 4.6103600 12.602351
id3390316 2016-06-05 13:47:23 1 251 1.3047312 18.713276
id2070428 2016-02-28 02:23:02 1 486 2.5087334 18.583210
id0809232 2016-04-01 12:12:25 1 652 1.7264820 9.532723
id2352683 2016-04-09 03:34:27 1 423 2.0694005 17.611919
id1603037 2016-06-25 10:36:26 1 1163 4.8802533 15.106545
id3321406 2016-06-03 08:15:05 1 2485 20.6256547 29.880224
id0129640 2016-02-14 13:27:56 1 1283 4.5646327 12.808011
id3587298 2016-02-27 21:56:01 1 1130 6.0628937 19.315414
id2104175 2016-06-20 23:07:16 1 694 3.7429304 19.415777
id3973319 2016-06-13 21:57:27 1 892 2.5276776 10.201389
id1410897 2016-03-23 14:10:39 1 2331 9.9505774 15.367687
id0266980 2016-05-17 10:47:51 1 1479 4.5697066 11.123018
id2822549 2016-05-21 13:03:24 1 1048 5.4291271 18.649673
id3075902 2016-05-10 19:27:38 2 1022 4.5043245 15.866505
id0023813 2016-04-17 14:38:30 1 2269 10.2498541 16.262439
id3970352 2016-01-09 12:55:35 1 707 1.4347050 7.305429
id3361153 2016-03-11 07:11:23 1 526 1.4939083 10.224467
id1870624 2016-01-05 15:29:54 3 553 1.1376650 7.406138
id2403238 2016-06-23 23:00:09 1 277 0.9605102 12.483165
id3323083 2016-05-27 14:26:12 2 1189 3.3161211 10.040400
id3720663 2016-05-10 16:14:56 1 1523 2.5904220 6.123125
id0578558 2016-04-21 21:28:27 2 1450 5.4831821 13.613418
id2573056 2016-04-14 13:27:52 2 1102 2.2388027 7.313693
id2129090 2016-03-14 14:05:39 1 1346 1.9744150 5.280753
id3961107 2016-03-19 01:12:46 1 363 1.1485252 11.390332
id3326491 2016-02-12 07:41:56 1 559 2.2012435 14.176166
id0718344 2016-06-13 15:52:20 1 1478 8.1803566 19.925090
id3188770 2016-01-03 16:59:02 1 348 1.3159194 13.612959
id1956279 2016-02-26 08:37:00 1 375 1.7726931 17.017854
id2391523 2016-05-18 21:50:24 3 1217 5.0737098 15.008509
id2662609 2016-04-10 19:11:03 1 876 3.4809316 14.305198
id2067879 2016-01-19 23:19:01 1 1557 17.3602432 40.139291
id1939961 2016-05-07 13:18:52 1 1647 4.7532816 10.389687
id0675800 2016-02-15 09:25:15 6 634 2.0273415 11.511719
id2569332 2016-04-13 14:24:47 1 365 1.1542083 11.383972
id0526266 2016-05-15 09:42:58 1 819 9.6286109 42.323565
id3827863 2016-04-19 11:29:08 3 3528 3.8501675 3.928742
id1388344 2016-01-02 15:41:11 2 1228 1.5624758 4.580548
id1079955 2016-04-22 11:28:00 1 2607 4.5636362 6.301914
id0256505 2016-03-14 15:04:38 1 695 2.5198670 13.052549
id1530524 2016-03-19 17:41:05 1 472 4.0255040 30.702997
id1674872 2016-02-29 02:46:24 1 526 3.1326524 21.440207
id1040444 2016-01-07 17:01:32 4 721 2.0464611 10.218114
id1674996 2016-05-13 12:32:12 1 512 1.6945387 11.914725
id1965939 2016-05-24 12:16:33 1 720 3.3261667 16.630834
id0442192 2016-04-10 16:07:46 1 174 1.2205858 25.253500
id0515898 2016-05-21 17:38:55 1 478 1.1016367 8.296846
id1182327 2016-02-29 11:22:35 1 788 2.4773736 11.317951
id3913101 2016-06-25 22:05:46 2 1003 13.1258238 47.111631
id1680350 2016-03-18 20:56:16 1 215 0.6253121 10.470342
id0913838 2016-02-03 16:22:50 5 870 2.6052727 10.780439
id3896508 2016-06-07 22:32:32 1 814 5.8385009 25.821380
id2846400 2016-03-16 20:13:12 1 637 1.3528707 7.645737
id1510700 2016-02-20 21:58:13 1 57 0.3287004 20.760025
id0813128 2016-02-20 18:57:43 2 589 1.0752873 6.572214
id1158195 2016-03-24 17:58:51 1 2275 11.2180124 17.751580
id0959273 2016-03-20 23:16:39 1 647 2.8253513 15.720657
id0739660 2016-05-16 13:07:10 3 1628 5.3796343 11.895997
id3769871 2016-06-17 17:32:59 1 2337 4.9193956 7.578016
id1818021 2016-03-23 00:34:10 1 674 4.2280963 22.583304
id0982165 2016-04-12 21:29:16 1 1190 6.4926460 19.641618
id1519515 2016-06-11 12:52:19 1 1191 5.0911457 15.388853
id1082443 2016-02-25 14:56:26 1 785 1.3634640 6.252828
id2934884 2016-01-07 19:32:15 1 520 1.2607153 8.728029
id1205949 2016-06-05 18:43:14 1 218 0.9175598 15.152363
id2592310 2016-06-13 07:20:46 1 222 0.7912175 12.830554
id0883711 2016-01-16 21:22:41 1 1204 4.7550854 14.217863
id0283075 2016-04-06 23:42:26 1 1782 18.7945170 37.968721
id2107497 2016-05-13 20:46:55 2 1174 1.5019894 4.605760
id2090852 2016-01-28 11:25:20 1 336 0.9069032 9.716820
id1297351 2016-06-24 14:24:31 1 470 1.5934134 12.204868
id0667605 2016-05-27 16:17:36 1 346 1.3866304 14.427369
id1476107 2016-05-22 15:41:29 1 419 1.4821387 12.734366
id0673727 2016-05-18 19:15:27 1 1762 9.9955371 20.422210
id2030290 2016-03-31 11:33:30 3 2341 10.2951677 15.831954
id3770790 2016-02-13 13:12:49 1 406 1.4409540 12.776932
id3025098 2016-01-20 19:21:31 1 596 2.2203558 13.411545
id3333094 2016-06-02 23:34:00 1 435 1.4199746 11.751514
id2228940 2016-02-04 13:22:02 1 1108 2.9896337 9.713611
id2102594 2016-03-30 16:14:29 1 2824 16.0255152 20.429127
id0010677 2016-04-29 10:40:34 2 769 1.3074381 6.120647
id3194108 2016-06-01 11:48:41 1 1826 2.7858013 5.492270
id2063827 2016-05-18 21:09:02 1 593 0.9220924 5.597863
id0105610 2016-02-19 20:01:24 3 2065 19.8822987 34.661635
id3502065 2016-03-15 21:03:44 1 653 3.0192890 16.645391
id3508035 2016-06-06 20:13:56 6 1884 19.6120274 37.475212
id3236276 2016-01-27 08:07:32 1 989 2.3585496 8.585216
id3277902 2016-04-09 15:04:31 1 419 2.4578575 21.117630
id2335059 2016-05-27 11:10:32 4 962 1.1931962 4.465183
id2300865 2016-05-10 10:31:22 1 243 0.9847841 14.589394
id3962434 2016-01-10 08:45:31 2 373 1.2249670 11.822738
id2677672 2016-02-18 17:47:39 2 384 1.0471787 9.817300
id0589360 2016-05-22 17:34:08 1 2753 14.0976148 18.434949
id0970832 2016-03-12 20:39:39 1 1561 4.0050314 9.236459
id0694434 2016-01-26 23:40:14 1 505 5.0538767 36.027636
id3729136 2016-01-30 15:15:47 2 900 3.3210886 13.284354
id2358953 2016-06-27 00:31:28 1 2116 27.1930783 46.264216
id0935429 2016-05-02 06:58:06 1 611 2.5513063 15.032247
id3056417 2016-04-11 14:18:21 1 972 1.0608966 3.929247
id1152886 2016-01-21 14:34:06 1 604 1.6742156 9.978768
id1796723 2016-02-09 15:54:53 1 594 1.6336230 9.900745
id0045014 2016-04-20 20:29:42 1 574 2.2135527 13.882909
id2648478 2016-01-18 11:13:59 1 297 0.9827126 11.911668
id0702030 2016-01-07 23:24:44 1 101 0.8426892 30.036448
id3024438 2016-06-10 22:24:37 1 1041 6.3018236 21.793050
id2146569 2016-06-23 22:17:35 1 212 0.6150834 10.444813
id2307151 2016-02-07 18:08:06 1 422 2.4057702 20.523158
id2049424 2016-03-02 20:15:07 1 1356 4.2620531 11.315185
id2209089 2016-02-24 22:56:43 1 416 0.3754779 3.249328
id0391524 2016-04-06 12:14:40 1 1118 1.7871640 5.754732
id2681033 2016-06-17 10:01:39 1 874 2.9176547 12.017800
id2040275 2016-06-16 20:31:09 1 321 2.0886922 23.424585
id0073842 2016-03-30 23:49:41 1 400 1.4262318 12.836087
id3942339 2016-01-05 17:58:04 1 934 1.0630788 4.097520
id2991616 2016-03-19 19:51:34 3 773 1.2728678 5.927974
id1047459 2016-01-22 17:31:53 3 337 1.3384801 14.298304
id1737558 2016-05-18 19:08:31 1 234 1.6680986 25.663055
id2135557 2016-05-25 13:19:56 5 474 2.2376670 16.994940
id0659170 2016-03-26 13:07:08 1 1314 8.1158442 22.235190
id1125774 2016-01-19 22:20:43 2 482 2.9306606 21.888752
id1886740 2016-05-29 00:15:12 1 566 2.8904274 18.384344
id1982306 2016-02-10 21:06:14 2 189 0.8456475 16.107572
id2684106 2016-02-26 20:59:13 2 913 4.5198783 17.822083
id0038484 2016-03-09 13:41:11 2 736 0.7302157 3.571707
id1734208 2016-04-11 10:44:32 6 714 2.8135113 14.185771
id0561467 2016-02-09 06:58:53 1 815 3.4569512 15.269968
id3092788 2016-03-03 22:01:32 2 972 2.2141663 8.200616
id1741519 2016-03-26 14:47:44 1 318 1.1373488 12.875647
id1330402 2016-05-22 18:06:05 1 625 1.9000831 10.944479
id2505596 2016-05-28 22:53:12 1 859 2.3071740 9.669181
id1630509 2016-03-16 05:42:49 2 141 1.5805059 40.353343
id0512853 2016-05-28 17:40:21 1 983 4.5530033 16.674274
id3089912 2016-06-13 13:22:04 2 565 1.3052604 8.316703
id1137965 2016-05-16 15:02:10 1 351 1.1728137 12.028859
id3677225 2016-01-09 15:07:03 1 342 2.4310775 25.590289
id0401226 2016-05-26 06:37:10 4 909 5.0771370 20.107473
id2452605 2016-05-22 22:42:31 1 227 1.4937871 23.690015
id3618302 2016-04-19 09:27:04 6 1078 2.0954375 6.997751
id1552358 2016-04-01 07:55:30 1 900 1.3012538 5.205015
id1168234 2016-02-01 18:02:59 1 631 1.6676255 9.514187
id2910320 2016-04-20 07:33:12 1 1385 8.7245507 22.677533
id3331830 2016-04-12 09:21:27 1 869 0.9388300 3.889284
id0195963 2016-06-19 18:39:05 1 574 1.8227089 11.431624
id0762989 2016-03-17 08:24:27 1 104 0.5012282 17.350206
id2671060 2016-04-07 08:44:32 1 418 1.3370995 11.515689
id3620795 2016-01-01 10:45:24 1 383 1.7206065 16.172803
id2282206 2016-01-04 16:32:42 2 1117 7.0100081 22.592685
id0591292 2016-06-09 18:43:04 1 1447 2.1503952 5.349981
id0906779 2016-04-19 08:31:48 2 2543 13.3467550 18.894344
id2326430 2016-06-10 22:06:53 1 981 9.3224280 34.210745
id3863815 2016-03-14 04:24:36 3 755 2.9081677 13.866760
id3048297 2016-04-06 08:53:11 1 1257 8.6617693 24.806976
id3649509 2016-04-02 14:46:23 2 1221 6.6600649 19.636555
id1783063 2016-04-06 12:24:22 2 940 1.6408089 6.283949
id3363012 2016-04-12 20:22:49 1 126 0.5623428 16.066938
id0514638 2016-02-10 08:36:33 1 350 0.9333386 9.600054
id0627115 2016-02-26 16:10:47 1 737 1.8627681 9.099003
id3141299 2016-01-14 12:25:54 3 690 2.4367191 12.713317
id2003497 2016-04-15 11:58:45 2 671 1.4361068 7.704895
id3748197 2016-02-07 23:17:58 1 463 1.5895422 12.359291
id2983261 2016-04-15 14:41:14 1 367 1.2496724 12.258366
id0485870 2016-06-19 20:23:09 1 369 1.8431997 17.982436
id0835694 2016-01-15 19:25:12 1 402 1.2725104 11.395615
id3426410 2016-02-18 09:27:07 5 1093 7.4755112 24.621995
id3673678 2016-01-31 13:52:55 1 657 2.8091250 15.392466
id2460349 2016-01-07 15:40:34 2 530 1.3070416 8.878018
id3198639 2016-06-05 03:02:46 1 733 5.7066598 28.027251
id1872601 2016-05-31 19:16:05 2 699 1.9798782 10.196797
id0125957 2016-06-14 21:16:43 2 294 2.2355509 27.374093
id3526986 2016-02-23 13:28:59 1 661 1.7885431 9.740931
id3170873 2016-06-30 21:35:27 1 652 1.7513807 9.670200
id1674373 2016-02-15 17:52:27 5 586 4.0856460 25.099532
id2973697 2016-04-07 22:52:23 2 1057 3.5051393 11.938033
id1592044 2016-01-29 11:23:23 1 580 1.3787249 8.557603
id3899813 2016-06-01 20:15:24 5 1151 1.9775453 6.185198
id2075052 2016-04-09 09:09:03 1 660 5.8328532 31.815563
id3707411 2016-01-03 02:03:39 1 803 2.0772423 9.312668
id1608545 2016-04-14 08:31:03 1 1954 4.0634195 7.486341
id3517425 2016-01-16 20:34:06 6 1030 3.4764426 12.150673
id3942917 2016-04-29 14:18:39 4 2817 10.6540829 13.615441
id2000923 2016-03-29 06:07:38 5 85 0.8382142 35.500839

3.5 Sumário das variáveis principais

# Resumo estatístico das variáveis principais
resumo <- dados %>%
  summarise(
    trip_duration_min = min(trip_duration, na.rm = TRUE),
    trip_duration_1Q = quantile(trip_duration, 0.25, na.rm = TRUE),
    trip_duration_median = median(trip_duration, na.rm = TRUE),
    trip_duration_mean = mean(trip_duration, na.rm = TRUE),
    trip_duration_3Q = quantile(trip_duration, 0.75, na.rm = TRUE),
    trip_duration_max = max(trip_duration, na.rm = TRUE),
    
    distance_min = min(distance_km, na.rm = TRUE),
    distance_1Q = quantile(distance_km, 0.25, na.rm = TRUE),
    distance_median = median(distance_km, na.rm = TRUE),
    distance_mean = mean(distance_km, na.rm = TRUE),
    distance_3Q = quantile(distance_km, 0.75, na.rm = TRUE),
    distance_max = max(distance_km, na.rm = TRUE),
    
    speed_min = min(speed_kmph, na.rm = TRUE),
    speed_1Q = quantile(speed_kmph, 0.25, na.rm = TRUE),
    speed_median = median(speed_kmph, na.rm = TRUE),
    speed_mean = mean(speed_kmph, na.rm = TRUE),
    speed_3Q = quantile(speed_kmph, 0.75, na.rm = TRUE),
    speed_max = max(speed_kmph, na.rm = TRUE)
  )

resumo_tabela <- data.frame(
  Variável = c("trip_duration (s)", "distance_km", "speed_kmph"),
  Mínimo = c(resumo$trip_duration_min, resumo$distance_min, resumo$speed_min),
  `1º Quartil` = c(resumo$trip_duration_1Q, resumo$distance_1Q, resumo$speed_1Q),
  Mediana = c(resumo$trip_duration_median, resumo$distance_median, resumo$speed_median),
  Média = c(resumo$trip_duration_mean, resumo$distance_mean, resumo$speed_mean),
  `3º Quartil` = c(resumo$trip_duration_3Q, resumo$distance_3Q, resumo$speed_3Q),
  Máximo = c(resumo$trip_duration_max, resumo$distance_max, resumo$speed_max)
)

kable(resumo_tabela, caption = "Tabela resumo das variáveis principais") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Tabela resumo das variáveis principais
Variável Mínimo X1º.Quartil Mediana Média X3º.Quartil Máximo
trip_duration (s) 1 397.000000 662.000000 959.492273 1075.000000 3526282.000
distance_km 0 1.233216 2.096063 3.444719 3.879679 1242.299
speed_kmph 0 9.131493 12.806309 14.439366 17.864903 9285.227

Análise exploratória dos dados

4.1 Informações nos dados

4.1.1 Distribuição da quantidade de passageiros

A análise exploratória teve início com a inspeção da variável passenger_count, que indica o número de passageiros em cada corrida registrada. A distribuição dessa variável pode revelar padrões importantes sobre o tipo de serviço prestado (ex.: viagens individuais ou compartilhadas).

# Carregar pacotes
library(ggplot2)

# Gráfico de barras com a contagem de passageiros
ggplot(dados, aes(x = factor(passenger_count))) +
  geom_bar(fill = "#0073C2FF") +
  labs(
    title = "Distribuição da quantidade de passageiros por corrida",
    x = "Quantidade de passageiros",
    y = "Frequência"
  ) +
  theme_minimal()

A visualização revela a frequência de corridas com diferentes quantidades de passageiros. É possível observar, por exemplo, se há predominância de viagens individuais ou em grupo, o que pode influenciar a duração e o trajeto das corridas.

4.1.2 Duração das corridas

focamos na variável trip_duration, que representa a duração de cada corrida em segundos. A distribuição dessa variável foi visualizada para identificar padrões de duração típicos, além de detectar possíveis valores extremos ou inconsistências nos dados. Para isso, foi criado um histograma com binagem de 60 segundos, restringindo a visualização até o percentil 99 para minimizar o impacto de valores extremos.

ggplot(dados, aes(x = trip_duration)) +
  geom_histogram(binwidth = 60, fill = "#404080", color = "white") +
  xlim(0, quantile(dados$trip_duration, 0.99)) +  # remover extremos
  labs(
    title = "Distribuição da duração das corridas",
    x = "Duração (segundos)",
    y = "Frequência"
  ) +
  theme_minimal()

4.1.3 Corridas por horário do dia

Para entender o padrão temporal das corridas, foi extraída a hora do dia a partir da variável pickup_datetime, que registra o momento de início de cada corrida. A nova variável horario representa a hora em formato numérico (0 a 23), facilitando a análise da distribuição das corridas ao longo do dia.

O histograma resultante, com binagem de 1 hora, mostra a frequência de corridas por cada hora do dia, permitindo identificar os períodos de maior e menor demanda.

dados <- dados %>% mutate(horario = hour(hms(substr(pickup_datetime, 12, 19))))

ggplot(dados, aes(x = horario)) +
  geom_histogram(binwidth = 1, fill = "#ffa600", color = "black") +
  labs(
    title = "Distribuição de corridas por horário de início",
    x = "Hora do dia",
    y = "Número de corridas"
  ) +
  theme_minimal()

4.1.4 Mapa de densidade de locais de embarque

Para identificar as regiões com maior concentração de embarques, foi realizado um mapa de densidade espacial utilizando as coordenadas de longitude e latitude do ponto de início das corridas (pickup_longitude e pickup_latitude). Para garantir maior precisão e foco na área de interesse, os dados foram filtrados para uma faixa geográfica delimitada.

O gráfico resultante mostra, por meio de uma estimativa de densidade bidimensional, as zonas com maior volume de corridas iniciadas, evidenciando os principais polos de demanda.

dados_filtrados <- subset(dados, 
                          pickup_longitude > -75 & pickup_longitude < -73 & 
                          pickup_latitude > 40 & pickup_latitude < 42)

ggplot(dados_filtrados, aes(x = pickup_longitude, y = pickup_latitude)) +
  stat_density2d(aes(fill = ..level..), geom = "polygon", color = "white", alpha = 0.7) +
  scale_fill_viridis_c() +
  labs(
    title = "Mapa de densidade de locais de embarque",
    x = "Longitude",
    y = "Latitude"
  ) +
  theme_minimal()

4.2

4.3

4.4

4.5

Conclusões

5.1

5.2

5.3

5.4

5.5

Formatação e Outros Requisitos

6.1

6.2

6.3

6.4