HomeAll GategoriesOne Way ANOVA Calculator - Free Online F Test Tool

One Way ANOVA Calculator – Free Online F Test Tool

One Way ANOVA Calculator

Paste comma separated numbers for three or more groups, or upload a CSV, and get the complete one way ANOVA table in seconds: F ratio, p value, eta squared, omega squared, Welch's robust F, Tukey HSD and Games-Howell post hoc comparisons, Shapiro-Wilk and Levene assumption checks, four colour charts and an APA ready results sentence.

ParametricHypothesis TestThree or More GroupsF TestEffect SizePost HocFree

0. Quick Answer

A one way ANOVA tests whether three or more group means differ, by dividing the variation between groups by the variation inside them to give an F ratio.

One factor, one continuous outcome, independent groups. A large F means the group means are spread further apart than the noise inside each group can explain. The p value says how often that would happen by chance if every population mean were identical. The test tells you that at least one mean differs, never which one, so a post hoc test comes next.

F = MSbetween ÷ MSwithin = (SSB ÷ (k − 1)) ÷ (SSW ÷ (N − k))

Rule of thumb: reject the null when p is below 0.05. Worked example on this page: three teaching methods, 8 students each, F(2, 21) = 19.06, p < 0.001, η2 = 0.645, so group explains 64.5% of the variance, a large effect.

Key takeaways

  • This one way ANOVA calculator returns the full ANOVA table, the p value, four effect sizes and post hoc comparisons from data you paste as 52, 48, 55, 61, 47.
  • The F ratio is a signal to noise ratio: MSbetween divided by MSwithin, judged against the F distribution with k − 1 and N − k degrees of freedom.
  • Report the effect size beside the p value. Eta squared of 0.01, 0.06 and 0.14 mark small, medium and large; omega squared is the less biased version for small samples.
  • Check two assumptions before you trust the answer: Shapiro-Wilk on the residuals for normality and Levene's test for equal variances.
  • If variances differ, use Welch's one way ANOVA with Games-Howell post hoc tests. If the residuals are badly non-normal, cross-check with Kruskal-Wallis.

📚 1. What Is a One Way ANOVA?

A one way ANOVA, short for one way analysis of variance, extends the independent samples t test to three or more groups. It tests the null hypothesis that all group population means are equal, by partitioning the total variance in the outcome into a between groups component and a within groups component. One categorical factor, one continuous dependent variable, independent observations.

What it actually measures. Imagine every observation sitting on a number line. Some of the spread comes from the fact that people are in different groups, and some comes from the fact that people inside the same group still differ. ANOVA measures both, then divides one by the other. If group membership matters, the between groups part is large relative to the within groups part and F is well above 1. If group membership means nothing, both parts estimate the same error variance and F sits near 1.

Why not just run several t tests? Because each test carries its own 5% false positive risk. With three groups you would run three t tests and the chance of at least one false positive rises to about 14%. With five groups you would run ten tests and the risk passes 40%. ANOVA asks the question once, at one alpha level, and keeps the error rate where you set it.

A worked one-liner. Three teaching methods, 8 students each. Means 53.00, 65.00 and 56.63. SSbetween = 606.08 over 2 degrees of freedom gives MSbetween = 303.04. SSwithin = 333.88 over 21 degrees of freedom gives MSwithin = 15.90. So F = 303.04 / 15.90 = 19.06, p < 0.001.

How a one way ANOVA splits the variationgrand meanGroup 1Group 2Group 3dotted line = distance from a value to its own group mean, this is WITHIN groups variationsolid arrow = distance from a group mean to the grand mean, this is BETWEEN groups variationF = (between groups variation per df) divided by (within groups variation per df)
The idea in one picture. Between groups variation is how far the three group means sit from the grand mean. Within groups variation is how far each observation sits from its own group mean. F is the first divided by the second, after each is turned into a mean square.

Who uses it. Psychologists comparing three experimental conditions. Agronomists comparing fertiliser treatments across field plots. Clinical researchers comparing a placebo with two drug doses. Educators comparing teaching methods. Manufacturing engineers comparing machines or suppliers. Ecologists comparing species richness across habitat types. Anywhere one grouping variable splits a continuous measurement into three or more independent samples.

1.1 One way ANOVA compared with its nearest relatives

TestUse it whenWhat it assumesWhat you report
One way ANOVAOne factor, three or more independent groupsNormal residuals, equal variances, independenceF(df1, df2), p, η2
Independent t testExactly two independent groupsSame as ANOVAt(df), p, Cohen's d
Welch's one way ANOVAThree or more groups with unequal variancesNormal residuals onlyF(df1, adjusted df2), p
Kruskal-Wallis HThree or more groups, non-normal or ordinal dataSimilar distribution shapesH(df), p, ε2
Repeated measures ANOVAThe same subjects measured under every conditionSphericity, normal residualsF(df1, df2), p, partial η2
Two way ANOVATwo categorical factors and their interactionSame as one way, plus a balanced design ideallyTwo main effects and one interaction
ANCOVAGroup comparison with a continuous covariate to controlHomogeneity of regression slopesAdjusted means, F, partial η2

The most common mistake is using a one way ANOVA when the same people were measured more than once. That is a repeated measures design, and treating it as independent groups throws away the pairing and usually loses power.

🧮 2. Set Up Your Data

Used in the report, the export and the reporting templates. Leave blank and everything falls back to "the study sample".

Comma separated input is the default. One group per box, values separated by commas exactly as the placeholder shows. Newlines, tabs, spaces and semicolons also work, so a column copied straight out of Excel pastes cleanly. Every group name is editable, so type the real condition name and it flows into the tables, all four charts and the exported report.

Accepts .csv, .txt, .xlsx and .xls. The first row is treated as column headers. Nothing is uploaded to a server: the file is read inside your own browser.

Type one value per cell. Each column is one group, and every column title is editable, so rename Traditional, Flipped or Online to whatever your conditions are called. Use the × button on a column or a row to remove it. Empty cells are ignored, so columns of different lengths are fine.

Nothing is analysed until you press Use this table, which copies these columns back to the first tab as clusters, and then Run One Way ANOVA.


Nothing is computed until you press the button. Changing any input clears the results so you never read stale numbers.

📊 3. Results

Enter or load your groups above, then press Run One Way ANOVA. The ANOVA table, p value, effect sizes, assumption checks, post hoc comparisons, four charts and the auto filled reporting sentences will appear here.

🧠 4. Interpretation of Results, In Detail

Run the calculator above and this block fills with your own numbers. The twelve sub-sections below explain every part of the output whether you have run it or not.

4.1 What the F ratio is, in words

F is a ratio of two variances. The numerator, the between groups mean square, asks how far apart the group means are. The denominator, the within groups mean square, asks how much people differ from their own group mean. Both are estimates of the same error variance when the null hypothesis is true, so F sits near 1. When the groups really differ, only the numerator grows, and F climbs above 1.

That is why F can never be negative and why the test is always one tailed on the right. There is no such thing as a significantly small F in a normal ANOVA. A very small F, well below 1, sometimes signals a different problem: data that are too neat, such as fabricated numbers or a design where the groups were matched too closely.

4.2 Reading the p value correctly

The p value is the probability of getting an F ratio at least as large as yours if every population mean were truly identical. It is not the probability that the null hypothesis is true, and 1 minus p is not the probability that your alternative is true. A p of 0.03 does not mean there is a 97% chance the groups differ.

Compare p with the alpha you set before seeing the data, usually 0.05. Below alpha, you reject the null and say at least one mean differs. At or above alpha, you retain the null and say this study could not detect a difference. Retaining the null is never proof that the groups are the same, only that the evidence was not strong enough to separate them.

4.3 Degrees of freedom, and why they must be reported

A one way ANOVA has two degrees of freedom values and both belong in the write up. The first, df1 = k − 1, counts the number of independent comparisons between group means. The second, df2 = N − k, counts the observations left over once each group mean has been estimated.

Written as F(2, 21) = 19.06, the reader can immediately reconstruct your design: 3 groups and 24 observations. That is why journals insist on the bracketed pair. If you see F(2, 21) but the paper reports 30 participants, something is wrong, usually undeclared missing data.

4.4 Effect size: eta squared, omega squared and Cohen's f

The p value tells you whether an effect is detectable. The effect size tells you how big it is, and only the second one is comparable across studies. Eta squared is the share of the total sum of squares that belongs to the between groups term, so it is read directly as a percentage of variance explained. Cohen's benchmarks are 0.01 small, 0.06 medium and 0.14 large, and they are conventions rather than laws.

Eta squared is biased upward, because sampling noise always inflates the between groups sum of squares a little. Omega squared subtracts an estimate of that noise and is the better statistic when group sizes are small, which is why this calculator reports both. With 30 or more per group the two are usually close. With 5 per group they can differ noticeably, and the honest choice is omega squared.

Cohen's f is a third scale, defined as the square root of eta squared over one minus eta squared. It exists because G*Power and most power calculators ask for f rather than eta squared. Benchmarks are 0.10 small, 0.25 medium and 0.40 large.

4.5 The omnibus trap: F is significant, so what now?

A significant F is not the finding. It is permission to go looking for the finding. It says at least one of the k means differs from at least one other, which with four groups leaves six possible pairwise stories and no way to choose between them from F alone.

Post hoc tests answer the follow-up question while keeping the family-wise error rate under control. Tukey HSD is the standard choice for equal variances and roughly equal group sizes. Games-Howell is the right choice when variances differ, because it uses each pair's own variances and its own degrees of freedom. Bonferroni works anywhere but is conservative, and it loses power quickly as the number of comparisons grows.

4.6 What to do when Levene's test fails

Levene's test asks whether group variances are equal. When its p value falls below 0.05, the classic F test's denominator is no longer a fair estimate of a single common error variance, and the reported p value can be badly wrong, especially with unequal group sizes.

The direction of the error is worth knowing. If the larger group also has the larger variance, the F test becomes conservative and you lose power. If the smaller group has the larger variance, F becomes liberal, meaning your true false positive rate is above the 5% you think you are running. That second case is the dangerous one. Welch's one way ANOVA fixes both, and modern statistical advice increasingly says to use Welch by default rather than testing first and switching.

4.7 What to do when normality fails

ANOVA assumes the residuals are normal, not the raw data, and not each group's raw data. With equal group sizes the F test is remarkably robust: even quite skewed residuals leave the false positive rate close to 5% once each group has around 15 observations, thanks to the central limit theorem.

The failures that matter are heavy outliers and strong skew in small samples. Inspect the Q-Q plot rather than relying on the Shapiro-Wilk p value alone, because with large N the test flags trivial departures and with small N it misses real ones. If the Q-Q plot bends badly, options are a transformation such as the log or square root, a Kruskal-Wallis test on ranks, or a bootstrap or permutation version of the F test.

4.8 Sample size, power and the non-significant result

A non-significant ANOVA has two possible causes, and they are very different. Either there is genuinely no difference, or there is one and this study was too small to see it. The p value cannot tell you which.

The way to tell them apart is a power calculation using the Cohen's f the calculator reports. As a rough guide, detecting a medium effect (f = 0.25) across three groups at 80% power needs about 53 observations per group. Detecting a large effect (f = 0.40) needs about 22 per group. If your study had 10 per group, a null result is nearly uninformative, and saying so is better science than claiming the groups are the same.

4.9 Confidence intervals do more work than the p value

Every group mean in the results table carries a 95% confidence interval built on the pooled error term, and every post hoc comparison carries an interval on the difference. Those intervals carry more information than the p value, because they show both the direction and the plausible size of the effect.

The reading rule is simple. If a difference interval excludes zero, that pair differs at your alpha. If it includes zero, it does not. But an interval running from −0.2 to 0.4 says something quite different from one running from −18 to 22, even though both include zero and both give p above 0.05. The first rules out a large effect; the second rules out nothing.

4.10 Common mistakes this calculator prevents

  • Running three t tests instead of one ANOVA. The calculator does the omnibus test first and only then breaks it down, with the correction applied.
  • Reporting a p value with no effect size. Four effect sizes are computed automatically, and the APA sentence includes one.
  • Ignoring unequal variances. Levene's test runs on every analysis, and Welch's F is computed alongside the classic F whether you asked for it or not.
  • Quoting F without its degrees of freedom. Every output block writes them as F(df1, df2).
  • Reading post hoc tests after a non-significant F. The tool prints a warning when you do.
  • Treating repeated measurements as independent groups. The assumption panel names this explicitly as something only you can confirm.
  • Rounding p to 0.000. Small p values are shown as less than 0.0001 rather than as zero, which is never a correct p value.

4.11 How to decide what to report

What the checks sayHeadline test to reportPost hoc to use
Normality passes, Levene passesClassic one way ANOVA FTukey HSD
Normality passes, Levene failsWelch's one way ANOVA FGames-Howell
Normality fails, groups are balanced and n is 15 or more eachClassic F, with the Kruskal-Wallis result as a footnoteTukey HSD
Normality fails badly, or n is smallKruskal-Wallis HDunn's test with a Holm correction
Both fail and outliers are driving itReport both, and investigate the outliers before anything elseGames-Howell, treated as exploratory

4.12 A note on multiple outcomes

Running a separate one way ANOVA on each of ten outcome variables reintroduces exactly the multiplicity problem ANOVA was designed to solve, one level up. If the outcomes are conceptually one construct, MANOVA is the right test. If they are separate questions, say so in advance, pre-register them, and correct across the family with Holm or a false discovery rate procedure. Silence on this point is the single most common reason a reviewer asks for a revision.

5. How to Write Your Results in Research

▶ Run the analysis above to auto-fill all five templates with your own numbers.

When reporting one way ANOVA results, four things must appear together: the F ratio with both degrees of freedom, the exact p value, an effect size, and the descriptive statistics for every group. A sentence missing any one of those cannot be interpreted or reproduced by a reader.

5.1 The Methods sentence

Say which test you ran, why, at what alpha, in which software, and what you planned to do if an assumption failed. Write it in the past tense and in the passive or first person plural, whichever your field prefers. State the post hoc method here, not in the Results, because choosing it after seeing the p values is a form of data dredging.

5.2 The Results sentence

Template 1, APA 7th Edition
A one-way ANOVA showed ___ effect of group on the outcome, F(___, ___) = ___, p = ___, η2 = ___.
📌 Key conventions for this style
  • Italicise F, p, M, SD and n. Do not italicise Greek letters such as η or ω.
  • Report exact p values to two or three decimals. Use p < .001 only below that threshold.
  • APA drops the leading zero from any statistic that cannot exceed 1, so write p = .03 and η2 = .64, not 0.03 and 0.64.
  • Always give both degrees of freedom inside the brackets, between groups first.
  • State the effect size in the same sentence as the p value, never in a separate afterthought.
Template 2, Thesis or Dissertation
A one-way analysis of variance was conducted to compare ___ groups. ___
📌 Key conventions for this style
  • Examiners expect the assumption checks reported with their statistics, not just claimed.
  • Name the software and version: R 4.4.1, SPSS 29, Python 3.12 with SciPy 1.14.
  • Say what you did about missing data before you say what you found.
  • Justify the post hoc method by reference to Levene's test, and say the choice was planned.
  • Put the full descriptive table in the text or an appendix, and refer to it by number.
Template 3, Plain-Language Summary
We compared ___ groups. The groups ___ differ by more than chance would explain. ___
📌 Key conventions for this style
  • No symbols at all. No F, no p, no eta squared.
  • Say "more than chance would explain" rather than "statistically significant".
  • Give the direction and the size in real units, not in standard deviations.
  • Say plainly that group averages do not predict individuals.
  • Never write that the study "proved" anything.
Template 4, Structured Abstract or Poster
Methods: one-way ANOVA, alpha = ___. Results: F(___, ___) = ___, p = ___, eta squared = ___.
📌 Key conventions for this style
  • Abstracts have a word limit, so drop the assumption detail and keep the four core numbers.
  • Keep decimal places consistent down every column of a poster table.
  • Declare the format once, for example "mean (SD)", and use it everywhere.
  • Give N in the Methods line so the reader can check the degrees of freedom.
  • A poster figure with confidence intervals communicates faster than the same numbers in text.
Template 5, Replication or Pre-Registration
Hypothesis: the ___ group means are equal. Planned analysis: one-way ANOVA at alpha = ___, with ___ post hoc tests. ___
📌 Key conventions for this style
  • State the null and alternative hypotheses in symbols before any data are collected.
  • Pre-specify the assumption fallback rule, for example "Welch if Levene p < .05".
  • Pre-specify the exclusion rules for outliers, with a numeric criterion.
  • Give the target sample size and the effect size it was powered to detect.
  • Link the data and analysis script, and say which parts are exploratory.

5.3 Table and figure conventions

Give the ANOVA table its own numbered table with the four standard columns: source, SS, df, MS, F and p. Put descriptive statistics in a separate table, one row per group, with n, mean, SD and the confidence interval. Never repeat in the text every number that already appears in a table; quote only the F statistic and the effect size.

For figures, a bar chart of means with 95% confidence interval whiskers is the standard, and the caption must say what the whiskers represent. An unlabelled error bar is grounds for revision at most journals, because standard deviation, standard error and confidence interval whiskers look identical and mean quite different things.

5.4 The Discussion sentence

The Discussion turns statistics into meaning. Name the direction of the difference, its size in the units your readers care about, and the practical consequence. Then name the limits: the design, the sample, the assumptions that were shaky, and the comparisons that were exploratory rather than planned. Resist the urge to explain a non-significant result as though it were significant.

5.5 Reporting checklist

  • F ratio with both degrees of freedom, written as F(df1, df2)
  • Exact p value, or p < .001 when smaller
  • At least one effect size, with the benchmark you are reading it against
  • n, mean and SD for every group
  • The assumption checks with their own statistics, not just a claim
  • The post hoc method, named and justified, with confidence intervals on each comparison
  • The alpha level, and whether it was corrected across multiple outcomes
  • The software and version used

6. Formulas Used

Seven formulas do all the work in a one way ANOVA. They run from the raw sums of squares up to the effect size and the confidence interval, and every symbol in every equation is defined underneath it.

The F Ratio, the test statistic
F = MSbetween ÷ MSwithin
FThe test statistic, unitless, compared against the F distribution with df1 and df2
MSbetweenBetween groups mean square, in squared units of the outcome
MSwithinWithin groups mean square, also called the mean square error, in squared units
Range0 to infinity. F can never be negative, so the test is always right tailed
RuleF near 1 means the group means are no further apart than chance predicts
Example303.0417 ÷ 15.8988 = 19.0607 on the worked dataset
Between Groups Sum of Squares
SSB = Σ ni (x̄i − x̄G)2
SSBSum of squares between groups, the variation explained by group membership
niNumber of observations in group i, a count
iMean of group i, in the units of the outcome
GGrand mean of all N observations together
NoteEach squared gap is weighted by group size, so a large group pulls harder
Example606.0833 on the worked dataset, over 2 degrees of freedom
Within Groups Sum of Squares and the Mean Squares
SSW = ΣΣ (xij − x̄i)2  ·  MS = SS ÷ df
SSWSum of squares within groups, the unexplained or error variation
xijObservation j inside group i, in the units of the outcome
MSA mean square: a sum of squares divided by its own degrees of freedom
PropertySSB + SSW = SSTotal, always, which is a useful arithmetic check
RequiresAt least two observations per group, or that group contributes no variance estimate
Example333.8750 over 21 degrees of freedom gives MSwithin = 15.8988
Degrees of Freedom
df1 = k − 1  ·  df2 = N − k  ·  dftotal = N − 1
kNumber of groups being compared, a count of at least 2
NTotal number of observations across every group
df1Numerator degrees of freedom, unitless
df2Denominator or error degrees of freedom, unitless
RuleAlways report both, written F(df1, df2), so the design can be reconstructed
Examplek = 3 and N = 24 give F(2, 21)
Effect Sizes: Eta Squared, Omega Squared and Cohen's f
η2 = SSB ÷ SST  ·  ω2 = (SSB − df1·MSW) ÷ (SST + MSW)  ·  f = √(η2 ÷ (1 − η2))
η2Eta squared, the proportion of total variance explained, 0 to 1, unitless
ω2Omega squared, the bias corrected version. Can come out slightly negative, which is read as zero
fCohen's f, the input G*Power asks for in a power analysis, unitless
Bandsη2: 0.01 small, 0.06 medium, 0.14 large. f: 0.10, 0.25, 0.40
Use forComparing this study with others, and for planning the next sample size
Exampleη2 = 0.6448, ω2 = 0.6008, f = 1.3473 on the worked dataset
Tukey HSD and the Confidence Interval on a Difference
q = |x̄a − x̄b| ÷ √(MSW⁄2 · (1⁄na + 1⁄nb))  ·  CI = diff ± qcrit · SE
qStudentized range statistic, unitless, compared against the q distribution
qcritCritical q at alpha for k groups and df2 error degrees of freedom
SEStandard error of the difference used by Tukey, in the units of the outcome
RequiresEqual variances. When they differ, use Games-Howell, which swaps in each pair's own variances and its own Welch degrees of freedom
RuleIf the interval excludes zero, that pair differs at your alpha
Exampleqcrit = 3.5646 for k = 3 and df = 21 at alpha 0.05
Welch's One Way ANOVA, for Unequal Variances
FW = [Σ wi(x̄i − x̄w)2 ÷ (k−1)] ÷ [1 + 2(k−2)λ ÷ (k2−1)]
wiWeight for group i, equal to ni divided by that group's variance
wWeighted grand mean, in the units of the outcome
λΣ(1 − wi⁄Σw)2 ÷ (ni − 1), the correction term, unitless
df2Adjusted denominator degrees of freedom, (k2−1) ÷ 3λ, usually not a whole number
Use forAny design where Levene's test is significant or group sizes are unequal
ExampleF(2, 13.51) = 17.0238, p = 0.0002 on the worked dataset

📝 7. How to Use This One Way ANOVA Calculator

  1. Enter your data as comma separated numbers. The default tab takes values exactly as the placeholder shows: 52, 48, 55, 61, 47, .... Newlines, tabs, semicolons and spaces all work too, so a column pasted straight from Excel is fine.
  2. Name each group. The group name field above every box is editable. Type something meaningful such as Flipped classroom and it flows into the results table, all four charts, the post hoc comparisons and the exported report.
  3. Add or remove groups. Press Add cluster for a fourth or fifth condition. Each box has its own Clear and Remove button, and Remove stops at two groups because a one way ANOVA cannot run on fewer.
  4. Or build the table by hand. The Manual Entry Table tab gives you one editable column per group. Rename any column heading, press Add column or Add row to grow it, use the × buttons to remove one, then press Use this table.
  5. Or upload a file. On the Upload tab choose a CSV or Excel file, then click the columns that should each become a cluster. Every column you select is loaded as a separate group. Non-numeric columns are greyed out.
  6. Try a sample dataset. Ten built-in datasets cover the cases that matter: a textbook classic, a clear effect, a borderline p value, a null result, small samples, badly skewed data and a set with unequal variances where Welch is needed.
  7. Set your alpha. 0.05 is the default. Choose it before you look at the data, not after.
  8. Choose a post hoc method. Leave it on Automatic and the tool picks Tukey HSD when variances are equal and Games-Howell when they are not, using Levene's test to decide.
  9. Press Run One Way ANOVA. Nothing is computed until you do, and changing any input clears the results so you never read stale numbers.
  10. Read the assumption panel before the p value. If Levene fails, the Welch row in the robust alternatives table is your real headline. If Shapiro-Wilk fails, look at the Q-Q plot in Chart 4 and check the Kruskal-Wallis row.
  11. Copy the reporting sentence and export. Section 5 fills five reporting styles with your numbers. The buttons in Section 3 export a text report, a CSV or a print ready PDF, and each file ends with the StatsUnlock credit line.

📈 8. How to Run a One Way ANOVA in Excel

Excel can run a one way ANOVA two ways: through the Analysis ToolPak, which gives you the whole table in one click, or with worksheet functions, which show you every step. This section does both on the same worked dataset used in Sections 9, 10 and 12, so the three sets of numbers can be checked against each other. The one function that makes the manual route easy is DEVSQ, which returns a sum of squared deviations from the mean directly.

The whole thing in one line: with the three groups in A2:A9, B2:B9 and C2:C9, the between groups sum of squares is =DEVSQ(A2:C9)-DEVSQ(A2:A9)-DEVSQ(B2:B9)-DEVSQ(C2:C9) and the F ratio is that divided by 2, over the within groups sum of squares divided by 21.

8.1 The functions you need

You wantExcel functionNote
Whole ANOVA table in one clickData → Data Analysis → Anova: Single FactorAnalysis ToolPak add-in. Must be enabled first, see 8.2 step 5
Group mean=AVERAGE(A2:A9)Ignores blanks and text automatically
Group size=COUNT(A2:A9)Use COUNT, never COUNTA, which counts the header too
Group standard deviation=STDEV.S(A2:A9)Sample version with the n minus 1 denominator
Group variance=VAR.S(A2:A9)The square of STDEV.S
Sum of squared deviations=DEVSQ(A2:A9)The workhorse. Saves building the squares by hand
Total sum of squares=DEVSQ(A2:C9)Over every cell in all three groups at once
Within groups SS=DEVSQ(A2:A9)+DEVSQ(B2:B9)+DEVSQ(C2:C9)Add one DEVSQ per group
Between groups SS=DEVSQ(A2:C9)-F5Total minus within, where F5 holds the within groups SS
p value from F=F.DIST.RT(F,2,21)RT means right tail. ANOVA is always right tailed
Critical F=F.INV.RT(0.05,2,21)Compare with your F, reject the null if yours is larger
Two group check=T.TEST(A2:A9,B2:B9,2,2)With exactly two groups, F equals t squared
The STDEV.P trap. STDEV.P and VAR.P divide by n, not by n minus 1. Every ANOVA on this page, and every one in R, Python and SPSS, uses the sample versions STDEV.S and VAR.S. Mixing them changes the mean squares and therefore the F ratio, and the error is silent because both functions return a perfectly plausible number.

8.2 Step by step

1 Put each group in its own column

One column per group, with the group name in row 1. This wide layout is what the Analysis ToolPak expects. Groups do not need to be the same size: leave the shorter columns short and Excel handles it.

Xanova.xlsx - ExcelA2fxABC1TraditionalFlippedOnline25263553486758455595256171606476557750625485869619536456

The three teaching methods sit in A2:A9, B2:B9 and C2:C9, eight students each. All eight rows are shown.

2 Compute the descriptives for each group

Do this before the test, not after. If a count comes out wrong, you have found a data problem while it is still cheap to fix.

=COUNT(A2:A9)=AVERAGE(A2:A9)=STDEV.S(A2:A9)=VAR.S(A2:A9)
Xanova.xlsx - ExcelF3fx=AVERAGE(A2:A9)ABCDEF1TraditionalFlippedOnlineStatisticValue2526355n83486758Mean A53.00004555952Mean B65.00005617160Mean C56.62506476557SD A4.84037506254SD B3.89148586961SD C3.02089536456Var ratio2.57 : 1

