Clean case set
95,082orders
98.5% of the 96,486 delivered orders retained; 1,404 excluded for broken timestamps.
Late deliveries
8.2%
7,792 orders arrived after their estimated delivery date.
Median delivery time
10.3days
Purchase to customer delivery, across all three process stages.
Review score cliff
4.29 → 1.71
Mean review score, on-time versus 15+ days late — a 60% fall.
The review cliff
Mean review score by how late the order arrived. Satisfaction does not decay gently — it falls 1.45 points between "1–3 days late" and "4–7 days late", the steepest step on the scale.
Source: olist_review_by_delay.csv. Covers 94,443 cases — the 639 cases with no review score are dropped, so these counts sit slightly below the case table's. The on time / early bucket absorbs all early deliveries, which is the large majority.
Where does the time go
The three stages of one order's lifecycle. Approval is effectively instant; the carrier handoff is where sellers control the clock, and transit is the bulk of it.
- Purchase → approval0.3 h median9.7 h mean0.2%
- Approval → carrier handoff44.4 h median68.4 h mean20.6%
- Carrier → customer transit7.11 d median9.36 d mean79.2%
Medians are not additive. The three stage medians sum to 8.97 days, while the median end-to-end time is 10.27 days. The bar shows each stage's share of that summed median, not a decomposition of the median total. The means do decompose exactly — hover any segment to compare.
Computed from olist_cases_clean.csv over all 95,082 cases. Stage spans are defined in the methodology note below; each stage is shown in its natural unit because a sub-hour stage and a multi-day stage cannot share a linear axis.
Worst-offending sellers
The 15 slowest sellers by average approval → carrier handoff — the one stage attributable to the seller rather than the logistics network. 15 of them sit above the 200 h threshold.
| # | Seller ID | Orders | Avg handoff | In days |
|---|---|---|---|---|
| 1 | 66e0557ecc…outlier | 30 | 430.2 h | 17.9 d |
| 2 | 54965bbe3e…outlier | 70 | 372.5 h | 15.5 d |
| 3 | 5058e8c1e8…outlier | 61 | 366.5 h | 15.3 d |
| 4 | 6fd52c528d…outlier | 67 | 332.6 h | 13.9 d |
| 5 | 17f51e7198…outlier | 55 | 287.3 h | 12.0 d |
| 6 | ad781527c9…outlier | 35 | 285.4 h | 11.9 d |
| 7 | cee4880721…outlier | 38 | 282.8 h | 11.8 d |
| 8 | 7c67e1448b…outlier | 966 | 274.2 h | 11.4 d |
| 9 | d71d863e5e…outlier | 22 | 261.7 h | 10.9 d |
| 10 | 2eb70248d6…outlier | 185 | 261.1 h | 10.9 d |
| 11 | 8444e55c1f…outlier | 91 | 256.5 h | 10.7 d |
| 12 | a7f13822ce…outlier | 73 | 252.9 h | 10.5 d |
| 13 | a2e874074c…outlier | 40 | 251.4 h | 10.5 d |
| 14 | 835f0f7810…outlier | 41 | 230.5 h | 9.6 d |
| 15 | 054694fa03…outlier | 20 | 227.0 h | 9.5 d |
Source: olist_seller_bottlenecks.csv, which ranks 788 sellers filtered to those with at least 20 orders. Seller ids are truncated for display; they are anonymised in the source dataset. A high average here is not proof of fault — order mix and product type are not controlled for.
Late rate by customer state
The 10 worst and 5 best of 27 customer states. AL runs 2.9× the national late rate of 8.2%.
Derived from olist_cases_clean.csv — note there is no olist_by_state.csv in data/, so these figures are aggregated from the fact table directly. Read the “best” five with care: they average 21.3 days to deliver, well above the national median of 10.3 days. They score well because their estimated dates are padded, not because they are fast. 2 of them (AC, n=77; AP, n=67) also rest on a small sample.
Monthly trend
Late rate and median delivery time by purchase month, Oct 2016 – Aug 2018. Shown as two charts on separate axes rather than one dual-axis chart, so neither line's shape distorts the other.
Late rate (% of orders)
Median total delivery time (days, purchase → delivery)
Late rate from olist_monthly_stages.csv; median total days computed from olist_cases_clean.csv (the rollup carries means, not medians). Months with fewer than 30 orders are dropped as noise — 2016-09 (n=1), 2016-12 (n=1). November 2016 has no records at all; the lines break at each gap rather than interpolating across it.