Introduction

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

This is the number 8 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.0273 -0.3115  0.1149  0.3370  0.8955 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.311e-01  5.417e-03  61.116  < 2e-16 ***
## E.1          5.449e-01  6.050e-03  90.065  < 2e-16 ***
## pts1         9.878e-04  4.237e-04   2.331  0.01974 *  
## pts.D       -2.381e-03  3.076e-04  -7.738 1.01e-14 ***
## pts.D.2     -1.374e-05  6.467e-06  -2.125  0.03360 *  
## pld1        -1.660e-03  6.092e-04  -2.724  0.00644 ** 
## pld.D        2.273e-03  7.110e-04   3.197  0.00139 ** 
## pld.D.2     -4.053e-05  3.083e-05  -1.314  0.18870    
## gs1          4.755e-04  1.709e-04   2.782  0.00541 ** 
## gs.D        -2.457e-04  1.525e-04  -1.611  0.10725    
## gs.D.2      -5.899e-07  4.687e-06  -0.126  0.89984    
## gd1         -6.014e-04  2.406e-04  -2.499  0.01245 *  
## gd.D         2.456e-03  1.759e-04  13.964  < 2e-16 ***
## gd.D.2      -5.564e-06  2.342e-06  -2.376  0.01751 *  
## pos1         7.665e-04  3.005e-04   2.551  0.01075 *  
## pos.D       -1.841e-03  2.514e-04  -7.324 2.42e-13 ***
## pos.D.2      3.743e-05  1.170e-05   3.198  0.00138 ** 
## form1        6.187e-04  3.518e-04   1.759  0.07858 .  
## form.D       1.355e-03  2.959e-04   4.579 4.67e-06 ***
## form.D.2    -7.278e-05  2.995e-05  -2.430  0.01509 *  
## tier1        1.894e-03  7.650e-04   2.476  0.01328 *  
## tier.D      -3.171e-02  2.862e-03 -11.081  < 2e-16 ***
## tier.D.2    -5.244e-03  1.258e-03  -4.170 3.05e-05 ***
## season.d    -1.084e-03  3.080e-05 -35.183  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3948 on 216186 degrees of freedom
##   (38368 observations deleted due to missingness)
## Multiple R-squared:  0.0852, Adjusted R-squared:  0.0851 
## F-statistic: 875.4 on 23 and 216186 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.636e+00  3.017e-02  87.37266
## pts1      4.240e-03  2.083e-03   2.03574
## pts.D    -1.226e-02  1.521e-03  -8.06218
## pts.D.2  -7.683e-05  3.608e-05  -2.12950
## pld1     -9.243e-03  2.996e-03  -3.08461
## pld.D     1.289e-02  3.567e-03   3.61445
## pld.D.2  -2.331e-04  1.637e-04  -1.42353
## gs1       3.426e-03  8.509e-04   4.02692
## gs.D     -1.565e-03  7.579e-04  -2.06455
## gs.D.2   -4.351e-07  2.555e-05  -0.01703
## gd1      -3.355e-03  1.193e-03  -2.81213
## gd.D      1.333e-02  8.793e-04  15.16266
## gd.D.2    7.987e-06  1.637e-05   0.48789
## pos1      3.054e-03  1.466e-03   2.08409
## pos.D    -7.976e-03  1.240e-03  -6.43396
## pos.D.2   2.025e-04  5.944e-05   3.40642
## form1     2.817e-03  1.719e-03   1.63933
## form.D    7.045e-03  1.456e-03   4.83698
## form.D.2 -2.289e-04  1.494e-04  -1.53202
## tier1     9.204e-03  3.726e-03   2.47018
## tier.D   -1.746e-01  1.505e-02 -11.59582
## tier.D.2 -6.568e-03  6.882e-03  -0.95439
## season.d -5.416e-03  1.526e-04 -35.49424
## 
## Intercepts:
##       Value    Std. Error t value 
## 0|0.5   0.2396   0.0264     9.0811
## 0.5|1   1.4285   0.0266    53.7811
## 
## Residual Deviance: 428424.66 
## AIC: 428474.66 
## (38368 observations deleted due to missingness)

The Forecasts

simpleplot <- function(div) {
  matches <- forecast.matches[forecast.matches$division==div,]
  matches <- matches[order(matches$date),]
  matches$id <- 1:NROW(matches)
  par(mar=c(9,4,4,5)+.1)
  plot(matches$id,matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
       main=paste("Forecasts of Weekend ",div," Matches",sep=""),
       ylab="Probability of Outcome")
  lines(matches$id,matches$Ph,col=2,pch=15,type="p")
  lines(matches$id,matches$Pd,col=3,pch=16,type="p")
  lines(matches$id,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=matches$id,labels=paste(matches$team1,matches$team2,sep=" v "),las=2,cex.axis=0.65)
  for(i in 2:NROW(matches)){
    if(matches$date[i]!=matches$date[i-1]) {
      lines(rep(c(i-0.5),2),c(0,1),lty=2)
    }
  }
}

