EPL 07-08 November 2015

EPL 07-08th of November 2015

As usual we have a quick shot-statistical look at the weekend matches in the English Premier League.

In [1]:
%matplotlib inline
import league_analysis
from IPython.display import display, HTML
epl = league_analysis.epl
weekend_matches = league_analysis.get_matches(epl, '07/11/2015', '08/11/2015')
league_analysis.display_given_matches(weekend_matches)
Home Away
Team Bournemouth Newcastle
Goals 0 1
Shots 20 2
SOT 5 1
Home Away
Team Leicester Watford
Goals 2 1
Shots 12 8
SOT 6 4
Home Away
Team Man United West Brom
Goals 2 0
Shots 13 4
SOT 3 0
Home Away
Team Norwich Swansea
Goals 1 0
Shots 9 8
SOT 5 0
Home Away
Team Stoke Chelsea
Goals 1 0
Shots 8 19
SOT 2 4
Home Away
Team Sunderland Southampton
Goals 0 1
Shots 9 11
SOT 3 4
Home Away
Team West Ham Everton
Goals 1 1
Shots 16 13
SOT 5 4
Home Away
Team Arsenal Tottenham
Goals 1 1
Shots 10 14
SOT 4 4
Home Away
Team Aston Villa Man City
Goals 0 0
Shots 3 13
SOT 0 3
Home Away
Team Liverpool Crystal Palace
Goals 1 2
Shots 22 9
SOT 4 4
In [2]:
league_analysis.display_match(epl, 'Bournemouth', 'Newcastle', '07/11/15')

Bournemouth 0 - 1 Newcastle

Home Away
Team Bournemouth Newcastle
Goals 0 1
Shots 20 2
SOT 5 1

As I pointed out last week Bournemouth are probably the most unlucky team in the league and that is without taking in to account the misfortune of injuries. This was a typical example, Bournemouth should have won this match and probably would have on most other days. As usual to calculate how dominating a loss this was for Bournemouth we look at games with a similar difference in TSR:

In [3]:
bournemouth_tsr = 20.0 / (20.0 + 2.0)
def large_tsr(match):
    return match.home_tsr >= bournemouth_tsr or match.away_tsr >= bournemouth_tsr
def large_tsr_lost(match):
    return ((match.home_tsr >= bournemouth_tsr and match.FTR == 'A') or
            (match.away_tsr >= bournemouth_tsr and match.FTR == 'H'))
(big_tsr, num_matches) = league_analysis.get_fraction_of_matches(large_tsr)
(big_tsr_lost, _) = league_analysis.get_fraction_of_matches(large_tsr_lost)
print('In {0} of {1} matches had a tsr of {2} or more'.format(big_tsr, num_matches,
                                                              bournemouth_tsr))
print('In {0} of those matches the team with the large tsr lost'.format(big_tsr_lost))
In 57 of 12099 matches had a tsr of 0.9090909090909091 or more
In 5 of those matches the team with the large tsr lost

So it was only the 5th time that a team with as large a TSR has lost, here are those games:

In [4]:
relevant_matches = league_analysis.get_all_matches(filter_fun=large_tsr_lost)
league_analysis.display_given_matches(relevant_matches)
Home Away
Team Birmingham Chelsea
Goals 1 0
Shots 1 24
SOT 1 9
Home Away
Team Milton Keynes Dons Yeovil
Goals 0 1
Shots 12 1
SOT 3 1
Home Away
Team Hibernian Kilmarnock
Goals 0 1
Shots 10 1
SOT 3 0
Home Away
Team Stevenage Burton
Goals 1 0
Shots 0 5
SOT 0 3
Home Away
Team Bournemouth Newcastle
Goals 0 1
Shots 20 2
SOT 5 1

So in two of those matches the large TSR was due to the winning side having only a single shot. To me, 20 shots to 2 seems more dominant than 10 shots to 1. But if I count it like that I should include matches in which a team simply has 18 more shots. We also have the fairly incredible game in which Stevenage beat Burton 1-0 despite not registering a shot. Although this is fairly incredible 5 shots to 0 does not represent as large a domination. Birmingham's victory over Chelsea remains unsurpassed. Okay then, let's look at absolute shots rather than ratios.

In [5]:
bournemouth_shot_diff = 20 - 2
def large_shot_diff(match):
    return abs(match.HS - match.AS) >= bournemouth_shot_diff
def large_shot_diff_lost(match):
    return ((match.HS - match.AS >= bournemouth_shot_diff and match.FTR == 'A') or
            (match.AS - match.HS >= bournemouth_shot_diff and match.FTR == 'H'))
