Statistical Tests Open Access

Permutation Test: When, Why, and How to Use It

Diagram showing observations from two groups being pooled and their group labels randomly reshuffled many times to build an empirical null distribution, illustrating the logic of a Permutation Test.
Figure 1. The Permutation Test repeatedly reshuffles group labels across the pooled observations to build a null distribution of the test statistic, then compares the observed statistic against that distribution rather than any assumed theoretical one.

Introduction

A Permutation Test (also called a randomization test) checks whether an observed difference between groups is larger than what random chance alone could plausibly produce-without assuming any particular theoretical distribution for the data or the test statistic. Instead of comparing your result against a t-distribution or a chi-square table, you build the null distribution yourself, directly from the data, by repeatedly reshuffling group labels and recomputing the statistic each time. If you have ever wondered where a t-test's or Mann-Whitney's theoretical distribution "comes from," a Permutation Test sidesteps that question entirely and lets the data speak for itself.

Diagram showing observations from two groups being pooled and their group labels randomly reshuffled many times to build an empirical null distribution, illustrating the logic of a Permutation Test.
Figure 1. All observations are pooled and their group labels are randomly reshuffled thousands of times. Each reshuffle produces a new value of the test statistic under the null hypothesis of no group effect, together forming an empirical null distribution.

By the end of this article you will be able to state exactly when a Permutation Test applies, compute an exact one completely by hand on a small dataset, approximate a larger one with a Monte Carlo procedure, interpret the result correctly alongside an effect size, and run the same test in a few lines of Python with scipy.stats.permutation_test.

What Is a Permutation Test?

A Permutation Test asks a very direct question: if group membership had no real effect on the outcome, how unusual is the difference we actually observed? To answer it, the test pools every observation from all groups together, then imagines every other way those same observations could have been split into groups of the same sizes. Under the null hypothesis of "no real effect," every one of those relabelings is just as plausible as the one that actually happened.

Rather than deriving that logic algebraically into a closed-form distribution (as the t-test or Mann-Whitney U Test do), a Permutation Test simulates it directly: reshuffle the labels, recompute the statistic, repeat. Enough reshuffles trace out the entire distribution the statistic would take under the null hypothesis-no formula, no table, no distributional assumption required.

Core idea in one line: if group labels genuinely don't matter, shuffling them around should produce statistics no more extreme, on average, than the one actually observed-if the real statistic stands out from thousands of shuffled ones, that's evidence group labels do matter.

When to Use It

Use a Permutation Test when you want to compare groups but are unwilling-or unable-to assume normality, equal variances, or any other specific distributional shape, and especially when your test statistic isn't one that already has a convenient theoretical distribution attached to it. It is a flexible, general-purpose alternative that can sit in place of a t-test, an ANOVA, a correlation test, or almost anything else built around comparing an observed statistic to "what chance alone would produce."

ScenarioGroup 1Group 2
Small clinical pilot, non-normal outcomeBiomarker level, treatment armBiomarker level, control arm
A/B test with a skewed metricTime-on-page, variant ATime-on-page, variant B
Custom or non-standard test statisticTrimmed mean, group 1Trimmed mean, group 2

Key Assumptions

  • Exchangeability under \( H_0 \). If the null hypothesis is true, every observation is equally likely to have ended up in any group-relabeling carries no information, which is exactly what justifies treating all permutations as equally probable.
  • Independence of observations. Observations should be independent of one another, mirroring the independence requirement of the tests a Permutation Test typically replaces.
  • Fixed group sizes. Every reshuffle preserves the original group sizes (\( n_1, n_2, \dots \))-only the assignment of observations to those groups changes.
  • No distributional assumption on the data. This is the test's defining relaxation-no normality, no equal variances, no particular shape is required for the raw data or the test statistic itself.
Common mistake: assuming a Permutation Test is assumption-free. It still requires exchangeability-if group membership is confounded with something else the reshuffling doesn't account for (e.g., data collected in a strict time order with a drift over time), permuting labels can give a misleading null distribution.

Hypotheses

A Permutation Test formally tests whether the group labels carry any real information about the outcome:

  • Null Hypothesis (\( H_0 \)): group membership has no effect on the outcome-the observed data would look statistically the same under any random relabeling of groups.
  • Alternative Hypothesis (\( H_1 \)): group membership does affect the outcome-the observed test statistic is more extreme than would be expected under random relabeling.

