Анализ данных про настольные игры

Введение

Перед вами два связанных набора данных ratings и details, которые содержат в себе информацию об огромном количестве настольных игр. Наборы данных взяты с проекта Tidy Tuesday (в свою очередь, эти данные взяты с Kaggle, где есть данные на 3 гигабайта со всеми обзорами на игры!), а собраны с сайта BoardGamesGeek.

Описание колонок (codebook) можно посмотреть на гитхабе проекта Tidy Tuesday.

library(tidyverse)
ratings <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-01-25/ratings.csv')
details <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-01-25/details.csv')

Исследуем ratings

Давайте для начала немного исследуем датасет ratings.

Подсмотреть код (но лучше решите сами!)
ratings
# A tibble: 21,831 × 10
     num     id name            year  rank average bayes…¹ users…² url   thumb…³
   <dbl>  <dbl> <chr>          <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
 1   105  30549 Pandemic        2008   106    7.59    7.49  108975 /boa… https:…
 2   189    822 Carcassonne     2000   190    7.42    7.31  108738 /boa… https:…
 3   428     13 Catan           1995   429    7.14    6.97  108024 /boa… https:…
 4    72  68448 7 Wonders       2010    73    7.74    7.63   89982 /boa… https:…
 5   103  36218 Dominion        2008   104    7.61    7.50   81561 /boa… https:…
 6   191   9209 Ticket to Ride  2004   192    7.41    7.30   76171 /boa… https:…
 7   100 178900 Codenames       2015   101    7.6     7.51   74419 /boa… https:…
 8     3 167791 Terraforming …  2016     4    8.42    8.27   74216 /boa… https:…
 9    15 173346 7 Wonders Duel  2015    16    8.11    7.98   69472 /boa… https:…
10    35  31260 Agricola        2007    36    7.93    7.81   66093 /boa… https:…
# … with 21,821 more rows, and abbreviated variable names ¹​bayes_average,
#   ²​users_rated, ³​thumbnail

Выберем из ratings колонки name, average, users_rated

Подсмотреть код (но лучше решите сами!)
ratings %>%
  select(name, average, users_rated)
# A tibble: 21,831 × 3
   name              average users_rated
   <chr>               <dbl>       <dbl>
 1 Pandemic             7.59      108975
 2 Carcassonne          7.42      108738
 3 Catan                7.14      108024
 4 7 Wonders            7.74       89982
 5 Dominion             7.61       81561
 6 Ticket to Ride       7.41       76171
 7 Codenames            7.6        74419
 8 Terraforming Mars    8.42       74216
 9 7 Wonders Duel       8.11       69472
10 Agricola             7.93       66093
# … with 21,821 more rows

Выберем из тиббла ratings 20, 500, 2000 и 20000ные строки:

Подсмотреть код (но лучше решите сами!)
ratings %>%
  slice(c(20, 500, 2000, 20000))
# A tibble: 4 × 10
    num     id name            year  rank average bayes_…¹ users…² url   thumb…³
  <dbl>  <dbl> <chr>          <dbl> <dbl>   <dbl>    <dbl>   <dbl> <chr> <chr>  
1    22 266192 Wingspan        2019    23    8.1      7.94   56079 /boa… https:…
2  1150    826 Cartagena       2000  1151    6.69     6.45    7601 /boa… https:…
3  2704     58 Kings & Things  1986  2705    6.51     5.97    1629 /boa… https:…
4 17650  13440 Horrific        2004 17651    5.8      5.50      36 /boa… https:…
# … with abbreviated variable names ¹​bayes_average, ²​users_rated, ³​thumbnail

Отранжируем игры в ratings по названиям (в алфавитном порядке):

Подсмотреть код (но лучше решите сами!)
ratings %>%
  arrange(name)
