在前面的文章中,發現了兩大體驗痛點:
- Day 11: 物流延遲會直接把滿意度推下斷崖,造成大量 1 星負評。
- Day 13: 超重或超大體積的包裹更容易發生配送跳票。
每當訂單延遲時,平台的客服與營運團隊往往第一時間找貨運公司問責。
但在指責貨運夥伴之前,我們必須回答一個關鍵問題:賣家到底有沒有準時把包裹包好、交給司機?
今天,將深入探索明細表中極具營運價值的欄位 shipping_limit_date,
透過特徵工程精確計算賣家的履約服務水準協議(SLA),將「賣家發貨延誤」與「物流幹線延誤」徹底拆解開來!
在 Olist 的資料庫中,平台給予賣家明確的出貨承諾規範:
shipping_limit_date(明細表):平台規定賣家最晚必須將包裹交給物流承運商的時間點。
order_delivered_carrier_date(訂單表):貨運司機實際掃描條碼、收走包裹的時間點。
我們取出欄位並進行對齊:
# 1. 從字典取出明細表,並確保發貨截止日轉換為 datetime 格式
items = olist_db['olist_order_items_dataset'].copy()
items['shipping_limit_date'] = pd.to_datetime(items['shipping_limit_date'])
# 2. 確保使用 Day 11 產出、含有延遲標籤的訂單大表 (orders_with_reviews)
# 並確保物流收件時間為 datetime 格式
orders_with_reviews['order_delivered_carrier_date'] = pd.to_datetime(
orders_with_reviews['order_delivered_carrier_date']
)
# 3. 跨表合併:將明細表的發貨限制,與訂單表的收件時間、延遲狀態串接
seller_sla = pd.merge(
items[['order_id', 'product_id', 'seller_id', 'shipping_limit_date']],
orders_with_reviews[['order_id', 'order_delivered_carrier_date', 'is_delayed', 'review_score']],
on='order_id',
how='inner'
)
# 4. 排除物流尚未收件(缺失 carrier_date)的少數極端資料
seller_sla.dropna(subset=['order_delivered_carrier_date', 'shipping_limit_date'], inplace=True)
# 檢視合併後的成果
seller_sla.head(3)
實作區 :

我們透過這兩個時間戳記相減,衍生出賣家層級的履約指標:
- 賣家交件落差天數 (seller_delay_days): 實際交給貨運公司的時間 - 規定發貨截止時間。
- 賣家出貨是否違約 (is_seller_breach): 若交件時間超過截止日(> 0),即判定為賣家跳票。
# 1. 計算賣家交件時差(實際交件日 - 發貨截止日,換算成天數)
seller_sla['seller_delay_days'] = (
seller_sla['order_delivered_carrier_date'] - seller_sla['shipping_limit_date']
).dt.total_seconds() / (24 * 3600)
# 2. 衍生二元特徵:標記賣家是否違約出貨 (SLA Breach)
seller_sla['is_seller_breach'] = seller_sla['seller_delay_days'] > 0
# 3. 計算全平台賣家出貨違約率
breach_rate = seller_sla['is_seller_breach'].mean() * 100
print(f"全平台賣家出貨超時率 (SLA Breach Rate): {breach_rate:.2f}%")
實作區 :

前段賣家出貨拖延,是否真的會導致最終包裹送到買家手中時遲到?
我們用交叉分析(Cross-Tabulation)來驗證這條連鎖效應:
# 交叉分析:賣家是否超時交件 vs. 最終整張訂單是否遲到
cross_analysis = pd.crosstab(
seller_sla['is_seller_breach'],
seller_sla['is_delayed'],
normalize='index'
) * 100
cross_analysis.columns = ['買家端準時 (%)', '買家端延遲 (%)']
cross_analysis.index = ['賣家準時交件', '賣家超時出貨']
cross_analysis.round(2)
實作區 :

連鎖反應數據:
賣家準時交貨:最終送到買家手上遲到的機率僅約 5%~6%,代表物流承運商大部分時候都能在承諾時間內跑完全程。
賣家超時出貨:最終整張訂單發生延遲的機率暴增至 30%~40% 以上!
這意味著:前段賣家多拖一天,後段貨運物流就需要額外承擔巨大的補時壓力。
賣家壓貨是觸發後續物流骨牌效應的主要導火線之一。
我們不能單看單筆交易,必須評估個別賣家的整體信譽。
結合 Day 12 的經驗,我們設定門檻,只分析出貨量大於等於30件的成熟賣家:
# 1. 依 seller_id 聚合評估賣家履約指標
seller_performance = seller_sla.groupby('seller_id').agg(
total_orders=('order_id', 'count'),
breach_rate=('is_seller_breach', 'mean'),
final_delay_rate=('is_delayed', 'mean'),
avg_score=('review_score', 'mean')
).reset_index()
# 2. 樣本門檻防呆:只保留出貨量 >= 30 筆的活躍賣家
active_sellers = seller_performance[seller_performance['total_orders'] >= 30].copy()
active_sellers['breach_rate_pct'] = (active_sellers['breach_rate'] * 100).round(2)
active_sellers['final_delay_rate_pct'] = (active_sellers['final_delay_rate'] * 100).round(2)
active_sellers['avg_score'] = active_sellers['avg_score'].round(2)
# 3. 依賣家違約率降冪排序,檢視表現最差的前 5 名
worst_sellers = active_sellers.sort_values(by='breach_rate_pct', ascending=False).head(5)
worst_sellers[['seller_id', 'total_orders', 'breach_rate_pct', 'final_delay_rate_pct', 'avg_score']]
實作區 :

今天我們深入供給端,完成了責任劃分的閉環診斷:
- 解鎖發貨錨點: 善用 shipping_limit_date 建立賣家責任邊界。
- 釐清骨牌效應: 證實了賣家出貨違約會讓最終訂單延遲率攀升數倍。
- 建立賣家畫像: 透過樣本門檻篩選,定位出全平台拖慢物流時效的「慣性拖延賣家」,為平台提供停權、降權或罰款的量化依據。
經過 14 天的推進,我們從最底層的髒資料清洗、跨表合併、時序與地理拆解,一路分析到顧客體驗、品類規格與賣家責任。
明天見 ~~