O objeto principal da análise são as buscas e a navegação depois da busca. Criamos esses dados a partir dos dados originais da wikimedia em /data/search_data.csv.

Aqui, exploramos esses dados.

library(tidyverse)
library(here)
library(scales)
library(lubridate)
library(ggstance)
library(broom)
library(ggpubr)
library(reshape2)
theme_set(theme_bw())
buscas = read_csv(here::here("data/search_data.csv")) %>% 
    mutate(session_date = stamp("1 Jan, 1999")(date(session_start_date))) %>% 
    rename(session_datetime = session_start_date,
           session_timestamp = session_start_timestamp) %>%
    mutate(session_result = ifelse(results == 0, "zero results", ifelse(num_clicks > 0, "clickthrough", "no clicks")))

A partir das informações do wikimedia-research, vemos que a empresa se interessa pelas métricas:

Podemos separar cada sessão e classificar da maneira acima: “clickthrough” e “zero results”, além de um “no clicks” que corresponde a sessões com algum resultado, mas o usuário não clicou em nenhum deles. A distribuição entre as sessões desses tipos segue abaixo.

hpRst = buscas %>% ggplot(aes(x = session_result)) +
       geom_histogram(stat = "count")
## Warning: Ignoring unknown parameters: binwidth, bins, pad
lhpRst = buscas %>% ggplot(aes(x = session_result)) +
       geom_histogram(stat = "count") + scale_y_log10()
## Warning: Ignoring unknown parameters: binwidth, bins, pad
vpRst = buscas %>% ggplot(aes(y = session_datetime, x = session_result)) +
       geom_point() + geom_violin(scale = "count") +
       scale_y_datetime(date_labels = "%b %d %H:%M", date_breaks = "12 hour")

ggarrange(ggarrange(hpRst, lhpRst),
          vpRst, ncol = 1)

Há mais sessões “clickthrough” do que “zero results”, por uma margem pequena. A grande da maioria das sessões cai no caso de “no clicks”. Se analisarmos as proporções ao longo dos dias dos dois eventos, temos:

buscasDiarias = buscas %>% group_by(session_date) %>%
    summarise(clickthrough_rate = sum(session_result == "clickthrough")/n(),
              zero_results_rate = sum(session_result == "zero results")/n())

lpRt = buscasDiarias %>% melt(id = "session_date") %>% ggplot(aes(x = session_date, y = value, color = variable, group = variable)) + 
    geom_line()
lpRt

Podemos ver que quase 1/5 das buscas, tendem a gerar 0 resultados, enquanto que em quase 1/4 das buscas o usuário clica em um dos resultados.

Observando os primeiros clicks, separei uma análise da média diária, mediana e 3º Quartil dos dados diários.

primeirosClicks = buscas %>% filter(session_result == "clickthrough") %>%
    filter(!is.na(first_click)) %>%
    group_by(session_date) %>%
    summarise(mean_first_click = mean(first_click),
              median_first_click = median(first_click),
              thQ_first_click = quantile(first_click, c(0.75), type = 1))

primeirosClicks

Podemos ver que os primeiros resultados são os primeiros clicks em até 75% dos casos. A média alta em alguns dos dias comprova que há exceções com clicks distantes, aumentando a média.