Introdução
A Wikimedia Foundation é uma organização sem fins lucrativos que mantém projetos baseados em wiki como a Wikipedia.
Neste relatório, iremos responder algumas perguntas propostas por eles, em um desafio para seleção de analistas de dados:
- Qual é nossa taxa de click geral diária? Como ela varia entre os grupos?
- Qual resultados as pessoas tendem a tentar primeiro? Como ela muda dia a dia?
- Qual é nossa taxa de resultados zerados diária? Como ela varia entre os grupos?
Para responder essas perguntas, utilizaremos os dados fornecidos por eles e modificados pelo professor Nazareno Andrade Como os dados providos pela Wikimedia são apenas uma amostra, utilizaremos bootstrap e intervalo de confiança para inferir sobre a amostra. Nossas análises serão baseadas em um nível de 95% de confiança.
## here() starts at /home/jslucassf/Workspace/lab2-cp4-jslucassf
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:here':
##
## here
## The following object is masked from 'package:base':
##
## date
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:lubridate':
##
## intersect, setdiff, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Parsed with column specification:
## cols(
## session_id = col_character(),
## search_index = col_integer(),
## session_start_timestamp = col_double(),
## session_start_date = col_datetime(format = ""),
## group = col_character(),
## results = col_integer(),
## num_clicks = col_integer(),
## first_click = col_integer()
## )
Definições
Antes de mais nada, é importante para responder as perguntas a seguir, definir dois conceitos.
Taxa de cliques: A proporção de sessões em que o usuário clicou em ao menos um dos resultados. Taxa de resultados zerados: A proporção de sessões com 0 resultados.
Qual é nossa taxa de cliques geral diária? Como ela varia entre os grupos?
Vamos utilizar inferência para calcular a taxa diária.
sessoes <- buscas %>%
group_by(session_id) %>%
summarise(grupo = first(group),
com_clique = sum(num_clicks, na.rm = TRUE) > 0,
data = paste(day(first(session_start_date)), month(first(session_start_date)), year(first(session_start_date)), sep = "/"))
taxa_de_cliques <- function(value, i){
return(sum(value[i])/length(value))
}
cliques_por_dia <- sessoes %>%
group_by(data) %>%
summarise(boot = list(boot(com_clique, taxa_de_cliques, R = 5000)),
ci = list(boot.ci(boot[[1]], conf = 0.95, type = "basic")),
lim_inf = ci[[1]][[4]][4],
lim_sup = ci[[1]][[4]][5]) %>%
select(-c(boot, ci))
cliques_por_dia %>%
ggplot(aes(x = data, ymin = lim_inf, ymax = lim_sup)) +
geom_errorbar(width = .2) +
labs(x = "Data", y = "proporção de cliques por dia")Podemos observar, em geral a taxa diária de cliques é baixa. Assumindo com 95% de confiança, valores entre 0.36 e 0.41. Aparentemente existe pouca diferença entre os dias, uma vez que todos apresentam intervalos muito próximos, entretanto, há diferença entre os grupos?
cliques_por_dia_grupos <- sessoes %>%
group_by(data, grupo) %>%
summarise(boot = list(boot(com_clique, taxa_de_cliques, R = 5000)),
ci = list(boot.ci(boot[[1]], conf = 0.95, type = "basic")),
lim_inf = ci[[1]][[4]][4],
lim_sup = ci[[1]][[4]][5]) %>%
select(-c(boot, ci))
cliques_por_dia_grupos %>%
ggplot(aes(x = data, ymin = lim_inf, ymax = lim_sup, color = grupo)) +
geom_errorbar(width = .2) +
labs(x = "Data", y = "proporção de cliques por dia") A resposta é sim. As sessões do grupo B apresentaram intervalos com valores muito abaixo daquelas do grupo A. Para este, a maioria das sessões resulta em clique com 95% de confiança, uma vez que todos seus intervalos estão acima de 0.6. Já as sessões do grupo B possuem resultados ainda mais baixos, variando entre 0.1 e 0.2.
Que resultados as pessoas tendem a tentar primeiro? Como este resultado muda no dia a dia?
Para responder esta pergunta, iremos estimar a média da população através da amostra que temos disponível.
buscas_com_cliques <- buscas %>%
filter(!is.na(first_click))
media_amostral <- function(value, i){
return(mean(value[i]))
}
# Bootstrap da média
media_cliques_boot <- buscas_com_cliques$first_click %>%
boot(media_amostral, R = 5000)
media_cliques_ci <- boot.ci(media_cliques_boot, conf = 0.95, type = "basic")
media_amostral_cliques <- data.frame(medida = "média",
lim_inf = media_cliques_ci[[4]][[4]],
lim_sup = media_cliques_ci[[4]][[5]])
media_amostral_cliques %>%
ggplot(aes(x = "Intervalo de Confiança", ymin = lim_inf, ymax = lim_sup)) +
geom_errorbar(width = .2) +
labs(y = "Posição média do clique na página")Podemos então afirmar com 95% de confiança, que em média, os usuários clicam primeiro entre o terceiro e o quinto resultado.
Veremos agora se este valor muda ao longo dos dias.
buscas_cliques_por_dia <- buscas_com_cliques %>%
mutate(data = paste(day(session_start_date), month(session_start_date), year(session_start_date), sep = "/")) %>%
group_by(data) %>%
summarise(
boot = list(boot(first_click, media_amostral, R = 5000)),
ci = list(boot.ci(boot[[1]], conf = 0.95, type = "basic")),
lim_inf = ci[[1]][[4]][4],
lim_sup = ci[[1]][[4]][5]) %>%
select(-c(boot, ci))
buscas_cliques_por_dia %>%
ggplot(aes(x = data, ymin = lim_inf, ymax = lim_sup)) +
geom_errorbar(width = .2) +
labs(x = "Data", y = "Primeiro clique médio por dia")Através da visualização, podemos ver que o dia 1/3 se destaca por possuir uma grande variação, neste dia, usuários parecem clicar em páginas que vão da segunda até a décima primeira. Os demais dias, apresentam valores médios muito próximos de 2 com exceção do dia 4/3, que varia entre 6 e 8,5.
Qual é nossa taxa de resultados zerados diária? Como ela varia entre os grupos?
sessoes <- buscas %>%
group_by(session_id) %>%
summarise(grupo = first(group),
sem_resultados = sum(results, na.rm = TRUE) == 0,
data = paste(day(first(session_start_date)), month(first(session_start_date)), year(first(session_start_date)), sep = "/"))
taxa_de_zerados <- function(value, i){
return(sum(value[i])/length(value))
}
zerados_por_dia <- sessoes %>%
group_by(data) %>%
summarise(boot = list(boot(sem_resultados, taxa_de_zerados, R = 5000)),
ci = list(boot.ci(boot[[1]], conf = 0.95, type = "basic")),
lim_inf = ci[[1]][[4]][4],
lim_sup = ci[[1]][[4]][5]) %>%
select(-c(boot, ci))
zerados_por_dia %>%
ggplot(aes(x = data, ymin = lim_inf, ymax = lim_sup)) +
geom_errorbar(width = .2) +
labs(x = "Data", y = "proporção de buscas sem resultados por dia")Aqui vemos, que a taxa de resultados zerada é muito baixa, estimamos com 95% de confiança, que sejam sempre menores que 15% por dia. As diferenças entre os dias não são muito significativas.
zerados_por_dia_grupos <- sessoes %>%
group_by(data, grupo) %>%
summarise(boot = list(boot(sem_resultados, taxa_de_zerados, R = 5000)),
ci = list(boot.ci(boot[[1]], conf = 0.95, type = "basic")),
lim_inf = ci[[1]][[4]][4],
lim_sup = ci[[1]][[4]][5]) %>%
select(-c(boot, ci))
zerados_por_dia_grupos %>%
ggplot(aes(x = data, ymin = lim_inf, ymax = lim_sup, color = grupo)) +
geom_errorbar(width = .2) +
labs(x = "Data", y = "proporção de buscas sem resultados")Assim como aconteceu com a pergunta 1, a diferença de verdade está entre os grupos. O grupo b possui valores muito maiores de pesquisas zeradas, chegando próximo a 20% no dia 5/3. Já o grupo a está em torno de 5% pesquisas sem resultados.