← Home Lecture 15 · Atlas Charts & the Ride-Analytics Problem
1 / 17 📄 Notes
Module 3 · Lecture 15

Atlas Charts & the Ride-Analytics Problem

Thirty-seven percent of bookings never carry a passenger. Today we build the dashboard that finds out why.

⏱ 90 minutes 🎯 CLO4 📊 Atlas Charts
The Brief

Someone has replaced the worksheet

The operations director, after a meeting

“Our completion rate is sitting around sixty percent and finance thinks we're leaving money on the table. Nobody can tell me where it's going. You have the data. I have a board meeting on Friday — give me somewhere to start.”

That is a realistic brief in the way that matters most: it names a symptom, not a question. Converting it into something answerable is the first job — before you open any tool.

Rule for today: no chart gets built until its question is written down.
Step 1 · Decompose

“Where is the money going?” cannot be plotted

Answerable questionShape of answerChart
How do bookings actually end?Breakdown of one categoryDonut
Which failures are most common?Ranked list within a categoryHorizontal bar
Does failure depend on time of day?Two measures, ordered dimensionColumn + line
Which products carry the value?Ranked measure by categoryHorizontal bar
Where does it happen?Ranked list with a rateTable
Each row becomes exactly one chart. Nothing else gets built.
Step 2 · Size It

How big is the problem?

37.71%
of bookings fail

5,657 of 15,000 never carried a passenger.

₹13,33,539
estimated lost revenue

5,657 failures × ₹235.73 average completed fare.

₹22,02,449
revenue realised

What the operation actually earned in 2024.

Establish magnitude in the first five minutes. It decides how much effort the problem deserves.
Intellectual Honesty

Attack your own number before the CFO does

₹13,33,539 assumes every failed booking would have completed at the average fare. It would not have.

Why it is an upper bound

Some customers rebooked within minutes and are already inside the 9,343 completed. Some trips would have been short and cheap.

Why it still works

Halve it and you have ₹6.7 lakh against ₹22 lakh realised. The problem survives the most hostile assumption you can make.

A defended upper bound survives questioning. An undefended point estimate does not.
Tool Choice

You could do this in Excel. What do you lose?

DimensionCSV → ExcelAtlas Charts
FreshnessFrozen at exportQueries live data on load
Nested fieldsFlatten route.pickup by handDot notation works natively
Size ceiling~1M rows, painful well beforeAggregates server-side
ReproducibilitySteps live in one person's memoryThe chart is the spec
Exploring onceGenuinely betterMore structured
Excel for exploring once. Charts for anything that must still be true next month.
Positioning

Charts is not competing with Tableau

Tableau / Power BI

Richer visual grammar, modelling layer, enterprise governance. Needs a connector, an extract schedule, a licence per seat, and an owner for all three.

Atlas Charts

Included with the cluster. No connector, no extract, nested documents native. Weaker at blending many sources.

Hand-built

Total control, no licence — and you own every bug forever.

Charts wins on one axis: it is already connected to your data. Say which situation you are in; the tool follows.
Mental Model · 1 of 3

The data source can carry a pipeline

This is the feature people miss. Everything from Lecture 14 is available inside the data source:

[
  { $addFields: {
      hour:   { $toInt: { $substr: ["$booked_at", 11, 2] } },
      failed: { $cond: [{ $eq: ["$status", "Completed"] }, 0, 1] }
  } }
]

Two lines — and hour and failed now exist as fields for every chart built on this source.

booked_at is a string here, so we slice characters 11–12 rather than calling $hour.
Mental Model · 2 of 3

Encoding channels are aggregation stages

ChannelVisual roleYou already know it as
X / CategoryWhat the bars are$group._id
Y / ValueHow tall each one is$sum / $avg / $count
Series / ColourSplits into sub-barsA compound _id
FilterWhich documents count$match, placed first
Sort & limitRanking, top-N$sort then $limit
Chart shows a number you did not expect? Write the pipeline it implies and run it in mongosh.
Mental Model · 3 of 3

Filters are where dashboards learn to lie

Three levels

Source — applies everywhere, invisible.
Chart — that chart only.
Dashboard — interactive, viewer-controlled.

