When does ride demand actually spike, does driver supply keep up, and what should ops do differently because of it? This project digs into 150,000 ride bookings across a full year to find out — using time-based EDA and pattern analysis, not classification, since the underlying question here is about demand and supply timing, not predicting a yes/no outcome.
NCR ride bookings dataset — 150,000 bookings across 365 days, with booking status, timestamps, pickup/drop locations, fare, distance, and cancellation reasons.
- Day-of-week barely matters. Daily booking counts range from 21,215 to 21,644 across the whole week — under a 2% spread. Weekday and weekend averages are nearly identical. Any staffing plan built around "weekends are busier" would be reacting to noise.
- Hour-of-day is where the real pattern is. Demand swings ~9x across the day — from ~1,320 bookings at 4 AM to ~12,400 at 6 PM. Weekday and weekend hourly shapes track almost identically, aside from a small secondary bump around 10 AM on weekends.
- Fare and distance don't move with time of day. Both stay in a tight band (fare: ₹499–₹519, distance: 25.5–26.5 km) across all 24 hours — ruling out the idea that peak-hour fares already reflect demand.
- The core finding: supply failure is flat, not demand-driven. Combined driver cancellations and "no driver found" hold at ~24–26% regardless of hour — 25.4% at the busiest hour, 24.9% at the quietest. This reframes the problem: it's not a peak-hour capacity issue, it's a constant structural failure rate.
- Demand isn't geographically concentrated. The top 15 pickup locations (out of 176) account for only 9.2% of all bookings — spread evenly across the city rather than clustered around a few hotspots.
Full write-up with charts and reasoning: see Uber_Ride_Analytics_Writeup.docx in this repo.
- Cleaning — parsed date/time into hour, day-of-week, and month fields; checked for duplicate booking IDs and nulls tied to booking status (cancelled/incomplete rides naturally lack fare and distance data)
- EDA — demand by hour, by day of week, weekday vs. weekend shape, top pickup locations, and fare/distance patterns by hour
- Pattern analysis — 7-day rolling average to separate real trend from daily noise; supply-failure rate by hour instead of raw cancellation counts, since rate reveals the flat-failure pattern that raw counts would hide
- Evaluation — every finding is checked against rate, not just raw count, since job role/location-style "biggest raw number" comparisons can be misleading (a lesson carried over from the HR attrition project)
ncr_ride_bookings.csv— datasetUber_ride_analysis_code— full analysis script (cleaning, EDA, pattern analysis)Uber_Ride_Analytics_Writeup.docx— full write-up: every chart, captioned and explainedREADME.md— this file
Python, pandas, numpy, matplotlib
pip install pandas numpy matplotlib
python Uber_ride_analysis_codeKeep ncr_ride_bookings.csv in the same folder as the script.
The flat day-of-week pattern, even spread across locations, and tight fare/distance bands suggest this is likely a synthetic or simulated dataset rather than organic ride-hailing data — real-world data usually shows sharper geographic concentration and a clearer weekday/weekend split. Flagging this here rather than overstating findings the data doesn't fully support.