# A tibble: 21,831 × 10
     num     id name            year  rank average bayes…¹ users…² url   thumb…³
   <dbl>  <dbl> <chr>          <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
 1 18328 122711 "\"La Garde r…  2011 18329    5.39    5.50      35 /boa… https:…
 2 17674  23304 "\"Oh My God!…  2014 17675    5.77    5.50      84 /boa… https:…
 3 10121   4016 "\"Scratch On…  1995 10122    7.42    5.55      52 /boa… https:…
 4 11197  38836 "\"Tarleton's…  2010 11198    7.06    5.54      50 /boa… https:…
 5 17013 286535 "#MyLife"       2019 17014    5.69    5.51      60 /boa… https:…
 6  5646 188325 "'65: Squad-L…  2016  5647    7.67    5.66     153 /boa… https:…
 7 20470   7463 "'CA' Tactica…  1973 20471    5.31    5.47     109 /boa… https:…
 8  6950   6253 "'Wacht am Rh…  1977  6951    7.43    5.61     131 /boa… https:…
 9 12277 258440 "(Come on) Le…  2018 12278    7.28    5.53      38 /boa… https:…
10  8165 128568 "(Your Name H…  2012  8166    7.13    5.58     115 /boa… https:…
# … with 21,821 more rows, and abbreviated variable names ¹​bayes_average,
#   ²​users_rated, ³​thumbnail

Отранжируем игры в ratings от по средним оценкам (average): от лучших к худшим.

Подсмотреть код (но лучше решите сами!)
ratings %>%
  arrange(desc(average))
# A tibble: 21,831 × 10
     num     id name            year  rank average bayes…¹ users…² url   thumb…³
   <dbl>  <dbl> <chr>          <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
 1 13628 274471 Malhya: Lands…  2022 13629    9.57    5.53      41 /boa… https:…
 2 14432 275777 Erune           2021 14433    9.56    5.52      43 /boa… https:…
 3 17552 228370 TerroriXico     2018 17553    9.43    5.50      70 /boa… https:…
 4  7432 345976 System Gatewa…  2021  7433    9.4     5.6       47 /boa… https:…
 5 11478 322354 DEFCON 1        2022 11479    9.36    5.54      60 /boa… https:…
 6 13821 173514 Meeple Quest    2021 13822    9.31    5.52      45 /boa… https:…
 7  6961  85147 Wings of the …  2019  6962    9.29    5.61     101 /boa… https:…
 8 14646 281257 Aeolis          2020 14647    9.25    5.52      40 /boa… https:…
 9 16996 207203 War Titans: I…     0 16997    9.24    5.51      58 /boa… https:…
10 14752 151070 Gladiatoris     2009 14753    9.23    5.52      31 /boa… https:…
# … with 21,821 more rows, and abbreviated variable names ¹​bayes_average,
#   ²​users_rated, ³​thumbnail

У нас получилось много малоизвестных игр, у которых мало оценок. Давайте отделим для дальнейшего анализа только 5% игр, которые получили больше всего оценок (users_rated) и сохраним полученную таблицу в переменную ratings_topgames.

Подсмотреть код (но лучше решите сами!)
ratings_topgames <- ratings %>%
  slice_max(order_by = users_rated, prop = .05)
ratings_topgames
# A tibble: 1,091 × 10
     num     id name            year  rank average bayes…¹ users…² url   thumb…³
   <dbl>  <dbl> <chr>          <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
 1   105  30549 Pandemic        2008   106    7.59    7.49  108975 /boa… https:…
 2   189    822 Carcassonne     2000   190    7.42    7.31  108738 /boa… https:…
 3   428     13 Catan           1995   429    7.14    6.97  108024 /boa… https:…
 4    72  68448 7 Wonders       2010    73    7.74    7.63   89982 /boa… https:…
 5   103  36218 Dominion        2008   104    7.61    7.50   81561 /boa… https:…
 6   191   9209 Ticket to Ride  2004   192    7.41    7.30   76171 /boa… https:…
 7   100 178900 Codenames       2015   101    7.6     7.51   74419 /boa… https:…
 8     3 167791 Terraforming …  2016     4    8.42    8.27   74216 /boa… https:…
 9    15 173346 7 Wonders Duel  2015    16    8.11    7.98   69472 /boa… https:…
