Z-Score Calculator

Convert between z-score, probability and percentile in both directions. Live bell curve with shaded tails, one- and two-tailed critical values, full z table.

Runs in your browser

μ = 0, σ = 1 · type a z-score or a p-value — either one solves the other

The standard normal curve with μ = 0 and σ = 1. Type a z-score to get its p-value and percentile, or type a p-value to get the z-score — the conversion runs both ways.

See other distributions →

Real-world presets:
Normal curve with mean 0 and standard deviation 1. The shaded region is to the right of 1.96 and its probability is 0.024998.-3-2-101230.024998

P(X ≥ 1.96) = 0.024998

μ = 0, σ = 1

What to calculate

Type in either box — the other one is solved for you.

Result

P(X ≥ 1.96)
0.024998 P(X ≥ 1.96) = 1 − Φ(1.96) = 0.0249979

Related probabilities

P(X ≤ x)
0.975002
P(X ≥ x)
0.024998
P(−|z| ≤ Z ≤ |z|)
0.950004
Two-tail probability
0.049996
z-score
1.960000
Percentile
97.50th percentile

Distribution summary

Mean
0
Variance
1
Standard deviation
1
Median
0
Mode
0
Skewness
0
Excess kurtosis
0

Empirical rule (68–95–99.7)

RegionRangeP
Within ±1σ-1 – 10.682689
Within ±2σ-2 – 20.954500
Within ±3σ-3 – 30.997300

Critical values

Click a row to jump the graph to that value.

Significance level αOne-tailedTwo-tailed
0.1
0.05
0.025
0.01
0.005
0.001

Convert a raw score

z = (x − μ) / σ
—

Standard normal (z) table

Row = first decimal of z, column = second decimal. Values are Φ(z) = P(Z ≤ z). For negative z use Φ(−z) = 1 − Φ(z).

z0.000.010.020.030.040.050.060.070.080.09
0.00.50000.50400.50800.51200.51600.51990.52390.52790.53190.5359
0.10.53980.54380.54780.55170.55570.55960.56360.56750.57140.5753
0.20.57930.58320.58710.59100.59480.59870.60260.60640.61030.6141
0.30.61790.62170.62550.62930.63310.63680.64060.64430.64800.6517
0.40.65540.65910.66280.66640.67000.67360.67720.68080.68440.6879
0.50.69150.69500.69850.70190.70540.70880.71230.71570.71900.7224
0.60.72570.72910.73240.73570.73890.74220.74540.74860.75170.7549
0.70.75800.76110.76420.76730.77040.77340.77640.77940.78230.7852
0.80.78810.79100.79390.79670.79950.80230.80510.80780.81060.8133
0.90.81590.81860.82120.82380.82640.82890.83150.83400.83650.8389
1.00.84130.84380.84610.84850.85080.85310.85540.85770.85990.8621
1.10.86430.86650.86860.87080.87290.87490.87700.87900.88100.8830
1.20.88490.88690.88880.89070.89250.89440.89620.89800.89970.9015
1.30.90320.90490.90660.90820.90990.91150.91310.91470.91620.9177
1.40.91920.92070.92220.92360.92510.92650.92790.92920.93060.9319
1.50.93320.93450.93570.93700.93820.93940.94060.94180.94290.9441
1.60.94520.94630.94740.94840.94950.95050.95150.95250.95350.9545
1.70.95540.95640.95730.95820.95910.95990.96080.96160.96250.9633
1.80.96410.96490.96560.96640.96710.96780.96860.96930.96990.9706
1.90.97130.97190.97260.97320.97380.97440.97500.97560.97610.9767
2.00.97720.97780.97830.97880.97930.97980.98030.98080.98120.9817
2.10.98210.98260.98300.98340.98380.98420.98460.98500.98540.9857
2.20.98610.98640.98680.98710.98750.98780.98810.98840.98870.9890
2.30.98930.98960.98980.99010.99040.99060.99090.99110.99130.9916
2.40.99180.99200.99220.99250.99270.99290.99310.99320.99340.9936
2.50.99380.99400.99410.99430.99450.99460.99480.99490.99510.9952
2.60.99530.99550.99560.99570.99590.99600.99610.99620.99630.9964
2.70.99650.99660.99670.99680.99690.99700.99710.99720.99730.9974
2.80.99740.99750.99760.99770.99770.99780.99790.99790.99800.9981
2.90.99810.99820.99820.99830.99840.99840.99850.99850.99860.9986
3.00.99870.99870.99870.99880.99880.99890.99890.99890.99900.9990
3.10.99900.99910.99910.99910.99920.99920.99920.99920.99930.9993
3.20.99930.99930.99940.99940.99940.99940.99940.99950.99950.9995
3.30.99950.99950.99950.99960.99960.99960.99960.99960.99960.9997
3.40.99970.99970.99970.99970.99970.99970.99970.99970.99970.9998

Same calculation in code

from scipy.stats import norm
norm.cdf(1.96, loc=0, scale=1)  # 0.02499789514822045

The full z table below highlights the cell for the z-score you are looking at, and every critical-value row jumps the graph to that threshold.

What standardising actually does

z = (x − μ)/σ subtracts the mean and divides by the spread, which turns any measurement into the same unit: standard deviations from the centre. z = 2 is two standard deviations above the mean, z = −1.5 is one and a half below it, and z = 0 is the mean itself. The units cancel, so a z-score has no units at all.

That is what makes scores on different scales comparable. A 620 on an SAT section (μ = 500, σ = 100) is z = 1.2; a 27 on the ACT (μ = 21, σ = 5.4) is z = 1.11 — the SAT result is the slightly stronger one, which no amount of staring at "620 versus 27" would tell you. The same trick lets you compare a runner’s time against a swimmer’s, or this month’s error rate against last quarter’s.

One caution: standardising always works — it is arithmetic — but reading a probability off z requires the data to be approximately normal. A z of 3 in a skewed dataset does not mean 0.13%; it only means "three standard deviations out", and how unusual that is depends on the shape.

Reading the z table

Rows carry z to one decimal, columns the second decimal, and the cell where they meet is Φ(z) = P(Z ≤ z) — the area to the left. For z = 1.96 you take the 1.9 row and the 0.06 column and read 0.9750, which is where "1.96 covers 95%" comes from: 0.9750 on the left leaves 0.0250 in the right tail, and 0.0250 on each side is 0.05 in total.

Negative z is normally not printed, because symmetry covers it: Φ(−z) = 1 − Φ(z). So Φ(−1.5) = 1 − 0.9332 = 0.0668, and a value 1.5 standard deviations below the mean sits at the 6.68th percentile. Printed tables also stop at z = 3.49 (Φ = 0.9998) — past that the third decimal stops changing at table precision, but this page keeps computing rather than stopping.

Not every printed table means the same thing, which is the usual source of confusion in a classroom: some give P(Z ≤ z) (cumulative from the left), some P(0 ≤ Z ≤ z) (from the mean, so 1.96 reads 0.4750) and some the right tail. The table on this page is the cumulative kind and highlights the cell for the z you are currently looking at, so the convention is never in doubt.

From z to a p-value, one tail or two

The one-tailed p-value is P(Z > |z|); the two-tailed one is exactly twice it, because the normal curve is symmetric. z = 1.96 gives 0.0250 and 0.0500; z = 1.64 gives 0.0505 and 0.1010; z = 2.58 gives 0.0049 and 0.0099. The mode buttons switch between the two, and the shading on the curve shows which tails are being counted.

Which one you are entitled to use is decided before you see the data. A two-tailed test asks "is there a difference?"; a one-tailed test asks "is it larger?" and must be justified by the hypothesis, not by the fact that the two-tailed p came out at 0.07. Switching after the fact halves your p-value and doubles your false-positive rate.

And a reminder about what the number means: p is the probability of seeing data at least this extreme if the null hypothesis is true. It is not the probability that the hypothesis is true, not the size of the effect, and 0.049 is not meaningfully different from 0.051.

Critical values and confidence intervals

A critical value is the inverse question: which z leaves α in the tail? Two-tailed, the standard set is 1.6448536 for 90%, 1.9599640 for 95%, 2.5758293 for 99% and 3.2905267 for 99.9%. One-tailed at the same α they become 1.2815516, 1.6448536, 2.3263479 and 3.0902323 — note that the one-tailed 95% value is the two-tailed 90% value, which is where a lot of confusion starts.

A confidence interval for a mean is x̄ ± z·σ/√n. With x̄ = 100, σ = 15 and n = 36 the 95% interval is 100 ± 1.96 × 15/6 = 100 ± 4.9, i.e. 95.1 to 104.9. The margin shrinks with √n, not with n: quadrupling the sample halves the margin, which is the arithmetic behind every "we need four times the data" conversation.

Clicking a row in the critical-value table moves the graph to that threshold, so the shaded area and the number line up on screen. It is the fastest way to answer "is my test statistic past the line?" without looking anything up.

z, percentile, T-score and standard score

The percentile is Φ(z) × 100: z = 0 is the 50th, z = 1 the 84.13th, z = 2 the 97.72nd and z = −1.5 the 6.68th. Percentile is a rank and z is a distance, so equal steps in z are not equal steps in percentile — going from z = 0 to z = 1 moves you 34 percentile points, while z = 2 to z = 3 moves you barely 2.

Most reporting scales are just z rescaled to avoid negatives and decimals: T-score = 50 + 10z (clinical and psychological instruments), IQ = 100 + 15z, SAT section = 500 + 100z, and the Korean CSAT standard score = 100 + 20z for the main subjects and 50 + 10z for the electives. Converting between any two of them is a round trip through z.

