Statistics Normal Distribution

The normal distribution is a symmetric, bell-shaped pattern where most values cluster near the mean, and the 68-95-99.7 rule tells you exactly what share of the data falls within 1, 2, and 3 standard deviations of it.

The Bell Curve

The normal distribution is a symmetric, single-peaked curve shaped like a bell. Its mean, median, and mode all sit at the same point, right in the center. Values near the mean are common; values far from the mean in either direction become progressively rarer, and the tails get closer and closer to zero without ever quite touching it. Two numbers completely determine the shape of this curve: the mean sets the location of the center peak, while the standard deviation sets the width -- a small standard deviation produces a tall, narrow curve where values stay close to the mean, and a large standard deviation produces a short, wide curve where values are more spread out.

The 68-95-99.7 Rule

For any normal distribution, no matter its mean or standard deviation, the same three proportions always hold when you measure outward from the center in units of standard deviation (SD):

  • About 68% of values fall within 1 standard deviation of the mean (mean +/- 1 SD).
  • About 95% of values fall within 2 standard deviations of the mean (mean +/- 2 SD).
  • About 99.7% of values fall within 3 standard deviations of the mean (mean +/- 3 SD).

For example, suppose adult male height is approximately normal with a mean of 175 cm and a standard deviation of 7 cm. Then about 68% of men are between 168 cm and 182 cm tall, about 95% are between 161 cm and 189 cm, and about 99.7% are between 154 cm and 196 cm.

Example: Verifying the 68-95-99.7 Rule

import math

def normal_cdf(x, mean=0, sd=1):
    z = (x - mean) / (sd * math.sqrt(2))
    return 0.5 * (1 + math.erf(z))

mean, sd = 175, 7  # average adult male height in cm, with its spread

for k in [1, 2, 3]:
    lower = mean - k * sd
    upper = mean + k * sd
    proportion = normal_cdf(upper, mean, sd) - normal_cdf(lower, mean, sd)
    print(f"Within {k} SD ({lower}-{upper} cm): {proportion:.3%}")

# Output:
# Within 1 SD (168-182 cm): 68.269%
# Within 2 SD (161-189 cm): 95.450%
# Within 3 SD (154-196 cm): 99.730%

Example: Converting a Height to a Percentile

import math

def normal_cdf(x, mean=0, sd=1):
    z = (x - mean) / (sd * math.sqrt(2))
    return 0.5 * (1 + math.erf(z))

mean, sd = 175, 7

for h in [161, 175, 189, 196]:
    pct = normal_cdf(h, mean, sd) * 100
    print(f"{h} cm is at the {pct:.1f}th percentile")

# Output:
# 161 cm is at the 2.3th percentile
# 175 cm is at the 50.0th percentile
# 189 cm is at the 97.7th percentile
# 196 cm is at the 99.9th percentile
Z-scoreApprox. Percentile
-22.3%
-115.9%
050.0%
184.1%
297.7%
Note: A z-score converts any normal value into standard units: z = (x - mean) / standard deviation. Once you have a z-score, the percentile table above works for any normal distribution, regardless of its original mean or standard deviation.
Note: Many real-world measurements -- heights, measurement errors, standardized test scores -- turn out to be approximately normal. This isn't a coincidence: when a quantity results from adding up many small, independent random effects, the Central Limit Theorem guarantees it will tend toward a normal shape.
Note: Not every data set is normal. Income, waiting times, and reaction times are often lopsided rather than symmetric. The next lesson covers how to recognize and describe that kind of skewed shape.