dados = read_csv(here::here("data/satisfacoes.csv"), 
                 col_types = "cdcc") 

glimpse(dados)
## Observations: 115
## Variables: 4
## $ user_id      <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", …
## $ satisfaction <dbl> 2.0, 3.0, 1.5, 1.0, 2.0, 2.5, 2.0, 3.0, 2.0, 2.0, 2…
## $ scenario     <chr> "baseline", "baseline", "baseline", "baseline", "ba…
## $ group        <chr> "3", "1", "2", "2", "1", "1", "3", "3", "2", "1", "…

Análise descritiva dos dados

dados %>% ggplot(aes(x = satisfaction)) +
  geom_histogram(binwidth = .2,
                 colour = "red",
                 fill = "white") + 
  facet_wrap(~ scenario) +
  labs(title = "Distribuição das satisfações por mecanismo", x='Satisfação', y='Número de satisfações')

Ao analisarmos a distribuição das satisfações entre os mecanimos vemos que o up/downvoting e combined são os métodos que possuem as melhores avaliações. Os dois mecanismos contem uma boa quantidade de satisfações de nível 5, em relação aos demais, e o up/downvoting aparenta ter a melhor avaliação que todos os outros.

dados %>% 
  group_by(scenario) %>% 
  summarise(media = mean(satisfaction)) %>% 
  ggplot(aes(x = reorder(scenario, media), y = media, color = reorder(scenario, media))) +
  geom_point(
    size = 5, 
    alpha = 0.75
  ) +
  ylim(1,5) +
  scale_color_discrete(name = "Mecanismo") +
  labs(title = "Distribuição das médias das satisfações por mecanismo", x = "Mecanismo", y = "Média das satisfações")

Na visualização acima, observamos a média das satisfações de cada mecanismo e vemos que, o up/downvoting e o combined são os melhores avaliados entre todos os métodos.

Diante disso, iremos utilizar intervalos de confiança e testes de hipóteses para confirmar as conclusões anteriores com confiança.

Intervalos de Confiança

Aqui nós iremos calcular intervalos de confiança, com 95% de confiança, realizando bootstrap por meio da biblioteca boot. Com a finalidade de estimar a média das avaliações de cada mecanismo para podermos avaliar qual o mecanimso teve o melhor desempenho.

theta <- function(d, i) {
    agrupado = d %>% 
        slice(i) %>%
        group_by(scenario) %>% 
        summarise(media = mean(satisfaction))
    b = agrupado %>% filter(scenario == "baseline") %>% pull(media)
    l = agrupado %>% filter(scenario == "like/dislike") %>% pull(media)
    s = agrupado %>% filter(scenario == "skip") %>% pull(media)
    c = agrupado %>% filter(scenario == "combined") %>% pull(media)
    u = agrupado %>% filter(scenario == "up/downvoting") %>% pull(media)
    
    c(b, l, s, c, u)
    
}

theta(dados, i = 1:NROW(dados))
## [1] 2.130435 3.652174 2.521739 4.043478 4.391304
ci = boot(data = dados,
           statistic = theta,
           R = 4000) %>%
    tidy(conf.level = .95,
         conf.method = "bca",
         conf.int = TRUE)

ci$scenario = c("baseline", "like/dislike", "skip", "combined", "up/downvoting")
ci
## # A tibble: 5 x 6
##   statistic      bias std.error conf.low conf.high scenario     
##       <dbl>     <dbl>     <dbl>    <dbl>     <dbl> <chr>        
## 1      2.13  0.000877    0.132      1.86      2.38 baseline     
## 2      3.65  0.00154     0.112      3.43      3.87 like/dislike 
## 3      2.52 -0.00125     0.104      2.30      2.71 skip         
## 4      4.04 -0.000436    0.113      3.81      4.25 combined     
## 5      4.39 -0.000549    0.0937     4.21      4.58 up/downvoting
ci %>% 
    ggplot(aes(x = reorder(scenario, statistic), y = statistic, color = reorder(scenario, statistic))) +
    geom_point(size = 4) +
    geom_errorbar(aes(ymax = conf.high, ymin = conf.low)) +
    scale_color_discrete(name = "Mecanismo") +
    labs(x = "Mecanismo", y = "Média das satisfações",title = "Intervalos de Confiança")

Observando os intervalos de confiança e os valores da estatística theta, podemos afirmar com 95% de confiança que:

Os dois mecanismos mais bem avaliados são up/downvoting e combined, mas, existe uma sobreposição dos intervalos de confiança entre esses métodos. Então seria interessante estimar a diferença da média da satisfação entre eles para saber se ela é significativa ou não. Iremos, também, estimar, com intervalos de confiança, a diferença entre o up/downvoting e todos os outros métodos (skip, baseline e like/dislike) para analisarmos se ele é o mecanismo melhor avaliado entre todos os métodos.

