Statistical Explainer: knicks_2026_analysis.py

Author

Justin Pietsch

Published

July 4, 2026

Draft

A guide to every analysis that produces output in knicks_2026_historic_results.md: the data it uses, the statistical approach, why that approach was chosen, what the results mean, and (where a section has one) why its figure takes the form it does. Sections appear in the same order as knicks_2026_historic_results.md. The figures themselves are embedded in knicks_2026_historic_findings.md; here we only explain the reasoning behind each choice. Unlike knicks_2026_historic_findings.md, this document uses statistical terminology freely; it is the methods companion, not the narrative report.


0. The Comparison Dataset (build_champions_table, build_conference_gap_table)

The data. Most percentile comparisons in this document run against one of two tables built by looping over all 43 NBA seasons from 1983–84 through 2025–26.

The 2025-26 Knicks won the title (identify_champion returns the Knicks for 2026), so they are themselves one of the 43 rows. Every percentile in the report ranks the Knicks against a set that includes their own season: the count and the denominator both contain them. This is why a “100th percentile / 1st of 43” reads as “no other champion did better,” not “better than 43 other teams.”

build_champions_table produces one row per season with:

  • year: the season’s end year (e.g. 2026 for 2025–26)
  • champion_id: the team with the most playoff wins (identify_champion, which counts wins from the playoff game-log cache; ties broken by the team with the highest win count in the regular season)
  • wins, losses, win_rate: the champion’s playoff record
  • avg_margin: mean per-game point differential, with PLUS_MINUS filled from PTS for pre-1997 seasons (see §Pre-1997 note below)
  • avg_opp_srs: games-weighted average regular-season SRS (Simple Rating System: a team’s rating equal to its average point margin per game, adjusted for opponent strength; defined in full under Recurring Methods below) of playoff opponents (each game counts once; a 5-game Finals opponent has 5× the weight of a 4-game sweep opponent, matching the per-game basis of avg_margin)
  • adj_margin: avg_margin − avg_opp_srs
  • champion_reg_srs: the champion’s own regular-season SRS
  • overperformance: avg_margin − champion_reg_srs + avg_opp_srs; equivalently, mean per-game residual (actual − expected) where expected = champion_SRS − opp_SRS
  • clutch_rate: fraction of games decided by ≤5 points
  • home_wr, away_wr: home and away win rates

build_conference_gap_table produces one row per season with:

  • east_srs, west_srs: mean regular-season SRS across all teams in each conference
  • srs_gap: west_srs − east_srs (positive = West stronger)
  • east_h2h_wr: East win rate in games played cross-conference

Why loop from cache, not from the API. All CSVs were pre-fetched once by fetch_data.py and stored in nba/cache/. The loop reads from disk only. This makes the analysis fully reproducible offline and fast enough to re-run in under a minute.

Pre-1997 PLUS_MINUS. The NBA.com API (LeagueGameFinder) returns null PLUS_MINUS for seasons before 1997. The helper fill_plus_minus (in second_look_nba/data.py) fills these from PTS: for each GAME_ID, the two rows are swapped to give each team the opponent’s score, and PLUS_MINUS = PTS − OPP_PTS is computed exactly. This is algebraically exact for game margins. Without this fix, 13 of 43 seasons would have NaN margins and could not appear in the percentile comparisons.


1. The Raw Claim (run_raw_claim)

The data. The Knicks’ 2025–26 playoff game log (from cache) and the champions table spanning 43 seasons.

The approach. Two metrics (win rate and average margin) are computed for the Knicks and each is fed to _pct_rank:

_pct_rank(series, value, ascending=True)
    → (series ≤ value).mean() × 100

This is the empirical percentile rank: the fraction of 43 champions whose value is at or below the Knicks’ value, expressed as a percentage. The ascending=True convention means higher values are better (a value at the 95th percentile is better than 95% of champions).

No distributional assumptions are made; only counting. With 43 data points, the finest percentile resolution is 1/43 ≈ 2.3 percentage points; exact ties are counted as “≤”, so achieving the best historical value yields 100th percentile.

What the results mean. Win rate 0.842 sits at the 88th percentile (better than all but five champions; best ever is the 2016–17 Warriors at 0.941). Average margin +14.9 pts/game is the 100th percentile, the highest ever recorded in the dataset. The margin claim is the strongest of the two raw numbers.

Why these two charts. Both are horizontal bar charts of all 43 champions ranked from lowest to highest on the metric, with the Knicks bar highlighted in blue. A ranked bar chart answers two questions simultaneously: “where does this team rank?” (bar position) and “how unusual is the gap from the next-best?” (spacing). Horizontal orientation keeps the 43 season labels readable. Vertical wouldn’t; 43 narrow columns of year labels would overlap. The Knicks bar is labeled with the value; the chart is the main visual for the findings report’s “The Raw Numbers” section.


2. Conference Context, 2025-26 (run_east_weakness)

The data. 2025–26 regular-season game logs and standings (one row per team with TeamID, Conference, TeamCity, TeamName).

The approach. Three computations using that season’s data only:

  1. compute_srs(reg_2026): returns a pd.Series indexed by TEAM_ID with each team’s regular-season SRS (see §SRS in the Recurring Methods section).
  2. compute_conference_avg_srs(srs, standings): maps each TEAM_ID to its conference and takes the unweighted mean of SRS within East and West.
  3. compute_inter_conference_h2h(reg_logs, standings): iterates every game in the regular-season log, identifies games between an East and a West team (using the standings Conference column), and counts East wins divided by total cross-conference games. Each game contributes one East-win or one West-win.

Additionally, compute_opponent_srs(po_2026, srs_2026, KNICKS_TEAM_ID) is used here to show the Knicks’ specific opponents and their SRS values. It finds every unique opponent TEAM_ID by inspecting the two-row-per-GAME_ID structure of the playoff logs: for each game, all team IDs except KNICKS_TEAM_ID are collected, then each opponent’s SRS is looked up from the regular-season series.

What the results mean. The East SRS average was −0.20 pts/game vs. West +0.20 (gap +0.39). The inter-conference win rate was 0.487, very close to parity. The Knicks’ opponents had SRS values from −0.27 (76ers) to +8.28 (Spurs).

Why this chart (team SRS bar). The team SRS bar chart (all 30 teams on one axis, East bars in green, West in blue) is the direct visualization of the conference-averages computation. The eye instantly compares the two conference clouds. An alternative (two box plots, one per conference) would show distributions better but would obscure where specific opponents (the Spurs, Cavaliers) sit. Because the Knicks’ opponents are all identified by name in the text, the full-team bar chart gives context for where each one sits relative to all 30 teams.


3. Historical Conference Gap (run_gap_history)

The data. The gap_table (43 seasons × 5 columns).

The approach. Two layers of analysis:

  1. _pct_rank against the 43-season srs_gap series (100th = most West-dominant).
  2. Z-score and 95% confidence interval:
    • Z = (gap_2026 − mean_gap) / std_gap; tells how many standard deviations from the historical average this season’s gap is.
    • 95% CI on the mean gap, using the t-distribution (the small-sample cousin of the normal curve) with degrees of freedom df = n−1 = 42: shows the range of plausible “true average” West-East gaps given 43 observations.

The scipy.stats.t.ppf(0.975, df=42) critical value is used for the CI half-width: ci_half = t * std / sqrt(n).

Three “most West-dominant” and three “most East-dominant” seasons are also reported as concrete anchors.

What the results mean. Z = −0.21: the 2025–26 gap (+0.39) is only 0.21 standard deviations below the historical mean gap (+0.78). This is well within normal variation (|z| < 1), formally confirming the percentile-based conclusion. The historical mean of the gap is +0.78; the West has typically been stronger than the East, but 2025–26 was slightly below that average (more East-competitive than normal), though not significantly so. The “easy conference” narrative is ruled out not just by ranking (37th percentile) but by the Z-score: at Z = −0.21 the 2025–26 gap is nowhere near the |z| > 1.96 a conventionally significant departure would require, so the season’s conference gap is statistically ordinary.