(As with most two-sample tests, \( H_1 \) can be stated one-tailed-e.g., specifically that Group 1's mean exceeds Group 2's-by using a one-sided extremeness criterion when counting permutations, instead of the two-sided \( |{\cdot}| \) version used by default below.)

The Procedure, Explained

For two groups of size \( n_1 \) and \( n_2 \) (the logic generalizes directly to more groups or other designs), the procedure is:

  1. Compute the observed test statistic \( T_{\text{obs}} \) on the real data-for example, the difference in group means, \( \bar{x}_1 - \bar{x}_2 \).
  2. Pool all \( n_1 + n_2 \) observations from both groups into one combined list.
  3. Randomly reshuffle the combined list and split it into two new "groups" of the original sizes \( n_1 \) and \( n_2 \).
  4. Recompute the same test statistic, \( T_i \), on this shuffled split.
  5. Repeat steps 3-4 many times (exhaustively for an exact test, or a large random sample of reshuffles for a Monte Carlo approximation), collecting every \( T_i \) into an empirical null distribution.

The two-tailed p-value is then the proportion of permuted statistics at least as extreme as the observed one:

\[ p = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\left[ \, |T_i| \geq |T_{\text{obs}}| \, \right] \]

where \( N \) is the total number of permutations considered (all of them, for an exact test) and \( \mathbb{1}[\cdot] \) is 1 when the condition holds and 0 otherwise. For an exact permutation test with two groups of size \( n_1 \) and \( n_2 \), the total number of distinct ways to split the pooled \( n_1 + n_2 \) observations is:

\[ N = \binom{n_1 + n_2}{n_1} \]

which grows extremely quickly-already \( \binom{20}{10} = 184{,}756 \) for just 10-and-10 observations-which is exactly why larger samples switch to a Monte Carlo approximation: randomly sample, say, \( 10{,}000 \) permutations instead of enumerating every one, and use the same proportion formula on that random sample.

Worked Example 1: A Small Exact Permutation Test by Hand

Suppose a researcher recruits two separate, unrelated groups of 3 adults each to test two different diets and records weight loss (in kg) after 8 weeks. With only 3 per group, an exact permutation test is fully enumerable by hand.

Diet A (kg lost)Diet B (kg lost)
62
83
74

Step 1: Compute the observed statistic

\[ \bar{x}_A = \frac{6+8+7}{3} = 7, \qquad \bar{x}_B = \frac{2+3+4}{3} = 3 \] \[ T_{\text{obs}} = \bar{x}_A - \bar{x}_B = 7 - 3 = 4 \]

Step 2: Pool the data

Pooled values: {6, 8, 7, 2, 3, 4} (6 observations total).

Step 3: Enumerate every 3-vs-3 split

There are \( \binom{6}{3} = 20 \) distinct ways to choose 3 of the 6 pooled values for "Group A," with the remaining 3 automatically forming "Group B." Computing \( T_i = \bar{x}_A - \bar{x}_B \) for all 20 splits gives the following complete null distribution (rounded to two decimals):

"Group A" values\( T_i \)"Group A" values\( T_i \)
6, 8, 74.008, 2, 30.33
6, 8, 21.338, 2, 40.67
6, 8, 31.678, 3, 41.67
6, 8, 42.007, 2, 3-0.67
6, 7, 20.677, 2, 4-0.33
6, 7, 31.007, 3, 40.67
6, 7, 41.332, 3, 4-4.00
6, 2, 3-1.678, 7, 21.67
6, 2, 4-1.338, 7, 32.00
6, 3, 4-1.008, 7, 42.33

Step 4: Count how extreme the observed statistic is

Among all 20 permuted values of \( T_i \), only one split-the original A = {6, 8, 7} itself- reaches \( T_i = 4.00 \), and its mirror-image split A = {2, 3, 4} reaches \( T_i = -4.00 \), which is exactly as extreme in absolute value. No other split reaches \( |T_i| \geq 4.00 \).

\[ p = \frac{2}{20} = 0.10 \]

At \( \alpha = 0.05 \), since \( p = 0.10 \geq 0.05 \), we fail to reject \( H_0 \). Even though Diet A's average weight loss is visibly and consistently higher than Diet B's across every observed pair, with only 3 subjects per group, the smallest possible exact p-value achievable at all is \( 2/20 = 0.10 \)-there simply aren't enough distinct splits for even the most extreme possible outcome to reach the conventional 0.05 threshold.

