In a previous post, I showed how to determine the best starting lineup to draft in an auction draft using an optimizer tool. In this post, we use an OpenCPU app in R to determine the best possible players to pick in a fantasy football snake draft. The app includes the most accurate fantasy football projections available, and calculates a robust average of more sources of projections than any other website (see here for a list of the sources of projections). You can even choose how much weight to give each source. Based on your league settings, it determines which players you should draft to maximize your players’ value over typical replacement players at their respective positions. It also allows you to change your risk tolerance to avoid picking risky players. Best of all, the app updates the selections automatically 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’ 90th percentile of their projected points across analysts.
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 Kickers were placed before penalty. The Kickers 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.
- Draft your offensive starting lineup first before drafting bench players. Save Kickers and Defenses for later rounds because they are less predictable and score fewer points.
- For starters, pick the player with the highest value (over a typical replacement) who has a low risk and a high floor. Bench players only benefit your team if a starter gets injured or they outperform a starter. In a standard league, 1500 points would likely put you in the top 10% of teams. Your goal is thus to maximize your starting lineup’s projected points.
- For bench players, pick the player with the highest value (over a typical replacement) who has a high ceiling. That way, one or more of your bench players has a chance to outperform your starters or be a solid replacement if your starters get injured. You should be willing to accept a higher risk for bench players than for starters.
- Give players more weight if they have either:
- a high dropoff (the player is projected to score many more points than the next best players at the same position), or
- a low ADP Difference score (i.e., the player tends to be under-valued compared to ADP and you might be able to draft him in a later round).
Season: which season of projections to use.
AAV: source of average auction values.
ADP: source of average draft position.
League Scoring: source of scoring settings.
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.
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 (lower 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.
The Snake Optimizer App
For the Snake Optimizer App, go to: http://apps.fantasyfootballanalytics.net/projections