UEFA Europa League game analysis for Galatasaray Instanbul
Custom data analysis tool for visualizing real-time soccer tracking data to support tactical decision-making in UEFA Europa League matches.
In December, Onur Sönmez and I began collaborating with Ali Yavuz from Galatasaray S.K's Match and Performance Analysis Team. He asked us for help to explore how football clubs can extract deeper insights from performance data beyond standard metrics and spreadsheets.
Our first project focused on AFC Ajax, Galatasaray's upcoming UEFA Europa League opponent. Working within a two-week timeline, I developed a custom data pipeline to parse and synchronize multiple large datasets from Ajax's last six Europa League matches. For the first version we mainly focused on tracking player movements. From player movements alone, there's a lot to analyze—not just an individual player's movements, zoning and positioning, but also how they behave with their own team and how they interact with the opposing team.
We analyzed seven key Ajax players, creating comparative visualizations that revealed positional patterns and tactical shifts across all six matches. The final deliverable was a comprehensive 56-page analysis document, completed three days before kickoff.
For the subsequent analysis against AZ Alkmaar, we shifted focus to dead-ball situations. Given that only 2.2% of corners result in goals, but those goals influence match outcomes 76% of the time, understanding set-piece dynamics is crucial. The system can visualize how both defensive and offensive formations evolve throughout these critical moments.
The technical approach centered on flexibility and specificity. While commercial sports analytics platforms offer broad dashboards, they often lack the granularity needed for targeted tactical analysis. We built a system that processes match data frame by frame, generating custom visualizations for exactly what the analysts needed—player heat maps, formation changes during set pieces, and movement patterns during key transitions.
The project's short timeline dictated our approach. The first goal was to get the data prepared and synchronized. Per match we received four different JSON files, in part from different data brokers. Synchronizing those to be on the same timing posed some problems since it seems that the data creators use different tools and sometimes even different video source material. With a crude first visualization and synchronized data, I started to develop function after function that would help Galatasaray better understand their next opponent. Even though this process of "winging it" practically accumulates technical debt from the beginning, the approach also comes with strengths: its adaptability. After laying this first groundwork, the same framework can be rapidly reconfigured and extended for any opponent or tactical focus, providing analysts with precisely the insights they need without the constraints of generic solutions.
The tool was developed in TouchDesigner with an integrated data handler and optional Python preprocessing for JSON synchronization. The raw data comes in four separate streams: per-player and ball tracking data, a mapping table linking player names to tracking IDs, event data capturing game actions (kickoffs, substitutions, free kicks, goals), and video analysis metadata. Each dataset contains hundreds of thousands of data points—the event tracking alone captures over 2,000 events per game with precise timestamps, team IDs, player IDs, and event classifications.
The biggest technical challenge was synchronizing the event data with the tracking data. I developed a multi-step alignment process: first, I extract the start and end timestamps for each half from the event data. Then I search the tracking data for the first ball movement (when the ball transitions from stationary to moving) and identify halftime endings where tracking data simply stops. Using the timestamp differences, I calculate a time offset to align both datasets.
However, it became apparent that the events are manually tracked by human operators, causing the offset between timecodes to drift throughout the match. To compensate, I implemented a more sophisticated approach: matching specific events like corner kicks with their corresponding ball movement patterns in the tracking data, then averaging multiple alignment points to achieve tightly synchronized data across the entire match.
Once synchronized, the system enables real-time scrubbing through the entire game timeline while maintaining perfect sync with events. We can query the event list for specific action types—corners, goals, defensive transitions—and set up automated exporters with customizable parameters: player speed visualizations, positional heat maps, individual player tracking, or team formation analysis. Each export includes configurable padding time before and after events, automatically generating video visualizations that capture the full context of tactical moments.
For now, and given the speed at which the project developed, video exports were the most practical solution—they render quickly at around 350 fps and are easy to share. However, this approach lacks flexibility and requires analysts to request new exports from us. I chose TouchDesigner as the core tool because the long-term vision is to make the data available in real time, which is exactly what TouchDesigner excels at.
Although Galatasaray was eliminated from the Europa League this season, we're already working on the next version for future competitions. The goal is to provide analysts with an interface to generate the visualizations they need, on demand, and in real time. Since the analysts are the football experts and we're the visualization experts, this shift will empower them to explore the data at a much deeper level—down to the 30th of a second—enabling both players and the team to perform at their best.