Introduction

This is the third in a series of forecasts of football match outcomes, following on from my efforts last week and the week before. The method of forecasts is unchanged from previous week. For next week I hope to add bookmaker prices in for reference purposes.

Loading the Data

As with previous weeks, the dataset is all English matches recorded on http://www.soccerbase.com, which goes back to 1877 and the very first football matches.  Experimentation will take place with adjusting the estimation sample size, since it is not necessarily useful to have all matches back to 1877 when forecasting matches in 2015.  The Elo ranks have been calculated since the very first matches, and hence historical information is retained, to the extent that it is useful in determining a team’s current strength, back throughout footballing history.

library(knitr)
library(MASS)
date.1 <- "2015-02-13"
wd <- "/home/readejj/Dropbox/Teaching/Reading/ec313/2015/Football-forecasts/"
forecast.matches <- read.csv(paste(wd,"forecasts_",date.1,".csv",sep=""))
forecast.matches <- forecast.matches[is.na(forecast.matches$outcome)==F,]

Forecast Model

The linear regression model is estimated here and reported:

res.eng <- read.csv(paste(wd,"historical_",date.1,".csv",sep=""))
model <- lm(outcome ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 + pld.D + pld.D.2 + gs1 + gs.D + gs.D.2 
            + gd1 + gd.D + gd.D.2 
            + pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 + tier1 + tier.D + tier.D.2 + season.d,
            data=res.eng)
summary(model)
## 
## Call:
## lm(formula = outcome ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 + 
##     pld.D + pld.D.2 + gs1 + gs.D + gs.D.2 + gd1 + gd.D + gd.D.2 + 
##     pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 + tier1 + 
##     tier.D + tier.D.2 + season.d, data = res.eng)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.0175 -0.2936  0.1390  0.3498  0.8446 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.013e-01  7.141e-03  56.199  < 2e-16 ***
## E.1          4.051e-01  1.097e-02  36.910  < 2e-16 ***
## pts1         1.043e-03  4.308e-04   2.421  0.01549 *  
## pts.D       -2.848e-03  3.153e-04  -9.035  < 2e-16 ***
## pts.D.2     -1.393e-05  6.574e-06  -2.120  0.03404 *  
## pld1        -1.721e-03  6.192e-04  -2.779  0.00545 ** 
## pld.D        3.401e-03  7.236e-04   4.700 2.61e-06 ***
## pld.D.2     -4.550e-05  3.131e-05  -1.454  0.14608    
## gs1          5.058e-04  1.737e-04   2.912  0.00359 ** 
## gs.D        -3.027e-05  1.551e-04  -0.195  0.84529    
## gs.D.2      -1.637e-06  4.764e-06  -0.344  0.73116    
## gd1         -6.785e-04  2.445e-04  -2.775  0.00552 ** 
## gd.D         3.424e-03  1.784e-04  19.191  < 2e-16 ***
## gd.D.2      -5.614e-06  2.379e-06  -2.359  0.01830 *  
## pos1         7.934e-04  3.052e-04   2.599  0.00934 ** 
## pos.D       -4.188e-04  2.583e-04  -1.621  0.10494    
## pos.D.2      3.603e-05  1.189e-05   3.030  0.00244 ** 
## form1        7.654e-04  3.574e-04   2.142  0.03220 *  
## form.D      -2.168e-03  3.344e-04  -6.484 8.96e-11 ***
## form.D.2    -7.911e-05  3.044e-05  -2.599  0.00935 ** 
## tier1        2.000e-03  7.779e-04   2.572  0.01012 *  
## tier.D      -5.401e-02  3.172e-03 -17.028  < 2e-16 ***
## tier.D.2    -5.876e-03  1.277e-03  -4.601 4.21e-06 ***
## season.d    -1.105e-03  3.132e-05 -35.283  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4008 on 215758 degrees of freedom
##   (38021 observations deleted due to missingness)
## Multiple R-squared:  0.05682,    Adjusted R-squared:  0.05672 
## F-statistic: 565.1 on 23 and 215758 DF,  p-value: < 2.2e-16

The ordered logistic regression model is:

model.ord <- polr(as.factor(outcome) ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 + pld.D + pld.D.2 + 
                    gs1 + gs.D + gs.D.2 + gd1 + gd.D + gd.D.2 + pos1 + pos.D + pos.D.2 + 
                    form1 + form.D + form.D.2 + tier1 + tier.D + tier.D.2 + season.d, 
                  data=res.eng, method = "logistic")
