返回目錄
A
數據驅動決策:從原始資料到洞察的全流程 - 第 9 章
第 9 章:實戰案例:從零開始構建商業預測模型
發布於 2026-02-22 16:15
# 第 9 章:實戰案例:從零開始構建商業預測模型
本章將以一個具體的商業預測案例為導向,帶領讀者從需求定義、資料蒐集、資料清洗、探索性資料分析、特徵工程、建模、評估、部署到監控的完整流程。透過範例與實作細節,讓讀者能夠在實務環境中落地、調整、擴充。
## 9.1 需求分析與業務背景
| 產業 | 目標 | KPI | 商業動機 |
|------|------|-----|----------|
| 電商 | 促銷活動期間的客戶購買預測 | 訂單轉化率、客單價 | 提升行銷投入回報率、減少浪費 |
> **業務問題**:在新一輪促銷前,預測每位已註冊會員在活動結束前的購買機率,從而制定個性化行銷方案。
### 目標設定
1. **可量化指標**:客戶購買機率 (0~1)
2. **時效性**:每天更新一次預測結果,供行銷人員即時決策
3. **可解釋性**:能夠說明模型決策依據,符合行銷合規要求
4. **可擴充性**:未來可接入更多特徵 (例如社群互動、第三方資料)
## 9.2 資料蒐集
### 內部資料來源
| 資料表 | 內容 | 取得方式 |
|--------|------|----------|
| users | 用戶基礎資訊 (年齡、性別、會員等級) | SQL 讀取
| transactions | 歷史交易紀錄 | SQL 讀取
| promotions | 促銷活動資訊 | API 取得
| browsing | 瀏覽行為 | 事件資料倉庫 (Kafka + Snowflake)
### 資料連結範例 (Python + SQLAlchemy)
python
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('postgresql://user:pass@host:5432/dbname')
users = pd.read_sql('SELECT * FROM users', engine)
transactions = pd.read_sql('SELECT * FROM transactions', engine)
### 外部資料(可選)
- 社群媒體情感分析結果
- 天氣預報資料 (影響消費行為)
> **注意**:資料來源必須符合 GDPR、個人隱私規範,使用時要加密、匿名化。
## 9.3 資料清洗與預處理
### 缺失值處理
| 欄位 | 缺失處理策略 |
|------|---------------|
| age | 均值填補、或分群填補 |
| gender | 預設為未知 (NaN) |
| last_purchase_date | 設定為 0(無購買) |
python
# 範例:使用 Pandas 進行缺失值填補
users['age'].fillna(users['age'].median(), inplace=True)
### 異常檢測
- **異常值**:年齡 < 0 或 > 120、購買金額 > 100,000 元等。
- **重複資料**:透過 `drop_duplicates()` 去重。
### 資料轉換
- **日期型別**:轉換為 `datetime`。
- **類別變數**:使用 One-Hot Encoding 或 Target Encoding。
- **標準化**:對數值特徵使用 `StandardScaler` 或 `MinMaxScaler`。
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_numeric)
## 9.4 探索性資料分析 (EDA)
### 統計描述
python
print(users.describe(include='all'))
### 可視化
| 視覺化 | 目的 |
|--------|------|
| Histogram | 分佈檢查 |
| Box Plot | 異常值辨識 |
| Correlation Heatmap | 相關性探索 |
| Time Series Plot | 交易趨勢 |
python
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(users.corr(), annot=True, cmap='coolwarm')
plt.show()
### 主要發現
1. 大多數客戶在促銷期間有多次瀏覽,但購買率仍低於平均值。
2. 性別與購買機率存在顯著差異。
3. 會員等級與購買機率呈正相關。
## 9.5 特徵工程與選擇
### 特徵萃取
- **瀏覽行為特徵**:瀏覽次數、平均停留時間、商品類別分佈。
- **交易歷史特徵**:最近一次購買距離、平均訂單金額、購買頻率。
- **促銷反應特徵**:是否參與過類似促銷、對折扣敏感度。
- **時間特徵**:星期幾、季節、假日標記。
### 特徵轉換
- **Target Encoding**:對類別變數做目標編碼以保留資訊。
- **Polynomial Features**:捕捉非線性關係。
python
from category_encoders import TargetEncoder
encoder = TargetEncoder(cols=['gender', 'membership_level'])
X_encoded = encoder.fit_transform(X, y)
### 特徵選擇
- **Filter 方法**:基於相關係數、ANOVA F-Score。
- **Wrapper 方法**:Recursive Feature Elimination (RFE)。
- **Embedded 方法**:L1 正則化、Tree-based Feature Importance。
python
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=1000)
rfe = RFE(estimator=model, n_features_to_select=20)
X_selected = rfe.fit_transform(X, y)
## 9.6 建模
### 模型選擇
| 模型 | 適用場景 | 參數調整 |
|------|----------|----------|
| Logistic Regression | 基本二元預測、可解釋性 | C、solver |
| XGBoost / LightGBM | 處理複雜非線性、提升性能 | n_estimators, max_depth, learning_rate |
| CatBoost | 內建類別處理、可解釋性 | depth, iterations |
> **實務上常用 XGBoost**,因其對異常值不敏感、可直接輸出特徵重要性。
### 模型訓練範例 (XGBoost)
python
import xgboost as xgb
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth': 6,
'eta': 0.05,
'subsample': 0.8,
'colsample_bytree': 0.8,
'seed': 42
}
dtrain = xgb.DMatrix(X_selected, label=y)
watchlist = [(dtrain, 'train')]
bst = xgb.train(params, dtrain, num_boost_round=200, evals=watchlist, early_stopping_rounds=10)
### 交叉驗證
python
from sklearn.model_selection import StratifiedKFold, cross_val_score
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
auc_scores = cross_val_score(bst, X_selected, y, cv=skf, scoring='roc_auc')
print('CV AUC:', auc_scores.mean(), '+/-', auc_scores.std())
### 最終模型
- **XGBoost**,AUC = 0.72,與基礎 Logistic Regression (AUC = 0.65) 相比提升 7%。
- 針對重要特徵進行 SHAP 分析以提高可解釋性。
## 9.6 評估與模型可解釋性
### 評估指標
| 指標 | 公式 |
|------|------|
| AUC-ROC |
| PR-AUC |
| Accuracy (閾值 0.5) |
| Calibration (Brier Score) |
python
from sklearn.metrics import roc_auc_score, precision_recall_curve, auc, brier_score_loss
pred_proba = bst.predict_proba(X_selected)[:,1]
print('AUC-ROC:', roc_auc_score(y, pred_proba))
print('Brier Score:', brier_score_loss(y, pred_proba))
### SHAP 可視化
python
import shap
shap.initjs()
explainer = shap.TreeExplainer(bst)
shap_values = explainer.shap_values(X_selected)
shap.summary_plot(shap_values, X_selected)
> **商業報告範例**:對於「會員等級」特徵,SHAP 最高正向貢獻,說明高等級會員更傾向於購買,符合行銷策略。
## 9.7 模型部署
### 容器化 (Docker)
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
### API 範例 (FastAPI)
python
from fastapi import FastAPI
import joblib
import pandas as pd
app = FastAPI(title='Customer Purchase Probability Service')
model = joblib.load('model/xgboost.pkl')
scaler = joblib.load('model/scaler.pkl')
encoder = joblib.load('model/target_encoder.pkl')
@app.post('/predict')
def predict(payload: dict):
df = pd.DataFrame([payload])
# 進行同樣的特徵工程
df_processed = preprocess(df)
probs = model.predict_proba(df_processed)[:,1]
return {'purchase_probability': probs[0]}
### CI/CD 流程 (GitHub Actions + Helm)
yaml
name: Deploy Model
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker
run: docker build -t myregistry/model:latest .
- name: Push
run: docker push myregistry/model:latest
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Helm Upgrade
run: helm upgrade --install purchase-prediction ./helm
## 9.8 監控與再訓練
| 指標 | 阈值 | 触发行动 |
|------|------|----------|
| AUC < 0.68 | 每日监控 | retrain pipeline |
| Drift in feature distribution | 发现 | 重新做特征工程 |
| SHAP drift | 发现 | 重新解释模型 |
> **工具**:MLflow 追踪实验、Prometheus 监控指标、Grafana 可视化。
## 9.9 反思與最佳實踐
1. **資料管道穩定性**:使用 Snowflake 事件表作為單一來源,減少多處同步風險。
2. **模型解釋性**:SHAP 使行銷人員能夠快速定位關鍵特徵,降低行銷合規風險。
3. **自動化程度**:Airflow DAG 完成 ETL → 特徵生成 → 訓練 → 部署,確保每日自動化更新。
4. **版本管理**:每次模型更新都註冊到 MLflow,確保可追蹤。
5. **資料隱私**:在資料處理階段即進行匿名化,避免個人資訊泄露。
## 9.10 小結
本章透過一個電商促銷預測案例,示範了商業預測模型從需求到部署的全流程。重點包括:
- 清晰的 KPI 及可量化目標
- 多元資料來源的整合與合規性考量
- 嚴謹的資料清洗與異常處理
- 探索性資料分析以發現關鍵洞見
- 高效的特徵工程與選擇
- 選擇合適的模型與評估指標
- 容器化與 CI/CD 確保可持續交付
- 監控、再訓練迴圈保障模型效能
> **實務提示**:在真正的商業環境中,往往還需要考慮「模型壽命管理」、「A/B 測試」以及「持續學習」的策略。這些細節都可以在本章基礎上進一步擴充。