O cenário

Os dados são uma amostra sobre avaliação de filmes disponíveis no MovieLens. A métrica de interesse é a proporção de usuários que avaliam um filme no fim de semana e durante a semana. A estatística que nos interessa é a diferença entre a proporção de avaliações dos usuários nos filmes dos gêneros Sic-Fi e Horror, em dois grupos de dias da semana, um do meio da semana (entre segunda e sexta) e outro com fim de semana (sábado e domingo). O site onde os dados são disponibilizados está disponível no link: MovieLens.

Conhecendo os dados

ratings <- read.csv(here::here("/data/ratings.csv")) %>% na.omit()
movies <- read.csv(here::here("/data/movies.csv")) %>% na.omit() 
data <- merge(ratings, movies,  by='movieId')
data <- data %>% 
  mutate(date = 
            as.Date(as.POSIXct(timestamp, origin="1970-01-01")),
         is_weekend = isWeekend(date)
         ) %>%
  select(-timestamp)
group1 = "Horror"
group2 = "Sci-Fi"
data <- data %>% 
    filter(genres %in% c(group1, group2))
glimpse(data)
Observations: 718
Variables: 7
$ movieId    <int> 177, 177, 177, 177, 177, 177, 177, 177, 177, 17...
$ userId     <int> 396, 243, 602, 564, 285, 73, 19, 516, 311, 39, ...
$ rating     <dbl> 3.0, 3.0, 3.0, 2.0, 5.0, 3.0, 2.0, 3.0, 0.5, 4....
$ title      <fct> Lord of Illusions (1995), Lord of Illusions (19...
$ genres     <fct> Horror, Horror, Horror, Horror, Horror, Horror,...
$ date       <date> 1996-06-17, 2004-09-03, 1996-09-10, 2000-11-20...
$ is_weekend <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE...

Os dados estão distribuídos nas seguintes colunas:

  • userId: Identificador do usuário;
  • movieId: Identificador do filme;
  • rating: A avaliação dada por um usuário a um filme.
  • title: O título do filme;
  • genres: Os gêneros do filme;
  • date: As datas;
  • is_weekend: Se a data é um fim de semana (Sábado ou Domingo).


Proporção da amostra

data <- merge(data, data %>% select(genres, is_weekend, rating, date) %>% group_by(date) %>% summarise(cont_ratings = n()),  by='date')
data %>%
    ggplot() + 
    aes(x = reorder(genres, cont_ratings, NROW),
        fill = is_weekend) + 
    geom_bar() + 
    labs(
        x = "Gêneros", 
        y = "Quantidade de avaliações", 
        fill = "É final de semana?"
    )

Pergunta

A pergunta é: dada essa amostra, podemos inferir que há uma diferença na taxa de avaliações dadas também na população de onde saiu essa amostra?

Usando Testes de hipótese e p-valores

# A diferença na amostra, que queremos comparar com o modelo nulo
d = data %>% 
    group_by(is_weekend) %>% 
    summarise(ct = sum(cont_ratings) / n())
m1 = d %>% filter(!is_weekend) %>% pull(ct)
m2 = d %>% filter(is_weekend) %>% pull(ct)

diferenca_amostral = m1 - m2

# Permutações para calcular o que acontece no modelo nulo
permutacoes = replicate(10000, 
          {
              d = data %>% 
                  mutate(version_shuffled = sample(is_weekend, n())) %>% 
                  group_by(version_shuffled) %>% 
                  summarise(ct = sum(cont_ratings) / n())
              m1 = d %>% filter(!version_shuffled) %>% pull(ct)
              m2 = d %>% filter(version_shuffled) %>% pull(ct)
              m1 - m2
          })

Exibindo resultados

tibble(diferenca = permutacoes) %>% 
  ggplot(aes(x = diferenca)) + 
  geom_histogram(bins = 30) + 
  geom_vline(xintercept = diferenca_amostral, size = 2, color = "orange")

P-valor

P-valor é a probabilidade de se obter uma estatística de teste igual ou mais extrema que aquela observada em uma amostra, sob a hipótese nula. Por exemplo, em testes de hipótese, pode-se rejeitar a hipótese nula a 5% caso o valor-p seja menor que 5%. Assim, uma outra interpretação para o valor-p, é que este é menor nível de significância com que se rejeitaria a hipótese nula. Em termos gerais, um valor-p pequeno significa que a probabilidade de obter um valor da estatística de teste como o observado é muito improvável, levando assim à rejeição da hipótese nula. (Fonte)

prop = function(x){
    sum(x)/NROW(x)
}
data %>% 
    resample::permutationTest2(statistic = prop(cont_ratings), 
                     treatment = is_weekend)

Obtendo P-valor igual a 0.0002 e sendo este valor menor que 0.05, pode-se rejeitar a nossa hipótese nula e concluindo que não é possível inferir que há uma diferença na taxa de avaliações dadas também na população de onde saiu essa amostra.

LS0tCnRpdGxlOiAnSW5mZXLDqm5jaWE6IFRlc3RlcyBkZSBwZXJtdXRhw6fDo28gZSBwLXZhbG9yZXMnCmF1dGhvcjogIkhhZHJpemlhIFNhbnRvcyIKZGF0ZTogIjIzIGRlIGp1bGhvIGRlIDIwMTgiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiByZWFkYWJsZQogICAgZmlnX3dpZHRoOiA4CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVzYW1wbGUpCmxpYnJhcnkodGltZURhdGUpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGJvb3QpCmxpYnJhcnkoc3RyaW5ncikKCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCiMjIE8gY2Vuw6FyaW8KCk9zIGRhZG9zIHPDo28gdW1hIGFtb3N0cmEgc29icmUgYXZhbGlhw6fDo28gZGUgZmlsbWVzIGRpc3BvbsOtdmVpcyBubyBNb3ZpZUxlbnMuIEEgbcOpdHJpY2EgZGUgaW50ZXJlc3NlIMOpIGEgcHJvcG9yw6fDo28gZGUgdXN1w6FyaW9zIHF1ZSBhdmFsaWFtIHVtIGZpbG1lIG5vIGZpbSBkZSBzZW1hbmEgZSBkdXJhbnRlIGEgc2VtYW5hLiBBIGVzdGF0w61zdGljYSBxdWUgbm9zIGludGVyZXNzYSDDqSBhIGRpZmVyZW7Dp2EgZW50cmUgYSBwcm9wb3LDp8OjbyBkZSBhdmFsaWHDp8O1ZXMgZG9zIHVzdcOhcmlvcyBub3MgZmlsbWVzIGRvcyBnw6puZXJvcyBTaWMtRmkgZSBIb3Jyb3IsIGVtIGRvaXMgZ3J1cG9zIGRlIGRpYXMgZGEgc2VtYW5hLCB1bSBkbyBtZWlvIGRhIHNlbWFuYSAoZW50cmUgc2VndW5kYSBlIHNleHRhKSBlIG91dHJvIGNvbSBmaW0gZGUgc2VtYW5hIChzw6FiYWRvIGUgZG9taW5nbykuCk8gc2l0ZSBvbmRlIG9zIGRhZG9zIHPDo28gZGlzcG9uaWJpbGl6YWRvcyBlc3TDoSBkaXNwb27DrXZlbCBubyBsaW5rOgpbTW92aWVMZW5zXShodHRwOi8vZ3JvdXBsZW5zLm9yZy9kYXRhc2V0cy9tb3ZpZWxlbnMvbGF0ZXN0LykuCjxicj4KCiMjIyBDb25oZWNlbmRvIG9zIGRhZG9zCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpyYXRpbmdzIDwtIHJlYWQuY3N2KGhlcmU6OmhlcmUoIi9kYXRhL3JhdGluZ3MuY3N2IikpICU+JSBuYS5vbWl0KCkKbW92aWVzIDwtIHJlYWQuY3N2KGhlcmU6OmhlcmUoIi9kYXRhL21vdmllcy5jc3YiKSkgJT4lIG5hLm9taXQoKSAKZGF0YSA8LSBtZXJnZShyYXRpbmdzLCBtb3ZpZXMsICBieT0nbW92aWVJZCcpCgpkYXRhIDwtIGRhdGEgJT4lIAogIG11dGF0ZShkYXRlID0gCiAgICAgICAgICAgIGFzLkRhdGUoYXMuUE9TSVhjdCh0aW1lc3RhbXAsIG9yaWdpbj0iMTk3MC0wMS0wMSIpKSwKICAgICAgICAgaXNfd2Vla2VuZCA9IGlzV2Vla2VuZChkYXRlKQogICAgICAgICApICU+JQogIHNlbGVjdCgtdGltZXN0YW1wKQoKZ3JvdXAxID0gIkhvcnJvciIKZ3JvdXAyID0gIlNjaS1GaSIKCmRhdGEgPC0gZGF0YSAlPiUgCiAgICBmaWx0ZXIoZ2VucmVzICVpbiUgYyhncm91cDEsIGdyb3VwMikpCgpnbGltcHNlKGRhdGEpCmBgYAoKT3MgZGFkb3MgZXN0w6NvIGRpc3RyaWJ1w61kb3MgbmFzIHNlZ3VpbnRlcyBjb2x1bmFzOgoKKiBgdXNlcklkYDogSWRlbnRpZmljYWRvciBkbyB1c3XDoXJpbzsKKiBgbW92aWVJZGA6IElkZW50aWZpY2Fkb3IgZG8gZmlsbWU7CiogYHJhdGluZ2A6IEEgYXZhbGlhw6fDo28gZGFkYSBwb3IgdW0gdXN1w6FyaW8gYSB1bSBmaWxtZS4KKiBgdGl0bGVgOiBPIHTDrXR1bG8gZG8gZmlsbWU7CiogYGdlbnJlc2A6IE9zIGfDqm5lcm9zIGRvIGZpbG1lOwoqIGBkYXRlYDogQXMgZGF0YXM7CiogYGlzX3dlZWtlbmRgOiBTZSBhIGRhdGEgw6kgdW0gZmltIGRlIHNlbWFuYSAoU8OhYmFkbyBvdSBEb21pbmdvKS4KCjxicj4KCiMjIyMgUHJvcG9yw6fDo28gZGEgYW1vc3RyYQoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZGF0YSA8LSBtZXJnZShkYXRhLCBkYXRhICU+JSBzZWxlY3QoZ2VucmVzLCBpc193ZWVrZW5kLCByYXRpbmcsIGRhdGUpICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKGNvbnRfcmF0aW5ncyA9IG4oKSksICBieT0nZGF0ZScpCgpkYXRhICU+JQogICAgZ2dwbG90KCkgKyAKICAgIGFlcyh4ID0gcmVvcmRlcihnZW5yZXMsIGNvbnRfcmF0aW5ncywgTlJPVyksCiAgICAgICAgZmlsbCA9IGlzX3dlZWtlbmQpICsgCiAgICBnZW9tX2JhcigpICsgCiAgICBsYWJzKAogICAgICAgIHggPSAiR8OqbmVyb3MiLCAKICAgICAgICB5ID0gIlF1YW50aWRhZGUgZGUgYXZhbGlhw6fDtWVzIiwgCiAgICAgICAgZmlsbCA9ICLDiSBmaW5hbCBkZSBzZW1hbmE/IgogICAgKQoKYGBgCgojIyBQZXJndW50YQoKQSBwZXJndW50YSDDqTogZGFkYSBlc3NhIGFtb3N0cmEsIHBvZGVtb3MgaW5mZXJpciBxdWUgaMOhIHVtYSBkaWZlcmVuw6dhIG5hIHRheGEgZGUgYXZhbGlhw6fDtWVzIGRhZGFzIHRhbWLDqW0gKm5hIHBvcHVsYcOnw6NvIGRlIG9uZGUgc2FpdSBlc3NhIGFtb3N0cmE/KgoKIyMjIFVzYW5kbyBUZXN0ZXMgZGUgaGlww7N0ZXNlIGUgcC12YWxvcmVzCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPVRSVUV9CiMgQSBkaWZlcmVuw6dhIG5hIGFtb3N0cmEsIHF1ZSBxdWVyZW1vcyBjb21wYXJhciBjb20gbyBtb2RlbG8gbnVsbwpkID0gZGF0YSAlPiUgCiAgICBncm91cF9ieShpc193ZWVrZW5kKSAlPiUgCiAgICBzdW1tYXJpc2UoY3QgPSBzdW0oY29udF9yYXRpbmdzKSAvIG4oKSkKbTEgPSBkICU+JSBmaWx0ZXIoIWlzX3dlZWtlbmQpICU+JSBwdWxsKGN0KQptMiA9IGQgJT4lIGZpbHRlcihpc193ZWVrZW5kKSAlPiUgcHVsbChjdCkKCmRpZmVyZW5jYV9hbW9zdHJhbCA9IG0xIC0gbTIKCiMgUGVybXV0YcOnw7VlcyBwYXJhIGNhbGN1bGFyIG8gcXVlIGFjb250ZWNlIG5vIG1vZGVsbyBudWxvCnBlcm11dGFjb2VzID0gcmVwbGljYXRlKDEwMDAwLCAKICAgICAgICAgIHsKICAgICAgICAgICAgICBkID0gZGF0YSAlPiUgCiAgICAgICAgICAgICAgICAgIG11dGF0ZSh2ZXJzaW9uX3NodWZmbGVkID0gc2FtcGxlKGlzX3dlZWtlbmQsIG4oKSkpICU+JSAKICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkodmVyc2lvbl9zaHVmZmxlZCkgJT4lIAogICAgICAgICAgICAgICAgICBzdW1tYXJpc2UoY3QgPSBzdW0oY29udF9yYXRpbmdzKSAvIG4oKSkKICAgICAgICAgICAgICBtMSA9IGQgJT4lIGZpbHRlcighdmVyc2lvbl9zaHVmZmxlZCkgJT4lIHB1bGwoY3QpCiAgICAgICAgICAgICAgbTIgPSBkICU+JSBmaWx0ZXIodmVyc2lvbl9zaHVmZmxlZCkgJT4lIHB1bGwoY3QpCiAgICAgICAgICAgICAgbTEgLSBtMgogICAgICAgICAgfSkKYGBgCgojIyMjIEV4aWJpbmRvIHJlc3VsdGFkb3MKCmBgYHtyfQp0aWJibGUoZGlmZXJlbmNhID0gcGVybXV0YWNvZXMpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkaWZlcmVuY2EpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkaWZlcmVuY2FfYW1vc3RyYWwsIHNpemUgPSAyLCBjb2xvciA9ICJvcmFuZ2UiKQpgYGAKCiMjIyMgUC12YWxvcgoKUC12YWxvciDDqSBhIHByb2JhYmlsaWRhZGUgZGUgc2Ugb2J0ZXIgdW1hIGVzdGF0w61zdGljYSBkZSB0ZXN0ZSBpZ3VhbCBvdSBtYWlzIGV4dHJlbWEgcXVlIGFxdWVsYSBvYnNlcnZhZGEgZW0gdW1hIGFtb3N0cmEsIHNvYiBhIGhpcMOzdGVzZSBudWxhLiBQb3IgZXhlbXBsbywgZW0gdGVzdGVzIGRlIGhpcMOzdGVzZSwgcG9kZS1zZSByZWplaXRhciBhIGhpcMOzdGVzZSBudWxhIGEgNSUgY2FzbyBvIHZhbG9yLXAgc2VqYSBtZW5vciBxdWUgNSUuIEFzc2ltLCB1bWEgb3V0cmEgaW50ZXJwcmV0YcOnw6NvIHBhcmEgbyB2YWxvci1wLCDDqSBxdWUgZXN0ZSDDqSBtZW5vciBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgY29tIHF1ZSBzZSByZWplaXRhcmlhIGEgaGlww7N0ZXNlIG51bGEuIEVtIHRlcm1vcyBnZXJhaXMsIHVtIHZhbG9yLXAgcGVxdWVubyBzaWduaWZpY2EgcXVlIGEgcHJvYmFiaWxpZGFkZSBkZSBvYnRlciB1bSB2YWxvciBkYSBlc3RhdMOtc3RpY2EgZGUgdGVzdGUgY29tbyBvIG9ic2VydmFkbyDDqSBtdWl0byBpbXByb3bDoXZlbCwgbGV2YW5kbyBhc3NpbSDDoCByZWplacOnw6NvIGRhIGhpcMOzdGVzZSBudWxhLiBbKEZvbnRlKV0oaHR0cHM6Ly9wdC53aWtpcGVkaWEub3JnL3dpa2kvVmFsb3ItcCkKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnByb3AgPSBmdW5jdGlvbih4KXsKICAgIHN1bSh4KS9OUk9XKHgpCn0KZGF0YSAlPiUgCiAgICByZXNhbXBsZTo6cGVybXV0YXRpb25UZXN0MihzdGF0aXN0aWMgPSBwcm9wKGNvbnRfcmF0aW5ncyksIAogICAgICAgICAgICAgICAgICAgICB0cmVhdG1lbnQgPSBpc193ZWVrZW5kKQpgYGAKCk9idGVuZG8gUC12YWxvciBpZ3VhbCBhIDAuMDAwMiBlIHNlbmRvIGVzdGUgdmFsb3IgbWVub3IgcXVlIDAuMDUsIHBvZGUtc2UgcmVqZWl0YXIgYSBub3NzYSBoaXDDs3Rlc2UgbnVsYSBlIGNvbmNsdWluZG8gcXVlICoqbsOjbyDDqSBwb3Nzw612ZWwgaW5mZXJpciBxdWUgaMOhIHVtYSBkaWZlcmVuw6dhIG5hIHRheGEgZGUgYXZhbGlhw6fDtWVzIGRhZGFzIHRhbWLDqW0gbmEgcG9wdWxhw6fDo28gZGUgb25kZSBzYWl1IGVzc2EgYW1vc3RyYSoqLgo=