Explorando os dados das Sessões, Buscas e Navegação da Wikimedia

No presente relatório é utilizada a exploração de dados do dataset disponibilizado pela Wikimedia Foundation. Nesta atividade buscamos responder duas perguntas por meio dos dados disponibilizados.

Nas seções seguintes são apresentadas as bibliotecas e dados utilizados nas análises, bem como as respostas e análises para as duas perguntas elencadas na atividade.

1. Bibliotecas utilizadas

library(tidyverse)
library(boot)
library(broom)
library(here)
library(lubridate)
library(ggplot2)
library(knitr)
theme_set(theme_bw())

2. Carregando os dados para análise

buscas = read_csv(here::here("data/search_data.csv")) %>%
head(100000) %>%
mutate (clicks = ifelse(num_clicks>0,1,0)) %>%
mutate(is_zero = results == 0)

3. Respostas para as questões

3.1 Qual é a diferença entre o clickthrough rate dos grupos A e B?

- Com teste de hipótese

clicks_rate = buscas %>%
    group_by(session_id, group) %>%
    summarise(click = max(clicks)) %>%
    ungroup()
theta_embaralhado = function(c){
    clicks = c %>%
        mutate(grupo_embaralhado = sample(group, n())) %>%
        group_by(grupo_embaralhado) %>%
        summarise(clickthrough_rate = (sum(click > 0)/n()))
    
    a = clicks %>% filter(grupo_embaralhado == "a") %>% pull(clickthrough_rate)
    b = clicks %>% filter(grupo_embaralhado == "b") %>% pull(clickthrough_rate)
    
    a-b
}
theta_embaralhado(clicks_rate)
[1] -0.002081456
theta_diferenca_grupo = function(d, i){
    clicks = d %>%
        slice(i) %>%
        group_by(group) %>%
        summarise(clickthrough_rate = (sum(click > 0)/n()))
    
    a = clicks %>% filter(group == "a") %>% pull(clickthrough_rate)
    b = clicks %>% filter(group == "b") %>% pull(clickthrough_rate)
    
    a-b
}
theta_diferenca_grupo(clicks_rate, 1:NROW(clicks_rate))
[1] 0.4970487

Gráfico

diffs1 = replicate(5000, {theta_embaralhado(clicks_rate)})
tibble(diferenca = diffs1) %>%
  ggplot(aes(x = diferenca)) +
  # geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_density(fill = "white", color = "darkgreen") +
  geom_vline(xintercept = theta_diferenca_grupo(clicks_rate, 1:NROW(clicks_rate)),
            color = "orange") +
    geom_vline(xintercept = - theta_diferenca_grupo(clicks_rate, 1:NROW(clicks_rate)),
            color = "orange") +
    geom_rug()

P-valor

mean(abs(diffs1) >= abs(theta_diferenca_grupo(clicks_rate, 1:NROW(clicks_rate))))
[1] 0
library(perm)
click_a = clicks_rate %>%
    filter(group == "a") %>%
    mutate(tem_click = as.numeric(click > 0)) %>%
    pull(tem_click)
click_b = clicks_rate %>%
    filter(group == "b") %>%
    mutate(tem_click = as.numeric(click > 0)) %>%
    pull(tem_click)
permTS(click_a, click_b)

    Permutation Test using Asymptotic Approximation

data:  click_a and click_b
Z = 112.4, p-value < 2.2e-16
alternative hypothesis: true mean click_a - mean click_b is not equal to 0
sample estimates:
mean click_a - mean click_b 
                  0.4970487 

- Com intervalo de confiança

clicks_rate %>% 
    boot(statistic = theta_diferenca_grupo, R = 4000) %>% 
    tidy(conf.level = 0.95, 
         conf.int = TRUE)

3.2 Qual é a diferença na proporção buscas com zero resultados nos grupos A e B?

- Com teste de hipótese

results_rate = buscas %>%
    group_by(results, group) %>%
    ungroup()
