Applying Statistics to LLM Evaluations
March 9, 2026 · 1 hr 28 min read
The cover art is from https://x.com/DemensaMusic/status/2105568847113883950?s=20 :)
Research on large language models (LLMs) is empirically driven. For this reason, model evaluations play a pivotal role in the field’s progress. We improve models by making changes, evaluating them, and iterating. Despite their foundational role, however, evaluations are usually handled in a naive manner. In most cases, we just test a model’s performance over a finite evaluation dataset and directly compare performance metrics to those of other models with no consideration for whether these results are statistically significant or not. Such an approach leads to incorrect or misleading interpretations of evaluation results. As researchers, we want to avoid mistaking noise for progress and instead equip ourselves with the statistical tools needed to run informative model evaluations.
“Language models are measured in the literature by evaluations, or evals. Evals are commonly run and reported with a highest number is best mentality; industry practice is to highlight a state-of-the-art result in bold, but not necessarily to test that result for any kind of statistical significance.” - from [1]
In this overview, we will build a statistical foundation for LLM evaluations from the ground up. To begin, we will review basic statistical ideas with a practical focus on the topics that are most useful for model evaluations. We will then take a deeper look at how these ideas can be directly used to interpret LLM evaluation results in an uncertainty-aware manner. Specifically, we will cover a set of statistical best practices for model evaluation and implement each of them to show how they can be concretely applied. Although it may seem daunting, taking a statistically grounded approach to model evaluation is not especially complex, and adopting these ideas allows us to accelerate our research progress by avoiding spurious results.
Basic Statistics for LLM Evaluations
In order to develop a statistical framework for LLM evaluations, we first need to review a few fundamental concepts in statistics. These concepts form the basic foundation that we will build upon throughout this overview.
Random Variables and Estimators
A random variable is defined as a quantity that has a value dependent upon chance. We can observe values of this random variable by sampling from its probability distribution. If we draw observations from this distribution, these observations are denoted as . For our purposes, each of these observations will be sampled from the distribution of (i.e., ). We define the mean (or average) of this random variable as . In practice, we rarely know the true value of . Instead, we must estimate by computing the sample mean over our sampled observations:
Formally, the lower case letters represent concrete values sampled from a distribution, while upper case letter denotes the -th random variable in our sample - this is a notational detail, but it is important! The sample mean is a realized value computed from our sample of numbers, whereas the sample mean estimator is a random variable that is a function of the random variables :
The distribution of our random variable also has variance , which describes how spread out the distribution is. Variance is defined as the expected squared deviation from the mean:
In this overview, we will assume that this variance is finite (i.e., less than infinity). If we have a distribution with high variance, then observations sampled from this distribution are widely spread out, whereas a distribution with low variance will have samples that are closely clustered around the mean.
Similarly to the sample mean, we can also estimate the variance of a distribution from a sample of observations by computing the sample variance :
The standard deviation of is simply the square root of the variance:
While variance measures the variability of a single random variable , covariance measures how two random variables and vary together:
We can also estimate covariance from a paired sample of observations using the sample covariance:
If covariance is positive, then and tend to move in the same direction. If covariance is negative, then and tend to move in opposite directions. If and are independent, then their covariance is zero.
The law of total variance is a useful identity that decomposes the variance of a random variable into two parts based on conditioning on another random variable :
When evaluating an LLM, we can think of our score as a random variable that has variance due to two sources:
- Variability due to the question sampled for evaluation.
- Within-question variability arising from stochastic generation by the LLM or an LLM judge.
The law of total variance allows us to formally separate and reason about both of these sources of variance.
Standard Error and Sample Means
If we repeatedly draw samples from and compute the sample mean, we will get a different result each time. The resulting sample means form a sampling distribution (i.e., basically a list of sample means we have drawn). The standard error captures variability in the sample mean estimator (i.e., the spread of sample means after computing it multiple times). We can compute the standard error as shown below:
This standard error equation makes the assumption that samples drawn from are independent and identically distributed (IID). Independence implies that for , and identical distribution implies that each has the same variance . Given these assumptions, we can derive the standard error expression as follows:
Within this derivation, we use the variance of a sum identity, which can be generally expressed as:
Since the variables are independent, the covariance term is zero, yielding:
Taking the square root gives our standard error:
Bernoulli Variables
Let’s assume is a Bernoulli random variable, meaning that our scores are binary . In this case, our standard error expression simplifies significantly. First, the mean of a Bernoulli variable is simply the probability of success:
Second, since , we know that , which implies:
We can easily plug these two identities into our prior expression for variance:
We can estimate by taking a sample mean . Then, we can plug this simplified into our previous formula for the standard error, yielding the simplified expression:
The denominator comes from applying Bessel’s correction to ensure our sample variance estimator is unbiased.
Law of Large Numbers and the Central Limit Theorem (CLT)
The law of large numbers is a fundamental concept in statistics that builds upon our prior definition of the sample mean. Given a random variable with finite mean , the law of large numbers states that as the value of increases, the sample mean will approach (i.e., converge in probability) the true mean :
Put simply: with enough data, our estimator (the sample mean) approaches the true mean.
However, the law of large numbers only tells us that the sample mean will eventually settle around with sufficiently large . It does not tell us how the sample mean is distributed around for a specific value of . To understand this, we need the Central Limit Theorem (CLT).
Standardization and Z-Score
Given a random variable (or a realized value ), we can standardize by subtracting the mean and dividing by the standard deviation :
This produces a standardized variable with a mean of 0 and a variance of 1. The realized value of this standardized variable is called the -score.
Using this concept, we can standardize the sample mean to obtain by subtracting its mean and dividing by its standard error :
The CLT states that as grows large, the distribution of converges in distribution to a standard normal distribution :
This is a remarkable result. Regardless of the underlying distribution of - whether it is uniform, exponential, Bernoulli, or bimodal - the distribution of the sample mean will be approximately normal with mean and variance for sufficiently large :
Confidence Intervals
The CLT gives us the tools to compute confidence intervals for our estimators. A confidence interval provides a range of plausible values for an unknown parameter (such as the true mean ) at a specified confidence level (typically 95%).
First, consider our sample mean estimator . Assuming IID samples with finite variance, we know from the CLT that this estimator has an approximately normal distribution.
Given a standard normal distribution , we have:
This is a two-sided confidence interval, meaning 2.5% of the probability mass lies in each tail.
Substituting into this inequality:
Rearranging the terms to isolate the true mean :
This gives our formula for the 95% confidence interval:
Interpretation: If we repeated our evaluation experiment many times, drawing new samples and computing a confidence interval each time, 95% of those computed intervals would contain the true mean .
A Statistical Approach to LLM Evaluations [1]
Now that we have reviewed the necessary statistical background, let’s look at how to apply these ideas to large language model evaluations, following the framework developed by Evan Miller in [1].
Statistical Framing for LLM Evaluations
In theory, when evaluating an LLM, there exists a super-population of potential questions that could be asked. When we create a benchmark or evaluation dataset, we sample questions from this super-population.

