How to make a frequency distribution table by hand
- Find the range: largest value minus smallest value.
- Choose the number of classes (5–15) and divide the range by it. Round the result up to a convenient class width. The class width calculator does this step.
- Write the classes, starting at or just below the smallest value: 50–59, 60–69, 70–79…
- Tally each value into its class, then count the tallies to get the frequency.
- Add columns for relative frequency (f ÷ n), percent and cumulative frequency, and check the total.
Example
25 test scores from 55 to 95, grouped with class width 10:
| Score | Frequency | Relative | Cumulative |
|---|---|---|---|
| 50–59 | 2 | 0.08 | 2 |
| 60–69 | 5 | 0.20 | 7 |
| 70–79 | 8 | 0.32 | 15 |
| 80–89 | 7 | 0.28 | 22 |
| 90–99 | 3 | 0.12 | 25 |
This is the “Test scores” example above. From the table, 15 of 25 students (60%) scored below 80, and the 70s are the modal class.
Next steps
- Draw the table as a histogram, a frequency polygon or an ogive.
- Estimate the mean, median and mode from the table with the grouped data calculator.
Common mistakes to avoid
- Overlapping classes. With classes like 50–60 and 60–70, decide which class gets 60 and stick to it. Limits like 50–59, 60–69 avoid the problem for whole numbers.
- Unequal class widths. Keep widths equal unless you have a good reason, and then use density when you draw it.
- Too many or too few classes. Aim for 5–15 classes.
- A total that doesn’t match n. Always check that the frequencies add up to the number of values.
Do it in other software
| Software | How |
|---|---|
| Excel | =FREQUENCY(data, upper_limits), or =COUNTIFS(data, ">="&lo, data, "<"&hi) for each class. A PivotTable with grouped rows also works. |
| Google Sheets | =FREQUENCY(data, upper_limits) or =COUNTIFS. |
| Python | pd.cut(df["x"], bins=range(50, 101, 10), right=False).value_counts().sort_index() |
Related tools: Histogram Maker, Class Width Calculator, Grouped Data Calculator, Ogive Maker and Descriptive Statistics Calculator.