**Welch’s ANOVA** is an alternative to the typical one-way ANOVA when the assumption of equal variances is violated.

The following step-by-step example shows how to perform Welch’s ANOVA in Python.

**Step 1: Create the Data**

To determine if three different studying techniques lead to different exam scores, a professor randomly assigns 10 students to use each technique (Technique A, B, or C) for one week and then makes each student take an exam of equal difficulty.

The exam scores of the 30 students are shown below:

A = [64, 66, 68, 75, 78, 94, 98, 79, 71, 80] B = [91, 92, 93, 90, 97, 94, 82, 88, 95, 96] C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]

**Step 2: Test for Equal Variances**

Next, we can perform Bartlett’s test to determine if the variances between each group is equal.

If the p-value of the test statistic is less than some significance level (like α = .05) then we can reject the null hypothesis and conclude that not all groups have the same variance.

We can use the following code to perform Bartlett’s test in Python:

**import scipy.stats as stats
#perform Bartlett's test
stats.bartlett(A, B, C)
BartlettResult(statistic=9.039674395, pvalue=0.010890796567)
**

The p-value (**.01089**) from Bartlett’s test is less than α = .05, which means we can reject the null hypothesis that each group has the same variance.

Thus, the assumption of equal variances is violated and we can proceed to perform Welch’s ANOVA.

**Step 3: Perform Welch’s ANOVA**

To perform Welch’s ANOVA in Python, we can use the **welch_anova()** function from the Pingouin package.

First, we need to install Pingouin:

pip install Pingouin

Next, we can use the following code to perform Welch’s ANOVA:

import pingouin as pg import pandas as pd import numpy as np #create DataFrame df = pd.DataFrame({'score': [64, 66, 68, 75, 78, 94, 98, 79, 71, 80, 91, 92, 93, 90, 97, 94, 82, 88, 95, 96, 79, 78, 88, 94, 92, 85, 83, 85, 82, 81], 'group': np.repeat(['a', 'b', 'c'], repeats=10)}) #perform Welch's ANOVA pg.welch_anova(dv='score', between='group', data=df) Source ddof1 ddof2 F p-unc np2 0 group 2 16.651295 9.717185 0.001598 0.399286

The overall p-value (**.001598**) from the ANOVA table is less than α = .05, which means we can reject the null hypothesis that the exam scores are equal between the three studying techniques.

We can then perform the Games-Howell post-hoc test to determine exactly which group means are different:

pg.pairwise_gameshowell(dv='score', between='group', data=df) A B mean(A) mean(B) diff se T df pval 0 a b 77.3 91.8 -14.5 3.843754 -3.772354 11.6767 0.0072 1 a c 77.3 84.7 -7.4 3.952777 -1.872102 12.7528 0.1864 2 b c 91.8 84.7 7.1 2.179959 3.256942 17.4419 0.0119

From the p-values we can see that the mean difference between groups **a** and **b** are significantly different and the mean difference between groups **b** and **c** are significantly different.

**Additional Resources**

How to Perform a One-Way ANOVA in Python

How to Perform a Two-Way ANOVA in Python

How to Perform a Repeated Measures ANOVA in Python