Product Manager Interviews Module 4 – Estimation and product strategy
Estimation questions, step by step
Answer estimation questions in a product interview: clarify what is counted, build a tree of factors, give a range and check it by a second route.
What you will learn
- Decompose an estimation question into a tree of factors you can estimate
- Choose top-down or bottom-up and state each assumption with its source
- State a range from low and high assumptions and check it by a second route
- Use official Indian data as anchors without counting subscriptions as people
Before you start
What you’ll learn · Before you start
What you will learn
- Decompose an estimation question into a tree of factors you can estimate
- Choose top-down or bottom-up and state each assumption with its source
- State a range from low and high assumptions and check it by a second route
- Use official Indian data as anchors without counting subscriptions as people
Before you start
On this page
How many e-rickshaw rides does a city of 1.5 million people take on a weekday? Nobody can look that up, which is why interviewers ask it: they want to watch you turn a question without data into a number you can defend in about five minutes, with every assumption said out loud.
Below, you answer that question with a method of five steps: clarify what is counted, split it into factors, give each factor a range, multiply, and check the result by a second route. Then you anchor estimates on official figures, which count subscriptions rather than people, and practise saying the tree before the numbers.
Five steps turn a question without data into a number
An estimation question, also called a guesstimate or a Fermi estimate: An estimate of a number nobody has measured, built by splitting it into factors that can each be reasoned about or looked up and multiplying them, given as a range with every assumption said aloud., asks for a number nobody has measured for you. The number itself matters less than the way you reach it, because an interviewer can follow, question and correct a stated assumption, while a number from nowhere can only be accepted or rejected.
Five steps do that work, in order. The figure walks them on the e-rickshaw question; the arrow back from the check is the step that weak answers skip:
The drawing shows the whole scene; its 7 steps are listed below.
Every step as text
- The question. How many e-rickshaw rides does an invented city of 1.5 million people take on a weekday? No data comes with the question, so every number in the answer will be an assumption said out loud.
- Clarify. A shared e-rickshaw carries about three riders a trip, so passenger rides and vehicle trips differ about threefold. The answer counts passenger rides, on a working weekday, across the whole city.
- Split it. Top-down: people, times the share who ride on a weekday, times the rides each takes. Bottom-up: e-rickshaws, times the trips each makes, times the riders on a trip. Every factor is one you can picture or look up.
- Estimate. Each factor gets a low, a base and a high value, the ones you would be surprised to fall below or rise above. The share who ride today, for example, is 12 %, 18 % and 25 %.
- Multiply. 1.5 million × 18 % × 2.0 gives 540,000 rides top-down; 9,000 × 24 × 3 gives 648,000 bottom-up. The lows and the highs give 288,000 to 900,000 and 270,000 to 1,260,000.
- Check. The two bases are 1.2 times apart, within the two-times rule of thumb, so both routes stand. Five times apart would send the answer back to the tree, to find the factor that disagrees.
- Answer. About 600,000 passenger rides a weekday, and roughly 300,000 to 900,000, where the two ranges overlap. The share who ride is the widest factor, so it is the one to discuss first.
The method is MySmartCoPilot’s recommendation, and each step has a section below. Whatever method you use, every number you say should come from a factor you have named.
Clarify the unit, the period and the area first
A shared e-rickshaw carries about three riders a trip, so in the bottom-up tree below, 216,000 vehicle trips carry 648,000 passenger rides: the same city, two answers three times apart. Before you split anything, pin down what one unit is, over which period and where. As the method lesson puts it for any open question, ask only what would change your answer, and say your own assumption for the rest:
| Ask | Why it changes the number | The assumption here |
|---|---|---|
| Passenger rides or vehicle trips? | A shared trip carries about three riders | Passenger rides |
| A weekday, or an average day? | Weekend travel follows other patterns | A working weekday |
| E-rickshaws only, or every three-wheeler? | Auto-rickshaws do the same job and would add their rides | Battery e-rickshaws only |
| The whole city, or its centre? | A smaller area holds fewer rides | The whole city |
Answering a question nobody asked
Wrong: multiplying e-rickshaws by their trips and calling the result “rides”, when the interviewer meant passengers. Right: name the unit before the first number (“I will count passenger rides, so one shared trip with three riders is three rides”) and keep the unit on every number you say.
Checkpoint
Check: Clarifying the unit, period and area · The five steps of an estimate
Split the number into factors you can estimate
Weekday rides are hard to guess as one number and easy to build from parts. From the demand side, rides are the people in the city, times the share who take an e-rickshaw on a weekday, times the rides each of them takes. From the supply side, they are the e-rickshaws in the city, times the trips each makes, times the riders on a trip. Each factor is something you can picture, recall or look up, and multiplying the factors of one route gives its estimate. Here are both routes as an estimate tree:
Weekday e-rickshaw rides, estimated top-down and bottom-up
Text description of the diagram
Two columns, one per route, each read from the top down. Every arrow multiplies by one factor; the values in brackets are the factor's low and high.
Top-down, from people: 1.5 million people, times 18 % who ride an e-rickshaw on a weekday (12 to 25 %), times 2.0 rides each (1.6 to 2.4), gives 540,000 rides (288,000 to 900,000).
Bottom-up, from vehicles: 9,000 e-rickshaws (6,000 to 12,000), times 24 trips each (18 to 30), times 3 riders a trip (2.5 to 3.5), gives 648,000 rides (270,000 to 1,260,000).
The two bases are 1.2 times apart.
Read each column from the top: every arrow multiplies by one factor, and the bottom box is the product. The values in brackets are each factor’s low and high, which the section on ranges uses.
A factor you could picture
Test each factor by asking whether you could picture it or find it: “riders on a trip” is something you have seen, while “demand for e-rickshaws” is the question again under another name. Split a factor until each part passes.
Two routes that share no factor check each other
A top-down estimate starts from a large total you know, such as the population, and narrows it with shares and
rates. A bottom-up estimate starts from units you can count, such as vehicles, shops or seats, and builds up from
their capacity and use. Worked separately, the two routes share no factor, so a wrong assumption in one does not
repeat in the other. The program multiplies both trees of the figure; step through it and watch low, base and
high take one factor on each pass of the loop:
Program · trace/estimate_tree.py
# Weekday e-rickshaw rides in an invented
# city of 1.5 million people. Each factor
# is an assumption: (low, base, high).
routes = {
"top-down": {
"people": (1.5e6, 1.5e6, 1.5e6),
"share who ride": (0.12, 0.18, 0.25),
"rides each": (1.6, 2.0, 2.4),
},
"bottom-up": {
"e-rickshaws": (6000, 9000, 12000),
"trips each": (18, 24, 30),
"riders a trip": (2.5, 3.0, 3.5),
},
}
bases = []
for name, tree in routes.items():
low = base = high = 1
for lo, mid, hi in tree.values():
low = low * lo
base = base * mid
high = high * hi
print(name, "base", round(base))
print(" range", round(low), round(high))
bases.append(base)
print("ratio:", round(bases[1] / bases[0], 2)) Variables
- just taken by the loop
- changed in this step
- passed by the loop
- read next
- where the loop stopped
Printed so far
Nothing printed yettop-down base 540000 range 288000 900000 bottom-up base 648000 range 270000 1260000 ratio: 1.2
Every step was recorded from a run with Python 3.14.8 on macOS 26 arm64.
The drawing shows the variables when the program ends, and the program's 42 steps are listed below.
Change the program and run it here. Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
Every step as text
- Start. No line has run yet, so there are no variables. Python starts with line 4.
- Line 4.
routes = { "top-down": { "people": (1.5e6, 1.5e6, 1.5e6), "share who ride": (0.12, 0.18, 0.25), "rides each": (1.6, 2.0, 2.4), }, "bottom-up": { "e-rickshaws": (6000, 9000, 12000), "trips each": (18, 24, 30), "riders a trip": (2.5, 3.0, 3.5), }, }runs. - Line 4.
routes = { "top-down": { "people": (1.5e6, 1.5e6, 1.5e6), "share who ride": (0.12, 0.18, 0.25), "rides each": (1.6, 2.0, 2.4), }, "bottom-up": { "e-rickshaws": (6000, 9000, 12000), "trips each": (18, 24, 30), "riders a trip": (2.5, 3.0, 3.5), }, }makesroutesa dict with 2 keys. - Line 16.
bases = []makesbasesa list of 0 items. - Line 17.
for name, tree in routes.items():takes the first key ofrouteswith its value:nameis'top-down'andtreeis{'people': (1500000.0, 1500000.0, 1500000.0), 'share who ride': (0.12, 0.18, 0.25), 'rides each': (1.6, 2.0, 2.4)}. - Line 18.
low = base = high = 1setslowto1, setsbaseto1and setshighto1. - Line 19.
for lo, mid, hi in tree.values():takes the first value oftree:lois1500000.0,midis1500000.0andhiis1500000.0. - Line 20.
low = low * losetslowto1500000.0(it was1). - Line 21.
base = base * midsetsbaseto1500000.0(it was1). - Line 22.
high = high * hisetshighto1500000.0(it was1). After the first factor, low, base and high all hold 1,500,000. The question fixes the city's size, so people is the one factor without a range. - Line 19.
for lo, mid, hi in tree.values():takes the second value oftree:lois0.12,midis0.18andhiis0.25. - Line 20.
low = low * losetslowto180000.0(it was1500000.0). - Line 21.
base = base * midsetsbaseto270000.0(it was1500000.0). - Line 22.
high = high * hisetshighto375000.0(it was1500000.0). Each column takes its own value of the factor. The base becomes 1,500,000 × 0.18 = 270,000 riders, the low 180,000 and the high 375,000. - Line 19.
for lo, mid, hi in tree.values():takes the third value oftree:lois1.6,midis2.0andhiis2.4. - Line 20.
low = low * losetslowto288000.0(it was180000.0). - Line 21.
base = base * midsetsbaseto540000.0(it was270000.0). - Line 22.
high = high * hisetshighto900000.0(it was375000.0). Key point The last factor of the top-down tree gives a base of 540,000 rides, between a low of 288,000 and a high of 900,000, the left column of the tree in the figure above. - Line 19.
for lo, mid, hi in tree.values():has read every key oftree, so the loop ends. - Line 23.
print(name, "base", round(base))printstop-down base 540000. - Line 24.
print(" range", round(low), round(high))printsrange 288000 900000. - Line 25.
bases.append(base)adds540000.0to the end ofbases. - Line 17.
for name, tree in routes.items():takes the second key ofrouteswith its value:nameis'bottom-up'andtreeis{'e-rickshaws': (6000, 9000, 12000), 'trips each': (18, 24, 30), 'riders a trip': (2.5, 3.0, 3.5)}. - Line 18.
low = base = high = 1setslowto1(it was288000.0), setsbaseto1(it was540000.0) and setshighto1(it was900000.0). - Line 19.
for lo, mid, hi in tree.values():takes the first value oftree:lois6000,midis9000andhiis12000. - Line 20.
low = low * losetslowto6000(it was1). - Line 21.
base = base * midsetsbaseto9000(it was1). - Line 22.
high = high * hisetshighto12000(it was1). - Line 19.
for lo, mid, hi in tree.values():takes the second value oftree:lois18,midis24andhiis30. - Line 20.
low = low * losetslowto108000(it was6000). - Line 21.
base = base * midsetsbaseto216000(it was9000). - Line 22.
high = high * hisetshighto360000(it was12000). - Line 19.
for lo, mid, hi in tree.values():takes the third value oftree:lois2.5,midis3.0andhiis3.5. - Line 20.
low = low * losetslowto270000.0(it was108000). - Line 21.
base = base * midsetsbaseto648000.0(it was216000). - Line 22.
high = high * hisetshighto1260000.0(it was360000). The same inner loop on the bottom-up tree ends at 648,000 rides, between 270,000 and 1,260,000. No factor is shared with the top-down tree. - Line 19.
for lo, mid, hi in tree.values():has read every key oftree, so the loop ends. - Line 23.
print(name, "base", round(base))printsbottom-up base 648000. - Line 24.
print(" range", round(low), round(high))printsrange 270000 1260000. - Line 25.
bases.append(base)adds648000.0to the end ofbases. - Line 17.
for name, tree in routes.items():has read every key ofroutes, so the loop ends. - Line 26.
print("ratio:", round(bases[1] / bases[0], 2))printsratio: 1.2. That was the last line, so the program ends. Key point The two bases are 1.2 times apart, within about two times, so a round number between them, about 600,000 rides, is the estimate.
The bases are 540,000 and 648,000 rides, 1.2 times apart. When two routes land within about two times of each other, say a round number between them, here about 600,000 rides a weekday. When they are further apart, one of the factors is wrong, and averaging the routes would hide it: find the factor that disagrees (MySmartCoPilot’s rule of thumb). One way is to divide one route’s total by a factor of the other. The top-down 540,000 rides, spread over 9,000 e-rickshaws, are 60 riders each a day, or 20 trips of 3, against the 24 trips the bottom-up tree assumed. If 20 trips sounds far too few, the share who ride is the suspect.
Press Edit, change the share who ride to (0.12, 0.30, 0.40) and run it again: the bases are then 900,000 and
648,000, and the ratio falls to 0.72.
Key idea
Two routes that share no factor check each other: when their bases land within about two times, say a round number between them; when they do not, find the factor that disagrees instead of averaging.
Checkpoint
Check: Splitting a number into factors · Top-down and bottom-up routes
A range from low and high values says how sure you are
A single number hides how sure you are. Give every factor a low and a high, the values you would be surprised to fall below or rise above, and multiply each column on its own, as the program did:
| Route | Low | Base | High |
|---|---|---|---|
| Top-down | 288,000 | 540,000 | 900,000 |
| Bottom-up | 270,000 | 648,000 | 1,260,000 |
| Where both ranges overlap | 288,000 | 900,000 |
The products of all the lows and of all the highs bound the answer, more widely than it is likely to fall, because every factor would have to be at its extreme at once. So say the base and the range where the routes overlap: “about 600,000 rides a weekday, and roughly 300,000 to 900,000”. Then name the widest factor, because it moves the range most. The share who ride runs from 12 to 25 %, more than twice from low to high, while the rides each run only 1.5 times, from 1.6 to 2.4.
Rounding in the middle
Wrong: rounding 1.8 rides to 2 halfway through, which adds 11 % to the answer, then rounding again at the end. Right: carry the values you chose through the multiplication and round once, at the end, to one or two significant figures.
Checkpoint
Check: Ranges from low and high values
Official figures make good anchors, if you read what they count
An anchor is a number from an official source that starts a route or checks one. Worldwide, the ITU estimates that almost three quarters of the world’s population are online and that 2.2 billion people are not (ITU Facts and Figures), a fair start for a question about internet users anywhere. Read what each anchor counts before you use it: a count of subscriptions, accounts or SIM cards counts connections, and one person can hold several connections while a family shares one.
India's subscriptions against its population
India’s telecom regulator, TRAI, publishes subscription counts every month (TRAI press release), and the Technical Group on Population Projections gives the population to compare them with (projection report, Table 8). The program divides the release’s counts by the projection of 1,423.4 million people for the same year:
"""Official Indian figures as anchors, and what each one counts.
Figures in millions, typed in from two official documents:
- TRAI's press release 125/2026 (Highlights of Telecom Subscription Data), for the month it covers;
- India's projected population for the same year, Table 8 of the Report of the Technical Group on
Population Projections (National Commission on Population): 14,23,435 thousand people.
"""
PEOPLE = 1_423.435 # projected population, millions
COUNTS = { # what TRAI counts: millions of subscriptions or connections, not people
"broadband, with M2M": 1_101.21,
"broadband, without M2M": 1_010.28,
"active mobile (peak VLR)": 1_207.59,
"all telephone subscriptions": 1_360.70,
}
TELEDENSITY = 95.07 # TRAI's own overall tele-density, %, on its population base
print(f"Per 100 people, on a projection of {PEOPLE:,.1f} million:")
for name, millions in COUNTS.items():
print(f" {name:28} {100 * millions / PEOPLE:5.1f}")
base = COUNTS["all telephone subscriptions"] / (TELEDENSITY / 100)
print(f"TRAI's {TELEDENSITY} % implies a base of {base:,.1f} million people,")
print(f"{base - PEOPLE:.1f} million above the projection used here.") Output
Per 100 people, on a projection of 1,423.4 million: broadband, with M2M 77.4 broadband, without M2M 71.0 active mobile (peak VLR) 84.8 all telephone subscriptions 95.6 TRAI's 95.07 % implies a base of 1,431.3 million people, 7.8 million above the projection used here.
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 india_anchors.py
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
Broadband subscriptions without machine-to-machine (M2M) connections, such as card machines and meters, come to 71.0 per 100 people, and active mobile connections to 84.8. Neither is a share of people: they count connections. TRAI’s own tele-density: Telephone subscriptions per 100 people, as India's telecom regulator TRAI computes it on its own population base. It counts connections rather than people, so it can pass 100. More in “Designing products for users in India” of 95.07 % rests on a population base of about 1,431.3 million, by the program’s arithmetic, so the same division on the projection used here gives 95.6. Say which base you used whenever you quote a figure per 100 people.
Checkpoint
Check: Official figures as anchors
Say the tree before the numbers
An interviewer can follow an estimate only as far as they can hear it. Say both trees first, one sentence each, before any number. Then fill in the factors one at a time, with a reason for each and a running total on paper, and round once, at the end. Here are the five minutes of the e-rickshaw answer, paced the way MySmartCoPilot recommends:
- Minute 0
Restate the question and the unit
"I will count passenger rides, so one shared trip with three riders is three rides, on a working weekday, across the whole city." The interviewer can correct the unit before any number depends on it.
- Minute 1
Say both trees before any number
"Top-down, people times the share who ride today times rides each. Bottom-up, e-rickshaws times trips each times riders a trip." The interviewer now knows what every later number is for.
- Minutes 1 to 3
Fill in the factors, keeping a running total running total
"1.5 million people; about 18 % ride on a weekday, so 270,000 riders; about 2 rides each, so 540,000." One reason per factor, and the running total written down after each one.
- Minute 3
Run the second route
"9,000 e-rickshaws, 24 trips each, 3 riders a trip: 648,000." The second route shares no factor with the first, so it checks the first instead of repeating it.
- Minute 4
Compare the routes and give the range check
"The two routes are 1.2 times apart, so I trust both. My lows and highs give about 300,000 to 900,000."
- Minute 5
The answer, rounded, and the weakest factor
"About 600,000 rides a weekday. The share who ride is my weakest factor, so it is the one I would check first, for example with a short survey at two stations."
The timeline has 6 events, from Minute 0 to Minute 5.
Each sentence in it is something the interviewer can agree with or correct. A corrected factor costs ten seconds and changes one line of the running total; an unexplained total can only be accepted or rejected.
Checkpoint
Check: Saying an estimate aloud
Practise: multiply a range, then check yourself
Write the function that multiplies each column of an estimate tree and refuses a factor whose values are out of order, then run the sample tests:
Exercise · Easy · Python
Multiply an estimate tree's lows, bases and highs
An estimate tree gives every factor three values: a low, a base and a high. Write estimate_range(factors):
factorsmaps each factor's name to a(low, base, high)tuple, in the order the tree multiplies them;- it returns a tuple
(low, base, high): the product of every low, of every base and of every high, each rounded to a whole number; - it raises
ValueError, with the factor's name in the message, when a factor's values are out of order (each low must be at most its base, and each base at most its high); - it raises
ValueErrorwhen there are no factors at all, because an empty tree estimates nothing.
estimate_range({"people": (1.5e6, 1.5e6, 1.5e6), "share who ride": (0.12, 0.18, 0.25), "rides each": (1.6, 2.0, 2.4)})
# (288000, 540000, 900000)
estimate_range({"share who ride": (0.25, 0.18, 0.12)}) # ValueError: share who ride ...
The sample tests also check the bottom-up tree, a factor whose three values are equal, a base above its high, and the empty tree.
Starter code · estimate.py
def estimate_range(factors):
"""Return (low, base, high): the products of each column of an estimate tree, rounded.
factors: a dict of name -> (low, base, high)
Raises ValueError for an empty tree, or for a factor whose values are out of order.
"""
# Your code here.
return (0, 0, 0) The sample tests · test_estimate.py
from estimate import estimate_range
def test_top_down_tree():
"""the lesson's top-down tree: people, share who ride, rides each"""
factors = {"people": (1.5e6, 1.5e6, 1.5e6), "share who ride": (0.12, 0.18, 0.25), "rides each": (1.6, 2.0, 2.4)}
assert estimate_range(factors) == (288000, 540000, 900000)
def test_bottom_up_tree():
"""the lesson's bottom-up tree: e-rickshaws, trips each, riders a trip"""
factors = {"e-rickshaws": (6000, 9000, 12000), "trips each": (18, 24, 30), "riders a trip": (2.5, 3.0, 3.5)}
assert estimate_range(factors) == (270000, 648000, 1260000)
def test_equal_values_are_in_order():
"""a factor the question fixes has the same low, base and high"""
assert estimate_range({"people": (800000, 800000, 800000), "share": (0.1, 0.1, 0.2)}) == (80000, 80000, 160000)
def test_out_of_order_names_the_factor():
"""a low above its base is a slip, and the message says where"""
try:
estimate_range({"people": (1e6, 1e6, 1e6), "share who ride": (0.25, 0.18, 0.12)})
except ValueError as e:
assert "share who ride" in str(e)
else:
assert False, "expected a ValueError for values out of order"
def test_base_above_high_names_the_factor():
"""a base above its high is out of order too, even when the low is in place"""
try:
estimate_range({"people": (1e6, 1e6, 1e6), "rides each": (1.6, 2.4, 2.0)})
except ValueError as e:
assert "rides each" in str(e)
else:
assert False, "expected a ValueError for a base above its high"
def test_empty_tree():
"""no factors, no estimate"""
try:
estimate_range({})
except ValueError:
pass
else:
assert False, "expected a ValueError for an empty tree" A hint
Start three running products at 1 and multiply each by its own column as you go through the factors: lows with lows, bases with bases, highs with highs. Check the order of each factor's values with one chained comparison, low <= base <= high, before you multiply, so the message can name the factor that broke the rule.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.
After that, work through the self-check: it starts from your weakest idea and gives you one question at a time.
Practice that adapts to you
Practise this lesson
14 questions about 7 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
A product round may set an estimate like one of these. The first is answered here in full; for the two after it, say your trees and your numbers aloud before you open the first step and the follow-ups:
Model answers open with any pass: ₹79 for 1 week ($2.99), one payment that never renews.
-
Fresher to mid · Warm-up
What is the difference between a top-down and a bottom-up estimate, and why do both?
A top-down estimate starts from a large total you know, such as a city's population, and narrows it with shares and rates: people, times the share who ride on a weekday, times the rides each takes. A bottom-up estimate starts from units you can count and builds up from their capacity and use: vehicles, times the trips each makes, times the riders on a trip. Do both because they share no factor, so a wrong assumption in one does not repeat in the other. When the two land within about two times of each other, say a round number between them; when they are further apart, one factor is wrong, and dividing one route's total by the other's factors usually shows which. In the lesson's e-rickshaw example the routes gave 540,000 and 648,000 rides, 1.2 times apart, so the answer was about 600,000.
-
Fresher to senior
Estimate how many parcels from online orders are delivered on a weekday in a city of 2 million people. Say your tree first, then the numbers.
-
Fresher to mid
A data set says a state has 90 million mobile subscriptions and 80 million people. How many people there use a mobile phone, and how would you estimate it?
Flashcards · 8 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
What does an interviewer look for in an estimation question?
How you reach the number more than the number itself: a stated assumption can be followed, questioned and corrected, while a number from nowhere can only be accepted or rejected.
-
What are the five steps of the track's estimation method?
Clarify what is counted, split it into factors, give each factor a low and a high value, multiply, and check the result by a second route.
-
Why pin down the unit before estimating e-rickshaw rides?
A shared e-rickshaw carries about three riders a trip, so 216,000 vehicle trips make 648,000 passenger rides: one city, two answers three times apart. Fix the unit, the period and the area first, and keep the unit on every number you say.
-
What is the difference between a top-down and a bottom-up estimate?
Top-down starts from a known total, such as the population, and narrows it with shares and rates. Bottom-up starts from units you can count, such as vehicles or shops, and builds up from their capacity and use. Two routes that share no factor check each other.
-
What should you do when two estimate routes give different answers?
Within about two times of each other, say a round number between them. Further apart, a factor is wrong, so find it rather than averaging, for example by dividing one route's total by a factor of the other.
-
How do you give a range for an estimate, and which factor do you talk about?
Give every factor a low and a high, multiply each column, and quote the base with the range where the routes overlap: about 600,000 rides a weekday, roughly 300,000 to 900,000. Discuss the widest factor, because it moves the range most.
-
When should you round the numbers of an estimate?
Once, at the end, to one or two significant figures. Rounding 1.8 rides up to 2 halfway through already adds 11 % to the answer.
-
What must you check before using an official count as an estimation anchor?
What it counts. Subscriptions, accounts and SIM cards count connections, not people, and a figure per 100 people depends on the population base it was divided by, so say which base you used.
Key takeaways
- Clarify the unit, the period and the area first: passenger rides and vehicle trips of the same city were three times apart.
- Split the number into factors you can picture or look up, and multiply down each route of the tree.
- A top-down and a bottom-up route that share no factor check each other; within about two times, say a round number between them, here about 600,000 rides a weekday.
- Give every factor a low and a high: the products bound the answer, and the widest factor is the one to discuss.
- Official figures are anchors for what they count: subscriptions and connections are not people, and a figure per 100 people depends on its population base.
- Say the trees before the numbers, keep a running total and round once, at the end.
Terms in this lesson
- Fermi estimate
- An estimate of a number nobody has measured, built by splitting it into factors that can each be reasoned about or looked up and multiplying them, given as a range with every assumption said aloud.
References
- Report of the Technical Group on Population Projections for India and States 2011-2036 (National Commission on Population, Ministry of Health and Family Welfare)
- Highlights of Telecom Subscription Data (press release 125/2026) (Telecom Regulatory Authority of India (TRAI))
- Telecom subscriptions reports (Telecom Regulatory Authority of India (TRAI))
- Measuring digital development: Facts and Figures 2025 (International Telecommunication Union (ITU))
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress