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.
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,]
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)
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).
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.
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)
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 & 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)
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)
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 |