Weekend Review: The Results That Surprised Us (GW25)
Every weekend in European football throws up results that make you double-take. Favourites stumble, underdogs pull off shocks, and managers across the continent stare at their iPads wondering what just happened. Gameweek 25 was no different -- except this weekend had more than its fair share of drama.
Here's our round-up of the results that caught our eye, and what the data says about whether they were genuine upsets or just the beautiful randomness of football doing its thing.
Premier League: Bournemouth 2-1 Arsenal
The headline result of the weekend. Arsenal went to the Vitality Stadium as overwhelming favourites and left with nothing. On the surface, it looks like a classic slip-up by a title contender -- the kind of result that costs you the league in May.
But dig into the xG and the picture is more nuanced. Arsenal generated 2.41 xG across the 90 minutes compared to Bournemouth's 0.87. They hit the woodwork twice, had a goal controversially ruled out by VAR for a marginal offside, and Neto made at least three saves that had no right to stay out.
This was a game Arsenal dominated in every meaningful metric except the one that matters: the scoreline. Their shot map looks like a heatmap of the penalty area. Bournemouth's two goals came from their only two shots on target -- a deflected free kick and a counter-attack breakaway in the 89th minute.
Is this a cause for concern? Not really. Games like this happen. Over a season, the variance evens out, and teams that create 2.4 xG per game tend to win far more often than they lose. Arsenal will look back at this one in May and either shrug it off or agonise over it, depending on whether they win the title.
Elsewhere in England
Newcastle 3-0 Wolves was the dominant performance of the weekend. The Magpies generated 3.12 xG -- the highest by any Premier League team this season in a single game. Alexander Isak scored twice from chances with a combined xG of 0.91, which is about as clinical as it gets.
At the other end of the table, Nottingham Forest's 1-1 draw with Ipswich was one of those games where both managers probably felt they should have won. Forest's xG of 1.64 vs Ipswich's 1.58 suggests the draw was about right, but both sides squandered clear-cut chances that would have settled it.
La Liga: Girona 3-2 Real Madrid
Now this was a genuine shock. Real Madrid went to Girona as heavy favourites and were picked apart in the first half by the kind of pressing and positional play that Michel's side are now renowned for.
Girona's xG of 2.07 against Madrid's 1.89 tells you this wasn't a smash-and-grab. They created good chances through sustained pressure and clever movement, exploiting the space behind Madrid's full-backs with devastating runs from their wingers.
Madrid clawed back from 3-0 down to 3-2 in the second half, which tells you everything about their mentality and individual quality. Mbappe's goal was extraordinary -- a solo run from the halfway line that generated an xG of 0.04, which basically means nobody on earth should score from there. Except Mbappe.
But the damage was done. Ancelotti made tactical adjustments at half-time that improved Madrid's shape, but you can't keep giving teams a three-goal head start and expect to get away with it. The defensive issues that have plagued Madrid this season were on full display in that first half.
Bundesliga: Union Berlin 1-0 Bayern Munich
Continuing the theme of big teams dropping points, Bayern lost at the Alte Forsterei in a game that was as grim as the scoreline suggests. Union Berlin's entire strategy was to make the game as ugly and chaotic as possible, and it worked perfectly.
Bayern's xG of 1.43 doesn't look terrible on paper, but the quality of their chances was poor. Most of their shots came from outside the box, a sure sign that they were struggling to break down Union's deep block. Kane was starved of service, touching the ball in the opposition box just four times in 90 minutes.
Union's winner came from a corner -- a headed goal from a well-worked routine that generated an xG of 0.12. Sometimes football is about set-piece execution and defensive resilience rather than open-play dominance, and Union were masters of that approach.
This result is significant for the Bundesliga title race. Bayern are now five points behind Leverkusen with 13 games to play. As we discussed in our recent analysis of Bayern's season, the underlying numbers don't suggest an easy comeback.
Serie A: Atalanta 4-1 Juventus
The most emphatic result of the weekend came at the Gewiss Stadium, where Atalanta dismantled Juventus in a manner that will have Thiago Motta's critics sharpening their knives.
Atalanta's xG of 3.21 was staggering. They carved Juventus open repeatedly through the middle, exploiting the lack of a natural defensive midfielder in Motta's lineup. Charles De Ketelaere scored twice and looked every inch the elite forward that AC Milan thought they'd signed.
Gian Piero Gasperini's side are now genuine contenders for the Scudetto. Their underlying numbers have been outstanding all season, and their ability to overwhelm opponents with intense pressing and quick combinations in the final third is reminiscent of the best Leverkusen performances from last season.
For Juventus, the questions keep coming. They've now lost three of their last seven league games, and their xG difference over that run is -3.2 -- the worst of any top-six side in Serie A. The project under Motta feels like it's stalling.
Ligue 1: Lille 2-0 PSG
Paris Saint-Germain's trip to Lille is never easy, and so it proved again. Bruno Genesio's side were superb defensively, conceding just 0.93 xG to a PSG attack that usually generates significantly more.
The tactical key was Lille's pressing structure. Rather than sitting deep and trying to absorb pressure, they pressed PSG's build-up aggressively, forcing Marquinhos and the centre-backs into long balls that played into Lille's hands. PSG completed just 78% of their passes -- well below their season average of 89%.
Going forward, Lille were clinical. Their two goals came from chances with a combined xG of 0.64, meaning they were significantly more efficient than the chances warranted. But when you defend as well as Lille did and restrict PSG to just three shots on target, you earn the right to be lucky in front of goal.
The Biggest xG vs Result Mismatches
Here are the weekend's biggest gaps between expected and actual outcome across Europe's top five leagues:
Teams that should have won but didn't:
- Arsenal (2.41 xG, lost 1-2)
- Bayern Munich (1.43 xG, lost 0-1)
- Villarreal (2.18 xG, drew 1-1 with Getafe)
Teams that won against the run of play:
- Bournemouth (0.87 xG, won 2-1)
- Union Berlin (0.67 xG, won 1-0)
- Girona (2.07 xG, won 3-2 -- actually deserved this one)
The most "accurate" result:
- Atalanta 4-1 Juventus (3.21 vs 0.84 xG -- the scoreline was fully justified)
What It All Means
A weekend like this is a reminder of why football is the sport it is. The gap between what "should" happen based on chance quality and what actually happens is where all the drama lives. Underdogs score from half-chances, goalkeepers have the games of their lives, and VAR decisions change the course of matches.
But over a full season, the underlying data is remarkably predictive. Teams that consistently create high-quality chances and limit their opponents' opportunities tend to finish where the xG says they should. Individual weekends are noisy. Full seasons are signal.
That's why we track this stuff. Not to suck the joy out of football -- Bournemouth's win over Arsenal was thrilling regardless of the xG -- but to understand what's really happening beneath the surface. And right now, across Europe's biggest leagues, the title races are shaping up to be some of the most competitive in years.
See you next weekend.