# The NFL fan ruler — methodology

**Which NFL team is objectively the best to be a fan of?**
32 franchises, six measured dimensions, one declared weighting.

`nfl-fan-ruler-2026.csv` — 32 rows, 47 columns. Built 2026-08-21.

---

## 1 · The question, and what it is not

Not "which team is best". Not "which team wins most". **What does a franchise
give back to the people who support it** — over a career of supporting it, in
units you can point at.

That means winning is one input among six, not the answer. It also means the
answer is allowed to be a team with a modest trophy case, and in fact it is.

---

## 2 · Sources

| what | source | coverage |
|---|---|---|
| every game | nflverse/nfldata `games.csv` | **7,276 games**, 1999–2025 regular season + playoffs |
| game-day cost | Team Marketing Report **Fan Cost Index 2024** | 32 clubs |
| attendance | ESPN NFL attendance | 2013–2025; **5–12 usable seasons per club** |
| all-time titles | Wikipedia, List of Super Bowl champions | cross-checked 1999–2025 against the game log |
| home coordinates | nflverse `airports.csv` | 32 clubs |

The window opens at **1999** because that is where the nflverse game log starts
and because it is the first season with all 32 current franchises. Everything
that could only be measured before 1999 is therefore outside what this table
can show — see §7.

---

## 3 · The six dimensions

| key | measures | unit | direction |
|---|---|---|---|
| `success` | how often they win | win %, 1999–2025 | higher better |
| `payoff` | what the winning is worth | playoff wins per season | higher better |
| `drought` | how long you wait | seasons, **vs expected** | lower better |
| `cost` | what a Sunday costs | Fan Cost Index, $ / family of four | lower better |
| `loyalty` | whether the building fills | attendance vs **own demonstrated peak** | higher better |
| `now` | is there something to believe in | recent form index, 2021–2025 | higher better |

Each is converted to a **midrank percentile within the 32**, then combined.

### Why midrank and not a positional percentile

Drought values tie constantly — nine clubs have a zero-season drought. A
positional percentile lets file order decide which of two identical franchises
outranks the other. That exact bug shipped in an earlier episode of this series
and is not repeated here. Ties share the mean of the ranks they span.

---

## 4 · Two dimensions are residualised on winning

A composite that counts winning three times is a composite that measures
winning. Good teams have short droughts and full stadiums *because* they are
good, so `drought` and `loyalty` are each regressed on win percentage and
**scored on the residual** — what is left after accounting for how good the
team actually is.

- `drought` residual model R² = **0.37**
- `loyalty` residual model R² = **0.09**

After residualising, the correlation of each with win percentage is zero by
construction. Both raw and residual columns ship in the CSV so you can undo it.

### The attendance denominator, which is the choice that matters most

The first build scored attendance against **listed stadium capacity**. That is
wrong in a way that is easy to miss: under listed capacity **six clubs "fill"
more than 100%** of their stadium — Dallas 116.6%, Buffalo 115.6%, the Rams
104.0%, San Francisco 102.9%, Miami 100.8%, Arizona 100.4% — so the denominator
is not a capacity. It also hid Washington's crowd falling **22.7% off its own
record**: they removed seats as the crowds fell, 82,000 down to 64,000, so the
listed denominator chased the collapse and made the decline disappear.

The shipped version uses each club's **own demonstrated peak** average home
crowd across the attendance seasons it has. A club is measured against the best it
has ever actually drawn, not against a number a press office published.
`fill_vs_listed_pct_unscored` ships alongside so you can see the difference; it
is not used in the score.

---

## 5 · The weighting — one definition, then tested

**All six count equally.** That is a declared value judgement, not a neutral
default: there is no published source that gives a weight vector over these six
things, and inventing one would make the answer an opinion with a chart on it.

The result is then **tested, not asserted**:

- **Four named weightings** — Equal, Success-heavy, Value-heavy,
  Experience-heavy. Per-club ranks under each ship as `rank_baseline`,
  `rank_success`, `rank_value`, `rank_experience`.
