Op playgwent.com worden gegevens over spelers in de Pro Ladder gepubliceerd, maar die zijn beperkt. Je krijgt de rang, de score, het land van herkomst en het aantal gespeelde wedstrijden. Met enkele vrij eenvoudige technieken voor gegevensanalyse moet er meer uit deze gegevens te halen zijn! Met Python scrapen we gegevens voor de beste Gwent-spelers op de Pro Ladder en berekenen we bijkomende statistieken over het huidige seizoen, de populariteit van het spel in verschillende landen, de efficiëntie en nationale rang van spelers, …
Een Jupyter-notebook met alle code staat op GitHub. Via Binder kun je het verkennen zonder iets te installeren. Wie alleen zijn eigen nationale rang of ladder-efficiëntie-index wil controleren en niet in de code geïnteresseerd is, vindt hier downloadlinks voor de volledige tabellen uit deze post (in Excel-formaat):
- Spelerstatistieken: gegevens per speler en seizoen, aangevuld met ladder-efficiëntie en nationale rang.
- Spelersoverzichten: samenvattende gegevens voor elke speler die in Pro Rank verscheen. Bevat het aantal vermeldingen op de ranglijsten, minimale en maximale MMR, beste rang, beste nationale rang, …
- Seizoensoverzicht: aantal gespeelde wedstrijden per seizoen in Masters 2, minimale en maximale MMR en de drempels voor de top 500, 200 en 64.
- Nationale statistieken: gegevens per land, aantal profspelers per miljoen inwoners, …
Update 04/08/2021: Downloads verwijzen nu naar de pagina Gwent Pro Rank Data, die vaker wordt bijgewerkt.
Update 12/03/2021: Alle bestanden werden bijgewerkt en bevatten nu Season of the Wolf en Season of Love uit Masters 3 (2021).
Update 03/09/2020: Ere wie ere toekomt! Nadat ik deze blogpost online zette, vond ik twee artikels van Lerio2 die ouder waren dan het mijne en waarin hij dezelfde analyse uitvoerde om de populariteit te onderzoeken en landen te rangschikken (op basis van teams van vier spelers). Hoewel ik mijn analyse onafhankelijk uitvoerde, had hij het idee enkele maanden eerder en verdient hij daarvoor alle erkenning! Je kunt zijn artikels, Nations of Gwent, hier en hier lezen. (06/08/2026 - teamlegacy.org is niet langer online; deze links verwijzen naar gearchiveerde kopieën)
De gegevens verzamelen
Python heeft twee krachtige pakketten om gegevens van het web te scrapen: de requests-bibliotheek om gegevens te downloaden en BeautifulSoup om de teruggestuurde HTML te verwerken en er informatie uit te halen. De tabelgegevens van playgwent.com zijn vrij eenvoudig te verwerken. Ze bevatten de rang, de spelersnaam, het aantal gespeelde wedstrijden en de score (die Matchmaking Rating of MMR wordt genoemd).
Daarnaast geeft een vlagpictogram aan uit welk land de speler komt. Deze pictogrammen hebben een klasse met de tweelettercode volgens de officiële internationale ISO 3166- standaard.
<i class="flag-icon flag-icon-pl"></i>
De tweelettercode kan eenvoudig uit de HTML-tag worden gehaald. Met de Python-bibliotheek pycountry zet je die in enkele regels code om naar een leesbare naam. Zoals in het voorbeeld hieronder geef je een tweelettercode op (pl) en krijg je alle andere namen terug, waaronder de gebruikelijke naam (Poland). Na het scrapen gebruikte ik pycountry dus om correcte namen voor alle landen te verkrijgen.
import pycountry
pycountry.countries.get(alpha_2='pl')
# Output:
# Country(alpha_2='PL', alpha_3='POL', name='Poland', numeric='616', official_name='Republic of Poland')
Tijdens het inlezen houden we ook bij welke spelers het vorige seizoen in de top 500 stonden (hiervoor moeten wel alle seizoenen in de juiste volgorde geladen zijn). Zo krijgen we een tabel, in de code full_df genoemd, die er als volgt uitziet:
| rank | name | country | matches | mmr | season | previous_top500 |
|---|---|---|---|---|---|---|
| 1 | kolemoen | Germany | 431 | 10484 | M2_01 Wolf 2020 | no |
| 2 | kams134 | Poland | 923 | 10477 | M2_01 Wolf 2020 | no |
| 3 | TailBot | Poland | 538 | 10472 | M2_01 Wolf 2020 | no |
| 4 | Pajabol | Poland | 820 | 10471 | M2_01 Wolf 2020 | no |
| 5 | Adzikov | Poland | 1105 | 10442 | M2_01 Wolf 2020 | no |
Nationale rang en efficiëntiestatistieken toevoegen
De rang op playgwent.com is de wereldwijde rang. Een nationale rang voeg je met één regel code toe. De
functie groupby in combinatie met rank doet precies wat we nodig hebben.
full_df['national_rank'] = full_df.groupby(['country','season'])["mmr"].rank("first", ascending=False)
In Gwent moet je minstens 25 wedstrijden spelen met vier van de zes facties. Dat levert een basisscore, MMR, van 9600 op. Een overwinning verhoogt de MMR afhankelijk van de huidige rang van je tegenstander (meestal met ongeveer 7 punten), terwijl een nederlaag MMR-punten kost. De hoogste behaalde MMR per factie wordt opgeteld tot de eindscore. Met een hoger winstpercentage kun je dus met minder wedstrijden een betere score behalen. Om te bepalen welke spelers efficiënter klimmen (en mogelijk beter zijn dan anderen met dezelfde MMR), nemen we de MMR, trekken we de basiswaarde 9600 af en delen we door het aantal wedstrijden. Omdat een hogere MMR steeds moeilijker wordt naarmate spelers sterkere tegenstanders treffen op de ladder, stelde Lerio2 van Team Legacy voor om te delen door de vierkantswortel van het aantal wedstrijden. Hun maatstaf, de Ladder Efficiency Index of LEI, wordt hier eveneens berekend.
full_df['efficiency'] = ((full_df['mmr']-9600))/full_df['matches']
full_df['lei'] = ((full_df['mmr']-9600))/np.sqrt(full_df['matches'])
Ons volledige dataframe heeft nu twee extra kolommen: één met de eenvoudige lineaire efficiëntie en één met Team Legacy’s Ladder Efficiency Index.
| rank | name | country | matches | mmr | season | previous_top500 | national_rank | efficiency | lei |
|---|---|---|---|---|---|---|---|---|---|
| 1 | kolemoen | Germany | 431 | 10484 | M2_01 Wolf 2020 | no | 1.0 | 2.051044 | 42.580782 |
| 2 | kams134 | Poland | 923 | 10477 | M2_01 Wolf 2020 | no | 1.0 | 0.950163 | 28.866807 |
| 3 | TailBot | Poland | 538 | 10472 | M2_01 Wolf 2020 | no | 2.0 | 1.620818 | 37.594590 |
| 4 | Pajabol | Poland | 820 | 10471 | M2_01 Wolf 2020 | no | 3.0 | 1.062195 | 30.416639 |
| 5 | Adzikov | Poland | 1105 | 10442 | M2_01 Wolf 2020 | no | 4.0 | 0.761991 | 25.329753 |
Je kunt de volledige tabel hier downloaden.
Seizoensoverzicht
Ongeveer elke maand begint er een nieuw seizoen in Gwent. Met groupby maken we snel een overzicht
van het aantal wedstrijden dat spelers in Pro Rank speelden (merk op dat alleen de beste 2860 spelers op de website staan).
We voegen ook de drempelwaarden voor rang 500, 200 en 64 toe, want die zijn belangrijk voor competitieve spelers.
Hier gebruiken we de aggregatiefunctie agg samen met NamedAgg om alle statistieken in één keer te berekenen.
per_season_df = full_df.groupby(['season']).agg(
min_mmr = pd.NamedAgg('mmr', 'min'),
max_mmr = pd.NamedAgg('mmr', 'max'),
num_matches = pd.NamedAgg('matches', 'sum')
).reset_index()
top500_cutoffs = full_df[full_df['rank'] == 500][['season', 'mmr']].rename(columns={'mmr': 'top500_cutoff'})
top200_cutoffs = full_df[full_df['rank'] == 200][['season', 'mmr']].rename(columns={'mmr': 'top200_cutoff'})
top64_cutoffs = full_df[full_df['rank'] == 64][['season', 'mmr']].rename(columns={'mmr': 'top64_cutoff'})
per_season_df = pd.merge(per_season_df, top500_cutoffs, on='season')
per_season_df = pd.merge(per_season_df, top200_cutoffs, on='season')
per_season_df = pd.merge(per_season_df, top64_cutoffs, on='season')
per_season_df
De volledige uitvoer zie je hieronder:
| season | min_mmr | max_mmr | num_matches | top500_cutoff | top200_cutoff | top64_cutoff |
|---|---|---|---|---|---|---|
| M2_01 Wolf 2020 | 2407 | 10484 | 699496 | 9749 | 9872 | 10061 |
| M2_02 Love 2020 | 7776 | 10537 | 769358 | 9832 | 9952 | 10117 |
| M2_03 Bear 2020 | 9427 | 10669 | 862678 | 9867 | 9995 | 10204 |
| M2_04 Elf 2020 | 9666 | 10751 | 1004830 | 9952 | 10087 | 10293 |
| M2_05 Viper 2020 | 9635 | 10622 | 859640 | 9910 | 10028 | 10255 |
| M2_06 Magic 2020 | 9624 | 10597 | 793401 | 9896 | 10002 | 10191 |
| M2_07 Griffin 2020 | 9698 | 10667 | 996742 | 9978 | 10100 | 10289 |
| M2_08 Draconid 2020 | 9666 | 10546 | 838212 | 9946 | 10061 | 10246 |
Het aantal wedstrijden van de beste spelers geeft een indicatie van hoeveel mensen het spel spelen, want meer actieve spelers vereisen meer wedstrijden om de Pro Ladder te beklimmen. Je ziet dat de populariteit piekte tijdens Season of the Elves. In dat seizoen werden ook enkele nieuwe leidervaardigheden geïntroduceerd, waardoor de verse inhoud spelers mogelijk deed terugkeren. Een vergelijkbare stijging in wedstrijden is zichtbaar in Season of the Griffin, toen de Master Mirror-uitbreiding nieuwe kaarten uitbracht. Nieuwe inhoud lijkt dus een goede stimulans om meer te spelen en de competitie aan te wakkeren.
Je kunt de volledige tabel hier downloaden.
Waar wordt Gwent gespeeld?
Met groupby in combinatie met agg tellen we snel hoeveel profspelers er
per land zijn. Vervolgens combineren we dat met het bevolkingsaantal van elk land (een enigszins recente lijst staat
hier). Door het aantal
spelers in Pro Rank te delen door het aantal inwoners in miljoenen, krijgen we het aantal profspelers per hoofd van de bevolking.
| season | country | total_matches | num_players | pro_players_per_million | matches_per_player |
|---|---|---|---|---|---|
| M2_08 Draconid 2020 | Poland | 72225 | 267 | 7.047129 | 270.505618 |
| M2_08 Draconid 2020 | Estonia | 1726 | 7 | 5.280436 | 246.571429 |
| M2_08 Draconid 2020 | Russian Federation | 195905 | 673 | 4.613626 | 291.092125 |
| M2_08 Draconid 2020 | Belarus | 10260 | 39 | 4.125931 | 263.076923 |
| M2_08 Draconid 2020 | Ukraine | 52333 | 162 | 3.682351 | 323.043210 |
De top vijf bestaat uit Oost-Europese landen. Dat verbaast niet: het bedrijf achter Gwent is in Polen gevestigd en de wereld van The Witcher is gebaseerd op Slavische mythen en legendes. IJsland, Finland, Hongkong, Malta en Kroatië vervolledigen de top tien. Dit zijn allemaal relatief kleine landen, zodat één speler die Pro Rank bereikt hen flink hoger in de ranglijst brengt.
Je kunt de volledige tabel met gegevens voor alle seizoenen en landen hier downloaden.
Welk land heeft het beste Gwent-team?
Nu weten we waar de meeste profspelers per hoofd van de bevolking wonen, maar wat als landen een team van drie e-sporters naar een wereldkampioenschap mochten sturen? Welke landen zouden met hun drie profspelers het beste presteren? Hiervoor selecteerde ik alle landen met minstens drie spelers en koos ik de drie beste spelers uit elk land. Daarna berekende ik hun gemiddelde en totale MMR, de efficiëntie waarmee ze klimmen en de rang van elk land. De code staat voor geïnteresseerden op GitHub, maar ook hier gaat het eenvoudigweg om gegevens filteren en groeperen met ingebouwde pandas-functies.
De resultaten voor Season of the Draconid staan hieronder. China lijkt dit seizoen het beste team van drie te hebben, gevolgd door Rusland en Polen.
| season | country | mean_mmr | total_mmr | mean_matches_per_player | total_matches | nation_rank | efficiency | lei |
|---|---|---|---|---|---|---|---|---|
| M2_08 Draconid 2020 | China | 10489.333333 | 31468 | 409 | 1227 | 1 | 2.174409 | 43.974703 |
| M2_08 Draconid 2020 | Russian Federation | 10479.666667 | 31439 | 636 | 1908 | 2 | 1.383124 | 34.881052 |
| M2_08 Draconid 2020 | Poland | 10439.333333 | 31318 | 657 | 1971 | 3 | 1.277524 | 32.745512 |
Spelersoverzichten
Voor spelers die tijdens meerdere seizoenen Pro Rank bereikten, maken we snel een overzicht. Opnieuw gebruiken we groupby en agg om gegevens te groeperen en samenvattende statistieken te berekenen. We tellen het aantal vermeldingen op de Pro Ladder, de minimale, gemiddelde en maximale MMR-score, het gemiddelde en totale aantal wedstrijden en de beste wereldwijde en nationale rang.
Zo krijg je snel een beeld van alle beschikbare gegevens over een speler. Hier zie je mijn eigen uitvoer (spelersnaam sepro).
| name | country | appearances | min_mmr | mean_mmr | max_mmr | mean_matches | num_matches | best_rank | best_national_rank |
|---|---|---|---|---|---|---|---|---|---|
| sepro | Belgium | 3 | 9746 | 9782 | 9820 | 243 | 728 | 1138 | 2.0 |
Je kunt de volledige tabel hier downloaden om de statistieken van jezelf of je favoriete spelers op te zoeken.
Conclusie
Aanvankelijk wilde ik de nationale rang van spelers berekenen. Kom je uit een klein land, dan geeft alleen al het bereiken van Pro Rank je waarschijnlijk het recht om op te scheppen dat je tot de top drie van je land behoort. Met vrij eenvoudige datawetenschap haal je echter snel veel meer details uit verschillende aspecten van het spel.
Ik raad dit soort project echt aan voor mensen die leren programmeren. Zoek een onderwerp dat je leuk vindt, schrijf wat code om er gegevens over te verzamelen, voer een analyse uit en maak enkele grafieken.
Vond je dit artikel interessant? Trakteer me op een koffie