Data Interpretation: Tables, Bar Charts, Pie Charts and Line Graphs
Data interpretation (DI) tests whether you can read numbers off a table or chart and compute something sensible from them quickly. The mathematics is easy: percentages, ratios, averages and growth rates. The difficulty is speed and care: reading the right row and column, keeping units straight, and avoiding unnecessary calculation. Every dataset below is small enough to check, and every answer is verified by computation.
1. The method
- Read the title, axes and units first. Is it Rs crore or Rs lakh? Thousands or millions? Percent or absolute values?
- Read the question before computing, so you know exactly which numbers matter.
- Estimate first. Round values and compare options; exact arithmetic is often unnecessary.
- Use ratios, not totals, when the question asks for a comparison.
- Watch the base of every percentage. "30% of what?" is the commonest trap.
- Check the answer's size against the chart.
Formulas to know cold
- Percentage share .
- Percentage change .
- Percentage-point change is a plain difference of two percentages (not a percent change).
- Average ; weighted average when groups differ in size.
- Ratio of two items, kept as a simplified fraction.
- Compound annual growth rate (CAGR) over years .
- Pie chart: a share of corresponds to an angle of degrees; an angle of corresponds to .
def pct(part, whole):
return part / whole * 100
def pct_change(old, new):
return (new - old) / old * 100
def cagr(first, last, years):
return ((last / first) ** (1 / years) - 1) * 100
assert pct(45, 180) == 25 and pct_change(80, 100) == 25 and pct_change(100, 80) == -20
assert round(cagr(100, 121, 2), 6) == 10.0
assert 25 * 3.6 == 90 and 108 / 360 * 100 == 30
2. Tables
A table gives exact numbers in rows and columns. Typical questions ask for totals, averages, ratios, the largest or smallest value, and percentage change between years.
Table A: sales of three products (Rs crore).
| Year | Product A | Product B | Product C | Total |
|---|---|---|---|---|
| 2019 | 120 | 90 | 60 | 270 |
| 2020 | 140 | 100 | 75 | 315 |
| 2021 | 130 | 125 | 90 | 345 |
| 2022 | 170 | 120 | 110 | 400 |
| 2023 | 190 | 150 | 120 | 460 |
sales = {
2019: {"A": 120, "B": 90, "C": 60},
2020: {"A": 140, "B": 100, "C": 75},
2021: {"A": 130, "B": 125, "C": 90},
2022: {"A": 170, "B": 120, "C": 110},
2023: {"A": 190, "B": 150, "C": 120},
}
total = {y: sum(v.values()) for y, v in sales.items()}
assert total == {2019: 270, 2020: 315, 2021: 345, 2022: 400, 2023: 460}
Q1. What was the percentage growth in total sales from 2019 to 2023? .
Q2. In which year was the year-on-year growth in total sales the highest, and what was it? Growth: 2020: 16.67%, 2021: 9.52%, 2022: 15.94%, 2023: 15.00%. The highest is 2020 at 16.67%.
Q3. What was Product A's share of total sales in 2022? .
Q4. Average annual sales of Product B? .
Q5. In 2021, what was the ratio of Product C's sales to Product A's? .
Q6. What was the compound annual growth rate of total sales between 2019 and 2023? Over 4 years: .
assert round(pct_change(total[2019], total[2023]), 2) == 70.37
growth = {y: round(pct_change(total[y - 1], total[y]), 2) for y in range(2020, 2024)}
assert growth == {2020: 16.67, 2021: 9.52, 2022: 15.94, 2023: 15.0} and max(growth, key=growth.get) == 2020
assert pct(sales[2022]["A"], total[2022]) == 42.5
assert sum(v["B"] for v in sales.values()) / 5 == 117
from fractions import Fraction
assert Fraction(sales[2021]["C"], sales[2021]["A"]) == Fraction(9, 13)
assert round(cagr(total[2019], total[2023], 4), 2) == 14.25
Shortcut for comparing growth. To decide which of two quantities grew faster in percentage terms, compare ratios instead of computing percentages, and compare by cross-multiplication when you can avoid division.
# did A (120 to 190) grow faster than C (60 to 120)? compare 190/120 with 120/60 by cross-multiplying: 190 * 60 against 120 * 120
assert 190 * 60 < 120 * 120 # C's ratio is larger, so C grew faster (100 % against 58.3 %)
assert round(pct_change(60, 120), 1) == 100.0 and round(pct_change(120, 190), 1) == 58.3
3. Bar charts
A bar chart is a table drawn with bars, so read values from the axis labels, and be careful with a broken or non-zero baseline (it exaggerates differences). Stacked bars show parts of a whole; grouped bars compare categories side by side.
<!--fig:bars-->Using the data of Table A, the bars for 2023 are 190, 150 and 120.
Q7. By how much does the combined sales of Products A and C exceed those of Product B across 2021 to 2023? A + C for 2021 to 2023: . B: . Excess .
Q8. In how many years was Product A's sales more than 40% of the total? Shares: 2019: 44.4%, 2020: 44.4%, 2021: 37.7%, 2022: 42.5%, 2023: 41.3%. Years above 40%: 2019, 2020, 2022, 2023, i.e. 4 years.
ac = sum(sales[y]["A"] + sales[y]["C"] for y in (2021, 2022, 2023))
b = sum(sales[y]["B"] for y in (2021, 2022, 2023))
assert (ac, b, ac - b) == (810, 395, 415)
shares = {y: round(pct(sales[y]["A"], total[y]), 1) for y in sales}
assert shares == {2019: 44.4, 2020: 44.4, 2021: 37.7, 2022: 42.5, 2023: 41.3}
assert len([y for y, s in shares.items() if s > 40]) == 4
4. Pie charts
A pie chart shows shares of a single total. Questions give percentages or angles and ask for absolute values (when the total is stated) or ratios (when it is not).
Pie chart: monthly expenditure of a family with an income of Rs 60,000.
| Item | Share | Angle | Amount (Rs) |
|---|---|---|---|
| Rent | 25% | 90° | 15,000 |
| Food | 30% | 108° | 18,000 |
| Education | 15% | 54° | 9,000 |
| Transport | 10% | 36° | 6,000 |
| Savings | 12% | 43.2° | 7,200 |
| Others | 8% | 28.8° | 4,800 |
income = 60000
shares_pie = {"Rent": 25, "Food": 30, "Education": 15, "Transport": 10, "Savings": 12, "Others": 8}
assert sum(shares_pie.values()) == 100
assert {k: round(v * 3.6, 1) for k, v in shares_pie.items()} == {"Rent": 90.0, "Food": 108.0, "Education": 54.0, "Transport": 36.0, "Savings": 43.2, "Others": 28.8}
assert {k: income * v // 100 for k, v in shares_pie.items()} == {"Rent": 15000, "Food": 18000, "Education": 9000, "Transport": 6000, "Savings": 7200, "Others": 4800}
Q9. How much more does the family spend on food than on transport? of 60,000 Rs 12,000.
Q10. The family's income rises by 20% and the Rent amount stays fixed. What is Rent's new share? New income ; rent ; share .
Q11. If expenditure on Education is reduced by 20% and Savings increase by the same amount, what is the new Savings percentage of income? Education falls by points, so savings rise to .
assert (shares_pie["Food"] - shares_pie["Transport"]) * income // 100 == 12000
assert round(pct(15000, income * 1.2), 2) == 20.83
assert shares_pie["Savings"] + 0.2 * shares_pie["Education"] == 15
Ratio of two sectors needs only their angles or percentages: Food : Transport .
5. Line graphs and trends
A line graph shows how a value changes over time. Read points, then compute changes between them. The steepest segment is the biggest change, but be careful: steepness in absolute terms differs from steepness in percentage terms.
Data: students appearing and passing percentage.
| Year | Appeared | Pass % | Passed |
|---|---|---|---|
| 2020 | 800 | 60 | 480 |
| 2021 | 900 | 70 | 630 |
| 2022 | 1000 | 65 | 650 |
| 2023 | 1200 | 75 | 900 |
appeared = {2020: 800, 2021: 900, 2022: 1000, 2023: 1200}
passp = {2020: 60, 2021: 70, 2022: 65, 2023: 75}
passed = {y: appeared[y] * passp[y] // 100 for y in appeared}
assert passed == {2020: 480, 2021: 630, 2022: 650, 2023: 900}
Q12. What was the overall pass percentage over the four years? Total passed ; total appeared ; . (This is a weighted average. The simple average of the four percentages, 67.5%, is wrong because the years have different numbers of candidates.)
Q13. In which year was the increase in the number passed, compared to the previous year, the greatest? Increases: 2021: , 2022: , 2023: . The greatest is 2023.
overall = sum(passed.values()) / sum(appeared.values()) * 100
assert (sum(passed.values()), sum(appeared.values()), round(overall, 2)) == (2660, 3900, 68.21)
assert sum(passp.values()) / 4 == 67.5 and round(overall, 2) != 67.5
inc = {y: passed[y] - passed[y - 1] for y in (2021, 2022, 2023)}
assert inc == {2021: 150, 2022: 20, 2023: 250}
6. Missing-data and caselet problems
Some sets give partial information and ask you to reconstruct the rest. Write down every relationship (totals, ratios, percentages) and solve step by step.
Caselet. Three shops sell 650 units in total. Shop P sells 25% more than Shop Q, and Shop R sells 20% fewer than Shop P. How many units does each sell? Let Q sell units. Then P sells and R sells . The total is , so : Q sells 200, P sells 250, R sells 200.
q = 650 / 3.25
assert q == 200 and (1.25 * q, 0.8 * 1.25 * q) == (250, 200) and q + 1.25 * q + 0.8 * 1.25 * q == 650
7. Mixed and multi-chart sets
Many sets combine a table with a chart (for instance, total units and a pie of regional shares). Combine them: find the total from one, apply the share from the other.
Example. A company sold 8,000 units in a year, with regional shares North 30%, South 25%, East 20%, West 25%. Quarterly the West sold 400, 500, 600 and 500 units. What percentage of the West's annual sales happened in Q3? West annual . Q3 share .
west = 8000 * 25 // 100
assert west == 2000 == 400 + 500 + 600 + 500 and pct(600, west) == 30
8. Approximation and speed techniques
- Round to convenient numbers (to the nearest 5 or 10) when options are far apart.
- Fractions to percentages: know , , , , , , .
- Compare fractions by cross-multiplication or by converting to a common base of 100.
- Skip the unit conversion when only ratios are needed.
- Percentage change from the same base: to find a 20% increase of 450, take 10% (45), double it (90), add: 540.
- Use symmetry and totals to avoid summing columns twice.
assert round(100 / 6, 2) == 16.67 and round(100 / 7, 2) == 14.29 and 100 * 3 / 8 == 37.5
assert 450 + 2 * 45 == 540 == 450 * 1.2
assert Fraction(7, 12) > Fraction(5, 9) and 7 * 9 > 5 * 12 # cross-multiplication: 63 against 60
9. Common traps
- Reading the wrong row, column or bar, especially with similar colours.
- Wrong base for a percentage, or confusing a percentage point change with a percent change.
- Averaging percentages instead of using weighted averages.
- Unit mismatches (lakh versus crore, thousand versus million).
- Truncated axes that make small differences look large.
- Assuming the pie chart total equals a number it does not (always check what the 100% represents).
- Over-calculating: many questions can be answered from the chart by comparison alone.
10. Practice set with answers
Use Table A (sales) and the family pie chart.
- What was the percentage increase in Product C's sales from 2019 to 2023?
- In which year did Product B's sales have the highest percentage of that year's total sales?
- What was the average annual total sales over 2019 to 2023?
- In the pie chart, what is the angle for Savings and how much is saved?
- If the family's income rises to Rs 75,000 and every item keeps its percentage share, how much is spent on Food?
- What is the ratio of Rent to Education spending?
- Over the five years, Product A's total sales were what percentage of all sales?
- By what percentage did total passed students rise from 2020 to 2023 (use the line-graph data)?
assert pct_change(sales[2019]["C"], sales[2023]["C"]) == 100
b_share = {y: pct(sales[y]["B"], total[y]) for y in sales}
assert max(b_share, key=b_share.get) == 2021 and round(b_share[2021], 1) == 36.2
assert sum(total.values()) / 5 == 358
assert (shares_pie["Savings"] * 3.6, income * 12 // 100) == (43.2, 7200)
assert 75000 * 30 // 100 == 22500
assert Fraction(25, 15) == Fraction(5, 3)
a_total = sum(v["A"] for v in sales.values())
assert (a_total, sum(total.values()), round(pct(a_total, sum(total.values())), 1)) == (750, 1790, 41.9)
assert round(pct_change(passed[2020], passed[2023]), 2) == 87.5
Answers: 1) 100%; 2) 2021, at 36.2%; 3) 358 (Rs crore); 4) 43.2° and Rs 7,200; 5) Rs 22,500; 6) 5 : 3; 7) 41.9%; 8) 87.5%.