Des analyses statistiques plus poussées

Auteurice : Arthur Pons

Temps de lecture : ~2 minutes


Je copie un article analysant des données à propos d’un tournoi de starcraft pour illustrer d’autres possibilités.

APM moyen

tsv-summarize -H --mean AvgAPM --group-by Year IEM_games.tsv |
    sed 's/\.[0-9]*//' |
    tail -n+2 > data
    gnuplot -p -e "set title 'APM Moyen par année';
                   set xlabel 'Années';
                   set ylabel 'APM';
                   set offsets 1,1,5,5;
                   plot 'data' w lp lw 2 ps 2 notitle, 'data' using 1:2:2 w labels offset -0.5,1 notitle"

Pour la suite il suffit de modifier la colonne concernée.

Les maps les plus jouées, plutôt facile sans tsv-utils :

cut -f7 IEM_games.tsv | sort | uniq -c | sort -nr | head
    128 BlackpinkLE
     96 CatalystLE
     94 TritonLE
     91 PortAleksanderLE
     91 EphemeronLE
     89 AbyssalReefLE
     80 KairosJunctionLE
     79 NightshadeLE
     73 CyberForestLE
     69 EternalEmpireLE

On enlève le -r du sort pour avoir les maps les moins jouées.

Cartes avec les temps moyens de jeu les plus longs. Là ça se complique pour les conversions. J’utilise volontairement sed pour convertir en secondes puis awk pour convertir en mm:ss pour montrer qu’il est possible d’utiliser les deux.

cut -f8 IEM_games.tsv | tail -n+2 |
    sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' |
    bc -l |
    sed '1 s/^/seconds\n/' |
    paste IEM_games.tsv - |
    tsv-summarize -H --mean seconds --group-by MapName |
    sed 's/\.[0-9]*//' |
    sort -t'    ' -nrk2 |
    awk -F'\t' '{printf $1" "(int($2/60))":";
                 printf "%02d\n", ($2%60)}' |
    head | tsv-pretty
[ESL]Hardwire         16:27
[ESL]Gresvan          14:44
[ESL]Berlingrad       14:05
RomanticideLE         14:04
EternalEmpireLE       14:01
DuskTowers            14:01
JagannathaLE          13:57
2000AtmospheresLE     13:53
DeathauraLE           13:31
[ESL]GlitteringAshes  13:05

Correlation entre la fréquence de choix des cartes et la durée des parties ?

cut -f8 IEM_games.tsv | tail -n+2 |
    sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' |
    bc -l |
    sed '1 s/^/seconds\n/' |
    paste IEM_games.tsv - |
    tsv-summarize -H --mean seconds --group-by MapName |
    sed 's/\.[0-9]*//' |
    sort -t'    ' -nrk2 |
    head -n-1 |
    sort > a
cut -f7 IEM_games.tsv | tail -n+2 |
    tsv-summarize --count --g 1 |
    sort > b
join -t'    ' -j 1 a b > data
gnuplot -p -e "f(x) = a*x + b;
               fit f(x) 'data' using 3:2 via a,b;
               plot 'data' using 3:2 with points ps 1 pt 7 notitle,
               f(x) ls 2 t sprintf('Régression linéaire %g*x+%g',a,b)"

Corrélation entre la longueur des matches joués sur une carte et la fréquence à laquelle elle est choisie

Les box plot des certaines métriques selon le matchup :

cut -f11,14 IEM_games.tsv | tail -n+2 | sort > data
gnuplot -p -e "set style fill   solid 0.50 border lt -1;
               set pointsize 0.5;
               set lt 51 lc 'dark-red'; set lt 52 lc 'midnight-blue';
               set lt 53 lc 'dark-plum'; set lt 54 lc 'orchid4';
               set lt 55 lc 'olive'; set lt 56 lc 'sea-green';
               plot 'data' using (2):2:(0):1 with boxplot lt 51 lc variable notitle"

Diagramme en moustache des APMS moyens des matchs selon leurs matchups

Même chose pour les autres variables en changeant le second champ du cut.

Pour la durée moyenne de match par matchup on reprend ce que l’on avait écrit précedemment, on retire le calcul de la moyenne et ce qui suit, on sélectionne le matchup et la durée en second, on tri, on affiche :

cut -f8 IEM_games.tsv | tail -n+2 |
    sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' |
    bc -l |
    sed '1 s/^/seconds\n/' |
    paste IEM_games.tsv - |
    cut -f11,26 |
    sort |
    gnuplot -p -e "set style fill   solid 0.50 border lt -1;
                   set pointsize 0.5;
                   set lt 51 lc 'dark-red'; set lt 52 lc 'midnight-blue';
                   set lt 53 lc 'dark-plum'; set lt 54 lc 'orchid4';
                   set lt 55 lc 'olive'; set lt 56 lc 'sea-green';
                   plot '-' using (2):2:(0):1 with boxplot lt 51 lc variable notitle"