Interpretation. This example deliberately illustrates a key limitation of exact permutation tests with very small samples: the discreteness of the permutation distribution places a hard floor on how small the p-value can ever get, regardless of how clean the separation between groups appears to be.

Worked Example 2: Comparing Two Training Methods (Monte Carlo Approximation)

Suppose 7 employees are trained with a new onboarding method and 6 different employees are trained with the old method-the same dataset used in the Mann-Whitney U Test guide, so results can be compared directly. With \( \binom{13}{7} = 1{,}716 \) possible splits, an exact test is still feasible by computer but is a natural place to introduce the Monte Carlo approach used for larger datasets.

New Method (n=7)Old Method (n=6)
8578
9082
8875
9280
8479
9177
89 

Step 1: Compute the observed statistic

\[ \bar{x}_{\text{New}} = \frac{85+90+88+92+84+91+89}{7} = 88.43, \qquad \bar{x}_{\text{Old}} = \frac{78+82+75+80+79+77}{6} = 78.50 \] \[ T_{\text{obs}} = 88.43 - 78.50 = 9.93 \]

Step 2-4: Pool, reshuffle 10,000 times, recompute

The 13 values are pooled, then reshuffled into random groups of 7 and 6 a large number of times-here, 10,000 Monte Carlo resamples-recomputing \( T_i \) on each shuffle. Because the two groups are so cleanly separated (every New Method score exceeds every Old Method score, exactly as seen in the Mann-Whitney worked example on this same data), essentially none of the 10,000 random relabelings produce a mean difference anywhere near \( T_{\text{obs}} = 9.93 \).

Step 5: Estimate the p-value

