Objetivo

De fato, os dados de acesso a projetos da wikimedia que utilizamos no problema 2 são dados de uma amostra dos usuários, e não da população. Sabendo disso, produza uma versão resumida do relatório que você fez para o Lab 2, CP 4.

Importando as bibliotecas

knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(here)
library(lubridate)
library(knitr)
library(ggplot2)
library(scales)
#library(resample) # <-- Para bootstrap!
library(boot) # <-- Para bootstrap!
theme_set(theme_bw())

Carregando os dados para análise

dados = read_csv(here::here("data/search_data.csv")) %>%
head(100000)

Para facilitar nossa análise, iremos adicionar uma coluna referente a data realizada na pesquisa (excluindo a informação de horas), para isso iremos utilizar a variável nativa do dataset {r} session_start_date

dados <- mutate(dados, date = date(session_start_date))

Tratando os dados

Vamos inicialmente verificar comportamentos indesejados:

  1. Retirar os registros onde o local do primeiro click ({r} first_click) é maior que a quantidade de resultados da busca ({r} results). Ou seja, um comportamento que não deveria acontecer.
trash = dados %>%
  filter(first_click > results )
trash
## # A tibble: 245 x 9
##    session_id    search_index session_start_tim~ session_start_date  group
##    <chr>                <int>              <dbl> <dttm>              <chr>
##  1 012460df6605~            3    20160307172049. 2016-03-07 17:20:49 a    
##  2 0705f6124671~            6    20160308060538. 2016-03-08 06:05:38 a    
##  3 07d1244fb0ec~            5    20160304203229. 2016-03-04 20:32:29 a    
##  4 0c02236a143c~            2    20160304121050. 2016-03-04 12:10:50 a    
##  5 0d050fd8343f~            2    20160305114803. 2016-03-05 11:48:03 a    
##  6 0d6eb81512d8~            3    20160302133910. 2016-03-02 13:39:10 a    
##  7 10541aaefd0e~            3    20160303195601. 2016-03-03 19:56:01 a    
##  8 114e3fa48cc9~            3    20160302191856. 2016-03-02 19:18:56 a    
##  9 114e3fa48cc9~           11    20160302192040. 2016-03-02 19:20:40 a    
## 10 12060c71917f~            1    20160308062556. 2016-03-08 06:25:56 b    
## # ... with 235 more rows, and 4 more variables: results <int>,
## #   num_clicks <int>, first_click <int>, date <date>
  1. Retirar os registros onde houveram clicks ({r} num_clicks > 0), mas não existe registro do primeiro click ({r} first_click). Ou seja, um comportamento que não deveria acontecer.
trash2 =  dados %>%
  filter(num_clicks > 0 & is.na(first_click) )
trash2
## # A tibble: 2 x 9
##   session_id    search_index session_start_time~ session_start_date  group
##   <chr>                <int>               <dbl> <dttm>              <chr>
## 1 1a9459a33812~            1     20160302011149. 2016-03-02 01:11:49 a    
## 2 5caa35c50d2f~            2     20160301010725. 2016-03-01 01:07:25 a    
## # ... with 4 more variables: results <int>, num_clicks <int>,
## #   first_click <int>, date <date>

Agora vamos limpar nosso dataset retirando esses registros indesejados na análise:

dados = dados %>%
  filter((first_click <= results) | (is.na(first_click) & num_clicks == 0))

Variáveis utilizadas na análise

{r} group : Um marcador (“a” ou “b”);

{r} results : Num. de ocorrências retornadas para o usuário;

{r} num_clicks : Num. de ocorrências clicadas pelo usuário;

{r} first_click : Posição da ocorrência que o usuário clicou primeiro.

{r} session_start_date: Data e hora do início da pesquisa.

{r}session_length : Duração da sessão

01) Qual é a taxa de cliques geral diária? Como isso varia entre os grupos?

Primeiro vamos conseguir uma amostra:

```r
amostra = sample_n(dados, 1000)

glimpse(amostra)
```

```
## Observations: 1,000
## Variables: 9
## $ session_id              <chr> "33e7acc4c6d30112", "354e869fc3b6e462"...
## $ search_index            <int> 1, 3, 1, 3, 2, 1, 2, 2, 5, 23, 2, 13, ...
## $ session_start_timestamp <dbl> 2.016031e+13, 2.016030e+13, 2.016030e+...
## $ session_start_date      <dttm> 2016-03-08 12:56:40, 2016-03-04 13:56...
## $ group                   <chr> "b", "a", "b", "a", "a", "a", "b", "a"...
## $ results                 <int> 20, 20, 0, 20, 0, 20, 0, 0, 0, 20, 0, ...
## $ num_clicks              <int> 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,...
## $ first_click             <int> 1, 1, NA, NA, NA, NA, NA, NA, NA, 2, N...
## $ date                    <date> 2016-03-08, 2016-03-04, 2016-03-01, 2...
```

Agora analisar a média para cada um dos grupos:

amostra  %>% 
  group_by(group) %>% 
  summarise_all(funs(mean, median))
