A partir do exercício e da base de dados disponíveis pela Wikimedia nesse link: https://github.com/wikimedia-research/Discovery-Hiring-Analyst-2016 foram feitas análises a fim de responder algumas perguntas.
A base de dados retrata o contexto sobre resultados de buscas e a navegação na Wikimedia. Detalhes sobre a tarefa e os atibutos da base de dados podem ser encontrados aqui: https://github.com/fpcc2-2019/l1p2-Lorenaps.
## ── Attaching packages ────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.0.0 ✔ purrr 0.2.5
## ✔ tibble 1.4.2 ✔ dplyr 0.7.6
## ✔ tidyr 0.8.1 ✔ stringr 1.3.1
## ✔ readr 1.1.1 ✔ forcats 0.3.0
## ── Conflicts ───────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## here() starts at /home/lsp/Projetos/R/l1p2-Lorenaps
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:here':
##
## here
## The following object is masked from 'package:base':
##
## date
## Parsed with column specification:
## cols(
## session_id = col_character(),
## search_index = col_integer(),
## session_length = col_integer(),
## session_start_timestamp = col_double(),
## session_start_date = col_datetime(format = ""),
## group = col_character(),
## results = col_integer(),
## num_clicks = col_integer(),
## first_click = col_integer()
## )
taxa de cliques: a proporção de sessões de pesquisa em que o usuário clicou em um dos resultados exibidos
Para calcular a taxa consideramos = Sessões em que houveram clique (por dia) / Total de sessoes (por dia)
total_busca = buscas %>%
group_by(session_id, day, group) %>%
count() %>%
group_by(session_id, day, group) %>%
count() %>%
group_by(day, group) %>%
count() %>%
rename(total = n)
busca_com_clicks = buscas %>%
filter(num_clicks > 0) %>%
group_by(session_id, day, group) %>%
count() %>%
group_by(session_id, day, group) %>%
count() %>%
group_by(day, group) %>%
count() %>%
rename(parcial = n)
merge_busca = merge(total_busca, busca_com_clicks, by = c("day", "group"))
merge_busca %>%
group_by(day) %>%
summarise(sum_parcial = sum(parcial), sum_total = sum(total)) %>%
mutate(taxa = sum_parcial / sum_total) %>%
ggplot(mapping = aes(x = day, y = taxa)) +
geom_line() +
geom_point() +
ggtitle("Taxa Diária de Clicks") +
labs(x="Dia", y="Taxa de Cliques")
Os dados existentes na base estão no intervalo de tempo de 01 a 09 de Março de 2016. A maior taxa de cliques ocorreu no dia 04 de Março e a menor no dia 02.
merge_busca %>%
group_by(day) %>%
summarise(sum_parcial = sum(parcial), sum_total = sum(total)) %>%
mutate(Taxa = sum_parcial / sum_total) %>%
arrange(Taxa) %>%
rename(Dia = day, "Sessões com click" = sum_parcial, "Total de Sessões" = sum_total)
## # A tibble: 9 x 4
## Dia `Sessões com click` `Total de Sessões` Taxa
## <dttm> <int> <int> <dbl>
## 1 2016-03-02 00:00:00 3505 9256 0.379
## 2 2016-03-09 00:00:00 1660 4304 0.386
## 3 2016-03-07 00:00:00 3311 8554 0.387
## 4 2016-03-03 00:00:00 3568 9214 0.387
## 5 2016-03-01 00:00:00 1424 3677 0.387
## 6 2016-03-06 00:00:00 2695 6946 0.388
## 7 2016-03-08 00:00:00 3730 9563 0.390
## 8 2016-03-05 00:00:00 2890 7385 0.391
## 9 2016-03-04 00:00:00 3615 9121 0.396
Embora o gráfico mostre uma reta fortemente inclinada a taxa encontrada não varia muito, vai de 0.378 a 0.396.
merge_busca %>%
mutate(taxa = parcial / total) %>%
ggplot(mapping = aes(x = day, y = taxa, color=group)) +
geom_line() +
geom_point() +
ggtitle("Taxa Diária de Clicks", subtitle = "Por grupo") +
labs(x="Dia", y="Taxa de Cliques", color = "Grupo")
Na observação anterior vimos que a taxa geral não variava muito. Mas quando detalhamos o dado agrupando pelos grupos de pesquisa presentes na base podemos perceber o quanto o grupo A possui maiores taxas de clicks em comparação com o grupo B.
Na base de dados existe um atributo que representa qual era a posição do link da página visitada no mecanismo de busca de páginas. Agrupando os dados por esse campo temos:
buscas %>%
filter(!is.na(first_click)) %>%
group_by(first_click) %>%
count() %>%
arrange(desc(n)) %>%
rename("Posição na página" = first_click, "Total de registros" = n)
## # A tibble: 189 x 2
## # Groups: Posição na página [189]
## `Posição na página` `Total de registros`
## <int> <int>
## 1 1 21013
## 2 2 4705
## 3 3 2379
## 4 4 1297
## 5 5 820
## 6 6 574
## 7 7 396
## 8 8 270
## 9 9 225
## 10 10 196
## # ... with 179 more rows
É claramente visível que as pessoas interagem mais com o primeiro resultado. Como será que essa preferência se comporta quando olhamos esse dados ao longo do dia?
buscas = buscas %>%
mutate(turno = case_when(hour(session_start_date) >= 0 & hour(session_start_date) < 12 ~ "Manhã",
hour(session_start_date) >= 12 & hour(session_start_date) < 18 ~ "Tarde",
hour(session_start_date) >= 18 & hour(session_start_date) <= 23 ~ "Noite"))
buscas %>%
filter(!is.na(first_click)) %>%
group_by(first_click, turno) %>%
count() %>%
arrange(desc(n)) %>%
rename("Posição na página" = first_click, "Turno" = turno, "Buscas" = n)
## # A tibble: 289 x 3
## # Groups: Posição na página, Turno [289]
## `Posição na página` Turno Buscas
## <int> <chr> <int>
## 1 1 Manhã 8444
## 2 1 Tarde 7190
## 3 1 Noite 5379
## 4 2 Manhã 1934
## 5 2 Tarde 1552
## 6 2 Noite 1219
## 7 3 Manhã 982
## 8 3 Tarde 796
## 9 3 Noite 601
## 10 4 Manhã 529
## # ... with 279 more rows
Observando ao longo do dia elas continuam consumindo mais o primeiro resultado.
buscas %>%
filter(!is.na(first_click)) %>%
group_by(first_click, turno) %>%
count() %>%
ggplot(mapping = aes(x = n, y = first_click)) +
geom_line() +
facet_wrap(.~ turno) +
scale_y_continuous(trans = "log10") +
ggtitle("Interação dos usuários considerando a posição nos resultados de busca", subtitle = "Por turno") +
labs(x="Buscas", y="Posição nos resultados")
Embora a preferência seja claramente o primeiro resultado de busca, com o gráfico acima podemos perceber que na manhã pe o turno onde ocorre uma maior quantidade de pesquisas.
taxa de resultados zero: a proporção de pesquisas que resultaram em 0 resultados
total_results = buscas %>%
group_by(group) %>%
count() %>%
rename(total = n)
zero_results = buscas %>%
filter(results == 0) %>%
group_by(group) %>%
count() %>%
rename(parcial = n)
merge_results = merge(zero_results, total_results, by = c("group"))
merge_results %>%
summarise(sum_parcial = sum(parcial), sum_total = sum(total)) %>%
mutate(Taxa = sum_parcial / sum_total) %>%
rename("Parcial" = sum_parcial, "Total" = sum_total)
## Parcial Total Taxa
## 1 25127 136234 0.18444
Temos uma taxa de 0.18 de 0 resultados.
merge_results %>%
mutate(Taxa = parcial / total) %>%
rename("Parcial" = parcial, "Total" = total, "Grupo" = group)
## Grupo Parcial Total Taxa
## 1 a 16902 92056 0.1836056
## 2 b 8225 44178 0.1861786
Olhando por grupo também não parece ter muita diferença nas taxas de 0 resultados.
duracao = buscas %>%
group_by(session_id, session_length) %>%
summarise(sum_results = sum(results)) %>%
mutate(tempo_em_minutos = session_length / 60)
duracao %>%
ggplot(mapping = aes(x = sum_results, y = tempo_em_minutos)) +
geom_jitter(aes(size = sum_results, alpha=0.4)) +
ggtitle("Relação entre resultados de busca e duração da sessão") +
labs(x="Resultados por sessão", y="Duração por sessão (em minutos)", size = "Resultados") +
guides(alpha = FALSE, color = FALSE)
Nesse gráfico é possível perceber que não existe uma relação direta entre a quantidade de resultados de busca obtidos em uma sessão e o tempo que gasto naquela sessão. É possível considerar essa hipotese se considerarmos que o usuário pode ficar indeciso diante de muitos resultados e isso o leve a passar mais tempo pesquisando ou olhando a lista de resultados. Mas a quantidade de resultados não é determinante porque mesmo com uma lista grande de resultados é possível que os primeiros já atendam a necessidade do usuário, bem como um lista com resultados menores, o que nesse caso pode ter sido influenciado por uma string de busca mais específica e que trouxe resultados de forma mais eficaz.