Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

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.

  • Beginner
  • 20 minutes
  • Examples run with Python 3.14.8, Pyodide 314.0.7 and sql.js 1.14.2
  • By MySmartCoPilot
Free lesson, Pro answers: 20 minutes
Free: the whole lesson. With a pass: the model answers to its 2 interview questions.

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:

Interactive · stage by stage An estimation question, step by step Step down the column with the e-rickshaw question; the side arrow shows where an answer goes back when its two routes disagree.
An estimation question, step by step, step 7 of 7. Showing Clarify what is counted (passenger rides, a weekday), Split it into factors, Estimate each factor, Multiply down the tree (540,000 and 648,000 rides), Check by a second route (1.2 times apart: they agree), Say the answer and range. In focus: Say the answer and range.the routes disagreeClarify what is countedpassenger rides, a weekdaySplit it into factorstwo routes of three factorsEstimate each factora low, a base and a highMultiply down the tree540,000 and 648,000 ridesCheck by a second route1.2 times apart: they agreeSay the answer and rangeand the factor that matters

The drawing shows the whole scene; its 7 steps are listed below.

Every step as text
  1. 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.
  2. 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.
  3. 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.
  4. 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 %.
  5. 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.
  6. 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.
  7. 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

  1. Question 1 of 2 Asked "How many meals does an office canteen serve on a weekday?", which clarifying question can change the answer the most?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Count plates served, or the people who eat? Some people take a second plate, and some share one.

    Clarify the unit, the period and the area before splitting anything. A question whose answer would not change the number is better left out, and your assumption said instead.

  2. Question 2 of 2 In the lesson's method, what comes straight after multiplying down the tree?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Checking the result by a second route

    Clarify, split into factors, estimate each factor as a range, multiply, check by a second route, then say the answer and its range. The check is the step weak answers skip.

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:

Two estimate trees for weekday e-rickshaw rides: top-down gives 540,000 rides, bottom-up 648,000, each with a low and a high.Top-down:from peopleBottom-up:from vehicles1.5 million people9,000 e-rickshaws(6,000–12,000)× 18 % ride today(12–25 %)× 24 trips each(18–30)× 2.0 rides each(1.6–2.4)× 3 riders a trip(2.5–3.5)= 540,000 rides(288,000–900,000)= 648,000 rides(270,000–1,260,000)

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:

Interactive · line by line Two estimate trees, multiplied factor by factor Step through the program. Each pass of the inner loop takes one factor and multiplies low, base and high by its own three values.

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

After line 26: routes is {'top-down': {'people': (1500000.0, 1500000.0, 1500000.0), '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 is [540000.0, 648000.0]; name is 'bottom-up'; tree is {'e-rickshaws': (6000, 9000, 12000), 'trips each': (18, 24, 30), 'riders a trip': (2.5, 3.0, 3.5)}; low is 270000.0; base is 648000.0; high is 1260000.0; lo is 2.5; mid is 3.0; hi is 3.5.routes'top-down':{'people': (1500000.0, 1500000.0, 1500000.0), '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)}bases540000.00648000.01name'bottom-up'tree'e-rickshaws':(6000, 9000, 12000)'trips each':(18, 24, 30)'riders a trip':(2.5, 3.0, 3.5)low270000.0base648000.0high1260000.0lo2.5mid3.0hi3.5
  • just taken by the loop
  • changed in this step
  • passed by the loop
  • read next
  • where the loop stopped

Printed so far

top-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.

