One-Way ANOVA
Calculator
Learn More
One-way ANOVA
Definition
One-way ANOVA (Analysis of Variance) tests whether there are significant differences between the means of three or more independent groups. It extends the t-test to multiple groups while controlling the Type I error rate.
Formula
Key Components:
Between-groups sum of squares, where:
- = mean of group
- = grand mean
- = sample size of group
Within-groups sum of squares, where:
- = th observation in group
- = mean of group
- = sample size of group
Final Test Statistic:
Where:
- = within-groups sum of squares
- = number of groups
- = total sample size
Key Assumptions
Practical Example
Step 1: State the Data
Group A | Group B | Group C |
---|---|---|
8 | 6 | 9 |
9 | 5 | 10 |
7 | 8 | 10 |
10 | 7 | 8 |
Step 2: State Hypotheses
- (all means equal)
- at least one mean is different
Step 3: Calculate Summary Statistics
- Group A:
- Group B:
- Group C:
- Grand mean:
Step 4: Calculate Sums of Squares
Step 5: Calculate Mean Squares
Step 6: Calculate F-statistic
Step 7: Draw Conclusion
The critical value at is .
The calculated F-statistic () is greater than the critical value (), and the p-value () is less than our significance level (). We reject the null hypothesis in favor of the alternative. There is statistically significant evidence to conclude that not all group means are equal. Specifically, at least one group mean differs significantly from the others.
Effect Size
Eta-squared () measures the proportion of variance explained:
Guidelines:
- Small effect:
- Medium effect:
- Large effect:
For the example above, the effect size is:which indicates a large effect.
Code Examples
1library(tidyverse)
2group <- factor(c(rep("A", 4), rep("B", 4), rep("C", 4)))
3values <- c(8, 9, 7, 10, 6, 5, 8, 7, 9, 10, 10, 8)
4
5
6# calculate SS between manually
7mean_values <- tapply(values, group, mean)
8grand_mean <- mean(values)
9ss_between <- sum(table(group) * (mean_values - grand_mean)^2)
10print(str_glue("SS between: {ss_between}")))
11
12# calculate everything manually
13ss_within <- sum((values - ave(values, group, FUN = mean))^2)
14print(str_glue("SS within: {ss_within}"))
15
16ss_total = sum((values - grand_mean)^2)
17print(str_glue("SS total: {ss_total}"))
18
19ms_between = ss_between / (length(unique(group)) - 1)
20print(str_glue("MS between: {ms_between}"))
21
22ms_within = ss_within / (length(values) - length(unique(group)))
23print(str_glue("MS within: {ms_within}"))
24
25f = ms_between / ms_within
26print(str_glue("F: {f}"))
27
28p = 1 - pf(f, length(unique(group)) - 1, length(values) - length(unique(group)))
29print(str_glue("p value: {p}"))
30
31
32# Perform One-Way ANOVA using aov()
33data <- tibble(group, values)
34anova_result <- aov(values ~ group, data = data)
35summary(anova_result)
1import numpy as np
2from scipy import stats
3
4# Data
5group_A = [8, 9, 7, 10]
6group_B = [6, 5, 8, 7]
7group_C = [9, 10, 10, 8]
8
9
10# calculate ss for each group
11ss_A = np.sum((group_A - np.mean(group_A)) ** 2)
12ss_B = np.sum((group_B - np.mean(group_B)) ** 2)
13ss_C = np.sum((group_C - np.mean(group_C)) ** 2)
14
15ss_whithin = ss_A + ss_B + ss_C
16print(f'SS within: {ss_whithin:.4f}')
17
18# calculate ss between
19grand_mean = np.mean([np.mean(group_A), np.mean(group_B), np.mean(group_C)])
20ss_between = len(group_A) * (np.mean(group_A) - grand_mean) ** 2 + len(group_B) * (np.mean(group_B) - grand_mean) ** 2 + len(group_C) * (np.mean(group_C) - grand_mean) ** 2
21print(f'SS between: {ss_between:.4f}')
22
23print(f'SS total: {ss_whithin + ss_between:.4f}')
24ms_within = ss_whithin / (len(group_A) + len(group_B) + len(group_C) - 3)
25print(f'MS within: {ss_whithin:.4f}')
26ms_between = ss_between / 2
27print(f'MS between: {ss_between:.4f}')
28
29f = ms_between / ms_within
30print(f'F-statistic: {f:.4f}')
31
32
33
34# Perform one-way ANOVA
35print('Perform one-way ANOVA using scipy.stats')
36f_stat, p_value = stats.f_oneway(group_A, group_B, group_C)
37
38# Print results
39print(f'F-statistic: {f_stat:.4f}')
40print(f'p-value: {p_value:.4f}')
Alternative Tests
Consider these alternatives when assumptions are violated:
- Kruskal-Wallis Test: Non-parametric alternative when normality is violated
- Welch's ANOVA: When variances are unequal
- Brown-Forsythe Test: Robust to violations of normality
Related Calculators
Independent T-Test Calculator
Paired T-Test Calculator
Two-Way ANOVA Calculator
Kruskal-Wallis Test Calculator
Help us improve
Found an error or have a suggestion? Let us know!