How to Analyze Football Statistics for Performance Insights

Learn how to convert raw football statistics into composite performance scores using CatBoost prediction models, multi-dimensional scoring, and position-aware benchmarking via the Football Performance API.

2026-03-08T00:00:00.000Z

Statistics to decision matrix

Football statistics become performance insights only when they are processed through a model that accounts for position context, league environment, and the relative importance of different statistical dimensions. A striker’s 15 goals mean something very different depending on whether they came from 120 shots or 50, whether the player also contributed 8 assists or 0, and whether the defensive workload was negligible or substantial. The Football Performance API solves this problem by processing raw statistical features through a CatBoost gradient boosting model that produces multi-dimensional performance scores—attack, defense, creation, and overall rating—expressed as position-cohort percentiles.

This guide explains the complete analytical workflow: from defining the right statistical features, through the prediction pipeline, to interpreting and applying the composite scores for tactical planning, recruitment, and performance monitoring.

1) The Raw Features: What the Model Consumes

The prediction model does not operate on abstract “performance indicators.” It consumes a specific set of raw statistical features that represent a player’s on-pitch output across a full season or defined period. Understanding these inputs is essential for interpreting the outputs.

The /database/player-features endpoint returns the following core features for each player record:

Offensive features:

  • goals — Total goals scored (excluding penalties where normalized).
  • assists — Direct goal assists.
  • shots — Total shots attempted, including blocked and off-target.
  • dribbles — Successful take-ons past an opponent.

Defensive features:

  • tackles — Successful tackles won.
  • interceptions — Passes intercepted from the opponent.
  • clearances — Defensive clearances from the box and danger zones.
  • blocks — Shots and passes blocked.
  • aerials_won — Aerial duels won.

General features:

  • passes_completed — Successfully completed passes.
  • passes_attempted — Total passes attempted (completion rate = completed/attempted).
  • fouls — Fouls committed.
  • yellow_cards — Yellow cards received.
  • red_cards — Red cards received.
  • minutes — Total minutes played.

Contextual metadata:

  • position — Player’s primary position (e.g., “Midfielder”, “Forward”, “Defender”, “Goalkeeper”).
  • league — Competition name (e.g., “Premier League”, “Bundesliga”, “Serie A”).
  • season — Season identifier in "YYYY/YYYY" format (e.g., “2024/2025”).
  • club — Team name.

The feature processing pipeline (base/features.py in the open-source codebase) transforms these raw counts into normalized feature vectors. The normalization accounts for minutes played (per-90 rates), position-specific baselines (a defender’s 2 goals is weighted differently than a forward’s 2 goals), and league-level statistical distributions.

2) The Prediction Model: How Scores Are Computed

The core of the Football Performance API is a CatBoost gradient boosting model—a machine learning algorithm that excels at handling categorical features (position, league) alongside continuous numerical features (goals, tackles). CatBoost is specifically well-suited for football data because it natively handles the mixed feature types without requiring manual encoding, and its ordered boosting approach reduces overfitting on the relatively small sample sizes typical of seasonal football data.

Two Model Variants

The API serves two model variants through separate endpoints:

Pro Model (/score/predict) — The production-grade variant developed by Futrix Metrics. It uses an extended feature set with proprietary normalization, league-adjusted baselines, and training data spanning multiple seasons across European leagues. This model produces the pro source data accessible through /database/player-features?source=pro.

Base Model (/score/predict-base) — The community variant included in the open-source repository. The model artifact is stored as a .cbm file and can be retrained locally using model/base_model.py. This enables independent researchers to modify the feature engineering, experiment with different target variables (base/target.py), and validate results against their own ground truth.

Both models accept the same input schema via a POST request:

POST /score/predict
{
  "features": {
    "goals": 8,
    "assists": 11,
    "shots": 52,
    "dribbles": 67,
    "tackles": 31,
    "interceptions": 24,
    "clearances": 12,
    "blocks": 9,
    "aerials_won": 18,
    "passes_completed": 1890,
    "passes_attempted": 2210,
    "fouls": 34,
    "yellow_cards": 6,
    "red_cards": 0,
    "minutes": 3020,
    "position": "Midfielder",
    "league": "Bundesliga",
    "season": "2024/2025"
  }
}

The response returns the composite scores: rating_display_score_pct, attack_score_score_pct, defense_score_score_pct, and creation_score_score_pct—each expressed as a percentile within the player’s position cohort.

