Sử dụng Machine Learning dự báo số lượng yêu cầu giao hàng đối với công ty trong mảng giao vận- Shippo

Data Analysis- VelaCorp
VelaCorp
Published in
7 min readSep 25, 2018

/English version below/

  1. Giới thiệu doanh nghiệp Shippo

Shippo là một start-up hoạt động trong mảng giao vận (Giao hàng chặng cuối) và bắt đầu hoạt động từ năm 2016, được đầu tư bởi VelaCorp. Kể từ năm 2016 tới nay, Shippo đã có văn phòng tại Hà Nội, Hồ Chí Minh và Phillipines với sốlượng khách hàng của shippo đã tăng lên hơn 10000 tại Việt Nam và gần 200 khách hàng tại Phillipines.

2. Bài toán đặt ra với Shippo

Với bài toán giao hàng chặng cuối, mục tiêu của Shippo là giao hàng ngay trong ca tiếp theo. Đây có thể nói là mục tiêu rất khó với các doanh nghiệp giao vận. Đối với shippo, một đơn hàng kể từ khi khách hàng đặt yêu cầu giao cho tới khi hoàn thành đơn hàng sẽ trải qua các bước chính như sau:

Hình 1: Qúa trình từ khi khách hàng đặt đơn yêu cầu tới khi hoàn thành

Với mục tiêu đã cam kết với khách hàng: Lấy ca trước và giao ca sau. Shippo gặp phải là việc ước lượng con sốtin cậy lượng đơn sẽ được khách hàng đặt trong từng ca để có thể sắp xếp nhân sự đáp ứng các yêu cầu này. Không chỉ vậy, với đặc thù trong mảng giao nhận là việc lấy hàng và giao hàng không thành công, phải thực hiện lại nhiều lần dẫn tới các task giao và lấy sẽ không chỉ là các đơn tạo mới mà còn bao gồm cả những đơn chưa thực hiện thành công. Cộng với việc tuyển dụng shipper Parttime là tương đối khó khăn và phải có kế hoạch trước đó dẫn tới việc phải dự báo lượng đơn cho từng ca, từng ngày và từng tuần là vô cùng cần thiết, đóng góp quan trọng vào hiệu quả hoạt động kinh doanh của Shippo nói riêng và các doanh nghiệp giao vận nói chung.

3. Phân tích bài toán, phân tích các biến trong mô hình

Bài toán sẽ dựa vào các biến độc lập: Nghỉ lễ, Khách hàng hoạt động trong vòng 30 ngày gần nhất, Khách hàng đăng ký đơn mới trong 7 ngày gần nhất, số lượng sales qua từng giai đoạn, lag theo tuần, Lag theo tháng và MA của ca và ngày tương ứng trong 3 tuần gần nhất để dự báo cho biến phụ thuộc: Số lượng đơn khách hàng đặt theo ca

+ Thời điểm trước nghỉ lễ, sau nghỉ lễ số lượng đơn đặt sẽ khác nhau do cơ cấu ngành kinh doanh của KH của Shippo (Đặt các trọng số cho từng ngày trước và sau lễ).

+ Khách hàng hoạt động trong 30 ngày gần nhất và Khách hàng đăng ký, lên đơn mới trong 7 ngày gần nhất: Số lượng khách hàng lên đơn trong 30 ngày gần nhất là yếu tố quan trọng trong mô hình, tương tự với những khách hàng mới và có lên đơn đầu tiên trong 7 ngày gần nhất.

+ Quy mô sale/CSKH phản ánh việc cung cấp dịch vụ của Shippo, đây là yếu tố phản ánh việc đáp ứng dịch vụ cũng như chăm sóc các khách hàng của Shippo

+ Lag theo tuần, Lag theo tháng

+ MA theo ca của ca và ngày tương ứng 3 tuần gần nhất.

Việc đưa các biến vào mô hình dựa theo việc áp dụng các phương pháp xây dựng và kiểm thử của phòng Data Analysis và sẽ được mô tả chi tiết hơn trong các phần tiếp theo

4. Dữ liệu đầu vào .

Dữ liệu đầu vào cho mô hình bao gồm các dữ liệu của các biến độc lập đã liệt kê bên trên, phần dữ liệu thô bao gồm dữ liệu về số lượng đơn hàng phân theo các ngày, khu vực đặt đơn, các ca đặt đơn, dữ liệu về sale. Dữ liệu khách hàng active theo 30 ngày gần nhất và dữ liệu khách hàng mới lên đơn lần đầu trong 7 ngày gần đây là dữ liệu được xây dựng phái sinh từ dữ liệu trên.

Dữ liệu sử dụng cho training và test là dữ liệu của shippo trong vài tháng trở lại đây (Do đặc thù kinh doanh nên bài viết lựa chọn khoảng thời gian này)

Dữ liệu lấy từ hệ thống bao gồm :

Dữ liệu đơn giao của khách hàng
Dữ liệu khách hàng
Dữ liệu danh sách Sale

Tất cả các dữ liệu đầu vào đều là Raw data được sử dụng từ hệ thống, các bước xử lý để xây dựng các biến cho mô hình sẽ được mô tả kỹ hơn bên dưới:

5. Data preprocessing

Hoạt động của shippo đang tăng trưởng mạnh, vì vậy nếu vẽ 1 box plot cho toàn bộ dữ liệu trong quá khứ có thể gây khó khăn trong việc nhận biết outliers. Cụ thể, đối với 1 tháng nào đó, lượng demand của 1 ngày tăng đột biến, tuy nhiên khi so sánh với 5 tháng sau đó, lượng demand như vậy lại là hoàn toàn bình thường. Chúng tôi sử dụng Box plot cho từng tháng để thể hiện ra các outliers

Hình 2: Boxplot lượng đơn theo từng tháng của Shippo

Kết quả thu được các outliers nằm tập trung vào các dịp nghỉ lễ như 1/1, tết âm lịch, 30/4 -1/5 , 2/9 nên cần loại những data thuộc ngày lễ để tăng độ chính xác cho mô hình

Tuy nhiên, với định hướng sử dụng các dữ liệu về demand trong quá khứ làm mấu chốt để dự đoán lượng demand cho ngày tiếp theo, nếu đơn thuần mình chỉ bỏ các điểm dữ liệu thuộc các ngày nghỉ lễ đi, giả sử với mô hình đơn giản nhất là dự báo lượng demand ngày mai chỉ dựa trên lượng demand hôm nay, vậy nếu hôm nay là ngày nghỉ lễ, vậy dữ liệu ngày mai được dự báo thế nào?

Chính vì vậy, ta cần phải Fill NaN cho các điểm dữ liệu là ngày lễ đã loại bỏ trước đó.

6. Feature engineering

Hình 3: Biểu đồ lượng đơn của Shippo theo ngày

Ta thấy có xu hướng seasonal như đầu tuần, cuối tuần, đầu tháng, cuối tháng, do vậy tác giả bắt đầu xây dựng mô hình với các features: Demand lag day, lag week, lag month, lag year trong mô hình

7. Xây dựng mô hình

Sau khi training model và đánh giá trên test set, tác giả lựa chọn sử dụng mô hình Linear Regression

Thực hiện theo quy trình: Fit model -> tính test score -> kiểm tra các điểm bị dự báo sai nhất có đặc tính gì -> quay lại bước feature engineering để implement thêm các feature đó và tiếp tục quá trình => đạt yêu cầu => đưa vào sử dụng.

model_dict = {}locs = [‘HN’,”HCM”]for i in range(len(model_data)):model_data_ = model_data[i]for e in range(3):X_y = model_data_[[‘demand_lag_day’,’ma_week’,”demand_lag_week”, “demand_lag_month”,”before_holiday”,”new_users”,’sales’,’demand’]]X_y = X_y.dropna()X_ = X_y[[‘demand_lag_day’,’demand_lag_week’,’ma_week’, “demand_lag_month”,”before_holiday”,”new_users”,’sales’]]y_ = X_y[‘demand’]X = X_[X_.index.str[-1]==’{}’.format(e+1)]y = y_[y_.index.str[-1]==’{}’.format(e+1)]performance = …mod = …X_1, X_test, y_1, y_test = train_test_split(X, y, test_size = 0.2)for g in range(…):X_train, X_valid, y_train, y_valid = train_test_split(X_1, y_1,test_size = 0.1)model = linear_model.LinearRegression()model.fit(X_train, y_train)if np.percentile(np.abs(model.predict(X_valid) — y_valid), 90) < performance:performance = np.percentile(np.abs(model.predict(X_valid) — y_valid), 90)mod = modelperformance = np.percentile(np.abs(model.predict(X_test) — y_test), 90)model_dict[‘{0}_{1}’.format(locs[i], e+1)] = [mod, performance]

8. Kết quả của mô hình trong một tuần sử dụng thực tiễn

Hình 4: Kết quả dự đoán của mô hình và thực tế

Với kết quả dự đoán của mô hình như hình 4 có thể thấy mô hình dự báo tương đối tốt, tuy nhiên vẫn còn những ca cần phải cải thiện, bổ sung thêm một số biến số cho mô hình.

9. Cải thiện mô hình và hoàn thiện kết quả của mô hình

Dựa với kết quả dự báo kết hợp với các tính toán về khả năng thực hiện task của shipper, tác giả sẽ kết hợp với hệ thống BI của Shippo để đưa ra các thông báo về lượng cầu dịch vụ của khách hàng và tính toán ra lượng nhân sự cần thiết, team vận hành có thể sử dụng trong cả push sale và chuẩn bị nhân sự cần thiết để đáp ứng cho nhu cầu đó.

Thêm nữa, do đặc thù kinh doanh, dữ liệu ngày thứ 7 sẽ có sự khác biệt so với các ngày từ thứ 2 tới thứ 6, do vậy mô hình sẽ có những thay đổi nhằm tăng chất lượng dự báo

Trong hoạt động giao vận cần phải tách riêng yêu cầu giao và lấy, mô hình cũng sẽ áp dụng để dự báo cho các yêu cầu giao mới và yêu cầu giao cũ chưa thành công cho từng ca để đáp ứng đầy đủ các yêu cầu vận hành của Shippo.

Updating…

--

--

Data Analysis- VelaCorp
VelaCorp

We are members of Data Analysis Department — VelaCorp, An investment company. VelaCorp is investing in some companies such as: Shippo, Posi, EzBiz…