# Welch's t-test vs Student's t-test: which should you use?

> Use Welch's t-test by default to compare two independent groups. Here is why, how to check which test your software or AI assistant ran, and how to report it.

Canonical: https://www.licklider.ai/guides/welch-vs-student-t-test/
Section: Guides › Comparing two groups
Author: Licklider · Published 2026-11-10 · Last reviewed 2026-11-10 (UTC)

> **Quick answer.** To compare the means of two independent groups, use **Welch's t-test** by default. Student's t-test assumes both groups are equally variable; Welch's test does not, and when the groups are equally variable it gives almost the same answer. R and GraphPad Prism 10 and 11 run Welch's test by default. **SciPy's `stats.ttest_ind` and statsmodels' `ttest_ind` run Student's test by default**: unless the code sets `equal_var=False` (SciPy) or `usevar="unequal"` (statsmodels), the result is Student's.

## Decide in four questions

1. **Two independent groups?** Different animals, patients or cultures in each of two groups: continue. The same subjects measured twice, or matched pairs: use a paired t-test instead. Three or more groups: analyse them together (for example, one-way ANOVA or its Welch version) rather than running t-tests between every pair.
2. **What is one observation?** Count the units you randomised or sampled — usually animals, not wells or cells. Average technical replicates within each animal first ([details](#when-the-default-needs-more-thought)).
3. **Is the outcome a continuous measurement without extreme outliers?** Then continue. Strongly skewed concentrations are usually better compared on a log scale; counts with many zeros need a model for counts.
4. **How many per group?** With moderate group sizes, Welch's test performs well. With three to five, both tests have low power unless the effect is large — plan to lead with the estimate and its interval ([details](#when-the-default-needs-more-thought)).

If you reached the end: **use Welch's t-test**, decided before you look at the data.

## Why Welch is the safer default

Student's t-test pools the spread (variance, the square of the standard deviation) of both groups into one number. That is fine when the groups really are equally variable, and costly when they are not and the group sizes differ.

In a simulation of one million experiments with no true effect, 40 versus 60 per group and one group's standard deviation twice the other's, Student's test produced false positives **8.3%** of the time when the smaller group had the larger spread, and **2.8%** when the larger group did. Welch's test stayed close to the intended 5% in both cases ([Delacre, Lakens & Leys 2017](https://doi.org/10.5334/irsp.82), Figure 2c–d).

The protection costs little. When the spreads are equal, Welch has "practically the same power" — the same chance of detecting a real effect — as Student's test ([Delacre et al. 2017](https://doi.org/10.5334/irsp.82)). [Ruxton (2006)](https://doi.org/10.1093/beheco/ark016) made the same case to behavioural ecologists, calling the unequal-variance test an underused alternative to Student's t-test.

Equal group sizes protect Student's test only partly: with moderate, equal groups (50 and 50 in Delacre's simulation) its error rate stays near 5% despite unequal spreads, but with very small groups that protection fades, and exclusions can turn planned equal groups into unequal ones. Choose Welch unless you have a specific, pre-stated reason to assume equal spreads.

## Same data, two answers

To see what is at stake, here is a constructed example of the case where the two tests disagree: a serum marker (pg/mL) in 12 control mice and 6 treated mice, one value per mouse. The treated mice have a higher average, and they vary far more between animals.

| Group | n | Mean | SD |
| --- | --- | --- | --- |
| Control | 12 | 50.92 | 2.74 |
| Treated | 6 | 63.63 | 13.03 |

The smaller group has the larger spread — the situation in which Student's test is too eager. With spreads like these and no true difference at all, Student's test would flag a "significant" result in about 18% of experiments and Welch's test in about 5% (200,000 simulated experiments; code in our records).

```python
from scipy import stats

control = [48.1, 52.3, 49.7, 55.0, 47.2, 51.8, 50.4, 53.6, 46.9, 54.1, 49.2, 52.7]
treated = [58.4, 79.2, 51.3, 70.8, 47.6, 74.5]

student = stats.ttest_ind(treated, control)                 # default: Student
welch = stats.ttest_ind(treated, control, equal_var=False)  # Welch

for name, r in [("Student", student), ("Welch", welch)]:
    ci = r.confidence_interval(0.95)   # needs SciPy 1.11 or later
    print(f"{name}: t = {r.statistic:.2f}, df = {r.df:.2f}, p = {r.pvalue:.4f}, "
          f"95% CI {ci.low:.2f} to {ci.high:.2f}")
```

```text
Student: t = 3.33, df = 16.00, p = 0.0042, 95% CI 4.63 to 20.80
Welch: t = 2.37, df = 5.22, p = 0.0621, 95% CI -0.93 to 26.36
```

The same comparison in R, where Welch is the default:

```r
control <- c(48.1, 52.3, 49.7, 55.0, 47.2, 51.8, 50.4, 53.6, 46.9, 54.1, 49.2, 52.7)
treated <- c(58.4, 79.2, 51.3, 70.8, 47.6, 74.5)

t.test(treated, control)                    # Welch Two Sample t-test (default)
t.test(treated, control, var.equal = TRUE)  # Student's (pooled) test
```

R 4.3.3 prints `Welch Two Sample t-test` with `t = 2.3654, df = 5.2222, p-value = 0.06215` and a 95% confidence interval of −0.93 to 26.36, matching SciPy with `equal_var=False`.

**What changed.** The difference in means (treated − control) is 12.7 pg/mL either way. Student's test pools the two spreads into one standard deviation of 7.6, so the six highly variable treated mice look more precisely measured than they are, and p = 0.004. Welch's test lets each group keep its own spread and reports p = 0.06. Its degrees of freedom (df, which reflect how much information the spread estimates carry) drop from 16 to 5.2, because six variable mice carry most of the uncertainty.

**How to read it.** Welch's result does not show that the treatment has no effect. The 95% confidence interval — the range of differences compatible with these data — runs from about −1 to 26 pg/mL: the data estimate an increase of 12.7 pg/mL, and the interval still includes zero. More treated animals would narrow it ([ASA statement on p-values](https://doi.org/10.1080/00031305.2016.1154108), principles 3 and 5).

**Report the test you planned.** Having seen both p-values, it is tempting to report the smaller one. Report Welch's result if Welch was the planned or appropriate test, even when its p is above 0.05.

## Decide before you look at the variances

A common habit is to run Levene's test (a test of whether two spreads differ) first and use Student's test when it is "not significant". Skip it and use Welch from the start.

Here is why, in lab-sized numbers. In 20,000 simulated experiments with 6 versus 12 animals, no true effect and the smaller group's standard deviation twice the other's (four times the variance), Levene's test noticed the unequal spread only 28% of the time. Choosing the test that way gave false positives in 9.5% of experiments; using Welch every time gave 5.2% (code in our records). The variance test is simply too weak at these sizes to make the decision for you.

The literature agrees: the two-stage procedure "fails to protect the significance level and usually makes the situation worse", while using the separate-variances (Welch) test unconditionally protects best whenever group sizes are unequal ([Zimmerman 2004](https://doi.org/10.1348/000711004849222), abstract). Pre-testing on the same data leaves the final error rates unknown ([Rasch, Kubinger & Moder 2011](https://doi.org/10.1007/s00362-009-0224-x), abstract).

## When the default needs more thought

Welch's test removes one assumption — equal spreads. Its other conditions still apply: independent observations and a roughly symmetric outcome without extreme outliers. These cases need a closer look.

- **Three to five per group.** Here the evidence pulls both ways. Welch's degrees of freedom can fall towards the smaller group's n − 1, so it has low power unless the effect is large, and de Winter, who found "no objections" to a t-test at five or fewer per group as long as the effect is large, does not recommend Welch at these sizes ([de Winter 2013](https://doi.org/10.7275/e4r6-dj05), discussion). Yet Student's test drifts when spreads differ: with three per group and a 16-fold variance ratio it gave 8.3% false positives against Welch's 5.5%, and with 5 versus 2 animals, the two-animal group more variable, 27.1% against Welch's 10.4% (de Winter 2013). Whichever you choose, choose it in advance and lead with the estimate and its interval. With two animals in a group, no t-test gives a trustworthy answer; plan more animals.
- **Technical replicates and clusters.** Three wells from each of four mice is n = 4 per group, not 12. Average within each mouse, then compare. If animals share cages or litters, or replicate numbers differ a lot, a mixed model is the better tool.
- **Skewed values.** Concentrations and fold changes are often right-skewed. Comparing logged values turns the result into a ratio of geometric means; for the example above, Welch's test on the log scale gives a ratio of 1.23 (95% CI 0.99 to 1.53), p = 0.061 — the same conclusion.
- **Sparse counts with very unequal groups.** In a simulation by [Curtis (2024)](https://doi.org/10.1007/s00362-024-01531-7) with rare counts (Poisson, mean 0.05) in 100 cases and 900 controls, Welch's test gave 8.2% false positives and Student's 4.6%; a likelihood ratio test from logistic regression gave 5.6% and was more robust overall. Model such counts directly rather than choosing between t-tests.
- **Paired measurements.** Before and after in the same animals needs a paired t-test; neither independent-groups test applies.

## Check which test your software or AI ran

The defaults differ by tool, and an AI assistant's code can inherit them: in one published evaluation, ChatGPT applied the Yates correction in SciPy's chi-square function to a large sample because "the parameter defaults to true" ([Ruta et al. 2025](https://doi.org/10.2196/63550), Results).

| Software (checked 10 Nov 2026) | Default for two independent groups | To get Welch |
| --- | --- | --- |
| R 4.3.3 `t.test` | Welch (`var.equal = FALSE`) | Nothing to change |
| GraphPad Prism 10 and 11 | Welch's t test | Nothing to change (Prism 9 and earlier: tick Welch's correction) |
| SciPy 1.18 `stats.ttest_ind` | **Student** (`equal_var=True`) | `equal_var=False` |
| statsmodels 0.15 `ttest_ind` | **Student** (`usevar="pooled"`) | `usevar="unequal"` |
| Pingouin 0.7 `ttest` | Welch only when group sizes differ (`correction="auto"`) | `correction=True` |
| Microsoft Excel `T.TEST` | You choose the type | `=T.TEST(range1, range2, 2, 3)` (returns a p-value only) |

Sources: [SciPy](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html), [R](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/t.test.html), [GraphPad Prism](https://www.graphpad.com/guides/prism/latest/statistics/stat_howto_ttestunpaired.htm), [statsmodels](https://www.statsmodels.org/stable/generated/statsmodels.stats.weightstats.ttest_ind.html), [Pingouin](https://pingouin-stats.org/generated/pingouin.ttest.html), [Excel](https://support.microsoft.com/en-us/office/t-test-function-d4e08ec3-c545-485f-962e-276f7cbed055) documentation.

**Three checks on a result you were given:**

1. **Compare the degrees of freedom with n₁ + n₂ − 2.** Student's test reports exactly that whole number (16 in the example). Welch's df lies between the smaller group's n − 1 and n₁ + n₂ − 2 and is usually a decimal (5.22). If df equals n₁ + n₂ − 2 exactly, Student's test was run.
2. **Search the code.** SciPy's `ttest_ind` without `equal_var=False`, or statsmodels' `ttest_ind` without `usevar="unequal"`, ran Student's test. In R, `var.equal = TRUE` forces Student's.
3. **Read the output header.** R prints `Welch Two Sample t-test` or `Two Sample t-test`.

**Ask precisely.** In a 2024 evaluation of ChatGPT running GPT-4 on eight common tests, prompts giving only the question and variables led to the correct method in 47.5% of attempts. Adding data-cleaning and assumption-checking steps raised this to 85%, and also naming the test raised it to 92.5% ([Ruta et al. 2025](https://doi.org/10.2196/63550), Tables 3–4). A prompt that names the test and its parameter does that work:

```text
Compare the mean of [outcome] between two independent groups ([n1] and [n2] animals,
one value per animal) using Welch's t-test. In Python, call
scipy.stats.ttest_ind(..., equal_var=False). Report the difference in means with its
95% confidence interval, t, the Welch degrees of freedom and the exact p-value.
```

**Where SciGround fits.** SciGround runs this comparison as Welch's t-test for two independent groups, one continuous outcome and one pre-specified comparison. The test is fixed in advance and recorded with the result, and SciGround does not fall back to Student's test or switch methods after seeing a variance check or a p-value. The numerical guarantee and the Welch–Satterthwaite approximation behind Welch's degrees of freedom are reported separately; no exact finite-sample error rate is claimed. See [supported analyses](/sciground/analyses/) and their [conditions](/sciground/analyses/limits/).

## Report it so a reviewer can check it

Reviewers cannot tell which test you ran unless you say so. In a review of physiology papers, 53% of those using t-tests did not state whether any test was paired or unpaired, and, by our count from the reported figures, 29% of papers with unpaired tests (45 of 155) did not state the variance assumption for any of them ([Weissgerber et al. 2018](https://doi.org/10.7554/eLife.36163), Results).

**Methods sentence** (keep the bracketed parts only if they are true):

> Means of the two groups were compared with a two-sided Welch's t-test (unequal variances)[, specified before the data were analysed]; the unit of analysis was the [animal]. Analyses used [software and version].

"Two-sided" means the test looks for a difference in either direction; "unit of analysis" is what one value in the test represents.

**Results sentence (the example above):**

> Mean serum marker was 63.6 pg/mL (SD 13.0, n = 6) in treated mice and 50.9 pg/mL (SD 2.7, n = 12) in controls; difference (treated − control) 12.7 pg/mL, 95% CI −0.9 to 26.4; Welch's t(5.22) = 2.37, p = 0.062.

Give Welch's decimal degrees of freedom, the exact p-value, and the difference with its confidence interval first: they carry the size of the effect, which the p-value does not ([ASA 2016](https://doi.org/10.1080/00031305.2016.1154108), principle 5). Then check your draft for the three omissions reviewers most need filled in t-test reporting: which test (Welch or Student, paired or unpaired), what n counts, and an effect estimate with its interval.

## References

- Curtis D (2024). Welch's t test is more sensitive to real world violations of distributional assumptions than Student's t test but logistic regression is more robust than either. *Statistical Papers* 65(6):3981–3989. [doi:10.1007/s00362-024-01531-7](https://doi.org/10.1007/s00362-024-01531-7)
- de Winter JCF (2013). Using the Student's t-test with extremely small sample sizes. *Practical Assessment, Research & Evaluation* 18(10). [doi:10.7275/e4r6-dj05](https://doi.org/10.7275/e4r6-dj05)
- Delacre M, Lakens D, Leys C (2017). Why psychologists should by default use Welch's t-test instead of Student's t-test. *International Review of Social Psychology* 30(1):92–101. [doi:10.5334/irsp.82](https://doi.org/10.5334/irsp.82); correction (2022) [doi:10.5334/irsp.661](https://doi.org/10.5334/irsp.661)
- Rasch D, Kubinger KD, Moder K (2011). The two-sample t test: pre-testing its assumptions does not pay off. *Statistical Papers* 52:219–231. [doi:10.1007/s00362-009-0224-x](https://doi.org/10.1007/s00362-009-0224-x)
- Ruta MR, Gaidici T, Irwin C, Lifshitz J (2025). ChatGPT for univariate statistics: validation of AI-assisted data analysis in healthcare research. *Journal of Medical Internet Research* 27:e63550. [doi:10.2196/63550](https://doi.org/10.2196/63550)
- Ruxton GD (2006). The unequal variance t-test is an underused alternative to Student's t-test and the Mann–Whitney U test. *Behavioral Ecology* 17(4):688–690. [doi:10.1093/beheco/ark016](https://doi.org/10.1093/beheco/ark016)
- Wasserstein RL, Lazar NA (2016). The ASA statement on p-values: context, process, and purpose. *The American Statistician* 70(2):129–133. [doi:10.1080/00031305.2016.1154108](https://doi.org/10.1080/00031305.2016.1154108). Principles as listed in the [ASA's statement release](https://www.amstat.org/asa/files/pdfs/p-valuestatement.pdf).
- Weissgerber TL, Garcia-Valencia O, Garovic VD, Milic NM, Winham SJ (2018). Why we need to report more than 'Data were analyzed by t-tests or ANOVA'. *eLife* 7:e36163. [doi:10.7554/eLife.36163](https://doi.org/10.7554/eLife.36163)
- Zimmerman DW (2004). A note on preliminary tests of equality of variances. *British Journal of Mathematical and Statistical Psychology* 57(1):173–181. [doi:10.1348/000711004849222](https://doi.org/10.1348/000711004849222)
- Software documentation accessed 10 November 2026: SciPy 1.18 `scipy.stats.ttest_ind`; R `stats::t.test`; GraphPad Prism 11 Statistics Guide; statsmodels 0.15 `ttest_ind`; Pingouin 0.7 `ttest`; Microsoft Excel `T.TEST`.

## Related

- [Should you test for normality first?](https://www.licklider.ai/guides/should-you-test-for-normality/)
- [Before asking an AI agent to compare groups](https://www.licklider.ai/blog/before-asking-an-agent-to-compare-groups/)
- [Supported analyses in SciGround, including two-group comparisons](https://www.licklider.ai/sciground/analyses/)
- [Conditions and limits of SciGround's supported analyses](https://www.licklider.ai/sciground/analyses/limits/)
- [GraphPad Prism alternatives, and when to keep Prism](https://www.licklider.ai/alternatives/graphpad-prism-alternatives/)
- [Unequal group sizes](https://www.licklider.ai/guides/unequal-group-sizes/)

## How this page was made

- Written and published by Licklider. The choice between the two tests, and every figure from the literature, is cited to peer-reviewed studies or official software documentation listed under References; general practice points such as averaging technical replicates are standard statistical practice. Cited figures were checked against the source text; where only an abstract or an official summary was accessible, the page states the claim at that level.
- The worked example uses constructed data. Its numbers and our own simulations were produced by stored code (Python with SciPy 1.18.1 and statsmodels 0.15.0; R 4.3.3); the worked example was also cross-checked against an independent 50-digit implementation.
- Separate review passes checked the statistics, the citations, product statements and readability before publication.
