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()
## )

1º - Qual é a nossa taxa de cliques geral diária? Como isso varia entre os grupos?

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)

Taxa diária

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.

Considerando a taxa diária por grupo

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.

2 - Quais resultados as pessoas tendem a tentar primeiro? Como isso muda no dia-a-dia?

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.

3 - Qual é a nossa taxa de resultados zero no geral? Como isso varia entre os grupos?

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.

4 - A duração da sessão é aproximadamente o tempo entre o primeiro e o último evento de uma sessão. Escolha uma variável do conjunto de dados e descreva sua relação com o tamanho da sessão. Visualize o relacionamento.

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.