arthur.bebou

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 %