Line run 26
Next line end
Loop pass –
Every step as text
  1. Start. No line has run yet, so there are no variables. Python starts with line 4.
  2. 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.
  3. 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), }, } makes routes a dict with 2 keys.
  4. Line 16. bases = [] makes bases a list of 0 items.
  5. Line 17. for name, tree in routes.items(): takes the first key of routes with its value: name is 'top-down' and tree is {'people': (1500000.0, 1500000.0, 1500000.0), 'share who ride': (0.12, 0.18, 0.25), 'rides each': (1.6, 2.0, 2.4)}.
  6. Line 18. low = base = high = 1 sets low to 1, sets base to 1 and sets high to 1.
  7. Line 19. for lo, mid, hi in tree.values(): takes the first value of tree: lo is 1500000.0, mid is 1500000.0 and hi is 1500000.0.
  8. Line 20. low = low * lo sets low to 1500000.0 (it was 1).
  9. Line 21. base = base * mid sets base to 1500000.0 (it was 1).
  10. Line 22. high = high * hi sets high to 1500000.0 (it was 1). 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.
  11. Line 19. for lo, mid, hi in tree.values(): takes the second value of tree: lo is 0.12, mid is 0.18 and hi is 0.25.
  12. Line 20. low = low * lo sets low to 180000.0 (it was 1500000.0).
  13. Line 21. base = base * mid sets base to 270000.0 (it was 1500000.0).
  14. Line 22. high = high * hi sets high to 375000.0 (it was 1500000.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.
  15. Line 19. for lo, mid, hi in tree.values(): takes the third value of tree: lo is 1.6, mid is 2.0 and hi is 2.4.
  16. Line 20. low = low * lo sets low to 288000.0 (it was 180000.0).
  17. Line 21. base = base * mid sets base to 540000.0 (it was 270000.0).
  18. Line 22. high = high * hi sets high to 900000.0 (it was 375000.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.
  19. Line 19. for lo, mid, hi in tree.values(): has read every key of tree, so the loop ends.
  20. Line 23. print(name, "base", round(base)) prints top-down base 540000.
  21. Line 24. print(" range", round(low), round(high)) prints range 288000 900000.
  22. Line 25. bases.append(base) adds 540000.0 to the end of bases.
  23. Line 17. for name, tree in routes.items(): takes the second key of routes with its value: name is 'bottom-up' and tree is {'e-rickshaws': (6000, 9000, 12000), 'trips each': (18, 24, 30), 'riders a trip': (2.5, 3.0, 3.5)}.
  24. Line 18. low = base = high = 1 sets low to 1 (it was 288000.0), sets base to 1 (it was 540000.0) and sets high to 1 (it was 900000.0).
  25. Line 19. for lo, mid, hi in tree.values(): takes the first value of tree: lo is 6000, mid is 9000 and hi is 12000.
  26. Line 20. low = low * lo sets low to 6000 (it was 1).
  27. Line 21. base = base * mid sets base to 9000 (it was 1).
  28. Line 22. high = high * hi sets high to 12000 (it was 1).
  29. Line 19. for lo, mid, hi in tree.values(): takes the second value of tree: lo is 18, mid is 24 and hi is 30.
  30. Line 20. low = low * lo sets low to 108000 (it was 6000).
  31. Line 21. base = base * mid sets base to 216000 (it was 9000).
  32. Line 22. high = high * hi sets high to 360000 (it was 12000).
  33. Line 19. for lo, mid, hi in tree.values(): takes the third value of tree: lo is 2.5, mid is 3.0 and hi is 3.5.
  34. Line 20. low = low * lo sets low to 270000.0 (it was 108000).
  35. Line 21. base = base * mid sets base to 648000.0 (it was 216000).
  36. Line 22. high = high * hi sets high to 1260000.0 (it was 360000). 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.
  37. Line 19. for lo, mid, hi in tree.values(): has read every key of tree, so the loop ends.
  38. Line 23. print(name, "base", round(base)) prints bottom-up base 648000.
  39. Line 24. print(" range", round(low), round(high)) prints range 270000 1260000.
  40. Line 25. bases.append(base) adds 648000.0 to the end of bases.
  41. Line 17. for name, tree in routes.items(): has read every key of routes, so the loop ends.
  42. Line 26. print("ratio:", round(bases[1] / bases[0], 2)) prints ratio: 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

  1. Question 1 of 2 You are estimating the bus passengers of a city on a weekday from the supply side. Which set of factors builds a bottom-up tree?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Buses in service × trips each bus makes × passengers on a trip

    A bottom-up tree starts from units you can count, here buses, and multiplies by their use and capacity. Every factor should be something you could picture or find.

  2. Question 2 of 2 A top-down route gives 360,000 rides a day. The bottom-up tree assumes 6,000 e-rickshaws carrying 3 riders a trip. How many trips a day does the top-down total imply for each e-rickshaw?

    Type a number.

    A hint

    Divide the top-down total by the vehicles, then by the riders on each trip.

    Show the answer: Question 2 of 2

    Answer: 20 trips

    360,000 ÷ 6,000 = 60 riders a day for each e-rickshaw, and 60 ÷ 3 = 20 trips. Set it beside the bottom-up tree's own trips each: if that tree assumed 24 trips, the routes nearly agree; if it assumed 60, one of them has a wrong factor.

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

  1. Question 1 of 2 A tree has three factors: people 1,000,000 (fixed), share who ride 10 % to 20 %, rides each 1.5 to 2.5. What range do the lows and the highs give?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: 150,000 to 500,000

    Multiply every low together and every high together. The two products bound the answer, more widely than it is likely to fall, because all factors would have to sit at their extremes at once.

  2. Question 2 of 2 A city has 3.2 million people. About 12 % ride its metro on a weekday, 1.9 rides each. About how many metro rides are there on a weekday? An answer within 10 % counts.

    Type a number.

    A hint

    People × share who ride × rides each, rounded only at the end.

    Show the answer: Question 2 of 2

    Answer: 729600 rides (anything from 656640 to 802560 counts)

    3,200,000 × 0.12 = 384,000 riders, × 1.9 = 729,600 rides, or about 730,000. Rounding 1.9 to 2 halfway gives 768,000, which still counts here; rounding the share to 10 % as well gives 640,000, more than 10 % too low.

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:

Subscriptions per 100 people, from TRAI's counts Python · anchors/india_anchors.py
"""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

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

  1. Question 1 of 2 The anchors program finds 71.0 broadband subscriptions without M2M for every 100 people in India. What does that number count?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: Broadband connections for each 100 people, not the share of people who use broadband

    Read what an anchor counts before you use it. A count of subscriptions, accounts or SIM cards bounds the connections; turning it into people needs a stated factor of its own.

  2. Question 2 of 2 A regulator reports 50.0 million telephone subscriptions and a tele-density of 125 per 100 people. What population base, in millions, does that imply?

    Type a number.

    A hint

    Tele-density is subscriptions divided by population, times 100.

    Show the answer: Question 2 of 2

    Answer: 40 million people (anything from 39.95 to 40.05 counts)

    50.0 ÷ 1.25 = 40.0 million people. The anchors program does the same with TRAI's figures: 1,360.70 ÷ 0.9507 ≈ 1,431.3 million, a little above the projection it divides by, so recomputed per-100 figures differ slightly.

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:

Timeline · 6 events in order A five-minute estimate, said aloud Walk through the answer in order. The minutes are MySmartCoPilot's recommendation; each event is what you say, then why.
  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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."

  6. 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

  1. Question 1 of 2 Two candidates open an answer to "How many cups of tea does a large railway station sell on a weekday?" Which opening is stronger?

    Choose one answer.

    Show the answer: Question 1 of 2

    Answer: "Top-down, passengers through the station times the share who buy tea times cups each; bottom-up, stalls times cups a stall sells in an hour times hours open. I will start with passengers."

    Say the trees before the numbers. The interviewer then hears what each number is for, and a corrected factor changes one line of the running total instead of the whole answer.

  2. Question 2 of 2 Your product comes to 728,432 rides a weekday. Which final answer do you say?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: About 700,000 rides, or roughly 730,000

    Round once, at the end, to one or two significant figures, and give the range from the lows and highs beside it.

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):

  • factors maps 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 ValueError when 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.

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.

  1. Question 1 of 14 Which step of the method do weak answers skip most often?

    Choose one answer.

    Show the answer: Question 1 of 14

    Answer: Checking the result by a second route

    The arrow back from the check is the step weak answers skip: a second route catches the wrong factor before the answer is said.

  2. Question 2 of 14 The interviewer says your estimate looks five times too high. Where in the method do you go back to?

    Choose one answer.

    Show the answer: Question 2 of 14

    Answer: The tree, to find the factor that is off by about five times

    Treat pushback as a check that failed: go back to the tree, find the factor that could be wrong by about that much, change it with a reason and redo the running total.

  3. Question 3 of 14 Why does the lesson clarify the unit before splitting the question into factors?

    Choose one answer.

    Show the answer: Question 3 of 14

    Answer: Because every factor depends on it, and the e-rickshaw answers were three times apart by unit alone

    Pin down what one unit is, over which period and where, and say your assumption where the interviewer leaves it to you; only then choose the factors.

  4. Question 4 of 14 For "How many suitcases pass through a city airport on a weekday?", which questions could change the answer by two times or more? Choose every one.

    Choose every answer that is right.

    Show the answer: Question 4 of 14

    Answer:

    • Checked bags only, or carry-on bags too?
    • Arriving and departing, or one direction?

    Ask what would change the number: the unit (checked or carry-on) and the scope (one direction or both). Say your own assumption for anything else.

  5. Question 5 of 14 Which of these is a factor you can estimate, by the lesson's test?

    Choose one answer.

    Show the answer: Question 5 of 14

    Answer: Riders on one shared e-rickshaw trip

    A good factor is one you could picture or look up. Split any factor that fails the test until every part passes.

  6. Question 6 of 14 A bottom-up tree: 4,000 food carts, 150 plates each on a weekday, 1.2 plates for every customer. About how many customers do the carts serve on a weekday?

    Type a number.

    A hint

    Plates divided by plates a customer gives customers.

    Show the answer: Question 6 of 14

    Answer: 500000 customers (anything from 499500 to 500500 counts)

    4,000 × 150 = 600,000 plates, and 600,000 ÷ 1.2 = 500,000 customers. A factor can divide as well as multiply, as long as the units cancel to the unit asked for.

  7. Question 7 of 14 Which pair describes the two routes correctly?

    Choose one answer.

    Show the answer: Question 7 of 14

    Answer: Top-down starts from a large known total and narrows it; bottom-up starts from units you can count and builds up

    The routes differ in where they start. Because they share no factor, a wrong assumption in one does not repeat in the other.

  8. Question 8 of 14 Your top-down route gives 2,000,000 rides and your bottom-up route 400,000. What do you say next?

    Choose one answer.

    Show the answer: Question 8 of 14

    Answer: That the routes are five times apart, so one factor is wrong, and you check what each route implies about the other's factors

    Within about two times, say a round number between the routes. Further apart, find the factor that disagrees: for example, divide the top-down total by the vehicles and riders of the bottom-up tree and see whether the trips it implies make sense.

  9. Question 9 of 14 Why is the product of all the lows wider than the range the answer is likely to fall in?

    Choose one answer.

    Show the answer: Question 9 of 14

    Answer: Every factor would have to be at its low at the same time

    The products of the lows and of the highs bound the answer, but all factors at their extremes at once is unlikely, so the true value usually lies well inside.

  10. Question 10 of 14 Three factors: people fixed at 2 million, share who ride 10 % to 30 %, rides each 1.8 to 2.2. Which factor do you discuss first?

    Choose one answer.

    Show the answer: Question 10 of 14

    Answer: The share who ride, because it spans three times from low to high

    Compare each factor's high with its low. The widest factor is where a better assumption would narrow the answer most, so it is the one to discuss and to check first.

  11. Question 11 of 14 What does the ITU's world figure in the lesson measure?

    Choose one answer.

    Show the answer: Question 11 of 14

    Answer: People online, about three quarters of the world's population, with 2.2 billion offline

    Choose an anchor that counts the unit you need. For people online worldwide, the ITU's estimate of people counts the right thing; a count of subscriptions does not.

  12. Question 12 of 14 You must estimate the internet users of one country of 50 million people. Why is "three quarters of 50 million" a weak first answer?

    Choose one answer.

    Show the answer: Question 12 of 14

    Answer: The world share is an average over very different countries, so the country's own figure or a stated adjustment is needed

    Read what an anchor counts and for whom. A world share starts a world question; for one country, look for that country's own official figure, or say how and why you adjust the average.

  13. Question 13 of 14 In the five-minute answer, what do you say before any number?

    Choose one answer.

    Show the answer: Question 13 of 14

    Answer: The unit, then both trees, one sentence each

    Restate the unit, say both trees, then fill in the factors one at a time with a running total, and round once at the end.

  14. Question 14 of 14 Halfway through your answer the interviewer says 18 % of people riding is too high and suggests 12 %. What is the quickest correct response?

    Choose one answer.

    Show the answer: Question 14 of 14

    Answer: Change that one factor and redo the running total from it, 1.5 million × 12 % × 2.0 = 360,000

    Each sentence of the answer is a factor someone can agree with or correct. Take the correction, multiply on from the changed factor, and say the new total: 360,000 rides.

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.

  1. 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.

  2. 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.

    Model answer, Pro. Model answers open with any pass; prices are in the notice on this page. First step and follow-ups

  3. 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?

    Model answer, Pro. First step and follow-ups

Flashcards · 8 cards

Recall it, then check

Say the answer to yourself before you look: recalling it is what makes it stick.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.