10    35  31260 Agricola        2007    36    7.93    7.81   66093 /boa… https:…
# … with 1,081 more rows, and abbreviated variable names ¹​bayes_average,
#   ²​users_rated, ³​thumbnail

Теперь посмотрим на худшие игры в новом датасете ratings_topgames, отранжировав игры про средней оценке (average):

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  arrange(average)
# A tibble: 1,091 × 10
     num    id name             year  rank average bayes…¹ users…² url   thumb…³
   <dbl> <dbl> <chr>           <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
 1 21829 11901 Tic-Tac-Toe      1300 21830    2.7     3.58    3436 /boa… https:…
 2 21828  5432 Chutes and Lad…   200 21829    2.87    3.61    4035 /boa… https:…
 3 21827  5048 Candy Land       1949 21828    3.18    3.80    4238 /boa… https:…
 4 21824  1410 Trouble          1965 21825    3.81    4.30    3484 /boa… https:…
 5 21820  3737 Operation        1965 21821    4.12    4.51    3827 /boa… https:…
 6 21822  2921 The Game of Li…  1960 21823    4.31    4.31   11324 /boa… https:…
 7 21823  1406 Monopoly         1933 21824    4.37    4.30   30803 /boa… https:…
 8 21813  2136 Pachisi           400 21814    4.5     4.69    4768 /boa… https:…
 9 21816  2407 Sorry!           1929 21817    4.52    4.65    6165 /boa… https:…
10 21807  5894 Twister          1966 21808    4.54    4.76    4230 /boa… https:…
# … with 1,081 more rows, and abbreviated variable names ¹​bayes_average,
#   ²​users_rated, ³​thumbnail

Верните в виде строкового вектора 10 худших игр (по average) из ratings_topgames.

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  arrange(average) %>%
  slice(1:10) %>%
  pull(name)
 [1] "Tic-Tac-Toe"        "Chutes and Ladders" "Candy Land"        
 [4] "Trouble"            "Operation"          "The Game of Life"  
 [7] "Monopoly"           "Pachisi"            "Sorry!"            
[10] "Twister"           

Теперь исследуем датасет details с дополнительными метаданными про настольные игры. Отранжируем игры в details по убыванию minplaytime, чтобы посмотреть самые долгие игры.

Подсмотреть код (но лучше решите сами!)
details %>%
  arrange(desc(minplaytime))