summary(model.ord)
## 
## Re-fitting to get Hessian
## Call:
## polr(formula = as.factor(outcome) ~ E.1 + pts1 + pts.D + pts.D.2 + 
##     pld1 + pld.D + pld.D.2 + gs1 + gs.D + gs.D.2 + gd1 + gd.D + 
##     gd.D.2 + pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 + 
##     tier1 + tier.D + tier.D.2 + season.d, data = res.eng, method = "logistic")
## 
## Coefficients:
##               Value Std. Error  t value
## E.1       1.911e+00  9.478e-03 201.5822
## pts1      4.334e-03  2.069e-03   2.0953
## pts.D    -1.424e-02  1.503e-03  -9.4704
## pts.D.2  -7.916e-05  3.582e-05  -2.2098
## pld1     -9.536e-03  2.976e-03  -3.2039
## pld.D     1.860e-02  3.527e-03   5.2735
## pld.D.2  -2.538e-04  1.606e-04  -1.5802
## gs1       3.692e-03  8.455e-04   4.3665
## gs.D     -5.924e-04  7.528e-04  -0.7869
## gs.D.2   -3.010e-06  2.544e-05  -0.1183
## gd1      -3.792e-03  1.186e-03  -3.1984
## gd.D      1.774e-02  8.713e-04  20.3634
## gd.D.2    7.060e-06  1.637e-05   0.4313
## pos1      3.107e-03  1.446e-03   2.1480
## pos.D    -1.142e-03  1.240e-03  -0.9211
## pos.D.2   1.961e-04  5.900e-05   3.3241
## form1     3.467e-03  1.702e-03   2.0373
## form.D   -9.760e-03  1.415e-03  -6.8966
## form.D.2 -2.759e-04  1.481e-04  -1.8633
## tier1     9.465e-03  3.693e-03   2.5627
## tier.D   -2.825e-01  1.428e-02 -19.7836
## tier.D.2 -8.418e-03  6.901e-03  -1.2198
## season.d -5.405e-03  1.514e-04 -35.7005
## 
## Intercepts:
##       Value    Std. Error t value 
## 0|0.5  -0.1004   0.0170    -5.9140
## 0.5|1   1.0602   0.0170    62.4785
## 
## Residual Deviance: 434042.87 
## AIC: 434092.87 
## (38021 observations deleted due to missingness)

The Forecasts

FA Cup

First, our FA Cup forecasts:

facup.matches <- forecast.matches[forecast.matches$division=="English FA Cup",]
facup.matches$id <- 1:NROW(facup.matches)
par(mar=c(9,4,4,5)+.1)
plot(facup.matches$id,facup.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend FA Cup Matches",
     ylab="Probability of Outcome")