Group means of 53.0000, 65.0000 and 56.6250, with standard deviations of 4.8403, 3.8914 and 3.0208. The largest to smallest variance ratio is 23.43 to 9.13, which is 2.57 to 1 and comfortably under the 4 to 1 rule of thumb.

3 Build the sums of squares with DEVSQ

Three formulas give you the whole partition. The check that SSbetween + SSwithin = SStotal must hold exactly, and it is worth putting that check in a cell of its own.

=DEVSQ(A2:C9)=DEVSQ(A2:A9)+DEVSQ(B2:B9)+DEVSQ(C2:C9)=F2-F3
Xanova.xlsx - ExcelF4fx=F2-F3EF1Sum of squaresValue2SS total939.95833SS within333.87504SS between606.08335Check, B + W939.9583

Total 939.9583, within groups 333.8750, between groups 606.0833. The three add up exactly, which confirms the ranges are right.

4 Turn the sums of squares into F and p

Divide each sum of squares by its own degrees of freedom to get a mean square, then divide one mean square by the other. The degrees of freedom are k minus 1 = 2 and N minus k = 21.

=F4/2=F3/21=F6/F7=F.DIST.RT(F8,2,21)
Xanova.xlsx - ExcelF8fx=F6/F7EF1ANOVA quantityValue2MS between303.04173MS within15.89884F ratio19.06075p value1.905E-056F crit, 0.053.46687DecisionReject H0

MS between 303.0417, MS within 15.8988, giving F = 19.0607 and p = 0.0000191. The critical F at alpha 0.05 is 3.4668, so the null hypothesis is rejected.

5 Or let the Analysis ToolPak do all of it

File → Options → Add-ins → Manage Excel Add-ins → Go → tick Analysis ToolPak → OK. On a Mac it lives under Tools → Excel Add-ins. Then Data → Data Analysis → Anova: Single Factor, set the input range to A1:C9, tick Labels in first row, choose Columns, set alpha to 0.05, and press OK.

Xanova.xlsx - ExcelA1fxAnova: Single FactorABCDE1SUMMARYCountSumAverageVariance2Traditional842453.000023.42863Flipped852065.000015.14294Online845356.62509.12505ANOVASSdfMSF6Between Groups606.08332303.041719.06077Within Groups333.87502115.89888Total939.9583239P-value1.905E-05F crit3.4668

The ToolPak output. The ANOVA table gives F = 19.0607, P-value = 1.905E-05 and F crit = 3.4668, matching the manual calculation to every decimal place shown.

8.3 The awkward cases Excel makes hard

No effect size at all. Excel has no eta squared or omega squared function. Build them from the sums of squares the ToolPak already prints: =SSB/SST for eta squared, and =(SSB-2*MSW)/(SST+MSW) for omega squared. On this dataset that is 0.6448 and 0.6008.

No post hoc tests. There is no Tukey HSD in Excel. You can approximate it by computing the studentized range statistic yourself, =ABS(mean1-mean2)/SQRT(MSW/2*(1/n1+1/n2)), and comparing it with a critical q value from Table 11.4 in Section 11. Excel cannot give you the exact Tukey p value, because it has no studentized range distribution function.

No Welch's ANOVA. The ToolPak only does the classic equal variance test. If Levene's test fails, Excel cannot help and you should move to R, Python or this calculator.

No Levene's test. Build it by hand: compute the absolute deviation of every value from its own group median with =ABS(A2-MEDIAN($A$2:$A$9)), fill that down for all three columns, then run a second Anova: Single Factor on those deviations. The F it prints is Levene's statistic.

Long format data. If your data have one score column and one group column, the ToolPak cannot read them. Either pivot to wide with a PivotTable, or use =IF($B2="Flipped",$A2,"") style helper columns to split them out.

8.4 Why your Excel answer might differ from R or Python

SituationWhat happensFix
Blank cells inside a groupExcel ignores them, so n is smaller than you think and df2 changesCheck COUNT returns the number you expect for every group
Zeros used to mean "not measured"Excel counts a zero as a real observation and drags that group's mean downDelete them or replace them with truly empty cells before the test
Numbers stored as textSilently skipped by AVERAGE, COUNT and DEVSQLook for green triangles in the cell corners, then Convert to Number
Used STDEV.P instead of STDEV.SEvery SD is too small, so any hand built mean square is wrongAlways the .S versions for sample data
Unequal variancesExcel gives the classic F only; R's oneway.test defaults to Welch, so the two disagreeCall oneway.test(y ~ g, var.equal = TRUE) in R to match Excel, or move to Welch everywhere
SciPy and Excel disagree on the SDNumPy's np.std defaults to the population formula, ddof = 0Use np.std(x, ddof=1) to match STDEV.S
p shows as 1.905E-05 in Excel and 0.000 in SPSSDifferent display rounding, not different mathsReport p < .001, never p = .000
Rounded values pasted between sheetsRounding at 2 decimals then squaring changes the third decimal of FReference the original cells rather than pasting displayed values

8.5 Charting the result in Excel

  1. Put the group names in one column and their means in the next, with the standard errors in a third.
  2. Insert → Charts → Clustered Column, selecting only the names and the means.
  3. Click the chart, press the + button, tick Error Bars, then More Options → Custom → Specify Value and point both boxes at your standard error column.
  4. Say in the caption whether the bars are standard deviations, standard errors or 95% confidence intervals. They look identical and mean different things, and an unlabelled error bar is grounds for revision at most journals.
  5. For a figure that shows the raw data too, add a scatter series of the individual points over the columns using a combo chart.

Chart 1 in Section 3 of this page draws the group means with proper 95% confidence intervals automatically, and Chart 2 shows every raw observation, which is usually faster than rebuilding both in Excel.

8.6 Excel errors you will probably hit

Excel showsWhyFix
#DIV/0! from AVERAGE or DEVSQThe range holds no numeric values at allCheck the range address, and that numbers are not stored as text
#DIV/0! from your F formulaMS within is zero, which means every value inside every group is identicalReal data with zero within group variance almost always means a copy and paste error
#NUM! from F.DIST.RTA negative F, or a degrees of freedom argument below 1Check you divided the mean squares in the right order, between over within
#VALUE!Text or a unit symbol typed into a data cellStrip units into a separate column and keep the data cells purely numeric
#N/AA lookup used to build the layout returned nothingFix the lookup before running the test, not after
Data Analysis is missing from the Data ribbonThe Analysis ToolPak is not enabledFile → Options → Add-ins → Manage Excel Add-ins → Go → tick Analysis ToolPak
ToolPak error "input range must be a contiguous reference"The three groups are not side by sideMove them into adjacent columns, or run the test one block at a time
F is huge and p is exactly 0Excel underflowed a very small p value in the displayWiden the column or format as scientific. Report p < .001

📈 9. How to Run a One Way ANOVA in R

R gives you a one way ANOVA in one line, summary(aov(score ~ group, data = dat)), but that line alone is not what you should report. It has no effect size, no assumption checks and no post hoc comparisons. The script below is complete and runnable, uses base R only so there is nothing to install, prints a plain English verdict, and saves one publication ready figure at 300 dpi.

Copy the whole block. It runs top to bottom in RStudio, VS Code or plain Rscript anova.R. Change only the three data vectors near the top to use your own numbers.
basestatsgraphics

All three ship with R itself. aov, TukeyHSD, shapiro.test, bartlett.test, oneway.test and kruskal.test all live in stats, which is exactly what reviewers expect to see cited.

9.1 The complete script

R, base only, saves anova_plot.png at 300 dpi
# ------------------------------------------------------------------
# One-way ANOVA in R, base R only, nothing to install.
# Change ONLY the data block below to use your own numbers.
# Saves one 300 dpi figure: anova_plot.png
# ------------------------------------------------------------------

set.seed(42)   # keeps the jitter in the figure reproducible

# ---- 1. YOUR DATA -------------------------------------------------
traditional <- c(52, 48, 55, 61, 47, 50, 58, 53)
flipped     <- c(63, 67, 59, 71, 65, 62, 69, 64)
online      <- c(55, 58, 52, 60, 57, 54, 61, 56)

score <- c(traditional, flipped, online)
group <- factor(rep(c("Traditional", "Flipped", "Online"),
                    times = c(length(traditional), length(flipped), length(online))),
                levels = c("Traditional", "Flipped", "Online"))
dat <- data.frame(score, group)

# From a CSV instead? Use these two lines and delete the block above.
# dat <- read.csv("my_data.csv")                    # columns: score, group
# dat <- dat[complete.cases(dat$score, dat$group), ]   # drop missing values
# dat$group <- factor(dat$group)

# ---- 2. DESCRIPTIVES ----------------------------------------------
desc <- aggregate(score ~ group, data = dat,
                  FUN = function(x) c(n = length(x), mean = mean(x), sd = sd(x)))
desc <- do.call(data.frame, desc)
names(desc) <- c("group", "n", "mean", "sd")
print(desc, row.names = FALSE)

# ---- 3. THE ONE-WAY ANOVA -----------------------------------------
fit <- aov(score ~ group, data = dat)
tab <- summary(fit)[[1]]
Fval <- tab[1, "F value"]
pval <- tab[1, "Pr(>F)"]
df1  <- tab[1, "Df"]
df2  <- tab[2, "Df"]
SSb  <- tab[1, "Sum Sq"]
SSw  <- tab[2, "Sum Sq"]
MSw  <- tab[2, "Mean Sq"]
print(tab)

# ---- 4. EFFECT SIZES ----------------------------------------------
eta2   <- SSb / (SSb + SSw)
omega2 <- (SSb - df1 * MSw) / (SSb + SSw + MSw)
cohenf <- sqrt(eta2 / (1 - eta2))

# ---- 5. ASSUMPTION CHECKS -----------------------------------------
sw  <- shapiro.test(residuals(fit))                 # normality of residuals
bar <- bartlett.test(score ~ group, data = dat)     # equal variances
# Levene (Brown-Forsythe, median centred) without loading the car package:
absdev <- abs(dat$score - ave(dat$score, dat$group, FUN = median))
lev <- summary(aov(absdev ~ dat$group))[[1]]

# ---- 6. ROBUST ALTERNATIVES ---------------------------------------
welch <- oneway.test(score ~ group, data = dat, var.equal = FALSE)
kw    <- kruskal.test(score ~ group, data = dat)

# ---- 7. POST HOC --------------------------------------------------
tk <- TukeyHSD(fit, conf.level = 0.95)
print(tk)

# ---- 8. PLAIN-ENGLISH VERDICT -------------------------------------
size <- if (eta2 >= 0.14) "large" else if (eta2 >= 0.06) "medium" else "small"
cat("\n================ ONE-WAY ANOVA VERDICT ================\n")
cat(sprintf("F(%d, %d) = %.4f, p = %.6f\n", df1, df2, Fval, pval))
cat(sprintf("Eta squared = %.4f (%s), omega squared = %.4f, Cohen's f = %.4f\n",
            eta2, size, omega2, cohenf))
cat(sprintf("Shapiro-Wilk on residuals: W = %.4f, p = %.4f -> %s\n",
            sw$statistic, sw$p.value,
            ifelse(sw$p.value > 0.05, "normality OK", "NORMALITY FAILED")))
cat(sprintf("Levene (median centred): F = %.4f, p = %.4f -> %s\n",
            lev[1, "F value"], lev[1, "Pr(>F)"],
            ifelse(lev[1, "Pr(>F)"] > 0.05, "equal variances OK", "VARIANCES DIFFER")))
cat(sprintf("Welch's ANOVA: F(%.0f, %.2f) = %.4f, p = %.6f\n",
            welch$parameter[1], welch$parameter[2], welch$statistic, welch$p.value))
cat(sprintf("Kruskal-Wallis: H = %.4f, df = %d, p = %.6f\n",
            kw$statistic, kw$parameter, kw$p.value))
if (pval < 0.05) {
  cat("=> At least one group mean differs. Read the Tukey table above.\n")
} else {
  cat("=> No detectable difference between the group means.\n")
}
cat("=======================================================\n")

# ---- 9. ONE PUBLICATION-READY FIGURE, 300 dpi ---------------------
png("anova_plot.png", width = 2400, height = 1000, res = 300)
par(mfrow = c(1, 2), mar = c(4.2, 4.2, 2.6, 1))
cols <- c("#2563eb", "#16a34a", "#ea580c")
boxplot(score ~ group, data = dat, col = adjustcolor(cols, 0.35),
        border = cols, ylab = "Score", xlab = "", main = "Scores by group")
stripchart(score ~ group, data = dat, vertical = TRUE, method = "jitter",
           jitter = 0.12, pch = 19, col = cols, add = TRUE)
points(1:3, desc$mean, pch = 18, cex = 1.6, col = "black")
qqnorm(residuals(fit), pch = 19, col = "#9333ea", main = "Q-Q plot of residuals")
qqline(residuals(fit), col = "#ea580c", lwd = 2, lty = 2)
dev.off()
cat("Figure saved as anova_plot.png (300 dpi)\n")

9.2 What each part does