(big_shot_diff, num_matches) = league_analysis.get_fraction_of_matches(large_shot_diff)
(big_shot_diff_lost, _) = league_analysis.get_fraction_of_matches(large_shot_diff_lost)
print('In {0} of {1} matches had a tsr of {2} or more'.format(big_shot_diff, num_matches,
                                                              bournemouth_shot_diff))
print('In {0} of those matches the team with the large tsr lost'.format(big_shot_diff_lost))
In 187 of 12099 matches had a tsr of 18 or more
In 33 of those matches the team with the large tsr lost

So there are certainly more matches with a shot difference of 18 or more in which the dominant team has lost. Still, 33 of 12099 is not very many. Here are the matches with the largest shot diff to have lost sorted with the largest shot diff first:

In [6]:
relevant_matches = league_analysis.get_all_matches(filter_fun=large_shot_diff_lost)
relevant_matches = sorted(relevant_matches, key=lambda m: abs(m.HS - m.AS), reverse=True)
league_analysis.display_given_matches(relevant_matches)
Home Away
Team Chelsea Sunderland
Goals 1 2
Shots 31 7
SOT 15 3
Home Away
Team Birmingham Chelsea
Goals 1 0
Shots 1 24
SOT 1 9
Home Away
Team Sunderland Blackpool
Goals 0 2
Shots 32 9
SOT 16 4
Home Away
Team Tottenham Newcastle
Goals 0 1
Shots 31 8
SOT 14 4
Home Away
Team Man City Everton
Goals 1 2
Shots 25 4
SOT 15 3
Home Away
Team Huddersfield Fulham
Goals 0 2
Shots 31 10
SOT 13 3
Home Away
Team Man City West Ham
Goals 1 2
Shots 27 6
SOT 8 3
Home Away
Team Bournemouth Birmingham
Goals 0 2
Shots 27 7
SOT 9 2
Home Away
Team Leeds Nott'm Forest
Goals 0 2
Shots 25 5
SOT 3 5
Home Away
Team Colchester Oldham
Goals 0 1
Shots 24 4
SOT 7 1
Home Away
Team Stoke Burnley
Goals 1 2
Shots 25 5
SOT 4 4
Home Away
Team Man United West Brom
Goals 0 1
Shots 26 6
SOT 9 3
Home Away
Team Huddersfield Wolves
Goals 1 4
Shots 31 11
SOT 13 7
Home Away
Team Crawley Town Walsall
Goals 1 0
Shots 5 25
SOT 3 6
Home Away
Team Liverpool West Brom
Goals 0 1
Shots 28 9
SOT 12 4
Home Away
Team Liverpool West Brom
Goals 0 2
Shots 23 4
SOT 14 3
Home Away
Team Blackpool Wolves
Goals 1 2
Shots 24 5
SOT 15 2
Home Away
Team Colchester Crewe
Goals 1 2
Shots 22 3
SOT 11 2
Home Away
Team Sunderland Man City
Goals 1 0
Shots 5 24
SOT 2 4
Home Away
Team Middlesbrough Reading
Goals 0 1
Shots 24 5
SOT 6 2
Home Away
Team Middlesbrough Leeds
Goals 0 1
Shots 27 8
SOT 10 3
Home Away
Team Fulham Leeds
Goals 0 3
Shots 27 8
SOT 7 5
Home Away
Team Coventry Milton Keynes Dons
Goals 2 1
Shots 4 23
SOT 3 4
Home Away
Team Carlisle Barnet
Goals 3 2
Shots 9 28
SOT 5 11
Home Away
Team Bury Cheltenham
Goals 2 3
Shots 23 5
SOT 9 5
Home Away
Team Hibernian Hamilton
Goals 1 2
Shots 24 6
SOT 15 1
Home Away
Team Fulham Tottenham
Goals 1 3
Shots 26 8
SOT 20 8
Home Away
Team Blackburn QPR
Goals 3 2
Shots 7 25
SOT 5 13
Home Away
Team Rochdale Exeter
Goals 2 3
Shots 31 13
SOT 18 6
Home Away
Team West Brom Norwich
Goals 0 2
Shots 26 8
SOT 12 3
Home Away
Team Crawley Town Swindon
Goals 1 0
Shots 8 26
SOT 3 7
Home Away
Team Bournemouth Newcastle
Goals 0 1
Shots 20 2
SOT 5 1
Home Away
Team Scunthorpe Blackpool
Goals 0 1
Shots 23 5
SOT 10 2

Chelsea have the top two spots. If you dominate a lot of teams, sooner or later you're going to lose despite this.

In [7]:
league_analysis.display_match(epl, 'Leicester', 'Watford', '07/11/15')

Leicester 2 - 1 Watford

