Introduction

dates <- c("2015-01-30","2015-02-06","2015-02-13","2015-02-20","2015-02-27","2015-03-06","2015-03-13")

This is the number 7 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.

Bookmaker prices are compared with forecasts, potentially offering opportunities, should you sufficiently believe my forecasts to be better than those of bookmakers. Naturally, I make no such claim, and indeed since the bookmaker prices were collected, they may well have changed.

Loading the Data

The dataset used 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 in time (i.e., not this week) 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.

Forecast Model

A linear regression model is estimated here and reported:

library(knitr)
library(MASS)
date.1 <- tail(dates,1)
forecast.matches <- read.csv(paste("forecasts_",date.1,".csv",sep=""),stringsAsFactors=F)
forecast.matches <- forecast.matches[is.na(forecast.matches$outcome)==F,]

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.0268 -0.3114  0.1151  0.3369  0.8958 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.308e-01  5.418e-03  61.059  < 2e-16 ***
## E.1          5.452e-01  6.051e-03  90.087  < 2e-16 ***
## pts1         9.775e-04  4.239e-04   2.306  0.02111 *  
## pts.D       -2.370e-03  3.077e-04  -7.703 1.33e-14 ***
## pts.D.2     -1.360e-05  6.468e-06  -2.102  0.03555 *  
## pld1        -1.641e-03  6.094e-04  -2.693  0.00708 ** 
## pld.D        2.266e-03  7.111e-04   3.186  0.00144 ** 
## pld.D.2     -4.093e-05  3.083e-05  -1.327  0.18437    
## gs1          4.757e-04  1.710e-04   2.782  0.00540 ** 
## gs.D        -2.481e-04  1.526e-04  -1.626  0.10397    
## gs.D.2      -5.669e-07  4.689e-06  -0.121  0.90376    
## gd1         -5.980e-04  2.407e-04  -2.485  0.01297 *  
## gd.D         2.451e-03  1.759e-04  13.929  < 2e-16 ***
## gd.D.2      -5.660e-06  2.342e-06  -2.416  0.01568 *  
## pos1         7.670e-04  3.005e-04   2.552  0.01071 *  
## pos.D       -1.842e-03  2.514e-04  -7.327 2.37e-13 ***
## pos.D.2      3.753e-05  1.171e-05   3.206  0.00135 ** 
## form1        6.250e-04  3.518e-04   1.777  0.07565 .  
## form.D       1.353e-03  2.960e-04   4.573 4.82e-06 ***
## form.D.2    -7.301e-05  2.995e-05  -2.437  0.01480 *  
## tier1        1.920e-03  7.653e-04   2.509  0.01212 *  
## tier.D      -3.165e-02  2.862e-03 -11.059  < 2e-16 ***
## tier.D.2    -5.262e-03  1.258e-03  -4.184 2.86e-05 ***
## season.d    -1.082e-03  3.081e-05 -35.115  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3948 on 216080 degrees of freedom
##   (38337 observations deleted due to missingness)
## Multiple R-squared:  0.0852, Adjusted R-squared:  0.0851 
## F-statistic: 874.9 on 23 and 216080 DF,  p-value: < 2.2e-16

An 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       2.637e+00  3.018e-02  87.39575
## pts1      4.200e-03  2.084e-03   2.01586
## pts.D    -1.221e-02  1.521e-03  -8.02725
## pts.D.2  -7.571e-05  3.609e-05  -2.09768
## pld1     -9.174e-03  2.998e-03  -3.06047
## pld.D     1.288e-02  3.567e-03   3.60921
## pld.D.2  -2.356e-04  1.637e-04  -1.43912
## gs1       3.431e-03  8.511e-04   4.03088
## gs.D     -1.580e-03  7.582e-04  -2.08343
## gs.D.2   -2.841e-07  2.556e-05  -0.01111
## gd1      -3.342e-03  1.193e-03  -2.80092
## gd.D      1.331e-02  8.796e-04  15.12806
## gd.D.2    7.347e-06  1.638e-05   0.44861
## pos1      3.062e-03  1.466e-03   2.08910
## pos.D    -7.980e-03  1.240e-03  -6.43591
## pos.D.2   2.029e-04  5.945e-05   3.41353
## form1     2.846e-03  1.719e-03   1.65588
## form.D    7.041e-03  1.457e-03   4.83310
## form.D.2 -2.301e-04  1.494e-04  -1.53938
## tier1     9.319e-03  3.728e-03   2.49996
## tier.D   -1.742e-01  1.505e-02 -11.57178
## tier.D.2 -6.675e-03  6.881e-03  -0.96999
## season.d -5.408e-03  1.526e-04 -35.42876
## 
## Intercepts:
##       Value    Std. Error t value 
## 0|0.5   0.2411   0.0264     9.1335
## 0.5|1   1.4299   0.0266    53.8245
## 
## Residual Deviance: 428191.57 
## AIC: 428241.57 
## (38337 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)
if(NROW(prem.matches)>1) {
  for(i in 2:NROW(prem.matches)){
    if(prem.matches$date[i]!=prem.matches$date[i-1]) {
      lines(rep(c(i-0.5),2),c(0,1),lty=2)
    }
  }
}

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.

clean.data <- function(data) {
  require(zoo)
  colnames(data)[1] <- "Date.Time"
  colnames(data)[-1] <- gsub("^.*?\\d+_(\\w+)[.]href.*?$","\\1",colnames(data)[-1])
  data <- data[,-NCOL(data)]
  data$Date.Time <- as.Date(substring(data$Date.Time,2),"%Y-%m-%d")
  data <- data[is.na(data$Date.Time)==F,]
  data <- data[order(data$Date.Time),]
  for(i in colnames(data)[nchar(colnames(data))==2]) {
    data[,i] <- gsub("<div class=.*?>(.*?)</div>","\\1",data[,i])
    data[,i] <- gsub("<div class=.*?>(.*?)\\s+$","\\1",data[,i])
    data[,i] <- gsub(">","",data[,i])
    data[,i] <- gsub("^\\s+|\\s+$","",data[,i])
    #need to turn fractional odds into decimal odds
    numerator <- gsub("(\\d+)/(\\d+)$","\\1",data[,i])
    denominator <- gsub("(\\d+)/(\\d+)$","\\2",data[,i])
    data[,i] <- as.numeric(numerator)+1
    data[numerator!=denominator,i] <- as.numeric(numerator[numerator!=denominator])/as.numeric(denominator[numerator!=denominator])+1
    data[,i] <- na.locf(data[,i],na.rm=F)
  }
  return(data)
}

prem.bk <- data.frame()
prem.loc <- paste("/home/readejj/Dropbox/Research/Data for Ideas/Betting/football/",Sys.Date(),"/premier-league",sep="")
prem.bk.matches <- dir(prem.loc,pattern="*.csv")
for(i in prem.bk.matches) {
  temp <- read.csv(paste(prem.loc,i,sep="/"),stringsAsFactors=F)
  temp <- clean.data(temp)
  temp$event <- gsub("[.]csv","",i)
  prem.bk <- rbind(prem.bk,temp)
}
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
prem.bk <- prem.bk[order(prem.bk$event,prem.bk$Date.Time),]
prem.bk$mean <- rowMeans(prem.bk[colnames(prem.bk)[nchar(colnames(prem.bk))==2]],na.rm=T)
prem.bk$event <- gsub("man-utd","man utd",prem.bk$event)
prem.bk$event <- gsub("man-city","man city",prem.bk$event)
prem.bk$event <- gsub("aston-villa","aston villa",prem.bk$event)
prem.bk$event <- gsub("west-brom","west brom",prem.bk$event)
prem.bk$event <- gsub("west-ham","west ham",prem.bk$event)
prem.bk$event <- gsub("crystal-palace","c palace",prem.bk$event)
prem.bk$team1 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\1",prem.bk$event)
prem.bk$team2 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\2",prem.bk$event)
prem.bk$event <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\3",prem.bk$event)
prem.bk$event.1 <- c(prem.bk$event[-1],NA)
prem.bk.h <- prem.bk[(prem.bk$event!=prem.bk$event.1 | is.na(prem.bk$event.1)==T) & prem.bk$event==prem.bk$team1,]
prem.bk.d <- prem.bk[prem.bk$event!=prem.bk$event.1 & regexpr("draw",prem.bk$event)>-1,]
prem.bk.a <- prem.bk[prem.bk$event!=prem.bk$event.1 & prem.bk$event==prem.bk$team2,]
prem.matches$team1 <- tolower(prem.matches$team1)
prem.matches$team2 <- tolower(prem.matches$team2)

