library(tidyverse)
## ── Attaching packages ───────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1 ✔ purrr 0.3.3
## ✔ tibble 2.1.3 ✔ dplyr 0.8.3
## ✔ tidyr 1.0.0 ✔ stringr 1.4.0
## ✔ readr 1.3.1 ✔ forcats 0.4.0
## ── Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(geosphere)
library(dplyr)
data <- read.csv("/local/juninho/people-paths/R/exploratory_analysis/markdown/2017_07_05_full_agg")
#calculando a distância de cada viagem mediante sua latitude e longitude, além de criação de dtata frame contendo as distâncias
dist <- purrr::pmap_df(list(data$from_stop_lon, data$from_stop_lat, data$to_stop_lon, data$to_stop_lat), function(x, y, w, z){tibble::tibble(dist = distHaversine(c(x,y), c(w,z)))})
data_dist <- data %>% bind_cols(dist)
diff_hour <- difftime(data$end_time, data$start_time, units = 'hour')
diff_hour <- diff_hour * 60
data_dist %>% ggplot(aes(x = dist, y = diff_hour)) %>% + geom_point() + theme_classic()
## Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
Podemos ver que o padrão que se segue na relação entre distância das viagens e o tempo decorrido é linear, ou seja, quanto mais longa for a viagem, mais demorada ela tenderá a ser.
data_dist %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(dist_route = mean(dist)) %>% top_n(20) %>% ggplot(aes(x = reorder(route, -dist_route), y = dist_route)) + geom_col() + theme_bw()
## Selecting by dist_route
Como podemos ver, uma rota, a 659, se destaca como sendo aquela, que na média, faz viagens mais longas. Sua média de distância das viagens chega a 9km. Em seguida, temos as rotas 508, 506 e 646, percorrendo, na média, 8km, 7.8km, 7.7km, respectivamente.
data_dist %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(dist_route = mean(dist)) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, dist_route), y = dist_route)) + geom_col() + theme_bw()
## Selecting by dist_route
Como podemos ver existem algumas rotas que, na média, fazem viagens bem curtas. São caracterizadas por isso. A linha 688, a que faz viagens mais curtas, percorre, na média, apenas 688 metros. Em seguida, temos a linha 829, com 774 metros.
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(rotas = length(route)) %>% top_n(20) %>% ggplot(aes(x = reorder(route, -rotas), y = rotas)) + geom_col() + theme_bw()
## Selecting by rotas
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(rotas = length(route)) %>% top_n(20)
## Selecting by rotas
## # A tibble: 20 x 2
## route rotas
## <fct> <int>
## 1 20 2657
## 2 21 2748
## 3 22 4953
## 4 23 4783
## 5 30 3988
## 6 40 4390
## 7 50 3317
## 8 203 18456
## 9 204 4571
## 10 303 11970
## 11 502 4782
## 12 503 11683
## 13 505 4039
## 14 506 3750
## 15 507 3986
## 16 545 2845
## 17 550 4310
## 18 602 8456
## 19 603 5644
## 20 703 3144
Podemos ver que a rota que fez mais viagem durante o dia é a 203, onde 18456 viagens foram feitas pelos passageiros, durante o dia. Em seguida, temos a linha 303 com 11970 e 503 com quase 11683 viagens. A explicação do motivo pelo qual a rota 203 possui o maior número de viagens entre as rotas se deve ao fato de que ela vai dos bairros mais próximos do Centro e populosos até o Centro, sendo uma linha que fica ativa por todo o dia. Veremos que a linha 203 permanece sendo a líder de viagens durante todo o dia, em todos os horários. A rota 303 apresenta seu itinerário indo do Centro as regiões Norte, Sul, Leste e Oeste da cidade, explicando sua popularidade.
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(rotas = length(route)) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, rotas), y = rotas)) + geom_col() + theme_bw()
## Selecting by rotas
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(rotas = length(route)) %>% top_n(-20)
## Selecting by rotas
## # A tibble: 21 x 2
## route rotas
## <fct> <int>
## 1 1 16
## 2 24 21
## 3 181 20
## 4 213 19
## 5 224 1
## 6 311 2
## 7 321 6
## 8 331 7
## 9 343 1
## 10 360 10
## # … with 11 more rows
Podemos ver que as linhas 224, 343, 523 e 912 registraram apenas uma viagem no dia. Em seguida, temos a linha 311 com duas viagens registradas. Certamente, essas rotas não realizaram apenas uma ou duas viagens no dia, alguns dados devem ter sido perdidos.
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(tempo = mean(difftime(end_time, start_time, units = 'hour')) * 60) %>% top_n(10) %>% ggplot(aes(x = reorder(route, -tempo), y = tempo)) + geom_point() + theme_bw()
## Selecting by tempo
## Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(tempo = mean(difftime(end_time, start_time, units = 'hour'))) %>% top_n(20)
## Selecting by tempo
## # A tibble: 20 x 2
## route tempo
## <fct> <drtn>
## 1 270 0.3876880 hours
## 2 271 0.3740346 hours
## 3 272 0.3875343 hours
## 4 370 0.4856618 hours
## 5 393 0.3720760 hours
## 6 506 0.4861665 hours
## 7 508 0.4006196 hours
## 8 594 0.3890545 hours
## 9 617 0.4154614 hours
## 10 646 0.4684223 hours
## 11 655 0.4037947 hours
## 12 659 0.4533727 hours
## 13 670 0.3822607 hours
## 14 671 0.3831361 hours
## 15 680 0.4531742 hours
## 16 681 0.4189407 hours
## 17 684 0.4257698 hours
## 18 703 0.3877077 hours
## 19 761 0.3969642 hours
## 20 762 0.3902135 hours
Podemos ver que as rotas mais demoradas são a 506, com média de viagem de 29.17 minutos, a 370, com 29.14 minutos e a 646 com 28.1 minutos, respectivamente. A rota 506 percorre uma distância que vai do centro da cidade até regiões afastadas localizadas quase fora dos limites da cidade, como o Sítio Cercado. Hauer, Fanny e BR-476 são locais cobertos pela rota. A rota 370 apresenta um padrão parecido com a 506, indo de uma região afastada (Campo Comprido) até a região central.
data %>% mutate(route = as.factor(route)) %>% group_by(route) %>% summarise(tempo = mean(difftime(end_time, start_time, units = 'hour')) * 60) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, tempo), y = tempo)) + geom_point() + theme_bw()
## Selecting by tempo
## Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
Podemos ver que as rotas cujas viagens na média são mais rápidas são a 343, com média de 2.25 minutos, a 912, com média 3.5 minutos e a 311, com média de 4.6 minutos, respectivamente. A pouca distância percorrida pela rota 343 se explica no fato de que seu itinário é muito curto, praticamente cruzando uma parte do Bairro ALto. A linha 912, que não opera aos domingos cruza de forma quase reta a Avenida Manoel Ribas.
data_dist$new_start_time <- format(as.POSIXct(data_dist$start_time), "%H:%M:%S")
data_dist$new_end_time <- format(as.POSIXct(data_dist$end_time), "%H:%M:%S")
new_data_dist <- data_dist[data_dist$new_start_time >= "17:00:00" & data_dist$new_end_time <= "19:00:00",]
perc = nrow(new_data_dist)/nrow(data_dist)
perc
## [1] 0.1633195
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(20) %>% ggplot(aes(x = reorder(route, -quantidade), y = quantidade)) + geom_col() + theme_bw()
## Selecting by quantidade
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(20)
## Selecting by quantidade
## # A tibble: 20 x 2
## route quantidade
## <fct> <int>
## 1 20 506
## 2 21 487
## 3 22 863
## 4 23 965
## 5 30 759
## 6 40 714
## 7 203 3299
## 8 204 500
## 9 216 435
## 10 303 1783
## 11 502 1064
## 12 503 2719
## 13 505 594
## 14 506 449
## 15 507 409
## 16 535 468
## 17 545 516
## 18 550 841
## 19 602 1977
## 20 603 1181
Primeiro, vemos que cerca de 16.3% das viagens realizadas no dia foram feitas no horário entre 17h e 19h. As rotas mais populares nesse horário são as 203, 503 e 602 com 3299, 2719 e 1977 viagens feitas, respectivamente. A 203, como já era esperado, é líder em números de viagens nesse horário por ser em todos os outros. A linha 503, por ser uma linha que liga bairros populares ao Centro aparece como uma razoável alternativa para a volta do Centro para casa nesse horário, já que ela interliga o Centro a praticamente todos os lugares mais populosos do horário de pico pela manhã, fato que é aplicado também a linha 602.
new_data_dist <- data_dist[data_dist$new_start_time >= "17:00:00" & data_dist$new_end_time <= "19:00:00",]
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, quantidade), y = quantidade)) + geom_col() + theme_bw()
## Selecting by quantidade
new_data_dist <- data_dist[data_dist$new_start_time >= "06:30:00" & data_dist$new_end_time <= "08:30:00",]
perc = nrow(new_data_dist)/nrow(data_dist)
perc
## [1] 0.2283019
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(20) %>% ggplot(aes(x = reorder(route, -quantidade), y = quantidade)) + geom_col() +
theme_bw()
## Selecting by quantidade
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(20)
## Selecting by quantidade
## # A tibble: 20 x 2
## route quantidade
## <fct> <int>
## 1 21 636
## 2 22 1187
## 3 23 1136
## 4 30 1063
## 5 40 1117
## 6 50 664
## 7 203 3427
## 8 204 1195
## 9 303 2971
## 10 304 863
## 11 502 898
## 12 503 1589
## 13 505 1090
## 14 506 1277
## 15 507 1107
## 16 508 632
## 17 550 1577
## 18 602 1508
## 19 603 1056
## 20 703 706
Primeiro, vemos que 23% das viagens feitas no dia são feitas nesse período de tempo. As rotas mais populares nesse período são as linhas 203, 303 e 550 com 3427, 2971 e 1589 viagens feitas, respectivamente. A linha 303 aparece, nesse horário, de forma isolada, como a linha mais populosa (depois da 203). Isso deve-se ao fato de que sua linha cruza toda a cidade de leste a oeste. Aqueles que moram em bairros como Mossunguê, Campina do Siqueira, Bigorrilho, Jardim Botânico e Cajuru geralmente trabalham ou estudam na região Central da cidade, pois é no Centro que os principais postos de trabalho e estudo estão. Sendo assim, nesse horário, as pessoas dos seguintes bairros estão indo em direção ao Centro para trabalhar ou estudar. Vemos que a linha 503, outra linha bastante popular nesse horário, também possui a natureza do itinerário similar a do 303. Bairros como Xaxim, Fanny, Hauer e Parolin são ligados ao Centro.
new_data_dist <- data_dist[data_dist$new_start_time >= "06:30:00" & data_dist$new_end_time <= "08:30:00",]
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, quantidade), y = quantidade)) + geom_col() + theme_bw()
## Selecting by quantidade
new_data_dist <- data_dist[data_dist$new_start_time >= "11:00:00" & data_dist$new_end_time <= "13:00:00",]
perc = nrow(new_data_dist)/nrow(data_dist)
perc
## [1] 0.08387775
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(20) %>% ggplot(aes(x = reorder(route, -quantidade), y = quantidade)) + geom_col() + theme_bw()
## Selecting by quantidade
Primeiro, vemos que 8.4% das viagens feitas no dia são nesse intervalo de tempo. As rotas mais populares nesse período são as linhas 203, 303 e 503 com 1657, 1035 e 880 viagens feitas, respectivamente. As rotas mais populares nesse horário seguem o padrão dos demais horários, liderando a 203, tendo a 303 e 602 entre as mais populares. Um destaque fica para a linha 550 que não aparece no top 20 de popularidade, estando nos outros horários de pico integrante do top 10. Isso, possivelmente, deve-se ao fato de que há outras rotas que fazem o trajeto similar ao 550 e levam para os mesmos destinos.
new_data_dist <- data_dist[data_dist$new_start_time >= "11:00:00" & data_dist$new_end_time <= "13:00:00",]
new_data_dist %>% mutate(route = (as.factor(route))) %>% group_by(route) %>% summarise(quantidade = length(route)) %>% top_n(-20) %>% ggplot(aes(x = reorder(route, quantidade), y = quantidade)) + geom_col() + theme_bw()
## Selecting by quantidade
#função que transforma a hora contínua em uma hora discreta. Depois fazer um mutate com o resultado da função e fazer a análise por essa nova variável gerada.
lubridate::hour(lubridate::ymd_hms("2017-07-05 11:02:32"))
## [1] 11
Primeiro, precisamos transformar a hora contínua em um conjunto discreto da mesma. Pegaremos a faixa de horário das 4:30h (quando os õnibus começam a operar pela cidade) até às 0h (quando os ônibus deixam de operar na cidade).
lubridate::hour(lubridate::ymd_hms("2017-07-05 11:02:32"))
## [1] 11
new_data_dist <- data_dist %>% mutate(boarding_time = lubridate::hour(lubridate::ymd_hms(start_time)))
new_data_dist %>% filter(route == "203") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
Podemos ver que o maior número de viagens na linha 203 são nos horários de pico tradicionais (7h as 8h e 17h as 18h). Das 7h as 7:59h há a maior quantidade de viagens na rota, mais de 2500 viagens feitas. Em seguida, temos a faixa das 18h as 18:59h, com cerca de 1800 viagens feitas.
new_data_dist %>% filter(route == "204") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
Podemos ver que o horário onde a rota é mais requisitada é o horário das 6h as 8h. Vemos que durante todo o restante do dia a qauntidade de viagens cai pela metade em alguns horários e até menos que isso. Podemos chegar a conclusão que aqueles que embarcam, pela manhã, na rota 204, voltam aos seus bairros de origem por outras rotas. Podemos chegar a conclusão também de que a rota 204 não se encontra em uma região periférica, já que no início do dia é quando os usuários precisam sair do bairro onde moram para irem até seus trabalhos e estudos.
new_data_dist %>% filter(route == "506") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "550") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "550") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% top_n(20)
## Selecting by quantidade
## # A tibble: 19 x 2
## boarding_time quantidade
## <int> <int>
## 1 5 33
## 2 6 257
## 3 7 1281
## 4 8 483
## 5 9 71
## 6 10 118
## 7 11 91
## 8 12 166
## 9 13 238
## 10 14 157
## 11 15 140
## 12 16 133
## 13 17 381
## 14 18 547
## 15 19 95
## 16 20 30
## 17 21 44
## 18 22 43
## 19 23 2
Podemos ver que o horário das 11h as 13h apresenta uma baixa quantidade de viagens, considerando que esse é um horário de pico. Isso deve-se, provavelmente, ao fato de que nesse horário há outras rotas que fazem o mesmo trajeto que o 550 levando para os principais destinos. Sendo assim, nesse horário, a popularidade da rota é esvaziada, pela ‘concorrência’ com as outras rotas. O fato da rota 550 mostrar grande popularidade no horário das 6h as 8h deve-se ao fato de que, nesse horário, as pessoas estão saindo de seus bairros e indo em direção ao Centro para fazer suas atividade de estudo e trabalho. A rota leva bairros populosos como Capão Raso, Xaxim, Hauer, Parolin ao Centro. Para os horários de 11h as 13h e 17h e 19h há outras rotas que saem do Centro indo em direção a esses bairros citados, por isso, o número de viagens nessa rota diminui consideravelmente.
new_data_dist %>% filter(route == "503") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "503") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% top_n(20)
## Selecting by quantidade
## # A tibble: 19 x 2
## boarding_time quantidade
## <int> <int>
## 1 5 75
## 2 6 395
## 3 7 1181
## 4 8 722
## 5 9 359
## 6 10 350
## 7 11 434
## 8 12 632
## 9 13 620
## 10 14 517
## 11 15 632
## 12 16 706
## 13 17 1259
## 14 18 2047
## 15 19 672
## 16 20 468
## 17 21 386
## 18 22 221
## 19 23 7
A rota 503 apresenta sua popularidade mais elevada no horário das 17h as 18h.
A seguir, analisaremos o comportamento das seguintes rotas: 503, 602, 303, 603, 502, 23, 22, 30, 40, 505, 545, 20, 21, 535 com o propósito de vermos como se dá a distribuição da quantidade de viagens e as horas do dia. Veremos aquelas rotas que são mais populares no pico das 6h as 8h e outras das 17h as 19h. Poderemos, assim, ver quais rotas podem ser condidadatas a substituírem outras nas viagens de determinados horários. Aquelas que demonstram picos das 6h as 8h geralmente possuem outras rota que passam pelos destinos de origem das mesmas, fazendo com que o número das viagens dessa determinada rota caia em outros horários (como das 17h as 19h, por exemplo) em função da substituição das viagens.
Rotas que possuem o pico da quantidade de viagens no horário das 6h as 8h: 303, 22, 30, 40, 505, 21, 23 Rotas que possuem o pico da quantidade de viagens no horário das 17h as 19h: 503, 602, 20, 603, 502 Rotas que possuem o pico da quantidade de viagens nos dois horários: 545, 535
As rotas que possuem o pico da quantidade de viagens nos dois horários são as que possuem mais possibilidades de que os passageiros que a pegam manhã a pegam também na volta para suas casa no horário de pico da noite.
new_data_dist %>% filter(route == "503") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "602") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "303") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "603") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "502") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "23") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "22") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "30") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "40") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "505") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "545") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "20") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "21") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()
new_data_dist %>% filter(route == "535") %>% group_by(boarding_time) %>% summarise(quantidade = length(route)) %>% ggplot(aes(x = boarding_time, y = quantidade)) + geom_col() + theme_bw()