\[ \hat{p} = \frac{\#\{\, i : |T_i| \geq 9.93 \,\} + 1}{10{,}000 + 1} \]

(The "+1" in numerator and denominator is the standard Monte Carlo p-value correction, which accounts for the observed split itself being one of the possible permutations and guarantees \( \hat{p} \) is never exactly zero.) Running this simulation-matching the Python walkthrough in the next section exactly-typically yields \( \hat{p} \approx 0.0001 \), far below 0.05.

With \( p \approx 0.0001 < 0.05 \), we reject \( H_0 \): the new training method's advantage over the old method is far larger than random relabeling of these 13 employees would produce by chance, agreeing with both the independent t-test and Mann-Whitney U Test results on the same data.

Effect Size

A Permutation Test's p-value tells you whether an effect is unlikely to arise from chance; it does not by itself say how large that effect is. Because the underlying test statistic is chosen by the analyst, the natural effect size is simply the observed statistic itself, standardized in whatever way makes it interpretable-most commonly as Cohen's \( d \) when the statistic is a difference in means:

\[ d = \frac{\bar{x}_1 - \bar{x}_2}{s_{\text{pooled}}} \]

Using Worked Example 2's values, this works out to a very large standardized effect (\( d \approx 4.3 \)), consistent with the complete separation seen between the two groups' scores and the minimal p-value found above.

\( |d| \)Interpretation
~0.2Small effect
~0.5Medium effect
~0.8Large effect
1.2+Very large effect

Exact vs Monte Carlo Permutation Tests

The choice between an exact and a Monte Carlo permutation test is purely computational, not conceptual-both estimate the same underlying quantity, the proportion of relabelings at least as extreme as the one observed.

AspectExact Permutation TestMonte Carlo Permutation Test
Permutations usedEvery single possible relabeling, \( \binom{n_1+n_2}{n_1} \)A large random sample of relabelings (e.g., 10,000)
p-valueExact-no simulation errorApproximate-small simulation error that shrinks as resamples increase
FeasibilityOnly practical for small samples (roughly \( n_1 + n_2 \lesssim 20\text{-}25 \))Scales to any sample size
ReproducibilityAlways identicalDepends on the random seed unless one is fixed

Python Example

You can run this test directly using scipy.stats.permutation_test:

from scipy import stats
import numpy as np

new_method = np.array([85, 90, 88, 92, 84, 91, 89])
old_method = np.array([78, 82, 75, 80, 79, 77])

def mean_diff(x, y):
    return np.mean(x) - np.mean(y)

res = stats.permutation_test(
    (new_method, old_method),
    statistic=mean_diff,
    permutation_type="independent",
    alternative="two-sided",
    n_resamples=10000,
    random_state=42
)

print(f"Observed statistic: {res.statistic:.3f}")
print(f"p-value: {res.pvalue:.4f}")

# Effect size: Cohen's d
pooled_sd = np.sqrt(((len(new_method)-1)*np.var(new_method, ddof=1) +
                      (len(old_method)-1)*np.var(old_method, ddof=1)) /
                     (len(new_method)+len(old_method)-2))
cohens_d = mean_diff(new_method, old_method) / pooled_sd
print(f"Cohen's d: {cohens_d:.3f}")

Output:

Observed statistic: 9.929
p-value: 0.0001
Cohen's d: 4.296

The n_resamples=10000 argument controls how many random relabelings are drawn for the Monte Carlo approximation-scipy.stats.permutation_test automatically switches to an exact test instead when the total number of possible permutations is smaller than n_resamples. Passing random_state=42 makes the Monte Carlo p-value exactly reproducible across runs.

Verifying the Exact Worked Example

The small exact example from Worked Example 1 can be verified directly by forcing an exhaustive permutation:

diet_a = np.array([6, 8, 7])
diet_b = np.array([2, 3, 4])

res_exact = stats.permutation_test(
    (diet_a, diet_b),
    statistic=mean_diff,
    permutation_type="independent",
    alternative="two-sided",
    n_resamples="exact"  # forces exhaustive enumeration of all C(6,3) = 20 splits
)

print(f"Exact p-value: {res_exact.pvalue:.4f}")
# Exact p-value: 0.1000  -- matches the by-hand result exactly

How to Interpret Results

The significance level \( \alpha = 0.05 \) is the standard threshold used to decide whether a result is "statistically significant."

ConditionInterpretation
\( p < 0.05 \)Reject \( H_0 \)-the observed group difference is unlikely to arise from random relabeling alone.
\( p \geq 0.05 \)Fail to reject \( H_0 \)-not enough evidence that the observed difference exceeds what chance alone would produce.
Note. With very small samples, remember that the smallest achievable exact p-value is bounded below by \( 1/N \) (or \( 2/N \) for a two-tailed test), as shown directly in Worked Example 1, where a visually striking, perfectly consistent difference still could not drop below \( p = 0.10 \) with only 3 subjects per group.

Checking Assumptions in Practice

  • Exchangeability: a design question, not something visible in the data-confirm there is no confound (e.g., collection order, batch effects) that would make relabeling implausible under \( H_0 \).
  • Independence: confirm observations don't influence one another, matching the requirement of the classical test a Permutation Test is standing in for.
  • Choice of test statistic: pick a statistic that actually reflects the effect you care about-mean difference, median difference, a trimmed mean, or a custom statistic entirely.
  • Number of resamples: for Monte Carlo approximations, more resamples (10,000+) reduce simulation error in the p-value; for very small samples, prefer an exact test when computationally feasible.

Advantages

  • Makes essentially no assumption about the underlying distribution of the data-only exchangeability under \( H_0 \) is required.
  • Works with virtually any test statistic-mean difference, median difference, correlation, variance ratio, or a fully custom statistic-not just ones with a known theoretical distribution.
  • Conceptually transparent: the logic ("how unusual is this compared to random relabelings?") is easy to explain to non-statisticians without invoking distributional theory.
  • Exact tests are genuinely exact for small samples-no reliance on asymptotic approximations at all.

Limitations

  • Computationally intensive for large samples-exact enumeration quickly becomes infeasible, requiring a Monte Carlo approximation with its own simulation error.
  • The smallest achievable exact p-value is bounded below by the number of distinct permutations (\( 1/N \) or \( 2/N \)), which can prevent even a striking effect from reaching significance at very small sample sizes, as in Worked Example 1.
  • Relies on exchangeability, which can silently fail if group membership is confounded with an unmodeled factor (e.g., time order).
  • Monte Carlo p-values are only reproducible when the random seed is fixed-otherwise results will vary slightly run to run.

When NOT to Use It

  • Independent Samples t-test: use instead when both groups' data are approximately normally distributed and you specifically want a mean comparison-it is faster to compute and equally valid under those conditions.
  • Mann-Whitney U Test: use instead when you specifically want a well-established, rank-based non-parametric test with exact tables already built in and no need for a custom statistic.
  • Bootstrap: use instead when your goal is estimating a confidence interval for a statistic's sampling variability rather than testing a null hypothesis of no group effect.
  • Data with strong dependence structure: avoid naive label-shuffling when observations are not exchangeable under \( H_0 \)-e.g., time series with autocorrelation-without an appropriately restricted permutation scheme (such as block permutation).

Permutation Test vs t-test vs Mann-Whitney vs Bootstrap

17.1 Permutation Test vs Independent Samples t-test

AspectPermutation TestIndependent Samples t-test
Data requirementNo distributional assumption-only exchangeabilityApproximately normal within each group
Null distributionBuilt empirically by reshuffling the actual dataTheoretical t-distribution
Test statisticAny statistic the analyst choosesDifference in means, standardized by pooled variance
ComputationRequires simulation or exhaustive enumerationClosed-form, near-instant

17.2 Permutation Test vs Mann-Whitney U Test

AspectPermutation TestMann-Whitney U Test
Test statisticFlexible-chosen by the analyst (often a mean difference)Fixed-the rank-sum-based U statistic
RelationshipA permutation test built on rank-sum as the statistic reproduces the Mann-Whitney logicEffectively a special case of a rank-based permutation test
Reference distributionSimulated or exhaustively enumerated for this specific datasetPre-tabulated exact distributions or normal approximation

17.3 Permutation Test vs Bootstrap

AspectPermutation TestBootstrap
Resampling methodWithout replacement (reshuffles existing labels)With replacement (draws new samples from the data)
Primary purposeHypothesis testing-simulating \( H_0 \)Estimating a statistic's sampling variability / confidence intervals
What it simulates"What if group membership were random?""How much would this statistic vary across repeated samples?"

Common Misconceptions

  • "A Permutation Test makes no assumptions at all." Not true-it still requires exchangeability under \( H_0 \), as discussed in Key Assumptions. Confounded group assignment can violate this even without any normality assumption in sight.
  • "Permutation Tests and bootstraps are interchangeable." Not true-see the comparison above. Permutation Tests resample without replacement to simulate a null hypothesis; bootstraps resample with replacement to estimate sampling variability. Using one where the other is needed answers a different question than intended.
  • "A significant permutation p-value means the effect is large." No-statistical significance and effect size are different questions, exactly as in the effect size section above; always report a standardized effect size alongside the p-value.
  • "Exact permutation p-values can be arbitrarily small even for tiny samples." Not true-Worked Example 1 shows the smallest achievable p-value is bounded below by \( 2/N \), which can be surprisingly large (0.10 here) when \( N \) is small.
  • "You must always enumerate every permutation." No-Monte Carlo approximation with a large number of random resamples, as in Worked Example 2, gives an accurate p-value estimate without exhaustive enumeration once sample sizes make that impractical.

Interview Questions

  1. Explain the logic of a Permutation Test in plain language, without referencing any formula.
  2. Why does a Permutation Test require exchangeability rather than normality, and how could that assumption fail in practice?
  3. Derive the formula for the total number of distinct permutations in a two-group exact permutation test, and explain why it grows so quickly.
  4. What is the smallest possible exact p-value achievable with \( n_1 = n_2 = 3 \), and why does that floor exist?
  5. Explain the difference between an exact permutation test and a Monte Carlo permutation test, and when you would choose each.
  6. How is a Permutation Test conceptually related to the Mann-Whitney U Test?
  7. What is the key difference between permutation resampling and bootstrap resampling, and why does that distinction matter for what each method is used for?
  8. Why does scipy.stats.permutation_test require a fixed random seed for reproducibility, and what does that imply about Monte Carlo p-values in general?
  9. Could you build a Permutation Test around a correlation coefficient instead of a mean difference? Explain how the procedure would change.
  10. Under what circumstances would naive label-shuffling be an invalid choice of permutation scheme, and what alternative approach would you use instead?

Frequently Asked Questions

  • A Permutation Test (also called a randomization test) checks whether an observed difference between groups-in means, medians, or any other statistic of interest-is larger than what random chance alone could plausibly produce, by directly simulating the null hypothesis through repeated reshuffling of the data rather than assuming any theoretical distribution.
  • Pool all observations from every group into one combined set. Randomly reshuffle which observations belong to which group, keeping the original group sizes fixed, and recompute the test statistic (e.g., a difference in means) on this shuffled dataset. Repeat this thousands of times, or exhaustively for small samples, to build an empirical null distribution. The p-value is the proportion of these permuted statistics that are as extreme as, or more extreme than, the statistic observed in the real, unshuffled data.
  • The independent samples t-test compares two group means and relies on a theoretical t-distribution, which assumes normality and, in its classic form, equal variances. A Permutation Test makes no such distributional assumption-its null distribution is built empirically from the actual data through reshuffling, and it can be applied to virtually any test statistic, not only a difference in means.
  • The core assumption is exchangeability under the null hypothesis: if there truly is no group effect, any observation could just as easily have landed in any group, making every relabeling equally likely. Beyond exchangeability, no assumption about normality, equal variances, or any particular distributional shape is required-the main reason the test is so broadly applicable.
  • If the p-value-the fraction of permuted statistics at least as extreme as the one observed in the real data-is below your chosen significance level (commonly α = 0.05), you reject the null hypothesis and conclude the observed group difference is unlikely to be explained by chance alone. If the p-value is at or above α, there is not enough evidence to say the observed difference reflects a real effect rather than the particular way subjects happened to be grouped.
  • No, though the two are often confused. A Permutation Test resamples without replacement, reshuffling existing group labels to simulate the null hypothesis of no group effect-primarily a hypothesis-testing tool. A bootstrap resamples with replacement from the observed data to estimate a statistic's sampling variability-primarily a tool for building confidence intervals. Both are resampling methods, but they answer different questions.
  • No-in fact Permutation Tests are especially useful for small samples, where an exact test can enumerate every possible relabeling directly. For larger samples, where the number of possible permutations becomes computationally infeasible to enumerate exhaustively, a Monte Carlo approximation-randomly sampling a large number of permutations instead of all of them-is used, and remains accurate with enough resamples.
  • Yes-this is one of its biggest advantages. A Permutation Test can be built around essentially any test statistic: a difference in medians, a correlation coefficient, a difference in variances, an F-statistic, or a custom statistic specific to the research question, all using the exact same reshuffle-and-compare logic.

Key Takeaways

  • A Permutation Test builds its own null distribution by repeatedly reshuffling group labels and recomputing a test statistic, rather than comparing against a theoretical distribution-making it a broadly applicable, assumption-light alternative to classical parametric and non-parametric tests.
  • It is ideal when normality or equal variances can't be assumed, or when the statistic of interest doesn't have a convenient theoretical distribution attached to it.
  • Core assumption: exchangeability under \( H_0 \)-not normality. No distributional shape is required for the data itself.
  • For small samples, an exact test enumerates every possible relabeling; for larger samples, a Monte Carlo approximation randomly samples a large number of relabelings instead-scipy.stats.permutation_test(..., n_resamples=10000) handles both.
  • If \( p < 0.05 \), the observed difference is statistically significant; if \( p \geq 0.05 \), there isn't enough evidence of a real effect-but always check an effect size too, and remember exact p-values have a hard floor at very small sample sizes, as both worked examples above demonstrate.
  • If your test statistic is a simple mean difference and normality genuinely holds, the independent samples t-test will generally be faster and equally valid; if you specifically want a well-tabulated rank-based test, use the Mann-Whitney U Test; if your goal is a confidence interval rather than a hypothesis test, use a bootstrap instead.

The Permutation Test earns its place as one of the most conceptually honest tools in statistics precisely because it refuses to borrow a theoretical distribution it hasn't earned-instead of assuming the world behaves like a t-distribution or a chi-square table, it asks the data directly: how unusual is what we observed compared to every other plausible way these same observations could have been grouped? That directness comes at the cost of computation, not correctness-the same reshuffle-and-compare logic scales from a hand-enumerable 20-permutation toy example to a 10,000-resample Monte Carlo approximation on real data with almost no change in reasoning.

The two worked examples above show both sides of that logic in practice-one where an exact test's inherent p-value floor kept a visually convincing difference from reaching significance at a very small sample size, and one where a Monte Carlo approximation on the same training-method data used throughout this test-family confirmed the same conclusion already reached by the independent t-test and Mann-Whitney U Test. Reporting the p-value alongside a standardized effect size, as demonstrated throughout this guide, gives a complete and honest picture that a p-value by itself cannot.