This framing allows us to rethink model evaluations. Instead of trying to measure a model’s exact score on a specific fixed test set, we should view our evaluation score as an estimate of the model’s true performance over the broader super-population of tasks.
Because our sample of questions is finite, our evaluation score has uncertainty. Our goal is to quantify this uncertainty using statistical error bars.
Standard Errors and the CLT
The simplest evaluation setting occurs when each question is sampled independently from the super-population. For each question , the model receives a score . The overall evaluation score is the sample mean:
Under the CLT, the standard error of this mean score is:
The corresponding 95% confidence interval is:
The Binary Score Case
If the evaluation metric is binary (e.g., for exact-match accuracy), the standard error simplifies to:
This Bernoulli formula is easy to compute, but requires that scores are truly binary (i.e., not fractional like ROUGE or F1 scores).
In [1], Miller evaluates several leading models on standard benchmarks (GSM8K, MATH, HumanEval) and reports the resulting standard errors:

From these standard errors, we can compute 95% confidence intervals for each benchmark:

Notice how wide these confidence intervals are! On HumanEval (), the 95% confidence interval for Llama-3-70B spans roughly . A model reported at 81.7% accuracy could easily have a true super-population accuracy anywhere between 74.8% and 88.6%. Reporting benchmark scores without error bars gives a false sense of precision.
Clustered Errors
In many real-world benchmarks, questions are not independent. Instead, questions are organized into clusters:
- In MMLU, questions are grouped by academic subject.
- In multi-turn evals, multiple questions occur within the same conversation thread.
- In synthetic evals, multiple test cases are generated from the same template.
When questions within a cluster are correlated, the standard IID assumption is violated (). If we ignore this correlation and use the standard CLT formula, our standard error will be artificially small, making our confidence intervals overly optimistic.
To account for this, Miller [1] recommends using a clustered standard error. Let denote the score for question in cluster . The overall sample mean is still:
The cluster-adjusted standard error is computed as:
We can expand this expression to see its relationship to the standard CLT error:
“The clustered standard error acts as a kind of sliding scale between cases where scores within a cluster are perfectly correlated (in which case each cluster acts as a single independent observation) and perfectly uncorrelated (in which case the clustered standard error is equivalent to the unclustered case). The intra-cluster correlations… are captured by the triple summation (over clusters and cross-terms within clusters).” - from [1]
When questions within the same cluster have positive correlation, the cross-terms are positive, and the clustered standard error is strictly larger than the naive CLT error.
Reducing Variance
Once we can compute standard errors and confidence intervals, the natural next goal is to reduce evaluation variance so our benchmarks provide sharper conclusions.
To analyze where evaluation variance comes from, we apply the law of total variance. Consider:
- : The score received on an evaluation query.
- : The specific question sampled from the super-population.
Conditioning score on question :
Let denote the expected score for question , and let denote the within-question variance caused by stochastic generation. This gives:
This decomposition reveals two distinct components of variance:
- Within-question variance : Caused by random sampling during LLM decoding (temperature ) or judge stochasticity.
- Across-question variance : Caused by differences in intrinsic difficulty across questions in the dataset.
This leads directly to two actionable variance reduction strategies:
Strategy 1: Resampling Multiple Outputs ()
Instead of generating a single output per question, we can generate and score completions for each question . Let be the score of the -th sample on question . The question-level mean score is:
The variance of this averaged score is:
Resampling reduces the within-question variance linearly by a factor of ! However, it has zero effect on the across-question variance . Once is large enough that , further increases in provide diminishing returns.
Strategy 2: Direct Token Probabilities
If an evaluation metric can be computed directly from the model’s next-token logits (e.g., multiple choice benchmarks like MMLU), we can eliminate within-question variance entirely ().
For a multiple choice question with target option , let be the model’s assigned probability. By taking as the score rather than sampling a greedy token, we obtain:
For multi-token responses , the joint probability is:
“We recommend a two-pronged variance-reduction strategy. When next-token probabilities are available, and the LLM eval can be conducted using next-token probabilities (i.e. without token generation), compute the expected score for each question, and compute the standard error of expected scores across questions. When next-token probabilities are not available, or the answer requires a chain of thought or other complex interaction, choose a such that and compute the standard error across question-level mean scores. In neither case should the sampling temperature be adjusted for the sake of reducing variance in the scores.” - from [1]
Model Comparisons
When comparing two models, Model A and Model B, the standard industry practice is to report separate scores and , and declare whichever is higher to be the winner. A statistically sound approach analyzes the difference between their scores.
Unpaired Comparisons
If Model A and Model B are evaluated on different sets of questions, the difference in their mean scores is:
The variance of this difference is:
Because the models were evaluated on different questions, . The unpaired standard error is:
The 95% confidence interval for the performance gap is:
For Model A to be statistically significantly better than Model B at the 95% level, this interval must exclude zero (i.e., ).
Paired Comparisons: The Power of Positive Covariance
In practice, we almost always evaluate models on the exact same benchmark questions. This creates a paired evaluation setup.
Let and denote the scores of Model A and Model B on question . We define the per-question score difference as:
The sample mean difference is:
We can estimate the standard error directly from the variance of the differences:
The relationship between the paired and unpaired standard error is governed by covariance:
Because different LLMs tend to agree on which questions are easy and which questions are hard, their scores across benchmark items are strongly positively correlated (). This positive covariance subtracts from the overall variance!
As a result, the paired standard error is often dramatically smaller than the unpaired standard error:

