Skip to content

On BigCodeBench-Hard (n=148), ~55 of the leaderboard's models are statistically tied with #1 — consider showing significance tiers #121

Description

@ipezygj

Thanks for BigCodeBench — it's one of the more honest code benchmarks out there, which is exactly why I ran a statistical-significance check on the leaderboard rather than a weaker target. This is a constructive note about how to read the ranking, not a criticism of the benchmark.

The check

For a pass@1 leaderboard, whether a ranking is real depends on the number of tasks. I took the published scores (bigcode-bench.github.io/results.json and results-hard.json) and, for each model, ran a two-proportion test of its pass@1 against the #1 model's, at the benchmark's task count (Hard = 148, Full = 1140). Models whose gap to #1 is not significant (p ≥ 0.05) are statistically tied with the leader.

split metric N #1 models not significantly different from #1 (p ≥ 0.05)
Hard complete 148 Gemini-Exp-1206 (40.5%) 55 of 199
Hard instruct 148 o3-mini (33.1%) 62 of 173
Full complete 1140 Gemini-Exp-1206 (62.4%) 12 of 153
Full instruct 1140 GPT-4o (51.1%) 15 of 126

On BigCodeBench-Hard, roughly a quarter to a third of the leaderboard is statistically indistinguishable from #1. Two things compound: only 148 tasks, and accuracies sit near 40% — the region of maximum binomial variance. Together the minimum detectable gap is ~16 points, so a model 10 points behind #1 on Hard cannot be shown to be worse from this data.

Why this is a resolution issue, not a flaw

The Full split (1140 tasks) resolves much better — only ~12–15 models tie with #1. Same method, larger N → finer resolution. The Hard split is deliberately small and curated (148 tasks), which is a feature for difficulty but means it can't finely rank near-matched models. This isn't "the benchmark is wrong"; it's "the top of Hard is one tier."

Suggestion

Consider showing a significance band / tier grouping alongside the strict rank, at least for Hard — e.g. "these N models are tied with the leader (Δ not significant at n=148)." It's a ~40-line two-proportion pass and would stop small pass@1 differences from being read as a real ordering.

Reproduce ($0, public data)

import json, urllib.request, math
d = json.load(urllib.request.urlopen("https://bigcode-bench.github.io/results-hard.json"))
rows = sorted(([k, v["pass@1"]["complete"]] for k, v in d.items()
               if v.get("pass@1", {}).get("complete") is not None), key=lambda r: -r[1])
n, top = 148, rows[0][1]
def two_prop_p(p1, p2, n):
    p = (p1 + p2) / 2 / 100
    se = math.sqrt(p * (1 - p) * 2 / n)
    return math.erfc(abs((p1 - p2) / 100) / se / math.sqrt(2)) if se else 1.0
tied = sum(1 for _, s in rows if two_prop_p(top, s, n) >= 0.05)
print(f"#1 = {rows[0][0]} @ {top}%;  {tied}/{len(rows)} models not significantly different (p>=0.05)")

N (Hard=148, Full=1140) are the documented task counts (bigcode/bigcodebench-hard, bigcode/bigcodebench). pass@1 with greedy decoding is one Bernoulli trial per task, so the two-proportion bound applies directly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions