dados = read_csv(here::here("data/satisfacoes.csv"),
col_types = "cdcc")
dados %>%
glimpse()
## Observations: 115
## Variables: 4
## $ user_id <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",…
## $ satisfaction <dbl> 2.0, 3.0, 1.5, 1.0, 2.0, 2.5, 2.0, 3.0, 2.0, 2.0, 2.0, 2…
## $ scenario <chr> "baseline", "baseline", "baseline", "baseline", "baselin…
## $ group <chr> "3", "1", "2", "2", "1", "1", "3", "3", "2", "1", "3", "…
A nossa avaliação incluirá os métodos up/downvoting, baseline e like/dislike
Ao longo deste relatório empregaremos um nível de confiança de 95%, e consequentemente um alpha de 0.05
A satisfação segue uma escala likert de 5 pontos:
No contexto desta escala e tomando como referências os trabalhos de D. Dodou et. al e C. Wu. et. al sobre likert scale mencionados no paper abordado neste relatório iremos considerar:
comparacao1 = dados %>%
filter(scenario %in% c("baseline", "like/dislike"))
theta_chapeu = {
satisfacoes = comparacao1 %>%
group_by(scenario) %>%
summarise(satisfacao = mean(satisfaction))
like = satisfacoes %>% filter(scenario == "like/dislike") %>% pull(satisfacao)
baseline = satisfacoes %>% filter(scenario == "baseline") %>% pull(satisfacao)
like - baseline
}
theta_chapeu
## [1] 1.521739
A diferença observada na amostra entre a satisfação média para o método like/dislike e o método baseline é de aproximadamente 1.52.
Na diferença observada na amostra o método like/dislike gerou uma satisfação aproximadamente 1.52 pontos maior.
theta_emb = 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)
baseline = satisfacoes %>% filter(scenario_embaralhado == "baseline") %>% pull(satisfacao)
like - baseline
}
theta_emb(comparacao1)
## [1] 0
diffs = replicate(4000, {theta_emb(dados)})
tibble(diferenca = diffs) %>%
ggplot(aes(x = diferenca)) +
geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
# geom_density(fill = "white", color = "darkgreen") +
geom_vline(xintercept = theta_chapeu,
color = "orange") +
geom_vline(xintercept = -theta_chapeu,
color = "orange")
Agora vejamos o quão frequente seria encontrarmos uma diferença do tamanho que encontramos se não houvesse diferença entre a satisfação média para o método like/dislike e o método baseline
A situação onde não existe diferença é a hipótese nula. Se a diferença que observamos em nossa amostra acontece facilmente na hipótese nula, isso significa que não temos evidência forte de associação: o que observamos acontece também quando não há associação.
No caso onde a diferença que observamos é improvável na hipótese nula, então observamos algo que é indicativo de diferença. Repare que é uma dupla negação: se não acontece associação como a que vimos na amostra na situação onde não há associação, então temos evidência de que há associação.
# p-valor
pvalue = sum(abs(diffs) >= abs(theta_chapeu)) / length(diffs)
print(paste("O p-valor é aproximadamente: ",pvalue))
## [1] "O p-valor é aproximadamente: 0"
Avaliemos agora se um dos métodos teve melhor desempenho através de one tail test:
Testemos se:
A satisfação média para o método baseline não é significativamente maior que a satisfação média para o método like/dislike (Hipótese nula)
A satisfação média para o método baseline é significativamente maior que a satisfação média para o método like/dislike (Hipótese alternativa)
permutationTest2(data=comparacao1,
R=4000,
alternative = "greater",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao1, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "greater")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean Alternative
## mean(satisfaction): baseline-like/dislike -1.521739 0.002684783 greater
## PValue
## mean(satisfaction): baseline-like/dislike 1
Testemos se:
A satisfação média para o método baseline não é significativamente menor que a satisfação média para o método like/dislike (Hipótese nula)
A satisfação média para o método baseline é significativamente menor que a satisfação média para o método like/dislike (Hipótese alternativa)
permutationTest2(data=comparacao1,
R=4000,
alternative = "less",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao1, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "less")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean Alternative
## mean(satisfaction): baseline-like/dislike -1.521739 0.001282609 less
## PValue
## mean(satisfaction): baseline-like/dislike 0.0002499375
Conseguimos estabelecer que a satisfação média para baseline é significativamente menor do que para like/dislike.
comparacao2 = dados %>%
filter(scenario %in% c("baseline", "up/downvoting"))
theta_chapeu = {
satisfacoes = comparacao2 %>%
group_by(scenario) %>%
summarise(satisfacao = mean(satisfaction))
like = satisfacoes %>% filter(scenario == "up/downvoting") %>% pull(satisfacao)
baseline = satisfacoes %>% filter(scenario == "baseline") %>% pull(satisfacao)
like - baseline
}
theta_chapeu
## [1] 2.26087
theta_emb = function(d){
satisfacoes = d %>%
mutate(scenario_embaralhado = sample(scenario, n())) %>%
group_by(scenario_embaralhado) %>%
summarise(satisfacao = mean(satisfaction))
like = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
baseline = satisfacoes %>% filter(scenario_embaralhado == "baseline") %>% pull(satisfacao)
like - baseline
}
theta_emb(comparacao2)
## [1] 0.3478261
diffs = replicate(4000, {theta_emb(dados)})
tibble(diferenca = diffs) %>%
ggplot(aes(x = diferenca)) +
geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
# geom_density(fill = "white", color = "darkgreen") +
geom_vline(xintercept = theta_chapeu,
color = "orange") +
geom_vline(xintercept = -theta_chapeu,
color = "orange")
# p-valor
pvalue = sum(abs(diffs) >= abs(theta_chapeu)) / length(diffs)
print(paste("O p-valor é aproximadamente: ",pvalue))
## [1] "O p-valor é aproximadamente: 0"
Avaliemos agora se um dos métodos teve melhor desempenho através de one tail test:
Testemos se:
A satisfação média para o método baseline não é significativamente maior que a satisfação média para o método up/downvoting (Hipótese nula)
A satisfação média para o método baseline é significativamente maior que a satisfação média para o método up/downvoting (Hipótese alternativa)
permutationTest2(data=comparacao2,
R=4000,
alternative = "greater",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao2, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "greater")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean Alternative
## mean(satisfaction): baseline-up/downvoting -2.26087 0.002711957 greater
## PValue
## mean(satisfaction): baseline-up/downvoting 1
Testemos se:
A satisfação média para o método baseline não é significativamente menor que a satisfação média para o método up/downvoting (Hipótese nula)
A satisfação média para o método baseline é significativamente menor que a satisfação média para o método up/downvoting (Hipótese alternativa)
permutationTest2(data=comparacao2,
R=4000,
alternative = "less",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao2, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "less")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean Alternative
## mean(satisfaction): baseline-up/downvoting -2.26087 0.006125 less
## PValue
## mean(satisfaction): baseline-up/downvoting 0.0002499375
Conseguimos estabelecer que a satisfação média para baseline é significativamente menor do que para up/downvoting.
comparacao3 = dados %>%
filter(scenario %in% c("like/dislike", "up/downvoting"))
theta_chapeu = {
satisfacoes = comparacao3 %>%
group_by(scenario) %>%
summarise(satisfacao = mean(satisfaction))
like = satisfacoes %>% filter(scenario == "up/downvoting") %>% pull(satisfacao)
baseline = satisfacoes %>% filter(scenario == "like/dislike") %>% pull(satisfacao)
like - baseline
}
theta_chapeu
## [1] 0.7391304
theta_emb = function(d){
satisfacoes = d %>%
mutate(scenario_embaralhado = sample(scenario, n())) %>%
group_by(scenario_embaralhado) %>%
summarise(satisfacao = mean(satisfaction))
like = satisfacoes %>% filter(scenario_embaralhado == "up/downvoting") %>% pull(satisfacao)
baseline = satisfacoes %>% filter(scenario_embaralhado == "like/dislike") %>% pull(satisfacao)
like - baseline
}
theta_emb(comparacao3)
## [1] -0.2173913
diffs = replicate(4000, {theta_emb(dados)})
tibble(diferenca = diffs) %>%
ggplot(aes(x = diferenca)) +
geom_histogram(binwidth = .2, fill = "white", color = "darkgreen") +
# geom_density(fill = "white", color = "darkgreen") +
geom_vline(xintercept = theta_chapeu,
color = "orange") +
geom_vline(xintercept = -theta_chapeu,
color = "orange")
# p-valor
pvalue = sum(abs(diffs) >= abs(theta_chapeu)) / length(diffs)
print(paste("O p-valor é aproximadamente: ",pvalue))
## [1] "O p-valor é aproximadamente: 0.01625"
Avaliemos agora se um dos métodos teve melhor desempenho através de one tail test:
Testemos se:
A satisfação média para o método like/dislike não é significativamente maior que a satisfação média para o método up/downvoting (Hipótese nula)
A satisfação média para o método like/dislike é significativamente maior que a satisfação média para o método up/downvoting (Hipótese alternativa)
permutationTest2(data=comparacao3,
R=4000,
alternative = "greater",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao3, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "greater")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean
## mean(satisfaction): like/dislike-up/downvoting -0.7391304 -0.0005217391
## Alternative PValue
## mean(satisfaction): like/dislike-up/downvoting greater 1
Testemos se:
A satisfação média para o método like/dislike não é significativamente menor que a satisfação média para o método up/downvoting (Hipótese nula)
A satisfação média para o método like/dislike é significativamente menor que a satisfação média para o método up/downvoting (Hipótese alternativa)
permutationTest2(data=comparacao3,
R=4000,
alternative = "less",
statistic = mean(satisfaction),
treatment = scenario)
## Call:
## permutationTest2(data = comparacao3, statistic = mean(satisfaction),
## treatment = scenario, R = 4000, alternative = "less")
## Replications: 4000
## Two samples, sample sizes are 23 23
##
## Summary Statistics for the difference between samples 1 and 2:
## Observed Mean
## mean(satisfaction): like/dislike-up/downvoting -0.7391304 0.001353261
## Alternative PValue
## mean(satisfaction): like/dislike-up/downvoting less 0.0002499375
Conseguimos estabelecer que a satisfação média para like/dislike é significativamente menor do que para up/downvoting.
Usando um two tailed test conseguimos estabelecer diferença significativa entre:
Usando one tailed test conseguimos estabelecer que:
Estabelecemos que o método up/downvoting produziu uma média de satisfação significativamente maior que os outros métodos considerados.
comparacao1 = dados %>%
filter(scenario %in% c("baseline", "like/dislike"))
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)
l - b
}
theta(comparacao1, i = 1:NROW(comparacao1))
## [1] 1.521739
ci1 = boot(data = comparacao1,
statistic = theta,
R = 2000) %>%
tidy(conf.level = .95,
conf.method = "bca",
conf.int = TRUE)
ci1 %>%
mutate(cmprs = "like/dislike - baseline") -> ci1
ci1
O método like/dislike foi melhor avaliado que o método baseline, a diferença é relevante em termos práticos
comparacao2 = dados %>%
filter(scenario %in% c("baseline", "up/downvoting"))
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 == "up/downvoting") %>% pull(media)
l - b
}
theta(comparacao2, i = 1:NROW(comparacao2))
## [1] 2.26087
ci2 = boot(data = comparacao2,
statistic = theta,
R = 2000) %>%
tidy(conf.level = .95,
conf.method = "bca",
conf.int = TRUE)
ci2 %>%
mutate(cmprs = "up/downvoting - baseline") -> ci2
ci2
O método up/downvoting foi melhor avaliado que o método baseline, considerando a escala de satisfação essa diferença é relevante em termos práticos
comparacao3 = dados %>%
filter(scenario %in% c("like/dislike", "up/downvoting"))
theta <- function(d, i) {
agrupado = d %>%
slice(i) %>%
group_by(scenario) %>%
summarise(media = mean(satisfaction))
b = agrupado %>% filter(scenario == "like/dislike") %>% pull(media)
l = agrupado %>% filter(scenario == "up/downvoting") %>% pull(media)
l - b
}
theta(comparacao3, i = 1:NROW(comparacao3))
## [1] 0.7391304
ci3 = boot(data = comparacao3,
statistic = theta,
R = 2000) %>%
tidy(conf.level = .95,
conf.method = "bca",
conf.int = TRUE)
ci3 %>%
mutate(cmprs = "up/downvoting - like/dislike") -> ci3
ci3
O método up/downvoting foi melhor avaliado que o método like/dislike, considerando a escala de satisfação essa diferença é irrelevante em termos práticos
rbind(ci1, ci2, ci3) -> df
df %>%
glimpse()
## Observations: 3
## Variables: 6
## $ statistic <dbl> 1.5217391, 2.2608696, 0.7391304
## $ bias <dbl> 0.0044723806, 0.0008743253, -0.0006537313
## $ std.error <dbl> 0.1770649, 0.1594154, 0.1506336
## $ conf.low <dbl> 1.1613873, 1.9391464, 0.4459282
## $ conf.high <dbl> 1.873364, 2.583710, 1.031989
## $ cmprs <chr> "like/dislike - baseline", "up/downvoting - baseline", "up/…
df %>%
ggplot(aes(x = cmprs, y=statistic,
ymin = conf.low, ymax = conf.high)) +
geom_hline(yintercept = 0, colour = "darkorange") +
geom_errorbar(width = .15) +
geom_point(color="red", size=2) +
scale_y_continuous(limits = c(-5, 5), breaks= seq(-5, 5, 1)) +
labs(x="", y="Diferença das médias",
title=expression(paste("bca bootstrap ", alpha, " = 0.05")))
Observando os intervalos de confiança referentes à diferença das médias de satisfação vemos que:
Em vista do que foi mencionado, entre os métodos que avaliamos up/downvoting foi o mais bem avaliado (produziu maior satisfação). up/downvoting teve média de satisfação entre 2 e 3 pontos maior que baseline uma diferença estatisticamente significativa e relevante em termos práticos. up/downvoting teve média de satisfação entre 0.5 e 1 pontos maior que like/dislike, diferença que embora estatisticamente significativa é irrelevante em termos práticos.
Através de teste de hipotese conseguimos estabelecer que entre os métodos que avaliamos up/downvoting teve maior satisfação média significativamente mais alta do que os métodos baseline e like/dislike
Através de intervalos de confiança estabelecemos que entre os métodos que avaliamos up/downvoting foi o mais bem avaliado (produziu maior satisfação), embora a diferença com like/dislike não foi relevante em termos práticos.
up/downvoting teve média de satisfação entre 2 e 3 pontos maior que baseline, uma diferença estatisticamente significativa e relevante em termos práticos.
up/downvoting teve média de satisfação entre 0.5 e 1 pontos maior que like/dislike, diferença que embora estatisticamente significativa é irrelevante em termos práticos.
Ao construir o intervalo de confiança da diferença entre A e B conseguimos avaliar se existe uma diferença significativa entre A e B. Se o intervalo inclui o valor 0, isso significa que não conseguimos estabelecer uma diferença significativa.
Se o intervalo não inclui o 0 e está acima de 0 em sua totalidade isso significa que não somente conseguimos estabelecer uma diferença significativa entre A e B como conseguimos estabelecer de maneira significativa que A é maior que B, pois se em algum ponto do intervalo A fosse menor que B teríamos um valor menor que 0.
Se o intervalo não inclui o 0 e está abaixo de 0 em sua totalidade isso significa que não somente conseguimos estabelecer uma diferença significativa entre A e B como conseguimos estabelecer de maneira significativa que A é menor que B, pois se em algum ponto do intervalo A fosse maior que B teríamos um valor maior que 0.
Testes de hipótese podem avaliar se existe diferença estatisticamente significativa entre A e B de maneira relativamente robusta através de um two tailed test. Um one-tailed test pode ser usado para avaliar se A > B ou A < B de maneira estatisticamente significativa.
Uma questão fundamental no uso de intervalos de confiança em contraposição ao teste de hipótese é que podemos avaliar a relevância prática do que o intervalo representa, como exemplo neste relatório chegamos à conclusão de que a diferença entre baseline e like/dislike era tanto estatiscamente significativa quanto relevante em termos práticos, no caso de like/dislike e up/downvoting avaliamos que embora tenhamos encontrado uma diferença estatiscamente significativa esta não era relevante em termos práticos. Teste de Hipótese nos permite tratar em termos de significância estatistica mas não de relevância prática ! Por essas razões por muitas vezes se recomenda o uso de intervalos de confiança, porque um teste de hipótese pode nos dizer se A > B, mas um intervalo de confiança nos diz se A > B e o quão A > B.
Diferentemente de intervalos de confiança um teste de hipótese não nos permite discutir relevância prática !