Travel-Tech Practice · T4
How reliable each hub is, where revenue and load factor actually come from, and how customer complaints track operational performance — built the same way an internal ops team, not an OTA, would track a single carrier's health.
On-time performance by hub, all 5 hubs, ranked highest to lowest.
Average ticket + ancillary revenue per operated flight (₹).
Fleet-wide OTP %, Jan–Dec.
Average seats filled %, Jan–Dec.
On-time performance (%) by hub and season. Darker = worse.
Reading it: Delhi and Kolkata (both fog-sensitive) dip hardest in Winter. Mumbai and Kolkata (both monsoon-sensitive) dip separately in Monsoon. Bengaluru and Hyderabad, with neither exposure modeled, stay comparatively flat year-round.
Complaints per 1,000 passengers, by how the flight actually performed.
Every number on this page is synthetic. Here's the calculation, and the reasoning behind each choice, in full.
The sibling Flight Delay Prediction Dashboard answers an OTA's question — "which routes/airlines should I flag as delay-risky?" — across five carriers. This dashboard answers a different question an airline's own ops team asks about itself: "how is my operation actually performing, by hub and over time?" One carrier, tracked in depth, is the right shape for that question — a multi-airline benchmark would be the wrong tool for it.
For every one of the 6,000 simulated flights, in order:
The dataset tracks passengers_expected (a demand estimate,
computed the same way regardless of outcome) separately from
passengers_boarded (zero for a cancelled flight, by
definition). Load factor and revenue are correctly built on
boarded passengers, since those only exist for flights that
actually flew. But the first version of this analysis used
boarded passengers as the denominator for the complaints-rate
metric too — which made cancelled flights show zero
complaints per 1,000 passengers, the exact opposite of reality, purely
because a cancelled flight boards nobody. Complaints are rated against
expected passengers instead: the people actually affected by
the flight, whether it flew or not. Same kind of judgment call as
excluding cancelled flights before averaging delay minutes in the
sibling dashboard — a metric's denominator has to match what the
metric is actually claiming to measure.
Not derived from any real source — chosen, then checked against public ballpark ranges for plausibility (domestic OTP typically 70–88%, load factor typically 75–85%, baggage mishandling typically 4–8 per 1,000 bags across the industry). The fleet-wide numbers here — 77.9% on-time, 78.9% load factor, 5.4 bags mishandled per 1,000 — all land inside those ranges. The relative patterns (which hub is worst, which season hurts which hub, that delays and cancellations both drive up complaints) are what the model was actually built to produce, and are the point of the exercise.
It doesn't fit real distributional parameters from any published dataset — there wasn't one available in this environment. It doesn't model knock-on delay (one late inbound aircraft delaying that same tail number's next departure) — a real ops model would need that, and it's a materially harder problem than this exercise scopes to. Every flight is generated independently; it's built to produce the aggregate patterns an ops dashboard needs, not to be an operations simulator.
Full source: projects/airline-operations-dashboard/generate_dataset.py and
analyze.py in the repo — every number above is reproducible from those two files.