Why this chart (conference gap line). The conference gap is a time series (43 data points, one per season), so a line is the natural form. It shows the gap oscillating over time rather than trending, which is the important visual point. A bar chart could work (one bar per season, positive = West dominant) but would look cluttered with 43 bars. The shading above/below zero makes East vs. West dominance immediately readable. The 2025–26 dot and annotation show exactly where the subject season falls on that multi-decade chart.


4. Opponent Quality (run_opponent_quality)

The data. 2025–26 playoff logs, 2025–26 regular-season SRS, and the champions table.

The approach. compute_games_weighted_opponent_srs(po_2026, srs_2026, KNICKS_TEAM_ID) finds all unique opponents (by GAME_ID inspection, as in §2) and takes a per-game average of their regular-season SRS values (each playoff game contributes its opponent’s SRS once). That single number (+3.67) is then ranked via _pct_rank against champions["avg_opp_srs"], the same metric for all 43 champions.

Why regular-season SRS for opponents, not playoff SRS. Playoff SRS could be computed, but it would be circular: a team’s playoff SRS reflects partly who they faced, which again includes the Knicks. Regular-season SRS measures each opponent’s strength on an independent baseline (all 82 games before the playoffs began), making it a cleaner gauge of how hard the Knicks’ draw was.

Why games-weighted, not unique-opponent average. avg_opp_srs is computed as a per-game average across all playoff games (each game contributes one opponent SRS data point), not as a simple average of four unique opponents. This matches the basis of avg_margin, which is also a per-game average. When the same formula adj_margin = avg_margin − avg_opp_srs is applied, both sides are expressed on the same per-game scale, making the subtraction internally consistent: “how dominant per game after accounting for per-game opponent quality?” A unique-opponent average could give equal weight to a 4-game first-round opponent and a 7-game Finals opponent, which would misstate the actual per-game opponent quality experienced.

What the results mean. Games-weighted average opponent SRS +3.67 sits at the 49th percentile among 43 champions, right at the historical median. The schedule was not unusually easy or hard. Champions who faced the weakest opponents (2022–23 Nuggets +0.62, 1986–87 Lakers +1.32) faced average SRS values more than 2 pts/game below the Knicks’.

Why two charts here. The opponent-SRS ranking bar (all 43 champions) and the opponent-by-round bar (four Knicks opponents) answer different questions. The ranking says “relative to history, was the schedule hard?” The round-by-round bar says “which specific opponents were strong and which were weak?”: it shows that the Spurs (+8.28) in the Finals were elite while the 76ers (−0.27) in the second round were below average. A reader needs both to understand the Knicks’ path.


5. Opponent-Adjusted Dominance (run_adjusted_dominance)

The data. 2025–26 playoff logs, regular-season SRS, and the champions table.

The approach. A two-step analysis: adjusted margin (opponent quality) plus overperformance (playoff elevation relative to own regular-season baseline).

Adjusted margin:

adj_margin = raw_margin − avg_opp_srs

where avg_opp_srs is games-weighted (see §4). This is a direct additive correction asking: “how dominant would this team look if they had faced average-SRS opponents?” The assumption (one SRS point of opponent quality = one margin point) is natural because the SRS system is defined in point-differential space.

Overperformance (playoff elevation):

overperformance = mean(actual_margin_per_game − expected_margin_per_game)
                = raw_margin − champion_SRS + games_weighted_opp_srs

where expected_margin_per_game = champion_SRS − opp_SRS_for_that_game. This measures how much better a champion performed than a team of their regular-season quality was expected to perform against those opponents. Positive = elevated in playoffs; negative = underperformed.

Both values are ranked via _pct_rank against the champions table.

Why this specific adjustment. The SRS system is built around the identity that a team with SRS +X is expected to outscore a 0-SRS opponent by X points per game. Subtracting the games-weighted average opponent SRS “returns” the champion to a neutral-schedule baseline. The overperformance metric additionally subtracts the champion’s own regular-season SRS, capturing “playoff elevation”: the amount by which the champion exceeded what their regular-season quality predicted.

Limitations. The adjustment assumes opponents’ regular-season SRS accurately reflects playoff-mode strength; it doesn’t account for injuries, resting veterans, or playoff-specific preparation. A more elaborate model could regress playoff margin on opponent SRS across all champions, but with 43 data points and one adjustment variable, the direct subtraction and its ranking are the right level of complexity.

What the results mean. Adjusted margin +11.2 is the 100th percentile of 43 champions, the highest ever even after correcting for schedule difficulty. The comparison with 2016–17 Golden State (+10.2) and 1986–87 Los Angeles Lakers (+9.5) provides the natural peer group for “all-time dominant playoff runs.” The overperformance metric (+12.5 pts/game, 97.7th percentile) is notably different from adjusted margin: the 2016–17 Warriors, who had a much higher regular-season SRS (~+11), rank lower on overperformance because they expected to dominate. The Knicks elevated more relative to their regular-season baseline. The 2000–01 Lakers rank 1st (+14.5) on overperformance: they had a strong but not historically dominant regular season and then dominated the playoffs.