bkplot <- function(div,div.short) {
  matches <- forecast.matches[forecast.matches$division==div,]
  matches <- matches[order(matches$date),]
  matches$id <- 1:NROW(matches)
  bk <- data.frame()
  loc <- paste("/home/readejj/Dropbox/Research/Data for Ideas/Betting/football/",Sys.Date(),"/",div.short,sep="")
  bk.matches <- dir(loc,pattern="*.csv")
  for(i in bk.matches) {
    temp <- read.csv(paste(loc,i,sep="/"),stringsAsFactors=F)
    temp <- clean.data(temp)
    temp$event <- gsub("[.]csv","",i)
    bk <- rbind(bk,temp)
  }
  bk <- bk[order(bk$event,bk$Date.Time),]
  bk$mean <- rowMeans(bk[colnames(bk)[nchar(colnames(bk))==2]],na.rm=T)
  bk$event <- gsub("sheffield-wednesday","sheff wed",bk$event)
  bk$event <- gsub("nottingham-forest","nottm forest",bk$event)
  bk$event <- gsub("middlesbrough","middlesbro",bk$event)
  bk$event <- gsub("man-utd","man utd",bk$event)
  bk$event <- gsub("man-city","man city",bk$event)
  bk$event <- gsub("aston-villa","aston villa",bk$event)
  bk$event <- gsub("west-brom","west brom",bk$event)
  bk$event <- gsub("west-ham","west ham",bk$event)
  bk$event <- gsub("crystal-palace","c palace",bk$event)
  bk$team1 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\1",bk$event)
  bk$team2 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\2",bk$event)
  bk$event <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\3",bk$event)
  bk$event.1 <- c(bk$event[-1],NA)
  bk.h <- bk[(bk$event!=bk$event.1 | is.na(bk$event.1)==T) & bk$event==bk$team1,]
  bk.d <- bk[bk$event!=bk$event.1 & regexpr("draw",bk$event)>-1,]
  bk.a <- bk[bk$event!=bk$event.1 & bk$event==bk$team2,]
  matches$team1 <- tolower(matches$team1)
  matches$team2 <- tolower(matches$team2)
  
  matches <- merge(matches,bk.h[c(colnames(bk.h[nchar(colnames(bk.h))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
  colnames(matches)[colnames(matches) %in% colnames(bk.h) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.h) & regexpr("team",colnames(matches))==-1],".h",sep="")
  matches <- merge(matches,bk.d[c(colnames(bk.d[nchar(colnames(bk.d))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
  colnames(matches)[colnames(matches) %in% colnames(bk.d) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.d) & regexpr("team",colnames(matches))==-1],".d",sep="")
  matches <- merge(matches,bk.a[c(colnames(bk.a[nchar(colnames(bk.a))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
  colnames(matches)[colnames(matches) %in% colnames(bk.a) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.a) & regexpr("team",colnames(matches))==-1],".a",sep="")
  
  par(mar=c(9,4,4,5)+.1)
  plot(matches$id,matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",cex=1.5,
       main=paste("Forecasts of Weekend ",div," Matches",sep=""),
       ylab="Probability of Outcome")
  for(i in colnames(matches)[grep("[.]h",colnames(matches))]) {
    for(j in matches$id) {
      lines(j,1/matches[matches$id==j,i],col="darkred",pch=0,type="p",cex=0.5)
    }  
  }
  
  lines(matches$id,matches$Pd,col=3,pch=16,type="p",cex=1.5)
  for(i in colnames(matches)[grep("[.]d",colnames(matches))]) {
    for(j in matches$id) {
      lines(j,1/matches[matches$id==j,i],col="darkgreen",pch=0,type="p",cex=0.5)
    }  
  }
  lines(matches$id,matches$Pa,col=4,pch=17,type="p",cex=1.5)
  for(i in colnames(matches)[grep("[.]a",colnames(matches))]) {
    for(j in matches$id) {
      lines(j,1/matches[matches$id==j,i],col="darkblue",pch=0,type="p",cex=0.5)
    }  
  }
  legend("topleft",ncol=3,pch=c(15,16,17),col=c(2:4),
         legend=c("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=matches$id,labels=paste(matches$team1,matches$team2,sep=" v "),las=2,cex.axis=0.65)
}

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)
}

Premier League

simpleplot("English Premier")

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.

bkplot("English Premier","premier-league")
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric

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.

The only really notable difference is in the Man City West Brom match: my model fancies Man City much less than the bookmakers do. A West Brom win seems highly unlikely, but City have already had a pretty awful week.

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

  • Southampton to beat Burnley.
  • Tottenham to beat Leicester.
  • Chelsea to win at Hull.

Championship

Next, our Championship forecasts:

simpleplot("English Championship")

This week I’m adding in Championship bookmaker prices:

bkplot("English Championship","championship")

The big divergences here are:

  • Wolves vs Derby: My model fancies Wolves much more than the bookies.
  • Bournemouth vs Middlesbrough: My model fancies Bournemouth more than the bookies.
  • Blackburn vs Brighton: My model fancies Blackburn much more than the bookies.
  • Charlton vs Reading: My model fancies Charlton much more than the bookies.
  • Watford vs Ipswich: My model fancies Watford much more than the bookies.

League One

Next, our League One forecasts:

simpleplot("English League One")

League Two

Next, our League Two forecasts:

simpleplot("English League Two")

Football Conference

Next, our Football Conference forecasts:

simpleplot("Football Conference")

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-20 English Championship Wolves 0.6683253 Derby 0.5426365 0.2530953 0.2042683
2 2015-03-20 Football Conference Bristol R 0.7654480 Aldershot 0.6591852 0.2047695 0.1360453
62 2015-03-21 Conference North Tamworth 0.6436249 Hednesford 0.5138240 0.2624663 0.2237097
69 2015-03-21 Conference North Boston Utd 0.7728899 Gainsborough 0.6648599 0.2020484 0.1330917
61 2015-03-21 Conference South Farnborough 0.4457166 Bath City 0.2865024 0.2821696 0.4313281
10 2015-03-21 English Championship Bournemouth 0.6726339 Middlesbro 0.5517542 0.2498941 0.1983518
11 2015-03-21 English Championship Huddersfield 0.5062176 Fulham 0.3522602 0.2887492 0.3589906
12 2015-03-21 English Championship Rotherham 0.4903325 Sheff Wed 0.3325754 0.2880744 0.3793502
13 2015-03-21 English Championship Blackburn 0.7432269 Brighton 0.6276684 0.2193098 0.1530219
14 2015-03-21 English Championship Charlton 0.7096900 Reading 0.5960485 0.2328576 0.1710939
15 2015-03-21 English Championship Watford 0.8121298 Ipswich 0.7130300 0.1777772 0.1091928
16 2015-03-21 English Championship Cardiff 0.5540088 Birmingham 0.4070745 0.2856302 0.3072953
17 2015-03-21 English Championship Wigan 0.6063754 Bolton 0.4682199 0.2747715 0.2570086
18 2015-03-21 English Championship Norwich 0.6272093 Nottm Forest 0.5017616 0.2660354 0.2322030
19 2015-03-21 English Championship Brentford 0.7936501 Millwall 0.7039875 0.1824871 0.1135254
20 2015-03-21 English Championship Blackpool 0.2772274 Leeds 0.1581541 0.2233521 0.6184938
21 2015-03-21 English League One Barnsley 0.4835494 Preston 0.3286547 0.2878151 0.3835302
22 2015-03-21 English League One Sheff Utd 0.6336539 Port Vale 0.5027016 0.2657651 0.2315333
23 2015-03-21 English League One Crawley 0.5117721 Leyton Orient 0.3545966 0.2887622 0.3566412
24 2015-03-21 English League One Gillingham 0.7781465 Colchester 0.6708656 0.1991356 0.1299988
25 2015-03-21 English League One Bradford 0.6184173 Fleetwood 0.4836325 0.2709814 0.2453860
26 2015-03-21 English League One Crewe 0.5805303 Oldham 0.4357724 0.2814103 0.2828173
27 2015-03-21 English League One Peterborough 0.6494798 Chesterfield 0.5181546 0.2611326 0.2207128
28 2015-03-21 English League One Coventry 0.5039417 Doncaster 0.3496906 0.2887189 0.3615905
29 2015-03-21 English League One Rochdale 0.6700638 Scunthorpe 0.5554547 0.2485638 0.1959815
30 2015-03-21 English League One MK Dons 0.4405967 Notts Co 0.3024233 0.2849415 0.4126352
31 2015-03-21 English League Two Plymouth 0.5288782 Newport Co 0.3791693 0.2880847 0.3327459
32 2015-03-21 English League Two AFC W’bledon 0.4807830 Portsmouth 0.3222693 0.2873006 0.3904302
33 2015-03-21 English League Two Shrewsbury 0.7374737 Oxford 0.6302573 0.2181531 0.1515896
34 2015-03-21 English League Two Tranmere 0.3497458 Burton 0.2085670 0.2553165 0.5361165
35 2015-03-21 English League Two Hartlepool 0.4465967 Mansfield 0.2869138 0.2822515 0.4308347
36 2015-03-21 English League Two Cheltenham 0.4776438 Exeter 0.3214544 0.2872266 0.3913190
37 2015-03-21 English League Two Southend 0.6899824 Cambridge U 0.5638601 0.2454773 0.1906627
38 2015-03-21 English League Two Carlisle 0.6508966 Morecambe 0.5210340 0.2602309 0.2187351
39 2015-03-21 English League Two Bury 0.6675887 Northampton 0.5383542 0.2545606 0.2070851
40 2015-03-21 English League Two Accrington 0.4867336 York 0.3254142 0.2875684 0.3870174
41 2015-03-21 English League Two Stevenage 0.6744996 Dag & Red 0.5518389 0.2498638 0.1982973
3 2015-03-21 English Premier Stoke 0.6190870 C Palace 0.4816349 0.2714946 0.2468704
4 2015-03-21 English Premier Newcastle 0.3005543 Arsenal 0.1726128 0.2339110 0.5934762
5 2015-03-21 English Premier Southampton 0.7787170 Burnley 0.6850935 0.1921031 0.1228034
6 2015-03-21 English Premier Tottenham 0.7821516 Leicester 0.6787133 0.1952794 0.1260073
7 2015-03-21 English Premier Man City 0.6889980 West Brom 0.5866152 0.2366833 0.1767015
8 2015-03-21 English Premier Aston Villa 0.5778841 Swansea 0.4336757 0.2817732 0.2845512
9 2015-03-21 English Premier West Ham 0.6466131 Sunderland 0.5242069 0.2592235 0.2165696
42 2015-03-21 Football Conference Wrexham 0.7011045 Lincoln 0.5837898 0.2378091 0.1784012
43 2015-03-21 Football Conference Torquay 0.5958380 Kidderminster 0.4581215 0.2770380 0.2648405
44 2015-03-21 Football Conference Barnet 0.8488533 Welling 0.7620009 0.1511356 0.0868635
45 2015-03-21 Football Conference Macclesfield 0.7374843 Nuneaton 0.6427770 0.2124630 0.1447601
46 2015-03-21 Football Conference Alfreton 0.5874616 Chester 0.4473761 0.2792534 0.2733704
47 2015-03-21 Football Conference Dover 0.5408086 Gateshead 0.3928702 0.2870932 0.3200366
48 2015-03-21 Football Conference Grimsby 0.6346850 Eastleigh 0.5028478 0.2657229 0.2314293
49 2015-03-21 Football Conference Woking 0.5494215 Forest Green 0.4016516 0.2862396 0.3121088
50 2015-03-21 Football Conference Southport 0.6849996 Dartford 0.5621175 0.2461245 0.1917580
51 2015-03-21 Football Conference Altrincham 0.5151278 Halifax 0.3626124 0.2887024 0.3486852
106 2015-03-22 English Premier QPR 0.4635192 Everton 0.3072164 0.2856196 0.4071640
107 2015-03-22 English Premier Hull 0.2736013 Chelsea 0.1561006 0.2217537 0.6221458
108 2015-03-22 English Premier Liverpool 0.6046988 Man Utd 0.4640892 0.2757198 0.2601910
109 2015-03-22 JP Trophy Bristol C 0.8279363 Walsall 0.7368224 0.1650660 0.0981117
112 2015-03-24 English League One Oldham 0.4423522 Rochdale 0.2853290 0.2819327 0.4327383
133 2015-03-24 English League One Sheff Utd 0.6008226 Scunthorpe 0.4628322 0.2760026 0.2611652
113 2015-03-24 English League Two Luton 0.4458798 Wycombe 0.2872629 0.2823206 0.4304164
114 2015-03-24 Football Conference Braintree 0.7518244 Telford 0.6524652 0.2079521 0.1395827
115 2015-03-24 Football Conference Alfreton 0.6881130 Dartford 0.5657038 0.2447883 0.1895079
116 2015-03-24 Football Conference Dover 0.4362090 Grimsby 0.2798994 0.2807767 0.4393239
117 2015-03-24 Football Conference Woking 0.7674044 Torquay 0.6620147 0.2034165 0.1345688
118 2015-03-24 Football Conference Nuneaton 0.4497043 Wrexham 0.2938011 0.2835413 0.4226576
134 2015-03-24 Football Conference Halifax 0.5234314 Gateshead 0.3704449 0.2884916 0.3410636