Discord

Checklist IOAI TST 2025 IOAI Team Selection Test · Task 2

Football Player Clustering

Cluster football players by their FIFA skill ratings so that the clusters match their hidden, possibly multiple, playing positions.

  • Tabular
  • Clustering (unsupervised)
  • Russian original · English translation

The task

Each player is described by technical, physical and mental skill ratings taken from the FIFA video game (values 0-99), such as crossing, finishing, dribbling, sprint speed, interceptions and goalkeeper ratings. The data contain no position information.

The contestant analyses the features, applies clustering methods (for example k-means, DBSCAN or Gaussian mixtures), chooses the number of clusters and assigns a cluster label to every player. The clusters should correspond to hidden playing positions (for example forward, defender, goalkeeper); a player may have several positions.

Abridged and translated by SOTA from the official Russian materials. The official statement has the exact rules, and it wins wherever this summary differs.

In English

This task was published in Russian. SOTA translated its 2 files into English on 17 September 2026.

Read the competition overview in English 564 words

Football Player Clustering

English translation by SOTA – AI Community of the Russian original. Licensed CC BY-NC-SA 4.0, like the original. Organisers who would like this translation removed can email [email protected].

Contest 2 (27 June 2025) of the Kazakhstan IOAI Team Selection Test (Отборочные на IOAI), 2025; the contest hub marks this contest "Unrated". This is the Overview tab of the Kaggle competition "TST day2 Upsolving", the host's public upsolving copy of the contest, open from 27 June to 15 July 2025. Its subtitle reads: "This is a copy of the original contest. In the original, the metric worked incorrectly. The error has been fixed here." Original: kaggle.com/competitions/tst-day-2-upsolving. The Data tab is translated in a separate file.

Overview

In this task you are to cluster football players on the basis of their playing attributes, taken from the FIFA game. The dataset contains skills such as dribbling, passing, stamina, shot power, shooting accuracy and goalkeeping skills.

The goal is to divide the players into groups (clusters) that correspond to their hidden playing positions (for example, forward, defender, goalkeeper, etc.).

Description

📌 What you need to do

  • Analyse the features (34 playing skills in total).
  • Apply clustering methods (for example, KMeans, DBSCAN, GMM, etc.).
  • Determine the optimal number of clusters.
  • Assign a cluster label to each player.
  • Submit a submission.csv file with the columns: id, positions.

Evaluation

📊 Evaluation metric: B-Cubed F1 for multi-position clustering

🧠 What the metric measures

Each player can have several positions (for example, {CM, CAM}). The purpose of the metric is to check how well the participant has grouped players with overlapping positions.

For each player ii:

  1. Precision(i) is the fraction of players in the same predicted cluster who have at least one position in common with player ii:

Precisioni={jClusteri,  ji,  yjyi}Clusteri1\text{Precision}_i = \frac{|\{j \in \text{Cluster}_i,\; j \ne i,\; y_j \cap y_i \ne \emptyset\}|}{|\text{Cluster}_i| - 1}

  1. Recall(i) is the fraction of players who have at least one position in common with player ii and are in the same cluster:

Recalli={ji,  yjyi,  jClusteri}{ji,  yjyi}\text{Recall}_i = \frac{|\{j \ne i,\; y_j \cap y_i \ne \emptyset,\; j \in \text{Cluster}_i\}|}{|\{j \ne i,\; y_j \cap y_i \ne \emptyset\}|}

3. Averaging over all players:

Precisionavg=mean of Precisioni\text{Precision}_{avg} = \text{mean of } \text{Precision}_i

Recallavg=mean of Recalli\text{Recall}_{avg} = \text{mean of } \text{Recall}_i


4. Final result:

B-Cubed F1 = 2 * Precision_avg * Recall_avg / (Precision_avg + Recall_avg)


📌 Example

A cluster contains 3 players:

  • Player 1: {ST}

  • Player 2: {ST, CF}

  • Player 3: {CB} (all of them are in the same cluster)

  • Precision(1): There are 2 other players in the cluster, and only 1 of them (player 2) overlaps in position → precision = 1 / 2 = 0.5

  • Recall(1): Player 2 is the only player whose positions overlap, and he is in the same cluster → recall = 1 / 1 = 1.0

  • The values for the other players are computed in the same way; they are then averaged and the final F1 is computed.


✅ Advantages
  • Supports multi-class (multi-position) labelling
  • Takes into account both the precision of the clusters and their recall
  • Does not depend on cluster size: each player makes an equal contribution
  • The metric value always lies within [0, 1]

Translated by SOTA. The Russian original is the official version and wins wherever the two differ. This translates the Overview and Data tabs of the host's public upsolving copy on Kaggle; the Rules tab (code of conduct, allowed websites and libraries) is not included. The Description speaks of 34 playing skills, while the Data tab's table lists 32 skill columns plus id. In the averaging step of the metric the original wrote the Russian words for "mean of" inside the formula; the translation puts them in English. The competition data on Kaggle are licensed CC BY-NC-SA 4.0. If you organise this olympiad and would like the translation removed, email [email protected] and we will take it down.

At a glance

You get
train.csv with an id column and the players' skill ratings (the task page speaks of 34 skills).
You submit
submission.csv with columns id and positions (the assigned cluster label).
Scoring
B-Cubed F1 for multi-position clustering: for player i, Precision_i = share of the other players in i's predicted cluster that share at least one true position with i; Recall_i = share of the players sharing a position with i that are in i's cluster; precision and recall are averaged over players and F1 = 2PR/(P+R). Contest scoring (hub page): each task is worth at most 100 points; Norm_Score = (Submission_Score - Min_Score) / (Max_Score - Min_Score) x 100, where Min_Score is the lower of 0.9 x baseline score and the lowest participant score, and Max_Score is the higher of 0.9 x the Scientific Committee solution score and the best participant score.
Rules
  • Read-only access to stackoverflow.com, scikit-learn.org, pytorch.org, huggingface.co, numpy.org, github.com, python.org, pypi.org, a search engine restricted to these sites and a translation site.
  • GPT-4o (or a newer version announced before the contest) is allowed through the platform integration; other LLMs, chats, Copilot tools and APIs are forbidden unless the task says otherwise.
  • Allowed libraries include torch, scikit-learn, xgboost, catboost, lightgbm, transformers, spacy, nltk, gensim, fasttext, pandas, numpy, scipy, opencv-python, Pillow, torchvision, scikit-image, matplotlib, seaborn, plotly and common utilities; TensorFlow and Keras are not available.
  • Pre-trained models and external data are forbidden unless the task allows them; no extra training time after the contest ends; contestants may be asked to upload code, models and/or predictions.
Format
Kazakhstan IOAI Team Selection Test 2025, contest 2 of 4 (27 June 2025), run as a private Kaggle competition; the public Kaggle copy is an upsolving clone of it. The hub marks this contest 'Unrated'; the copy's subtitle says the metric worked incorrectly in the original and is fixed in the copy.

Details

Year
2025
Round
IOAI Team Selection Test · Task 2
Language
Russian; English translation by SOTA
License
MIT (hub and Day 1 copy); CC BY-NC-SA 4.0 (Day 2–4 copies), as stated by the source