## # A tibble: 2 x 17
##   group session_id_mean search_index_mean session_start_timestamp_mean
##   <chr>           <dbl>             <dbl>                        <dbl>
## 1 a                  NA              8.13              20160304428887.
## 2 b                  NA              1.14              20160304732633.
## # ... with 13 more variables: session_start_date_mean <dttm>,
## #   results_mean <dbl>, num_clicks_mean <dbl>, first_click_mean <dbl>,
## #   date_mean <date>, session_id_median <dbl>, search_index_median <dbl>,
## #   session_start_timestamp_median <dbl>,
## #   session_start_date_median <dttm>, results_median <dbl>,
## #   num_clicks_median <dbl>, first_click_median <int>, date_median <date>

Essa diferença entre as médias que observamos na amostra é significativa?

funcao_bootstrap <- function(dado, indices){
    d = dado %>% 
      slice(indices) %>% 
      group_by(group) %>% 
      summarise(media_grupo = mean(num_clicks)) %>% 
      pull(media_grupo)
    
    return(d[1] - d[2])
}

bootstraps <- boot(data = amostra, 
                   statistic = funcao_bootstrap, 
                   R = 2000) # num de bootstraps

glimpse(bootstraps$t)
##  num [1:2000, 1] 0.275 0.23 0.164 0.222 0.216 ...
boot.ci(bootstraps, conf = 0.95, type = "basic")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bootstraps, conf = 0.95, type = "basic")
## 
## Intervals : 
## Level      Basic         
## 95%   ( 0.1432,  0.2925 )  
## Calculations and Intervals on Original Scale

Conclusão: como o intervalo de confiança é positivo, podemos concluir com 95% de confiança que o parâmetro analisado (média do num_clicks) do grupo A é maior que o grupo B. Essa constatação é aderente ao resultado do Lab 2, CP 4.

O que acontece se para a pergunta anterior, em vez de comparar o grupo A com o grupo B (um teste A/B), você compara metade das sessÕes do grupo A (escolhida aleatoriamente) com outra metade das sessÕes do mesmo grupo (um teste A/A)?

Vamos criar duas amostras aleatórias apenas pelos registros do Grupo A:

grupoA1 <- dados %>%
  filter(group == "a")

amostra1 = sample_frac(grupoA1, 0.5, replace = FALSE) %>%
  mutate(grupoA = 1)

amostra2 = sample_frac(grupoA1, 0.5, replace = FALSE) %>%
  mutate(grupoA = 2)

amostras_grupos = bind_rows(amostra1, amostra2)


fun.boot <- function(dado, indices) {
  cliques_group <- dado %>%
  slice(indices) %>%
  group_by(date, grupoA, num_clicks) %>%
  summarise(n = n()) %>% 
  mutate(cliques_group = n / sum(n) * 100) %>%
  ungroup()


taxas_group_a1 <- cliques_group %>% 
  filter(num_clicks > 0, grupoA == 1) %>%
  group_by(date) %>%
  summarise(taxas_cliques_group = sum(cliques_group)) %>%
  pull(taxas_cliques_group)

taxas_group_a2 <- cliques_group %>% 
  filter(num_clicks > 0, grupoA == 2) %>%
  group_by(date) %>%
  summarise(taxas_cliques_group = sum(cliques_group)) %>%
  pull(taxas_cliques_group)
  return(mean(taxas_group_a1) - mean(taxas_group_a2))
}

res.boot <- boot(data = amostras_grupos,  statistic = fun.boot, R = 2000)

boot.ci(boot.out = res.boot, conf = 0.95, type = "basic") 
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = res.boot, conf = 0.95, type = "basic")
## 
## Intervals : 
## Level      Basic         
## 95%   (-0.8579,  0.5350 )  
## Calculations and Intervals on Original Scale

Conclusão: O intervalo de confiança deu intersecção com o zero. Podemos concluir com 95% de confiança, que não há como garantir que existe diferença entre médias das taxas da população.

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

Conclusão: ……….

03) Qual é a taxa de resultados zero no geral? Como isso varia entre os grupos?

fun.boot <- function(dado, indices) {
  taxa_zero <- dado %>%
    slice(indices) %>%
    group_by(group, results) %>%
    summarise(n = n()) %>% 
    mutate(taxa_zero = n / sum(n) * 100)  %>%
    ungroup()
  
  taxa_a <- taxa_zero %>% 
    filter(results == 0, group == "a") %>%
    pull(taxa_zero)
  
  taxa_b <- taxa_zero %>% 
    filter(results == 0, group == "b") %>%
    pull(taxa_zero)
  
  return(taxa_a - taxa_b)
}

res.boot <- boot(data = dados, 
                 statistic = fun.boot, 
                 R = 2000)
boot.ci(boot.out = res.boot, conf = 0.95, type = "basic")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = res.boot, conf = 0.95, type = "basic")
## 
## Intervals : 
## Level      Basic         
## 95%   (-0.8380,  0.2099 )  
## Calculations and Intervals on Original Scale

Conclusão: Como a diferença das médias das taxas gerou um intervalo de confiança que faz interseção com o zero. Podemos concluir com 95% de confiança que não há evidências que exista diferença entre as médias das taxas dos grupos a e b.