Home Away
Team Leicester Watford
Goals 2 1
Shots 12 8
SOT 6 4

A more or less solid home victory for Leicester. I think everyone keeps expecting Leicester to trip up and revert to performance levels more akin to pre-season expectations. Watford on the other hand look better than they have so far been rewarded. However, the teams now have fairly similar PDO statistics:

In [8]:
after_game_no_dicts = league_analysis.collect_after_game_dicts(epl, '01/08/2015', '09/11/2015')
league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'pdo',
                                    rankings=True, teams=['Leicester', 'Watford'])
In [9]:
league_analysis.display_match(epl, 'Man United', 'West Brom', '07/11/15')

Man United 2 - 0 West Brom

Home Away
Team Man United West Brom
Goals 2 0
Shots 13 4
SOT 3 0

Manchester United continue to defy logic with their incredible efficiency. Definitely a much more in-depth look at Manchester United is required. If we look at goals-per-shot-on-target, surprisingly Manchester United are not leading this, but are behind West Ham, Leicester, and Everton. Chelsea also make a pretty surprisingly high appearance.

In [10]:
pairs = [(stats.teamname, stats.goals_sot_for_ratio)
         for stats in epl.team_stats.values()]
league_analysis.display_ranked_table(['Team', 'Goals per SOT'], pairs)
Position Team Goals per SOT
1 West Ham 0.4423076923076923
2 Leicester 0.4032258064516129
3 Everton 0.38461538461538464
4 Man United 0.37777777777777777
5 Chelsea 0.32653061224489793
6 Sunderland 0.325
7 Aston Villa 0.3225806451612903
8 Man City 0.3132530120481928
9 Southampton 0.3114754098360656
10 Norwich 0.3076923076923077
11 Watford 0.2972972972972973
12 Newcastle 0.28888888888888886
13 Arsenal 0.28205128205128205
14 Bournemouth 0.27906976744186046
15 West Brom 0.2702702702702703
16 Tottenham 0.26666666666666666
17 Crystal Palace 0.25925925925925924
18 Stoke 0.2564102564102564
19 Swansea 0.24
20 Liverpool 0.22807017543859648
In [11]:
teams = ['Man United', 'Leicester', 'West Ham', 'Everton', 'Chelsea', 'Liverpool', 'Swansea']

league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'goals_sot_for_ratio',
                                    rankings=True, teams=teams)
In [12]:
league_analysis.display_match(epl, 'Norwich', 'Swansea', '07/11/15')

Norwich 1 - 0 Swansea

Home Away
Team Norwich Swansea
Goals 1 0
Shots 9 8
SOT 5 0

Nice win for Norwich that they probably deserved, not just on the back of this performance but generally. Swansea might be a little concerned as the table above shows they are second bottom for goals per shots on target, which does not couple well with a lack of ability to create shots on target.

In [13]:
league_analysis.display_match(epl, 'Stoke', 'Chelsea', '07/11/15')

Stoke 1 - 0 Chelsea

Home Away
Team Stoke Chelsea
Goals 1 0
Shots 8 19
SOT 2 4

Interesting. Chelsea's rot continues. However, they were clearly pretty dominant. If they are looking for some hope, Chelsea fans could look to number of shots taken where Chelsea now rank a non-disastrous 7th, although they were 3rd at one point. TSR is also looking a little brighter, but far from champions' league form.

In [14]:
league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'shots_for',
                                    rankings=True)
league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'tsr',
                                    rankings=True)
In [15]:
league_analysis.display_match(epl, 'Sunderland', 'Southampton', '07/11/15')

Sunderland 0 - 1 Southampton

Home Away
Team Sunderland Southampton
Goals 0 1
Shots 9 11
SOT 3 4

Another home defeat, but Sunderland actually did not do too badly here. Match of the day said that Southampton were very dominant, on the basis of the shot counts alone they weren't that dominant. Sunderland can be a little pleased that they restricted Southampton to fewer than their average of 14.4 shots per game and fewer than their average shots on target per game. They also managed 3 shots on target whereas Southampton are generally restricting teams to just under 3, and for Sunderland 'about average' is much better than most of their previous games.

In [16]:
epl.compare_game_against_opponents('Sunderland', 'Southampton', '07/11/15')
Measure Average Per Game for This game for Average Per Game against opponents
Sunderland Shots 9.916666666666666 9 11.916666666666666
Southampton Shots 14.416666666666666 11 16.333333333333332
Sunderland SOT 3.3333333333333335 3 2.8333333333333335
Southampton SOT 5.083333333333333 4 6.0
In [17]:
league_analysis.display_match(epl, 'West Ham', 'Everton', '07/11/15')

West Ham 1 - 1 Everton