Why this is the headline chart. The adjusted margin ranking is the single number that answers the raw dominance question most directly (how solid the resulting #1 is belongs to §13–§14). Win rate alone doesn’t account for the quality of opponents; raw margin doesn’t either. Adjusted margin does both. The bar chart annotates the Knicks’ position explicitly with the value (+11.2) and the legend says “#1 of 43.” It is the chart that tells the whole story in one panel.


6. Round-by-Round: Raw vs. Opponent-Adjusted (run_round_split)

The data. 2025–26 playoff logs, 2025–26 regular-season SRS, each opponent’s playoff SRS computed from games that exclude the Knicks series (compute_opponent_playoff_srs_excl), and the champions table (column adj_playoff_margin).

Why this section exists (what §5 could not do). §4 and §5 adjust for opponent quality using regular-season SRS, fixed before the playoffs began. That leaves one objection unanswered: maybe the East opponents were weaker in the playoffs than their regular season implied, so the Knicks beat up on teams already collapsing. This section recomputes each opponent’s strength from their own postseason form and re-runs the adjustment, both per round and for the full run.

The two opponent measures. For each series the section reports two adjusted margins:

reg-adj = raw margin − opponent regular-season SRS
po-adj  = raw margin − opponent playoff SRS (games excluding the Knicks series)

The playoff SRS is deliberately computed from each opponent’s games against other teams. Using their games against the Knicks would be circular (an opponent looks weak partly because the Knicks beat them). A team whose only playoff games were against the Knicks (the Hawks, a first-round loser) has no independent playoff data, so their playoff SRS is NaN and their po-adj margin is undefined.

Why playoff SRS is the harder test. When po-adj > reg-adj for an opponent, that opponent played below their regular-season level against the rest of the field, so the Knicks’ raw margin against them flatters the Knicks. When the gap persists after switching to playoff SRS, the dominance is not an artifact of opponents fading. The exception is the Spurs: their playoff SRS (+14.48) was far above their regular-season +8.28 because they tore through the West bracket, so the Knicks’ Finals margin looks worse after this adjustment, not better. That is the honest direction: the Knicks’ best opponent got better in May, and the Finals were genuinely close.

The full-run ranking. adj_playoff_margin in the champions table is raw margin − games-weighted opponent playoff SRS, the playoff-SRS analogue of the §5 adjusted margin, computed for every champion. The Knicks’ value (+9.05) is ranked via _pct_rank against all 43. Even on this stricter opponent measure (which credits their opponents’ postseason form), the Knicks rank 100th percentile, edging the 1986–87 Lakers (+8.99).

The playoff-field elevation table. As context, the section also lists every 2025–26 playoff team’s regular-season SRS, full playoff SRS (all of that team’s playoff games, including any against the Knicks), and the elevation between them (compute_playoff_field_elevation). This is descriptive, not a ranked test: it shows the Knicks (+11.48) and Spurs (+6.85) were the field’s two big risers while most teams declined, which is the backdrop for why the bracket played out as it did.

What the results mean. The pre-Finals series were lopsided on every measure (raw +19.7, reg-adj +17.7, po-adj +20.3, each averaged per series across R1–CF; games-weighted, the raw figure is +19.4), and the Finals were tight on every measure (raw +2.4, reg-adj −5.9, po-adj −12.1). Switching from regular-season to playoff opponent strength does not erase the dominance: it sharpens the story reported in this section’s block of knicks_2026_historic_results.md: the headline margin was built before the Finals against opponents who were not collapsing, and the Finals were a real contest against a Spurs team peaking.

Why these charts. Two figures carry this section. The grouped per-round bar (plot_round_split) places raw, reg-adj, and po-adj side by side for each series, so the reader sees both the pre-Finals/Finals split and how little the two opponent adjustments move the pre-Finals bars. The playoff-field elevation bar (plot_playoff_field_elevation) ranks all 16 playoff teams by reg→playoff SRS change with the Knicks and Spurs highlighted, giving the “who actually rose” context the round bars can’t.


7. Other Deflators (run_deflators)

The data. 2025–26 Knicks playoff game logs and the champions table.

The approach. Three “deflator” checks that could reduce the historicity claim, each ranked against champions:

Clutch rate. compute_clutch_rate(po_2026, KNICKS_TEAM_ID) takes the mean of (|PLUS_MINUS| ≤ 5) across the Knicks’ 19 games. This is the fraction of games decided by 5 points or fewer. A low clutch rate (lots of blowouts) inflates the raw margin number; a high rate means the dominance was built on close wins. _pct_rank with ascending=True is used here: a team that wins many close games (“clutch” in the common sense) scores higher than one that blows teams out.

Home/away split. compute_home_away_split uses the MATCHUP string to split home games ("vs." in matchup) from road games ("@" in matchup). Win rates are computed separately. These are ranked against champions["home_wr"] and champions["away_wr"] via _pct_rank. The away win rate is the more meaningful deflator check: a champion who only wins at home is more fragile than one who dominates on the road.

Round-by-round breakdown. Rather than a statistical test, this is a descriptive accounting: for each unique opponent (grouped from the playoff log by OPP_ID, which is derived by finding the non-Knicks TEAM_ID in each GAME_ID), the series wins, losses, and mean PLUS_MINUS are printed in chronological order. This shows where the margins came from: the sweeps inflated the headline number while the Finals were contested.

What the results mean. Clutch rate 31.6% is the 84th percentile; the Knicks played more close games than most champions, not fewer. The blowout narrative (the margins were “just garbage time”) is unsupported: they also won tight games at an above-average rate. Away win rate 90.0% is the 98th percentile; only one other champion in 43 years won road games at a higher clip. Home win rate 77.8% is the 23rd percentile, so the Knicks were an unusual champion: dominant on the road, relatively ordinary at home.

Why this chart (game margins). The 19-game bar chart (one bar per game in chronological order, blue for wins, red for losses, with the average overlaid) shows both the blowouts (tall blue bars in rounds 2 and 3) and the close games (annotated small-margin games near the zero line). A histogram of margins would show the distribution but would hide the chronological narrative (that the margins were tightest in the Finals). The bar-per-game form preserves the “film” of the run.


8. Playoff SRS and Elevation (run_playoff_srs)

The data. 2025–26 playoff and regular-season game logs; the champions table (which now includes champion_po_srs and playoff_elevation).

The approach. compute_playoff_srs applies compute_srs to the playoff game log only. The SRS algorithm (see Recurring Methods) solves the same (I − A) @ srs = mean_margin_vector system from the playoff bracket graph. Because the bracket is sparser than the regular season (not every team plays every other team), the solution is a least-squares approximation (more equations than unknowns, so no exact solution exists; the ratings minimize total squared error instead); the same numpy.linalg.lstsq call handles this naturally.

Elevation = playoff_SRS − regular_season_SRS. A positive value means the champion performed at a higher level in the playoffs than their 82-game baseline predicted. Both playoff and regular-season SRS are expressed in points per game in the same season’s scoring environment, so the difference is directly interpretable.

playoff_elevation is added as a column in build_champions_table for each of the 43 champion seasons.

What the results mean. - Knicks regular-season SRS: +6.05, a strong team, but not historically dominant. - Knicks playoff SRS: +17.53, among the highest playoff SRS values ever. - Elevation: +11.48, 97.7th percentile (2nd all-time, behind 2000–01 Lakers +12.58). - The 2016–17 Warriors, one of the most dominant regular-season teams (+11.35 SRS), had a lower elevation (+8.83) because their regular-season baseline was so high. - The mean elevation across 43 champions is +4.43, confirming that playoff performance typically outpaces regular-season baselines, plausibly from some mix of home-court advantage, higher effort, and bracket-specific preparation, though this section does not isolate which.

Why this metric. Playoff SRS elevation directly answers whether a team “showed up” in the playoffs or merely coasted on regular-season talent. It complements the overperformance metric (§5) and is independently derived; if both metrics agree, the conclusion is robust. They do agree: the Knicks are 2nd all-time on both, and the 2000–01 Lakers rank 1st on both.


8b. What’s Behind the Jump: Roster Continuity (run_core_continuity)

The data. Player-level minutes from the 2025–26 regular-season and playoff game logs (player_rs_logs, player_po_logs), joined to the team-level game logs for point margins. compute_core_continuity (in knicks_2026_data.py) builds the continuity dict this section prints.

Why this section exists. §8 found the Knicks elevated more from their regular-season baseline than all but one champion ever. That raises the obvious next question: is the elevation just health, i.e. the playoff roster was healthier than the regular-season one, or is something else going on? This section is descriptive accounting, not a ranked percentile test: there is no historical continuity series to rank against.

The approach. Two steps:

  1. Define the core. A player is “core” if he averaged at least 20 minutes per game across the Knicks’ playoff games (MIN_FLOAT >= min_threshold, computed only over games he actually played). This yields a fixed list of 5 players (Karl-Anthony Towns, OG Anunoby, Josh Hart, Mikal Bridges, Jalen Brunson).
  2. Split margins by core availability. For every regular-season and playoff game, count how many of the core players logged minutes (avail, 0 to 5). Regular-season point margin is then compared across three slices: games with the full core (avail == core_n), games missing at least one core player, and the full-season average; the same full-core share is computed for the playoffs.

Why regular season vs. playoffs, not playoffs alone. The playoff sample (19 games) has too little variation in availability to split on its own; the core was intact for 89% of it. The regular season supplies the counterfactual: what did this team’s margin look like healthy versus short-handed, over a much larger sample, so the playoff margin can be judged against a healthy-team baseline rather than the average (injury-diluted) one.

What the results mean. The core five were together for only 56% of the regular season but 89% of the playoffs. With the full core healthy, regular-season margin was +8.09; missing at least one core player it fell to +4.08 (full-season blend: +6.33). Both guards hold: the full-core margin exceeds the short-handed margin, and the playoff margin (+14.89) exceeds even the full-core regular-season margin. So continuity explains part of the reg-to-playoff jump (the team was simply healthy more often when it mattered) but not all of it; the gap between the full-core regular-season margin and the playoff margin is left unexplained by health alone, and pinning down what fills that gap would need play-by-play or shot-quality data this project does not carry.

Why this chart (margin by core availability). The bar chart (plot_core_continuity) shows regular-season margin at each availability level (0 through 5 of the core dressed) as a step, with the playoff margin drawn as a reference line above all of them. That single visual carries the section’s finding: margin rises with availability, but even the top step falls short of the playoff line.


9. Era Adjustment by Scoring Share (run_pace_era)

The data. The champions table (which now includes league_scoring: the average pts per team per game in each season’s regular season) and the 2025–26 regular-season game logs.

The approach. Two-step normalization applied to both raw margin and opponent-adjusted margin:

pace_adj_margin     = raw_margin  × (ref_scoring / season_scoring)
pace_adj_adj_margin = adj_margin  × (ref_scoring / season_scoring)

where ref_scoring is the historical mean of league_scoring across all 43 seasons and season_scoring is that season’s average. A season with higher scoring than the historical mean (like 2025–26) gets a discount; a low-scoring era gets a boost. The scale factor is applied to both raw and adjusted margins. This is a scoring-share adjustment, not a true pace adjustment: dividing by points per game lumps together pace (possessions per game) and efficiency (points per possession), so a high-efficiency, normal-pace season like 2025–26 is over-penalized. §17 isolates pace by dividing by estimated possessions instead, and is the more accurate era control; §9 is kept as the deliberately conservative bound.

Why this normalization. Point margins are not dimensionless: a +10 margin in a 115-pt era is fewer standard deviations above zero than a +10 in a 92-pt era. Dividing by the scoring average (or equivalently multiplying by the ratio to the reference) converts margins to “units of average team output,” making comparisons across 43 seasons more apples-to-apples. Note that the opponent-adjusted margin (adj_margin) already partially controls for era because both the champion’s raw margin and opponents’ SRS are expressed in the same season’s point-differential units. But the inflation is not fully cancelled: adj_margin = raw − opp_SRS, and if both raw and opp_SRS are inflated proportionally, adj_margin is inflated too.

What the results mean. - 2025–26 is the highest-scoring era since 1984 (115.6 pts/team/game; historical mean 103.5). Scale factor: 0.896 (a ~10% discount). - Scoring-adjusted raw margin: +13.3 pts/game (95th pct, 3rd all-time); the raw “best ever” claim doesn’t survive era adjustment. The 2000–01 Lakers (+13.9) and 2016–17 Warriors (+13.4) both rank above on this metric. - Scoring+opp-adjusted margin: +10.1 pts/game (100th pct), still first, but by a razor’s edge over the 2016–17 Warriors (+10.0). These two runs are statistically indistinguishable on the most complete metric.


10. The Verdict (run_verdict)

The data. All of the above; this section re-computes the key metrics from scratch to produce a single summary table and a text verdict.

The approach. All metrics (win rate, margin, opp SRS, adjusted margin, scoring-adjusted margin, opp+scoring-adjusted margin, overperformance, SRS gap) are pulled, their percentile ranks computed, and a branching verdict string is assembled using thresholds:

if wr_pct >= 85:   dom = "elite"
elif wr_pct >= 70: dom = "strong"
else:              dom = "moderate"

if adj_pct >= 70:  adj_verdict = "holds up well after adjusting for schedule"
elif adj_pct >= 50: adj_verdict = "is somewhat deflated by opponent adjustment"
else:              adj_verdict = "is significantly deflated by a weak schedule"

The east_context clause fires only if gap_pct >= 80, meaning the East was genuinely historically weak (top-quintile West dominance). Since 2025–26 is at the 37th percentile (West dominance was below average), no caveat fires.

What the results mean. Win rate 88th percentile → “elite.” Adjusted margin 100th percentile → “holds up well.” East weakness at 37th percentile → no caveat. The verdict is: the run was elite, and the schedule was at the historical median, so the dominance is real.

Why no new chart. The verdict section’s job is to synthesize the previous sections, not introduce new data. The metrics already have their charts in Sections 1–9; a summary radar or scorecard would duplicate them. The paragraph verdict is the right form for a synthesis.


11. Opponent Player Availability (run_opponent_health)

The data. Player-level 2025–26 playoff game logs (player_po_logs, minutes per player per game), the Knicks’ playoff logs, and the 2025–26 standings for team names. compute_opponent_health joins them.

Why this section exists. The largest non-statistical deflator for any title run is opponent injuries: a dominant margin is discounted if the teams beaten were missing their stars. This section checks each Knicks opponent’s key-player availability so the dominance claim can be read against who was actually on the floor.

The approach. For each opponent the metric is built in two steps:

  1. Define the core. A “core” player is one averaging at least 15 minutes per game across all of that team’s 2025–26 playoff appearances. Anchoring the threshold to the full playoff run (not just the Knicks series) means a star who was injured for the entire series is still counted as core if he played enough elsewhere, so the metric captures his absence rather than silently dropping him.
  2. Score availability. health_score = the average number of core players who actually appeared per Knicks-series game, divided by the size of the core. 1.0 means every key player suited up every game; lower values flag a depleted opponent.

This is descriptive accounting, not a ranked percentile test: there is no historical health series to rank against, so the section reports the four opponents’ scores, the average, and the most- and least-depleted opponent, then flags the Finals specifically.

What the results mean. Average opponent availability was 98%. The most depleted opponent (76ers, 96%) was a second-round sweep, so the missing player did not prop up the margin. The Spurs, the one Finals-quality opponent, were at 100%: the close Finals (+2.4 margin) was against a team with its full rotation on the floor, so the result is not explained by opponents missing games to injury.

Limitations. health_score only measures whether a core player appeared in the box score; it has no way to detect a player who suited up while playing through an injury. DeAaron Fox played every Finals game for the Spurs while carrying a known injury, and this metric scores that game identical to one where he was fully healthy. “No games missed” and “no injuries” are different claims, and this section can only support the first one.

Why this chart. The per-opponent health bar (plot_opponent_health) shows all four series on one axis, colored by a fixed health threshold (green ≥ 90%, orange 75–90%, red below), so a skimming reader sees at a glance that every bar is green. The chart’s job is to make the absence of an injury story visible.


12. Betting-Market Significance (run_betting_market)

The data. Game-level ATS (against the spread) data from the ESPN core API, merged with actual margins from the playoff game log.

The approach. The 14-5 ATS record is tested against a null hypothesis, the baseline the test tries to reject, of 50% coverage (the efficient market expectation: if spreads are fair, any team covers ~50% of games). A one-tailed binomial test (testing only whether the Knicks covered more than a fair market would predict, not a deviation in either direction) computes P(X ≥ 14 | n=19, p=0.5):

from scipy.stats import binom
p_value = binom.sf(13, 19, 0.5)   # P(X >= 14) = 1 - CDF(13)

The z-score is computed as (k − np) / sqrt(np(1−p)) = (14 − 9.5) / sqrt(4.75).

Why a one-tailed test. We are testing whether the Knicks covered more than expected, not whether they differed from 50% in either direction. The question (“was this ATS performance unusual?”) is directional.

What the results mean (games treated as independent). Z = +2.06, p = 0.0318. This is the iid version, short for independent and identically distributed: each game is treated as a separate, equally likely coin flip. A team covering 14 of 19 games under a fair-coin null has only a 3.18% probability. The East rounds (11-3 ATS in rounds 1-3) carried most of the edge, though the Knicks also covered the Finals (3/5) as slight underdogs.

Adjusting for series correlation (clustered_cover_significance). The iid binomial assumes 19 independent Bernoulli (coin-flip) trials, but the games cluster into 4 series, and covers within a series may be correlated (same matchup, same direction of pricing error). We estimate the intraclass correlation (ICC, the share of cover-outcome variability that belongs to which series a game came from rather than to game-to-game noise) of the cover indicator via one-way ANOVA (analysis of variance, here splitting cover-outcome variation into between-series and within-series parts) across the four series and inflate the variance by the design effect deff = 1 + (m0 − 1)·ICC, where m0 is the effective average cluster size (≈ 4.7 here, slightly below the plain 19/4 average because the series lengths are unequal). That gives an effective sample size N / deff and a p-value computed on it:

  • ICC ≈ 0.00 (covers are essentially independent within series: the four rounds cover 4/6, 3/4, 4/4, and 3/5, none pinned at 0% or 100%)
  • design effect ≈ 1.00, so effective N ≈ 19.0 (the clustering costs essentially nothing here)
  • adjusted z ≈ +2.06, one-tailed p ≈ 0.019
  • 95% Wilson interval for the true cover rate, computed on the effective N: 51% to 88% (the Wilson score interval is the standard binomial CI that stays inside [0, 1] and behaves at small samples; on ~19.0 effective games it is still fairly wide, spanning a near coin flip to strong)

Still beyond chance, and essentially unchanged from the iid 0.0318, because the within-series clustering turned out negligible. With only four clusters the ICC is itself imprecise, so treat 0.019 as “suggestive,” not a sharp figure.

ATS is not independent evidence. The ATS margin is the actual margin plus a spread that averaged about −2 (near zero), so the cover record is largely the raw dominance result re-expressed, not a separate confirmation of it.

An important caveat. Both p-values apply to one team in one playoff run, chosen because it was interesting (the champion). An unbiased “how often do champions cover this much?” question would need historical ATS data for all 43 champions. Read these as “the ATS outperformance against East opponents was systematic, not luck,” not as an unbiased claim across all possible runs.


13. Robustness of the #1 Ranking (run_robustness)

The data. The Knicks’ 19 per-game opponent-adjusted contributions g_i = margin_i − opp_reg_SRS_i (mean = the +11.23 adjusted margin from §5), the other 42 champions’ adj_margin values, and the 2025–26 regular-season margin standard errors (the game-to-game spread of the margin, defined in (c) below).

Why this section exists. Sections 1–10 report point estimates and percentile ranks. A 19-game run is a small sample, and the headline “1st of 43 on adjusted margin” is a point estimate with no stated uncertainty. This section quantifies how fragile that #1 is, three ways.

(a) Game-level bootstrap of the rank (bootstrap_adjusted_margin_rank). Resample the 19 values g_i with replacement 20,000 times; each resample mean is a draw from the sampling distribution of the adjusted margin. Rank each draw against the fixed other-champion adj_margin set (the subject’s own season is excluded so the rank is not self-referential). Results:

  • P(rank 1) ≈ 60%, P(top 3) ≈ 70%, P(top 5) ≈ 82%
  • median rank 1, 90% rank interval 1–11
  • 90% interval on the adjusted margin itself: roughly [+5, +18]

This is an iid game bootstrap; games within a series are correlated, so the true spread is modestly wider. Interpretation: most-likely #1, near-certain top five, but the exact #1 is roughly a 60/40 call.

(b) Empirical-Bayes shrinkage (shrink_adjusted_margin). An extreme value chosen because it is extreme is biased upward (selection / regression to the mean). Empirical Bayes means the prior is built from the data itself, here the other 42 champions’ distribution, then treated as fixed for the update. A normal–normal conjugate update regularizes it (pulls the noisy 19-game estimate part-way toward the prior; conjugate means prior and posterior are both normal, so the posterior has a closed form): the prior is the other champions’ adjusted-margin distribution N(prior_mean ≈ +3.2, prior_var = observed between-champion variance); the likelihood is the 19-game sample mean with sampling variance s²/n. The posterior mean is the precision-weighted average (precision = 1/variance, so a noisier estimate counts for less).

  • weight on the 19-game data ≈ 41% (playoff margins are noisy, so 19 games carry less than half the estimate)
  • posterior (shrunken) adjusted margin ≈ +6.5 pts/game, 95% credible interval ≈ [+1.5, +11.5] (a credible interval is the Bayesian counterpart to the §3 confidence interval: the range with a 95% chance of holding the true value, given the model)
  • even shrunken it still exceeds ~83% of champions

This is deliberately conservative in two ways: only the subject is shrunk (the other champions keep their own noisy point estimates), and prior_var is the observed between-champion variance, which still contains each champion’s own sampling noise and so shrinks a little less than a noise-free prior would.

(c) Opponent-strength uncertainty (compute_srs_se, bootstrap_adjusted_margin_rank_srs_error). Opponent SRS is itself estimated from ~82 games. We approximate each team’s SE(SRS) by the sampling error of its mean margin, sd(margin)/√n_games (the schedule term is comparatively stable, so this captures the dominant source while slightly understating total uncertainty). The bootstrap is re-run with an added Normal(0, SE) shock to each opponent’s SRS per iteration (one shock per opponent, shared across that opponent’s games). P(rank 1) moves from ~59.6% to ~59.4% and the margin interval barely widens: the ranking’s uncertainty is overwhelmingly the 19-game sample size, not doubt about opponent strength.

Why this chart (bootstrap histogram). The histogram of the 20,000 resampled adjusted margins, with the two nearest rivals (2016–17 Warriors, 1986–87 Lakers) drawn as reference lines, makes the rank fragility visual: the share of the distribution lying left of the Warriors line is 1 − P(rank 1). The title states P(rank 1) directly so a skimming reader gets the headline.


14. Hierarchical Partial-Pooling Rank (run_hierarchical)

The data. build_adjusted_margin_samples returns, for every champion, the per-game opponent-adjusted margins summarized as (adj_mean, n_games, samp_var) with samp_var = var(g)/n. This is the same g_i = margin_i − opp_reg_SRS_i used in §13, now computed for all 43 champions, not just the Knicks.

Why this section exists (what §13 could not do). The §13 bootstrap and shrinkage both held the other 42 champions at their point estimates. That is unfair in two opposite ways: it never lets a rival’s true value exceed its noisy estimate, and (in the shrinkage) it pulls only the subject toward the mean. To ask the actual question (“what is the probability the Knicks have the highest true adjusted margin?”), every champion must be shrunk and must carry posterior uncertainty simultaneously: this is “partial pooling,” shrinking each champion toward the group average rather than leaving every one alone (no pooling) or collapsing them into a single shared number (complete pooling).

The model (Gaussian random-effects / hierarchical).

y_c | theta_c ~ Normal(theta_c, v_c)     # observed champion mean, known sampling var
theta_c       ~ Normal(mu, tau^2)        # population of true dominance
  • tau^2 (between-champion variance) is estimated by DerSimonian–Laird, the method-of-moments estimator (it matches the formula to the data’s observed spread rather than maximizing a likelihood) from random-effects meta-analysis (the standard toolkit for combining noisy estimates from many separate samples): tau^2 = max(0, (Q − (k−1)) / c) where Q = Σ w_c (y_c − ȳ)², w_c = 1/v_c, and c = Σw_c − Σw_c²/Σw_c. Crucially, DL subtracts the sampling noise from the observed spread, so tau (≈ 2.0) is smaller than the raw SD of the champions’ adj_mean. This is why shrinkage here is stronger than the §13 shrinkage, which used the noise-inflated observed variance as its prior.
  • mu (≈ +3.1) is the inverse-variance weighted mean using weights 1/(v_c+tau^2).
  • Each champion’s posterior is Normal(post_mean_c, post_var_c) with post_var_c = 1/(1/v_c + 1/tau^2) and post_mean_c = post_var_c·(y_c/v_c + mu/tau^2).

We then draw all theta_c jointly 40,000 times and record the subject’s rank each draw. Hyperparameters are treated as fixed (empirical Bayes), which ignores hyperparameter uncertainty (modest with 43 seasons).

What the results mean (the headline finding). The Knicks’ raw adjusted margin (+11.2, 1st) shrinks to a posterior mean of about +4.7, which ranks roughly 4th by posterior mean, and because the credible intervals overlap heavily, P(Knicks are the true #1) ≈ 9%, P(top 3) ≈ 23%, P(top 5) ≈ 34%, with a median posterior rank near 9. Two mechanisms drive the gap from §13’s ~60%:

  1. Stronger, fairer shrinkage. The Knicks’ per-game adjusted margins are highly variable (blowout sweeps next to a +2.4 Finals), so v_c is large and the posterior pulls hard toward mu. A volatile run is weaker evidence of a high true mean than a steady one.
  2. Rivals are now uncertain too. The 1990–91 Bulls, 2022–23 Nuggets, and 2016–17 Warriors have posterior means at or above the Knicks’ and can win any given draw.

This is the most complete answer to “best ever?”: most likely a top-handful run, but only ~9% to be the single best once the comparison is made fair.

Why this chart (posterior caterpillar). Posterior mean ± 90% credible interval for the top dozen champions, with each raw (pre-shrink) point estimate marked as a tick. It shows two things at once: how far each champion is pulled in from its raw number, and how completely the intervals overlap, the visual reason no champion is a clear #1.

Caveat: reconciling §13 and §14. These are not contradictory; they answer different questions. §13 asks “given the rest of history as fixed truth, where does the Knicks’ resampled run land?” (~60% #1). §14 asks “accounting for every champion’s uncertainty, are the Knicks the best?” (~9%). The §14 framing is the honest answer to the all-time-best question; the §13 framing is the right one for “how repeatable was this run.”


15. Elo Opponent-Rating Cross-Check (run_elo_check)

The data. Each season’s regular-season game logs. compute_elo_ratings produces an end-of-season rating per team; build_alt_rating_adjusted_table recomputes adj = raw_margin − games_weighted_opponent_rating for every champion with Elo in place of SRS.

Why a second rating system. Every opponent adjustment in §4–§14 uses SRS, so the rankings could in principle be an artifact of SRS’s assumptions (linear, margin-based, season-aggregate). Re-running with a structurally different rating tests that. Elo is the natural choice: sequential and recency-weighted rather than season-aggregate.

The Elo model. FiveThirtyEight’s NBA parameters: start every team at 1500, process games in date order, and after each game shift both teams’ ratings by K = 20 (the step size) times the gap between the actual result and what the pre-game ratings predicted, with a 100-Elo home-court bump and the margin-of-victory multiplier ln(|margin|+1) · 2.2/(0.001·Δelo_winner + 2.2) (the Δelo term damps blowouts by favorites). The final Elo is centered at the league mean and divided by ≈28 Elo-per-point to land on the same points-above-average scale as SRS, so it slots into the identical games-weighted opponent machinery.

What the results mean (an instructive disagreement). Across all 43 champions the Elo-adjusted and SRS-adjusted margins are almost the same ordering (correlation ≈ +0.96), so the two systems broadly agree. But they differ on the Knicks specifically: Elo rates the Knicks’ opponents tougher (games-weighted +5.5 vs SRS’s +3.7), because Elo weights recent form and New York’s opponents (notably the Spurs: Elo +10.7 vs SRS +8.3) were playing well late. A larger opponent adjustment lowers the Knicks’ Elo-adjusted margin to +9.4, ranking 3rd (behind 2016–17 Golden State and 1990–91 Chicago) rather than 1st. The takeaway points the same way as §14, by a different route: §14 unseats the #1 through small-sample uncertainty, while here it is the choice of rating that does it, but both land on the same place, that the #1 is not secure and under a defensible alternative the Knicks are a top-three, not unique-#1, run.

Why no new chart. The result is a single rank shift (1st → 3rd) plus a high correlation; the §4 adjusted-margin bar already visualizes the SRS ranking, and a second near-identical bar would add length without insight. The opponent SRS-vs-Elo table in the appendix carries the one number that matters (the Knicks’ schedule looks harder under Elo).


16. Wins-Only Bradley–Terry Cross-Check (run_bt_check)

The data. Same build_alt_rating_adjusted_table machinery as §15, with compute_bradley_terry_ratings supplying the opponent rating.

Why a wins-only rating. SRS and Elo are both built from point margins, so neither rules out the worry that the Knicks’ margin is padded (blowouts, garbage time). Bradley–Terry is fit from win/loss only, sharing no information with the margin, so it isolates that concern: if the Knicks still rank first when margins are stripped from the opponent side, the dominance is not a margin artifact.

The model. P(i beats j) = pi_i/(pi_i+pi_j), fit by Hunter’s (2004) minorization–maximization (MM) iteration pi_i ← (W_i+reg) / (Σ_j n_ij/(pi_i+pi_j) + 2·reg/(pi_i+1)). MM is an iterative recipe that is guaranteed to improve the fit (raise the likelihood) at every step until it converges. The reg = 1 term is one phantom win and loss against a league-average anchor, which keeps undefeated/winless teams finite; pi is renormalized to mean 1 each step. The fitted log-strength log(pi) is centered and multiplied by ≈6.2 points per natural-log-odds (one log-odds unit multiplies a team’s win odds by e ≈ 2.7), the conversion implied by the Elo convention (400 Elo per base-10 odds ÷ 28 Elo per point), not fit to any margins. Only the units borrow that constant; the ordering is 100% wins-based.

A note on units. Subtracting a log-odds rating from a point margin would be dimensionally meaningless, which is why the 6.2 scaling is applied. The scaling is a fixed convention rather than a per-season fit, so it does not smuggle margin information back in; it only puts the wins-based ordering on a points axis so the same adj = raw − opp_rating subtraction is interpretable.

What the results mean. Bradley–Terry rates the Knicks’ schedule at +3.5 (essentially identical to SRS’s +3.7) and leaves their adjusted margin at +11.4, 1st of 43 (correlation with the SRS-adjusted margin across champions ≈ +0.99). So the wins-only check agrees with SRS, not with Elo. The decisive factor in the §15 disagreement was therefore recency weighting (Elo crediting opponents’ late form), not margin-vs-wins: on full-season opponent quality, by either margins (SRS) or wins (Bradley–Terry), the Knicks are #1; only Elo’s recency weighting moves them to 3rd. This also cleanly rebuts the “padded by blowouts” objection.


17. Possessions-Based Pace Adjustment (run_pace_possessions)

The data. build_possession_table estimates regular-season possessions per team per game for each season from the box score: poss = FGA − OREB + TOV + 0.44·FTA (the standard estimator), averaged over all team-games. These columns are present in the cache for all 43 seasons.

Why this supersedes §9’s scoring-share adjustment. §9 scales margins by points per game. That conflates two different things: pace (how many possessions a game has) and efficiency (points scored per possession). The 3-point era raises points per possession without raising possessions, so scaling by total scoring over-penalizes a high-efficiency, normal-pace season like 2025–26. Dividing by estimated possessions isolates pace, which is what an era adjustment should neutralize.

The computation. For each champion, margin_per100 = margin · 100 / poss and likewise for the opponent-adjusted margin. This is the pace-neutral (per-100- possessions, i.e. net-rating-style) form of the margin, then ranked across the 43 champions as usual.

What the results mean (the §9 number was too harsh). 2025–26 is estimated at 101.8 possessions/game, only ≈3.8 above the 98.0 historical mean: a ~4% pace premium, versus the ~12% scoring premium §9 used. Per 100 possessions the Knicks’ raw margin (+14.6) and opponent-adjusted margin (+11.0) both rank 1st, where the §9 scoring-share adjustment had dropped the raw margin to 3rd. The honest read is that most of 2025–26’s scoring surplus is efficiency (threes), not pace, so on a true pace-neutral basis the #1 raw-and-adjusted margin survives. §9 is retained as the deliberately conservative bound; §17 is the more accurate one.

Why no new chart. The finding is a rank correction (3rd → 1st) driven by one contrast (4% pace premium vs 12% scoring premium); it is carried fully by those two numbers in the appendix, and the existing adjusted-margin bar already shows the ranking.


18. Series-Level Win-Probability Model (run_series_winprob)

The data. The Knicks’ regular-season SRS, each opponent’s regular-season SRS (in round order), and which team hosted each series opener (for home court), all read from the cached logs.

Why a forward model. §4–§9 are retrospective: they score what happened. This asks the complementary forward question (given only the Knicks’ regular season, how likely was this outcome?), so the gap between forecast and reality is a clean measure of playoff overperformance in win-loss terms, parallel to the margin-based overperformance in §5.

The model. A single game’s win probability is p = Φ((SRS_NYK − SRS_opp ± hca)/σ), where Φ is the standard normal CDF (the probability a standard normal value falls below the argument), with σ = 12 (the single-game point-margin SD), hca = 3 (home points), +hca at home and −hca away. Each round is a best-of-7 with the 2-2-1-1-1 home pattern; the simulator plays 40,000 full brackets and records the title rate, per-series win rates, and the loss distribution. Because all four rounds are best-of-7, every title run is exactly 16 wins, so a run’s quality reduces to its loss count (16-3 ⇒ 3 losses).

What the results mean. From their own regular season the Knicks were a Finals underdog (P(beat Spurs) ≈ 31%, since the Spurs out-rated them) and only ≈15% to win the title. The model expects ≈6.5 losses in a title run; the Knicks lost 3. A title as clean as 16-3 occurs in ≈7% of the model’s championship runs, and ≈1% of all simulated seasons. So the run sat far out on the favorable tail of what their regular season predicted: the same elevation §5 and §9 found, here in win-loss units.

Assumptions and robustness. σ and hca are standard NBA values; the pipeline runs only the σ = 12, hca = 3 base case, but as an analyst judgment, varying them within reason (σ ∈ [11,13], hca ∈ [2.5,3.5]) should move the percentages by a few points without changing the conclusion (large overperformance, Finals underdog). The model deliberately uses regular-season SRS and is blind to the Knicks’ playoff elevation; that blindness is the point, since the elevation is exactly what we are trying to size.

Why no new chart. The story is three or four scalar probabilities and a small per-round table, already in the appendix; a chart would not add resolution.


19. Full-Field Title Odds (run_full_field_odds)

The data. All 16 playoff teams’ regular-season SRS, plus each team’s conference and playoff seed (from LeagueStandingsV3’s PlayoffRank), read from the cached logs.

Why generalize §18. §18 follows only the Knicks’ realized path, so it scores a single team. Seeding every team into the bracket and playing it forward yields a title probability for all 16, which answers “who was actually favored?” rather than “how did this one run rate?”

The model. The same per-game probability as §18, p = Φ((SRS_a − SRS_b ± hca)/σ) with σ = 12 and hca = 3 on the 2-2-1-1-1 best-of-7 home pattern. The fixed NBA bracket (1v8, 4v5, 3v6, 2v7 per conference, no reseeding) is resolved by Monte Carlo: 50,000 simulated postseasons, each carrying its own per-simulation winners forward so a team’s later-round opponent varies across draws. The better seed hosts in-conference; the better regular-season SRS hosts the Finals, since seeds are not comparable across conferences. A team’s title probability is the share of simulations it wins; the 16 shares sum to 1 by construction.

What the results mean. Oklahoma City, the league’s best SRS by a wide margin, is the runaway favorite at 54.5%, more than triple any rival. The Knicks, only the East 3-seed, are 3.5%, far below the ≈15% the realized-path model gave them in §18. That is not a contradiction: §18 conditions on the opponents New York actually drew (the East’s top two seeds were upset before they would have met), while this sim makes them run the seed-expected gauntlet through Detroit and Boston. Neither model knows the Knicks would elevate; both call the title a long shot, and the full-field view a longer one.

Assumptions. The same σ/hca caveat as §18, plus the fixed-bracket, SRS-only forward assumption. Widening or narrowing σ bunches or separates the favorites but leaves the order (Oklahoma City first, the Knicks a distant longshot) intact.


20. Full Champion Ranking and Its Shape (run_appendix_ranking)

The data. The opponent-and-scoring-adjusted margin (the §5 schedule adjustment carried onto the §9 scoring-share scale) for all 43 champions, ranked.

Two things it reports. First, the complete ranked table behind the “1st of 43” headline, so every champion’s adjusted score is visible, not only the top five. Second, the shape of those scores, which is what licenses the order-statistic reading of the #1 claim (treating the top score as the expected largest of 43 draws from one bell curve, not a different kind of team).

The distribution. Mean +3.29 points/game, standard deviation 3.38, with 65% of champions inside one SD of the mean (close to the ≈68% a normal predicts). Skewness (asymmetry around the mean) is near zero and the excess kurtosis is negative, meaning tails thinner than a normal curve, the opposite of the heavy tail that defines a power law. A Shapiro-Wilk test (the standard test of whether a sample could plausibly come from a normal distribution) does not reject normality; the exact W and p are in the results companion, §20. So the champion-dominance scores are approximately Gaussian, not scale-free.

Why the shape matters. Under a normal with this mean and spread, the single largest of 43 draws is expected to land roughly 2 SD above the mean. The Knicks’ top score is +2.0 SD out, essentially that expected maximum. The best champion is therefore the leading edge of an ordinary spread, the top order statistic of a bell curve, not a different kind of team. This is the distributional restatement of the §13–§14 conclusion that #1 is real but not a settled outlier.


21. Capped-Margin (Robust) SRS Cross-Check (run_capped_srs_check)

The data. The same build_alt_rating_adjusted_table machinery as §15–§16, with compute_capped_srs supplying the opponent rating.

Why a third rating axis. §15 (Elo) varies recency; §16 (Bradley-Terry) varies margin-versus-wins. The remaining concern is leverage: ordinary SRS weights a 40-point win like a 4-point one, so a few garbage-time blowouts can move a team’s season rating and with it the schedule adjustment. Capping isolates exactly that.

The method. Clip every game’s point margin to ±15 before solving the identical SRS linear system. The schedule structure (who played whom) is untouched; only each result’s magnitude is bounded. The rating sits between SRS (full margin) and Bradley-Terry (no margin): margin still counts, but no single rout dominates. Output is the same TEAM_ID-indexed points-above-average series, so it drops straight into the unchanged adj = raw − games_weighted_opponent_rating.

What the results mean. Capping leaves the Knicks’ schedule at +2.96 and their adjusted margin at +11.93, 1st of 43 (correlation with the SRS-adjusted margin across champions ≈ +0.996). A blowout-robust opponent rating therefore agrees with SRS and Bradley-Terry, not with Elo: the schedule-strength estimate is not an artifact of a few lopsided opponent games. As in §16, the lone disagreement remains Elo’s recency weighting, not anything about margins or blowouts.


22. Spread-Standardized Dominance (run_spread_standardized)

The data. Each champion’s opponent-adjusted margin (§5) and the standard deviation of all teams’ SRS in that champion’s season (season_srs_sd, added in build_champions_table).

Why a dispersion adjustment. §9 and §17 correct the level of the scoring environment (total scoring, pace); neither touches its dispersion. But the spread of team strengths has nearly doubled: the SD of team SRS rose from 3.1 in 1983-84 to 5.9 in 2025-26. In a more top-heavy league a given margin is a smaller distance above the field, so a level adjustment alone leaves recent dominance overstated relative to older, bunched-up eras.

The computation. z = adj_margin / season_srs_sd: the opponent-adjusted margin expressed in standard deviations of that season’s team-strength distribution. This is a spread-standardized margin, not a true z-score: it scales by the season’s spread but is deliberately not centered on any mean (an average team sits at 0 by SRS’s own construction), so it reads as “how many typical team-to-team gaps clear of average.” The construction mixes a playoff-derived margin with a regular-season spread, so it answers “how many regular-season-team-strength units was this playoff dominance”, a defensible but not unique choice; the exact rank is mildly sensitive to it.

What the results mean. The Knicks’ +11.23 adjusted margin is the largest in raw points, but 2025-26 also has the widest spread in the dataset (5.9), so their z-score is +1.90 SD, ranking #5 of 43. The 16–17 Warriors lead at +2.48. Standardizing by dispersion is the only era adjustment that unseats the Knicks from #1; §9 (scoring), §17 (pace), and the wins-only and capped ratings do not. It points the same direction as Elo’s recency weighting (§15): both are relative measures that grade against the specific league faced, rather than absolute ones.


Comparing teams across eras

The hardest thing this report does is rank a 2025-26 team against a 1986-87 one, and there is no single correct way to do it. Two independent choices have to be made, and the report works through both.

Axis 1: how you rate the opponents. Every opponent adjustment is recomputed under four rating systems, each stressing a different assumption.

System Section Data it uses What it stresses Knicks rank
SRS §5 margins + schedule (linear) the baseline 1st
Elo §15 margins, sequential recency / late-season form 3rd
Bradley-Terry §16 win/loss only margin vs. wins (blowout padding) 1st
Capped-margin SRS §21 clipped margins + schedule single-game leverage 1st

Three of the four put the Knicks 1st; only Elo’s recency weighting moves them to 3rd, and §16 and §21 localize the cause to recency, not margins. One further method sits outside this axis entirely: the hierarchical model (§14) doesn’t change the opponent rating, it adds uncertainty on top of the SRS baseline, and that is what actually unseats a settled #1. Possessions (§17) belongs to Axis 2 below, not here; it varies the era scale, not the opponent rating.

Axis 2: how you put the eras on one scale. Margins are not comparable across eras untouched, because both the scoring level and the spread of team quality have changed. Three normalizations, applied to the opponent-adjusted margin:

Normalization Section What it neutralizes Knicks rank
None §5 nothing (raw points, schedule only) 1st
Scoring-share §9 total scoring (pace + efficiency) 1st
Per-100 possessions §17 pace only 1st
Spread-standardized (z) §22 dispersion of team strengths 5th

Scoring-share scales by points/game and over-corrects, discounting real efficiency gains as if they were inflation; per-100 divides by possessions and is the more accurate level adjustment, isolating pace. Neither addresses spread: only the z-score does, by dividing by the era’s SD of team strengths. The level adjustments leave the Knicks 1st; the dispersion adjustment drops them to 5th.

Putting it together. The two axes agree on the shape of the answer. By absolute measures, on any opponent rating and any level normalization, the 2025-26 Knicks are the most dominant champion in the dataset. The two adjustments that move them on a point-estimate basis, recency-weighted opponents (Elo, 3rd) and spread-standardization (z, 5th), are both relative: they grade against the specific, unusually deep league the Knicks faced. A third qualifier is different in kind rather than degree: the hierarchical model (§14) doesn’t change the rating or the era scale at all, it puts an honest uncertainty band on the #1 point estimate itself, which is why it, not a rating choice, is what actually unseats a settled #1. Which number is “right” depends on the question. “Biggest edge in points” is absolute and the answer is #1; “most exceptional relative to peers” is relative and the answer is top-five; “is #1 safe once you admit the run is only 19 games” is a question about certainty, and the honest answer there is no.

Methods deliberately not used here. A few standard families are absent for concrete reasons. Recency with explicit uncertainty (Glicko) collapses to roughly Elo once reduced to a single point rating, so it adds little over §15. Market-implied ratings (betting spreads) price in injuries and rest that results-only systems cannot see, but the cached odds cover only the Knicks’ 2025-26 playoff games, and historical futures for the other 43-minus-one champions do not exist in the cache, so a market rating cannot feed the all-champions framework. Bottom-up player aggregation (summing player-impact ratings such as RAPTOR or EPM by minutes) is a genuinely different data source and the subject of a separate project, not this team-results one.


Recurring Methods: Quick Reference

_pct_rank(series, value, ascending=True) The single statistical primitive used throughout. Definition: (series.dropna() ≤ value).mean() × 100 when ascending=True; (series.dropna() ≥ value).mean() × 100 when ascending=False. This is the empirical CDF evaluated at value. With 43 seasons, resolution is ~2.3 pp. A value equal to the best historical value yields 100th percentile (since it is ≤ itself and every other value). No smoothing, no interpolation.

SRS (Simple Rating System): compute_srs in second_look_nba.data SRS solves a system of linear equations that makes each team’s rating equal its average point margin per game plus an adjustment for opponent strength. The system is:

(I − A) @ srs = mean_margin_vector

where A[i, j] = fraction of team i’s games against team j (the normalized schedule matrix), and mean_margin_vector[i] is team i’s average per-game margin across all regular-season games. The constraint sum(srs) = 0 is imposed so the solution is unique and ratings are relative rather than absolute. This is solved via numpy.linalg.lstsq on the augmented system (adding a row for the constraint). An SRS of +5 means “this team outperforms a 0-SRS schedule by 5 points per game”; a +8.28 SRS for San Antonio (the Finals opponent) places them among the elite regular-season teams in 2025–26.

identify_champion Counts wins per team in the playoff game log and returns the team with the most. This is unambiguous: the actual Finals winner has more wins than every other team by construction (they won the championship). For seasons where the data is complete and consistent, this is always the same as the documented champion.

fill_plus_minus For pre-1997 seasons where PLUS_MINUS is NaN, the helper uses the two-row structure of the game log (one row per team per game) to compute margins from PTS. For each GAME_ID, the PTS column is reversed within the group (using transform(lambda s: s.iloc[::-1].values)) to give each row the opponent’s points, and PLUS_MINUS = PTS − OPP_PTS is filled where null. This is algebraically exact under the assumption that the box-score PTS totals match the official game score (they do).

Percentile vs. rank. The report uses “Nth percentile” rather than “Kth of 43” because percentile is more intuitive at this sample size and because it is comparable across sections with slightly different sample sizes (some metrics have fewer than 43 valid values due to NaN, e.g. in pre-1997 margins before the fill).

Why no regression. The core analysis is descriptive: it ranks a single team against a historical distribution. A regression of playoff margin on opponent SRS would add complexity (what is the outcome variable? what else must be held fixed?) without better answering “where does this run rank?” The adjusted margin is the closest thing to a structural model; it makes one explicit functional-form assumption (opponent adjustment = direct subtraction), motivated by the SRS identity rather than fit from data. What §13 adds is not a predictive model but uncertainty quantification on that descriptive rank: bootstrap resampling, empirical-Bayes shrinkage, and error-propagation, each chosen because the headline rests on a 19-game sample and the point-estimate rank alone hides how wide that uncertainty is.

Limitations

What this design can and cannot establish.

A descriptive rank, not a predictive model. The analysis places one team in a historical distribution of champions; it does not model or forecast outcomes (see “Why no regression” above). The claim is about where this run sits, not about what causes it.

A small, noisy sample. The distribution has about 43 champions, fewer for some metrics where early-era values are missing, and the headline rests on a 19-game playoff run. Section 13 quantifies that uncertainty with bootstrap resampling, empirical-Bayes shrinkage, and error-propagation, and Section 14 partial-pools the rank so one team is not over-read; none of these removes the smallness, they measure it.

Cross-era comparison depends on the normalization. There is no single correct way to compare teams decades apart, so the doc reports several deflators (scoring-share, per-100, spread-standardized) plus Elo and Bradley-Terry opponent-rating cross-checks (Sections 15, 16), and reads the rank through their agreement rather than committing to one number.

The opponent adjustment is an assumption, not a fit. Adjusted margin subtracts opponent SRS directly, a functional form motivated by the SRS identity rather than estimated from data; a different adjustment rule would move the adjusted figures.

Market and availability data are cross-checks, not primary evidence. Opponent player-availability (Section 11) and betting-market odds (Section 12) corroborate the descriptive rank; they are partial and are not the basis for it.