Line or functionWhat it does and why it is there
factor(rep(...), levels = ...)Turns the group labels into a factor with a fixed order. Without levels, R sorts alphabetically and your plot order changes for no reason.
aov(score ~ group, data = dat)Fits the model. The formula needs long format data, one row per observation, not three separate vectors side by side.
summary(fit)[[1]]The ANOVA table as a data frame, so F, p, the sums of squares and both degrees of freedom can be pulled out by name.
residuals(fit)The residuals, which are what the normality assumption is actually about. Testing the raw scores instead is a common and wrong shortcut.
shapiro.test()Normality of the residuals. With more than 5000 values R refuses to run it, and with very large n it flags trivial departures, so read the Q-Q plot too.
ave(x, g, FUN = median)Gives each observation its own group median, which is how the Brown-Forsythe version of Levene's test is built without loading the car package.
oneway.test(..., var.equal = FALSE)Welch's ANOVA. Note the default is FALSE, so oneway.test and aov disagree out of the box. That surprises people who expect them to match.
TukeyHSD(fit)All pairwise comparisons with family-wise error control, printing the difference, the adjusted p value and a confidence interval for each pair.
var() and sd()Both use the n minus 1 denominator, matching Excel's VAR.S and STDEV.S but not NumPy's defaults.
mean() with a missing valueReturns NA silently unless you pass na.rm = TRUE. The complete.cases line in the CSV block is there to stop that.
png(..., res = 300) and dev.off()Opens and closes the graphics device. Forgetting dev.off() leaves an empty or locked file, which is the most common R plotting complaint.
set.seed(42)Fixes the jitter in the strip chart so the figure is identical every time you run the script.

9.3 What the figure shows

The left panel is a box plot of the three groups with every raw observation jittered over it and each group mean marked as a black diamond. It answers two questions at once: are the groups separated, and is any group being driven by one extreme value. On the worked data the Flipped group sits clearly above the other two, and the Traditional and Online boxes overlap heavily, which is exactly the pattern the Tukey table then confirms.

The right panel is a normal Q-Q plot of the residuals. Points hugging the dashed line mean the normality assumption is safe. A pronounced S shape means skew, and points peeling away at both ends mean heavy tails, which usually comes from outliers rather than from the distribution itself.

9.4 Common R problems and fixes

ProblemCauseFix
Error in aov: variable lengths differThe score vector and the group vector are not the same lengthCheck the rep() counts match the group sizes exactly
ANOVA gives one row instead of twogroup is numeric, so R fitted a regression rather than an ANOVAWrap it in factor()
oneway.test and aov give different p valuesoneway.test defaults to Welch, aov assumes equal variancesPass var.equal = TRUE if you want them to match
shapiro.test refuses to runFewer than 3 or more than 5000 valuesUse the Q-Q plot, or the Anderson-Darling test from the nortest package
Everything is NAMissing values in the score columnAdd the complete.cases line, and say in the write up how many rows were dropped
TukeyHSD errorsIt was given a model that is not an aov objectFit with aov(), not with lm(), or wrap the lm in aov()
The saved PNG is blankdev.off() was never reached because of an error above itRun the plotting block line by line, then re-run the whole script
Group order in the plot looks randomFactor levels were assigned alphabeticallySet levels = explicitly when creating the factor
p prints as < 2e-16R has hit its display floor, not an errorReport p < .001

9.5 Useful one-liners

# 1. The whole test in one line
summary(aov(score ~ group, data = dat))

# 2. Welch's ANOVA, safest when variances differ
oneway.test(score ~ group, data = dat, var.equal = FALSE)

# 3. Eta squared straight from the table
with(summary(aov(score ~ group, dat))[[1]], `Sum Sq`[1] / sum(`Sum Sq`))

# 4. Group means, SDs and counts in one call
aggregate(score ~ group, dat, function(x) c(n = length(x), m = mean(x), s = sd(x)))

# 5. Tukey HSD as a tidy data frame
as.data.frame(TukeyHSD(aov(score ~ group, dat))$group)

# 6. Non-parametric alternative plus its post hoc
kruskal.test(score ~ group, data = dat)
pairwise.wilcox.test(dat$score, dat$group, p.adjust.method = "holm")

# 7. Bootstrap confidence interval for eta squared, 2000 resamples
set.seed(1); replicate(2000, {i <- sample(nrow(dat), replace = TRUE)
  t <- summary(aov(score ~ group, dat[i, ]))[[1]]; t$`Sum Sq`[1] / sum(t$`Sum Sq`)}) |> quantile(c(.025, .975))

# 8. Write every result to CSV
write.csv(as.data.frame(summary(aov(score ~ group, dat))[[1]]), "anova_table.csv")

📈 10. How to Run a One Way ANOVA in Python

In Python the test itself is scipy.stats.f_oneway(*groups), which returns the F ratio and the p value and nothing else. As in R, that is not enough to report. The script below has the same shape as the R script in Section 9, so a reader who scrolled past it finds everything in the same order: data, descriptives, the ANOVA table, effect sizes, assumption checks, robust alternatives, Tukey HSD, a plain English verdict and one 300 dpi figure.

Copy the whole block. Run it with python anova.py from a terminal, or paste it into a Jupyter cell. Change only the three arrays near the top.
numpyscipy.statsmatplotlibpandas, optional

Install with pip install numpy scipy matplotlib. NumPy holds the arrays and the arithmetic, scipy.stats holds every test used here, and matplotlib draws the figure. pandas is only needed for the commented read_csv alternative. scipy.stats.tukey_hsd requires SciPy 1.11 or newer.

10.1 The complete script

Python 3, saves anova_plot.png at 300 dpi
# ------------------------------------------------------------------
# One-way ANOVA in Python. numpy + scipy + matplotlib.
# pip install numpy scipy matplotlib
# Change ONLY the data block below to use your own numbers.
# Saves one 300 dpi figure: anova_plot.png
# ------------------------------------------------------------------

import numpy as np
import scipy.stats as st
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)   # seeded, so the jitter is reproducible

# ---- 1. YOUR DATA -------------------------------------------------
traditional = np.array([52, 48, 55, 61, 47, 50, 58, 53], dtype=float)
flipped     = np.array([63, 67, 59, 71, 65, 62, 69, 64], dtype=float)
online      = np.array([55, 58, 52, 60, 57, 54, 61, 56], dtype=float)

groups = [traditional, flipped, online]
names  = ["Traditional", "Flipped", "Online"]

# From a CSV instead? Use these three lines and delete the block above.
# import pandas as pd
# df = pd.read_csv("my_data.csv").dropna(subset=["score", "group"])
# names = list(df["group"].unique()); groups = [df.loc[df["group"] == g, "score"].to_numpy(float) for g in names]

# ---- 2. DESCRIPTIVES ----------------------------------------------
print(f"{'Group':<14}{'n':>4}{'Mean':>10}{'SD':>10}")
for nm, g in zip(names, groups):
    print(f"{nm:<14}{g.size:>4}{g.mean():>10.4f}{g.std(ddof=1):>10.4f}")

# ---- 3. THE ONE-WAY ANOVA -----------------------------------------
allv = np.concatenate(groups)
N, k = allv.size, len(groups)
grand = allv.mean()
SSb = sum(g.size * (g.mean() - grand) ** 2 for g in groups)
SSw = sum(((g - g.mean()) ** 2).sum() for g in groups)
SSt = SSb + SSw
df1, df2 = k - 1, N - k
MSb, MSw = SSb / df1, SSw / df2
F, p = st.f_oneway(*groups)          # same F and p as the hand calculation

print("\nSource          SS         df        MS          F         p")
print(f"Between  {SSb:10.4f} {df1:9d} {MSb:10.4f} {F:10.4f} {p:10.6f}")
print(f"Within   {SSw:10.4f} {df2:9d} {MSw:10.4f}")
print(f"Total    {SSt:10.4f} {N-1:9d}")

# ---- 4. EFFECT SIZES ----------------------------------------------
eta2   = SSb / SSt
omega2 = (SSb - df1 * MSw) / (SSt + MSw)
cohenf = np.sqrt(eta2 / (1 - eta2))

# ---- 5. ASSUMPTION CHECKS -----------------------------------------
resid = np.concatenate([g - g.mean() for g in groups])
sw = st.shapiro(resid)                                  # normality of residuals
lev = st.levene(*groups, center="median")               # Brown-Forsythe
bart = st.bartlett(*groups)                             # assumes normality

# ---- 6. ROBUST ALTERNATIVES ---------------------------------------
w = np.array([g.size / g.var(ddof=1) for g in groups])
mw = (w * np.array([g.mean() for g in groups])).sum() / w.sum()
lam = sum((1 - wi / w.sum()) ** 2 / (g.size - 1) for wi, g in zip(w, groups))
A = (w * (np.array([g.mean() for g in groups]) - mw) ** 2).sum() / df1
Fw = A / (1 + 2 * (k - 2) * lam / (k * k - 1))
dfw = (k * k - 1) / (3 * lam)
pw = st.f.sf(Fw, df1, dfw)
H, pkw = st.kruskal(*groups)

# ---- 7. POST HOC, TUKEY HSD ---------------------------------------
tk = st.tukey_hsd(*groups)
print("\nTukey HSD")
for i in range(k):
    for j in range(i + 1, k):
        lo, hi = tk.confidence_interval().low[i, j], tk.confidence_interval().high[i, j]
        print(f"{names[i]:<12} vs {names[j]:<12} diff={tk.statistic[i, j]:8.4f} "
              f"p={tk.pvalue[i, j]:9.6f} 95% CI [{lo:.4f}, {hi:.4f}]")

# ---- 8. PLAIN-ENGLISH VERDICT -------------------------------------
size = "large" if eta2 >= 0.14 else "medium" if eta2 >= 0.06 else "small"
print("\n================ ONE-WAY ANOVA VERDICT ================")
print(f"F({df1}, {df2}) = {F:.4f}, p = {p:.6f}")
print(f"Eta squared = {eta2:.4f} ({size}), omega squared = {omega2:.4f}, Cohen's f = {cohenf:.4f}")
print(f"Shapiro-Wilk on residuals: W = {sw.statistic:.4f}, p = {sw.pvalue:.4f} -> "
      f"{'normality OK' if sw.pvalue > 0.05 else 'NORMALITY FAILED'}")
print(f"Levene (median centred): W = {lev.statistic:.4f}, p = {lev.pvalue:.4f} -> "
      f"{'equal variances OK' if lev.pvalue > 0.05 else 'VARIANCES DIFFER'}")
print(f"Bartlett: chi2 = {bart.statistic:.4f}, p = {bart.pvalue:.4f}")
print(f"Welch's ANOVA: F({df1}, {dfw:.2f}) = {Fw:.4f}, p = {pw:.6f}")
print(f"Kruskal-Wallis: H = {H:.4f}, df = {k-1}, p = {pkw:.6f}")
print("=> At least one group mean differs." if p < 0.05 else "=> No detectable difference.")
print("=======================================================")

# ---- 9. ONE PUBLICATION-READY FIGURE, 300 dpi ---------------------
fig, ax = plt.subplots(1, 2, figsize=(11, 4.2))
cols = ["#2563eb", "#16a34a", "#ea580c"]
bp = ax[0].boxplot(groups, patch_artist=True, widths=0.55)
ax[0].set_xticks(range(1, k + 1)); ax[0].set_xticklabels(names)
for patch, c in zip(bp["boxes"], cols):
    patch.set_facecolor(c); patch.set_alpha(0.30); patch.set_edgecolor(c)
for i, (g, c) in enumerate(zip(groups, cols), start=1):
    x = rng.normal(i, 0.045, g.size)
    ax[0].plot(x, g, "o", color=c, alpha=0.85, markersize=5)
    ax[0].plot(i, g.mean(), "D", color="black", markersize=7)
ax[0].set_ylabel("Score"); ax[0].set_title("Scores by group")
st.probplot(resid, dist="norm", plot=ax[1])
ax[1].set_title("Q-Q plot of residuals")
ax[1].get_lines()[0].set_color("#9333ea"); ax[1].get_lines()[0].set_markersize(5)
ax[1].get_lines()[1].set_color("#ea580c"); ax[1].get_lines()[1].set_linestyle("--")
fig.suptitle(f"One-way ANOVA: F({df1}, {df2}) = {F:.2f}, p = {p:.4g}, eta squared = {eta2:.3f}")
fig.tight_layout()
fig.savefig("anova_plot.png", dpi=300, bbox_inches="tight")
print("Figure saved as anova_plot.png (300 dpi)")

10.2 What each part does

Line or functionWhat it does and why it is there
dtype=float on every arrayStops integer arrays from producing integer division surprises, and prevents a SciPy bug in some versions of bartlett with integer input.
matplotlib.use("Agg")Selects a non-interactive backend so the script saves a file on a server with no display. Remove it in Jupyter.
st.f_oneway(*groups)The classic one way ANOVA. The star unpacks the list, so the same call works for three groups or for ten.
g.std(ddof=1)The sample standard deviation. NumPy defaults to ddof=0, the population version, which does not match Excel's STDEV.S or R's sd(). This is the single most common Python and R disagreement.
np.mean versus np.nanmeannp.mean returns nan if any element is nan. Clean the data first, or switch to the nan versions and report how many values were dropped.
st.shapiro(resid)Normality on the residuals, not on the raw scores. The residuals are built one line above by subtracting each group's own mean.
st.levene(*groups, center="median")The Brown-Forsythe variant, which is the robust default. SciPy's own default is also "median", but SPSS reports the mean centred version, so the two can disagree.
The Welch blockSciPy has no Welch ANOVA, so the weights, the weighted grand mean, the lambda correction and the adjusted degrees of freedom are computed directly from the formula in Section 6.
st.tukey_hsd(*groups)Pairwise comparisons with exact studentized range p values. Older SciPy versions do not have it, in which case use statsmodels.stats.multicomp.pairwise_tukeyhsd.
st.probplot(resid, plot=ax[1])Draws the Q-Q plot. The two get_lines() calls afterwards recolour the points and the reference line, because probplot has no colour arguments.
rng = np.random.default_rng(42)The modern seeded generator, so the jitter in the figure is identical on every run.
savefig(..., dpi=300, bbox_inches="tight")Publication resolution with the whitespace trimmed. Journals normally ask for 300 dpi minimum for figures.

10.3 What the figure shows

The left panel is a box plot with every observation drawn over it and each group mean marked as a black diamond, so a reader sees the spread and the centre together. The right panel is the Q-Q plot of the residuals against a normal reference. The title strip carries F, p and eta squared, which makes the file usable as a figure in a slide deck without any further editing.

10.4 Common Python problems and fixes

ProblemCauseFix
AttributeError: module 'scipy.stats' has no attribute 'tukey_hsd'SciPy older than 1.11pip install -U scipy, or use statsmodels pairwise_tukeyhsd
SD does not match Excelddof left at its default of 0Always ddof=1 for sample data
Everything comes out nanOne missing value anywhere in an arrayDrop them first, or use np.nanmean and friends
TypeError: f_oneway() takes ... argumentsA list was passed instead of unpackedWrite f_oneway(*groups), with the star
p differs from R in the fifth decimalNothing is wrong, it is floating point displayReport three decimals, or p < .001
The figure never appearsThe Agg backend saves rather than displaysIn Jupyter, drop the matplotlib.use line and call plt.show()
ValueError: cannot convert float NaN to integer from bartlettA known SciPy quirk with integer input arraysBuild the arrays with dtype=float, as this script does
Group order in the plot is wrongA dict or set was used to hold the group namesKeep names in a list, which preserves order

10.5 Useful one-liners

# 1. The whole test in one line
F, p = st.f_oneway(traditional, flipped, online)

# 2. Eta squared in one expression
eta2 = SSb / (SSb + SSw)

# 3. Group summary straight out of pandas
df.groupby("group")["score"].agg(["count", "mean", "std"])

# 4. Same ANOVA through statsmodels, with a proper table
import statsmodels.api as sm; from statsmodels.formula.api import ols
sm.stats.anova_lm(ols("score ~ C(group)", data=df).fit(), typ=2)

# 5. Tukey HSD through statsmodels, works on older SciPy
from statsmodels.stats.multicomp import pairwise_tukeyhsd
print(pairwise_tukeyhsd(df["score"], df["group"], alpha=0.05))

# 6. Non-parametric alternative
st.kruskal(traditional, flipped, online)

# 7. Permutation test when you trust no distribution at all
st.permutation_test((traditional, flipped, online), lambda *a: st.f_oneway(*a).statistic,
                    permutation_type="independent", alternative="greater", n_resamples=9999, random_state=42)

# 8. Required sample size per group for a given effect
from statsmodels.stats.power import FTestAnovaPower
FTestAnovaPower().solve_power(effect_size=0.25, k_groups=3, alpha=0.05, power=0.8)

To run any of this from a terminal, save it as anova.py and type python anova.py. In Jupyter, remove the matplotlib.use("Agg") line and add plt.show() at the end so the figure appears inline. Sections 8, 9 and 10 all use the same worked dataset and agree to four decimal places: F = 19.0607, p = 0.0000191, eta squared = 0.6448.

📋 11. Reference Tables

Eight lookup tables for the one way ANOVA. Every value here was computed from the exact distribution functions, not copied from a textbook scan, so they agree with R, SciPy and Excel to four decimal places.

11.1 Critical F values at alpha = 0.05

df2 (N − k)df1 = 1df1 = 2df1 = 3df1 = 4df1 = 5
56.60795.78615.40955.19225.0503
85.31774.45904.06623.83793.6875
104.96464.10283.70833.47803.3258
124.74723.88533.49033.25923.1059
154.54313.68233.28743.05562.9013
204.35123.49283.09842.86612.7109
214.32483.46683.07252.84012.6848
254.24173.38522.99122.75872.6030
304.17093.31582.92232.68962.5336
404.08473.23172.83872.60602.4495
604.00123.15042.75812.52522.3683
1203.92013.07182.68022.44722.2899

What to conclude: if your F is larger than the value in the cell for your degrees of freedom, reject the null hypothesis at alpha = 0.05. With 3 groups and 24 observations, df1 = 2 and df2 = 21, so the critical value is 3.4668. Source: the F distribution, matching F.INV.RT in Excel and qf(0.95, df1, df2) in R.

11.2 Critical F values at alpha = 0.01

df2df1 = 1df1 = 2df1 = 3df1 = 4df1 = 5
516.258213.273912.060011.391910.9670
811.25868.64917.59107.00616.6318
1010.04437.55946.55235.99435.6363
129.33026.92665.95255.41205.0643
158.68316.35895.41704.89324.5556
208.09605.84894.93824.43074.1027
218.01665.78044.87404.36884.0421
257.76985.56804.67554.17743.8550
307.56255.39034.50974.01793.6990
407.31415.17854.31263.82833.5138
607.07714.97744.12593.64903.3389
1206.85094.78653.94913.47953.1735

What to conclude: use this table only if you set alpha to 0.01 before collecting data. Moving the threshold after seeing the p value is not a stricter standard, it is a different experiment. Notice how much larger every value is: the price of a lower false positive rate is a higher false negative rate.

11.3 Effect size interpretation bands

StatisticSmallMediumLargeNotes
Eta squared (η2)0.010.060.14Cohen (1988). Read directly as a proportion of variance explained
Omega squared (ω2)0.010.060.14Same bands, less upward bias. Prefer it below 30 per group
Cohen's f0.100.250.40The input G*Power asks for
Cohen's d, per pair0.200.500.80For a single pairwise contrast, not for the omnibus test
Correlation ratio (η)0.100.240.37The square root of eta squared, on the correlation scale

What to conclude: these are conventions, not laws, and they were proposed for psychology. In fields with tightly controlled measurement, such as analytical chemistry, an eta squared of 0.14 would be unremarkable. In epidemiology it would be enormous. Always report the raw difference in real units beside the standardised effect size.

11.4 Critical studentized range q at alpha = 0.05, for Tukey HSD

df2 (error df)k = 2k = 3k = 4k = 5k = 6k = 7
53.6354.6025.2185.6736.0336.330
83.2614.0414.5294.8865.1675.399
103.1513.8774.3274.6544.9125.124
123.0813.7734.1994.5084.7504.950
153.0143.6734.0764.3674.5954.782
202.9503.5783.9584.2324.4454.620
212.9413.5653.9424.2134.4244.597
252.9133.5233.8904.1534.3584.526
302.8883.4863.8454.1024.3014.464
402.8583.4423.7914.0394.2324.388
602.8293.3993.7373.9774.1634.314
1202.8003.3563.6853.9174.0964.241

What to conclude: a pair differs at alpha = 0.05 when its q statistic exceeds the value in the cell for your number of groups k and your error degrees of freedom. With k = 3 and df2 = 21 the critical q is 3.565. Multiply it by the standard error of the difference to get the honestly significant difference itself.

11.5 Sample size per group for 80% and 90% power at alpha = 0.05

Effect size (Cohen's f)k = 3, 80%k = 3, 90%k = 4, 80%k = 4, 90%k = 5, 80%k = 5, 90%
0.10, small323423274356240310
0.25, medium536945584051
0.40, large222819241621
0.60, very large1013911810

What to conclude: read the column for your design and the row for the smallest effect you would not want to miss. Detecting a medium effect across three groups needs about 53 people per group. If your study has 10 per group, only a very large effect is detectable and a null result tells you almost nothing. Computed with the non-central F distribution, matching G*Power.

11.6 Assumption check thresholds

CheckTestPass ruleWhat failure does to your p value
Normality of residualsShapiro-Wilkp > 0.05, and a straight Q-Q plotLittle effect with balanced groups of 15 or more. With small skewed samples the false positive rate drifts above 5%
Equal variancesLevene, median centredp > 0.05Liberal (too many false positives) when the smaller group has the larger variance. Conservative in the reverse case
Equal variancesVariance ratio, largest to smallestUnder 4 : 1Above 4 : 1 with unequal group sizes, switch to Welch
Group balanceRatio of largest to smallest nUnder 1.5 : 1Unbalanced designs amplify every other assumption failure
IndependenceStudy designOne measurement per unitFatal. Repeated measures inflate F badly. Use a repeated measures ANOVA or a mixed model
OutliersTukey fences at 1.5 × IQRNone, or a documented decisionA single extreme value can create or destroy significance in a small group
Minimum group sizeCountn ≥ 2 to run, n ≥ 15 to trustBelow 5 per group the normality assumption cannot be checked at all

What to conclude: the two rows that decide which test you report are Levene and Shapiro-Wilk. Everything else is context. Section 4.11 turns these rows into a single decision table.

11.7 Which test to use when a one way ANOVA does not fit

Your situationUse insteadWhy
Exactly two groupsIndependent samples t testANOVA reduces to it exactly. F equals t squared
Unequal variancesWelch's one way ANOVAAdjusts the denominator and the degrees of freedom
Non-normal residuals or ordinal outcomeKruskal-Wallis HWorks on ranks, needs no normality
Same subjects in every conditionRepeated measures ANOVARemoves between-subject variance, gaining power
Two grouping factorsTwo way ANOVATests both main effects and the interaction
A continuous variable to control forANCOVAAdjusts group means for the covariate
Several correlated outcomesMANOVATests them jointly and controls the error rate
Counts rather than a continuous outcomePoisson regression or chi-squareANOVA assumes a continuous outcome with constant variance
Clustered or nested data, such as pupils in schoolsLinear mixed modelIndependence is violated and ANOVA will overstate significance
Ordered groups, such as low, medium, high doseTrend test or polynomial contrastMore powerful than ANOVA when the effect is monotonic

What to conclude: a one way ANOVA is the right answer only when there is one factor, three or more independent groups and one continuous outcome. Any other shape has a better test.

11.8 Turning a p value into a sentence

p valueDecision at alpha = 0.05How to word itWhat not to say
p < 0.001Reject the null"a statistically significant difference, p < .001"Never write p = .000
0.001 to 0.01Reject the null"a statistically significant difference, p = .004""highly significant" adds nothing
0.01 to 0.05Reject the null"a statistically significant difference, p = .032"Do not call it marginal
0.05 to 0.10Retain the null"no statistically significant difference, p = .07"Never "approaching significance" or "trending"
p > 0.10Retain the null"no evidence of a difference, p = .43"Never "the groups were the same"

What to conclude: significance is a yes or no decision against a threshold you set in advance. The size of p is not the size of the effect, which is why the effect size column exists at all. Report both in the same sentence, every time.

📈 12. Example Results

Eight worked one way ANOVA examples, spanning the situations you will actually meet: a textbook case, a huge effect, a borderline p value, a null result, a small sample, a significant but trivial effect, an assumption failure and a four group field trial. Every figure and every number here is static, so they are readable without running the calculator.

1
TEXTBOOK CASE

Three teaching methods compared

The clean case: clear separation, every assumption satisfied.

Twenty-four students were randomly allocated to a traditional lecture, a flipped classroom or a fully online course, eight per group, and sat the same end of term exam marked out of 100.

n = 24k = 3F = 19.06p < 0.001η2 = 0.645large effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)24All groups added together
SS between606.0833Variation explained by group
SS within333.8750Variation inside the groups
SS total939.9583SS between plus SS within
df2, 21Between, then within
MS between303.0417SS between divided by df1
MS within15.8988SS within divided by df2, the error term
F ratio19.0607Critical F at 0.05 is 3.4668
p value< 0.0001Right tail area of the F distribution
Eta squared0.6448large, 64.5% of variance
Omega squared0.6008Bias corrected effect size
Cohen's f1.3473Input for a power analysis
Shapiro-Wilk on residualsW = 0.9753, p = 0.7952Passed
Levene (median centred)W = 0.7347, p = 0.4916Passed
Three teaching methods compared44.151.659.066.473.9TraditionalM = 53.00FlippedM = 65.00OnlineM = 56.62F(2, 21) = 19.06, p < 0.001, eta squared = 0.645bars = group mean, whiskers = 95% CI, dashed = grand mean
Traditional M = 53.00 (SD 4.84, n = 8), Flipped M = 65.00 (SD 3.89, n = 8), Online M = 56.62 (SD 3.02, n = 8). This is the worked dataset used in Sections 8, 9 and 10, so the Excel, R and Python answers can be checked against it.

What it means: F(2, 21) = 19.0607 against a critical value of 3.4668, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.6448 is a large effect, meaning group membership accounts for 64.5% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "A one-way ANOVA showed a significant effect of teaching method on exam score, F(2, 21) = 19.06, p < .001, eta squared = .64. Tukey HSD tests showed the flipped classroom outperformed both traditional teaching (mean difference 12.00, 95% CI [6.97, 17.03], p < .001) and online delivery (8.38, 95% CI [3.35, 13.40], p = .001), which did not differ from each other (p = .188)."

2
CLEAR DOSE RESPONSE

Placebo against two drug doses

A very large effect, the kind that needs no statistics to see.

Thirty hypertensive patients were randomised to placebo, a low dose or a high dose of the same drug. The outcome is the fall in systolic blood pressure after six weeks, in mmHg.

n = 30k = 3F = 114.84p < 0.001η2 = 0.895large effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)30All groups added together
SS between820.8667Variation explained by group
SS within96.5000Variation inside the groups
SS total917.3667SS between plus SS within
df2, 27Between, then within
MS between410.4333SS between divided by df1
MS within3.5741SS within divided by df2, the error term
F ratio114.8363Critical F at 0.05 is 3.3541
p value< 0.0001Right tail area of the F distribution
Eta squared0.8948large, 89.5% of variance
Omega squared0.8836Bias corrected effect size
Cohen's f2.9166Input for a power analysis
Shapiro-Wilk on residualsW = 0.9581, p = 0.2768Passed
Levene (median centred)W = 0.0906, p = 0.9137Passed
Placebo against two drug doses-1.34.610.516.422.3PlaceboM = 4.00Low doseM = 10.90High doseM = 16.80F(2, 27) = 114.84, p < 0.001, eta squared = 0.895bars = group mean, whiskers = 95% CI, dashed = grand mean
Placebo M = 4.00 (SD 1.83, n = 10), Low dose M = 10.90 (SD 1.91, n = 10), High dose M = 16.80 (SD 1.93, n = 10). Every pairwise comparison separates cleanly, and the means rise in dose order, which is itself evidence of a real mechanism rather than noise.

