Dự đoán số lượng khách đến quán không chỉ giúp chủ quán chuẩn bị nguyên liệu, điều chỉnh lịch phục vụ mà còn có thể giảm lãng phí và tối ưu chi phí vận hành. Thay vì ước lượng dựa vào cảm tính, Machine Learning cung cấp một công cụ mạnh mẽ để khai thác dữ liệu lịch sử và dự báo chính xác hơn. Khi có dự báo tin cậy, quán có thể xử lý nhân sự linh hoạt, đảm bảo phục vụ đầy đủ những ngày đông khách và không tốn chi phí dư thừa trong ngày vắng.
Trong bài viết này, chúng ta sẽ dùng mô hình Machine Learning (Random Forest Regressor) để dự đoán số lượng khách mỗi ngày đến quán. Bài viết dành cho người mới và trình bày rõ từng bước. Trước mỗi đoạn code đều có phần giải thích bằng hai đoạn văn, giúp bạn hiểu kỹ thuật lẫn mục đích của từng bước.
Dataset sử dụng
Chúng ta sẽ dùng dataset Coffee Shop Daily Revenue Prediction Dataset trên Kaggle – chứa khoảng 2.000 ngày dữ liệu về doanh thu, số lượng khách, thời tiết và các ngày lễ liên quan. Đây là bộ dữ liệu đầy đủ yếu tố ảnh hưởng đến lượng khách và rất phù hợp để thực hiện bài toán dự báo.
Bạn có thể tải dữ liệu tại: Coffee Shop Daily Revenue Prediction Dataset – Kaggle bên dưới đây:
Link tải: https://www.kaggle.com/datasets/himelsarder/coffee-shop-daily-revenue-prediction-dataset
Dữ liệu này cung cấp các cột như date (ngày), customers (số khách), temperature, rainfall, holiday (Yes/No), giúp chúng ta có đầy đủ thông tin để huấn luyện mô hình.
Nạp và khám phá dữ liệu
Trước khi xử lý, chúng ta cần đọc dữ liệu vào Python và xem cấu trúc, kích thước cũng như chất lượng của nó. Khám phá dữ liệu (EDA) giúp phát hiện giá trị thiếu, kiểm tra phân phối biến và hiểu mối quan hệ giữa các yếu tố – rất quan trọng để quyết định các bước chuẩn hóa và xây dựng mô hình.
Ngoài ra, vẽ đồ thị số khách theo thời gian sẽ giúp chúng ta nhận thấy các xu hướng dài hạn, biến động theo mùa hoặc theo ngày lễ – thông tin này gợi ý về cách chọn đặc trưng phù hợp cho mô hình.
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('Coffee_Shop_Daily_Revenue.csv', parse_dates=['date'])
print(data.head())
print(data.info())
print(data.describe())
plt.figure(figsize=(12,6))
plt.plot(data['date'], data['customers'], label='Number of Customers')
plt.title('Daily Customers Over Time')
plt.xlabel('Date')
plt.ylabel('Customers')
plt.legend()
plt.show()
Tiền xử lý và tạo đặc trưng
Dữ liệu thô thường chứa các cột không trực tiếp sử dụng và cần chuẩn hóa. Chẳng hạn, chúng ta nên chuyển holiday thành giá trị 0/1 để mô hình hiểu được; thêm day_of_week và month giúp mô hình nhận biết các xu hướng theo tuần hoặc theo mùa.
Ngoài ra, chia dữ liệu thành hai phần train và test rất quan trọng để đánh giá chất lượng mô hình trên dữ liệu chưa từng thấy và tránh việc “quá khớp” vào dữ liệu huấn luyện.
from sklearn.model_selection import train_test_split
data['day_of_week'] = data['date'].dt.dayofweek
data['month'] = data['date'].dt.month
data['holiday'] = data['holiday'].map({'Yes':1, 'No':0})
features = ['temperature','rainfall','day_of_week','month','holiday']
X = data[features]
y = data['customers']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
print("Train shape:", X_train.shape, "Test shape:", X_test.shape)
Huấn luyện mô hình Random Forest
Với bài toán dự đoán số khách là biến liên tục, chúng ta sử dụng model Random Forest Regressor – nổi bật vì khả năng xử lý phi tuyến, robust với dữ liệu hỗn hợp và hiếm khi yêu cầu chuẩn hóa đầu vào.
Chúng ta sẽ khởi tạo mô hình với tham số đơn giản và tiến hành huấn luyện trên dữ liệu train.
from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X_train, y_train)
Đánh giá mô hình
Muốn biết mô hình hoạt động tốt đến đâu, chúng ta sử dụng các chỉ số như MAE (Mean Absolute Error) và RMSE (Root Mean Squared Error). Nếu MAE khoảng 5–10 khách, bạn đã có một mô hình tốt để triển khai trong thực tế.
Ngoài ra, việc vẽ đồ thị so sánh giữa số khách thực tế và giá trị dự đoán giúp trực quan hóa hiệu quả mô hình trên nhiều khoảng thời gian.
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print(f"MAE: {mae:.2f}, RMSE: {rmse:.2f}")
plt.figure(figsize=(10,6))
plt.plot(y_test.values, label='Actual')
plt.plot(y_pred, linestyle='--', label='Predicted')
plt.title('Actual vs Predicted Customers')
plt.xlabel('Test Sample Index')
plt.ylabel('Customers')
plt.legend()
plt.show()
Kết luận
Qua bài viết, bạn đã nắm được quy trình dự báo số khách bằng máy học: từ đọc dữ liệu, xử lý, huấn luyện mô hình đến đánh giá kết quả. Mô hình hiện tại có thể được nâng cấp bằng cách thêm biến độ ẩm, số lượng nhân viên phục vụ, hoặc thử các mô hình khác như XGBoost, CatBoost hay LSTM nếu bạn có dữ liệu theo chuỗi thời gian.
Khi cần deploy, bạn có thể lưu mô hình (joblib.dump(...)) và sử dụng Flask để tạo API để cho phép chủ quán nhập thời tiết và ngày tới để nhận kết quả dự báo.

