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á.
library(tidyverse)
library(here)
library(lubridate)
library(knitr)
library(ggplot2)
library(scales)
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 : 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
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.
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.
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.
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