Diagramme en moustache de la durée moyenne des matchs par matchup

Les joueurs les plus jeunes

awk -F' ' '$4' IEM_players_info.tsv |
    sort -t'    ' -rk4 |
    head |
    cut -f1,4 > data
cut -f1 data |
    xargs -I{} grep -m1 {} IEM_players.tsv |
    cut -f5 |
    paste data - > data2
cut -f2,3 data2 | tail -n+2 |
    sed -E 's/([^\-]+).*    ([0-9]*)/\2 - \1/' |
    bc -l |
    sed '1 s/^/Age\n/' |
    paste data2 - |
    cut -f1,3,4 | column -ts'   '
Player      Year  Age
KRYSTIANER  2020  16
REYNOR      2019  17
CLEM        2019  17
GOBLIN      2019  17
WAYNE       2020  19
SKILLOUS    2019  18
VINDICTA    2020  20
OLIVEIRA    2021  21
COFFEE      2023  24

Les joueurs les plus âgés

awk -F' ' '$4' IEM_players_info.tsv |
    sort -t'    ' -k4 |
    head |
    cut -f1,4 > data
cut -f1 data |
    xargs -I{} grep -m1 {} IEM_players.tsv |
    cut -f5 |
    paste data - > data2
cut -f2,3 data2 | tail -n+2 |
    sed -E 's/([^\-]+).*    ([0-9]*)/\2 - \1/' |
    bc -l |
    paste data2 - |
    cut -f1,3,4 | column -ts'   '
DIMAGA    2020  32
BRATOK    2019  30
NIGHTEND  2018  28
POLT      2016  29
KAS       2017  28
PIG       2016  27
BLY       2016  27
HUK       2016  28
KRR       2017  28

La moyenne des APM par année de compétition

cut -f2- IEM_players.tsv > data
tsv-join --filter-file IEM_players_info.tsv -k 1 -a 4 data |
    cut -f4,14 |
    cut -d'-' -f1 | tr '    ' '-' | tail -n+2 |
    sed -E 's/^[0-9]+-$/print "no data\n"/' |
    bc -l | sed '1 s/^/Age\n/' |
    paste data - | cut -f4,14 | sed 's/no data//' |
    tsv-summarize -H -x --mean 2 -g 1 | tail -n+2 |
    sed -E 's/(\.[0-9])[0-9]*/\1/' > data2
    gnuplot -p -e "set offset 1,1,0.5,0.5;plot 'data2' w lp notitle
                   , '' using 1:2:2 w labels offset 0,1 notitle"

Moyenne des APM par année de compétition

Année de naissance moyenne par région

cut -f4,5 IEM_players_info.tsv | awk -F'\t' '$1' | awk -F'\t' '$2' |
    sed -E 's/(-[0-9]{2}){2}//' |
    sed -E 's/(US|MX|CA|BR)/America/;
            s/KR/Korea/;
            s/(AU|TW|CN|RU)/Asia/;
            s/[A-Z]{2}$/Europe/' |
    tsv-summarize -H --mean 1 -g 2 | tail -n+2 | sort > data
    gnuplot -p -e "set style fill solid;
                   set yrange [1990:1998];
                   plot 'data' using 2:xtic(1) w histogram"

Date de naissance moyenne par région

Nombre de joueur par région

cut -f5 IEM_players_info.tsv | awk -F'\t' '$1' |
    sed -E 's/(-[0-9]{2}){2}//' |
    sed -E 's/(US|MX|CA|BR)/America/;
            s/KR/Korea/;
            s/(AU|TW|CN|RU)/Asia/;
            s/[A-Z]{2}$/Europe/' |
    tsv-summarize -H --count -g 1 | tail -n+2 > data
    gnuplot -p -e "set style fill solid;
                   plot 'data' using 2:xtic(1) w histogram"

Nombre de joueurs par région

Joueurs ayant joué le plus de secondes

cut -f7 IEM_players.tsv | tail -n+2 |
    sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' |
    bc -l |
    sed '1 s/^/seconds\n/' |
    paste IEM_players.tsv - |
    tsv-summarize -H --sum seconds -g Player |
    sort -t'    ' -nrk2

SERRAL      108508
SOLAR       106093
MARU        105444
DARK        105327
HEROMARINE  86769
...

Joueurs avec les parties les plus longues en moyenne

cut -f7 IEM_players.tsv | tail -n+2 |
    sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' |
    bc -l |
    sed '1 s/^/seconds\n/' |
    paste IEM_players.tsv - |
    tsv-summarize -H --mean seconds -g Player |
    sort -t'    ' -nrk2

PERCIVAL    1038.75
MATIZ       1014
VINDICTA    946.571428571
KEEN        897
MARINELORD  884.909090909
SPIRIT      874.178571429
CURE        871.394366197
...

APM moyen par joueur à travers toutes les compéitions. Bonne exemple de comment et pourquoi tsv-utils parfois c’est vraiment bien :