What it means: F(2, 27) = 114.8363 against a critical value of 3.3541, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.8948 is a large effect, meaning group membership accounts for 89.5% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "Blood pressure reduction differed significantly across the three arms, F(2, 27) = 114.84, p < .001, eta squared = .89. All three pairwise Tukey comparisons were significant at p < .001, and the means rose in dose order."

3
BORDERLINE

Customer satisfaction across three stores

A p value close to alpha, where the wording matters most.

Twelve customers at each of three stores rated their visit from 1 to 7. The outcome is ordinal, which is itself a limitation worth stating.

n = 36k = 3F = 13.13p < 0.001η2 = 0.443large effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)36All groups added together
SS between13.7222Variation explained by group
SS within17.2500Variation inside the groups
SS total30.9722SS between plus SS within
df2, 33Between, then within
MS between6.8611SS between divided by df1
MS within0.5227SS within divided by df2, the error term
F ratio13.1256Critical F at 0.05 is 3.2849
p value< 0.0001Right tail area of the F distribution
Eta squared0.4430large, 44.3% of variance
Omega squared0.4025Bias corrected effect size
Cohen's f0.8919Input for a power analysis
Shapiro-Wilk on residualsW = 0.9375, p = 0.0424FAILED, normality rejected
Levene (median centred)W = 0.1028, p = 0.9026Passed
Customer satisfaction across three stores2.53.85.06.27.5Store AM = 5.08Store BM = 4.17Store CM = 5.67F(2, 33) = 13.13, p < 0.001, eta squared = 0.443bars = group mean, whiskers = 95% CI, dashed = grand mean
Store A M = 5.08 (SD 0.79, n = 12), Store B M = 4.17 (SD 0.72, n = 12), Store C M = 5.67 (SD 0.65, n = 12). With a 1 to 7 rating scale, the normality assumption is approximate at best. The Kruskal-Wallis test is the honest cross-check here.

What it means: F(2, 33) = 13.1256 against a critical value of 3.2849, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.4430 is a large effect, meaning group membership accounts for 44.3% of the total variation. At least one assumption check failed, so read the note under the figure before reporting the classic F.

How to write it: "Satisfaction differed across stores, F(2, 33) = 13.13, p < .001, eta squared = .44. Because the outcome was an ordinal rating and the residuals failed Shapiro-Wilk (p = .042), the result was confirmed with a Kruskal-Wallis test."

4
NULL RESULT

Three weight loss diets

The correct way to report finding nothing.

Thirty adults were randomised to a low carbohydrate, low fat or Mediterranean diet for twelve weeks. The outcome is weight lost in kilograms.

n = 30k = 3F = 0.10p = 0.902η2 = 0.008negligible effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)30All groups added together
SS between0.0987Variation explained by group
SS within12.8000Variation inside the groups
SS total12.8987SS between plus SS within
df2, 27Between, then within
MS between0.0493SS between divided by df1
MS within0.4741SS within divided by df2, the error term
F ratio0.1041Critical F at 0.05 is 3.3541
p value0.9015Right tail area of the F distribution
Eta squared0.0076negligible, 0.8% of variance
Omega squared-0.0635Bias corrected effect size
Cohen's f0.0878Input for a power analysis
Shapiro-Wilk on residualsW = 0.9745, p = 0.6692Passed
Levene (median centred)W = 0.7805, p = 0.4683Passed
Three weight loss diets2.53.34.04.75.5Low carbM = 4.00Low fatM = 3.92MediterraneanM = 4.06F(2, 27) = 0.10, p = 0.902, eta squared = 0.008bars = group mean, whiskers = 95% CI, dashed = grand mean
Low carb M = 4.00 (SD 0.81, n = 10), Low fat M = 3.92 (SD 0.58, n = 10), Mediterranean M = 4.06 (SD 0.65, n = 10). Ten per group can only detect a very large effect. A null result at this sample size is weak evidence of no difference, and the write up must say so.

What it means: F(2, 27) = 0.1041 against a critical value of 3.3541, so the null hypothesis is retained at alpha 0.05. Eta squared of 0.0076 is a negligible effect, meaning group membership accounts for 0.8% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "There was no significant difference in weight loss between the three diets, F(2, 27) = 0.10, p = .902, eta squared = .01. With ten participants per group the study was powered only to detect a very large effect, so this result should not be read as evidence that the diets are equivalent."

5
SMALL SAMPLE

VO2 max in three sports

A real effect found with only five athletes per group.

Five endurance athletes from each of three sports underwent a laboratory VO2 max test, measured in millilitres per kilogram per minute.

n = 15k = 3F = 25.04p < 0.001η2 = 0.807large effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)15All groups added together
SS between240.4000Variation explained by group
SS within57.6000Variation inside the groups
SS total298.0000SS between plus SS within
df2, 12Between, then within
MS between120.2000SS between divided by df1
MS within4.8000SS within divided by df2, the error term
F ratio25.0417Critical F at 0.05 is 3.8853
p value< 0.0001Right tail area of the F distribution
Eta squared0.8067large, 80.7% of variance
Omega squared0.7622Bias corrected effect size
Cohen's f2.0429Input for a power analysis
Shapiro-Wilk on residualsW = 0.9493, p = 0.5141Passed
Levene (median centred)W = 0.1250, p = 0.8836Passed
VO2 max in three sports58.262.967.572.276.8RunnersM = 68.20CyclistsM = 72.80SwimmersM = 63.00F(2, 12) = 25.04, p < 0.001, eta squared = 0.807bars = group mean, whiskers = 95% CI, dashed = grand mean
Runners M = 68.20 (SD 2.39, n = 5), Cyclists M = 72.80 (SD 1.92, n = 5), Swimmers M = 63.00 (SD 2.24, n = 5). With n = 5 per group the normality assumption cannot really be checked. The result survives only because the effect is very large relative to the within group spread.

What it means: F(2, 12) = 25.0417 against a critical value of 3.8853, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.8067 is a large effect, meaning group membership accounts for 80.7% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "VO2 max differed significantly between sports, F(2, 12) = 25.04, p < .001, eta squared = .81. Given the small sample, omega squared is reported alongside eta squared and the finding is treated as preliminary."

6
SIGNIFICANT BUT TRIVIAL

Three call centre scripts, 360 customers

The case where a tiny effect becomes significant because n is large.

One hundred and twenty customers heard each of three sales scripts. The outcome is call handling time in seconds. The group means differ by well under one second.

n = 360k = 3F = 3.66p = 0.027η2 = 0.020small effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)360All groups added together
SS between53.8569Variation explained by group
SS within2628.9317Variation inside the groups
SS total2682.7886SS between plus SS within
df2, 357Between, then within
MS between26.9284SS between divided by df1
MS within7.3640SS within divided by df2, the error term
F ratio3.6568Critical F at 0.05 is 3.0210
p value0.0268Right tail area of the F distribution
Eta squared0.0201small, 2.0% of variance
Omega squared0.0145Bias corrected effect size
Cohen's f0.1431Input for a power analysis
Shapiro-Wilk on residualsW = 0.9950, p = 0.2958Passed
Levene (median centred)W = 0.5566, p = 0.5736Passed
Three call centre scripts, 360 customers51.756.661.566.371.2Script AM = 59.86Script BM = 60.77Script CM = 60.54F(2, 357) = 3.66, p = 0.027, eta squared = 0.020bars = group mean, whiskers = 95% CI, dashed = grand mean, shaded box = IQR
Script A M = 59.86 (SD 2.64, n = 120), Script B M = 60.77 (SD 2.89, n = 120), Script C M = 60.54 (SD 2.61, n = 120). This is why an effect size belongs beside every p value. The p value says the difference is detectable; eta squared says it is far too small to act on.

What it means: F(2, 357) = 3.6568 against a critical value of 3.0210, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.0201 is a small effect, meaning group membership accounts for 2.0% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "Handling time differed significantly across scripts, F(2, 357) = 3.66, p = .027, but the effect was small, eta squared = .02, and the largest mean difference was 0.91 seconds, which has no operational consequence."

7
ASSUMPTION FAILURE

Household income by region

Strong right skew and two extreme earners break the normality assumption.

Ten households were sampled in each of three regions. Incomes are in thousands. Two households earn far more than the rest, which is typical of income data everywhere.

n = 30k = 3F = 1.21p = 0.313η2 = 0.083medium effect
QuantityValueNote
Groups compared (k)3Number of independent groups
Total observations (N)30All groups added together
SS between4394.6000Variation explained by group
SS within48865.4000Variation inside the groups
SS total53260.0000SS between plus SS within
df2, 27Between, then within
MS between2197.3000SS between divided by df1
MS within1809.8296SS within divided by df2, the error term
F ratio1.2141Critical F at 0.05 is 3.3541
p value0.3127Right tail area of the F distribution
Eta squared0.0825medium, 8.3% of variance
Omega squared0.0141Bias corrected effect size
Cohen's f0.2999Input for a power analysis
Shapiro-Wilk on residualsW = 0.4708, p = < 0.0001FAILED, normality rejected
Levene (median centred)W = 0.5464, p = 0.5853Passed
Household income by region-26.142.0110.1178.3246.4UrbanM = 52.90SuburbanM = 54.20RuralM = 27.90F(2, 27) = 1.21, p = 0.313, eta squared = 0.083bars = group mean, whiskers = 95% CI, dashed = grand mean
Urban M = 52.90 (SD 58.82, n = 10), Suburban M = 54.20 (SD 44.30, n = 10), Rural M = 27.90 (SD 2.85, n = 10). Shapiro-Wilk rejects normality outright (p < .0001), driven entirely by the two extreme earners, while Levene still passes. The F test is not significant, but with residuals this far from normal the p value cannot be trusted either way.

What it means: F(2, 27) = 1.2141 against a critical value of 3.3541, so the null hypothesis is retained at alpha 0.05. Eta squared of 0.0825 is a medium effect, meaning group membership accounts for 8.3% of the total variation. At least one assumption check failed, so read the note under the figure before reporting the classic F.

How to write it: "Because household income was strongly right skewed and Levene's test was significant, a Kruskal-Wallis test was used in place of the one-way ANOVA, and medians rather than means are reported."

8
APPLIED FIELD TRIAL

Four fertiliser treatments on wheat plots

Four groups rather than three, with six pairwise comparisons to control.

Twenty-eight randomised field plots received a control, nitrogen, phosphate or a full NPK mix. The outcome is grain yield in tonnes per hectare.

n = 28k = 4F = 188.91p < 0.001η2 = 0.959large effect
QuantityValueNote
Groups compared (k)4Number of independent groups
Total observations (N)28All groups added together
SS between34.0714Variation explained by group
SS within1.4429Variation inside the groups
SS total35.5143SS between plus SS within
df3, 24Between, then within
MS between11.3571SS between divided by df1
MS within0.0601SS within divided by df2, the error term
F ratio188.9109Critical F at 0.05 is 3.0088
p value< 0.0001Right tail area of the F distribution
Eta squared0.9594large, 95.9% of variance
Omega squared0.9527Bias corrected effect size
Cohen's f4.8594Input for a power analysis
Shapiro-Wilk on residualsW = 0.9649, p = 0.4522Passed
Levene (median centred)W = 0.0710, p = 0.9749Passed
Four fertiliser treatments on wheat plots3.44.55.76.87.9ControlM = 4.13NitrogenM = 6.00PhosphateM = 5.10NPK mixM = 7.11F(3, 24) = 188.91, p < 0.001, eta squared = 0.959bars = group mean, whiskers = 95% CI, dashed = grand mean
Control M = 4.13 (SD 0.26, n = 7), Nitrogen M = 6.00 (SD 0.26, n = 7), Phosphate M = 5.10 (SD 0.22, n = 7), NPK mix M = 7.11 (SD 0.24, n = 7). With four groups there are six pairwise comparisons, so the multiplicity correction matters much more than it does with three.

What it means: F(3, 24) = 188.9109 against a critical value of 3.0088, so the null hypothesis is rejected at alpha 0.05. Eta squared of 0.9594 is a large effect, meaning group membership accounts for 95.9% of the total variation. Normality and equal variances both hold, so the classic F test is the one to report.

How to write it: "Grain yield differed significantly between fertiliser treatments, F(3, 24) = 188.91, p < .001, eta squared = .96. Tukey HSD tests separated all four treatments, with the NPK mix producing the highest yield."

🧪 13. Data Collection Protocol

The design a one way ANOVA assumes. One categorical factor with three or more levels, each unit measured once, units assigned to levels independently, and one continuous outcome measured the same way in every group. Anything else needs a different test, and no amount of care during analysis can repair a design that does not match.

