D'Agostino-Pearson Test

Introduction
The D'Agostino-Pearson Test checks whether a sample of data plausibly comes from a normal distribution by looking at two specific, interpretable features of its shape: skewness (asymmetry) and kurtosis (tail weight and peakedness). Rather than comparing an entire cumulative distribution curve, it combines standardized versions of these two quantities into a single omnibus statistic-so a significant result doesn't just tell you normality failed, it tells you roughly why.
By the end of this article you will be able to state exactly when a D'Agostino-Pearson Test applies, compute the K-squared statistic completely by hand on two contrasting worked examples, read the skewness and kurtosis components separately to diagnose a significant result, know when to reach for the Shapiro-Wilk Test or Anderson-Darling Test instead, and run the same test in one line of Python with scipy.stats.
What Is the D'Agostino-Pearson Test?
Developed by Ralph D'Agostino and Egon Pearson, and formalized in their 1973 paper, the test takes a different route to normality testing than distribution-comparison methods like Anderson-Darling or order-statistic methods like Shapiro-Wilk. It starts from two moments of the sample beyond the mean and variance: the third standardized moment (skewness, \( g_1 \)) and the fourth standardized moment (kurtosis, \( g_2 \)).
Each of these is transformed into an approximately standard normal quantity-corrected for the fact that, in finite samples, skewness and kurtosis estimates are themselves skewed and slow to converge to normality. Squaring and summing these two transformed z-scores produces the K-squared statistic, which follows an approximate chi-square distribution with 2 degrees of freedom under the null hypothesis of normality.
When to Use It
Use the D'Agostino-Pearson Test whenever you need to check whether continuous data is consistent with a normal distribution and you want a result that's easy to diagnose-that is, you want to know not just whether normality is rejected, but whether asymmetry, unusual tail weight, or both are responsible.
| Scenario | What's Being Checked | Good Fit? |
|---|---|---|
| Checking residuals before a parametric test (t-test, ANOVA, linear regression) | Are the residuals plausibly normal? | Yes |
| Deciding between a skewness-driven transform (log, Box-Cox) and no transform | Is the departure mainly skewness, mainly kurtosis, or both? | Yes-component breakdown is especially useful here |
| Quality control or process-monitoring data with moderate-to-large sample sizes | Has the underlying process distribution drifted from normal? | Yes |
| Very small samples (fewer than 8 observations) | Any normality question | No-use Shapiro-Wilk instead |
| Need maximum raw statistical power for a normality decision alone | Normality, no diagnostic breakdown needed | Shapiro-Wilk is often somewhat more powerful |
Key Assumptions
- Continuous data. The test relies on computing sample skewness and kurtosis, which assume an underlying continuous measurement scale.
- Independent, identically distributed observations. As with virtually all classical goodness-of-fit tests, the sample should consist of independent draws from the same underlying distribution.
- Minimum sample size. The skewness and kurtosis transformations used to build K-squared were derived for moderate-to-large samples-most implementations, including
scipy.stats.normaltest, require at least 8 observations, and the chi-square approximation improves further as \( n \) grows. - No extreme rounding or excessive ties. Heavily rounded data can distort the skewness and kurtosis estimates the test depends on.
Hypotheses
- Null Hypothesis (\( H_0 \)): the sample was drawn from a normal distribution.
- Alternative Hypothesis (\( H_1 \)): the sample was not drawn from a normal distribution-that is, it departs in skewness, kurtosis, or both.
(As with other normality tests, failing to reject \( H_0 \) never proves the data is normal-it only means the test did not find enough evidence, in this sample, to rule normality out.)
The Formula, Explained
Let \( n \) be the sample size, and let \( g_1 \) and \( g_2 \) denote the sample skewness and sample excess kurtosis. The test first transforms each into an approximately standard normal quantity.
Skewness component. The standard error of skewness under normality is:
\[ \sqrt{\frac{6n(n-1)}{(n-2)(n+1)(n+3)}} \]This is used, together with a further variance-stabilizing transformation (D'Agostino, 1970), to convert \( g_1 \) into a quantity \( Z_1 \) that is approximately standard normal even in moderate samples where the raw skewness statistic is itself skewed.
Kurtosis component. Similarly, the sample excess kurtosis \( g_2 \) is standardized using its own sample-size-dependent mean and variance under normality, then passed through a further transformation (Anscombe & Glynn, 1983) to produce \( Z_2 \), also approximately standard normal.
Combining into K-squared. The two transformed, independent standard normal quantities are squared and summed:
\[ K^2 = Z_1^2 + Z_2^2 \]Under \( H_0 \), \( K^2 \) follows an approximate chi-square distribution with 2 degrees of freedom, since it is the sum of two squared, approximately independent standard normal variables. A larger \( K^2 \) indicates a bigger combined departure from normality in skewness, kurtosis, or both.
Worked Example 1: A Roughly Symmetric Sample
Suppose 10 measurements are collected:
| \( i \) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| \( x_i \) | 48 | 50 | 51 | 49 | 52 | 47 | 50 | 53 | 49 | 51 |
The sample mean is \( \bar{x} = 50.0 \) and the sample standard deviation is \( s \approx 1.795 \). Computing the sample skewness gives \( g_1 \approx 0.048 \)-very close to zero, consistent with a roughly symmetric shape-and the sample excess kurtosis gives \( g_2 \approx -1.086 \), somewhat flatter than a normal curve (platykurtic).
Applying the standard-error and variance-stabilizing transformations for \( n = 10 \) gives standardized components of approximately \( Z_1 \approx 0.083 \) and \( Z_2 \approx -1.244 \). Combining them:
\[ K^2 = Z_1^2 + Z_2^2 \approx (0.083)^2 + (-1.244)^2 \approx 1.554 \]Comparing \( K^2 \approx 1.554 \) against the chi-square distribution with 2 degrees of freedom gives a p-value of approximately \( 0.460 \). Since this is well above 0.05, we fail to reject \( H_0 \)-this sample is entirely consistent with having been drawn from a normal distribution, and neither the modest skewness nor the mild flatness is large enough, at this sample size, to be statistically significant.
Worked Example 2: A Skewed Sample
Now suppose 12 values are collected from a process with a long right tail-common in variables like wait times or transaction amounts:
| \( i \) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| \( x_i \) | 2 | 3 | 3 | 4 | 4 | 4 | 5 | 5 | 6 | 7 | 9 | 18 |
The sample mean is \( \bar{x} = 5.833 \) and the sample standard deviation is \( s \approx 4.219 \). Computing the sample skewness gives \( g_1 \approx 2.104 \)-a strong positive skew driven by the single large value of 18-and the sample excess kurtosis gives \( g_2 \approx 4.635 \), noticeably more peaked-with-heavier-tails than a normal curve (leptokurtic).
Applying the transformations for \( n = 12 \) gives standardized components of approximately \( Z_1 \approx 2.564 \) and \( Z_2 \approx 1.881 \). Combining them:
\[ K^2 = Z_1^2 + Z_2^2 \approx (2.564)^2 + (1.881)^2 \approx 10.14 \]Comparing \( K^2 \approx 10.14 \) against the chi-square distribution with 2 degrees of freedom gives a p-value of approximately \( 0.0063 \). Since this is well below 0.05, we reject \( H_0 \)-and because the skewness component (\( Z_1 \approx 2.564 \)) is larger than the kurtosis component (\( Z_2 \approx 1.881 \)), the departure is driven primarily by asymmetry, exactly what we'd expect from a sample with one large right-tail value pulling the distribution's shape.
Python Example
In practice you'll almost never compute \( K^2 \) by hand. Python's scipy.stats.normaltest implements the D'Agostino-Pearson Test directly and returns the statistic with a p-value:
from scipy import stats
data = [48, 50, 51, 49, 52, 47, 50, 53, 49, 51]
statistic, p_value = stats.normaltest(data)
print(f"K-squared statistic: {statistic:.4f}")
print(f"p-value: {p_value:.4f}") Output:
K-squared statistic: 1.5540
p-value: 0.4598 This matches Worked Example 1, and the p-value of 0.4598 sits well above 0.05, confirming we fail to reject \( H_0 \). If you want the individual skewness and kurtosis components rather than just the combined statistic, scipy.stats.skewtest and scipy.stats.kurtosistest expose \( Z_1 \) and \( Z_2 \) separately-useful for the diagnostic breakdown described in Reading the Skewness and Kurtosis Components.
How to Interpret Results
| Result | Interpretation |
|---|---|
| p-value \( \ge \) significance level (e.g. 0.05) | Fail to reject \( H_0 \)-no significant evidence against normality |
| p-value \( < \) significance level | Reject \( H_0 \)-sample significantly departs from normality |
| Significant result, large \( |Z_1| \), small \( |Z_2| \) | Departure driven mainly by skewness (asymmetry) |
| Significant result, small \( |Z_1| \), large \( |Z_2| \) | Departure driven mainly by kurtosis (tail weight/peakedness) |
| Significant result, both \( |Z_1| \) and \( |Z_2| \) large | Departure driven by both asymmetry and unusual tail behavior |
Because K-squared is a sum of two separately meaningful components, a significant result is worth following up by checking the skewness and kurtosis components individually-see Reading the Skewness and Kurtosis Components for what each pattern typically implies about your data.
Reading the Skewness and Kurtosis Components
The single biggest practical advantage of the D'Agostino-Pearson Test over a purely omnibus statistic is that \( K^2 \) decomposes cleanly into two pieces you can inspect on their own:
- A large \( Z_1 \) (skewness component) alone suggests the sample is asymmetric-common in income, wait-time, and count-like data-and often points toward a log or Box-Cox transform, or a model that doesn't assume symmetry, as in Worked Example 2.
- A large \( Z_2 \) (kurtosis component) alone suggests the sample has heavier or lighter tails than a normal distribution, without necessarily being asymmetric-common in financial returns (heavy tails) or bounded/rounded measurement data (light tails).
- Both large suggests a compound departure-often a skewed distribution with a few extreme values in the long tail, which is precisely the pattern that inflates both components at once.
This diagnostic clarity is something tests like Shapiro-Wilk or Anderson-Darling don't provide directly- they'll tell you normality was rejected, but not which aspect of shape is responsible without further plotting.
Common Pitfalls and How to Avoid Them
- Using it on very small samples. With fewer than 8 observations the skewness and kurtosis transformations the test relies on become unreliable-most software, including scipy, will raise a warning or refuse to run; use Shapiro-Wilk instead for small samples.
- Treating a non-significant result as proof of normality. A p-value above 0.05 means insufficient evidence of a departure was found, not that normality is confirmed.
- Ignoring the component breakdown. Reporting only the combined K-squared and p-value discards the test's main advantage-always check \( Z_1 \) and \( Z_2 \) separately when a result is significant, as in Reading the Skewness and Kurtosis Components.
- Over-relying on significance with very large samples. As with most goodness-of-fit tests, extremely large samples can flag trivially small departures from normality as statistically significant-always look at the effect size (the magnitude of \( g_1 \) and \( g_2 \) themselves) and a Q-Q plot alongside the p-value.
- Applying the test to heavily rounded or discrete data. Coarse rounding distorts the skewness and kurtosis estimates the test is built on.
Advantages
- Decomposes cleanly into interpretable skewness and kurtosis components, making a significant result easy to diagnose.
- Well suited to moderate-to-large samples common in quality control, survey data, and residual checking.
- Conceptually intuitive-directly tests the two shape properties (asymmetry and tail weight) that most commonly distinguish real data from a normal distribution.
- Fast to compute and widely implemented, with a straightforward chi-square reference distribution.
- Useful as a quick screening step before deciding whether a data transformation should target skewness, kurtosis, or both.
Limitations
- Requires a minimum sample size. Most implementations require at least 8 observations, and the chi-square approximation is more accurate as \( n \) grows further-see Common Pitfalls.
- Generally somewhat less powerful than Shapiro-Wilk overall. For pure normality detection without needing a diagnostic breakdown, Shapiro-Wilk is often the more powerful general-purpose choice.
- Only two moments considered. The test captures departures visible in skewness and kurtosis but can, in principle, miss unusual distribution shapes that happen to have normal-like third and fourth moments.
- Sensitive to sample size for significance, not effect size. Like other goodness-of-fit tests, a significant K-squared indicates departure but not directly how practically important that departure is.
- Designed for continuous data. Heavily rounded or discrete data can distort the skewness and kurtosis estimates it depends on.
When NOT to Use It
- When the sample has fewer than 8 observations-use the Shapiro-Wilk Test instead.
- When you need the single most statistically powerful normality test available and don't need a skewness/kurtosis breakdown-Shapiro-Wilk is often preferable.
- When tail behavior specifically, rather than a general shape check, is the primary concern-the Anderson-Darling Test weights the tails more directly.
- When the data is discrete, heavily rounded, or contains many tied values.
- When you're testing goodness-of-fit against a distribution other than normal-this test is specific to normality.
D'Agostino-Pearson vs Shapiro-Wilk vs Anderson-Darling
| Aspect | D'Agostino-Pearson | Shapiro-Wilk | Anderson-Darling |
|---|---|---|---|
| What it measures | Combined standardized skewness and kurtosis | Correlation of ordered values with expected normal order statistics | Weighted discrepancy across the whole distribution, tails emphasized |
| Target distributions | Normal only | Normal only | Any continuous distribution (with appropriate critical values) |
| Diagnostic breakdown | Yes-skewness and kurtosis components reported separately | No-single statistic only | No-single statistic only |
| Minimum sample size | Typically 8+ | Works well even for small samples (as few as 3-4) | Works for small samples, but power is limited |
| Typical output | K-squared statistic with a p-value (chi-square, 2 df) | W statistic with a p-value | A-squared compared against critical values (or approximate p-value) |
| Overall power for normality alone | Good, slightly below Shapiro-Wilk in many scenarios | Generally the most powerful choice for normality alone | Good, especially with outliers or heavy tails |
Common Misconceptions
- "D'Agostino-Pearson is just a weaker version of Shapiro-Wilk." It's often slightly less powerful overall, but it offers a diagnostic breakdown into skewness and kurtosis that Shapiro-Wilk doesn't-see Comparisons.
- "A significant result means the data is unusable for a t-test or ANOVA." Many parametric tests are fairly robust to mild departures from normality, especially with moderate sample sizes-check the magnitude of \( g_1 \) and \( g_2 \), not just significance.
- "K-squared close to zero is 'more normal' in a meaningful way." K-squared only reflects how far skewness and kurtosis are from their normal-theory expected values-it isn't a continuous "normality score" beyond the hypothesis test itself.
- "You can run this test on any sample size." Very small samples (fewer than 8) violate the assumptions behind the skewness and kurtosis transformations-see Key Assumptions.
- "A non-significant result proves the data is normal." It only means no significant departure was detected given the sample-especially relevant with smaller samples that have limited power.
Interview Questions
- Explain in your own words what the D'Agostino-Pearson K-squared statistic measures, and how it differs from the Shapiro-Wilk statistic.
- Why does K-squared follow a chi-square distribution with 2 degrees of freedom under the null hypothesis?
- Why can't you just use raw sample skewness and kurtosis directly as z-scores, without the additional transformations D'Agostino and Pearson introduced?
- When would you prefer the D'Agostino-Pearson Test over the Shapiro-Wilk Test, and vice versa?
- How would you explain to a colleague that a significant D'Agostino-Pearson result was driven almost entirely by skewness rather than kurtosis?
- Why does the test require a minimum sample size, and what would you do instead for a sample of 5 observations?
- How does the D'Agostino-Pearson Test compare to the Anderson-Darling Test in terms of what kind of departure from normality each is best at detecting?
- What follow-up analysis would you do after a significant result where both the skewness and kurtosis components are large?
- Can the D'Agostino-Pearson Test be used to test goodness-of-fit against distributions other than normal? Why or why not?
- Describe a real-world scenario where knowing whether a normality departure is due to skewness versus kurtosis would change what you do next with the data.
Frequently Asked Questions
- The D'Agostino-Pearson Test is a goodness-of-fit test that checks whether a sample plausibly comes from a normal distribution. It works differently from tests that compare the entire empirical distribution shape-instead, it builds its statistic from two specific, well-understood features of the data: skewness, which measures asymmetry, and kurtosis, which measures tail weight and peakedness relative to a normal curve. Combining standardized versions of both into a single omnibus statistic lets the test flag either type of departure, or both at once.
- The K-squared statistic is the sum of two squared, sample-size-corrected z-scores: one built from the sample skewness (transformed to be approximately normal even in moderate samples) and one built from the sample kurtosis (transformed the same way). Because both components are approximately standard normal under the null hypothesis and are combined as squares, K-squared follows an approximate chi-square distribution with 2 degrees of freedom when the data is truly normal.
- Compare the K-squared statistic to the chi-square distribution with 2 degrees of freedom to obtain a p-value, exactly as with any chi-square test. A p-value below your significance threshold, typically 0.05, means you reject the null hypothesis and conclude the sample significantly departs from normality. Because the statistic decomposes into a skewness component and a kurtosis component, you can also look at each piece separately (most software reports them) to understand whether the departure is driven by asymmetry, unusual tail weight, or both.
- Both are normality tests, but they take different approaches. The Shapiro-Wilk Test measures how well the ordered sample values correlate with the values you would expect under normality, producing a single statistic that is often the most statistically powerful general-purpose choice for normality testing. The D'Agostino-Pearson Test instead explicitly separates skewness and kurtosis, trading a small amount of raw power in some situations for a result that is easier to diagnose-you can immediately tell whether asymmetry, tail weight, or both are responsible for a significant finding.
- The test assumes continuous data with independent, identically distributed observations. It also needs a reasonably sized sample: the skewness and kurtosis transformations the test relies on were derived to work well in moderate-to-large samples, and most implementations, including scipy's normaltest, enforce a minimum of 8 observations because the approximations break down below that.
- A perfectly normal distribution has zero skewness and a kurtosis matching the normal baseline. In practice, departures from normality tend to show up as one or both of these: a skewed distribution (like income or reaction times), or a distribution with heavier or lighter tails than normal (common in financial returns or measurement data with occasional extreme values). By standardizing and combining both quantities into one omnibus K-squared statistic, the test is built to catch either kind of departure-or a combination of both-within a single hypothesis test.
Key Takeaways
- The D'Agostino-Pearson Test combines standardized sample skewness and kurtosis into a single omnibus \( K^2 \) statistic to test for normality.
- \( K^2 = Z_1^2 + Z_2^2 \) follows an approximate chi-square distribution with 2 degrees of freedom under \( H_0 \), where \( Z_1 \) and \( Z_2 \) are transformed skewness and kurtosis z-scores.
- Unlike Shapiro-Wilk or Anderson-Darling, it decomposes cleanly into separately interpretable skewness and kurtosis components, making a significant result easy to diagnose-see Reading the Skewness and Kurtosis Components.
- It requires a reasonably sized sample, typically at least 8 observations, since the underlying transformations were derived for moderate-to-large samples.
- In Python,
scipy.stats.normaltestreturns the K-squared statistic and p-value directly, withskewtestandkurtosistestavailable for the component breakdown. - For maximum raw power on normality alone, without needing a diagnostic breakdown, the Shapiro-Wilk Test is often somewhat more powerful.
- A non-significant result never proves the data is normal-it only means no significant departure was detected given the sample size and data at hand.
The D'Agostino-Pearson Test earns its place in the normality-testing toolkit not by being the single most powerful option-Shapiro-Wilk often edges it out overall-but by answering a more specific, practically useful question: not just whether a sample departs from normality, but which aspect of its shape is responsible. By building its statistic directly from skewness and kurtosis, a significant result comes with a built-in explanation rather than requiring a separate follow-up plot.
The two worked examples above show how directly the test reads from a sample's mean, standard deviation, skewness, and kurtosis-a roughly symmetric sample produces a small \( K^2 \) safely above the 0.05 p-value threshold, while a sample with a single large right-tail value produces a large, mostly skewness-driven \( K^2 \) that clears significance decisively. Check both components whenever the test rejects normality, use Shapiro-Wilk when the sample is too small or when raw power matters more than diagnosis, and reach for Anderson-Darling when tail behavior specifically-rather than shape in general-is the primary concern.