When Data Aren’t Normal

Info sheet · Statistics for Psychology & Neuroscience

Author

Andrew Bell

Published

September 22, 2026

Info sheet 0.2 (draft) · Prerequisites: the normal distribution; describing data · Give feedback ↗

Working notes for the author — not shown to students once collapsed; remove before publishing.

What you’ll get from this sheet

Real data are often stubbornly non‑normal — and pretending otherwise causes trouble. By the end you should be able to:

  1. Recognise right-skew (reaction times) and left-skew (easy-exam scores).
  2. See how standard transforms (log, √, and friends) reshape a skewed distribution.
  3. Choose between a transformation and a non-parametric test.

Many measurements — reaction times, incomes, firing rates — can’t go below zero and have a long right tail, so they’re right‑skewed, not symmetric. Skew pulls the mean toward the tail and destabilises parametric tests. Two fixes: transform the data (a log transform tames a right tail), or use a non‑parametric test.

First, why it’s a problem

Before the fixes, the warning. Most of our default tests — t-tests, ANOVA, ordinary regression — assume the data (strictly, the model’s residuals) are roughly normal. Feed them badly skewed data and things go wrong quietly: the mean stops being “typical” (it’s dragged toward the long tail), standard errors and p-values get distorted, and a few extreme values in the tail wield outsized influence. Non-normality doesn’t always sink an analysis — but it always earns a second look before you trust the numbers.

Two shapes of skew

  • Right-skew (positive skew) — a long tail to the high side. Reaction times are the textbook case: there’s a hard floor (you can’t respond in negative time) but no ceiling, so the occasional slow trial stretches the right tail. Incomes and neural firing rates behave the same way.
  • Left-skew (negative skew) — a long tail to the low side, values piling up near a ceiling. Scores on an easy exam are the classic case: most students cluster near the top and a few stragglers trail off to the left. “Proportion correct” near 100% and age at death skew this way too.

In both, the mean is pulled toward the tail and away from the bulk of the data — which is exactly why the median is often the more honest summary of a skewed variable.

Fix option 1: transform the data

A transformation re-expresses the values on a new scale to pull the distribution back toward symmetry. Pick a dataset and a transform, and watch the skewness move toward zero (or away from it):

The rules of thumb the demo makes visible: log and square-root pull in a right tail (log is the stronger of the two; √ is the standard choice for count data); squaring or cubing helps a left tail; and the reciprocal (1/x) is a very strong right-tail transform for heavily skewed positive data. You then analyse and report on the transformed scale — remembering that a difference of log-means is a ratio back on the original scale.

Beyond these staples sit less common tools: the Box–Cox and Yeo–Johnson families search for the best power transform automatically (Yeo–Johnson even copes with zeros and negatives), and the rank-based inverse-normal transform forces any distribution to normal by working through ranks. Powerful, but harder to interpret — so reach for the simple transforms first.

Fix option 2: go non-parametric (or lean on robustness)

  • Go non-parametric when no transform helps, or when the data are ordinal to begin with: rank-based tests like Kruskal–Wallis (group comparisons) and Mann–Whitney (two groups) assume nothing about the distribution’s shape.
  • Or lean on robustness — with a decent sample size, ANOVA and t-tests tolerate mild non-normality, because the CLT normalises the sampling distribution of the mean even when the raw data aren’t normal.

See it in code

rng(1);
rt = 250*exp(0.45*randn(300,1));            % right-skewed reaction times
[~, p_raw] = lillietest(rt);                % Lilliefors normality test → p < .05
[~, p_log] = lillietest(log(rt));           % log transform → usually n.s.
[p_raw, p_log]

The R and Python tabs run live; MATLAB is a static reference.

Your reaction‑time data fail a normality test. Give two different ways to proceed.

Two good options. (1) Transform: take the log of the reaction times — this pulls in the long right tail, and if the logged data are approximately normal you can run the usual t‑test/ANOVA on them (reporting results on the log scale). (2) Go non‑parametric: use a rank‑based test that makes no distributional assumption — the Kruskal–Wallis test for comparing groups (or Mann–Whitney for two groups). A third, with a large enough sample: rely on ANOVA’s robustness to mild non‑normality.

You can’t log‑transform zero or negative values — reaction times are fine (all positive), but for data with zeros use log(x + 1) or a square‑root transform instead. Remember that results on a transformed scale need careful interpretation (a difference of log‑means is a ratio back on the raw scale). And it’s the residuals’ normality that matters for a model, not the raw variable’s — check the residuals, not just the histogram of the outcome.

Where this shows up next

If a transform won’t help, the Kruskal–Wallis sheet is your non‑parametric route; the ANOVA assumptions sheet shows how to check normality in the first place. See Chapter (Foundations).