13.1 Twelve steps to data a one way ANOVA can accept

  1. Write the hypothesis before collecting anything. The null is that all k population means are equal. State the alternative, the alpha level and the post hoc method now, not after you have seen the numbers.
  2. Define the factor and its levels precisely. "Teaching method" is a factor; traditional, flipped and online are its three levels. Levels must be mutually exclusive, so no unit can belong to two.
  3. Define the outcome and its unit. It must be continuous or at least interval, measured on the same instrument, in the same units, with the same precision in every group.
  4. Run a power calculation for the one way ANOVA before recruiting. Use Table 11.5. Decide the smallest effect worth detecting and recruit for it. A study that cannot detect the effect it is looking for wastes everyone's time.
  5. Randomise assignment where you can. Random allocation is what turns a difference into a causal claim. Without it you have an observational comparison, and confounding is your main enemy.
  6. Aim for equal group sizes. Balanced designs are the most robust to unequal variances and give the most power for a fixed total N.
  7. Measure each unit once. If the same person appears in two groups, or is measured twice, independence is broken and a one way ANOVA is the wrong test.
  8. Blind the measurement where possible. The person recording the outcome should not know which group the unit is in.
  9. Record the raw value, never a category. Do not bin a continuous outcome into high, medium and low before analysis. Binning throws away information and lowers power.
  10. Record missing data explicitly. Leave the cell blank with a reason recorded elsewhere. Never type a zero for a value that was not measured.
  11. Keep one row per observation. Two columns: the outcome value and the group label. This long format works in R, Python, SPSS and JASP without reshaping.
  12. Log everything as you go. Dates, instrument, operator, calibration, exclusions. Reviewers ask, and a year later you will not remember.

13.2 The data layout this one way ANOVA calculator expects

Two layouts work. On the Paste tab, one box per group, values comma separated. On the Upload tab, one column per group, with the group name in the header row.

participant_idgroupscorenotes
P001Traditional52-
P002Flipped63-
P003Online55sat exam remotely

That long format is the one to store. To use the Upload tab, pivot it so each group becomes its own column, then click the columns you want loaded as clusters.

13.3 Minimum sample size for a one way ANOVA