tsv-summarize -H --mean APM -g Player IEM_players.tsv |
    sort -t'    ' -nrk2

TLO       584.472222222
REYNOR    414.126213592
DRG       400.565217391
RAGNAROK  391.613636364
...

vs

cut -f2 IEM_players.tsv | tail -n+2 |
    sort -u |
    xargs -d'\n' -n1 sh -c 'printf "$1  ";
                            data=$(grep "$1" IEM_players.tsv);
                            echo "$(echo "$data" | cut -f9 | paste -s -d'+' | bc -l)\
                                  / $(echo "$data" | wc -l)" |
                            bc -l' -- |
    sort -t'    ' -nrk2

TLO       584.47222222222222222222
REYNOR    414.12621359223300970873
DRG       400.56521739130434782608
RAGNAROK  391.61363636363636363636
...

Les victoires

grep '  V   ' IEM_players.tsv |
    cut -f2 |
    tsv-summarize --count -g1 |
    sort -t'    ' -nrk2

SERRAL  93
MARU    84
DARK    82
SOLAR   76
...

Corrélation APM victoires

grep '  V   ' IEM_players.tsv |
    cut -f2 |
    tsv-summarize --count -g1 | sort > wins
tsv-summarize -H --mean APM --group-by Player IEM_players.tsv |
    sed 's/\.[0-9]*//' |
    tail -n+2 |
    sort |
    join -t'    ' -j 1 wins - > data
gnuplot -p -e "f(x) = a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f;
               fit f(x) 'data' using 2:3 via a,b,c,d,e,f;
               plot 'data' using 2:3 with points ps 1 pt 7 notitle,
               f(x) ls 2 t 'Regression'"

Corrélation entre les APM et la quantité de victoires

Pareil avec les SPM

tsv-summarize -H --mean SPM --group-by Player IEM_players.tsv |
    sed 's/\.[0-9]*//' |
    tail -n+2 |
    sort |
    join -t'    ' -j 1 wins - > data
gnuplot -p -e "f(x) = a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f;
               fit f(x) 'data' using 2:3 via a,b,c,d,e,f;
               plot 'data' using 2:3 with points ps 1 pt 7 notitle,
               f(x) ls 2 t 'Regression'"

Corrélation entre les SQM et la quantité de victoire

A nouveau la corrélation entre les APM et la quantité de victoire mais avec la taille des points étant vaguement proportionnelle à la quantité de map jouées et la couleur correspondant à la race du joueur1 :

grep '  V   ' IEM_players.tsv |
    cut -f2 |
    tsv-summarize --count -g1 | sort > wins
tsv-summarize -H --mean APM --group-by Player IEM_players.tsv |
    sed 's/\.[0-9]*//' |
    tail -n+2 |
    sort -k1 > apm
tsv-summarize -H --count -g Player IEM_players.tsv |
    sort -k1 > nbgames
cut -f2,8 IEM_players.tsv |
    sort -u | sort -t'  ' -k1 > race
join -t'    ' -j1 wins apm |
    join -t'    ' -j1 - nbgames |
    join -t'    ' -j1 - race 2>/dev/null |
    sed 's/T$/6/;s/P$/5/;s/Z$/1/' > data
gnuplot -p -e "f(x) = a*x**2+b*x+c;
               fit f(x) 'data' using 2:3 via a,b,c;
               plot 'data' using 2:3:(\$4/30)::5 w points lc variable ps variable pt 7 notitle,
               f(x) ls 2 t sprintf('%gx²+%gx+%g',a,b,c)"

Avec le même jeu de données on peut faire d’autres choses :

gnuplot -p -e "f(x) = a*x**2+b*x+c;
               fit f(x) 'data' using 2:3 via a,b,c;
               plot f(x) ls 2 t sprintf('%gx²+%gx+%g',a,b,c),
               'data' using 2:3:1:5 w labels tc var font ',10'" 2> /dev/null

Corrélation entre les APM et la quantité de victoire mais plus jolie

On peut aussi mettre des conditions sur le fait d’afficher certaines choses ou pas. Par exemple ici corrélation entre la quantité de parties jouées et le nombre de parties gagnées avec les noms affichés pour les personnes ayant joué plus de 25 maps et ayant un win rate meilleur que 60% ou un win rate inférieur à 0.4 :

gnuplot -p -e 'f(x)=x/2;
               g(x)=a*x**2+b*x+c;
               fit g(x) "data" using 4:2 via a,b,c;
               plot "data" using 4:2:::5 w p lc variable ps 1 pt 7 notitle,
               "" using 4:($2>25 && ($2/$4>0.6 || $2/$4<0.4) ? $2: NaN):1 w labels offset 0,-0.8 notitle,
               g(x) ls 2 t "fit"' 2>/dev/null

Corrélation entre parties jouées et parties gagnées


  1. dans le jeu…