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.
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())
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))
Vamos inicialmente verificar comportamentos indesejados:
{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>
{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))
{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
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.
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.
Conclusão: ……….
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.