EPL 28-29 November 2015

EPL November 28-29th 2015

Another brief look at the shot statistics that were behind the results in the top flight of English football over the weekend.

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

Aston Villa 2 - 3 Watford

Home Away
Team Aston Villa Watford
Goals 2 3
Shots 12 14
SOT 6 6

Obviously worrying times for Aston Villa, who still have not won since the first day of the season.

In [3]:
after_game_no_dicts = league_analysis.collect_after_game_dicts(epl, '01/08/2015', '30/11/2015')
league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'current_winless_run', rankings=False)

So a current winless run of 13, the next closest current is the rather unfortunate Bournemouth with 8, and even the next longest in the league at all is the 9 Sunderland accumulated before winning their 10th game.

This Game

However, on the face of it this wasn't actually that terrible a defeat. Though it says something that to look for the positive in a home game against a promoted side Villa have to suggest that they weren't dominated.

Watford though are starting to see a bit of an increase in return for what were at least acceptable performances.

In [4]:
league_analysis.display_match(epl, 'Bournemouth', 'Everton', '28/11/15')

Bournemouth 3 - 3 Everton

Home Away
Team Bournemouth Everton
Goals 3 3
Shots 19 11
SOT 10 6

Bournemouth just cannot seem to catch a break. I know they were behind for a lot of this game and may well feel pretty pleased about getting a point in the end, but the fact remains they are just not getting the rewards for their efforts.

In [5]:
pairs = [(stats.teamname, stats.pdo) for stats in epl.team_stats.values()]
league_analysis.display_ranked_table(['Team', 'PDO'], pairs)
Position Team PDO
1 Man United 0.16459253311922925
2 Everton 0.15298507462686567
3 West Ham 0.10745115856428894
4 Arsenal 0.06753246753246753
5 Leicester 0.05851548269581058
6 Watford 0.04583333333333334
7 Crystal Palace 0.03807418324735937
8 Stoke 0.03324808184143224
9 West Brom 0.03135888501742162
10 Tottenham 0.02460582895365504
11 Sunderland 0.009457441513190612
12 Man City 0.004678362573099393
13 Chelsea -0.021198830409356717
14 Swansea -0.06832694763729247
15 Aston Villa -0.06986301369863013
16 Southampton -0.07598784194528879
17 Newcastle -0.07870370370370366
18 Norwich -0.08705357142857145
19 Liverpool -0.09243697478991597
20 Bournemouth -0.22807017543859648
In [6]:
league_analysis.display_match(epl, 'Crystal Palace', 'Newcastle', '28/11/15')

Crystal Palace 5 - 1 Newcastle

Home Away
Team Crystal Palace Newcastle
Goals 5 1
Shots 19 7
SOT 8 2

As much as it might be bad for Aston Villa, Newcastle's fortunate wins over Bournemouth and slightly less so Norwich have masked a very worrying start to the season as a continuation of the year. James Yorke at stats bomb looked at whether or not Swansea should sack Garry Monk concluding, probably not. But he goes on to say that Steve McClaren's position is not looking great. Though it was a good point that two obvious candidates to replace him for the rest of the season in Tony Pulis and Sam Allardyce are already employed in the EPL. Newcastle are now bottom of the league for team rating, a measure that combines a team's TSR, TSOTT and PDO, weighted by how much we think is skills based.

In [7]:
pairs = [(stats.teamname, stats.team_rating) for stats in epl.team_stats.values()]
league_analysis.display_ranked_table(['Team', 'Team Rating'], pairs)
Position Team Team Rating
1 Man City 0.29239331169424077
2 Arsenal 0.22431918297581915
3 Tottenham 0.19031953443599622
4 Man United 0.12735348228262694
5 Liverpool 0.12064013918772673
6 Leicester 0.08609224121172165
7 Southampton 0.06216626593476378
8 West Ham 0.00021128442561606925
9 Everton -0.002121729096430526
10 Watford -0.007960047499524472
11 Chelsea -0.008806477945233936
12 Crystal Palace -0.013656516412672935
13 Bournemouth -0.040032476975535074
14 Swansea -0.048565472932468004
15 Norwich -0.078970963500586
16 Stoke -0.15151490294853057
17 West Brom -0.1752089770842564
18 Sunderland -0.1757943713246106
19 Aston Villa -0.18250534925485665
20 Newcastle -0.25591529726823836
In [8]:
league_analysis.display_match(epl, 'Leicester', 'Man United', '28/11/15')