The failure

A chart titled “Average Booking Value” that quietly filters to status: "Completed" is not wrong — ₹235.73 is correct for completed rides. But a reader assuming all 15,000 has been misled.

Put the filter in the title: “Average Booking Value (Completed Rides Only)”. The rubric checks this.
Chart 1 · Build Along

How do bookings actually end?

Configuration

Donut. Label: status. Arc: COUNT.

One of the few cases where a donut beats a bar — the question is “what share?”, not “which is bigger?”

Completed9,34362.29%
Cancelled by Driver2,69817.99%
No Driver Found1,0366.91%
Cancelled by Customer1,0226.81%
Incomplete9016.01%
Driver cancels (17.99%) + no driver found (6.91%) ≈ 25% of all bookings fail on the supply side. That reframes the whole brief.
Chart 2 · Build Along

Count and value rank differently

Vehicle typeRevenueBookingsAvg fareCompletion
Premier Sedan₹5,36,8551,954₹442.2262.13%
Go Sedan₹4,91,4732,854₹278.7761.77%
Uber XL₹4,31,9271,231₹558.7762.79%

Go Sedan has the most bookings. Premier Sedan earns the most revenue. A failed Uber XL costs ₹558.77 against a Go Sedan's ₹278.77.

Fixing cancellations for one product? Start where each failure is most expensive, not most numerous.
Chart 3 · The Finding

Volume is not risk

HourBookingsFailure rate
18:00 — busiest hour1,37337.14%
19:001,24635.96%
09:001,17236.18%
08:001,07636.71%
17:001,06239.92%

Every instinct says throw resources at the 18:00 peak. But 17:00 — one hour earlier — fails more often. Supply is thinnest just before demand peaks: drivers have not yet repositioned.

A dashboard plotting only volume would have aimed the fix at the wrong hour.
Chart 4 · An Awkward Result

When there is no dominant cause

Driver cancellation reasonCountShare
Customer related issue72927.02%
More than permitted people in there66624.68%
Personal & Car related issues65224.17%
The customer was coughing/sick65124.13%

Four reasons, all between 24% and 27%. The temptation is to pick the top bar and call it the answer. A 27% leader among four near-equal options is not a finding — it is a flat distribution.

“The data cannot answer this; here is what we'd need to collect” is a legitimate recommendation. We develop it in L16.
Discipline

Four chart choices that are almost always wrong

Pie with twelve slices

Nobody can rank slices 7 through 12. Use a sorted bar.

3D anything

Perspective distorts exactly the lengths the reader is comparing. Never correct in this course.

Line over unordered categories

A line from “Go Sedan” to “Uber XL” implies a progression that does not exist.

Dual axis tuned to cross

Legitimate for different units. Scaling until the lines intersect dramatically is rhetoric, and it gets caught.

Chart type is not aesthetics. Each one encodes a specific relationship.
Traps

Three ways to produce confident nonsense

1 · The small-sample rate

Sort hourly failure by rate and the top is 03:00 at 43.48% — on 46 bookings. One more cancellation moves it two points. Fix: { $match: { bookings: { $gte: 1000 } } } after $group.

2 · Averaging over absent fields

booking_value is missing on failed bookings, and $avg skips it silently. Filter to the population you mean, then name it in the title.

3 · The truncated axis

Completion by vehicle spans 61.77%–62.79%. Plot 61–63 and the bars look dramatic. Start at zero — the real finding is that it barely varies.

All three are live in this dataset right now. They produce charts defensible line by line and wrong as a whole.
Your Turn

Build it, then check it against the shell

The lab

Add bdma.rides as a source, attach the $addFields pipeline, create Ride Operations — Failure Analysis, and build all four charts.

The check

After each chart, verify the number against your Lecture 14 pipeline. The dataset is seeded — there is no “close enough”. A mismatch is a filter you forgot.

Title every chart with its question and population. Arrange for reading order: the status donut goes top-left, because it frames everything else.

Next: L16 — turning four charts and a finding into the one-page recommendation due Friday.
← → or Space to navigate · F for fullscreen