Looking at the table from [1], on GSM8K the individual confidence interval width for Llama-3-8B is and for Llama-3-70B is . But the paired difference confidence interval width is only . Evaluating models on the same test set neutralizes question-level difficulty variation, allowing subtle differences between models to become statistically detectable.
Practical Implementation
Here is a complete, runnable Python implementation demonstrating how to compute standard errors, clustered standard errors, confidence intervals, and paired comparisons on model scores:
import mathimport numpy as np
################################## Evaluation settings and scores#################################
# Model namesmodel_a_name = "Galleon"model_b_name = "Dreadnought"
# Example scores for the models (n = 10)model_a = np.array([1, 1, 0, 1, 0, 1, 1, 0, 1, 1], dtype=np.float64)model_b = np.array([0, 1, 0, 0, 0, 1, 0, 0, 1, 0], dtype=np.float64)
# Cluster assignment: example with 2 clusters (even vs odd indices)clusters = np.array([i % 2 for i in range(len(model_a))])
# Z-score for 95% confidence intervalz = 1.96n = len(model_a)
################################## Single-model evaluation#################################
print(f"=== Evaluating {model_a_name} ===")
# 1. Sample means_bar_a = np.mean(model_a)print(f"Mean Score: {s_bar_a:.3f}")
# 2. Naive CLT standard errorse_clt_a = np.std(model_a, ddof=1) / np.sqrt(n)ci_clt_a = (s_bar_a - z * se_clt_a, s_bar_a + z * se_clt_a)print(f"CLT Standard Error: {se_clt_a:.3f}")print(f"CLT 95% Confidence Interval: [{ci_clt_a[0]:.3f}, {ci_clt_a[1]:.3f}]")
# 3. Bernoulli standard error (for binary metrics)se_bern_a = np.sqrt((s_bar_a * (1 - s_bar_a)) / (n - 1))ci_bern_a = (s_bar_a - z * se_bern_a, s_bar_a + z * se_bern_a)print(f"Bernoulli Standard Error: {se_bern_a:.3f}")print(f"Bernoulli 95% Confidence Interval: [{ci_bern_a[0]:.3f}, {ci_bern_a[1]:.3f}]")
# 4. Clustered standard errorse_cluster_a = np.sqrt( np.sum([np.sum(model_a[clusters == c] - s_bar_a)**2 for c in np.unique(clusters)]) / (n**2))ci_cluster_a = (s_bar_a - z * se_cluster_a, s_bar_a + z * se_cluster_a)print(f"Clustered Standard Error: {se_cluster_a:.3f}")print(f"Clustered 95% Confidence Interval: [{ci_cluster_a[0]:.3f}, {ci_cluster_a[1]:.3f}]")
################################## Model comparisons#################################
print(f"\n=== Comparing {model_a_name} vs {model_b_name} ===")
s_bar_b = np.mean(model_b)se_clt_b = np.std(model_b, ddof=1) / np.sqrt(n)diff_mean = s_bar_a - s_bar_b
# 1. Unpaired comparison (assuming independent question sets)se_unpaired = np.sqrt(se_clt_a**2 + se_clt_b**2)ci_unpaired = (diff_mean - z * se_unpaired, diff_mean + z * se_unpaired)print(f"Mean Difference (A - B): {diff_mean:.3f}")print(f"Unpaired Standard Error: {se_unpaired:.3f}")print(f"Unpaired 95% Confidence Interval: [{ci_unpaired[0]:.3f}, {ci_unpaired[1]:.3f}]")
# 2. Paired comparison (evaluated on identical questions)diff_per_question = model_a - model_bse_paired = np.std(diff_per_question, ddof=1) / np.sqrt(n)ci_paired = (diff_mean - z * se_paired, diff_mean + z * se_paired)print(f"Paired Standard Error: {se_paired:.3f}")print(f"Paired 95% Confidence Interval: [{ci_paired[0]:.3f}, {ci_paired[1]:.3f}]")
# Check statistical significanceif ci_paired[0] > 0: print(f"Conclusion: {model_a_name} is statistically significantly better than {model_b_name} (p < 0.05).")elif ci_paired[1] < 0: print(f"Conclusion: {model_b_name} is statistically significantly better than {model_a_name} (p < 0.05).")else: print("Conclusion: No statistically significant difference detected.")More Topics to Explore in Statistics
Beyond computing standard errors and confidence intervals, several recent research papers have examined deeper statistical questions surrounding LLM evaluations.
Power Analysis for LLM Evals [1]
When designing a new benchmark or deciding how many questions to run from an existing benchmark, we face a fundamental question: How many evaluation questions do we actually need?
Statistical power analysis answers this question. Power analysis is parameterized by:
- Significance level (): The probability of a false positive (Type I error), typically .
- Statistical power (): The probability of correctly detecting a true performance difference when one exists, typically (meaning a false negative rate ).
- Minimum Detectable Effect (): The smallest performance difference between models that we want to be able to reliably detect.
- Score variance (): The variance of model scores across questions.
In [1], Miller derives a sample size formula for LLM evaluations:

Here, denotes the -th percentile of the standard normal distribution (for , ; for , ).
This formula yields several critical insights:
- Inverse-square scaling with effect size: The required number of test questions scales with . If you want to detect a 5% difference () instead of a 10% difference (), you need as many questions. If you want to detect a 1% difference, you need as many questions.
- Linear scaling with variance: Reducing score variance directly reduces the required sample size.
Here is a Python implementation to compute the required sample size and perform power analysis:
import mathimport numpy as npfrom statistics import NormalDist
def required_sample_size(alpha: float, beta: float, delta: float, sigma_sq: float) -> int: """ Compute the sample size required to detect an effect size delta with significance level alpha and power (1 - beta). """ z_alpha = NormalDist().inv_cdf(1.0 - alpha / 2.0) z_beta = NormalDist().inv_cdf(1.0 - beta) n = ((z_alpha + z_beta)**2 * sigma_sq) / (delta**2) return math.ceil(n)
def decompose_variance(score_matrix: np.ndarray) -> tuple[float, float]: """ Decompose total score variance into within-question and across-question variance. score_matrix has shape (n_questions, k_resamples). """ n, k = score_matrix.shape if k < 2: raise ValueError("Need at least K >= 2 resamples to estimate within-question variance.")
# Expected score per question x_i = np.mean(score_matrix, axis=1)
# Within-question sample variance sigma_sq_i = np.var(score_matrix, axis=1, ddof=1)
# Within-question variance: E[sigma_i^2] var_within = float(np.mean(sigma_sq_i))
# Across-question variance: Var(X_i) # Using unbiased estimator: Var(x_i) - E[sigma_i^2] / K var_between = float(np.var(x_i, ddof=1) - var_within / k) var_between = max(0.0, var_between)
return var_within, var_between
# Example settingsalpha = 0.05 # 5% false positive ratebeta = 0.20 # 80% powerdelta = 0.05 # Minimum detectable difference: 5%
# Simulated scores: 100 questions, 3 resamples eachnp.random.seed(42)score_data = np.random.binomial(n=1, p=0.75, size=(100, 3)).astype(np.float64)
var_within, var_between = decompose_variance(score_data)total_var_k1 = var_within + var_between
n_needed_k1 = required_sample_size(alpha, beta, delta, total_var_k1)print(f"Variance decomposition: Within-Q = {var_within:.4f}, Across-Q = {var_between:.4f}")print(f"Questions needed with K=1: {n_needed_k1}")
# If we resample K=5 times per question:total_var_k5 = (var_within / 5.0) + var_betweenn_needed_k5 = required_sample_size(alpha, beta, delta, total_var_k5)print(f"Questions needed with K=5: {n_needed_k5}")print(f"Sample size reduction from resampling: {100 * (1 - n_needed_k5 / n_needed_k1):.1f}%")Don’t Use the CLT in LLM Evals With Fewer Than a Few Hundred Datapoints [2]
While the Central Limit Theorem is simple and powerful, it is an asymptotic result: it holds as . In a recent position paper, Bowyer et al. [2] investigate what happens when the CLT is applied to LLM evaluations in the small-data regime ().
Their findings show that for small sample sizes, nominal 95% CLT confidence intervals often fail to provide 95% coverage in practice.

