Written and maintained by CASRAI Editorial Board
Last updated
To interpret a frequency distribution table, first confirm that the table is internally consistent, then read each column for what it answers: the frequency column says how many, the relative frequency column says what share, and the cumulative column says how many (or what share) fall at or below a value. The worked examples below turn two published tables into plain-language findings, and the last section shows how to compute the same columns in Excel, R and Python.
How to interpret a frequency distribution (step by step)
- Check the table before reading it. The frequencies must add up to n, the number of observations.
- Find the most frequent value or class. That is the mode (or modal class for grouped data).
- Read relative frequency as a share. Multiply by 100 to state it as a percentage, and always give n alongside it.
- Read cumulative columns as “at or below” statements, never as the size of a single class.
- Describe the pattern. Say where values concentrate, how far they spread, and whether either end carries few observations.
The terms follow the standard textbook definitions. OpenStax Introductory Statistics 2e (section 1.3) defines a frequency as “the number of times a value of the data occurs”, and a relative frequency as the ratio of that count to the total number of data values. Statistics Canada’s Power of Data chapter on data exploration describes the distribution of a variable as the pattern of its frequencies. For building the table in the first place, see relative frequency and frequency distributions.
Check the table first
Three checks catch most errors before any interpretation starts.
| Check | What you should see | If it fails |
|---|---|---|
| Frequencies sum to n | The total row equals the number of observations | A class is missing or a value was counted twice |
| Relative frequencies sum to about 1 | 1.00, or very close | Rounding is the usual cause. OpenStax notes that “because of rounding, the relative frequency column may not always sum to one”, but each sum should be close to one |
| Last cumulative entry is 1 (100%) | 1.00 or 100% | An earlier cumulative step was added wrongly |
OpenStax’s rounding rule for these columns is to carry your final answer one more decimal place than was present in the original data. The tables in this guide use two decimal places for relative frequency, as in the source.
Reading the frequency, relative frequency and cumulative columns
What does the frequency column tell you?
It tells you how many observations take each value or fall in each class. The largest frequency marks the mode for ungrouped data and the modal class for grouped data. Frequencies alone cannot be compared across datasets of different sizes.
What does relative frequency tell you?
It tells you the share of observations in a row, found by dividing the frequency by n. Statistics Canada’s battery-life example shows the reading: an interval holding 2 of 30 batteries has a relative frequency of 0.07, so about 7% of the batteries last from 360 minutes up to, but less than, 370 minutes. Multiplying a relative frequency by 100 gives the percentage frequency.
What does cumulative frequency tell you?
Cumulative frequency counts the observations that lie at or below a given value (Statistics Canada: it is “used to determine the number of observations that lie below a particular value”). Cumulative relative frequency is the same running total expressed as a share. In Statistics Canada’s age table, a cumulative frequency of 3 at the 45-54 class means three participants fall in the 54-or-younger group. A plotted version of this column is an ogive.
Example 1: discrete data (hours of student work)
OpenStax Table 1.12 records the weekly work hours of 20 students (n = 20).
| Hours | Frequency | Relative frequency | Cumulative relative frequency |
|---|---|---|---|
| 2 | 3 | 0.15 | 0.15 |
| 3 | 5 | 0.25 | 0.40 |
| 4 | 3 | 0.15 | 0.55 |
| 5 | 6 | 0.30 | 0.85 |
| 6 | 2 | 0.10 | 0.95 |
| 7 | 1 | 0.05 | 1.00 |
Checks: 3 + 5 + 3 + 6 + 2 + 1 = 20, the relative frequencies sum to 1.00, and the final cumulative value is 1.00.
Interpretation, written as sentences:
- The most common value is 5 hours, reported by 6 of 20 students (30%).
- Eight of 20 students (40%) worked 3 hours or fewer, read directly from the cumulative column at 3.
- Eleven of 20 (55%) worked 4 hours or fewer, so a little over half the group works 4 hours or less.
- Three of 20 (15%) worked more than 5 hours, which is 1.00 minus the cumulative 0.85 at 5.
Example 2: grouped data (soccer player heights)
OpenStax Table 1.13 groups the heights, in inches, of 100 soccer players into classes.
| Height class (inches) | Frequency | Relative frequency | Cumulative relative frequency |
|---|---|---|---|
| 59.95 to 61.95 | 5 | 0.05 | 0.05 |
| 61.95 to 63.95 | 3 | 0.03 | 0.08 |
| 63.95 to 65.95 | 15 | 0.15 | 0.23 |
| 65.95 to 67.95 | 40 | 0.40 | 0.63 |
| 67.95 to 69.95 | 17 | 0.17 | 0.80 |
| 69.95 to 71.95 | 12 | 0.12 | 0.92 |
| 71.95 to 73.95 | 7 | 0.07 | 0.99 |
| 73.95 to 75.95 | 1 | 0.01 | 1.00 |
| Total | 100 | 1.00 |
Checks: 5 + 3 + 15 + 40 + 17 + 12 + 7 + 1 = 100, and the relative frequencies sum to 1.00.
Interpretation:
- The modal class is 65.95 to 67.95 inches. It holds 40 of 100 players (40%), more than any other class.
- Sixty-three percent of players are shorter than 67.95 inches (cumulative 0.63), so 37% are taller than that.
- Only 8 players (8%) fall in the two tallest classes, 71.95 to 75.95 inches (0.07 + 0.01).
- The counts rise to the modal class and then fall away, with a longer run of small classes on the tall side. Describe this as an observation about these 100 players, not as a claim about a population.
Grouped tables hide the individual values inside each class. To estimate an average from them you need class midpoints; see class midpoint and how to find the mean of a frequency distribution table. The width of each class is covered in how to calculate class width.
Common misreadings
Reporting a percentage without n
“40% of players” means little without knowing it is 40 of 100. A relative frequency of 0.40 from 5 observations and one from 500 carry very different weight, so state n.
Treating a cumulative value as one class
The 0.63 in Example 2 is the share of players up to 67.95 inches, not the share in that class (which is 0.40). Subtract the previous cumulative value to get a single class share: 0.63 minus 0.23 equals 0.40.
Misplacing a value on a class boundary
Statistics Canada reads its battery-life class as 360 minutes up to but less than 370 minutes. Check which end of each class the table includes before you decide where a boundary value was counted.
Drawing a shape from very few classes
With only a handful of classes, the outline of the distribution depends heavily on where the class edges were placed. Re-grouping can change what looks like a peak. If the table shows two separate peaks, see multimodal distribution, and for a visual check of the same counts see types of graphs in statistics.
Formulas and a worked lookup for the columns
| Column | Formula | Example 1, value 5 |
|---|---|---|
| Relative frequency | f / n | 6 / 20 = 0.30 |
| Percentage frequency | (f / n) × 100 | 0.30 × 100 = 30% |
| Cumulative frequency | running sum of f | 3 + 5 + 3 + 6 = 17 |
| Cumulative relative frequency | cumulative f / n | 17 / 20 = 0.85 |
All values here are rounded to two decimal places, following the OpenStax convention for these tables.
Compute these columns in Excel, R and Python
The snippets rebuild Example 1 from its frequencies.
Excel
A2:A7 = 2,3,4,5,6,7 (hours) B2:B7 = 3,5,3,6,2,1 (frequency) B8 = SUM(B2:B7) (n = 20) C2 = B2/$B$8 (relative frequency, fill down) D2 = SUM($C$2:C2) (cumulative relative frequency, fill down)
R
hours <- c(2,3,4,5,6,7) f <- c(3,5,3,6,2,1) rf <- round(f / sum(f), 2) crf <- round(cumsum(f) / sum(f), 2) data.frame(hours, f, rf, crf)
Python
import pandas as pd
t = pd.DataFrame({"hours": [2,3,4,5,6,7], "f": [3,5,3,6,2,1]})
t["rf"] = (t["f"] / t["f"].sum()).round(2)
t["crf"] = (t["f"].cumsum() / t["f"].sum()).round(2)
print(t)
Each snippet returns the relative and cumulative columns shown in Example 1. For raw data rather than tallies, use table() in R or value_counts() in pandas to produce the frequency column first.
Frequently asked questions
How do you interpret a frequency distribution?
Check that the frequencies sum to n, find the mode or modal class, read relative frequencies as shares of n, and read cumulative columns as “at or below” statements. Then describe where the observations concentrate and how they spread.
How do you interpret a frequency distribution table example?
Take Example 1 above: 6 of 20 students (30%) worked 5 hours, the most common value, and 55% worked 4 hours or fewer. Each statement comes from one column and one row of the table.
What is the difference between relative and cumulative relative frequency?
Relative frequency is the share of observations in one row. Cumulative relative frequency is the share in that row plus every row before it, so it always ends at 1.00.
Why does my relative frequency column not sum to exactly 1?
Rounding. OpenStax notes the column may not sum to one because of rounding, though each sum should be close to one.
Sources
- OpenStax, Introductory Statistics 2e, section 1.3, “Frequency, Frequency Tables, and Levels of Measurement”: https://openstax.org/books/introductory-statistics-2e/pages/1-3-frequency-frequency-tables-and-levels-of-measurement (Tables 1.12 and 1.13; date checked 2026-10-29).
- Statistics Canada, Power of Data, “Data exploration”: https://www150.statcan.gc.ca/n1/edu/power-pouvoir/ch8/5214814-eng.htm (date checked 2026-10-29).








