Introduction

This is the fourth in a series of forecasts of football match outcomes, following on from my efforts last week and the previous weeks. 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-20"
forecast.matches <- read.csv(paste("forecasts_",date.1,".csv",sep=""),stringsAsFactors=F)
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("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.0174 -0.2941  0.1385  0.3498  0.8441 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.011e-01  7.140e-03  56.174  < 2e-16 ***
## E.1          4.049e-01  1.097e-02  36.904  < 2e-16 ***
## pts1         1.029e-03  4.304e-04   2.390  0.01686 *  
## pts.D       -2.831e-03  3.150e-04  -8.988  < 2e-16 ***
## pts.D.2     -1.388e-05  6.571e-06  -2.112  0.03467 *  
## pld1        -1.692e-03  6.187e-04  -2.734  0.00625 ** 
## pld.D        3.350e-03  7.230e-04   4.634 3.59e-06 ***
## pld.D.2     -4.590e-05  3.128e-05  -1.467  0.14233    
## gs1          4.968e-04  1.736e-04   2.862  0.00421 ** 
## gs.D        -3.019e-05  1.550e-04  -0.195  0.84561    
## gs.D.2      -1.351e-06  4.761e-06  -0.284  0.77658    
## gd1         -6.684e-04  2.443e-04  -2.736  0.00622 ** 
## gd.D         3.418e-03  1.783e-04  19.172  < 2e-16 ***
## gd.D.2      -5.616e-06  2.379e-06  -2.361  0.01821 *  
## pos1         7.929e-04  3.052e-04   2.598  0.00937 ** 
## pos.D       -4.210e-04  2.582e-04  -1.631  0.10296    
## pos.D.2      3.579e-05  1.188e-05   3.012  0.00260 ** 
## form1        7.699e-04  3.572e-04   2.155  0.03115 *  
## form.D      -2.195e-03  3.342e-04  -6.569 5.07e-11 ***
## form.D.2    -8.049e-05  3.042e-05  -2.646  0.00814 ** 
## tier1        2.032e-03  7.772e-04   2.614  0.00895 ** 
## tier.D      -5.399e-02  3.172e-03 -17.023  < 2e-16 ***
## tier.D.2    -5.841e-03  1.277e-03  -4.574 4.78e-06 ***
## season.d    -1.107e-03  3.129e-05 -35.379  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4009 on 216074 degrees of freedom
##   (39267 observations deleted due to missingness)
## Multiple R-squared:  0.0568, Adjusted R-squared:  0.0567 
## F-statistic: 565.7 on 23 and 216074 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.909e+00  9.478e-03 201.4617
## pts1      4.270e-03  2.067e-03   2.0659
## pts.D    -1.416e-02  1.502e-03  -9.4261
## pts.D.2  -7.908e-05  3.580e-05  -2.2091
## pld1     -9.388e-03  2.974e-03  -3.1570
## pld.D     1.831e-02  3.524e-03   5.1968
## pld.D.2  -2.546e-04  1.606e-04  -1.5848
## gs1       3.644e-03  8.451e-04   4.3118
## gs.D     -5.869e-04  7.523e-04  -0.7802
## gs.D.2   -1.744e-06  2.542e-05  -0.0686
## gd1      -3.744e-03  1.184e-03  -3.1613
## gd.D      1.771e-02  8.705e-04  20.3451
## gd.D.2    7.102e-06  1.636e-05   0.4342
## pos1      3.100e-03  1.446e-03   2.1444
## pos.D    -1.149e-03  1.239e-03  -0.9274
## pos.D.2   1.951e-04  5.896e-05   3.3093
## form1     3.485e-03  1.701e-03   2.0488
## form.D   -9.878e-03  1.414e-03  -6.9857
## form.D.2 -2.819e-04  1.479e-04  -1.9057
## tier1     9.623e-03  3.690e-03   2.6083
## tier.D   -2.823e-01  1.427e-02 -19.7784
## tier.D.2 -8.277e-03  6.899e-03  -1.1997
## season.d -5.412e-03  1.512e-04 -35.7836
## 
## Intercepts:
##       Value    Std. Error t value 
## 0|0.5  -0.0991   0.0170    -5.8389
## 0.5|1   1.0612   0.0170    62.5415
## 
## Residual Deviance: 434711.02 
## AIC: 434761.02 
## (39267 observations deleted due to missingness)

The Forecasts

Premier League

prem.matches <- forecast.matches[forecast.matches$division=="English Premier",]
prem.matches <- prem.matches[order(prem.matches$date),]
prem.matches$id <- 1:NROW(prem.matches)
par(mar=c(9,4,4,5)+.1)
plot(prem.matches$id,prem.matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
     main="Forecasts of Weekend Premier League Matches",
     ylab="Probability of Outcome")
lines(prem.matches$id,prem.matches$Ph,col=2,pch=15,type="p")
lines(prem.matches$id,prem.matches$Pd,col=3,pch=16,type="p")
lines(prem.matches$id,prem.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=prem.matches$id,labels=paste(prem.matches$team1,prem.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 Premier League:

files <- list.files(pattern="betting_prices_.*.csv$")

bookies <- read.csv(files[NROW(files)],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
#bookies$team1 <- gsub("^(.*?) - (.*?)$","\\1",bookies$match)
#bookies$team2 <- gsub("^(.*?) - (.*?)$","\\2",bookies$match)

prem.bk <- aggregate(bookies[regexpr("Premier",bookies$keywords)>-1,c("odds1","odds2","odds3")],
                      by=list(bookies$match[regexpr("Premier",bookies$keywords)>-1]),FUN=mean,na.rm=T)
prem.bk$Group.1 <- gsub("Manchester United","Man Utd",prem.bk$Group.1)
prem.bk$Group.1 <- gsub("Manchester City","Man City",prem.bk$Group.1)
prem.bk$Group.1 <- gsub("Crystal Palace","C Palace",prem.bk$Group.1)
prem.bk$Group.1 <- gsub("Stoke City","Stoke",prem.bk$Group.1)
prem.bk$Group.1 <- gsub("Hull City","Hull",prem.bk$Group.1)
prem.bk$Group.1 <- gsub("Newcastle Utd","Newcastle",prem.bk$Group.1)
prem.bk$team1 <- gsub("^(.*?) - (.*?)$","\\1",prem.bk$Group.1)
prem.bk$team2 <- gsub("^(.*?) - (.*?)$","\\2",prem.bk$Group.1)
prem.matches <- merge(prem.matches,prem.bk,by=c("team1","team2"),all.x=T)

par(mar=c(9,4,4,5)+.1)
plot(prem.matches$id,prem.matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",
     main="Forecasts of Weekend Premier League Matches",
     ylab="Probability of Outcome")
lines(prem.matches$id,1/prem.matches$odds1,col=2,pch=0,type="p")
lines(prem.matches$id,prem.matches$Pd,col=3,pch=16,type="p")
lines(prem.matches$id,1/prem.matches$odds2,col=3,pch=1,type="p")
lines(prem.matches$id,prem.matches$Pa,col=4,pch=17,type="p")
lines(prem.matches$id,1/prem.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=prem.matches$id,labels=paste(prem.matches$team1,prem.matches$team2,sep=" v "),las=2,cex.axis=0.65)

The big divergences, as with last week, is for big favourites in matches (Man City and Chelsea mainly, but also Arsenal and Manchester United).

Championship

Next, our Championship forecasts:

champ.matches <- forecast.matches[forecast.matches$division=="English Championship",]
champ.matches <- champ.matches[order(champ.matches$date),]
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)

champ.bk <- aggregate(bookies[regexpr("Championship",bookies$keywords)>-1,c("odds1","odds2","odds3")],
                      by=list(bookies$match[regexpr("Championship",bookies$keywords)>-1]),FUN=mean,na.rm=T)
champ.bk$Group.1 <- gsub("Middlesbrough","Middlesbro",champ.bk$Group.1)
champ.bk$Group.1 <- gsub("Sheffield","Sheff",champ.bk$Group.1)
champ.bk$team1 <- gsub("^(.*?) - (.*?)$","\\1",champ.bk$Group.1)
champ.bk$team2 <- gsub("^(.*?) - (.*?)$","\\2",champ.bk$Group.1)
champ.matches <- merge(champ.matches,champ.bk,by=c("team1","team2"),all.x=T)

par(mar=c(9,4,4,5)+.1)
plot(champ.matches$id,champ.matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",
     main="Forecasts of Weekend Championship Matches",
     ylab="Probability of Outcome")
lines(champ.matches$id,1/champ.matches$odds1,col=2,pch=0,type="p")
lines(champ.matches$id,champ.matches$Pd,col=3,pch=16,type="p")
lines(champ.matches$id,1/champ.matches$odds2,col=3,pch=1,type="p")
lines(champ.matches$id,champ.matches$Pa,col=4,pch=17,type="p")
lines(champ.matches$id,1/champ.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=champ.matches$id,labels=paste(champ.matches$team1,champ.matches$team2,sep=" v "),las=2,cex.axis=0.65)

The prices on Wigan, Reading and Norwich, all recently in the Premier League, seem overly optimistic relative to my model; this pattern is evident below for Portsmouth in League Two, and arguably for Arsenal and Man United in tough away matches. Nonetheless, it is not a favourite-longshot bias, since a higher implied probability implies lower odds. And it may simply be a quirk of the fixtures this particular week.

League One

Next, our League One forecasts:

lg1.matches <- forecast.matches[forecast.matches$division=="English League One",]
lg1.matches <- lg1.matches[order(lg1.matches$date),]
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)

There is at least two strong home bankers in League One, namely MK Dons and Swindon, facing Peterborough and Crawley respectively.

Next, we include bookmaker prices, where available (i.e. only for the weekend matches), at League One level:

lg1.bk <- aggregate(bookies[regexpr("League One",bookies$keywords)>-1,c("odds1","odds2","odds3")],
                      by=list(bookies$match[regexpr("League One",bookies$keywords)>-1]),FUN=mean,na.rm=T)
lg1.bk$Group.1 <- gsub(" FC","",lg1.bk$Group.1)
lg1.bk$Group.1 <- gsub("Milton Keynes","MK",lg1.bk$Group.1)
lg1.bk$Group.1 <- gsub(" Town","",lg1.bk$Group.1)
lg1.bk$Group.1 <- gsub("Notts County","Notts Co",lg1.bk$Group.1)
lg1.bk$team1 <- gsub("^(.*?) - (.*?)$","\\1",lg1.bk$Group.1)
lg1.bk$team2 <- gsub("^(.*?) - (.*?)$","\\2",lg1.bk$Group.1)
lg1.matches <- merge(lg1.matches,lg1.bk,by=c("team1","team2"),all.x=T)
lg1.matches <- lg1.matches[order(lg1.matches$date),]

par(mar=c(9,4,4,5)+.1)
plot(lg1.matches$id,lg1.matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",
     main="Forecasts of Weekend League One Matches",
     ylab="Probability of Outcome")
lines(lg1.matches$id,1/lg1.matches$odds1,col=2,pch=0,type="p")
lines(lg1.matches$id,lg1.matches$Pd,col=3,pch=16,type="p")
lines(lg1.matches$id,1/lg1.matches$odds2,col=3,pch=1,type="p")
lines(lg1.matches$id,lg1.matches$Pa,col=4,pch=17,type="p")
lines(lg1.matches$id,1/lg1.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=lg1.matches$id,labels=paste(lg1.matches$team1,lg1.matches$team2,sep=" v "),las=2,cex.axis=0.65)

League Two

Next, our League Two forecasts:

lg2.matches <- forecast.matches[forecast.matches$division=="English League Two",]
lg2.matches <- lg2.matches[order(lg2.matches$date),]
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)

Next, bookmaker prices:

lg2.bk <- aggregate(bookies[regexpr("League Two",bookies$keywords)>-1,c("odds1","odds2","odds3")],
                      by=list(bookies$match[regexpr("League Two",bookies$keywords)>-1]),FUN=mean,na.rm=T)
lg2.bk$Group.1 <- gsub("Wimbledon","W'bledon",lg2.bk$Group.1)
lg2.bk$Group.1 <- gsub("Oxford Utd","Oxford",lg2.bk$Group.1)
lg2.bk$Group.1 <- gsub("Cambridge Utd","Cambridge U",lg2.bk$Group.1)
lg2.bk$Group.1 <- gsub("Newport Co","Newport",lg2.bk$Group.1)
lg2.bk$Group.1 <- gsub("Dagenham & Red.","Dag &amp; Red",lg2.bk$Group.1)
lg2.bk$team1 <- gsub("^(.*?) - (.*?)$","\\1",lg2.bk$Group.1)
lg2.bk$team2 <- gsub("^(.*?) - (.*?)$","\\2",lg2.bk$Group.1)
lg2.matches <- merge(lg2.matches,lg2.bk,by=c("team1","team2"),all.x=T)
lg2.matches <- lg2.matches[order(lg2.matches$date),]

par(mar=c(9,4,4,5)+.1)
plot(lg2.matches$id,lg2.matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",
     main="Forecasts of Weekend League One Matches",
     ylab="Probability of Outcome")
lines(lg2.matches$id,1/lg2.matches$odds1,col=2,pch=0,type="p")
lines(lg2.matches$id,lg2.matches$Pd,col=3,pch=16,type="p")
lines(lg2.matches$id,1/lg2.matches$odds2,col=3,pch=1,type="p")
lines(lg2.matches$id,lg2.matches$Pa,col=4,pch=17,type="p")
lines(lg2.matches$id,1/lg2.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=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
1 2015-02-20 English Championship Wigan 0.5556635 Charlton 0.4106196 0.2791141 0.3102663
2 2015-02-20 English League Two Accrington 0.6653086 Cheltenham 0.5397255 0.2493758 0.2108987
53 2015-02-21 Conference South Farnborough 0.5237875 Eastbourne 0.3755825 0.2818646 0.3425529
10 2015-02-21 English Championship Blackburn 0.7295718 Blackpool 0.6258249 0.2163667 0.1578084
11 2015-02-21 English Championship Brighton 0.5872305 Birmingham 0.4496062 0.2731184 0.2772753
12 2015-02-21 English Championship Huddersfield 0.5759232 Cardiff 0.4335049 0.2759450 0.2905501
13 2015-02-21 English Championship Nottm Forest 0.5599098 Bolton 0.4192544 0.2780394 0.3027062
14 2015-02-21 English Championship Brentford 0.4592591 Bournemouth 0.3067213 0.2786315 0.4146473
15 2015-02-21 English Championship Middlesbro 0.7332321 Leeds 0.6285083 0.2152025 0.1562891
16 2015-02-21 English Championship Wolves 0.6153979 Rotherham 0.4761625 0.2674551 0.2563824
17 2015-02-21 English Championship Watford 0.6021301 Norwich 0.4664125 0.2696741 0.2639134
18 2015-02-21 English Championship Derby 0.7247139 Sheff Wed 0.6245793 0.2169045 0.1585162
19 2015-02-21 English Championship Millwall 0.5420682 Fulham 0.3943677 0.2807206 0.3249117
20 2015-02-21 English Championship Ipswich 0.6981158 Reading 0.5869890 0.2323405 0.1806706
21 2015-02-21 English League One Bradford 0.6510465 Walsall 0.5207069 0.2554057 0.2238874
22 2015-02-21 English League One Sheff Utd 0.6989604 Coventry 0.5831251 0.2338363 0.1830386
23 2015-02-21 English League One MK Dons 0.7362706 Peterborough 0.6351333 0.2122963 0.1525703
24 2015-02-21 English League One Barnsley 0.5863260 Crewe 0.4519957 0.2726589 0.2753454
25 2015-02-21 English League One Leyton Orient 0.5264397 Oldham 0.3818787 0.2815692 0.3365520
26 2015-02-21 English League One Colchester 0.3939813 Bristol C 0.2539856 0.2667055 0.4793089
27 2015-02-21 English League One Preston 0.6336973 Scunthorpe 0.5041626 0.2602328 0.2356046
28 2015-02-21 English League One Port Vale 0.5205543 Doncaster 0.3707595 0.2820290 0.3472115
29 2015-02-21 English League One Swindon 0.7767305 Crawley 0.6866896 0.1882072 0.1251032
30 2015-02-21 English League One Rochdale 0.6094140 Chesterfield 0.4791171 0.2667517 0.2541312
31 2015-02-21 English League One Yeovil 0.4673388 Gillingham 0.3176431 0.2800001 0.4023568
32 2015-02-21 English League One Fleetwood 0.6120380 Notts Co 0.4733502 0.2681114 0.2585385
33 2015-02-21 English League Two AFC W’bledon 0.5510652 Luton 0.4044776 0.2797862 0.3157362
34 2015-02-21 English League Two Dag & Red 0.4984061 Burton 0.3488766 0.2820743 0.3690492
35 2015-02-21 English League Two Bury 0.7142111 Hartlepool 0.6087418 0.2235986 0.1676596
36 2015-02-21 English League Two Exeter 0.4955143 Plymouth 0.3418107 0.2818332 0.3763561
37 2015-02-21 English League Two Stevenage 0.5599909 Southend 0.4150561 0.2785807 0.3063632
38 2015-02-21 English League Two Newport Co 0.6351235 Morecambe 0.4982188 0.2618678 0.2399134
39 2015-02-21 English League Two Tranmere 0.4428427 Shrewsbury 0.2947810 0.2767263 0.4284927
40 2015-02-21 English League Two Oxford 0.6026943 Mansfield 0.4649659 0.2699897 0.2650444
41 2015-02-21 English League Two Carlisle 0.4800339 Wycombe 0.3330199 0.2813506 0.3856294
42 2015-02-21 English League Two Cambridge U 0.6200660 Portsmouth 0.4884913 0.2644267 0.2470819
43 2015-02-21 English League Two Northampton 0.5975146 York 0.4634974 0.2703065 0.2661961
3 2015-02-21 English Premier Sunderland 0.5372787 West Brom 0.3889664 0.2811298 0.3299038
4 2015-02-21 English Premier Man City 0.7299200 Newcastle 0.6267705 0.2159573 0.1572722
5 2015-02-21 English Premier Hull 0.5932626 QPR 0.4567726 0.2717099 0.2715176
6 2015-02-21 English Premier C Palace 0.4348246 Arsenal 0.2848151 0.2747946 0.4403903
7 2015-02-21 English Premier Swansea 0.4421278 Man Utd 0.2901369 0.2758657 0.4339974
8 2015-02-21 English Premier Aston Villa 0.4822227 Stoke 0.3297201 0.2811160 0.3891639
9 2015-02-21 English Premier Chelsea 0.7780489 Burnley 0.6923199 0.1854272 0.1222529
109 2015-02-21 FA Trophy Wrexham 0.5667267 Torquay 0.4194512 0.2780132 0.3025356
44 2015-02-21 Football Conference Bristol R 0.6921433 Altrincham 0.5768914 0.2362123 0.1868964
45 2015-02-21 Football Conference Dartford 0.4642304 Gateshead 0.3148784 0.2796866 0.4054350
46 2015-02-21 Football Conference Halifax 0.6051783 Braintree 0.4674584 0.2694436 0.2630980
47 2015-02-21 Football Conference Dover 0.7252406 Southport 0.6216491 0.2181633 0.1601876
48 2015-02-21 Football Conference Alfreton 0.5683152 Aldershot 0.4236406 0.2774367 0.2989227
49 2015-02-21 Football Conference Barnet 0.6198787 Grimsby 0.4884944 0.2644260 0.2470797
50 2015-02-21 Football Conference Forest Green 0.7302191 Telford 0.6262383 0.2161878 0.1575738
51 2015-02-21 Football Conference Nuneaton 0.4337020 Kidderminster 0.2866222 0.2751686 0.4382093
52 2015-02-21 Football Conference Chester 0.5514244 Eastleigh 0.4073911 0.2794771 0.3131318
110 2015-02-22 English Premier Tottenham 0.6146780 West Ham 0.4783655 0.2669320 0.2547025
111 2015-02-22 English Premier Everton 0.6568548 Leicester 0.5330997 0.2515332 0.2153671
112 2015-02-22 English Premier Southampton 0.5778856 Liverpool 0.4395998 0.2749312 0.2854690
140 2015-02-24 Conference North Stockport 0.6022717 Barrow 0.4758152 0.2675369 0.2566480
116 2015-02-24 English Championship Millwall 0.5197189 Sheff Wed 0.3693974 0.2820656 0.3485369
117 2015-02-24 English Championship Middlesbro 0.7188923 Bolton 0.6157768 0.2206584 0.1635648
118 2015-02-24 English Championship Brentford 0.7080206 Blackpool 0.6011395 0.2267146 0.1721459
119 2015-02-24 English Championship Wigan 0.5350004 Cardiff 0.3877579 0.2812126 0.3310295
120 2015-02-24 English Championship Derby 0.7472402 Charlton 0.6512591 0.2050366 0.1437044
121 2015-02-24 English Championship Ipswich 0.6905543 Birmingham 0.5771970 0.2360969 0.1867062
122 2015-02-24 English Championship Brighton 0.5666661 Leeds 0.4244894 0.2773157 0.2981949
123 2015-02-24 English Championship Wolves 0.6365370 Fulham 0.5037214 0.2603560 0.2359226
124 2015-02-24 English Championship Watford 0.7107926 Rotherham 0.6072358 0.2242210 0.1685433
125 2015-02-24 English Championship Blackburn 0.5159643 Norwich 0.3655725 0.2821449 0.3522826
126 2015-02-24 English Championship Huddersfield 0.5764550 Reading 0.4339302 0.2758765 0.2901933
127 2015-02-24 English League One Swindon 0.5917445 Bradford 0.4611320 0.2708090 0.2680590
128 2015-02-24 English League One Rochdale 0.5382136 Sheff Utd 0.3985751 0.2803581 0.3210669
129 2015-02-24 English League One Preston 0.6561349 Walsall 0.5284560 0.2530094 0.2185347
130 2015-02-24 English League One Doncaster 0.4890778 Bristol C 0.3386691 0.2816843 0.3796466
153 2015-02-24 English League One Scunthorpe 0.6867961 Barnsley 0.5662569 0.2401570 0.1935861
131 2015-02-24 English League Two Accrington 0.4619129 Burton 0.3110457 0.2792152 0.4097391
132 2015-02-24 English League Two Portsmouth 0.5976356 Tranmere 0.4556351 0.2719395 0.2724254
155 2015-02-24 English League Two Cambridge U 0.5981499 AFC W’bledon 0.4636957 0.2702639 0.2660403
133 2015-02-24 Football Conference Torquay 0.6356518 Lincoln 0.5102001 0.2585177 0.2312822
134 2015-02-24 Football Conference Alfreton 0.5893911 Dartford 0.4482929 0.2733667 0.2783404
135 2015-02-24 Football Conference Halifax 0.6081856 Eastleigh 0.4708501 0.2686838 0.2604661
136 2015-02-24 Football Conference Gateshead 0.6214198 Kidderminster 0.4865388 0.2649226 0.2485387
137 2015-02-24 Football Conference Grimsby 0.7393231 Telford 0.6437016 0.2084713 0.1478271
138 2015-02-24 Football Conference Bristol R 0.6494461 Braintree 0.5166762 0.2566184 0.2267054
154 2015-02-24 Football Conference Wrexham 0.5333477 Forest Green 0.3854781 0.2813601 0.3331618
156 2015-02-25 English Championship Nottm Forest 0.4157685 Bournemouth 0.2680341 0.2708024 0.4611635