This problem is especially severe when:
- Accuracy is close to 0% or 100%: When is extreme, the Bernoulli distribution is highly skewed, and the normal approximation breaks down.
- Sample size is small: On benchmarks with small test splits (), the empirical coverage of a nominal 95% CLT interval can drop as low as 80% or 75%.
“It may be argued that CLT-based methods are usually sufficient in practice when their assumptions are satisfied. We do not disagree. However, we argue that it is safer to use the more robust strategies laid out in this paper, which are just as easy to apply, perform no worse for large and perform substantially better in the small- setting… knowing whether a certain is large enough for the CLT to hold would be extremely context-dependent and difficult to determine a priori.” - from [2]

Robust Alternatives for Small
When is small, Bowyer et al. recommend using alternative interval estimators that maintain correct coverage:
- Wilson Score Interval: Adjusts the center and width of the interval based on the score test, avoiding catastrophic undercoverage near .
- Agresti-Coull Interval: A simple “add two successes and two failures” adjustment to the sample mean before computing standard errors.
- Beta-Binomial / Bayesian Credible Intervals: Places a prior distribution over accuracy and computes exact posterior quantiles.
Quantifying Variance in Evaluation Benchmarks [3]
In [3], Madaan et al. examine another major source of evaluation uncertainty: benchmark instability caused by trivial prompt perturbations and formatting variations.
Across standard benchmarks like MMLU, GSM8K, and ARC, they test how model performance varies when making minor, semantics-preserving modifications to evaluation prompts (e.g., changing few-shot demonstration examples, altering whitespace, or modifying instructions).