# A tibble: 21,631 × 23
     num     id primary  descr…¹ yearp…² minpl…³ maxpl…⁴ playi…⁵ minpl…⁶ maxpl…⁷
   <dbl>  <dbl> <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1  9553   4815 The Cam… This i…    1979       8      10   60000   60000   60000
 2 10865  46669 1914: O… (from …    2013       2       4   17280   17280   17280
 3 13470   6942 Drang N… Introd…    1973       2       4   12000   12000   12000
 4 14448 239982 The Eni… We wan…    2017       1       4   10000    6000   10000
 5  4975   5651 The Lon… The Lo…    1979       2       8    5400    5400    5400
 6  6528  13532 Guderia… (from …    2001       1       6    4500    4500    4500
 7  5951   4102 Europa … &quot;…    1993       1       6    3600    3600    3600
 8  6792  32989 Axis Em… From t…    2011       1       3    3600    3600    3600
 9  6332   8993 Fire in… Fire i…    1984       2       4    3000    3000    3000
10  7517  22359 Steel W… (from …    2010       1       1    3000    3000    3000
# … with 21,621 more rows, 13 more variables: minage <dbl>,
#   boardgamecategory <chr>, boardgamemechanic <chr>, boardgamefamily <chr>,
#   boardgameexpansion <chr>, boardgameimplementation <chr>,
#   boardgamedesigner <chr>, boardgameartist <chr>, boardgamepublisher <chr>,
#   owned <dbl>, trading <dbl>, wanting <dbl>, wishing <dbl>, and abbreviated
#   variable names ¹​description, ²​yearpublished, ³​minplayers, ⁴​maxplayers,
#   ⁵​playingtime, ⁶​minplaytime, ⁷​maxplaytime

Выкинем все игры, в которых минимальное время игры – 0 минут. Сохраним результаты в новый тибл details_longplay.

Подсмотреть код (но лучше решите сами!)
details_longplay <- details %>%
  filter(minplaytime != 0)
details_longplay
# A tibble: 20,989 × 23
     num     id primary  descr…¹ yearp…² minpl…³ maxpl…⁴ playi…⁵ minpl…⁶ maxpl…⁷
   <dbl>  <dbl> <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1     0  30549 Pandemic In Pan…    2008       2       4      45      45      45
 2     1    822 Carcass… Carcas…    2000       2       5      45      30      45
 3     2     13 Catan    In CAT…    1995       3       4     120      60     120
 4     3  68448 7 Wonde… You ar…    2010       2       7      30      30      30
 5     4  36218 Dominion &quot;…    2008       2       4      30      30      30
 6     5   9209 Ticket … With e…    2004       2       5      60      30      60
 7     6 178900 Codenam… Codena…    2015       2       8      15      15      15
 8     7 167791 Terrafo… In the…    2016       1       5     120     120     120
 9     8 173346 7 Wonde… In man…    2015       2       2      30      30      30
10     9  31260 Agricola Descri…    2007       1       5     150      30     150
# … with 20,979 more rows, 13 more variables: minage <dbl>,
#   boardgamecategory <chr>, boardgamemechanic <chr>, boardgamefamily <chr>,
#   boardgameexpansion <chr>, boardgameimplementation <chr>,
#   boardgamedesigner <chr>, boardgameartist <chr>, boardgamepublisher <chr>,
#   owned <dbl>, trading <dbl>, wanting <dbl>, wishing <dbl>, and abbreviated
#   variable names ¹​description, ²​yearpublished, ³​minplayers, ⁴​maxplayers,
#   ⁵​playingtime, ⁶​minplaytime, ⁷​maxplaytime

Создадим новую колонку time_group в details_longplay, в которую запишем:

  • "short" – если минимальное время игры меньше или равно 10 минутам;

  • "middle" – если минимальное время игры больше 10 минут, но меньше или равно 120 минутам;

  • "long" – если минимальное время игры больше 120 минут, но не больше суток;

  • "extremely long" – если минимальное время игры больше суток (о, господи).

Новый датасет сохраните в переменную details_longplay_time.

Подсмотреть код (но лучше решите сами!)
details_longplay_time <- details_longplay %>%
  mutate(time_group = case_when(minplaytime <= 10 ~ "short",
            minplaytime <= 120 ~ "middle",
            minplaytime <= 24 * 60 ~ "long",
            .default = "extremely long"))

Посчитайте, сколько игр в каждой из получившихся категорий.

Подсмотреть код (но лучше решите сами!)
details_longplay_time %>%
  count(time_group)
# A tibble: 4 × 2
  time_group         n
  <chr>          <int>
1 extremely long    19
2 long            1655
3 middle         17556
4 short           1759

Время объединяться!

Дополните набор данных details_longplay_time данными ratings. Проверьте, что количество строчек в details_lonngplay_time не изменилось (вам для этого нужно подобрать правильный *_join)! Объединить нужно по ключу id.

Подсмотреть код (но лучше решите сами!)
details_longplay_time %>%
  left_join(ratings, by = "id")
# A tibble: 20,989 × 33
   num.x     id primary  descr…¹ yearp…² minpl…³ maxpl…⁴ playi…⁵ minpl…⁶ maxpl…⁷
   <dbl>  <dbl> <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1     0  30549 Pandemic In Pan…    2008       2       4      45      45      45
 2     1    822 Carcass… Carcas…    2000       2       5      45      30      45
 3     2     13 Catan    In CAT…    1995       3       4     120      60     120
 4     3  68448 7 Wonde… You ar…    2010       2       7      30      30      30
 5     4  36218 Dominion &quot;…    2008       2       4      30      30      30
 6     5   9209 Ticket … With e…    2004       2       5      60      30      60
 7     6 178900 Codenam… Codena…    2015       2       8      15      15      15
 8     7 167791 Terrafo… In the…    2016       1       5     120     120     120
 9     8 173346 7 Wonde… In man…    2015       2       2      30      30      30
10     9  31260 Agricola Descri…    2007       1       5     150      30     150
# … with 20,979 more rows, 23 more variables: minage <dbl>,
#   boardgamecategory <chr>, boardgamemechanic <chr>, boardgamefamily <chr>,
#   boardgameexpansion <chr>, boardgameimplementation <chr>,
#   boardgamedesigner <chr>, boardgameartist <chr>, boardgamepublisher <chr>,
#   owned <dbl>, trading <dbl>, wanting <dbl>, wishing <dbl>, time_group <chr>,
#   num.y <dbl>, name <chr>, year <dbl>, rank <dbl>, average <dbl>,
#   bayes_average <dbl>, users_rated <dbl>, url <chr>, thumbnail <chr>, and …

Теперь посчитайте средние average, users_rated и owned для каждой группы по времени игры (колонка time_group, которую мы создавали ранее)

Подсмотреть код (но лучше решите сами!)
details_longplay_time %>%
  left_join(ratings, by = "id") %>% 
  group_by(time_group) %>%
  summarize(rating = mean(average, na.rm = TRUE),
            rated = mean(users_rated, na.rm = TRUE),
            owned = mean(owned, na.rm = TRUE))
# A tibble: 4 × 4
  time_group     rating rated owned
  <chr>           <dbl> <dbl> <dbl>
1 extremely long   7.50  220.  718.
2 long             6.90  408.  857.
3 middle           6.42  996. 1664.
4 short            6.08  393.  781.

Теперь сделаем обратную задачу: возьмем тибл ratings_topgames, созданный ранее, и дополним его набором данных details (по ключу id).

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id")
# A tibble: 1,091 × 32
   num.x     id name      year  rank average bayes…¹ users…² url   thumb…³ num.y
   <dbl>  <dbl> <chr>    <dbl> <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>   <dbl>
 1   105  30549 Pandemic  2008   106    7.59    7.49  108975 /boa… https:…     0
 2   189    822 Carcass…  2000   190    7.42    7.31  108738 /boa… https:…     1
 3   428     13 Catan     1995   429    7.14    6.97  108024 /boa… https:…     2
 4    72  68448 7 Wonde…  2010    73    7.74    7.63   89982 /boa… https:…     3
 5   103  36218 Dominion  2008   104    7.61    7.50   81561 /boa… https:…     4
 6   191   9209 Ticket …  2004   192    7.41    7.30   76171 /boa… https:…     5
 7   100 178900 Codenam…  2015   101    7.6     7.51   74419 /boa… https:…     6
 8     3 167791 Terrafo…  2016     4    8.42    8.27   74216 /boa… https:…     7
 9    15 173346 7 Wonde…  2015    16    8.11    7.98   69472 /boa… https:…     8
10    35  31260 Agricola  2007    36    7.93    7.81   66093 /boa… https:…     9
# … with 1,081 more rows, 21 more variables: primary <chr>, description <chr>,
#   yearpublished <dbl>, minplayers <dbl>, maxplayers <dbl>, playingtime <dbl>,
#   minplaytime <dbl>, maxplaytime <dbl>, minage <dbl>,
#   boardgamecategory <chr>, boardgamemechanic <chr>, boardgamefamily <chr>,
#   boardgameexpansion <chr>, boardgameimplementation <chr>,
#   boardgamedesigner <chr>, boardgameartist <chr>, boardgamepublisher <chr>,
#   owned <dbl>, trading <dbl>, wanting <dbl>, wishing <dbl>, and abbreviated …

В колонке boardgamecategory перечислено по несколько жанров для каждой категории. Нам нужно что-то с этим сделать, чтобы анализировать категории игр: сделайте длинный датафрейм, в каждой строчке которого будет уникальное сочетание игры и категории (соответственно, может быть несколько строчек для одной игры).

Повторяющиеся сочетания (такие есть) необходимо удалить.

Для этого, вам нужно для начала немного модифицировать колонку boardgamecategory, для начала удалив из нее символы [, |, ]. Воспользуйтесь для этого пакетом stringr, а вот нужную функцию найдите самостоятельно! В качестве паттерна для удаления выбранных значений можете воспользоваться регулярным выражением "\\[|'|\\]".

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id") %>%
  transmute(name, boardgamecategory = str_remove_all(boardgamecategory, "\\[|'|\\]")) %>%
  separate_rows(boardgamecategory, sep = ", ") %>%
  distinct()
# A tibble: 3,396 × 2
   name        boardgamecategory 
   <chr>       <chr>             
 1 Pandemic    Medical           
 2 Carcassonne City Building     
 3 Carcassonne Medieval          
 4 Carcassonne Territory Building
 5 Catan       Economic          
 6 Catan       Negotiation       
 7 7 Wonders   Ancient           
 8 7 Wonders   Card Game         
 9 7 Wonders   City Building     
10 7 Wonders   Civilization      
# … with 3,386 more rows

Сделайте широкую табличку, где каждая строчка будет означать игру, а в колонках будут содержаться логичесие значения: TRUE – игра принадлежит категории, FALSE – игра не принадлежит категории.

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id") %>%
  transmute(name, boardgamecategory = str_remove_all(boardgamecategory, "\\[|'|\\]")) %>%
  separate_rows(boardgamecategory, sep = ", ") %>%
  distinct() %>%
  mutate(value = TRUE) %>%
  pivot_wider(names_from = boardgamecategory, 
              values_from = value,
              values_fill = FALSE)
# A tibble: 1,085 × 82
   name  Medical City …¹ Medie…² Terri…³ Econo…⁴ Negot…⁵ Ancient Card …⁶ Civil…⁷
   <chr> <lgl>   <lgl>   <lgl>   <lgl>   <lgl>   <lgl>   <lgl>   <lgl>   <lgl>  
 1 Pand… TRUE    FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE  
 2 Carc… FALSE   TRUE    TRUE    TRUE    FALSE   FALSE   FALSE   FALSE   FALSE  
 3 Catan FALSE   FALSE   FALSE   FALSE   TRUE    TRUE    FALSE   FALSE   FALSE  
 4 7 Wo… FALSE   TRUE    FALSE   FALSE   TRUE    FALSE   TRUE    TRUE    TRUE   
 5 Domi… FALSE   FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE  
 6 Tick… FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE  
 7 Code… FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   TRUE    FALSE  
 8 Terr… FALSE   FALSE   FALSE   TRUE    TRUE    FALSE   FALSE   FALSE   FALSE  
 9 7 Wo… FALSE   TRUE    FALSE   FALSE   TRUE    FALSE   TRUE    TRUE    TRUE   
10 Agri… FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   FALSE   FALSE  
# … with 1,075 more rows, 72 more variables: Trains <lgl>, Deduction <lgl>,
#   `Party Game` <lgl>, `Spies/Secret Agents` <lgl>, `Word Game` <lgl>,
#   Environmental <lgl>, `Industry / Manufacturing` <lgl>,
#   `Science Fiction` <lgl>, `Space Exploration` <lgl>, Animals <lgl>,
#   Farming <lgl>, Renaissance <lgl>, Fighting <lgl>, Miniatures <lgl>,
#   Fantasy <lgl>, `Abstract Strategy` <lgl>, Puzzle <lgl>, Dice <lgl>,
#   `Movies / TV / Radio theme` <lgl>, Educational <lgl>, Humor <lgl>, …

Посчитайте, сколько игры в каждой категории, составьте топ от наиболее крупных категорий, до самых мелких.

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id") %>%
  transmute(boardgamecategory = str_remove_all(boardgamecategory, "\\[|'|\\]")) %>%
  separate_rows(boardgamecategory, sep = ", ") %>%
  count(boardgamecategory, sort = TRUE)
# A tibble: 81 × 2
   boardgamecategory     n
   <chr>             <int>
 1 Card Game           324
 2 Fantasy             208
 3 Economic            177
 4 Fighting            162
 5 Science Fiction     125
 6 Adventure           111
 7 Medieval            101
 8 Exploration          99
 9 City Building        92
10 Bluffing             91
# … with 71 more rows

Теперь посчитайте не только количество игр по категории, но и их среднюю оценку, а также самую высокооцененную игру.

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id") %>%
  mutate(boardgamecategory = str_remove_all(boardgamecategory, "\\[|'|\\]")) %>%
  separate_rows(boardgamecategory, sep = ", ") %>%
  arrange(desc(average)) %>%
  group_by(boardgamecategory) %>%
  summarise(n = n(),
            mean_average = mean(average),
            highest_score_game = first(name)) %>%
  arrange(desc(n))
# A tibble: 81 × 4
   boardgamecategory     n mean_average highest_score_game                      
   <chr>             <int>        <dbl> <chr>                                   
 1 Card Game           324         7.03 Through the Ages: A New Story of Civili…
 2 Fantasy             208         7.27 Gloomhaven                              
 3 Economic            177         7.48 Twilight Imperium: Fourth Edition       
 4 Fighting            162         7.27 Gloomhaven                              
 5 Science Fiction     125         7.42 Twilight Imperium: Fourth Edition       
 6 Adventure           111         7.39 Gloomhaven                              
 7 Medieval            101         7.29 Tainted Grail: The Fall of Avalon       
 8 Exploration          99         7.31 Gloomhaven                              
 9 City Building        92         7.32 On Mars                                 
10 Bluffing             91         7.00 Dune                                    
# … with 71 more rows

Наконец, посчитайте минимальное значение (min()), медиану (median()), среднее (mean()) и максимальное значение (max()) для каждой числовой колонки и для каждой категории игр.

Подсмотреть код (но лучше решите сами!)
ratings_topgames %>%
  left_join(details, by = "id") %>%
  mutate(boardgamecategory = str_remove_all(boardgamecategory, "\\[|'|\\]")) %>%
  separate_rows(boardgamecategory, sep = ", ") %>%
  group_by(boardgamecategory) %>%
  summarise(n = n(), across(where(is.numeric), list(min = min,
                                           median = median, 
                                           mean = mean, 
                                           max = max)))
# A tibble: 81 × 82
   boardga…¹     n num.x…² num.x…³ num.x…⁴ num.x…⁵ id_min id_me…⁶ id_mean id_max
   <chr>     <int>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>   <dbl>  <dbl>
 1 "\"Child…    36     406   1806    8702.   21829    150  17191   57395. 226320
 2 "Abstrac…    69      57    849    2666.   21829      3   7854   83793. 300877
 3 "Action …    32      62    973    2656.   21820    150  98066   91753. 233020
 4 "Adventu…   111       0    434     659.    5691    699 127398  123460. 312484
 5 "Age of …     9      10    384     428.     816   9217  79828   93968. 244711
 6 "America…     2     442    696     696      950    551  60028.  60028. 119506
 7 "America…     2     384    396.    396.     409  79828 104412  104412  128996
 8 "America…     1     409    409     409      409 128996 128996  128996  128996
 9 "America…    15      11    769     758.    1575    878 143741  112098. 232405
10 "Ancient"    60      15    452.    576.    2011     12  56710. 101384. 312484
# … with 71 more rows, 72 more variables: year_min <dbl>, year_median <dbl>,
#   year_mean <dbl>, year_max <dbl>, rank_min <dbl>, rank_median <dbl>,
#   rank_mean <dbl>, rank_max <dbl>, average_min <dbl>, average_median <dbl>,
#   average_mean <dbl>, average_max <dbl>, bayes_average_min <dbl>,
#   bayes_average_median <dbl>, bayes_average_mean <dbl>,
#   bayes_average_max <dbl>, users_rated_min <dbl>, users_rated_median <dbl>,
#   users_rated_mean <dbl>, users_rated_max <dbl>, num.y_min <dbl>, …