Objetivo

Usaremos um problema de exploração de dados que a Wikimedia Foundation usou em 2016 para recrutar pessoas para trabalhar no departamento de descoberta deles. Nossa missão é seguir as instruções colocadas na tarefa original, respondendo as 4 perguntas que são colocadas lá.

Importando as bibliotecas

library(tidyverse)
library(here)
library(lubridate)
library(knitr)
library(ggplot2)
library(scales)

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 : Número de ocorrências retornadas para o usuário;

{r} num_clicks : Número 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 analisar os quartis da variável {r} num_clicks

with(dados, tapply(num_clicks, group, summary))
## $a
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.3551  1.0000 36.0000 
## 
## $b
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.1525  0.0000  3.0000

Podemos observar que em média o grupo A tem maior número de clicks que o grupo B. Porém, o número diferente de ocorrências (pesquisas no site de busca) do grupo A e B podem estar enviesando o resultado. Precisamos nos aprofundar na análise.

Na Figura 01 podemos observar a distribuição da quantidade de clicks para cada grupo

dados %>% 
    ggplot(aes(x = group, y = num_clicks)) + 
     geom_jitter(alpha = .4, size = 2)  + labs(y= "Numero de Clicks", x="Grupos", title="Figura 1 - Numero de clicks para os grupos A e B")

Podemos observar que existem mais ocorrências de buscas no grupo A em relação ao grupo B. Uma terceira análise seria avaliar dia após dia o comportamento da variável {r} num_clicks para cada grupo {r} group

dados %>%
    group_by(round_date(date , unit="day"), group) %>%  
    summarise(somatorio = sum(num_clicks)) %>% 
    head()
## # A tibble: 6 x 3
## # Groups:   round_date(date, unit = "day") [3]
##   `round_date(date, unit = "day")` group somatorio
##   <date>                           <chr>     <int>
## 1 2016-03-01                       a          4241
## 2 2016-03-01                       b           513
## 3 2016-03-02                       a          4281
## 4 2016-03-02                       b           565
## 5 2016-03-03                       a          4170
## 6 2016-03-03                       b           580

Como podemos observar, em nossa amostra de três dias (01, 02 e 03 de Março de 2016) sempre o número de clicks do grupo A superou do grupo B.

COnclusão: A média geral de clicks é maior para o grupo A (ver distribuição de quartis). Como o número de ocorrências é maior para este grupo (Ver Figura 1), decidimos analisar por dia o comportamento da variável {r} num_clicks. Finalizamos nossa análise verificando que isoladando os dias, os clicks no grupo A também são maiores que o grupo B.

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

Primeiro vamos analisar os quartis da variável {r} first_click

with(dados, tapply(first_click, group, summary))
## $a
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    1.00    1.00    1.00    2.41    2.00  141.00   48452 
## 
## $b
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   1.000   1.000   1.967   2.000  20.000   27278

Podemos observar que em pesquisas realizadas no grupo B os usuários clicam em resultados mais iniciais (Mean 1.967) em relação as pesquisas do grupo A (Mean 2.41). Para ter mais insumos na análise, vamos analisar a distribuição da variável {r} first_click. OBS: decidimos retirar os outliers, portanto consideramos até a posição 20 do primeiro click.

dados  %>%
  filter(first_click < 20 & !is.na(first_click)) %>%
  ggplot(aes(x = first_click)) +
  geom_bar() + labs(y= "Qaantidade", x="Primeiro click", title="Figura 2 - Comportamento variável First_click")

Podemos observar que na maioria das buscas, o primeiro link é o escolhido como primeiro click pelos usuários. Como isso muda no dia-a-dia?

dados  %>%
  filter(first_click < 20 & !is.na(first_click)) %>%
  arrange(date) %>%
  ggplot(aes(x =  first_click, fill = date )) +
  geom_histogram(binwidth = 2)  +
  facet_grid(~ date) +
  labs(title="Figura 3 - Distribuição por dia", x="Primeiro Clique",  y="Quantidade") + theme_gray()

Conclusão: Podemos observar que em todos dos dias o usuário clica pela primeira vez na maioria das vezes no primeiro link após a busca.

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

Primeiro vamos analisar os quartis da variável {r} results

with(dados, tapply(results, group, summary))
## $a
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    2.00   20.00   13.41   20.00  500.00 
## 
## $b
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    2.00   20.00   12.69   20.00  500.00

Diferente das perguntas anteriores, as informações de quartis não ajuda para análise dessa pergunta.

Vamos plotar um gráfico para analisar melhor os dados.

group_results <- dados %>%
  group_by(group, results) %>%
  summarise(n = n()) %>% 
  mutate(group_results = n / sum(n) * 100) 


group_results  %>% 
  filter(results == 0) %>% 
  ggplot(aes(x = group, y = group_results )) + 
  geom_col(width = .4,  fill = "darkcyan") +
   labs(title="Figura 4 - Distribuição dos resultados das buscas com valor zero",
       x="Grupos",  y="Taxa de resultados zero")

Conclusão: Como podemos observar na Figura 4, o grupo B tem uma quantidade ligeiramente maior nas buscas onde o resultado é zero.

04) 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.

A duração da sessão é representada pela variável {r}session_length, vamos analisar a relação com a variável {r}num_clickspara verificar se em sessões maiores temos também maiores números de clicks.

Vamos analisar as correlaçÕes das variáveis segundo pearson, spearman e kendall:

#cor(session_length, dados$num_clicks,  method = "spearman")
#cor(session_length, dados$num_clicks,  method = "kendall")
#cor(session_length, dados$num_clicks,  method = "pearson")

Usando o teste de Pearson verificamos que o p-value = XXXX, interpretamos esse valor como uma correlação XXXXX