Batch Predictions for Squad-Level Analysis

The /score/predict-batch endpoint accepts up to 500 prediction requests in a single call, making it practical to:

  • Re-score an entire squad after each matchday to track week-over-week performance shifts.
  • Run scenario analysis by modifying individual features (e.g., “what happens to this midfielder’s score if their dribble count increases by 20%?”).
  • Evaluate a transfer shortlist by scoring all candidates against the same model to create directly comparable rankings.

3) The Four Scoring Dimensions: What They Measure

The model produces four score dimensions, each capturing a distinct aspect of performance. Understanding what each dimension measures—and what it does not—is essential for avoiding misinterpretation.

attack_score_score_pct — Offensive Contribution

This dimension weights goals, assists, shots, and dribbles most heavily, normalized by position expectations. A forward with an attack_score_score_pct of 90 is outperforming 90% of forwards in the database on offensive output.

Common misuse: Treating this as a pure goal-scoring metric. It is not—a forward who scores fewer goals but creates significantly more chances through dribbles and key passes may score higher than a pure poacher, because the model captures total offensive contribution, not just finishing.

defense_score_score_pct — Defensive Contribution

This dimension weights tackles, interceptions, clearances, blocks, and aerials_won, again normalized by position. A midfielder with a defense_score_score_pct of 75 is more defensively active than 75% of midfielders.

Common misuse: Assuming higher is always better. A forward with a very high defensive score may indicate a team system that requires excessive defensive contribution from attacking players—potentially at the cost of offensive output. Context matters.

creation_score_score_pct — Playmaking Contribution

This dimension captures chance creation and build-up contribution: assists, progressive passing, pass completion rates, and pass volume relative to position norms.

Common misuse: Conflating with assist counts alone. A deep-lying midfielder who completes 95% of 70 passes per match and contributes 15 progressive passes per 90 may score highly on creation even with few direct assists, because the model recognizes the build-up contribution that enables the final pass.

rating_display_score_pct — Overall Composite Rating

The headline metric that combines all dimensions into a single score. The weighting between dimensions varies by position—attacking dimensions weigh more heavily for forwards, defensive dimensions for defenders—reflecting the principle that a player should be judged primarily by the demands of their role.

Use this score for headline rankings (e.g., /player-charts/top-players), but always drill into the dimensional sub-scores when making specific tactical or recruitment decisions. Two players with identical overall ratings can have radically different dimensional profiles.

4) Benchmarking: Position Cohorts and Score Distributions

Raw percentile scores are only meaningful when understood in the context of their distribution. The API provides two visualization endpoints specifically designed for benchmarking:

Score Distribution — /player-charts/score-distribution

This endpoint generates box-plot distributions showing how scores are distributed across positions. The dim parameter specifies which scoring dimension to visualize (default: rating_display_score_pct).

The distribution reveals critical context:

  • Forward ratings tend to have wider distributions than defender ratings, reflecting the higher variance in attacking output.
  • Midfielder scores often cluster in the middle range with fewer extreme values, reflecting the position’s balanced demands across dimensions.
  • Cross-position comparisons of the overall rating are valid because the percentiles are computed within each position cohort separately.

Score Scatter — /player-charts/score-scatter

The score-scatter endpoint maps players on a two-dimensional plane defined by any two scoring dimensions. For example, plotting attack_score_score_pct on the x-axis and defense_score_score_pct on the y-axis reveals the classic trade-off between offensive and defensive contribution.

The color_by parameter is particularly powerful:

  • color_by=position — Shows how positions cluster naturally on the scoring plane.
  • color_by=cluster_group — Colors by the GMM tactical role classification (e.g., “Forwards”, “Midfielders”, “Defenders” as broad groups).
  • color_by=cluster_name — Colors by specific tactical archetype (e.g., “Advanced Playmaker”, “Defensive Anchor”, “Goal Poacher”).

A scatter plot with x_dim=creation_score_score_pct, y_dim=attack_score_score_pct, color_by=cluster_name immediately reveals which players combine high creative output with high attacking output—the rare “complete attacker” profile that every sporting director seeks.

5) Practical Analytical Workflows

Workflow 1: Post-Match Performance Review

After each matchday, update your squad’s performance profile:

  1. Query /database/player-features?club=Your Team&season=2024/2025&source=pro to get updated feature vectors.
  2. Generate /player-charts/radar/{player_id} for any player whose performance shifted significantly from the previous week.
  3. Compare the radar against the position average to identify which statistical dimensions drove the change.
  4. Use /player-charts/timeline/{player_id} with dims=rating_display_score_pct,attack_score_score_pct to track whether the shift is part of a longer trajectory or a single-match anomaly.

Workflow 2: Recruitment Shortlisting

When scouting for a specific tactical role:

  1. Query /database/role-cluster-results?cluster_name=Target Role&season=2024/2025 to find all players classified under that archetype.
  2. Filter by target leagues using /database/player-features?league=Bundesliga&position=Midfielder&source=pro.
  3. Rank by rating_display_score_pct and generate /player-charts/compare?player_ids=101,202,303,404,505 to overlay the top 5 candidates on a single radar.
  4. Generate /report for each finalist to produce shareable HTML scouting documents.

Workflow 3: Cross-League Talent Identification

When searching for undervalued talent across European leagues:

  1. Use /player-charts/league-scores?source=pro&top_leagues=20 to identify which leagues produce the strongest players in specific dimensions.
  2. Query /database/player-features?league=Target League&position=Forward&source=pro&limit=500 to pull all players in the target league and position.
  3. Sort by rating_display_score_pct and cross-reference with Transfermarkt market values to identify players whose performance score significantly exceeds their market valuation.
  4. Use /player-charts/cluster-profile/{player_id} to verify that the player’s tactical role profile matches your system requirements before proceeding to video scouting.

6) Feature Importance: Understanding What Drives the Score

The /charts/features endpoint returns a ranked visualization of which raw features contribute most to the model’s predictions. This transparency serves three practical purposes:

  1. Trust building with coaching staff. When presenting a model-derived recommendation, showing that “the model weights progressive passing and interceptions most heavily for this position” grounds the recommendation in observable, verifiable actions.

  2. Feature engineering feedback. If the model assigns near-zero importance to a feature you expected to matter (e.g., aerial duels for central midfielders), it may indicate that the feature is redundant with another input or that the training data does not support the relationship.

  3. Model comparison. The /charts/models/base and /charts/models/pro endpoints show how feature importance differs between the two model variants. The pro model typically assigns importance to a broader set of features due to its enhanced feature engineering, while the base model relies more heavily on the most salient raw statistics.

7) Common Analytical Mistakes and How to Avoid Them

  • Mistake: Comparing players across positions using overall rating alone. Fix: The rating_display_score_pct is computed within position cohorts, so a 75th-percentile forward and a 75th-percentile defender are equally strong relative to their position peers. But directly comparing a forward’s score to a defender’s score to decide “who is better” is meaningless—they are percentiles of different distributions. Use the dimensional sub-scores for cross-position analysis when necessary.

  • Mistake: Using source=base for production scouting decisions. Fix: The base model is designed for prototyping and research. Its feature engineering is simpler and its training data more limited. Always use source=pro for decisions that affect transfer spending or tactical planning. Use /charts/models/base vs /charts/models/pro to understand the differences.

  • Mistake: Ignoring the minutes threshold. Fix: Players with fewer than 900 minutes (roughly 10 full matches) produce unreliable feature vectors. The per-90 normalization amplifies noise in small samples. Apply a minimum-minutes filter before drawing conclusions from the scores.

  • Mistake: Treating scores as static across a season. Fix: Player performance is non-stationary. A player scored in September using data from August will have a different score in March. Use /player-charts/timeline/{player_id} to track score evolution and always reference the query season when reporting scores.

  • Mistake: Over-indexing on a single scoring dimension. Fix: The dimensional scores are designed to work together. A midfielder with 95th-percentile creation but 20th-percentile defense may be a tactical liability in a system that requires midfield pressing. Always examine all four dimensions before making a recommendation.

Further Reading

Conclusion

Analyzing football statistics for performance insights requires a system that transforms raw event counts into position-aware, multi-dimensional scores with transparent methodology. The Football Performance API provides this system as a complete pipeline—from feature ingestion through CatBoost prediction to percentile scoring—with both an open-source base model for independent research and a production pro model for professional decision-making. The difference between organizations that use statistics effectively and those that drown in data is not the volume of numbers available but the quality of the model that connects those numbers to actionable, position-contextualized performance insights.