
Investigate a food-delivery lateness spike with the seaborn toolkit — and end on the one heatmap that answers the question.
Zesto delivers food in Mumbai, Bengaluru, Pune and Jaipur, and February's reviews are ugly. Priya from city operations hands you the month's order log: find out where deliveries run late, when they run late, and what changed. You'll work distribution-first — histogram, boxplot, barplot, scatterplot, countplot — and finish with a city-by-day heatmap that pins the problem to one zone and one week.
Eight steps, ~3 hours. What you'll practice: sns.histplot, sns.boxplot, sns.barplot, sns.scatterplot, sns.countplot, sns.heatmap, and axis labeling that survives contact with a skeptical stakeholder.
You'll practice
deliveries_feb.csv is one month of Zesto orders, exactly as the ops database exports it. Load it into a DataFrame called orders — parse order_placed_at and delivered_at as datetimes — then add two columns: delivery_minutes (how long the order took, in minutes) and is_late (True when it took longer than promised_minutes). Finally compute late_rate = orders['is_late'].mean().
Done when: orders has 3,000 rows with the two new columns, and late_rate holds the overall share of late orders (about one in five — now you see why Priya is worried).
order_id · city (Mumbai, Bengaluru, Pune, Jaipur) · zone (3 per city) · cuisine · order_placed_at / delivered_at (timestamps) · promised_minutes (30 or 45) · distance_km · order_value (₹) · rider_id
An order is late when it took longer than promised_minutes to deliver.