Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
starcraft.sh (11689B)
1 #! page 2 title: Analyses plus poussées 3 author: Arthur Pons 4 description: Explorons comment obtenir des résultats plus avancés avec nos outils 5 publication: 2023-10-20 6 sectionmd: main 7 8 9 Je copie un [article analysant des données à propos d'un tournoi de 10 starcraft] pour illustrer d'autres possibilités. 11 12 APM moyen 13 14 tsv-summarize -H --mean AvgAPM --group-by Year IEM_games.tsv | 15 sed 's/\.[0-9]*//' | 16 tail -n+2 > data 17 gnuplot -p -e "set title 'APM Moyen par année'; 18 set xlabel 'Années'; 19 set ylabel 'APM'; 20 set offsets 1,1,5,5; 21 plot 'data' w lp lw 2 ps 2 notitle, 'data' using 1:2:2 w labels offset -0.5,1 notitle" 22 23 Pour la suite il suffit de modifier la colonne concernée. 24 25 Les maps les plus jouées, plutôt facile sans tsv-utils : 26 27 cut -f7 IEM_games.tsv | sort | uniq -c | sort -nr | head 28 128 BlackpinkLE 29 96 CatalystLE 30 94 TritonLE 31 91 PortAleksanderLE 32 91 EphemeronLE 33 89 AbyssalReefLE 34 80 KairosJunctionLE 35 79 NightshadeLE 36 73 CyberForestLE 37 69 EternalEmpireLE 38 39 On enlève le `-r` du `sort` pour avoir les maps les moins jouées. 40 41 Cartes avec les temps moyens de jeu les plus longs. Là ça se complique pour les conversions. 42 J'utilise volontairement `sed` pour convertir en secondes puis `awk` pour convertir en `mm:ss` 43 pour montrer qu'il est possible d'utiliser les deux. 44 45 cut -f8 IEM_games.tsv | tail -n+2 | 46 sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' | 47 bc -l | 48 sed '1 s/^/seconds\n/' | 49 paste IEM_games.tsv - | 50 tsv-summarize -H --mean seconds --group-by MapName | 51 sed 's/\.[0-9]*//' | 52 sort -t' ' -nrk2 | 53 awk -F'\t' '{printf $1" "(int($2/60))":"; 54 printf "%02d\n", ($2%60)}' | 55 head | tsv-pretty 56 [ESL]Hardwire 16:27 57 [ESL]Gresvan 14:44 58 [ESL]Berlingrad 14:05 59 RomanticideLE 14:04 60 EternalEmpireLE 14:01 61 DuskTowers 14:01 62 JagannathaLE 13:57 63 2000AtmospheresLE 13:53 64 DeathauraLE 13:31 65 [ESL]GlitteringAshes 13:05 66 67 Correlation entre la fréquence de choix des cartes et la durée des parties ? 68 69 cut -f8 IEM_games.tsv | tail -n+2 | 70 sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' | 71 bc -l | 72 sed '1 s/^/seconds\n/' | 73 paste IEM_games.tsv - | 74 tsv-summarize -H --mean seconds --group-by MapName | 75 sed 's/\.[0-9]*//' | 76 sort -t' ' -nrk2 | 77 head -n-1 | 78 sort > a 79 cut -f7 IEM_games.tsv | tail -n+2 | 80 tsv-summarize --count --g 1 | 81 sort > b 82 join -t' ' -j 1 a b > data 83 gnuplot -p -e "f(x) = a*x + b; 84 fit f(x) 'data' using 3:2 via a,b; 85 plot 'data' using 3:2 with points ps 1 pt 7 notitle, 86 f(x) ls 2 t sprintf('Régression linéaire %g*x+%g',a,b)" 87 88 ![Corrélation entre la longueur des matches joués sur une carte et la fréquence à laquelle elle est choisie](corr-carte-long.png) 89 90 Les box plot des certaines métriques selon le matchup : 91 92 cut -f11,14 IEM_games.tsv | tail -n+2 | sort > data 93 gnuplot -p -e "set style fill solid 0.50 border lt -1; 94 set pointsize 0.5; 95 set lt 51 lc 'dark-red'; set lt 52 lc 'midnight-blue'; 96 set lt 53 lc 'dark-plum'; set lt 54 lc 'orchid4'; 97 set lt 55 lc 'olive'; set lt 56 lc 'sea-green'; 98 plot 'data' using (2):2:(0):1 with boxplot lt 51 lc variable notitle" 99 100 ![Diagramme en moustache des APMS moyens des matchs selon leurs matchups](box-apm.png) 101 102 Même chose pour les autres variables en changeant le second champ du `cut`. 103 104 Pour la durée moyenne de match par matchup on reprend ce que l'on avait 105 écrit précedemment, on retire le calcul de la moyenne et ce qui suit, 106 on sélectionne le matchup et la durée en second, on tri, on affiche : 107 108 cut -f8 IEM_games.tsv | tail -n+2 | 109 sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' | 110 bc -l | 111 sed '1 s/^/seconds\n/' | 112 paste IEM_games.tsv - | 113 cut -f11,26 | 114 sort | 115 gnuplot -p -e "set style fill solid 0.50 border lt -1; 116 set pointsize 0.5; 117 set lt 51 lc 'dark-red'; set lt 52 lc 'midnight-blue'; 118 set lt 53 lc 'dark-plum'; set lt 54 lc 'orchid4'; 119 set lt 55 lc 'olive'; set lt 56 lc 'sea-green'; 120 plot '-' using (2):2:(0):1 with boxplot lt 51 lc variable notitle" 121 122 ![Diagramme en moustache de la durée moyenne des matchs par matchup](box-secondes.png) 123 124 Les joueurs les plus jeunes 125 126 awk -F' ' '$4' IEM_players_info.tsv | 127 sort -t' ' -rk4 | 128 head | 129 cut -f1,4 > data 130 cut -f1 data | 131 xargs -I{} grep -m1 {} IEM_players.tsv | 132 cut -f5 | 133 paste data - > data2 134 cut -f2,3 data2 | tail -n+2 | 135 sed -E 's/([^\-]+).* ([0-9]*)/\2 - \1/' | 136 bc -l | 137 sed '1 s/^/Age\n/' | 138 paste data2 - | 139 cut -f1,3,4 | column -ts' ' 140 Player Year Age 141 KRYSTIANER 2020 16 142 REYNOR 2019 17 143 CLEM 2019 17 144 GOBLIN 2019 17 145 WAYNE 2020 19 146 SKILLOUS 2019 18 147 VINDICTA 2020 20 148 OLIVEIRA 2021 21 149 COFFEE 2023 24 150 151 Les joueurs les plus âgés 152 153 awk -F' ' '$4' IEM_players_info.tsv | 154 sort -t' ' -k4 | 155 head | 156 cut -f1,4 > data 157 cut -f1 data | 158 xargs -I{} grep -m1 {} IEM_players.tsv | 159 cut -f5 | 160 paste data - > data2 161 cut -f2,3 data2 | tail -n+2 | 162 sed -E 's/([^\-]+).* ([0-9]*)/\2 - \1/' | 163 bc -l | 164 paste data2 - | 165 cut -f1,3,4 | column -ts' ' 166 DIMAGA 2020 32 167 BRATOK 2019 30 168 NIGHTEND 2018 28 169 POLT 2016 29 170 KAS 2017 28 171 PIG 2016 27 172 BLY 2016 27 173 HUK 2016 28 174 KRR 2017 28 175 176 La moyenne des APM par année de compétition 177 178 cut -f2- IEM_players.tsv > data 179 tsv-join --filter-file IEM_players_info.tsv -k 1 -a 4 data | 180 cut -f4,14 | 181 cut -d'-' -f1 | tr ' ' '-' | tail -n+2 | 182 sed -E 's/^[0-9]+-$/print "no data\n"/' | 183 bc -l | sed '1 s/^/Age\n/' | 184 paste data - | cut -f4,14 | sed 's/no data//' | 185 tsv-summarize -H -x --mean 2 -g 1 | tail -n+2 | 186 sed -E 's/(\.[0-9])[0-9]*/\1/' > data2 187 gnuplot -p -e "set offset 1,1,0.5,0.5;plot 'data2' w lp notitle 188 , '' using 1:2:2 w labels offset 0,1 notitle" 189 190 ![Moyenne des APM par année de compétition](apm-par-annee.png) 191 192 Année de naissance moyenne par région 193 194 cut -f4,5 IEM_players_info.tsv | awk -F'\t' '$1' | awk -F'\t' '$2' | 195 sed -E 's/(-[0-9]{2}){2}//' | 196 sed -E 's/(US|MX|CA|BR)/America/; 197 s/KR/Korea/; 198 s/(AU|TW|CN|RU)/Asia/; 199 s/[A-Z]{2}$/Europe/' | 200 tsv-summarize -H --mean 1 -g 2 | tail -n+2 | sort > data 201 gnuplot -p -e "set style fill solid; 202 set yrange [1990:1998]; 203 plot 'data' using 2:xtic(1) w histogram" 204 205 ![Date de naissance moyenne par région](naissance-region.png) 206 207 208 Nombre de joueur par région 209 210 cut -f5 IEM_players_info.tsv | awk -F'\t' '$1' | 211 sed -E 's/(-[0-9]{2}){2}//' | 212 sed -E 's/(US|MX|CA|BR)/America/; 213 s/KR/Korea/; 214 s/(AU|TW|CN|RU)/Asia/; 215 s/[A-Z]{2}$/Europe/' | 216 tsv-summarize -H --count -g 1 | tail -n+2 > data 217 gnuplot -p -e "set style fill solid; 218 plot 'data' using 2:xtic(1) w histogram" 219 220 221 ![Nombre de joueurs par région](nb-par-region.png) 222 223 Joueurs ayant joué le plus de secondes 224 225 cut -f7 IEM_players.tsv | tail -n+2 | 226 sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' | 227 bc -l | 228 sed '1 s/^/seconds\n/' | 229 paste IEM_players.tsv - | 230 tsv-summarize -H --sum seconds -g Player | 231 sort -t' ' -nrk2 232 233 SERRAL 108508 234 SOLAR 106093 235 MARU 105444 236 DARK 105327 237 HEROMARINE 86769 238 ... 239 240 Joueurs avec les parties les plus longues en moyenne 241 242 cut -f7 IEM_players.tsv | tail -n+2 | 243 sed -E 's/^([0-9]+):([0-9]+)/\1*60+\2/' | 244 bc -l | 245 sed '1 s/^/seconds\n/' | 246 paste IEM_players.tsv - | 247 tsv-summarize -H --mean seconds -g Player | 248 sort -t' ' -nrk2 249 250 PERCIVAL 1038.75 251 MATIZ 1014 252 VINDICTA 946.571428571 253 KEEN 897 254 MARINELORD 884.909090909 255 SPIRIT 874.178571429 256 CURE 871.394366197 257 ... 258 259 APM moyen par joueur à travers toutes les compéitions. Bonne exemple de comment 260 et pourquoi tsv-utils parfois c'est vraiment bien : 261 262 tsv-summarize -H --mean APM -g Player IEM_players.tsv | 263 sort -t' ' -nrk2 264 265 TLO 584.472222222 266 REYNOR 414.126213592 267 DRG 400.565217391 268 RAGNAROK 391.613636364 269 ... 270 271 vs 272 273 cut -f2 IEM_players.tsv | tail -n+2 | 274 sort -u | 275 xargs -d'\n' -n1 sh -c 'printf "$1 "; 276 data=$(grep "$1" IEM_players.tsv); 277 echo "$(echo "$data" | cut -f9 | paste -s -d'+' | bc -l)\ 278 / $(echo "$data" | wc -l)" | 279 bc -l' -- | 280 sort -t' ' -nrk2 281 282 TLO 584.47222222222222222222 283 REYNOR 414.12621359223300970873 284 DRG 400.56521739130434782608 285 RAGNAROK 391.61363636363636363636 286 ... 287 288 Les victoires 289 290 grep ' V ' IEM_players.tsv | 291 cut -f2 | 292 tsv-summarize --count -g1 | 293 sort -t' ' -nrk2 294 295 SERRAL 93 296 MARU 84 297 DARK 82 298 SOLAR 76 299 ... 300 301 Corrélation APM victoires 302 303 grep ' V ' IEM_players.tsv | 304 cut -f2 | 305 tsv-summarize --count -g1 | sort > wins 306 tsv-summarize -H --mean APM --group-by Player IEM_players.tsv | 307 sed 's/\.[0-9]*//' | 308 tail -n+2 | 309 sort | 310 join -t' ' -j 1 wins - > data 311 gnuplot -p -e "f(x) = a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f; 312 fit f(x) 'data' using 2:3 via a,b,c,d,e,f; 313 plot 'data' using 2:3 with points ps 1 pt 7 notitle, 314 f(x) ls 2 t 'Regression'" 315 316 ![Corrélation entre les APM et la quantité de victoires](corr-apm-win.png) 317 318 Pareil avec les SPM 319 320 tsv-summarize -H --mean SPM --group-by Player IEM_players.tsv | 321 sed 's/\.[0-9]*//' | 322 tail -n+2 | 323 sort | 324 join -t' ' -j 1 wins - > data 325 gnuplot -p -e "f(x) = a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f; 326 fit f(x) 'data' using 2:3 via a,b,c,d,e,f; 327 plot 'data' using 2:3 with points ps 1 pt 7 notitle, 328 f(x) ls 2 t 'Regression'" 329 330 ![Corrélation entre les SQM et la quantité de victoire](corr-spm-win.png) 331 332 333 A nouveau la corrélation entre les APM et la quantité de victoire mais avec la 334 taille des points étant vaguement proportionnelle à la quantité de map jouées 335 et la couleur correspondant à la race du joueur[^1] : 336 337 grep ' V ' IEM_players.tsv | 338 cut -f2 | 339 tsv-summarize --count -g1 | sort > wins 340 tsv-summarize -H --mean APM --group-by Player IEM_players.tsv | 341 sed 's/\.[0-9]*//' | 342 tail -n+2 | 343 sort -k1 > apm 344 tsv-summarize -H --count -g Player IEM_players.tsv | 345 sort -k1 > nbgames 346 cut -f2,8 IEM_players.tsv | 347 sort -u | sort -t' ' -k1 > race 348 join -t' ' -j1 wins apm | 349 join -t' ' -j1 - nbgames | 350 join -t' ' -j1 - race 2>/dev/null | 351 sed 's/T$/6/;s/P$/5/;s/Z$/1/' > data 352 gnuplot -p -e "f(x) = a*x**2+b*x+c; 353 fit f(x) 'data' using 2:3 via a,b,c; 354 plot 'data' using 2:3:(\$4/30)::5 w points lc variable ps variable pt 7 notitle, 355 f(x) ls 2 t sprintf('%gx²+%gx+%g',a,b,c)" 356 357 Avec le même jeu de données on peut faire d'autres choses : 358 359 gnuplot -p -e "f(x) = a*x**2+b*x+c; 360 fit f(x) 'data' using 2:3 via a,b,c; 361 plot f(x) ls 2 t sprintf('%gx²+%gx+%g',a,b,c), 362 'data' using 2:3:1:5 w labels tc var font ',10'" 2> /dev/null 363 364 ![Corrélation entre les APM et la quantité de victoire mais plus jolie](corr-apm-win-joli.png) 365 366 367 On peut aussi mettre des conditions sur le fait d'afficher certaines choses ou 368 pas. Par exemple ici corrélation entre la quantité de parties jouées et le 369 nombre de parties gagnées avec les noms affichés pour les personnes ayant joué 370 plus de 25 maps et ayant un win rate meilleur que 60% ou un win rate inférieur 371 à 0.4 : 372 373 gnuplot -p -e 'f(x)=x/2; 374 g(x)=a*x**2+b*x+c; 375 fit g(x) "data" using 4:2 via a,b,c; 376 plot "data" using 4:2:::5 w p lc variable ps 1 pt 7 notitle, 377 "" using 4:($2>25 && ($2/$4>0.6 || $2/$4<0.4) ? $2: NaN):1 w labels offset 0,-0.8 notitle, 378 g(x) ls 2 t "fit"' 2>/dev/null 379 380 ![Corrélation entre parties jouées et parties gagnées](win-rate.png) 381 382 383 [^1]: dans le jeu... 384 [article analysant des données à propos d'un tournoi de starcraft]: https://www.kaggle.com/code/fulviocapra/sc2-iem-katowice-data-analytics 385 %