Utilizaremos os seguintes pacotes:

pacman::p_load(tidyverse, hrbrthemes, readr, readxl, lubridate, stringr, gridExtra)

Base de Dados

O exercício pede para analisarmos o comportamento do número de bicicletas em circulação durante os dias (segunda a domingo) da segunda semana do mes de julho de 2018.

bike_data <- read_csv(paste0(getwd(),"/Databases/201807-citibike-tripdata.csv"))
## Parsed with column specification:
## cols(
##   tripduration = col_double(),
##   starttime = col_datetime(format = ""),
##   stoptime = col_datetime(format = ""),
##   `start station id` = col_double(),
##   `start station name` = col_character(),
##   `start station latitude` = col_double(),
##   `start station longitude` = col_double(),
##   `end station id` = col_double(),
##   `end station name` = col_character(),
##   `end station latitude` = col_double(),
##   `end station longitude` = col_double(),
##   bikeid = col_double(),
##   usertype = col_character(),
##   `birth year` = col_double(),
##   gender = col_double()
## )
colnames(bike_data) <- make.names(colnames(bike_data)) # coloca nomes mais fáceis de trabalhar

# Filtrar os dados da segunda semana de Julho
bike_data <- bike_data %>% mutate(data_nova = date(starttime))

bike_data_filtrada <- bike_data %>% 
  filter(between(data_nova, as.Date("2018-07-09"), as.Date("2018-07-15")))

glimpse(bike_data_filtrada)
## Observations: 477,435
## Variables: 16
## $ tripduration            <dbl> 656, 387, 1491, 1475, 1431, 240, 780, ...
## $ starttime               <dttm> 2018-07-09 00:18:48, 2018-07-09 00:36...
## $ stoptime                <dttm> 2018-07-09 00:29:44, 2018-07-09 00:43...
## $ start.station.id        <dbl> 72, 72, 72, 72, 72, 72, 72, 72, 72, 72...
## $ start.station.name      <chr> "W 52 St & 11 Ave", "W 52 St & 11 Ave"...
## $ start.station.latitude  <dbl> 40.76727, 40.76727, 40.76727, 40.76727...
## $ start.station.longitude <dbl> -73.99393, -73.99393, -73.99393, -73.9...
## $ end.station.id          <dbl> 359, 529, 3660, 3660, 3660, 478, 446, ...
## $ end.station.name        <chr> "E 47 St & Park Ave", "W 42 St & 8 Ave...
## $ end.station.latitude    <dbl> 40.75510, 40.75757, 40.74102, 40.74102...
## $ end.station.longitude   <dbl> -73.97499, -73.99099, -74.00138, -74.0...
## $ bikeid                  <dbl> 32314, 30982, 19140, 27613, 32709, 300...
## $ usertype                <chr> "Subscriber", "Subscriber", "Customer"...
## $ birth.year              <dbl> 1981, 1988, 1969, 1969, 1969, 1965, 19...
## $ gender                  <dbl> 1, 1, 0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 1,...
## $ data_nova               <date> 2018-07-09, 2018-07-09, 2018-07-09, 2...
## [1] "Temos uma base com 477435 linhas e 16 colunas"

Questão 1

Qual o valor x que coloca abaixo dele 99,5 % das tripdurations? Para as questoes abaixo, desconsidere as entradas cujo valor da variavel tripdurations sao maiores do que x.

x <- quantile(bike_data_filtrada$tripduration, probs = 0.995)

x
## 99.5% 
##  6003
# Filtra a base novamente
bike_data_filtrada <- bike_data_filtrada %>% 
  filter(tripduration <= x)

Questão 2

Apresente em uma tabela o número de bicicletas em circulação no início do dia para cada dia da segunda semana (segunda a domingo), dentro do mes considerado. Explique como voce encontrou estes valores.

# Cria a variável de dia da semana
bike_data_filtrada <- bike_data_filtrada %>% mutate(dia_semana = wday(data_nova, label = TRUE))

bike_data_filtrada %>% 
  filter(between(hour(starttime), 6, 10)) %>% # filtra as horas entre 6 e 10 da manhã (começo do dia)
  group_by(dia_semana) %>% # agrupa por dia da semana
  tally() # conta o número
## # A tibble: 7 x 2
##   dia_semana     n
##   <ord>      <int>
## 1 Sun         6280
## 2 Mon        19193
## 3 Tue        21164
## 4 Wed        20887
## 5 Thu        20644
## 6 Fri        19226
## 7 Sat         9653

Questão 3

Apresente em uma tabela as estatísticas mínimo, Q1, mediana, Q3 e máximo para o número de bicicletas em circulação ao longo da semana.

contagem_bikes <- 
  bike_data_filtrada %>% 
  group_by(dia_semana) %>% 
  tally()

maximo <- max(contagem_bikes$n) # calcula minimo numero de bikes
minimo <- min(contagem_bikes$n) # calcula maximo numero de bikes

estats <- quantile(contagem_bikes$n, probs = c(0.25, 0.5, 0.75)) %>% as.vector() # calcula q1, q2, q3

tibble(
  Minimo = c(minimo),
  Q1 = c(estats[1]),
  Mediana = c(estats[2]),
  Q3 = c(estats[3]),
  Maximo = c(maximo)
)
## # A tibble: 1 x 5
##   Minimo    Q1 Mediana    Q3 Maximo
##    <int> <dbl>   <dbl> <dbl>  <int>
## 1  51905 65886   71782 72520  74549

Questão 4

Apresente em gráficos separados o comportamento da função N(t) = número de bicicletas em circulação, para as 24h de terça e para as 24h de domingo, separados por costumers e subscribers, da segunda semana do mês considerado.

# Cria variável de hora
bike_data_filtrada <- bike_data_filtrada %>% mutate(hora = hour(starttime))

plot1 <- bike_data_filtrada %>% 
  filter(dia_semana == 'Tue') %>% 
  group_by(usertype, hora) %>% 
  tally() %>% 
  ggplot(aes(x = hora, y = n, group = usertype, color = usertype)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Número de Bicicletas em circulação - Terça Feira",
    x = "Hora do Dia",
    y = "# de Bicicletas"
  ) +
  scale_color_manual(values = c("orange", "skyblue")) +
  scale_x_continuous(breaks = seq(from = 0, to = 23, by = 1)) +
  theme_minimal() +
  theme(panel.grid.major = element_blank())

plot2 <- bike_data_filtrada %>% 
  filter(dia_semana == 'Sun') %>% 
  group_by(usertype, hora) %>% 
  tally() %>% 
  ggplot(aes(x = hora, y = n, group = usertype, color = usertype)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Número de Bicicletas em circulação - Domingo",
    x = "Hora do Dia",
    y = "# de Bicicletas"
  ) +
  scale_color_manual(values = c("orange", "skyblue")) +
  scale_x_continuous(breaks = seq(from = 0, to = 23, by = 1)) +
  theme_minimal() +
  theme(panel.grid.major = element_blank())

grid.arrange(plot1, plot2)

Questão 5

Em uma análise primária destes gráficos, você diria que o comportamento da função N(t) = número de bicicletas em circulação é:

  1. homogeneo durante o dia?
  2. homogeneo durante a semana?
  3. similar entre os grupos costumers e subscribers?

Responda as perguntas acima apresentando os gráficos das simulações dos processos homogeneos com taxas igual as taxas médias do que está sendo considerado. Compare estes gráficos com os gráficos da função N(t) (baseada nos dados)

Podemos verificar os gráficos da função N(t) ao longo da semana e do dia pelo seguinte gráfico:

bike_data_filtrada %>% 
  ggplot(aes(x = hora, group = usertype, fill = usertype)) +
  geom_density(alpha = 0.7, show.legend = TRUE, color = "grey30") +
  facet_wrap(~dia_semana, ncol = 1) +
  labs(
    title = "Distribuição do uso de bicicletas ao longo da semana",
    subtitle = "Por tipo de usuário",
    x = "Hora do Dia",
    y = NULL
  ) +
  scale_fill_manual(values = c("orange", "skyblue")) +
  theme_minimal() +
  theme(axis.text.y = element_blank())

Com esse gráfico, vemos claramente que existe um padrão distinto de uso das bicicletas durante os dias úteis da semana. Dessa forma, podemos dividir a análise em duas partes:

Análise de uso das bicicletas em dias úteis

Precisamos verificar se existe um padrão homogêneo de uso por tipo de usuário ao longo da semana (em dias úteis):

bike_data_filtrada %>% 
  filter(!(dia_semana %in% c('Sat', 'Sun'))) %>% 
  ggplot(aes(x = hora, group = usertype, fill = usertype)) +
  geom_density(alpha = 0.7, show.legend = TRUE, color = "grey30") +
  facet_grid(usertype~dia_semana) +
  labs(
    title = "Uso de bicicletas ao longo da semana - Subscribers",
    subtitle = "Por tipo de usuário",
    x = "Hora do Dia",
    y = NULL
  ) +
  scale_fill_manual(values = c("orange", "skyblue")) +
  theme_minimal() +
  theme(axis.text.y = element_blank())

Claramente, os padrões de uso de cada tipo de usuário é bastante similar durante os dias úteis. Vemos um pico de uso durante horários de trajeto casa -> trabalho trabalho -> casa para subscribers. Vemos também um pico de uso durante a tarde para os usuários customers.

Análise de uso das bicicletas durante o final de semana

bike_data_filtrada %>% 
  filter(dia_semana %in% c('Sat', 'Sun')) %>% 
  ggplot(aes(x = hora, group = usertype, fill = usertype)) +
  geom_density(alpha = 0.7, show.legend = TRUE, color = "grey30") +
  facet_grid(usertype~dia_semana) +
  labs(
    title = "Uso de bicicletas ao longo da semana - Subscribers",
    subtitle = "Por tipo de usuário",
    x = "Hora do Dia",
    y = NULL
  ) +
  scale_fill_manual(values = c("orange", "skyblue")) +
  theme_minimal() +
  theme(axis.text.y = element_blank())