Two observations per group is the arithmetic minimum, because a group of one contributes no variance. That is not a useful minimum. Aim for at least 15 per group, which is where the central limit theorem starts to protect you against non-normal residuals, and use Table 11.5 to check whether your target effect is reachable at that size. To detect a medium effect (Cohen's f = 0.25) across three groups at 80% power you need about 53 per group, 159 in total.

13.4 Pre-registration line

Copy this into your pre-registration and edit the bracketed parts: "Group differences in [outcome] will be tested with a one way between-subjects ANOVA at alpha = 0.05. If Levene's test is significant at p < .05, Welch's ANOVA will be reported instead. If the residuals fail Shapiro-Wilk and the design is unbalanced, a Kruskal-Wallis test will be reported. A significant omnibus test will be followed by [Tukey HSD / Games-Howell] pairwise comparisons. The target sample of [n] per group gives 80% power to detect f = [effect]."

13.5 Common mistakes that make data unusable

  • Measuring the same people in every condition, then analysing them as independent groups. This is the single most common fatal error.
  • Different measurement instruments across groups, which turns an instrument difference into a group difference.
  • Collecting until the p value drops below 0.05. Optional stopping inflates the false positive rate far above 5%.
  • Dropping a group after seeing the results because it "did not work".
  • Typing zeros for missing values, which silently drags a group mean down and shrinks its variance.
  • Rounding during data entry, which loses precision that cannot be recovered.
  • Mixing units, such as recording some weights in kilograms and some in pounds.
  • Losing the group labels when data are pasted between spreadsheets. Always keep the id column.

🎯 14. When to Use This Calculator

This free one way ANOVA calculator is designed for anyone comparing the means of three or more independent groups on one continuous outcome: students checking coursework, researchers checking software output, teachers preparing worked examples, and analysts who need an answer before opening R.

14.1 Use it when

  • You have one grouping factor with three or more levels.
  • Each observation comes from a different, unrelated unit.
  • The outcome is continuous: a score, a weight, a time, a concentration, a yield.
  • You want the F ratio, the p value, an effect size and post hoc comparisons together.
  • You need to check whether your equal variance and normality assumptions hold.
  • You need an APA formatted results sentence you can paste into a paper.
  • You want to verify a number produced by SPSS, R, Python, JASP, Minitab or Excel.

14.2 Do not use it when

  • You have exactly two groups. Use an independent samples t test. ANOVA gives the same answer, since F equals t squared, but the t test reports the direction.
  • The same subjects appear in every condition. Use a repeated measures ANOVA or a linear mixed model.
  • You have two grouping factors. Use a two way ANOVA so you can see the interaction.
  • Your outcome is a count or a proportion. Use Poisson or logistic regression, or a chi-square test.
  • Your data are clustered, such as pupils inside schools or leaves on the same tree. Independence fails and F will be too large.
  • You want to control for a continuous covariate. Use ANCOVA.
  • You have several correlated outcomes. Use MANOVA rather than one ANOVA per outcome.

14.3 Four real situations

FieldQuestionFactor and levelsOutcome
EducationDoes teaching method affect exam performance?Method: traditional, flipped, onlineExam score out of 100
Clinical trialsDoes dose affect blood pressure reduction?Arm: placebo, low dose, high doseFall in systolic BP, mmHg
AgronomyWhich fertiliser gives the best yield?Treatment: control, N, P, NPKGrain yield, tonnes per hectare
ManufacturingDo three suppliers deliver the same part strength?Supplier: A, B, CBreaking strength, newtons

14.4 Decision tree

QuestionAnswerTest to use
How many groups?TwoIndependent samples t test
How many groups?Three or moreContinue below
Are the same units measured in every group?YesRepeated measures ANOVA or Friedman
Are the same units measured in every group?NoContinue below
Are the residuals roughly normal?No, and badly soKruskal-Wallis H, then Dunn's test
Are the residuals roughly normal?Yes, or close enoughContinue below
Are the group variances similar?NoWelch's one way ANOVA, then Games-Howell
Are the group variances similar?YesClassic one way ANOVA, then Tukey HSD

🔧 15. Troubleshooting and Common Errors

My F ratio is enormous, in the hundreds. Is that a mistake?

Cause: usually real, if the groups are genuinely far apart relative to their internal spread, but it can also mean the within groups variance is close to zero because values were duplicated by a copy and paste error. Fix: look at Chart 2. If each group is a nearly flat line of identical values, the data were duplicated. If the groups are wide but well separated, the F is real.

The p value shows as less than 0.0001. What should I write?

Cause: the exact value is smaller than four decimal places can show. Fix: write p < .001 in APA style. Never write p = .000, which is not a possible p value and is one of the most common errors reviewers flag.

The overall F is significant but no pair survives the post hoc test.

Cause: the omnibus test uses all the information at once, while each pairwise test uses only two groups and pays a multiplicity penalty. An effect spread evenly across several groups can be detectable overall but not in any single pair. Fix: report the omnibus result honestly, describe the pattern of means as exploratory, and consider a planned contrast next time instead of all pairwise tests.

Levene's test failed. Do I have to abandon the analysis?

Cause: the group variances differ enough that a single pooled error term is not appropriate. Fix: report Welch's one way ANOVA, which this calculator computes on every run, and switch the post hoc method to Games-Howell. Nothing else about your design needs to change.

Shapiro-Wilk says my residuals are not normal.

Cause: skew, heavy tails, outliers, or simply a large sample making the test sensitive to trivial departures. Fix: look at Chart 4 before reacting. If the points sit close to the line and only n is large, carry on. If the plot bends, try a log or square root transformation, remove or explain the outliers, or move to Kruskal-Wallis.

R and SPSS give me different p values for the same data.

Cause: almost always a different default. R's oneway.test defaults to Welch, while aov and SPSS's default one way ANOVA assume equal variances. Fix: pass var.equal = TRUE to oneway.test, or tick Welch in the SPSS Options dialog, and the two will agree.

My Python standard deviations do not match Excel.

Cause: NumPy's np.std defaults to ddof=0, the population formula, while Excel's STDEV.S and R's sd() use n minus 1. Fix: always pass ddof=1 for sample data. This does not change the ANOVA itself, since f_oneway handles it internally, but it does change any SD you report.

The calculator says a group has fewer than two values.

Cause: a typing error, a stray letter that stopped a number parsing, or a column of a spreadsheet that was mostly empty. Fix: check the value count shown next to each group name. A group of one contributes no variance and the test cannot run.

My uploaded CSV loaded the wrong columns.

Cause: the first row was not a header, or the columns you wanted were stored as text because of stray spaces or currency symbols. Fix: non-numeric columns are greyed out on purpose. Clean the column in the spreadsheet first, save again as CSV, and reload. Then click each column you want as its own cluster.

Eta squared and omega squared are quite different from each other.

Cause: small samples. Eta squared is biased upward, and the bias grows as n per group falls. Fix: report omega squared as the primary effect size when you have fewer than about 30 per group, and say which one you used. A negative omega squared is possible and should be read as zero.

My result changed after I removed an outlier.

Cause: in small groups a single extreme value can move a mean and inflate a variance enough to flip the decision. Fix: decide the outlier rule before you look at the p value, apply it uniformly, and report both analyses. Removing a point because it changed the answer is not an analysis, it is a choice.

Nothing happens when I press Run.

Cause: a validation message is showing above the button, usually because a group is empty or two groups share a name. Fix: read the orange box above the Run button. Every failure prints a specific reason there rather than failing silently.

16. Assumptions and Limitations

16.1 Assumptions

  1. Independence of observations. Requires: every value comes from a different unit, and no unit influences another. Check: by design, not by statistic. If it fails: F is inflated, often badly, and the false positive rate can rise from 5% to well over 30% with moderate clustering. Use a repeated measures ANOVA or a mixed model instead.
  2. Normality of residuals. Requires: the residuals, not the raw scores, follow a normal distribution. Check: Shapiro-Wilk on the residuals plus the Q-Q plot in Chart 4. If it fails: with balanced groups of 15 or more the effect on the false positive rate is small. With small unbalanced groups and strong skew, F becomes liberal, meaning too many significant results. Use Kruskal-Wallis or a transformation.
  3. Homogeneity of variance. Requires: the population variances are equal across groups. Check: Levene's test, median centred, plus the largest to smallest variance ratio. If it fails: the direction of the bias depends on the design. If the smaller group has the larger variance, F is liberal and your real alpha is above 5%. If the larger group has the larger variance, F is conservative and you lose power. Use Welch's ANOVA.
  4. Continuous outcome measured on an interval scale. Requires: the differences between values mean the same thing everywhere on the scale. Check: by inspection of the measurement instrument. If it fails: means become hard to interpret, as with Likert items. Use Kruskal-Wallis on ranks.
  5. No extreme outliers. Requires: no single value dominates a group. Check: Chart 2 and Tukey fences at 1.5 times the interquartile range. If it fails: the outlier inflates that group's variance, which inflates MS within and pushes F down, so you lose power. It can also drag the mean and create a false difference.
  6. Random sampling and, for causal claims, random assignment. Requires: units representative of the population, allocated to groups by chance. Check: the study protocol. If it fails: the p value is still computable but no longer generalises, and no causal claim is available.

16.2 Limitations

  1. It is an omnibus test. A significant F never says which groups differ. Use Tukey HSD or Games-Howell to find out.
  2. It only handles one factor. Two grouping variables need a two way ANOVA, which also tests their interaction.
  3. It cannot handle a covariate. Use ANCOVA when a continuous nuisance variable needs controlling.
  4. It assumes one measurement per unit. Repeated measurements need a repeated measures ANOVA or a mixed model.
  5. It is not robust to dependence. Of the three main assumptions, independence is the one that cannot be patched afterwards.
  6. A non-significant result is not evidence of equivalence. To claim two groups are the same you need an equivalence test such as TOST, with a pre-specified equivalence margin.
  7. Effect size conventions are field specific. Cohen's bands come from psychology and may be far too lenient or far too strict elsewhere.
  8. Post hoc power is not informative. Computing power from your observed effect size after the fact just re-expresses the p value. Power calculations belong before data collection.
  9. Multiple outcomes reintroduce multiplicity. Ten separate ANOVAs on ten outcomes need their own correction across the family.
  10. This calculator runs in your browser and is for checking, teaching and exploration. For formal submission, reproduce the numbers in R, Python, SPSS or SAS and cite that software.

🏁 17. Conclusion

Run the analysis above and a full conclusion written around your own numbers will appear here, covering what was found, what it means in practice, the cautions attached to it and the next steps.

17.1 The one way ANOVA in one paragraph

A one way ANOVA answers a single question: are these three or more group means further apart than chance alone would put them? It answers it by splitting the total variation into the part explained by group membership and the part left over, turning each into a mean square, and dividing one by the other. The result is the F ratio, and the p value is simply how far into the right tail of the F distribution that ratio lands.

17.2 What good practice looks like

Set alpha before you look at the data. Check the assumptions before you read the p value. Report the F ratio with both degrees of freedom, the exact p value, an effect size and the descriptive statistics for every group. Follow a significant omnibus test with a corrected post hoc procedure chosen in advance, and give confidence intervals on every pairwise difference. Say plainly what the result does not show. That sequence, followed every time, is what separates a defensible analysis from a lucky one.

17.3 Where to go next

If your groups are the same people measured repeatedly, move to a repeated measures ANOVA. If a second factor matters, move to a two way ANOVA. If a continuous covariate needs controlling, move to ANCOVA. If the residuals will not behave, move to Kruskal-Wallis. And whichever you choose, reproduce the final numbers in R or Python before you submit, using the scripts in Sections 9 and 10 of this one way ANOVA calculator as a starting point.

18. Frequently Asked Questions

Q1. What is a one way ANOVA?

A one way ANOVA, or one way analysis of variance, tests whether three or more independent group means differ. It splits the total variation in a continuous outcome into a between groups part and a within groups part, turns each into a mean square, and divides one by the other to give the F ratio.

Q2. What is the formula for a one way ANOVA?

F = MSbetween ÷ MSwithin. MSbetween is SSbetween divided by k − 1, and MSwithin is SSwithin divided by N − k, where k is the number of groups and N is the total number of observations. Section 6 gives all seven formulas with every symbol defined.

Q3. How do I calculate a one way ANOVA by hand?

Find each group mean and the grand mean. Compute SSbetween as the sum of ni times the squared gap between each group mean and the grand mean. Compute SSwithin as the sum of squared deviations of every value from its own group mean. Divide each by its degrees of freedom to get the mean squares, then divide MSbetween by MSwithin.

Q4. What does the F value mean in a one way ANOVA?

F is a signal to noise ratio. It is how much the group means are spread apart relative to how much people vary inside their own group. An F near 1 means the groups are no further apart than chance predicts. The larger F is, the stronger the evidence against the null hypothesis.

Q5. What is the null hypothesis of a one way ANOVA?

The null hypothesis is that all group population means are equal: μ1 = μ2 = ... = μk. The alternative is that at least one mean differs from at least one other. The alternative is not that all means differ, which is why a significant F still needs a post hoc test.

Q6. What is a good p value for a one way ANOVA?

There is no good p value, only a threshold you set in advance, usually 0.05. Below it you reject the null and say at least one mean differs. At or above it you retain the null and say this study could not detect a difference. Always report the exact value, and never write p = .000.

Q7. How many groups do you need for a one way ANOVA?

At least three for the test to be worth running, although the arithmetic works with two. With exactly two groups a one way ANOVA gives the same answer as an independent samples t test, and F equals t squared, so the t test is the better choice because it also reports the direction.

Q8. What is the difference between a one way ANOVA and a two way ANOVA?

A one way ANOVA has one grouping factor. A two way ANOVA has two, and it tests each main effect plus their interaction. If your design crosses two factors, such as teaching method and gender, a two way ANOVA is the right test because only it can tell you whether the effect of one depends on the other.

Q9. What is the difference between a one way ANOVA and a repeated measures ANOVA?

A one way ANOVA compares independent groups, so each person appears once. A one way repeated measures ANOVA compares conditions measured on the same people, so each person appears in every condition. Repeated measures removes between-subject variability and is usually more powerful, but it adds the sphericity assumption.

Q10. Is the one way ANOVA test robust?

Reasonably, but not unconditionally. With equal group sizes of about 15 or more, the F test tolerates quite non-normal residuals with little change to the false positive rate. It is far less forgiving of unequal variances combined with unequal group sizes, which is why Welch's ANOVA is increasingly recommended as the default. It is not robust at all to a breach of independence.

Q11. What are the assumptions of a one way ANOVA?

Three main ones: independence of observations, normality of the residuals, and homogeneity of variance across groups. The outcome should also be continuous. This calculator tests normality with Shapiro-Wilk and equal variances with Levene's test on every run, and states the direction of the bias when each one fails.

Q12. What is eta squared in a one way ANOVA?

Eta squared is the proportion of the total sum of squares that belongs to the between groups term, so it is read directly as the percentage of variance explained by group membership. Cohen's benchmarks are 0.01 small, 0.06 medium and 0.14 large. Omega squared is the less biased version and is preferred for small samples.

Q13. What post hoc test should I use after a one way ANOVA?

Tukey HSD when the group variances are similar, and Games-Howell when they are not, because Games-Howell uses each pair's own variances and degrees of freedom. Bonferroni works anywhere but loses power quickly as the number of comparisons grows. Choose the method before you see the p values.

Q14. What do I do if Levene's test is significant?

Report Welch's one way ANOVA instead of the classic F test, and use Games-Howell for the pairwise comparisons. This calculator computes Welch's F on every run whether you ask for it or not, so the number is already on the page in the robust alternatives table.

Q15. What is the difference between a one way ANOVA and a Kruskal-Wallis test?

The Kruskal-Wallis H test is the non-parametric equivalent. It works on ranks rather than raw values, so it needs no normality assumption, and it is the usual fallback when residuals are badly skewed or the outcome is ordinal. It is slightly less powerful than ANOVA when the ANOVA assumptions do hold.

Q16. How do I do a one way ANOVA in Excel?

Enable the Analysis ToolPak, then Data → Data Analysis → Anova: Single Factor, set the input range to your columns of group data, tick Labels in first row and press OK. To build it manually, use DEVSQ for the sums of squares and F.DIST.RT for the p value. Section 8 shows every step with spreadsheet screenshots.

Q17. How do I run a one way ANOVA in R?

summary(aov(score ~ group, data = dat)) fits and prints it, with group stored as a factor. Add TukeyHSD() for post hoc comparisons and oneway.test(..., var.equal = FALSE) for Welch's version. Section 9 has a complete script that also checks assumptions and saves a 300 dpi figure.

Q18. How do I run a one way ANOVA in Python?

scipy.stats.f_oneway(group1, group2, group3) returns the F ratio and the p value. Add scipy.stats.tukey_hsd for post hoc comparisons and scipy.stats.levene and scipy.stats.shapiro for the assumption checks. Section 10 has a complete script that prints a plain English verdict.

Q19. How do I report a one way ANOVA in APA format?

Give the F ratio with both degrees of freedom, the exact p value and an effect size in one sentence, for example: F(2, 21) = 19.06, p < .001, η2 = .64. Add the mean, standard deviation and n for every group, and the post hoc comparisons with their confidence intervals. Section 5 fills five reporting templates with your own numbers.

Q20. Can I use this one way ANOVA calculator for my thesis or published research?

Yes for checking, teaching, exploratory work and verifying software output. Every number it produces matches R's aov() and SciPy's f_oneway to four decimal places. For formal submission, reproduce the analysis in R, Python, SPSS or SAS and cite that software. You can cite this tool as StatsUnlock. (2026). One way ANOVA calculator. https://statsunlock.com/one-way-anova-calculator/

📑 19. Cite This Tool

APA 7th edition
StatsUnlock. (2026). One way ANOVA calculator [Interactive statistical tool]. https://statsunlock.com/one-way-anova-calculator/
BibTeX
@misc{statsunlock_anova_2026, title={One Way ANOVA Calculator}, author={{StatsUnlock}}, year={2026}, note={Interactive statistical tool}, url={https://statsunlock.com/one-way-anova-calculator/}}
Methods wording, auto-filled after you run the analysis
Group differences were tested with a one-way analysis of variance (one-way ANOVA). Run the calculator above to fill this paragraph with your own degrees of freedom, F ratio, p value and effect size.

Cite the software you actually ran the final analysis in. If you reproduced these numbers in R or Python, cite R or SciPy as well, using the references in Section 22 as a starting point.

🔗 20. Related Tools

📖 21. Glossary of Terms

TermPlain English meaning
Alpha (α)The threshold you choose before collecting data, usually 0.05. A p value below it counts as evidence against the null hypothesis.
ANOVAAnalysis of variance. A family of tests that compares group means by comparing variances.
Between groups variationHow far the group means sit from the overall mean. The part of the spread that group membership explains.
Cohen's fAn effect size on a different scale from eta squared, used as the input for power and sample size calculations.
Confidence intervalA range of values that, over many repeated studies, would contain the true value 95% of the time.
Degrees of freedomThe number of values free to vary once the necessary averages have been estimated. A one way ANOVA has two: k − 1 and N − k.
Effect sizeA number saying how big a difference is, separate from whether it is statistically detectable.
Eta squared (η2)The share of total variation explained by group membership, read as a percentage.
F distributionThe reference curve the F ratio is compared against. Its shape depends on both degrees of freedom.
F ratioThe test statistic: the between groups mean square divided by the within groups mean square.
Family-wise error rateThe chance of at least one false positive across a whole set of comparisons, which post hoc corrections hold down.
Games-HowellA post hoc test that does not assume equal variances, using each pair's own variances and degrees of freedom.
Grand meanThe mean of every observation from every group taken together.
Homogeneity of varianceThe assumption that every group has the same population variance. Levene's test checks it.
Kruskal-Wallis HThe rank based alternative to a one way ANOVA, used when normality fails.
Levene's testA test of whether group variances are equal, run on the absolute deviations from each group's median.
Mean square (MS)A sum of squares divided by its own degrees of freedom. It is a variance estimate.
Null hypothesisThe starting assumption that all the group population means are equal.
Omega squared (ω2)A version of eta squared corrected for the upward bias that small samples create.
Omnibus testA test of an overall claim. A significant one says something differs somewhere, without saying what.
p valueThe probability of a result at least as extreme as yours if the null hypothesis were true.
Post hoc testA follow-up comparison run after a significant omnibus test, with the error rate corrected.
PowerThe chance a study will detect an effect of a given size if it really exists. Convention is 80% or higher.
ResidualThe gap between one observation and its own group mean. Residuals are what the normality assumption is about.
Shapiro-Wilk testA test of whether a set of values could plausibly have come from a normal distribution.
Sum of squares (SS)The total of the squared distances from a mean. The raw material every ANOVA is built from.
Tukey HSDThe standard post hoc test for equal variances, comparing every pair while holding the family-wise error rate at alpha.
Welch's ANOVAA version of the one way ANOVA that does not assume equal variances, with adjusted degrees of freedom.
Within groups variationHow far each observation sits from its own group mean. The error term, or unexplained variation.

📚 22. References

Twenty peer-reviewed journal articles behind every method this one way ANOVA calculator uses, in APA 7th edition, each with a working DOI link.

  1. Bartlett, M. S. (1937). Properties of sufficiency and statistical tests. Proceedings of the Royal Society of London. Series A, 160(901), 268–282. https://doi.org/10.1098/rspa.1937.0109
  2. Blanca, M. J., Alarcón, R., Arnau, J., Bono, R., & Bendayan, R. (2017). Non-normal data: Is ANOVA still a valid option? Psicothema, 29(4), 552–557. https://doi.org/10.7334/psicothema2016.383
  3. Box, G. E. P. (1954). Some theorems on quadratic forms applied in the study of analysis of variance problems, I. Effect of inequality of variance in the one-way classification. The Annals of Mathematical Statistics, 25(2), 290–302. https://doi.org/10.1214/aoms/1177728786
  4. Brown, M. B., & Forsythe, A. B. (1974). Robust tests for the equality of variances. Journal of the American Statistical Association, 69(346), 364–367. https://doi.org/10.1080/01621459.1974.10482955
  5. Cohen, J. (1992). A power primer. Psychological Bulletin, 112(1), 155–159. https://doi.org/10.1037/0033-2909.112.1.155
  6. Cumming, G. (2014). The new statistics: Why and how. Psychological Science, 25(1), 7–29. https://doi.org/10.1177/0956797613504966
  7. Delacre, M., Leys, C., Mora, Y. L., & Lakens, D. (2019). Taking parametric assumptions seriously: Arguments for the use of Welch's F-test instead of the classical F-test in one-way ANOVA. International Review of Social Psychology, 32(1), 13. https://doi.org/10.5334/irsp.198
  8. Faul, F., Erdfelder, E., Lang, A.-G., & Buchner, A. (2007). G*Power 3: A flexible statistical power analysis program for the social, behavioral, and biomedical sciences. Behavior Research Methods, 39(2), 175–191. https://doi.org/10.3758/BF03193146
  9. Games, P. A., & Howell, J. F. (1976). Pairwise multiple comparison procedures with unequal n's and/or variances: A Monte Carlo study. Journal of Educational Statistics, 1(2), 113–125. https://doi.org/10.3102/10769986001002113
  10. Glass, G. V., Peckham, P. D., & Sanders, J. R. (1972). Consequences of failure to meet assumptions underlying the fixed effects analyses of variance and covariance. Review of Educational Research, 42(3), 237–288. https://doi.org/10.3102/00346543042003237
  11. Keselman, H. J., Huberty, C. J., Lix, L. M., Olejnik, S., Cribbie, R. A., Donahue, B., Kowalchuk, R. K., Lowman, L. L., Petoskey, M. D., Keselman, J. C., & Levin, J. R. (1998). Statistical practices of educational researchers: An analysis of their ANOVA, MANOVA, and ANCOVA analyses. Review of Educational Research, 68(3), 350–386. https://doi.org/10.3102/00346543068003350
  12. Kruskal, W. H., & Wallis, W. A. (1952). Use of ranks in one-criterion variance analysis. Journal of the American Statistical Association, 47(260), 583–621. https://doi.org/10.1080/01621459.1952.10483441
  13. Lakens, D. (2013). Calculating and reporting effect sizes to facilitate cumulative science: A practical primer for t-tests and ANOVAs. Frontiers in Psychology, 4, 863. https://doi.org/10.3389/fpsyg.2013.00863
  14. Olejnik, S., & Algina, J. (2003). Generalized eta and omega squared statistics: Measures of effect size for some common research designs. Psychological Methods, 8(4), 434–447. https://doi.org/10.1037/1082-989X.8.4.434
  15. Royston, P. (1995). Remark AS R94: A remark on Algorithm AS 181: The W-test for normality. Journal of the Royal Statistical Society. Series C (Applied Statistics), 44(4), 547–551. https://doi.org/10.2307/2986146
  16. Schmider, E., Ziegler, M., Danay, E., Beyer, L., & Bühner, M. (2010). Is it really robust? Reinvestigating the robustness of ANOVA against violations of the normal distribution assumption. Methodology, 6(4), 147–151. https://doi.org/10.1027/1614-2241/a000016
  17. Shapiro, S. S., & Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52(3/4), 591–611. https://doi.org/10.2307/2333709
  18. Tukey, J. W. (1949). Comparing individual means in the analysis of variance. Biometrics, 5(2), 99–114. https://doi.org/10.2307/3001913
  19. Wasserstein, R. L., & Lazar, N. A. (2016). The ASA statement on p-values: Context, process, and purpose. The American Statistician, 70(2), 129–133. https://doi.org/10.1080/00031305.2016.1154108
  20. Welch, B. L. (1951). On the comparison of several mean values: An alternative approach. Biometrika, 38(3/4), 330–336. https://doi.org/10.2307/2332579
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Important Plots & Charts

Most Popular