prem.matches <- merge(prem.matches,prem.bk.h[c(colnames(prem.bk.h[nchar(colnames(prem.bk.h))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.h) & regexpr("team",colnames(prem.matches))==-1] <- paste(colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.h) & regexpr("team",colnames(prem.matches))==-1],".h",sep="")
prem.matches <- merge(prem.matches,prem.bk.d[c(colnames(prem.bk.d[nchar(colnames(prem.bk.d))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.d) & regexpr("team",colnames(prem.matches))==-1] <- paste(colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.d) & regexpr("team",colnames(prem.matches))==-1],".d",sep="")
prem.matches <- merge(prem.matches,prem.bk.a[c(colnames(prem.bk.a[nchar(colnames(prem.bk.a))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.a) & regexpr("team",colnames(prem.matches))==-1] <- paste(colnames(prem.matches)[colnames(prem.matches) %in% colnames(prem.bk.a) & regexpr("team",colnames(prem.matches))==-1],".a",sep="")

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",cex=1.5,
     main="Forecasts of Weekend Premier League Matches",
     ylab="Probability of Outcome")
for(i in colnames(prem.matches)[grep("[.]h",colnames(prem.matches))]) {
  for(j in prem.matches$id) {
    lines(j,1/prem.matches[prem.matches$id==j,i],col="darkred",pch=0,type="p",cex=0.5)
  }  
}

lines(prem.matches$id,prem.matches$Pd,col=3,pch=16,type="p",cex=1.5)
for(i in colnames(prem.matches)[grep("[.]d",colnames(prem.matches))]) {
  for(j in prem.matches$id) {
    lines(j,1/prem.matches[prem.matches$id==j,i],col="darkgreen",pch=0,type="p",cex=0.5)
  }  
}
lines(prem.matches$id,prem.matches$Pa,col=4,pch=17,type="p",cex=1.5)
for(i in colnames(prem.matches)[grep("[.]a",colnames(prem.matches))]) {
  for(j in prem.matches$id) {
    lines(j,1/prem.matches[prem.matches$id==j,i],col="darkblue",pch=0,type="p",cex=0.5)
  }  
}
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 darker coloured and smaller symbols are the range of bookmaker implied probabilities for outcomes. Unlike in previous weeks where I’ve simply plotted the mean bookmaker implied probability, here all bookmaker prices (usually 20) are plotted. By and large, they are not particularly widely spread, but then this is only a small sample of the total bookmakers pricing these matches.

In terms of making stronger picks than simply stating probabilities, as requested by some, here goes:

  • Palace v QPR: My model seems to fancy Palace more than the bookies, hence that might be worth considering.
  • Sunderland v Aston Villa: My model fancies Sunderland less than the bookmakers in what looks like a very tight match.
  • Everton v Newcastle: Bookmakers seem to heavily favour Everton in this match, pricing them at nearly 60% likely to win whereas my model puts them at less than 40%. One of a number of matches that look tight (likely draws?) this weekend.

Hence I’d suggest the following home wins this weekend: Palace, Arsenal, Chelsea and Man United, then the following away wins: Man City and Liverpool. The games at West Brom, Sunderland, Leicester, and Everton look like draws.

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)
for(i in 2:NROW(champ.matches)){
  if(champ.matches$date[i]!=champ.matches$date[i-1]) {
    lines(rep(c(i-0.5),2),c(0,1),lty=2)
  }
}

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)
for(i in 2:NROW(lg1.matches)){
  if(lg1.matches$date[i]!=lg1.matches$date[i-1]) {
    lines(rep(c(i-0.5),2),c(0,1),lty=2)
  }
}

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)
for(i in 2:NROW(lg2.matches)){
  if(lg2.matches$date[i]!=lg2.matches$date[i-1]) {
    lines(rep(c(i-0.5),2),c(0,1),lty=2)
  }
}

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)
for(i in 2:NROW(conf.matches)){
  if(conf.matches$date[i]!=conf.matches$date[i-1]) {
    lines(rep(c(i-0.5),2),c(0,1),lty=2)
  }
}

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-03-13 English League Two Newport Co 0.7234953 Cheltenham 0.6091137 0.2273906 0.1634957
69 2015-03-14 Conference North Bradford PA 0.6750727 Stalybridge 0.5540478 0.2490700 0.1968822
63 2015-03-14 Conference South Hayes & Y 0.6838500 Farnborough 0.5719251 0.2424309 0.1856441
8 2015-03-14 English Championship Leeds 0.6291843 Nottm Forest 0.4940288 0.2682059 0.2377653
9 2015-03-14 English Championship Watford 0.8279223 Reading 0.7403601 0.1631368 0.0965031
10 2015-03-14 English Championship Charlton 0.5298993 Blackburn 0.3777815 0.2881590 0.3340595
11 2015-03-14 English Championship Birmingham 0.7885331 Huddersfield 0.6813175 0.1939862 0.1246963
12 2015-03-14 English Championship Middlesbro 0.6902984 Ipswich 0.5699403 0.2431876 0.1868721
13 2015-03-14 English Championship Rotherham 0.5156896 Wigan 0.3577441 0.2887554 0.3535005
14 2015-03-14 English Championship Bolton 0.7778686 Millwall 0.6729782 0.1981019 0.1289199
15 2015-03-14 English Championship Norwich 0.7007024 Derby 0.5859773 0.2369368 0.1770859
16 2015-03-14 English Championship Bournemouth 0.8979064 Blackpool 0.8230274 0.1155075 0.0614651
17 2015-03-14 English Championship Sheff Wed 0.6526918 Fulham 0.5263693 0.2585271 0.2151037
18 2015-03-14 English Championship Brighton 0.5048770 Wolves 0.3518252 0.2887429 0.3594320
19 2015-03-14 English Championship Brentford 0.6423660 Cardiff 0.5137805 0.2624777 0.2237418
20 2015-03-14 English League One Port Vale 0.5444533 Swindon 0.3984057 0.2865723 0.3150221
21 2015-03-14 English League One Doncaster 0.5617537 Peterborough 0.4146775 0.2846704 0.3006521
22 2015-03-14 English League One Scunthorpe 0.5723732 Sheff Utd 0.4301487 0.2823626 0.2874887
23 2015-03-14 English League One Notts Co 0.4487322 Bradford 0.2902210 0.2828876 0.4268915
24 2015-03-14 English League One Oldham 0.4646691 Barnsley 0.3088598 0.2858334 0.4053068
25 2015-03-14 English League One Colchester 0.5431059 Crawley 0.3950537 0.2868943 0.3180520
26 2015-03-14 English League One Preston 0.8095830 Crewe 0.7273383 0.1701862 0.1024755
27 2015-03-14 English League One Bristol C 0.7649958 Gillingham 0.6683277 0.2003694 0.1313029
28 2015-03-14 English League One Fleetwood 0.5011693 Rochdale 0.3426391 0.2885452 0.3688156
29 2015-03-14 English League One Walsall 0.7609811 MK Dons 0.6546584 0.2069169 0.1384247
30 2015-03-14 English League One Chesterfield 0.7541168 Coventry 0.6453832 0.2112573 0.1433595
31 2015-03-14 English League One Leyton Orient 0.6664997 Yeovil 0.5472725 0.2514796 0.2012479
32 2015-03-14 English League Two Northampton 0.8258709 Tranmere 0.7232783 0.1723567 0.1043650
33 2015-03-14 English League Two Wycombe 0.5538955 Shrewsbury 0.4025768 0.2861378 0.3112854
34 2015-03-14 English League Two York 0.6778942 Carlisle 0.5592212 0.2471901 0.1935886
35 2015-03-14 English League Two Morecambe 0.6797780 Hartlepool 0.5677194 0.2440287 0.1882519
36 2015-03-14 English League Two Cambridge U 0.4748841 Stevenage 0.3218264 0.2872581 0.3909155
37 2015-03-14 English League Two Dag & Red 0.5249049 Southend 0.3739798 0.2883459 0.3376743
38 2015-03-14 English League Two Exeter 0.6705709 AFC W’bledon 0.5447955 0.2523455 0.2028590
39 2015-03-14 English League Two Mansfield 0.5443846 Bury 0.3947255 0.2869245 0.3183499
40 2015-03-14 English League Two Burton 0.7688148 Accrington 0.6659403 0.2015257 0.1325341
41 2015-03-14 English League Two Portsmouth 0.5149639 Luton 0.3620817 0.2887089 0.3492094
42 2015-03-14 English League Two Oxford 0.5667209 Plymouth 0.4200326 0.2839253 0.2960421
2 2015-03-14 English Premier C Palace 0.7204743 QPR 0.6085778 0.2276185 0.1638037
3 2015-03-14 English Premier West Brom 0.4479865 Stoke 0.2909345 0.2830207 0.4260449
4 2015-03-14 English Premier Arsenal 0.8203821 West Ham 0.7212633 0.1734290 0.1053077
5 2015-03-14 English Premier Sunderland 0.5280668 Aston Villa 0.3776528 0.2881659 0.3341813
6 2015-03-14 English Premier Burnley 0.2668707 Man City 0.1561825 0.2218155 0.6220021
7 2015-03-14 English Premier Leicester 0.5461477 Hull 0.3981881 0.2865939 0.3152180
43 2015-03-14 Football Conference Halifax 0.4207691 Bristol R 0.2630043 0.2765242 0.4604715
44 2015-03-14 Football Conference Gateshead 0.5112438 Macclesfield 0.3576106 0.2887561 0.3536333
45 2015-03-14 Football Conference Telford 0.3339530 Woking 0.2000210 0.2508118 0.5491672
46 2015-03-14 Football Conference Aldershot 0.6246361 Southport 0.4935773 0.2683299 0.2380928
47 2015-03-14 Football Conference Altrincham 0.5792096 Wrexham 0.4322401 0.2820147 0.2857453
48 2015-03-14 Football Conference Dartford 0.4870577 Alfreton 0.3334361 0.2881232 0.3784408
49 2015-03-14 Football Conference Nuneaton 0.5198226 Torquay 0.3722660 0.2884191 0.3393149
50 2015-03-14 Football Conference Eastleigh 0.6077846 Barnet 0.4729491 0.2736484 0.2534025
51 2015-03-14 Football Conference Forest Green 0.7828496 Braintree 0.6785451 0.1953615 0.1260935
52 2015-03-14 Football Conference Kidderminster 0.5950275 Dover 0.4510471 0.2785177 0.2704352
53 2015-03-14 Football Conference Lincoln 0.7416156 Welling 0.6307570 0.2179277 0.1513153
54 2015-03-14 Football Conference Chester 0.4515079 Grimsby 0.2961493 0.2839434 0.4199073
95 2015-03-14 Ryman Premier Canvey Isl. 0.4735870 Margate 0.3147075 0.2865373 0.3987552
96 2015-03-14 Ryman Premier Maidstone 0.7794122 Lewes 0.6984135 0.1853550 0.1162315
111 2015-03-15 English Premier Everton 0.5014666 Newcastle 0.3501452 0.2887231 0.3611317
112 2015-03-15 English Premier Chelsea 0.7622778 Southampton 0.6560296 0.2062682 0.1377023
113 2015-03-15 English Premier Man Utd 0.6537786 Tottenham 0.5309838 0.2570227 0.2119935
119 2015-03-16 English FA Cup Reading 0.5933102 Bradford 0.4613294 0.2763350 0.2623356
114 2015-03-16 English Premier Swansea 0.3699298 Liverpool 0.2192042 0.2604437 0.5203521
166 2015-03-17 Conference North Stalybridge 0.4973249 Bradford PA 0.3530898 0.2887530 0.3581572
120 2015-03-17 English Championship Cardiff 0.3468817 Bournemouth 0.2061934 0.2540982 0.5397084
121 2015-03-17 English Championship Wigan 0.3742418 Watford 0.2319241 0.2659205 0.5021554
122 2015-03-17 English Championship Wolves 0.6097167 Sheff Wed 0.4702736 0.2742873 0.2554391
123 2015-03-17 English Championship Derby 0.4962412 Middlesbro 0.3406414 0.2884730 0.3708857
124 2015-03-17 English Championship Blackburn 0.7041553 Brentford 0.5850969 0.2372879 0.1776152
125 2015-03-17 English Championship Blackpool 0.2891120 Charlton 0.1644623 0.2281040 0.6074337
126 2015-03-17 English Championship Millwall 0.4009919 Brighton 0.2454101 0.2709872 0.4836027
127 2015-03-17 English Championship Huddersfield 0.3115669 Norwich 0.1824553 0.2404291 0.5771156
128 2015-03-17 English Championship Reading 0.4777877 Birmingham 0.3191461 0.2870040 0.3938499
129 2015-03-17 English Championship Ipswich 0.5517435 Bolton 0.4120185 0.2850188 0.3029627
130 2015-03-17 English League One Chesterfield 0.5986782 Gillingham 0.4594262 0.2767530 0.2638208
131 2015-03-17 English League One Oldham 0.7564007 MK Dons 0.6506083 0.2088225 0.1405692
132 2015-03-17 English League One Scunthorpe 0.5072944 Bradford 0.3533328 0.2887545 0.3579127
133 2015-03-17 English League One Preston 0.6285725 Peterborough 0.5030996 0.2656484 0.2312520
134 2015-03-17 English League One Leyton Orient 0.4395728 Barnsley 0.2866907 0.2822046 0.4311047
135 2015-03-17 English League One Notts Co 0.4248245 Rochdale 0.2673367 0.2777106 0.4549527
136 2015-03-17 English League One Port Vale 0.7282043 Crawley 0.6192013 0.2230422 0.1577566
137 2015-03-17 English League One Bristol C 0.8482436 Crewe 0.7734410 0.1446510 0.0819080
138 2015-03-17 English League One Doncaster 0.6404179 Swindon 0.5094816 0.2637742 0.2267442
139 2015-03-17 English League One Fleetwood 0.6680099 Coventry 0.5398197 0.2540602 0.2061200
140 2015-03-17 English League One Colchester 0.5154908 Yeovil 0.3624071 0.2887035 0.3488893
141 2015-03-17 English League One Walsall 0.5623401 Sheff Utd 0.4154394 0.2845679 0.2999927
142 2015-03-17 English League Two Newport Co 0.5815696 Luton 0.4357314 0.2814153 0.2828533
143 2015-03-17 English League Two Wycombe 0.7821339 Accrington 0.6832066 0.1930451 0.1237482
144 2015-03-17 English League Two Mansfield 0.7325188 AFC W’bledon 0.6161119 0.2243855 0.1595025
145 2015-03-17 English League Two Morecambe 0.4149843 Shrewsbury 0.2582504 0.2751434 0.4666061
146 2015-03-17 English League Two Portsmouth 0.6530356 Cheltenham 0.5288637 0.2577175 0.2134187
147 2015-03-17 English League Two York 0.4690369 Bury 0.3134381 0.2863931 0.4001688
148 2015-03-17 English League Two Exeter 0.4690897 Stevenage 0.3126050 0.2862959 0.4010991
149 2015-03-17 English League Two Northampton 0.7765874 Carlisle 0.6792972 0.1949890 0.1257137
150 2015-03-17 English League Two Dag & Red 0.5914935 Plymouth 0.4495627 0.2788173 0.2716200
151 2015-03-17 English League Two Oxford 0.7150490 Hartlepool 0.6083759 0.2277043 0.1639198
152 2015-03-17 English League Two Cambridge U 0.7401062 Tranmere 0.6289322 0.2187446 0.1523231
153 2015-03-17 Football Conference Chester 0.7425367 Dartford 0.6312647 0.2176998 0.1510355
154 2015-03-17 Football Conference Halifax 0.4228500 Barnet 0.2658218 0.2773035 0.4568746
155 2015-03-17 Football Conference Telford 0.4140039 Gateshead 0.2664471 0.2774726 0.4560803
156 2015-03-17 Football Conference Alfreton 0.6117566 Lincoln 0.4777932 0.2724614 0.2497454
157 2015-03-17 Football Conference Torquay 0.5855895 Braintree 0.4440749 0.2798903 0.2760348
158 2015-03-17 Football Conference Dover 0.5520752 Altrincham 0.4133926 0.2848406 0.3017669
159 2015-03-17 Football Conference Eastleigh 0.7466898 Wrexham 0.6443562 0.2117327 0.1439111
180 2015-03-18 English Championship Nottm Forest 0.6637535 Rotherham 0.5476472 0.2513479 0.2010049
181 2015-03-18 English Championship Fulham 0.4896021 Leeds 0.3344860 0.2881829 0.3773311
182 2015-03-18 English League Two Burton 0.5907256 Southend 0.4481357 0.2791015 0.2727627