聊天視窗

數據驅動決策:從原始資料到洞察的全流程 - 第 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 測試」以及「持續學習」的策略。這些細節都可以在本章基礎上進一步擴充。