lines(facup.matches$id,facup.matches$Ph,col=2,pch=15,type="p")
lines(facup.matches$id,facup.matches$Pd,col=3,pch=16,type="p")
lines(facup.matches$id,facup.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
axis(1,at=facup.matches$id,labels=paste(facup.matches$team1,facup.matches$team2,sep=" v "),las=2,cex.axis=0.65)

The coloured dots are forecasts from the ordered logistic regression model; the black circles are the forecasts from a simple OLS linear probability model.  Hence the black circles are essentially a probability of a home win occurring (given the ordinal variable defined to capture all three outcomes), whereas the red squares are the probability of a home win, the green solid circles are the probability of a draw, and the blue triangles the probability of an away win.  The home bias in football is notable in that the majority of red squares lie above blue triangles.

The forecasts suggest that the Blackburn-Stoke, Crystal Palace-Liverpool, West Brom-West Ham and Aston Villa-Leicester matches will be tight. I’m hopeful in future weeks that a “change of manager” variable will be added to the model to attempt to capture the likely boost Aston Villa will get having parted with their manager in the week. Derby have the highest forecast probability of winning in all the ties this weekend, followed by Manchester United at Preston.

An additional interesting insight is provided by bookmaker prices. We scrape prices from http://www.oddsportal.com/ and look at the average bookmaker price for each of the outcomes, converted into an implied probability, and plot below for the FA Cup:

bookies <- read.csv("/home/readejj/Dropbox/Teaching/Reading/ec313/2015/Football-forecasts/betting_prices_2015-02-13 22:54:19.850486.csv",stringsAsFactors=F)
bookies$odds1 <- as.numeric(bookies$odds1)
## Warning: NAs introduced by coercion
bookies$odds2 <- as.numeric(bookies$odds2)
## Warning: NAs introduced by coercion
bookies$odds3 <- as.numeric(bookies$odds3)
## Warning: NAs introduced by coercion
facup.bk <- aggregate(bookies[regexpr("FA Cup",bookies$keywords)>-1,c("odds1","odds2","odds3")],
                      by=list(bookies$match[regexpr("FA Cup",bookies$keywords)>-1]),FUN=mean,na.rm=T)
facup.bk$Group.1 <- gsub("Manchester United","Man Utd",facup.bk$Group.1)
facup.bk$Group.1 <- gsub("Crystal Palace","C Palace",facup.bk$Group.1)
facup.bk$Group.1 <- gsub("Middlesbrough","Middlesbro",facup.bk$Group.1)
facup.bk$Group.1 <- gsub("Stoke City","Stoke",facup.bk$Group.1)
facup.bk$team1 <- gsub("^(.*?) - (.*?)$","\\1",facup.bk$Group.1)
facup.bk$team2 <- gsub("^(.*?) - (.*?)$","\\2",facup.bk$Group.1)
facup.matches <- merge(facup.matches,facup.bk,by=c("team1","team2"),all.x=T)

par(mar=c(9,4,4,5)+.1)
plot(facup.matches$id,facup.matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",
     main="Forecasts of Weekend FA Cup Matches",
     ylab="Probability of Outcome")
lines(facup.matches$id,1/facup.matches$odds1,col=2,pch=0,type="p")
lines(facup.matches$id,facup.matches$Pd,col=3,pch=16,type="p")
lines(facup.matches$id,1/facup.matches$odds2,col=3,pch=1,type="p")
lines(facup.matches$id,facup.matches$Pa,col=4,pch=17,type="p")
lines(facup.matches$id,1/facup.matches$odds3,col=4,pch=2,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
axis(1,at=facup.matches$id,labels=paste(facup.matches$team1,facup.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Hence the bookmakers do not rate Derby’s likelihood of victory as highly as my model does, whilst bookmakers rate Man United’s chances at Preston even more highly than my model. This may simply be a manifestation of the favourite-longshot bias; similarly with the discrepancy in Arsenal’s likelihood of victory against Middlebrough.

Championship

Next, our Championship forecasts:

champ.matches <- forecast.matches[forecast.matches$division=="English Championship",]
champ.matches$id <- 1:NROW(champ.matches)
par(mar=c(9,4,4,5)+.1)
plot(champ.matches$id,champ.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Championship Matches",
     ylab="Probability of Outcome")
lines(champ.matches$id,champ.matches$Ph,col=2,pch=15,type="p")
lines(champ.matches$id,champ.matches$Pd,col=3,pch=16,type="p")
lines(champ.matches$id,champ.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
axis(1,at=champ.matches$id,labels=paste(champ.matches$team1,champ.matches$team2,sep=" v "),las=2,cex.axis=0.65)

The biggest favourites to win in the Championship this weekend are Bournemouth in their clash with Huddersfield.

League One

Next, our League One forecasts:

lg1.matches <- forecast.matches[forecast.matches$division=="English League One",]
lg1.matches$id <- 1:NROW(lg1.matches)
par(mar=c(9,4,4,5)+.1)
plot(lg1.matches$id,lg1.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend League One Matches",
     ylab="Probability of Outcome")
lines(lg1.matches$id,lg1.matches$Ph,col=2,pch=15,type="p")
lines(lg1.matches$id,lg1.matches$Pd,col=3,pch=16,type="p")
lines(lg1.matches$id,lg1.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
axis(1,at=lg1.matches$id,labels=paste(lg1.matches$team1,lg1.matches$team2,sep=" v "),las=2,cex.axis=0.65)

League One sees a number of likely home wins, most likely of which is Bristol City when facing Peterborough.

League Two

Next, our League Two forecasts:

lg2.matches <- forecast.matches[forecast.matches$division=="English League Two",]
lg2.matches$id <- 1:NROW(lg2.matches)
par(mar=c(9,4,4,5)+.1)
plot(lg2.matches$id,lg2.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend League Two Matches",
     ylab="Probability of Outcome")
lines(lg2.matches$id,lg2.matches$Ph,col=2,pch=15,type="p")
lines(lg2.matches$id,lg2.matches$Pd,col=3,pch=16,type="p")
lines(lg2.matches$id,lg2.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
axis(1,at=lg2.matches$id,labels=paste(lg2.matches$team1,lg2.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Football Conference

Next, our Football Conference forecasts:

conf.matches <- forecast.matches[forecast.matches$division=="Football Conference",]
conf.matches$id <- 1:NROW(conf.matches)
par(mar=c(9,4,4,5)+.1)
plot(conf.matches$id,conf.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Football Conference Matches",
     ylab="Probability of Outcome")
lines(conf.matches$id,conf.matches$Ph,col=2,pch=15,type="p")
lines(conf.matches$id,conf.matches$Pd,col=3,pch=16,type="p")
lines(conf.matches$id,conf.matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
       legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
axis(1,at=conf.matches$id,labels=paste(conf.matches$team1,conf.matches$team2,sep=" v "),las=2,cex.axis=0.65)

List of all forecasts

For transparency, all forecasts are also listed as a table:

kable(forecast.matches[order(forecast.matches$date,forecast.matches$division),
                       c("date","division","team1","outcome","team2","Ph","Pd","Pa")])
date division team1 outcome team2 Ph Pd Pa
59 2015-02-14 Conference North Stockport 0.7928062 Hyde 0.7205194 0.1711199 0.1083606
60 2015-02-14 Conference North Boston Utd 0.6910559 Bradford PA 0.5789428 0.2354775 0.1855796
1 2015-02-14 English Championship Blackpool 0.4804788 Nottm Forest 0.3333087 0.2814356 0.3852556
2 2015-02-14 English Championship Norwich 0.6496203 Wolves 0.5317588 0.2520096 0.2162315
3 2015-02-14 English Championship Bolton 0.4944355 Watford 0.3458833 0.2820528 0.3720639
4 2015-02-14 English Championship Sheff Wed 0.5730854 Brighton 0.4243613 0.2773923 0.2982464
5 2015-02-14 English Championship Bournemouth 0.7710514 Huddersfield 0.6821898 0.1904397 0.1273705
6 2015-02-14 English Championship Leeds 0.6517284 Millwall 0.5248527 0.2541820 0.2209653
7 2015-02-14 English Championship Charlton 0.4793118 Brentford 0.3301633 0.2812153 0.3886214
8 2015-02-14 English Championship Fulham 0.4725960 Ipswich 0.3240754 0.2807117 0.3952129
98 2015-02-14 English FA Cup Blackburn 0.4393591 Stoke 0.2862546 0.2751618 0.4385836
99 2015-02-14 English FA Cup C Palace 0.4926068 Liverpool 0.3414431 0.2818824 0.3766745
100 2015-02-14 English FA Cup Derby 0.7458782 Reading 0.6484037 0.2063754 0.1452209
101 2015-02-14 English FA Cup West Brom 0.4978087 West Ham 0.3474745 0.2821015 0.3704240
9 2015-02-14 English League One Gillingham 0.4663722 MK Dons 0.3193624 0.2802508 0.4003867
10 2015-02-14 English League One Peterborough 0.5045922 Rochdale 0.3525335 0.2822134 0.3652531
11 2015-02-14 English League One Chesterfield 0.7020723 Leyton Orient 0.5845705 0.2333202 0.1821093
12 2015-02-14 English League One Doncaster 0.6901215 Yeovil 0.5704271 0.2386696 0.1909033
13 2015-02-14 English League One Scunthorpe 0.4865076 Swindon 0.3393653 0.2817850 0.3788498
14 2015-02-14 English League One Walsall 0.6638441 Port Vale 0.5386012 0.2497925 0.2116063
15 2015-02-14 English League One Bristol C 0.6707691 Sheff Utd 0.5540402 0.2445596 0.2014003
16 2015-02-14 English League One Crewe 0.5527338 Fleetwood 0.4052684 0.2797641 0.3149676
17 2015-02-14 English League One Oldham 0.6872876 Colchester 0.5688543 0.2392495 0.1918963
18 2015-02-14 English League One Crawley 0.4744462 Barnsley 0.3218589 0.2805028 0.3976383
19 2015-02-14 English League Two Burton 0.6810356 Oxford 0.5569975 0.2435217 0.1994808
20 2015-02-14 English League Two Hartlepool 0.4915018 Stevenage 0.3427982 0.2819399 0.3752619
21 2015-02-14 English League Two Luton 0.7110453 Carlisle 0.5976611 0.2281587 0.1741802
22 2015-02-14 English League Two Mansfield 0.5017062 Northampton 0.3508069 0.2821825 0.3670105
23 2015-02-14 English League Two Cheltenham 0.4790124 Bury 0.3285376 0.2810908 0.3903716
24 2015-02-14 English League Two York 0.5617495 Tranmere 0.4160725 0.2785119 0.3054156
25 2015-02-14 English League Two Wycombe 0.6479863 Newport Co 0.5222602 0.2549803 0.2227595
26 2015-02-14 English League Two Shrewsbury 0.6780475 AFC W’bledon 0.5580401 0.2431532 0.1988068
27 2015-02-14 English League Two Portsmouth 0.5887559 Exeter 0.4492478 0.2732423 0.2775099
28 2015-02-14 English League Two Southend 0.6936066 Accrington 0.5780157 0.2358293 0.1861550
29 2015-02-14 English League Two Plymouth 0.5815134 Cambridge U 0.4372511 0.2753870 0.2873619
30 2015-02-14 Football Conference Altrincham 0.5330155 Forest Green 0.3854939 0.2814209 0.3330852
31 2015-02-14 Football Conference Aldershot 0.5800231 Welling 0.4386217 0.2751554 0.2862230
32 2015-02-14 Football Conference Kidderminster 0.5483510 Woking 0.3983975 0.2804348 0.3211677
33 2015-02-14 Football Conference Halifax 0.5538107 Dover 0.4060521 0.2796813 0.3142666
34 2015-02-14 Football Conference Southport 0.4111772 Macclesfield 0.2667889 0.2705369 0.4626742
35 2015-02-14 Football Conference Eastleigh 0.6228813 Torquay 0.4907618 0.2638941 0.2453441
36 2015-02-14 Football Conference Gateshead 0.7818561 Nuneaton 0.6895111 0.1868477 0.1236412
37 2015-02-14 Football Conference Braintree 0.6812044 Alfreton 0.5704052 0.2386777 0.1909171
38 2015-02-14 Football Conference Wrexham 0.4318478 Barnet 0.2860870 0.2751274 0.4387856
39 2015-02-14 Football Conference Grimsby 0.6043868 Bristol R 0.4671363 0.2695688 0.2632950
40 2015-02-14 Football Conference Lincoln 0.6211194 Chester 0.4897203 0.2641632 0.2461166
41 2015-02-14 Football Conference Telford 0.6219963 Dartford 0.4954374 0.2626654 0.2418971
80 2015-02-14 Ryman Premier Canvey Isl. 0.6589050 Grays 0.5527878 0.2449957 0.2022165
103 2015-02-15 English FA Cup Arsenal 0.6950703 Middlesbro 0.5827696 0.2340147 0.1832157
104 2015-02-15 English FA Cup Aston Villa 0.5402466 Leicester 0.3893593 0.2811636 0.3294770
105 2015-02-15 English FA Cup Bradford 0.3794712 Sunderland 0.2397159 0.2618640 0.4984201
102 2015-02-15 English League Two Morecambe 0.5980164 Dag & Red 0.4577094 0.2715740 0.2707166
107 2015-02-16 English FA Cup Preston 0.2991186 Man Utd 0.1741355 0.2281287 0.5977357
117 2015-02-17 Conference South Bath City 0.7376143 Farnborough 0.6272198 0.2157993 0.1569809
108 2015-02-17 English Championship Rotherham 0.4049631 Derby 0.2602807 0.2686986 0.4710207
109 2015-02-17 English Championship Reading 0.6500941 Wigan 0.5184511 0.2561358 0.2254131
110 2015-02-17 English Championship Cardiff 0.5225144 Blackburn 0.3739658 0.2819885 0.3440457
111 2015-02-17 English League One Doncaster 0.6468889 Crewe 0.5249289 0.2541584 0.2209127
112 2015-02-17 English League One Scunthorpe 0.5554547 Chesterfield 0.4119968 0.2790122 0.3089911
128 2015-02-17 English League One Notts Co 0.4916847 Sheff Utd 0.3387332 0.2817531 0.3795137
129 2015-02-17 English League One Bristol C 0.7467466 Peterborough 0.6412391 0.2096135 0.1491474
130 2015-02-17 English League One Colchester 0.3826489 MK Dons 0.2451824 0.2638375 0.4909801
127 2015-02-17 English League Two Mansfield 0.4494845 Luton 0.2977173 0.2773034 0.4249793
132 2015-02-18 Conference North Bradford PA 0.4587552 Stockport 0.3100066 0.2791473 0.4108461
131 2015-02-18 English Championship Birmingham 0.3868512 Middlesbro 0.2422403 0.2627898 0.4949699
137 2015-02-18 English League One Leyton Orient 0.4766566 Bradford 0.3285868 0.2810947 0.3903185
136 2015-02-18 Ryman Premier Grays 0.3640978 Maidstone 0.2261596 0.2564556 0.5173848