This post describes a Shiny app that calculates custom fantasy football rankings and projections for your league. The app includes the most accurate fantasy football projections available. Based on your league settings, the app calculates projections using a “wisdom of the crowd” approach, combining more sources of projections than any other website. The projections are calculated by weighting projection sources according to their historical accuracy. You can even choose how much weight to give each source. Best of all, the app updates the projections automatically for your league with your inputs, and you can download the data for yourself. So let’s get to it. Here’s a more thorough description:
How it Works
First, we use a script to scrape player’s projected points from numerous sources using R. Second, based on the user’s league scoring settings, we calculate players’ projections using an average of the analysts’ projections (by default, the sources are weighted according to historical accuracy). You can choose which projection sources to include, modify the weights, and choose to calculate a mean, weighted average, or robust average. A robust average is less affected by outliers (crazy projections). Third, we calculate the value of each player over a typical replacement player at his position (VOR) to determine player rankings. In addition, we calculate players’ risk levels, as defined by the average of: 1) injury risk from Sports Injury Predictor, and 2) the standard deviation of the players’ projected points and rankings across analysts. Note that risk is standardized to have a mean of 5 and a standard deviation of 2. We also display the “dropoff” in projected points for the next best 2 players at the same position. If a player has a high dropoff, you should consider targeting him because that position drops in value very quickly. For more info on how projected cost is calculated, see here. Using the custom rankings for your league settings, we also calculate the difference between a player’s overall rank and his average draft position (ADP). Positive values mean the player’s rank for your league is lower than ADP (i.e., he is over-valued according to ADP and will likely be drafted by others in your league too early in the draft). Negative values mean the player’s rank for your league is higher than ADP (i.e., he is under-valued according to ADP and you should consider drafting him).
Note on risk: although bench players are important in the case of a starter’s injury or under-performance, it is generally best to draft starters with minimal risk to ensure solid, if not superior, performance. On the other hand, one should accept more risk with bench players because such a move has a low risk, high reward potential. For bench players, value over replacement may be less important than a player’s upside. We include players’ upside potential (ceiling) in the output, as defined by the players’ upper bound of their 95% confidence interval of their projected points.
Note on VOR: you may notice that the top Defenses and Kickers have a negative VOR value. Why? We added a penalty to the VOR values for DSTs and Kickers to make the rankings more realistic and to reflect the fact that DSTs and Kickers are the least predictable. The penalty was based on where the DST and K were placed before penalty. The Ks were about 17-20 points over where the Expert Consensus Ranking (ECR) would have placed them and DSTs were 5-7 points over, so the VOR penalty is -18 for Kickers is -6 for DSTs.
Season: which season of projections to use.
Positions: which positions of players to include in calculations.
VOR Baseline: the position rank set to be the “typical replacement player” for each position. We set the default baseline VOR value as the number of players drafted at each position within the top 100 picks, based on ADP on MyFantasyLeague.com. You can modify the VOR baseline values. For info on how to select a typical replacement for each position, see here.
Impute Replacement-Level Points for Missed Games: Select yes to add points of the “typical replacement player” for each game a player is expected to miss due to suspensions. For example, if Player X is projected for 180 points over 12 of a possible 16 games, and our calculation determines 10 points per game as replacement-level production, the points column will show 220 points (180 + 4*10). Select no to avoid imputing replacement-level points for missed games. Projected number of games missed comes from ProFootballFocus.com.
Calculation Type: The type of average to calculate: mean, weighted average, or robust average. By default, a weighted average is used with analysts weighted by their historical accuracy. You can modify the weights in the weighted average. The mean is equivalent to a weighted average where all analysts are equally weighted (weight = 1). The robust average gives less weight to outliers (crazy projections).
Analysts: Select which analysts to include and, if weighted average, the weights for each analyst (i.e., how much weight to give each source of projections when calculating projected points). For instance, if you want to exclude ESPN projections, you would give them a weight of 0. If you want to give Yahoo projections twice the weight of CBS, you would give Yahoo a weight of 2 and CBS a weight of 1. The default weights reflect historical accuracy (higher = more accurate). Note that FantasyPros shows a default weight of zero because we already include all of their sources in our projections, so it would be double counting to give them a weight above 0. You can certainly do so, though, if you’d like. FantasyFootballNerd also shows a default weight of zero because it uses the same projections as FantasyData.
Scoring Settings: specify the number of points for each statistical category and position.
Cohen’s d Values (for customizing tiers): Unlike other site’s tiers, our tiers are determined empirically and take into account the distribution of each player’s projected points (not just the average projection). We use Cohen’s d to determine whether two players are in the same or a different tier. Cohen’s d is the most common measure of “effect size“. Cohen’s d estimates the magnitude of difference between two players’ distributions of projected points. We set a default threshold of 1.0, corresponding to a large effect size, for determining whether two players are in different tiers (if two players have a Cohen’s d greater than 1, they will be considered to be in different tiers). Users can customize their tiers by changing the Cohen’s d thresholds in the app (under “General Settings”). If you want more players in the same tier (i.e., fewer tiers), make the threshold values larger. If you want fewer players in the same tier (i.e., more tiers), make the threshold values smaller.
Positions: specify which positions of players to display.
Only sleepers (max per position): specify how many sleepers at each position to display. Sleepers were selected as the players with the greatest uncertainty risk who had a ceiling > 80 and a low position rank (ranked lower than 80% of the VOR baseline for each position, except for Kickers and DST, for whom the player’s position rank is lower than 8). In other words, sleepers are players with a high degree of uncertainty, high ceiling, and low position rank.
Compare Players: specify specific players to compare.
Exclude Players: specify players to exclude.
Rank: Overall rank by VOR.
VOR: Value Over Typical Replacement Player. Used to rank players across positions. Calculated by comparing players’ projected points to a “typical” replacement player at the same position (determined by VOR baseline values). For more info on how VOR is calculated, see here.
Points: Average projected points for a player across analysts.
Ceiling: A player’s upside, calculated as the 90th percentile of a player’s projected points across analysts.
Floor: A player’s downside, calculated as the 10th percentile of a player’s projected points across analysts.
ECR Rank: Expert Consensus Ranking from FantasyPros.
Pos Rank: Position rank.
ADP: Average draft position.
ADP Diff: The difference between ranking and ADP (higher values reflect more under-valued players that are better to target).
AAV: Average auction value.
Dropoff: The “dropoff” in projected points for the next best 2 players at the same position.
Risk: Risk of injury and degree of uncertainty of players’ projected points, calculated as the average of: 1) injury risk from Sports Injury Predictor, and 2) the standard deviation of the players’ projected points and rankings across analysts. Standardized within position to have a mean of 5 and a standard deviation of 2 (higher values reflect greater risk).
Displays a density plot of projected points by analyst. A density plot shows, for each analyst, what proportion of players are projected to score a given number of points. Density plots can be helpful for comparing analysts and finding analysts with wildly different projections.
Examines the accuracy of historical projections by position. Displays a scatterplot of projected versus actual points. Table includes accuracy estimates by position:
- mean error (ME): closer to zero is better (positive values mean the projections are under-estimates, negative values mean the projections are over-estimates)
- root-mean squared error (RMSE): lower is better
- mean absolute error (MAE): lower is better
- mean percentage error (MPE): closer to zero is better (positive values mean the projections are under-estimates, negative values mean the projections are over-estimates)
- mean absolute percentage error (MAPE): lower is better
- mean absolute scaled error (MASE): lower is better
- R-squared (RSQ): higher is better
R-squared is measure of relative fit, whereas the others are measures of absolute fit.
The Projections App
For the Projections App, go to: http://apps.fantasyfootballanalytics.net/projections