theta_embaralhado_2 = function(r){
    proportion = r %>%
        mutate(grupo_embaralhado = sample(group, n())) %>%
        group_by(grupo_embaralhado) %>%
        summarise(rate = (sum(is_zero)/n()))
    
    a = proportion %>% filter(grupo_embaralhado == "a") %>% pull(rate)
    b = proportion %>% filter(grupo_embaralhado == "b") %>% pull(rate)
    
    a-b
}
theta_embaralhado_2(results_rate)
[1] 0.0005643033
theta_diferenca_resultados = function(r, i){
    proportion = r %>%
        slice(i) %>%
        group_by(group) %>%
        summarise(rate = (sum(is_zero)/n()))
    
    a = proportion %>% filter(group == "a") %>% pull(rate)
    b = proportion %>% filter(group == "b") %>% pull(rate)
    
    a-b
}
theta_diferenca_resultados(results_rate, 1:NROW(results_rate))
[1] -0.003930332

Gráfico

diffs2 = replicate(5000, {theta_embaralhado_2(results_rate)})
tibble(diferenca = diffs2) %>%
  ggplot(aes(x = diferenca)) +
  # geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_density(fill = "white", color = "darkgreen") +
  geom_vline(xintercept = theta_diferenca_resultados(results_rate, 1:NROW(results_rate)),
            color = "orange") +
    geom_vline(xintercept = - theta_diferenca_resultados(results_rate, 1:NROW(results_rate)),
            color = "orange") +
    geom_rug()

P-valor

mean(abs(diffs2) >= abs(theta_diferenca_resultados(results_rate, 1:NROW(results_rate))))
[1] 0.1338
library(perm)
results_a = results_rate %>%
    filter(group == "a") %>%
    mutate(zero_result = as.numeric(is_zero == 0)) %>%
    pull(zero_result)
results_b = results_rate %>%
    filter(group == "b") %>%
    mutate(zero_result = as.numeric(is_zero == 0)) %>%
    pull(zero_result)
permTS(results_a, results_b)

    Permutation Test using Asymptotic Approximation

data:  results_a and results_b
Z = 1.4922, p-value = 0.1356
alternative hypothesis: true mean results_a - mean results_b is not equal to 0
sample estimates:
mean results_a - mean results_b 
                    0.003930332 

- Com intervalo de confiança

results_rate %>% 
    boot(statistic = theta_diferenca_resultados, R = 4000) %>% 
    tidy(conf.level = 0.95, 
         conf.int = TRUE)
LS0tDQp0aXRsZTogIkZ1bmRhbWVudG9zIGRlIFBlc3F1aXNhIGVtIENpw6puY2lhIGRhIENvbXB1dGHDp8OjbyBJSSINCmF1dGhvcjogIkwzUDUgLSBHw6lzc2ljYSBBbHZlcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiNFeHBsb3JhbmRvIG9zIGRhZG9zIGRhcyBTZXNzw7VlcywgQnVzY2FzIGUgTmF2ZWdhw6fDo28gZGEgV2lraW1lZGlhDQoNCk5vIHByZXNlbnRlIHJlbGF0w7NyaW8gw6kgdXRpbGl6YWRhIGEgZXhwbG9yYcOnw6NvIGRlIGRhZG9zIGRvIGRhdGFzZXQgZGlzcG9uaWJpbGl6YWRvIHBlbGEgV2lraW1lZGlhIEZvdW5kYXRpb24uIE5lc3RhIGF0aXZpZGFkZSBidXNjYW1vcyByZXNwb25kZXIgZHVhcyBwZXJndW50YXMgcG9yIG1laW8gZG9zIGRhZG9zIGRpc3BvbmliaWxpemFkb3MuDQoNCk5hcyBzZcOnw7VlcyBzZWd1aW50ZXMgc8OjbyBhcHJlc2VudGFkYXMgYXMgYmlibGlvdGVjYXMgZSBkYWRvcyB1dGlsaXphZG9zIG5hcyBhbsOhbGlzZXMsIGJlbSBjb21vIGFzIHJlc3Bvc3RhcyBlIGFuw6FsaXNlcyBwYXJhIGFzIGR1YXMgcGVyZ3VudGFzIGVsZW5jYWRhcyBuYSBhdGl2aWRhZGUuIA0KDQojIDEuIEJpYmxpb3RlY2FzIHV0aWxpemFkYXMNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoYm9vdCkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoa25pdHIpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCg0KYGBgDQoNCiMgMi4gQ2FycmVnYW5kbyBvcyBkYWRvcyBwYXJhIGFuw6FsaXNlIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpidXNjYXMgPSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL3NlYXJjaF9kYXRhLmNzdiIpKSAlPiUNCmhlYWQoMTAwMDAwKSAlPiUNCm11dGF0ZSAoY2xpY2tzID0gaWZlbHNlKG51bV9jbGlja3M+MCwxLDApKSAlPiUNCm11dGF0ZShpc196ZXJvID0gcmVzdWx0cyA9PSAwKQ0KDQpgYGANCg0KIyAzLiBSZXNwb3N0YXMgcGFyYSBhcyBxdWVzdMO1ZXMNCg0KIyMjIDMuMSBRdWFsIMOpIGEgZGlmZXJlbsOnYSBlbnRyZSBvIGNsaWNrdGhyb3VnaCByYXRlIGRvcyBncnVwb3MgQSBlIEI/DQoNCiMjIyMgLSBDb20gdGVzdGUgZGUgaGlww7N0ZXNlDQpgYGB7cn0NCmNsaWNrc19yYXRlID0gYnVzY2FzICU+JQ0KCWdyb3VwX2J5KHNlc3Npb25faWQsIGdyb3VwKSAlPiUNCglzdW1tYXJpc2UoY2xpY2sgPSBtYXgoY2xpY2tzKSkgJT4lDQoJdW5ncm91cCgpDQoNCnRoZXRhX2VtYmFyYWxoYWRvID0gZnVuY3Rpb24oYyl7DQoJY2xpY2tzID0gYyAlPiUNCiAgICAJbXV0YXRlKGdydXBvX2VtYmFyYWxoYWRvID0gc2FtcGxlKGdyb3VwLCBuKCkpKSAlPiUNCiAgICAJZ3JvdXBfYnkoZ3J1cG9fZW1iYXJhbGhhZG8pICU+JQ0KICAgIAlzdW1tYXJpc2UoY2xpY2t0aHJvdWdoX3JhdGUgPSAoc3VtKGNsaWNrID4gMCkvbigpKSkNCiAgICANCglhID0gY2xpY2tzICU+JSBmaWx0ZXIoZ3J1cG9fZW1iYXJhbGhhZG8gPT0gImEiKSAlPiUgcHVsbChjbGlja3Rocm91Z2hfcmF0ZSkNCgliID0gY2xpY2tzICU+JSBmaWx0ZXIoZ3J1cG9fZW1iYXJhbGhhZG8gPT0gImIiKSAlPiUgcHVsbChjbGlja3Rocm91Z2hfcmF0ZSkNCiAgICANCglhLWINCn0NCg0KdGhldGFfZW1iYXJhbGhhZG8oY2xpY2tzX3JhdGUpDQpgYGANCg0KYGBge3J9DQoNCnRoZXRhX2RpZmVyZW5jYV9ncnVwbyA9IGZ1bmN0aW9uKGQsIGkpew0KCWNsaWNrcyA9IGQgJT4lDQogICAgCXNsaWNlKGkpICU+JQ0KICAgIAlncm91cF9ieShncm91cCkgJT4lDQogICAgCXN1bW1hcmlzZShjbGlja3Rocm91Z2hfcmF0ZSA9IChzdW0oY2xpY2sgPiAwKS9uKCkpKQ0KICAgIA0KCWEgPSBjbGlja3MgJT4lIGZpbHRlcihncm91cCA9PSAiYSIpICU+JSBwdWxsKGNsaWNrdGhyb3VnaF9yYXRlKQ0KCWIgPSBjbGlja3MgJT4lIGZpbHRlcihncm91cCA9PSAiYiIpICU+JSBwdWxsKGNsaWNrdGhyb3VnaF9yYXRlKQ0KICAgIA0KCWEtYg0KfQ0KdGhldGFfZGlmZXJlbmNhX2dydXBvKGNsaWNrc19yYXRlLCAxOk5ST1coY2xpY2tzX3JhdGUpKQ0KYGBgDQoNCiMjIyMgR3LDoWZpY28NCg0KYGBge3J9DQpkaWZmczEgPSByZXBsaWNhdGUoNTAwMCwge3RoZXRhX2VtYmFyYWxoYWRvKGNsaWNrc19yYXRlKX0pDQoNCnRpYmJsZShkaWZlcmVuY2EgPSBkaWZmczEpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBkaWZlcmVuY2EpKSArDQogICMgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMiwgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImRhcmtncmVlbiIpICsNCglnZW9tX2RlbnNpdHkoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImRhcmtncmVlbiIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhldGFfZGlmZXJlbmNhX2dydXBvKGNsaWNrc19yYXRlLCAxOk5ST1coY2xpY2tzX3JhdGUpKSwNCiAgICAgICAgIAljb2xvciA9ICJvcmFuZ2UiKSArDQoJZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLSB0aGV0YV9kaWZlcmVuY2FfZ3J1cG8oY2xpY2tzX3JhdGUsIDE6TlJPVyhjbGlja3NfcmF0ZSkpLA0KICAgICAgICAgCWNvbG9yID0gIm9yYW5nZSIpICsNCglnZW9tX3J1ZygpDQpgYGANCg0KIyMjIyBQLXZhbG9yDQpgYGB7cn0NCm1lYW4oYWJzKGRpZmZzMSkgPj0gYWJzKHRoZXRhX2RpZmVyZW5jYV9ncnVwbyhjbGlja3NfcmF0ZSwgMTpOUk9XKGNsaWNrc19yYXRlKSkpKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShwZXJtKQ0KDQpjbGlja19hID0gY2xpY2tzX3JhdGUgJT4lDQoJZmlsdGVyKGdyb3VwID09ICJhIikgJT4lDQoJbXV0YXRlKHRlbV9jbGljayA9IGFzLm51bWVyaWMoY2xpY2sgPiAwKSkgJT4lDQoJcHVsbCh0ZW1fY2xpY2spDQoNCmNsaWNrX2IgPSBjbGlja3NfcmF0ZSAlPiUNCglmaWx0ZXIoZ3JvdXAgPT0gImIiKSAlPiUNCgltdXRhdGUodGVtX2NsaWNrID0gYXMubnVtZXJpYyhjbGljayA+IDApKSAlPiUNCglwdWxsKHRlbV9jbGljaykNCg0KcGVybVRTKGNsaWNrX2EsIGNsaWNrX2IpDQoNCmBgYA0KDQojIyMjIC0gQ29tIGludGVydmFsbyBkZSBjb25maWFuw6dhDQoNCmBgYHtyfQ0KY2xpY2tzX3JhdGUgJT4lIA0KICAgIGJvb3Qoc3RhdGlzdGljID0gdGhldGFfZGlmZXJlbmNhX2dydXBvLCBSID0gNDAwMCkgJT4lIA0KICAgIHRpZHkoY29uZi5sZXZlbCA9IDAuOTUsIA0KICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQ0KYGBgDQoNCg0KIyMjIyAzLjIgUXVhbCDDqSBhIGRpZmVyZW7Dp2EgbmEgcHJvcG9yw6fDo28gYnVzY2FzIGNvbSB6ZXJvIHJlc3VsdGFkb3Mgbm9zIGdydXBvcyBBIGUgQj8NCg0KIyMjIyAtIENvbSB0ZXN0ZSBkZSBoaXDDs3Rlc2UNCg0KYGBge3J9DQpyZXN1bHRzX3JhdGUgPSBidXNjYXMgJT4lDQogICAgZ3JvdXBfYnkocmVzdWx0cywgZ3JvdXApICU+JQ0KCXVuZ3JvdXAoKQ0KDQp0aGV0YV9lbWJhcmFsaGFkb18yID0gZnVuY3Rpb24ocil7DQoJcHJvcG9ydGlvbiA9IHIgJT4lDQogICAgCW11dGF0ZShncnVwb19lbWJhcmFsaGFkbyA9IHNhbXBsZShncm91cCwgbigpKSkgJT4lDQogICAgCWdyb3VwX2J5KGdydXBvX2VtYmFyYWxoYWRvKSAlPiUNCiAgICAJc3VtbWFyaXNlKHJhdGUgPSAoc3VtKGlzX3plcm8pL24oKSkpDQogICAgDQoJYSA9IHByb3BvcnRpb24gJT4lIGZpbHRlcihncnVwb19lbWJhcmFsaGFkbyA9PSAiYSIpICU+JSBwdWxsKHJhdGUpDQoJYiA9IHByb3BvcnRpb24gJT4lIGZpbHRlcihncnVwb19lbWJhcmFsaGFkbyA9PSAiYiIpICU+JSBwdWxsKHJhdGUpDQogICAgDQoJYS1iDQp9DQoNCnRoZXRhX2VtYmFyYWxoYWRvXzIocmVzdWx0c19yYXRlKQ0KYGBgDQoNCg0KYGBge3J9DQp0aGV0YV9kaWZlcmVuY2FfcmVzdWx0YWRvcyA9IGZ1bmN0aW9uKHIsIGkpew0KCXByb3BvcnRpb24gPSByICU+JQ0KICAgIAlzbGljZShpKSAlPiUNCiAgICAJZ3JvdXBfYnkoZ3JvdXApICU+JQ0KICAgIAlzdW1tYXJpc2UocmF0ZSA9IChzdW0oaXNfemVybykvbigpKSkNCiAgICANCglhID0gcHJvcG9ydGlvbiAlPiUgZmlsdGVyKGdyb3VwID09ICJhIikgJT4lIHB1bGwocmF0ZSkNCgliID0gcHJvcG9ydGlvbiAlPiUgZmlsdGVyKGdyb3VwID09ICJiIikgJT4lIHB1bGwocmF0ZSkNCiAgICANCglhLWINCn0NCg0KdGhldGFfZGlmZXJlbmNhX3Jlc3VsdGFkb3MocmVzdWx0c19yYXRlLCAxOk5ST1cocmVzdWx0c19yYXRlKSkNCmBgYA0KDQojIyMjIEdyw6FmaWNvDQpgYGB7cn0NCmRpZmZzMiA9IHJlcGxpY2F0ZSg1MDAwLCB7dGhldGFfZW1iYXJhbGhhZG9fMihyZXN1bHRzX3JhdGUpfSkNCg0KdGliYmxlKGRpZmVyZW5jYSA9IGRpZmZzMikgJT4lDQogIGdncGxvdChhZXMoeCA9IGRpZmVyZW5jYSkpICsNCiAgIyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC4yLCBmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KCWdlb21fZGVuc2l0eShmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0aGV0YV9kaWZlcmVuY2FfcmVzdWx0YWRvcyhyZXN1bHRzX3JhdGUsIDE6TlJPVyhyZXN1bHRzX3JhdGUpKSwNCiAgICAgICAgIAljb2xvciA9ICJvcmFuZ2UiKSArDQoJZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLSB0aGV0YV9kaWZlcmVuY2FfcmVzdWx0YWRvcyhyZXN1bHRzX3JhdGUsIDE6TlJPVyhyZXN1bHRzX3JhdGUpKSwNCiAgICAgICAgIAljb2xvciA9ICJvcmFuZ2UiKSArDQoJZ2VvbV9ydWcoKQ0KYGBgDQoNCiMjIyMgUC12YWxvcg0KYGBge3J9DQptZWFuKGFicyhkaWZmczIpID49IGFicyh0aGV0YV9kaWZlcmVuY2FfcmVzdWx0YWRvcyhyZXN1bHRzX3JhdGUsIDE6TlJPVyhyZXN1bHRzX3JhdGUpKSkpDQpgYGANCg0KYGBge3J9DQoNCmxpYnJhcnkocGVybSkNCg0KcmVzdWx0c19hID0gcmVzdWx0c19yYXRlICU+JQ0KCWZpbHRlcihncm91cCA9PSAiYSIpICU+JQ0KCW11dGF0ZSh6ZXJvX3Jlc3VsdCA9IGFzLm51bWVyaWMoaXNfemVybyA9PSAwKSkgJT4lDQoJcHVsbCh6ZXJvX3Jlc3VsdCkNCg0KcmVzdWx0c19iID0gcmVzdWx0c19yYXRlICU+JQ0KCWZpbHRlcihncm91cCA9PSAiYiIpICU+JQ0KCW11dGF0ZSh6ZXJvX3Jlc3VsdCA9IGFzLm51bWVyaWMoaXNfemVybyA9PSAwKSkgJT4lDQoJcHVsbCh6ZXJvX3Jlc3VsdCkNCg0KcGVybVRTKHJlc3VsdHNfYSwgcmVzdWx0c19iKQ0KYGBgDQojIyMjIC0gQ29tIGludGVydmFsbyBkZSBjb25maWFuw6dhDQoNCmBgYHtyfQ0KcmVzdWx0c19yYXRlICU+JSANCiAgICBib290KHN0YXRpc3RpYyA9IHRoZXRhX2RpZmVyZW5jYV9yZXN1bHRhZG9zLCBSID0gNDAwMCkgJT4lIA0KICAgIHRpZHkoY29uZi5sZXZlbCA9IDAuOTUsIA0KICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQ0KYGBgDQoNCg==