PART 1 ; OFFENSE (Attribute Weights / Evaluation)
(Part 2 ; Defense coming next)
Intro
I’m one of the weirdos who still spends an unhealthy amount of time in Madden 08 because this league is too good to let die. We run CPU vs CPU GM seasons like it’s a real simulation, we argue about progression like it’s a coaching staff meeting, and we all have that one player we swear the engine is biased against.
At some point I started asking myself a simple question:
What actually makes a player “good” at each position in this engine?
So I did what any data nerd in this community would do: I pulled a bunch of seasons, grabbed ratings + stat output, and started with correlation analysis. It worked… kind of. But the deeper I went, the more I realized correlations were giving me answers that looked confident while quietly double-counting the same traits.
So I came back to it, rebuilt the whole evaluation, and this time I used a method that’s better suited for assigning fair attribute weights.
Why I ditched my original method (and what I replaced it with)
When you start building an “analytics scouting system,” the first tool you reach for is usually correlation.
If an attribute (like SPD or AWR) correlates strongly with a stat (like rushing yards or QB rating), it feels natural to say:
“Okay ; that attribute matters a lot.”
That approach isn’t wrong. It’s just incomplete ; and in Madden, it can mislead you fast.
The problem: attributes travel in packs
Madden ratings aren’t independent ; they’re bundled.
Speed guys tend to also have ACC and AGI. Strong linemen often come with better blocking ratings. “Smart” players often have higher AWR and a stronger overall profile.
So correlation-based analysis often spits out something like:
• SPD is important ✅
• ACC is important ✅
• AGI is important ✅
…but in many cases those three are describing the same player type. Correlation can’t tell whether ACC is truly important, or whether it’s just “along for the ride” because ACC is usually high when SPD is high.
That leads to a classic data science problem:
double counting
My old method could accidentally give too much weight to a cluster of attributes that move together.
What I wanted instead: credit for unique value
If two attributes overlap, I don’t want to reward both as if they’re independent.
In scouting terms, this is the difference between:
• “This guy is fast, explosive, and agile” (but those might be the same trait three times)
vs
• “This guy is fast and he has something else that actually adds value.”
So I switched to a method that answers a better question:
How much does this attribute improve prediction after we already know the others?
The upgrade: Shapley / dominance weighting
Instead of assigning weights based on “how correlated is this with performance,” I used a Shapley-style dominance approach that splits the model’s contribution fairly.
The idea is simple:
• Test lots of feature combinations
• Measure how much each attribute improves prediction
• Average its contribution across contexts
• Turn that into weights you can actually use
This gives you something correlation doesn’t:
incremental value
Meaning: an attribute gets credit only for what it uniquely explains ; not for what it shares with the rest of its “attribute family.”
Why this matters for a scouting formula
My goal wasn’t just rankings. I wanted a clean formula that I can actually use in drafts and roster building:
PLAYER_VALUE = w1ATTR1 + w2ATTR2 + ...
Correlation is great for exploration.
Shapley/dominance is better for building a usable evaluation system.
One-liner summary
Correlation tells you what moves together. Shapley tells you what still matters when everything else is already on the table.
Evaluation of positions (Offense)
For obvious reasons, I’m not sharing the exact final multipliers ; after all the work, I’d rather keep the full spreadsheet private ; but I can share the biggest takeaways and what changed compared to my old approach.
QB
In my original approach I thought THP mattered a lot more than it actually does. After the new method, it looks like THP is mostly a minimum-threshold type attribute.
With ~17 seasons of SFL data, the “bad THP” cutoff seems to happen somewhere in the low 80s ; the exact number is still unclear because there aren’t many truly low-THP QBs getting meaningful snaps.
The two that matter most:
• AWR (by far #1)
• THA (still very relevant)
Stats used: TD, PASS YDS, QB RATING, INT
(YDS are half-weight so it leans toward quality over pure volume)
QB_SCORE = z(RAT) + z(TD) - z(INT) + 0.5*z(YDS)
HB
My correlation-based approach made me overrate BTK and underrate how much the “profile” traits overlap.
Biggest changes:
• CAR basically disappears (makes sense: the target is yards, not fumbles)
• AWR doesn’t really matter for HBs (in this dataset/definition)
Top group ends up roughly:
• BTK / STR / SPD / ACC (similar tier)
Then:
• WT and AGI (still useful, just behind the top)
Stats used: RUSH YDS
NOTE: I didn’t collect RUSH_AVG originally. That’s on me. I think it matters and I’m planning to add it going forward.
FB
My old method said RBK was everything. After re-running:
• AWR becomes slightly #1
• SPD / STR / RBK are next
• AGI / ACC still matter a bit
Stats used: PANCAKES only.
WR
Before: SPD + AWR + CTH ruled, and Height barely mattered (which always felt wrong).
Now: the data says Height + SPD are the top two.
Then:
• CTH + AWR as the second tier
Then:
• ACC + AGI as third tier
Stats used: RCV YDS
No TDs used (not available cleanly in my export), maybe later if I can merge better receiving stats.
TE
Tight Ends were the most interesting to me because I never cared much about their blocking. This time I intentionally included it: I gave pancakes half weight relative to receiving yards.
Main outcome:
• AWR is king (by far #1)
• SPD / ACC / CTH / AGI are your second-tier traits
• Height is not important for this TE score
I tested it directly. Even though TE height ranges 72–80 inches, the middle 50% of TEs are packed into a 2-inch band (75–77). Within that “already tall” range, height has basically no relationship with TE production:
• corr(INCHES, TE_SCORE) ≈ 0.017
• ΔR² from adding INCHES ≈ 0.0002
So height isn’t a differentiator here ; it’s more like a baseline TE trait in this roster pool.
OL (Pancakes-only evaluation)
LT
• RBK is #1
• AWR / STR / PBK are second tier
• ACC / AGI / SPD are third tier
RT
We all know RT is weird in this engine and pressure tends to come from that side, so I expected PBK to dominate. It shows up, but not as insanely as I expected:
• AWR / PBK / RBK top tier
• ACC second tier
• STR / AGI / SPD third tier
C
This surprised me the most:
• AWR clear #1
• RBK second tier
• PBK third tier
• physicals are tiny compared to those
OG (LG+RG combined)
LG and RG came out almost identical, so I pooled them.
• RBK slightly #1
• AWR right behind
• PBK next
• AGI / ACC / SPD meaningful but clearly below PBK
• STR low (similar to C)
TL;DR
• I rebuilt my player evaluation system because basic correlation was double-counting clusters of traits (SPD/ACC/AGI, PBK/RBK/STR, etc.).
• I switched to a Shapley / dominance approach that gives attributes credit only for their unique contribution (“incremental value”).
• I’m not posting the exact multipliers, but here are the main takeaways:
OFFENSE TAKEAWAYS
• QB: AWR is #1 by far, THA also matters. THP looks mostly like a minimum threshold (bad only when too low).
• HB: CAR drops out (yards ≠ fumbles). AWR doesn’t really matter. Top cluster is BTK/STR/SPD/ACC, with WT+AGI still useful.
• FB: Pancakes-only: AWR ends up slightly ahead; RBK/STR/SPD matter; AGI/ACC still contribute.
• WR: Height + SPD rise to the top. CTH/AWR are next tier. ACC/AGI are useful but clearly behind.
• TE: I weighted pancakes at half of yards. AWR is king; SPD/ACC/CTH/AGI next. Height isn’t a differentiator because most TEs are already clustered in a narrow “tall enough” range.
• OL (pancakes-only):
– LT: RBK leads; AWR/STR/PBK next.
– RT: AWR/PBK/RBK top tier (RT still weird in-engine).
– C: AWR dominates; RBK then PBK; physicals are tiny.
– OG: RBK and AWR are basically 1A/1B; PBK after; AGI/ACC/SPD behind; STR low.
Part 2 (Defense) coming next.
|