theta_dif<- function(d, i) {
    agrupado = d %>% 
        slice(i) %>%
        group_by(scenario) %>% 
        summarise(media = mean(satisfaction))
    b = agrupado %>% filter(scenario == "baseline") %>% pull(media)
    l = agrupado %>% filter(scenario == "like/dislike") %>% pull(media)
    s = agrupado %>% filter(scenario == "skip") %>% pull(media)
    c = agrupado %>% filter(scenario == "combined") %>% pull(media)
    u = agrupado %>% filter(scenario == "up/downvoting") %>% pull(media)
    
    c(u-b, u-s, u-l, u-c)
    
}

theta_dif(dados, i = 1:NROW(dados))
## [1] 2.2608696 1.8695652 0.7391304 0.3478261
ci_dif = boot(data = dados,
           statistic = theta_dif,
           R = 4000) %>%
    tidy(conf.level = .95,
         conf.method = "bca",
         conf.int = TRUE)

ci_dif$scenario = c("up/downvoting - baseline", " up/downvoting - skip", "up/downvoting - like/dislike", "up/downvoting - combined")
ci_dif
## # A tibble: 4 x 6
##   statistic     bias std.error conf.low conf.high scenario                 
##       <dbl>    <dbl>     <dbl>    <dbl>     <dbl> <chr>                    
## 1     2.26  0.00313      0.165   1.94       2.60  "up/downvoting - baselin…
## 2     1.87  0.00673      0.143   1.61       2.16  " up/downvoting - skip"  
## 3     0.739 0.000978     0.149   0.444      1.05  "up/downvoting - like/di…
## 4     0.348 0.000448     0.146   0.0789     0.647 "up/downvoting - combine…
ci_dif %>% 
    ggplot(aes(x = reorder(scenario, statistic), y = statistic, color = reorder(scenario, statistic))) +
    geom_point(size = 4) +
    geom_errorbar(aes(ymax = conf.high, ymin = conf.low)) +
    scale_color_discrete(name = "Diferença entre mecanismos") +
    scale_x_discrete(labels = c("u/d - c", "u/d - l/d", "u/d - s", "u/d - b")) +
    labs(x = "Mecanismo", y = "Diferença da média das satisfações", title = "Intervalos de Confiança")

Ao analisar os resultados obtidos com intervalos de confiança contruídos com 95% de confiança, observamos que a diferença da média da satisfação entre o up/downvoting e combined é muito pequena (0.3478261, IC[0.06843858, 0.6458333]), então não podemos afirmar que o up/downvoting é melhor que o combined. Com relação ao skip e o baseline, a diferença é bem maior e significativa, com valores de 2.2608696 (IC[1.94254406, 2.5759147]) para o baseline e 1.8695652 (IC[1.61402233, 2.1737755]) para o skip. Então, podemos afirmar que up/downvoting é melhor avaliado que o baseline e o skip. Por fim, em relação ao like/dislike a diferença é de 0.7391304 com IC[0.45011670, 1.0288637], como ela é proxima de 1 então podemos afirmar que a diferença é moderada, e o up/downvoting ainda tem desempenho melhor que o like/dislike.

Testes de Hipóteses

Seguindo o mesmo raciocício dos intervalos de confiança, aqui iremos utilizar testes de hipóteses para estimar a diferença da média da satisfação entre o up/downvoting e todos os outros quatro métodos (baseline, skip, like/dislike).

Será calculado o valor do theta_chapeu, que representa a diferença da média da sastifação entre os mecanismos e logo após será realizada uma reamostragem para calcular as diferenças das médias nos dados. Com base nos valores do theta_chapeu e da distribuição das diferenças nas reamostragens poderemos rejeitar ou não H0.

Nesse caso, nossa H0 (hipótese nula) é se a diferença da média da sastifação entre os mecanismos não é o valor do theta_chapeu e a H1 é se a diferença da média da satisfação entre os mecanismos é o valor de theta_chapeu.

theta_chapeu = {
    satisfacoes = dados %>% 
        group_by(scenario) %>% 
        summarise(satisfacao = mean(satisfaction)) 
    
    like = satisfacoes %>% filter(scenario == "like/dislike") %>% pull(satisfacao)
    baseline = satisfacoes %>% filter(scenario == "baseline") %>% pull(satisfacao)
    skip = satisfacoes %>% filter(scenario == "skip") %>% pull(satisfacao)
    up = satisfacoes %>% filter(scenario == "up/downvoting") %>% pull(satisfacao)
    combined = satisfacoes %>% filter(scenario == "combined") %>% pull(satisfacao)

    
    c(up-combined, up - skip, up - baseline, up - like)
}

theta_chapeu
## [1] 0.3478261 1.8695652 2.2608696 0.7391304
thetas_chapeus <- data.frame("Diferença entre mecanismos" = c("up/downvoting - combined", "up/downvoting - skip", "up/downvoting - baseline", "up/downvoting - like/dislike"), "theta_chapeu" = theta_chapeu)
thetas_chapeus
##     Diferença.entre.mecanismos theta_chapeu
## 1     up/downvoting - combined    0.3478261
## 2         up/downvoting - skip    1.8695652
## 3     up/downvoting - baseline    2.2608696
## 4 up/downvoting - like/dislike    0.7391304