- **100,000 weightings drawn uniformly from the simplex** (Dirichlet(1,…,1),
  seeded `20260821`, so a rebuild reproduces these numbers). This is not four
  opinions — it is all of them.

```
#1 in 32.7%  Baltimore Ravens     top-3 69%   mean rank  3.2
#1 in 25.1%  Indianapolis Colts   top-3 46%   mean rank  5.5
#1 in 12.2%  Seattle Seahawks     top-3 54%   mean rank  4.3
#1 in 11.0%  Arizona Cardinals    top-3 20%   mean rank 12.6
```

**19 of the 32 clubs finish first under some defensible weighting.** Baltimore
is the most robust answer by a clear margin — it wins a third of all possible
weightings, half again as often as the next club, and has the best mean rank in
the league — and it still loses two weightings in three.

The honest statement of the result, and the one the video makes:

> Under equal weights and under a success-first reading, the Ravens win. Under a
> cost-first reading they are second and the Colts win. Under an
> experience-first reading they are **sixth** and the Cardinals win. Across
> every possible weighting, no club is #1 anywhere near as often as Baltimore.

---

## 6 · The result

**Baltimore Ravens, 73.1 / 100, +1.60σ**, 2.0 clear of Seattle.

Not for the trophy case. The Ravens are the **only club in the league above the
league median on all six measures**, and their weakest dimension is the
**55th percentile** — no other club's worst dimension clears the **39th**.

The other half of the finding is what happens to the famous teams. New England
is at the **100th percentile on both success and payoff** and the **16th on
cost** and the **16th on loyalty** — it finishes **15th**. Pittsburgh 19th,
Dallas 20th. Being famous turns out to be being *spiky*, not being good.

---

## 7 · What this does not measure, stated rather than buried

- **Nothing before 1999.** Dallas's 1990s, the Steelers' 1970s, the Browns'
  pre-1996 history — none of it is in the window. All-time Super Bowls ship as
  a column but are not scored.
- **n = 32.** There are 32 NFL franchises and that is the whole population, but
  it is a small one: first to second is 2.0 points on a 100-point scale. Treat
  adjacent ranks as ties.
- **No TV/streaming cost, no merchandise, no travel.** `cost` is the Fan Cost
  Index — the price of physically attending one game with a family of four.
- **No fan sentiment, no rivalry, no aesthetics.** Nothing here is a survey.
- **Home-field advantage is not an input.** It was measured (league mean
  **+4.48** points) and then dropped: after shrinkage the between-club variance
  is indistinguishable from sampling noise (τ² ≈ 0, signal share ≈ 0), so a
  per-club home edge would have been fitting noise. The raw figure ships as
  `home_edge_raw_pts_unused`.
- **Relocations are treated as the franchise, not the city.** The Rams, Raiders
  and Chargers carry their full 1999–2025 record.

---

## 8 · Columns

`rank`, `team`, `franchise`, `score_equal_weights`, `sigma` — the result.

`p_success` … `p_now` — the six percentiles the score is built from.

`win_pct_1999_2025` … `avg_wait_conference_final` — the raw winning and
drought inputs, in their own units.

`fan_cost_index_2024`, `avg_ticket_2024`, `stadium`, `stadium_era_from` — cost.

`attendance_seasons` (5–12; clubs in newer stadiums have fewer), `peak_home_avg`, `peak_year`, `listed_capacity_unscored`,
`home_avg_attendance_2021_2025`, `fill_vs_peak_pct`, `fill_vs_listed_pct_unscored`,
`fill_residual_pct_pts` — attendance, both denominators, scored and unscored.

`recent_win_pct_2021_2025`, `recent_playoff_wins_2021_2025` — the `now` inputs.

`rank_baseline`, `rank_success`, `rank_value`, `rank_experience` — the four
named weightings.

`pct_of_100k_weightings_ranked_1`, `pct_top3`, `pct_top5`, `mean_rank` — the
simplex sweep.

---

*reelgorithm.py · "The Ruler" · every figure above is reproducible from the CSV.*