Their empirical findings reveal that:
- Score fluctuations of 3% to 8% are common: Simply changing the order of few-shot examples or the phrasing of instructions can swing a model’s score by several percentage points.
- Frequent ranking flips: When comparing closely matched models, these prompt-induced fluctuations frequently invert the leaderboard rankings, producing spurious conclusions about which model is superior.

This work underscores that model performance is not a single deterministic scalar. Without accounting for prompt-level and sampling variance, benchmark leaderboards can easily measure noise rather than genuine capability advances.
Signal and Noise: A Framework for Reducing Uncertainty [4]
In [4], Heineman et al. propose a unified framework for maximizing the signal-to-noise ratio in language model evaluations.

During model development, teams frequently run small-scale evaluations on intermediate checkpoints to guide decisions (e.g., hyperparameter tuning, data mixture selection, and learning rate schedules). If evaluation noise is large relative to the true performance improvement, developers risk optimizing for noise.
Heineman et al. propose three key interventions:
- Continuous Scoring via Token Probabilities: Replacing discrete 0/1 accuracy with cross-entropy or target token log-probabilities increases the information content per evaluation example by up to .
- Variance Reduction via Test-Time Compute: Allocating additional test-time compute (resampling times and averaging) specifically on items with high within-question variance.
- Monotonicity as an Evaluation Metric: Measuring whether evaluation scores increase monotonically across training checkpoints, rather than relying solely on the final checkpoint’s raw score.
Key Takeaways
Model evaluations are the steering wheel of LLM research. Navigating without statistical tools risks mistaking random fluctuation for algorithmic breakthrough.
To summarize the practical best practices:
- Always report standard errors and confidence intervals: A single number is incomplete. At minimum, compute the CLT standard error and report 95% confidence intervals .
- Account for clustering: If evaluation queries share common templates, subjects, or conversation contexts, use the cluster-adjusted standard error to avoid overconfident error bars.
- Use paired comparisons: When comparing two models evaluated on the same test set, always compute the paired standard error on question-level score differences . Positive covariance between models significantly tightens the confidence interval.
- Be cautious with small : If or accuracy is near 0% or 100%, the CLT normal approximation breaks down. Use robust alternatives like Wilson score or Agresti-Coull intervals.
- Apply variance reduction: Decompose variance using the law of total variance. Use direct token probabilities when available, or resample completions to shrink within-question variance.
- Run power analysis before commissioning new benchmarks: Use sample size formulas to ensure the test set is large enough to detect the expected effect size.
Bibliography
[1] Miller, Evan. “Adding error bars to evals: A statistical approach to language model evaluations.” arXiv preprint arXiv:2411.00640 (2024).
[2] Bowyer, Sam, Laurence Aitchison, and Desi R. Ivanova. “Position: Don’t Use the CLT in LLM Evals With Fewer Than a Few Hundred Datapoints.” arXiv preprint arXiv:2503.01747 (2025).
[3] Madaan, Lovish, et al. “Quantifying variance in evaluation benchmarks.” arXiv preprint arXiv:2406.10229 (2024).
[4] Heineman, David, et al. “Signal and noise: A framework for reducing uncertainty in language model evaluation.” arXiv preprint arXiv:2409.00630 (2024).