Reamostragem

theta_emb_up_combined = function(d){
    satisfacoes = d %>% 
        mutate(scenario_embaralhado = sample(scenario, n())) %>% 
        group_by(scenario_embaralhado) %>% 
        summarise(satisfacao = mean(satisfaction)) 
    combined = satisfacoes %>% filter(scenario_embaralhado == "combined") %>% pull(satisfacao)
    up = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
    up - combined
}

theta_emb_up_skip= function(d){
    satisfacoes = d %>% 
        mutate(scenario_embaralhado = sample(scenario, n())) %>% 
        group_by(scenario_embaralhado) %>% 
        summarise(satisfacao = mean(satisfaction)) 
    skip = satisfacoes %>% filter(scenario_embaralhado == "skip") %>% pull(satisfacao)
    up = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
    up - combined
}

theta_emb_up_like = function(d){
    satisfacoes = d %>% 
        mutate(scenario_embaralhado = sample(scenario, n())) %>% 
        group_by(scenario_embaralhado) %>% 
        summarise(satisfacao = mean(satisfaction)) 
    like = satisfacoes %>% filter(scenario_embaralhado == "like/dislike") %>% pull(satisfacao)
    up = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
    up - like
}

theta_emb_up_baseline = function(d){
    satisfacoes = d %>% 
        mutate(scenario_embaralhado = sample(scenario, n())) %>% 
        group_by(scenario_embaralhado) %>% 
        summarise(satisfacao = mean(satisfaction)) 
    baseline = satisfacoes %>% filter(scenario_embaralhado == "baseline") %>% pull(satisfacao)
    up = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
    up - baseline
}
diffs_up_combined = replicate(4000, {theta_emb_up_combined(dados)})
diffs_up_skip = replicate(4000, {theta_emb_up_skip(dados)})
diffs_up_like = replicate(4000, {theta_emb_up_like(dados)})
diffs_up_baseline = replicate(4000, {theta_emb_up_baseline(dados)})

Análise dos testes de hipóteses

p1 <- tibble(diferenca = diffs_up_combined) %>% 
    ggplot(aes(x = diferenca)) + 
    geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_vline(xintercept = theta_chapeu[1], color = "orange") + 
    geom_vline(xintercept = -theta_chapeu[1], color = "orange") +
    labs(title = "Up/Downvoting - Combined")

p2 <- tibble(diferenca = diffs_up_skip) %>% 
    ggplot(aes(x = diferenca)) + 
    geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_vline(xintercept = theta_chapeu[2], color = "orange") + 
    geom_vline(xintercept = -theta_chapeu[2], color = "orange") +
    labs(title = "Up/Downvoting - Skip")

p3 <- tibble(diferenca = diffs_up_like) %>%
    ggplot(aes(x = diferenca)) +
    geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_vline(xintercept = theta_chapeu[4], color = "orange") + 
    geom_vline(xintercept = -theta_chapeu[4], color = "orange") +
    labs(title = "Up/Downvoting - Like/Dislike")

p4 <- tibble(diferenca = diffs_up_baseline) %>% 
    ggplot(aes(x = diferenca)) + 
    geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
    geom_vline(xintercept = theta_chapeu[3], color = "orange") + 
    geom_vline(xintercept = -theta_chapeu[3], color = "orange") +
    labs(title = "Up/Downvoting - Baseline")

grid.arrange(p1, p2, p3,p4)

Analisando as visualizações acima, podemos ver que a diferença entre up/downvoting e combined, o valor do theta_chapeu, está dentro da distribuição das diferenças da população, então, não podemos rejeitar H0. Dessa forma, não podemos afirmar que existe uma diferença significativa entre esses mecanismos, pois não sabemos ao certo qual o valor dessa diferença. Vemos também que a diferença entre o up/downvoting e baseline está fora da distribuição das diferenças, então, rejeitamos H0 e não rejeitamos H1. O mesmo ocorre com o like/dislike. Isso significa que existe uma diferença significativa entre o up/downvoting e o baseline e entre o up/downvoting e o like/dislike. Ao analisarmos a diferença entre o up/downvoting e skip, observamos que a diferença está dentro da distribuição, portanto, não rejeitamos H0 e não podemos afirmar que existe uma diferença significativa entre esses mecanismos.

Com relação ao dois procedimentos realizados acima, analisamos quem em ambos, IC e Testes de Hipóteses, existe uma diferença significativa entre os mecanismos up/downvoting e baseline e entre up/downvoting e like/dislike. Em relação a diferença entre o up/downvoting e o skip e entre o up/downvoting e o combined, não conseguimos confirmar se ela é significativa através do teste de hipótese. Porém, no intervalo de confiança, vimos com 95% de confiança que a diferença entre o up/downvoting e o skip é próximo de 1, e consideramos ela como sendo moderada, e entre o up/downvoting e o combined ela é muito pequena. Por fim, concluímos que o up/downvoting e combined são os mecanismos que tem as melhores satisfações.