Utilizaremos os seguintes pacotes:
pacman::p_load(tidyverse, hrbrthemes, readr, readxl, lubridate, stringr, gridExtra)
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"
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)
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
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
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)
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 é:
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:
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.
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())