So a CSAT standard score of 130 is z = 1.5 and the 93.32nd percentile, 140 is z = 2 and the 97.72nd, and "top 4%" — the usual grade-1 cut — is z = 1.7507, a standard score of about 135. The raw-score converter on this page does the same journey from x, μ and σ in one step.

Using z-scores to find outliers

The common rule is |z| > 3, and it is worth knowing what it costs. In normal data 0.27% of points fall outside ±3σ by chance, so a clean dataset of 10,000 rows should contain about 27 "outliers" that are nothing of the sort. At |z| > 2 the figure is 4.55%, or 455 rows — far too many to inspect and far too many to delete.

There is also a hard ceiling people rarely notice: in a sample of n points, no z-score computed from that sample can exceed (n − 1)/√n. With n = 10 the maximum possible |z| is 2.85, so the "greater than 3" rule can never fire at all — a genuine outlier in a small sample hides itself by inflating the very standard deviation it is measured against.

For small or skewed samples the modified z-score based on the median and the MAD — 0.6745(x − median)/MAD, flagged above 3.5 — is the more robust choice, because a single extreme value cannot drag the centre and the spread the way it drags a mean and a standard deviation.

When to use t instead of z

z assumes you know the population standard deviation. You almost never do — you estimate it from the sample — and with a small sample that estimate is itself uncertain. The t distribution accounts for that by having heavier tails, which makes intervals wider and tests more conservative.

The size of the difference: the two-tailed 5% cut-off is 2.5706 at df = 5, 2.2281 at df = 10, 2.0423 at df = 30, 1.9840 at df = 100 and 1.9623 at df = 1,000, converging on z = 1.9599640. At df = 10 using z instead of t makes a confidence interval 14% too narrow — which is a real difference in a conclusion, not a rounding detail.

Rule of thumb: use t whenever σ is estimated from the data, which is nearly always. Use z for proportions with a large sample, for a standardised score on a scale whose σ is defined by construction (IQ, CSAT standard scores), and whenever n is in the hundreds and the difference no longer matters.

How to use

  1. Type a z-score to get its p-value, or type a p-value to get the z-score.
  2. Choose one-tailed or two-tailed with the mode buttons.
  3. Use “Convert a raw score” to turn x, μ and σ into a z-score.
  4. Click a row in the critical value table to jump the graph to that threshold.

FAQ

Can a z-score be negative, or larger than 3?

Both. A negative z simply means the value is below the mean, and there is no upper bound in theory — z = 5 or z = 8 are perfectly well-defined, just extremely rare in normal data (P(Z > 5) ≈ 2.9e-7). What does have a bound is a z computed inside a finite sample: with n observations the largest possible |z| is (n − 1)/√n, so 2.85 for n = 10 and 9.9 for n = 100.

Should I divide by n or by n − 1 when I compute the standard deviation?

Divide by n only when your numbers are the entire population — every student in the class, every unit in the batch. Divide by n − 1 when they are a sample you are using to say something about a larger group; that is the unbiased estimator, and it is what Excel’s STDEV.S, pandas’ .std() and R’s sd() all use by default. With n = 10 the two differ by about 5%, which moves a z of 2.00 to 1.90.

Is a z-score the same thing as a p-value?

No. The z-score is a position — how far the value sits from the mean in standard deviations — and it can be any real number. The p-value is the tail area beyond it, always between 0 and 1. One maps to the other through Φ, which is what this page does in both directions, but they answer different questions: "how far out is it?" versus "how often would that happen by chance?".

Why do some sources use 1.645 and others 1.96 for the same confidence level?

They are the one-tailed and two-tailed values for α = 0.05. 1.6448536 leaves 5% in a single tail; 1.9599640 leaves 2.5% in each of two tails, 5% in total. A 95% confidence interval is inherently two-sided, so it uses 1.96; a one-sided test at the 5% level uses 1.645. Reporting a two-sided interval built from 1.645 quietly turns it into a 90% interval.

Can I use z-scores on data that is not normal?

You can always compute one — it is just arithmetic — and it remains useful for putting different scales on a common footing, which is why machine-learning pipelines standardise features regardless of shape. What you cannot do is read a probability off it: Φ(z) assumes normality. Without that assumption Chebyshev’s inequality is all you get, and it only promises at least 75% within ±2σ and 89% within ±3σ, against the normal’s 95.45% and 99.73%.

How do I turn a z-score back into a raw score?

x = μ + zσ. To find the score at a given percentile, first get the z from the probability — 1.2815516 for the top 10%, 1.6448536 for the top 5%, 2.3263479 for the top 1% — then apply μ and σ. On the IQ scale the top 1% starts at 100 + 15 × 2.3263479 = 134.9, and on a 100/20 standard-score scale it starts at 146.5. The raw-score panel on this page runs the conversion in both directions.

Related tools

More AI & Data tools: AI & Data

Send feedback

Found a bug or have an idea? Tell us — it helps make the tools better.

Only needed if you would like a reply.

Page: /ai/z-score-calculator/