Leicester 1 - 1 Man United

Home Away
Team Leicester Man United
Goals 1 1
Shots 7 10
SOT 3 2

Well, Jamie Vardy made his 11th straight game in the EPL with at least one goal. More importantly for those doubting that Leicester can maintain their level this was a pretty important point at home against a team in a similar league position, and not only that but it seems like the game merited a draw, they certainly were not unequivocally out-shot.

In [9]:
pairs = [(stats.teamname, stats.sot_for / stats.shots_for) for stats in epl.team_stats.values()]
league_analysis.display_ranked_table(['Team', 'SOTs/All Shots'], pairs)
Position Team SOTs/All Shots
1 Tottenham 0.4117647058823529
2 Everton 0.38953488372093026
3 Man City 0.3861788617886179
4 Crystal Palace 0.3791208791208791
5 Newcastle 0.36363636363636365
6 Man United 0.363013698630137
7 Leicester 0.36
8 Southampton 0.3482587064676617
9 Arsenal 0.3442622950819672
10 West Brom 0.33064516129032256
11 Sunderland 0.3288590604026846
12 West Ham 0.328042328042328
13 Liverpool 0.3269230769230769
14 Bournemouth 0.32386363636363635
15 Norwich 0.3218390804597701
16 Stoke 0.32167832167832167
17 Swansea 0.32142857142857145
18 Chelsea 0.2923076923076923
19 Aston Villa 0.273972602739726
20 Watford 0.2727272727272727
In [10]:
pairs = [(stats.teamname, stats.tsr - stats.sotr) for stats in epl.team_stats.values()]
league_analysis.display_ranked_table(['Team', 'TSR - SOTR'], pairs)
Position Team TSR - SOTR
1 Chelsea 0.09532961752834901
2 Aston Villa 0.08314344761803827
3 Watford 0.059853549824896546
4 Bournemouth 0.051724137931034475
5 Arsenal 0.027807805569016297
6 Sunderland 0.027571449147136884
7 Man United 0.012750929368029684
8 West Ham 0.012315599124393284
9 Norwich 0.010045662100456598
10 Swansea 0.007653061224489777
11 Man City -0.0027472527472527375
12 Leicester -0.00516035396802994
13 Stoke -0.00628654970760234
14 Everton -0.012298046780805427
15 West Brom -0.013862671071259991
16 Newcastle -0.015336266499057172
17 Liverpool -0.03391215526046987
18 Southampton -0.06371613020549194
19 Crystal Palace -0.08744959677419356
20 Tottenham -0.09020760261636174

Leicester are currently 6th in the league for team rating as the table above shows. Would it be so surprising if that is where they ended up? Certainly it seems that their current position is a bit of an over-performance. But suppose they end the season in 6th place for team rating, it would not take that much luck for them to finish in the top four.

In [11]:
league_analysis.display_match(epl, 'Man City', 'Southampton', '28/11/15')

Man City 3 - 1 Southampton

Home Away
Team Man City Southampton
Goals 3 1
Shots 16 12
SOT 9 8

Fairly routine home win, but generally Southampton did pretty reasonably here. They probably didn't earmark this game for any points anyway. They allowed a little more shots than is average for Manchester City (but that is both home and away average), particularly so for shots on target. However they managed more shots and shots on target than the average team against Man City does. Meaning that they competed pretty well, on another day could have sneaked a draw.

In [12]:
epl.compare_game_against_opponents('Man City', 'Southampton', '28/11/15')
Measure Average Per Game for This game for Average Per Game against opponents
Man City Shots 17.571428571428573 16 12.5
Southampton Shots 14.357142857142858 12 8.428571428571429
Man City SOT 6.785714285714286 9 3.357142857142857
Southampton SOT 5.0 8 3.2142857142857144

Southampton in general are pretty similar at home to how they are away, they have the exact same points per game. They shoot a bit more often at home and have a slighlty better tsr, but they actually have a better sotr away from home.

In [13]:
league_analysis.compare_home_away_form(epl, 'Southampton')
Stat Home Away
points-avg 1.4285714285714286 1.4285714285714286
goals_for-avg 1.7142857142857142 1.1428571428571428
goals_against-avg 1.4285714285714286 1.0
Shots For 114 87
Shots Against 95 80
TSR 0.5454545454545454 0.5209580838323353
SOTR 0.5901639344262295 0.6071428571428571
Goals For 12 8
Goals Against 10 7
SOT For 36 34
SOT Against 25 22
SOT For Ratio 0.3157894736842105 0.39080459770114945
SOT Against Ratio 0.2631578947368421 0.275
TSOTR 0.05263157894736842 0.11580459770114943
Goals SOT For Ratio 0.3333333333333333 0.23529411764705882
Goals SOT Against Ratio 0.4 0.3181818181818182
PDO -0.06666666666666671 -0.08288770053475936
Team Rating 0.07156299840510358 0.05332824623664344
In [14]:
league_analysis.display_match(epl, 'Sunderland', 'Stoke', '28/11/15')

Sunderland 2 - 0 Stoke

Home Away
Team Sunderland Stoke
Goals 2 0
Shots 18 7
SOT 5 3

Did not see this coming, but unlike a couple of recent victories for Sunderland, they actually deserved this one, at least in as far as shot counts are concerned. Are there signs of improvement for Sunderland? Arguably. Here is team rating plotted over the course of the season for the bottom 7 teams.

In [15]:
teams = ['Sunderland', 'Newcastle', 'Aston Villa', 'Bournemouth', 'Norwich', 'Swansea', 'Chelsea' ]
league_analysis.plot_changing_stats(epl, after_game_no_dicts, 'team_rating', teams=teams)
In [16]:
league_analysis.display_match(epl, 'Liverpool', 'Swansea', '29/11/15')

Liverpool 1 - 0 Swansea

Home Away
Team Liverpool Swansea
Goals 1 0
Shots 10 8
SOT 2 0

If you don't get any of your shots on target you are not going to score often. A good victory for Liverpool, but their fans may well feel like it was not as dominant as their victory over Manchester City.

In [17]:
league_analysis.display_match(epl, 'Norwich', 'Arsenal', '29/11/15')

Norwich 1 - 1 Arsenal

Home Away
Team Norwich Arsenal
Goals 1 1
Shots 7 12
SOT 2 3

I still think Arsenal are title contenders. They were on top here, but arguably Norwich did enough to earn a draw.

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

Tottenham 0 - 0 Chelsea

Home Away
Team Tottenham Chelsea
Goals 0 0
Shots 9 5
SOT 4 1

Interesting, Chelsea somewhat snuffed the game out here. Given that a win was probably more urgent for the champions than their hosts that somewhat tells you where the two teams currently are. Tottenham fans should be more flattered than peeved.

In [19]:
league_analysis.display_match(epl, 'West Ham', 'West Brom', '29/11/15')

West Ham 1 - 1 West Brom

Home Away
Team West Ham West Brom
Goals 1 1
Shots 17 7
SOT 6 3

I pretty much give up trying to figure out West Ham. I guess they are good enough to be in the top half of the division.

They have significantly more points per game away from home than they do at home. But they are a better team at home. For sure there are some score-effects in play here, in particular big wins away to Arsenal and Manchester City contribute here.

In [20]:
league_analysis.compare_home_away_form(epl, 'West Ham')
Stat Home Away
points-avg 1.2857142857142858 1.8571428571428572
goals_for-avg 1.7142857142857142 1.8571428571428572
goals_against-avg 1.5714285714285714 1.4285714285714286
Shots For 101 88
Shots Against 84 122
TSR 0.5459459459459459 0.41904761904761906
SOTR 0.4852941176470588 0.4461538461538462
Goals For 12 13
Goals Against 11 10
SOT For 33 29
SOT Against 35 36
SOT For Ratio 0.32673267326732675 0.32954545454545453
SOT Against Ratio 0.4166666666666667 0.29508196721311475
TSOTR -0.08993399339933994 0.03446348733233978
Goals SOT For Ratio 0.36363636363636365 0.4482758620689655
Goals SOT Against Ratio 0.3142857142857143 0.2777777777777778
PDO 0.04935064935064937 0.17049808429118773
Team Rating 0.05462131406190808 -0.04905410174587675

As always thanks for reading.

Comments

Comments powered by Disqus