This document summarises the forecast outcomes for the fourth weekly set of forecasts for English football match outcomes, following on from last week, and it provides outcomes for forecasts of matches over the last week as detailed in this document.

Two sets of forecasts are constructed, one using a simple linear regression method for a dependent variable taking the values 0 for an away win, 0.5 for a draw, and 1 for a home win. This linear regression method only yields a number which can be interpreted as a probability of an outcome occurring. The second, ordered logit method, treats each outcome in an ordered manner, from away win, to draw, to home win, and estimates a probability for each outcome.

The purpose of this document is to evaluate these forecasts, and begin to form a longer-term narrative about them.

Outcomes

To consider outcomes; we must load up the specific outcomes file for matches forecast over the weekend:

dates <- c("2015-01-30","2015-02-06","2015-02-13","2015-02-20")
date.1 <- dates[NROW(dates)]
recent.forecast.outcomes <- read.csv(paste("forecast_outcomes_",date.1,".csv",sep=""),stringsAsFactors=F)
forecast.matches <- read.csv(paste("forecasts_",date.1,".csv",sep=""))
forecast.matches <- forecast.matches[is.na(forecast.matches$outcome)==F,]
forecast.outcomes <- merge(forecast.matches[,c("match_id","outcome","Ph","Pd","Pa")],
                           recent.forecast.outcomes,by=c("match_id"),
                           suffixes=c(".forc",".final"))
forecast.outcomes <- forecast.outcomes[is.na(forecast.outcomes$outcome.final)==F,]

#all.forecast.outcomes <- data.frame()
#for(i in dates) {
#  temp.0 <- read.csv(paste(loc2,"forecast_outcomes_",i,".csv",sep=""),stringsAsFactors=F)
#  temp.1 <- read.csv(paste(loc2,"forecasts_",i,".csv",sep=""))
#  temp.1 <- temp.1[is.na(temp.1$outcome)==F,]
#  temp.2 <- merge(temp.1[,c("match_id","outcome","Ph","Pd","Pa")],
#                             temp.0,by=c("match_id"),
#                             suffixes=c(".forc",".final"))
#  forecast.outcomes <- rbind(temp.2[is.na(temp.2$outcome.final)==F,],forecast.outcomes)
#}

We also load up previous weeks’ forecasts and outcomes in order that we can begin to determine trends over time. This week was one particularly filled with surprise results, but that does not necessarily mean our forecast model need be amended. More, it reflects that football is intrinsically a very uncertain game. This, of course, is not to say that the model cannot be improved upon.

First, our Premier League forecasts:

prem.matches <- forecast.outcomes[forecast.outcomes$division=="English Premier",]
prem.matches$id <- 1:NROW(prem.matches)
par(mar=c(9,4,4,5)+.1)
plot(prem.matches$id,prem.matches$outcome.forc,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)
for(i in 1:NROW(prem.matches)) {
  if(prem.matches$outcome.final[i]==1) {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(prem.matches$Ph[i],prem.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (prem.matches$outcome.final[i]==0.5) {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(prem.matches$Pd[i],prem.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(prem.matches$id[i],prem.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(prem.matches$Pa[i],prem.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=prem.matches$id,labels=paste(prem.matches$team1,prem.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Outcomes are hollowed variants of their predicted probabilities; red empty circles are home wins, marked on at 1, green empty circles are draws, marked on at 0.5, and blue empty triangles are away wins. All are linked to their associated probability. This drawing doesn’t quite reflect actual forecast errors since each outcome is 1 if it happened, but nonetheless illustrates the weekend’s outcomes.

Chelsea being held by Burnley in a controversial match, and Swansea beating Man United were the stand-out results last weekend.

Next, our Championship forecasts:

champ.matches <- forecast.outcomes[forecast.outcomes$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.forc,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)
abline(h=0.4,lty=3)
for(i in 1:NROW(champ.matches)) {
  if(champ.matches$outcome.final[i]==1) {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(champ.matches$Ph[i],champ.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (champ.matches$outcome.final[i]==0.5) {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(champ.matches$Pd[i],champ.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(champ.matches$id[i],champ.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(champ.matches$Pa[i],champ.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=champ.matches$id,labels=paste(champ.matches$team1,champ.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Next, our League One forecasts:

lg1.matches <- forecast.outcomes[forecast.outcomes$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.forc,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)
abline(h=0.4,lty=3)
for(i in 1:NROW(lg1.matches)) {
  if(lg1.matches$outcome.final[i]==1) {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(lg1.matches$Ph[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (lg1.matches$outcome.final[i]==0.5) {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(lg1.matches$Pd[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(lg1.matches$id[i],lg1.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(lg1.matches$Pa[i],lg1.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
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.outcomes[forecast.outcomes$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.forc,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)
abline(h=0.4,lty=3)
for(i in 1:NROW(lg2.matches)) {
  if(lg2.matches$outcome.final[i]==1) {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(lg2.matches$Ph[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (lg2.matches$outcome.final[i]==0.5) {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(lg2.matches$Pd[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(lg2.matches$id[i],lg2.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(lg2.matches$Pa[i],lg2.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
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.outcomes[forecast.outcomes$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.forc,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)
abline(h=0.4,lty=3)
for(i in 1:NROW(conf.matches)) {
  if(conf.matches$outcome.final[i]==1) {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=2,type="p",pch=0)
    lines(rep(i,2),c(conf.matches$Ph[i],conf.matches$outcome.final[i]),type="l",lty=2,col="red")
  } else if (conf.matches$outcome.final[i]==0.5) {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=3,type="p",pch=1)
    lines(rep(i,2),c(conf.matches$Pd[i],conf.matches$outcome.final[i]),type="l",lty=2,col="green")
  } else {
    lines(conf.matches$id[i],conf.matches$outcome.final[i],col=4,type="p",pch=2)
    lines(rep(i,2),c(conf.matches$Pa[i],conf.matches$outcome.final[i]),type="l",lty=2,col="blue")
  }
}
axis(1,at=conf.matches$id,labels=paste(conf.matches$team1,conf.matches$team2,sep=" v "),las=2,cex.axis=0.65)

Tabular Version

Numerically it is important to evaluate forecast errors.

For the OLS model:

forecast.outcomes$error <- forecast.outcomes$outcome.final - forecast.outcomes$outcome.forc
forecast.outcomes$error2 <- forecast.outcomes$error^2
forecast.outcomes$aerror <- abs(forecast.outcomes$error)
#summary(forecast.outcomes[forecast.outcomes$tier<=5,c("error","error2","aerror")])
summary(forecast.outcomes[,c("error","error2","aerror")])
##      error              error2             aerror       
##  Min.   :-0.77673   Min.   :0.001067   Min.   :0.03266  
##  1st Qu.:-0.48222   1st Qu.:0.077311   1st Qu.:0.27805  
##  Median : 0.26373   Median :0.166673   Median :0.40826  
##  Mean   : 0.02556   Mean   :0.187540   Mean   :0.39650  
##  3rd Qu.: 0.40236   3rd Qu.:0.286225   3rd Qu.:0.53500  
##  Max.   : 0.60602   Max.   :0.603310   Max.   :0.77673

For the ordered logit we must consider the three outcomes distinctly; for the home win:

forecast.outcomes$error.h <- forecast.outcomes$outcome.final - forecast.outcomes$Ph
forecast.outcomes$error.d <- as.numeric(forecast.outcomes$outcome.final==0.5) - forecast.outcomes$Pd
forecast.outcomes$error.a <- as.numeric(forecast.outcomes$outcome.final==0) - forecast.outcomes$Pa
forecast.outcomes$error.h2 <- forecast.outcomes$error.h^2
forecast.outcomes$error.d2 <- forecast.outcomes$error.d^2
forecast.outcomes$error.a2 <- forecast.outcomes$error.a^2
forecast.outcomes$aerror.h <- abs(forecast.outcomes$error.h)
forecast.outcomes$aerror.d <- abs(forecast.outcomes$error.d)
forecast.outcomes$aerror.a <- abs(forecast.outcomes$error.a)
#summary(forecast.outcomes[forecast.outcomes$tier<=5,c("error","error2","aerror")])
summary(forecast.outcomes[,c("error.h","error.d","error.a")])
##     error.h           error.d            error.a         
##  Min.   :-0.6867   Min.   :-0.28214   Min.   :-0.479309  
##  1st Qu.:-0.3330   1st Qu.:-0.27744   1st Qu.:-0.290193  
##  Median : 0.3649   Median :-0.26675   Median :-0.215367  
##  Mean   : 0.1576   Mean   :-0.07427   Mean   : 0.009257  
##  3rd Qu.: 0.5365   3rd Qu.:-0.21596   3rd Qu.: 0.614371  
##  Max.   : 0.7460   Max.   : 0.81457   Max.   : 0.874897

Considering here just the mean errors, the forecasts for home wins were biased downward much more than those for either the draw or away win; a positive forecast error suggests that the event occurs more often than the model predicts.  Until we consider more forecasts, it is difficult to say whether this is simply an artifact of one particular week.

We can consider also, by division, forecast errors for our linear regression model:

library(knitr)
aggs <- aggregate(forecast.outcomes[,c("error","error2","aerror")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
kable(aggs[c(4,1,2,3,5),])
Group.1 error error2 aerror
4 English League One 0.0779550 0.2030334 0.4121697
1 Conference North -0.6022717 0.3627312 0.6022717
2 Conference South 0.4762125 0.2267783 0.4762125
3 English Championship 0.0322989 0.1961428 0.4079146
5 English League Two 0.0319687 0.2071820 0.4309823

The error column is the mean forecast error, the error2 column is the mean squared forecast error, and the aerror column is the absolute forecast error.

We do the same for each outcome for the ordered probit model:

library(knitr)
aggs <- aggregate(forecast.outcomes[,c("error.h","error.h2","aerror.h")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Home win",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Home win error.h error.h2 aerror.h
4 English League One 0.2087273 0.2459764 0.4550829
1 Conference North -0.4758152 0.2264001 0.4758152
2 Conference South 0.6244175 0.3898972 0.6244175
3 English Championship 0.1613308 0.2212022 0.4397543
5 English League Two 0.1711974 0.2354336 0.4445498
aggs <- aggregate(forecast.outcomes[,c("error.d","error.d2","aerror.d")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Draw",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Draw error.d error.d2 aerror.d
4 English League One -0.0819895 0.1534324 0.3444316
1 Conference North -0.2675369 0.0715760 0.2675369
2 Conference South -0.2818646 0.0794476 0.2818646
3 English Championship -0.1302506 0.1264693 0.3158312
5 English League Two -0.1360890 0.1368623 0.3334704
aggs <- aggregate(forecast.outcomes[,c("error.a","error.a2","aerror.a")],
          by=list(forecast.outcomes$division),FUN=mean,na.rm=T)
colnames(aggs) <- gsub("Group.1","Away win",colnames(aggs))
kable(aggs[c(4,1,2,3,5),])
Away win error.a error.a2 aerror.a
4 English League One -0.0385024 0.1986033 0.3891609
1 Conference North 0.7433520 0.5525723 0.7433520
2 Conference South -0.3425529 0.1173425 0.3425529
3 English Championship 0.0314198 0.2050055 0.3899978
5 English League Two 0.0315583 0.2141886 0.4193710

Finally, we list all the forecasts again with outcomes:

kable(forecast.outcomes[order(forecast.outcomes$date,forecast.outcomes$division),
                       c("date","division","team1","goals1","goals2","team2",
                         "outcome.forc","Ph","Pd","Pa","outcome.final","error","error2","aerror")],digits=3)
date division team1 goals1 goals2 team2 outcome.forc Ph Pd Pa outcome.final error error2 aerror
29 2015-02-20 English Championship Wigan 0 3 Charlton 0.556 0.411 0.279 0.310 0.0 -0.556 0.309 0.556
64 2015-02-20 English League Two Accrington 1 1 Cheltenham 0.665 0.540 0.249 0.211 0.5 -0.165 0.027 0.165
76 2015-02-21 Conference South Farnborough 2 1 Eastbourne 0.524 0.376 0.282 0.343 1.0 0.476 0.227 0.476
11 2015-02-21 English Championship Blackburn 1 1 Blackpool 0.730 0.626 0.216 0.158 0.5 -0.230 0.053 0.230
13 2015-02-21 English Championship Brighton 4 3 Birmingham 0.587 0.450 0.273 0.277 1.0 0.413 0.170 0.413
15 2015-02-21 English Championship Huddersfield 0 0 Cardiff 0.576 0.434 0.276 0.291 0.5 -0.076 0.006 0.076
18 2015-02-21 English Championship Nottm Forest 4 1 Bolton 0.560 0.419 0.278 0.303 1.0 0.440 0.194 0.440
20 2015-02-21 English Championship Brentford 3 1 Bournemouth 0.459 0.307 0.279 0.415 1.0 0.541 0.292 0.541
21 2015-02-21 English Championship Middlesbro 0 1 Leeds 0.733 0.629 0.215 0.156 0.0 -0.733 0.538 0.733
22 2015-02-21 English Championship Wolves 5 0 Rotherham 0.615 0.476 0.267 0.256 1.0 0.385 0.148 0.385
23 2015-02-21 English Championship Watford 0 3 Norwich 0.602 0.466 0.270 0.264 0.0 -0.602 0.363 0.602
25 2015-02-21 English Championship Derby 3 2 Sheff Wed 0.725 0.625 0.217 0.159 1.0 0.275 0.076 0.275
26 2015-02-21 English Championship Millwall 0 0 Fulham 0.542 0.394 0.281 0.325 0.5 -0.042 0.002 0.042
32 2015-02-21 English Championship Ipswich 0 1 Reading 0.698 0.587 0.232 0.181 0.0 -0.698 0.487 0.698
35 2015-02-21 English League One Bradford 1 1 Walsall 0.651 0.521 0.255 0.224 0.5 -0.151 0.023 0.151
36 2015-02-21 English League One Sheff Utd 2 2 Coventry 0.699 0.583 0.234 0.183 0.5 -0.199 0.040 0.199
37 2015-02-21 English League One MK Dons 3 0 Peterborough 0.736 0.635 0.212 0.153 1.0 0.264 0.070 0.264
39 2015-02-21 English League One Barnsley 2 0 Crewe 0.586 0.452 0.273 0.275 1.0 0.414 0.171 0.414
41 2015-02-21 English League One Leyton Orient 3 0 Oldham 0.526 0.382 0.282 0.337 1.0 0.474 0.224 0.474
42 2015-02-21 English League One Colchester 3 2 Bristol C 0.394 0.254 0.267 0.479 1.0 0.606 0.367 0.606
43 2015-02-21 English League One Preston 2 0 Scunthorpe 0.634 0.504 0.260 0.236 1.0 0.366 0.134 0.366
44 2015-02-21 English League One Port Vale 3 0 Doncaster 0.521 0.371 0.282 0.347 1.0 0.479 0.230 0.479
47 2015-02-21 English League One Swindon 1 2 Crawley 0.777 0.687 0.188 0.125 0.0 -0.777 0.603 0.777
48 2015-02-21 English League One Rochdale 1 0 Chesterfield 0.609 0.479 0.267 0.254 1.0 0.391 0.153 0.391
49 2015-02-21 English League One Yeovil 2 2 Gillingham 0.467 0.318 0.280 0.402 0.5 0.033 0.001 0.033
50 2015-02-21 English League One Fleetwood 2 1 Notts Co 0.612 0.473 0.268 0.259 1.0 0.388 0.151 0.388
51 2015-02-21 English League Two AFC W’bledon 3 2 Luton 0.551 0.404 0.280 0.316 1.0 0.449 0.202 0.449
52 2015-02-21 English League Two Dag & Red 1 3 Burton 0.498 0.349 0.282 0.369 0.0 -0.498 0.248 0.498
53 2015-02-21 English League Two Bury 1 0 Hartlepool 0.714 0.609 0.224 0.168 1.0 0.286 0.082 0.286
54 2015-02-21 English League Two Exeter 1 3 Plymouth 0.496 0.342 0.282 0.376 0.0 -0.496 0.246 0.496
55 2015-02-21 English League Two Stevenage 4 2 Southend 0.560 0.415 0.279 0.306 1.0 0.440 0.194 0.440
56 2015-02-21 English League Two Newport Co 0 1 Morecambe 0.635 0.498 0.262 0.240 0.0 -0.635 0.403 0.635
57 2015-02-21 English League Two Tranmere 2 1 Shrewsbury 0.443 0.295 0.277 0.428 1.0 0.557 0.310 0.557
58 2015-02-21 English League Two Oxford 3 0 Mansfield 0.603 0.465 0.270 0.265 1.0 0.397 0.158 0.397
59 2015-02-21 English League Two Carlisle 2 3 Wycombe 0.480 0.333 0.281 0.386 0.0 -0.480 0.230 0.480
61 2015-02-21 English League Two Cambridge U 2 6 Portsmouth 0.620 0.488 0.264 0.247 0.0 -0.620 0.384 0.620
62 2015-02-21 English League Two Northampton 3 0 York 0.598 0.463 0.270 0.266 1.0 0.402 0.162 0.402
1 2015-02-21 English Premier Sunderland 0 0 West Brom 0.537 0.389 0.281 0.330 0.5 -0.037 0.001 0.037
2 2015-02-21 English Premier Man City 5 0 Newcastle 0.730 0.627 0.216 0.157 1.0 0.270 0.073 0.270
3 2015-02-21 English Premier Hull 2 1 QPR 0.593 0.457 0.272 0.272 1.0 0.407 0.165 0.407
5 2015-02-21 English Premier C Palace 1 2 Arsenal 0.435 0.285 0.275 0.440 0.0 -0.435 0.189 0.435
7 2015-02-21 English Premier Swansea 2 1 Man Utd 0.442 0.290 0.276 0.434 1.0 0.558 0.311 0.558
8 2015-02-21 English Premier Aston Villa 1 2 Stoke 0.482 0.330 0.281 0.389 0.0 -0.482 0.233 0.482
10 2015-02-21 English Premier Chelsea 1 1 Burnley 0.778 0.692 0.185 0.122 0.5 -0.278 0.077 0.278
81 2015-02-21 FA Trophy Wrexham 2 1 Torquay 0.567 0.419 0.278 0.303 1.0 0.433 0.188 0.433
65 2015-02-21 Football Conference Bristol R 1 0 Altrincham 0.692 0.577 0.236 0.187 1.0 0.308 0.095 0.308
66 2015-02-21 Football Conference Halifax 1 0 Braintree 0.605 0.467 0.269 0.263 1.0 0.395 0.156 0.395
67 2015-02-21 Football Conference Dover 2 2 Southport 0.725 0.622 0.218 0.160 0.5 -0.225 0.051 0.225
68 2015-02-21 Football Conference Alfreton 2 3 Aldershot 0.568 0.424 0.277 0.299 0.0 -0.568 0.323 0.568
69 2015-02-21 Football Conference Barnet 1 3 Grimsby 0.620 0.488 0.264 0.247 0.0 -0.620 0.384 0.620
70 2015-02-21 Football Conference Forest Green 3 0 Telford 0.730 0.626 0.216 0.158 1.0 0.270 0.073 0.270
73 2015-02-21 Football Conference Nuneaton 0 0 Kidderminster 0.434 0.287 0.275 0.438 0.5 0.066 0.004 0.066
74 2015-02-21 Football Conference Chester 0 1 Eastleigh 0.551 0.407 0.279 0.313 0.0 -0.551 0.304 0.551
4 2015-02-22 English Premier Tottenham 2 2 West Ham 0.615 0.478 0.267 0.255 0.5 -0.115 0.013 0.115
6 2015-02-22 English Premier Everton 2 2 Leicester 0.657 0.533 0.252 0.215 0.5 -0.157 0.025 0.157
9 2015-02-22 English Premier Southampton 0 2 Liverpool 0.578 0.440 0.275 0.285 0.0 -0.578 0.334 0.578
77 2015-02-24 Conference North Stockport 0 1 Barrow 0.602 0.476 0.268 0.257 0.0 -0.602 0.363 0.602
12 2015-02-24 English Championship Millwall 1 3 Sheff Wed 0.520 0.369 0.282 0.349 0.0 -0.520 0.270 0.520
14 2015-02-24 English Championship Middlesbro 1 0 Bolton 0.719 0.616 0.221 0.164 1.0 0.281 0.079 0.281
16 2015-02-24 English Championship Brentford 4 0 Blackpool 0.708 0.601 0.227 0.172 1.0 0.292 0.085 0.292
17 2015-02-24 English Championship Wigan 0 1 Cardiff 0.535 0.388 0.281 0.331 0.0 -0.535 0.286 0.535
19 2015-02-24 English Championship Derby 2 0 Charlton 0.747 0.651 0.205 0.144 1.0 0.253 0.064 0.253
27 2015-02-24 English Championship Ipswich 4 2 Birmingham 0.691 0.577 0.236 0.187 1.0 0.309 0.096 0.309
28 2015-02-24 English Championship Brighton 2 0 Leeds 0.567 0.424 0.277 0.298 1.0 0.433 0.188 0.433
30 2015-02-24 English Championship Wolves 3 0 Fulham 0.637 0.504 0.260 0.236 1.0 0.363 0.132 0.363
31 2015-02-24 English Championship Watford 3 0 Rotherham 0.711 0.607 0.224 0.169 1.0 0.289 0.084 0.289
33 2015-02-24 English Championship Blackburn 1 2 Norwich 0.516 0.366 0.282 0.352 0.0 -0.516 0.266 0.516
34 2015-02-24 English Championship Huddersfield 3 0 Reading 0.576 0.434 0.276 0.290 1.0 0.424 0.179 0.424
38 2015-02-24 English League One Swindon 2 1 Bradford 0.592 0.461 0.271 0.268 1.0 0.408 0.167 0.408
40 2015-02-24 English League One Rochdale 1 2 Sheff Utd 0.538 0.399 0.280 0.321 0.0 -0.538 0.290 0.538
45 2015-02-24 English League One Preston 1 0 Walsall 0.656 0.528 0.253 0.219 1.0 0.344 0.118 0.344
46 2015-02-24 English League One Doncaster 1 3 Bristol C 0.489 0.339 0.282 0.380 0.0 -0.489 0.239 0.489
78 2015-02-24 English League One Scunthorpe 0 1 Barnsley 0.687 0.566 0.240 0.194 0.0 -0.687 0.472 0.687
60 2015-02-24 English League Two Accrington 1 0 Burton 0.462 0.311 0.279 0.410 1.0 0.538 0.290 0.538
63 2015-02-24 English League Two Portsmouth 3 2 Tranmere 0.598 0.456 0.272 0.272 1.0 0.402 0.162 0.402
80 2015-02-24 English League Two Cambridge U 0 0 AFC W’bledon 0.598 0.464 0.270 0.266 0.5 -0.098 0.010 0.098
71 2015-02-24 Football Conference Gateshead 2 0 Kidderminster 0.621 0.487 0.265 0.249 1.0 0.379 0.143 0.379
72 2015-02-24 Football Conference Grimsby 1 0 Telford 0.739 0.644 0.208 0.148 1.0 0.261 0.068 0.261
75 2015-02-24 Football Conference Bristol R 2 1 Braintree 0.649 0.517 0.257 0.227 1.0 0.351 0.123 0.351
79 2015-02-24 Football Conference Wrexham 0 0 Forest Green 0.533 0.385 0.281 0.333 0.5 -0.033 0.001 0.033
24 2015-02-25 English Championship Nottm Forest 2 1 Bournemouth 0.416 0.268 0.271 0.461 1.0 0.584 0.341 0.584