Home Away
Team West Ham Everton
Goals 1 1
Shots 16 13
SOT 5 4

Fairly straightforward draw. But West Ham fans unable to enjoy their current position in the knowledge that they have probably over-achieved somewhat will be pretty pleased with a deserved draw to a team that certainly could have taken all three points. Both these teams could do with more in-depth analysis.

In [18]:
league_analysis.display_match(epl, 'Arsenal', 'Tottenham', '08/11/15')

Arsenal 1 - 1 Tottenham

Home Away
Team Arsenal Tottenham
Goals 1 1
Shots 10 14
SOT 4 4

Excellent match for Tottenham. Arsenal are probably second favourites to win the league behind Manchester City, and at this point I'd suggest it is more likely Arsenal win the league than fail to be in the top three. But Tottenham are good. A deserved draw at Arsenal will be something of a rare item this season, and if Arsenal were to fail to be in the top three, I'd wager that Tottenham were one of the three pushing them out.

In [19]:
league_analysis.display_match(epl, 'Aston Villa', 'Man City', '08/11/15')

Aston Villa 0 - 0 Man City

Home Away
Team Aston Villa Man City
Goals 0 0
Shots 3 13
SOT 0 3

A draw against a very good City side will obviously be pretty welcome for a struggling Aston Villa side. Although City clearly dominanted the match and didn't allow Villa a single shot on target, City have dominated most teams they have played this season. Villa haven't managed as many shots against City has other teams have, but they have also restricted City more than other teams, given that a draw was probably the aim for Villa, I'd chaulk this up as something of an encouraging sign. Of course, it's only one match and Manchester City are probably not a good side to measure yourself against.

I'd said a few weeks ago that three teams look pretty poor, Newcastle, Sunderland and Villa. Sunderland and Villa promptly parted company with their respective managers. At the time I stated that I didn't really think a change of manager would help much at Sunderland, since no one really believes Dick Advocaat, or all of the succession of previous recent managers, were incompetent. However, it was a bit more plausible that a change of manager at Villa might have some effect. Still, Villa are not going to trouble the top half of the league this season, but they might at least be in the league next season.

In [20]:
epl.compare_game_against_opponents('Aston Villa', 'Man City', '08/11/15')
Measure Average Per Game for This game for Average Per Game against opponents
Aston Villa Shots 10.333333333333334 3 7.666666666666667
Man City Shots 18.25 13 13.166666666666666
Aston Villa SOT 2.5833333333333335 0 2.3333333333333335
Man City SOT 6.916666666666667 3 4.833333333333333
In [21]:
league_analysis.display_match(epl, 'Liverpool', 'Crystal Palace', '08/11/15')

Liverpool 1 - 2 Crystal Palace

Home Away
Team Liverpool Crystal Palace
Goals 1 2
Shots 22 9
SOT 4 4

Crystal Palace are seeming a bit strange. In particular they are doing better away from home than they are at home:

In [22]:
league_analysis.compare_home_away_form(epl, 'Crystal Palace')
Stat Home Away
points-avg 1.1666666666666667 2.0
goals_for-avg 1.0 1.3333333333333333
goals_against-avg 1.1666666666666667 0.8333333333333334
Shots For 74 70
Shots Against 88 114
TSR 0.4567901234567901 0.3804347826086957
SOTR 0.5306122448979592 0.4827586206896552
Goals For 6 8
Goals Against 7 5
SOT For 26 28
SOT Against 23 30
SOT For Ratio 0.35135135135135137 0.4
SOT Against Ratio 0.26136363636363635 0.2631578947368421
TSOTR 0.08998771498771502 0.13684210526315793
Goals SOT For Ratio 0.23076923076923078 0.2857142857142857
Goals SOT Against Ratio 0.30434782608695654 0.16666666666666666
PDO -0.07357859531772576 0.11904761904761904
Team Rating -0.05980116391348278 -0.08688896153427039

It is interesting that Crystal Palace are doing better away from home in terms of points and goals, but not in terms of total shots ratio or shots on target ratio, it seems that their better form away from home is mostly their shooting/save percentages, in other words, PDO. The question is, will their home form catch up to their away form, or their away form drop back to their home form?

In [23]:
epl.compare_game_against_opponents('Liverpool', 'Crystal Palace', '08/11/15')
Measure Average Per Game for This game for Average Per Game against opponents
Liverpool Shots 15.333333333333334 22 16.833333333333332
Crystal Palace Shots 12.0 9 10.75
Liverpool SOT 4.75 4 4.416666666666667
Crystal Palace SOT 4.5 4 3.25

As for Liverpool, I don't know. They seem unlucky so far to me.

As always, thanks for reading.

Comments

Comments powered by Disqus