商业分析 四大支柱 · 聚类 / 关联 / 逻辑回归 / 决策树

D+18 教程 2026-08-24 ~14000 字 面向数据科学家 真实数据集 · 可运行代码
给数据科学家的算法实战手册。聚类 / 关联 / LR / 决策树四个最常用的商业分析算法,基于 2024-2026 GitHub 高 star 真实项目 + 公开 benchmark,每个算法配真实数据集 + 调优代码 + 上线避坑清单。
四个算法的核心定位

1聚类分析 · 客户分群 + 异常检测

核心问题 · "客户/商品/店铺自然分成几类?" · 无监督,无标签

1.1 业务场景速览

场景聚类用法真实项目参考
客户分群RFM 模型替代品pramodkondur/Customer-Segmentation-RFM-CLV
商品聚类电商 SKU 归一Shopee / Pinterest 内部实现
异常检测hdbscan -1 标签 = 噪声PayPal 反欺诈
门店分层连锁店 A/B/C 店型识别优衣库 / 星巴克选址
NLP 主题评论/工单主题发现BERTopic (★7.8k)

1.2 三大主流算法对比

A. K-Means · 最经典,但有 3 个坑

B. HDBSCAN · 变密度聚类,风控首选 ⭐

C. 谱聚类 · 高维嵌入向量

1.3 实战代码 · UCI Online Retail II

数据集: 2009-2011 英国在线零售,1M 笔交易,541K 客户。基于 RFM + HDBSCAN 做客户分群。

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import hdbscan
from umap import UMAP

# 1. 加载 + RFM 构造
df = pd.read_csv("online_retail_II.csv", encoding="latin-1")
df = df[~df["InvoiceNo"].astype(str).str.startswith("C")]  # 去掉退货
df = df.dropna(subset=["CustomerID"])

snapshot = df["InvoiceDate"].max() + pd.Timedelta(days=1)
rfm = df.groupby("CustomerID").agg({
    "InvoiceDate": lambda x: (snapshot - x.max()).days,  # Recency
    "InvoiceNo": "nunique",                                # Frequency
    "Quantity": lambda x: (x * df.loc[x.index, "UnitPrice"]).sum()  # Monetary
}).rename(columns={"InvoiceDate": "Recency", "InvoiceNo": "Frequency", "Quantity": "Monetary"})

# 2. IQR 过滤异常值 (聚类对极端值敏感)
for col in ["Recency", "Frequency", "Monetary"]:
    q1, q3 = rfm[col].quantile([0.05, 0.95])
    rfm = rfm[(rfm[col] >= q1) & (rfm[col] <= q3)]

# 3. 标准化 (K-Means/HDBSCAN 必备)
X = StandardScaler().fit_transform(rfm)

# 4. UMAP 降维 (3 维 → 2-3 维)
X_umap = UMAP(n_components=2, n_neighbors=30, random_state=42).fit_transform(X)

# 5. HDBSCAN 聚类
clusterer = hdbscan.HDBSCAN(min_cluster_size=100, min_samples=10)
labels = clusterer.fit_predict(X_umap)

# 6. 评估
print(f"簇数: {len(set(labels)) - (1 if -1 in labels else 0)}")
print(f"噪声比例: {(labels == -1).mean():.2%}")
print(f"Silhouette: {silhouette_score(X_umap, labels):.3f}")
# >0.5 为佳

# 7. 业务解读
rfm["cluster"] = labels
cluster_profile = rfm.groupby("cluster").agg({
    "Recency": "mean", "Frequency": "mean", "Monetary": "mean"
}).round(0)
print(cluster_profile)

1.4 真实业务结果

在 UCI Online Retail II 数据集上的真实 RFM+HDBSCAN 分群结果 (摘自 pramodkondur 项目,1.06x ROI):

Recency (天)FrequencyMonetary (£)占比营销动作
0 高价值14124,5808%VIP 专属优惠 + 提前上新
1 中活跃4551,20022%常规 EDM 推送
2 低频120234035%召回邮件 + 折扣券
3 沉睡28018028%放弃,只发系统通知
-1 噪声7%人工审核 (可能是羊毛党/异常)

避坑: K-Means 必须先标准化 + UMAP 降维;HDBSCAN 直接跑高维数据会失败。商业落地后必须做 PSI 监控(每月),保证线上分群稳定。


2关联分析 · 捆绑销售 + 购物篮

核心问题 · "A 和 B 经常一起买吗?" · 无监督,找共现规律

2.1 业务场景速览

场景真实案例业务提升
捆绑销售啤酒+尿布 (沃尔玛经典)客单价 +15-30%
交叉推荐"买了 X 的人也买了 Y"CTR +20-40%
促销组合设计套餐 / 满减门槛毛利率 +5-10%
商品陈列实体店货架摆放连带率 +8-15%
库存联动A 缺货预警 → B 也快缺缺货损失 -20%

2.2 三大主流算法对比

算法时间复杂度速度GitHub 标杆
AprioriO(2ⁿ) 候选asaini/Apriori (★785)
FP-GrowthO(n·freq)比 Apriori 快 8xrasbt/mlxtend (★5.1k)
ECLATO(n·tids)密集小 item 时更快jeffrichardchemistry/pyECLAT
PyAerial (2025)神经符号大规模 100-1000xDiTEC-project/pyaerial (★36)

关键事实: 对同一支持度/置信度阈值,三算法产出的频繁项集是数学等价,差异主要在性能,非结果差异。PyAerial 是学习型,准确率 = 数据重建精度 + 规则覆盖率。

2.3 实战代码 · Instacart Market Basket

数据集: Instacart 200万订单 × 134 个商品类别。基于 FP-Growth 找高频捆绑。

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import fpgrowth, association_rules

# 1. 加载 + 转 one-hot (稀疏矩阵加速 10x)
orders = pd.read_csv("instacart_order_products__prior.csv")
products = pd.read_csv("instacart_products.csv")
df = orders.merge(products[["product_id", "product_name"]], on="product_id")

transactions = df.groupby("order_id")["product_name"].apply(list).tolist()
te = TransactionEncoder()
oht = te.fit_transform(transactions, sparse=True)  # 关键:sparse=True
df_encoded = pd.DataFrame.sparse.from_spmatrix(oht, columns=te.columns_)

# 2. FP-Growth (比 Apriori 快 8 倍)
print("FP-Growth running...")
fi = fpgrowth(df_encoded, min_support=0.02, use_colnames=True)
print(f"频繁项集数: {len(fi)}")

# 3. 关联规则 (三层筛选)
rules = association_rules(fi, metric="lift", min_threshold=1.5)
rules = rules[(rules["confidence"] > 0.5) & (rules["support"] > 0.05)]

# 4. 上线标准: Lift > 3 AND Confidence > 0.5 AND Support > 0.05
high_value = rules[(rules["lift"] > 3) & (rules["confidence"] > 0.5)]
print(f"高价值规则数: {len(high_value)}")

# 5. Top 10 规则
top10 = high_value.sort_values("lift", ascending=False).head(10)
print(top10[["antecedents", "consequents", "support", "confidence", "lift"]])

2.4 真实业务结果

摘自 AmirhosseinHonardoust/Market-Basket-Analysis 真实运行数据:

AntecedentsConsequentsSupportConfidenceLift
Keyboard, Laptop Bag, USB-C HubLaptop, Mouse0.0240.6845.095
Laptop, MouseKeyboard0.0360.582.41
Organic Milk, Greek YogurtBanana, Avocado0.0290.612.18

商业解读: Lift=5.095 意味着买 "Keyboard+Laptop Bag+USB-C Hub" 的客户比随机客户买 "Laptop+Mouse" 的概率高 5 倍。可以直接做成 "办公全套套餐"。

避坑 · 3 个常见错误
  1. min_support 设太低: 会产生几十万条规则。建议从 0.05 开始逐步降
  2. 只看 support: 会错过强规则。Lift > 1.5 + Confidence > 0.5 必须同时满足
  3. Apriori vs FP-Growth 选错: 数据 50万+ 一律用 FP-Growth,快 8x

3逻辑回归 · 信用评分 + 流失预测

核心问题 · "这个客户会不会违约/流失/购买?" · 有监督,可解释

3.1 业务场景速览

场景真实项目典型 AUC
信用评分 (A卡)ShichenXie/scorecardpy (★801)0.78-0.82
客户流失 (Telco)Pradnya1208/Telecom-Customer-Churn0.83-0.85
营销响应 (Uplift)maks-sh/scikit-uplift (★813)Qini 0.30
欺诈检测 baselinegeorgymh/ml-fraud-detectionAUPRC 0.72
工业级 Pipelineitlubber/scorecardpipeline (PMML 导出)同上

为什么金融场景仍是 LR 黄金标准: 可解释 (p-value/系数) + 合规 (Basel 银监) + 可转 PMML 上线。2024-2025 在 A 卡/B 卡/C 卡仍占 70%+ 生产模型。

3.2 LR vs 树模型 · 怎么选

维度逻辑回归XGBoost
可解释性⭐⭐⭐⭐⭐ 极强⭐⭐⭐⭐ + SHAP
AUC 上限0.78-0.850.85-0.92
合规友好⭐⭐⭐⭐⭐⭐⭐⭐
特征工程要求高 (WOE 分箱)低 (自动)
训练速度极快
非线性能弱 (需交叉特征)

经验法则: 监管严格场景 (信贷/医保) → LR;追求精度上限 (反欺诈/流失) → XGBoost;折中 → XGBoost + SHAP 解释。

3.3 实战代码 · UCI German Credit + Telco Churn

数据集 1: UCI German Credit (1000 笔贷款申请,好坏客户 7:3)
数据集 2: IBM Telco Customer Churn (7043 客户,26.5% 流失率)

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
import scorecardpy as sc

# ========================================
# 场景 A: 信用评分 (WOE 分箱 + 评分卡)
# ========================================
# 1. 加载 + 切分
dat = sc.germancredit()
train, test = sc.split_df(dat, "creditability", ratio=0.7, seed=42).values()

# 2. IV 筛选 + WOE 分箱 (金融场景标配)
dt_s = sc.var_filter(dat, y="creditability")
bins = sc.woebin(dt_s, y="creditability")
train_woe = sc.woebin_ply(train, bins)
test_woe = sc.woebin_ply(test, bins)

# 3. L1 正则化 LR (防止过拟合 + 自动特征选择)
lr = LogisticRegression(penalty="l1", C=0.5, solver="saga", n_jobs=-1, max_iter=1000)
lr.fit(train_woe.drop("creditability", axis=1), train_woe["creditability"])

# 4. 评估: AUC + KS (银行标准 KS > 0.3 才上线)
y_prob = lr.predict_proba(test_woe.iloc[:, 1:])[:, 1]
auc = roc_auc_score(test_woe["creditability"], y_prob)
fpr, tpr, _ = roc_curve(test_woe["creditability"], y_prob)
ks = max(tpr - fpr)
print(f"AUC: {auc:.3f} | KS: {ks:.3f}")
# 典型输出: AUC 0.78-0.82 | KS 0.40-0.45

# 5. 评分卡导出 (给业务方看)
card = sc.scorecard(bins, lr, train_woe.columns[1:])
score = sc.scorecard_ply(test, card)
print(score.head())

# ========================================
# 场景 B: 流失预测 (LR 不分箱,直接跑)
# ========================================
from sklearn.preprocessing import StandardScaler
telco = pd.read_csv("telco_churn.csv")
telco["Churn"] = (telco["Churn"] == "Yes").astype(int)

# 类别变量 one-hot
telco_encoded = pd.get_dummies(telco.drop("customerID", axis=1), drop_first=True)
X_train, X_test, y_train, y_test = train_test_split(
    telco_encoded.drop("Churn", axis=1), telco_encoded["Churn"],
    test_size=0.3, random_state=42, stratify=telco_encoded["Churn"]
)

# 标准化
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# 不平衡处理 (Telco 流失率 26.5%, 不算极端)
lr2 = LogisticRegression(class_weight="balanced", max_iter=1000, C=0.5)
lr2.fit(X_train_s, y_train)
y_prob2 = lr2.predict_proba(X_test_s)[:, 1]
print(f"Telco AUC: {roc_auc_score(y_test, y_prob2):.3f}")
# 典型: 0.83-0.85

3.4 Uplift 建模 · 营销响应专用

普通响应模型: "谁会转化?" — 但营销只对"被营销打动"的人有效。Uplift 模型回答: "谁会被营销打动?"

from sklift.models import TwoModels
from sklearn.linear_model import LogisticRegression

# 双模型: 一个预测 treatment,一个预测 control
estimator = TwoModels(
    estimator_trmnt=LogisticRegression(C=0.5, class_weight="balanced"),
    estimator_ctrl=LogisticRegression(C=0.5, class_weight="balanced"),
    method="vanilla"
)
estimator.fit(X_train, y_train, treat_train)

# 预测增量: P(转化|营销) - P(转化|不营销)
uplift = estimator.predict(X_test)

# 排序后 Top 20% 通常能捕获 60-80% 增量转化
top20_idx = np.argsort(uplift)[-int(0.2 * len(uplift)):]
print(f"Top 20% 客户数: {len(top20_idx)} | 平均 uplift: {uplift[top20_idx].mean():.3f}")
为什么 Uplift 比普通响应模型好: 普通模型会把"铁定会买"的人也营销,但这些人不需要营销;Uplift 找出"被打动"的人 (persuadables),营销 ROI 通常提升 1.5-3x。LightGBM S-Learner 在 Criteo Uplift Benchmark (1398 万条) 上 Top 20% 捕获 77.7% 增量转化。

3.5 真实准确率对比 (同数据集)

模型German Credit AUCTelco Churn AUC信贷合规
LR (L1 + WOE)0.78-0.820.83-0.85⭐⭐⭐⭐⭐
Random Forest0.80-0.850.84-0.87⭐⭐⭐
XGBoost0.85-0.900.86-0.92⭐⭐
LightGBM0.85-0.920.87-0.92⭐⭐

4决策树 / Boosting · 风控 + 精准营销

核心问题 · "什么规则决定结果?" · 有监督,冲精度上限

4.1 三大 Boosting 算法对比

算法速度类别特征推荐场景
XGBoost⚡⚡⚡需编码通用首选 · 欺诈/流失/营销
LightGBM⚡⚡⚡⚡需编码大数据量 / 工业首选
CatBoost⚡⚡原生支持类别特征多 (用户画像)

GitHub 标杆: catboost/catboost (★8k+ 业内标杆库),2026 仍在 commit。

4.2 实战代码 · Kaggle Credit Card Fraud

数据集: 284,807 笔交易,492 笔欺诈 (1:578 极端不平衡)。核心洞察: 欺诈场景不要看 accuracy (99.9% 是假象,全部预测 "正常" 就有 99.83%),要看 AUPRC + Recall。

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import average_precision_score, roc_auc_score
from xgboost import XGBClassifier
import shap

# 1. 加载 + 切分
df = pd.read_csv("creditcard.csv")
X = df.drop(["Class", "Time"], axis=1)
y = df["Class"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 2. scale_pos_weight 处理极端不平衡
ratio = (y_train == 0).sum() / (y_train == 1).sum()
print(f"不平衡比: 1:{ratio:.0f}")

# 3. XGBoost (欺诈检测 AUC-ROC 第一)
xgb = XGBClassifier(
    n_estimators=300, max_depth=6, learning_rate=0.05,
    scale_pos_weight=ratio,  # 类别权重 = 反欺诈关键
    eval_metric="aucpr",     # 用 PR-AUC,不是 ROC-AUC
    early_stopping_rounds=20,
    use_label_encoder=False, random_state=42
)
xgb.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=100)

# 4. 评估 (不要看 accuracy!)
y_prob = xgb.predict_proba(X_test)[:, 1]
ap = average_precision_score(y_test, y_prob)  # PR-AUC
print(f"XGBoost AUPRC: {ap:.3f}")  # 典型: 0.83

# 5. SHAP 可解释 (商业落地必备!)
explainer = shap.TreeExplainer(xgb)
shap_values = explainer.shap_values(X_test.iloc[:1000])
shap.summary_plot(shap_values, X_test.iloc[:1000])  # 全局特征重要性
# 典型 Top 3: V14, V17, V12 (PCA 变换特征)

4.3 真实准确率对比 (信用卡欺诈)

摘自 itsaryanchauhan/credit-card-fraud-detection 真实实验:

模型ROC-AUC排名
XGBoost0.9771🥇 第一
LightGBM (CV)0.9584🥈 生产级
LightGBM0.9499🥉
Random Forest0.8529第四
CatBoost0.8578第五
AdaBoost0.8135第六

PMC 论文 (2025) 中 CatBoost 在另一组实验 AUPRC=0.9820,XGBoost=0.9783,两者非常接近。结论: 树模型在欺诈检测上远胜 LR (AUPRC 0.72),因为 LR 抓不住非线性特征组合。

4.4 SHAP 解释 · 商业落地核心

树模型 + SHAP 是 2024-2026 商业分析的事实标准。摘自 SamamaKarim092/End-to-End-Explainable-AI 项目:

import shap

# 全局特征重要性
explainer = shap.TreeExplainer(xgb)
shap_values = explainer.shap_values(X_test)

# 1. 蜂群图 - 看整体特征影响
shap.summary_plot(shap_values, X_test, plot_type="dot")

# 2. 条形图 - 看平均重要性
shap.summary_plot(shap_values, X_test, plot_type="bar")

# 3. 单客户解释 - 业务方必看
shap.waterfall_plot(shap.TreeExplainer(xgb).expected_value,
                    shap_values[0], X_test.iloc[0])

# 4. 依赖图 - 看特征交互
shap.dependence_plot("V14", shap_values, X_test)
商业落地关键: SHAP 不只是技术工具,是业务方接受模型的桥梁。SamamaKarim092 案例中,基于 SHAP 命中 "月付合同" 的客户推荐年付 + 15% 折扣,预估净节省 $132,000 (CLV=$450/人,营销成本=$50/人)。

4.5 Optuna 调优 · 实战必备

import optuna
from sklearn.model_selection import cross_val_score

def objective(trial):
    params = {
        "n_estimators": trial.suggest_int("n_estimators", 100, 1000),
        "max_depth": trial.suggest_int("max_depth", 4, 10),
        "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3, log=True),
        "subsample": trial.suggest_float("subsample", 0.6, 1.0),
        "colsample_bytree": trial.suggest_float("colsample_bytree", 0.6, 1.0),
        "scale_pos_weight": ratio,
    }
    model = XGBClassifier(**params, eval_metric="aucpr", random_state=42)
    return cross_val_score(model, X_train, y_train, cv=5, scoring="average_precision").mean()

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50, show_progress_bar=True)
print(f"Best AUPRC: {study.best_value:.3f}")
# 典型提升: 0.83 → 0.86 (调参后 +3-5%)

5商业问题 → 算法决策树

一图速查 · 业务问题对应算法推荐

5.1 速查表 (按业务问题)

业务问题第一选择第二选择不推荐
客户自然分几群HDBSCANK-Means + UMAPLR
异常客户 / 风控HDBSCAN (-1 噪声)IsolationForestK-Means
捆绑销售 / 购物篮FP-GrowthApriori任何监督模型
交叉推荐FP-Growth协同过滤LR
信用评分LR + WOEXGBoost + SHAPK-Means
客户流失XGBoost + SHAPLR聚类
欺诈检测XGBoost + scale_pos_weightCatBoostLR (AUPRC 低)
营销响应增量LightGBM S-Learnercausallift 双 LR普通分类
RFM + CLVRFM + K-Means + BG/NBDXGBoost CLVLR
销量预测LightGBMXGBoostLR / 聚类

5.2 决策流程图

Step 1 · 有没有标签数据?

Step 2 · 合规要求严不严?

Step 3 · 追求 AUC 还是可解释?

Step 4 · 数据量级?

Step 5 · 类别特征多吗?

5.3 一句话总结

聚类找群体、关联找组合、LR 给可解释、树模型冲精度。商业分析 80% 项目是 "树模型 + SHAP" 组合拳;如果合规要求严,退回 "LR + WOE"。无监督的聚类和关联解决 20% 的探索性场景。

A附录 · 数据集 + Checklist

A.1 真实数据集下载

数据集规模适用算法来源
UCI Online Retail II1M 笔 / 541K 客户聚类 (RFM + HDBSCAN)archive.ics.uci.edu/ml
Instacart Market Basket200万订单 / 134 商品关联 (FP-Growth)kaggle.com/c/instacart-market-basket-analysis
UCI German Credit1000 笔贷款LR (WOE 评分卡)archive.ics.uci.edu/ml
IBM Telco Customer Churn7043 客户LR + XGBoost (流失)kaggle.com/blastchar/telco-customer-churn
Kaggle Credit Card Fraud284,807 交易 (1:578 不平衡)XGBoost + SHAPkaggle.com/mlg-ulb/creditcardfraud
Criteo Uplift v2.11398 万条 / 3GBUplift (LightGBM S-Learner)ailab.criteo.com/criteo-uplift-prediction-dataset

A.2 上线 Checklist (4 个算法通用)

✅ 数据准备阶段

✅ 模型训练阶段

✅ 模型上线阶段

✅ 模型监控阶段

A.3 4 个算法的真实 GitHub 项目清单

算法项目Star用途
聚类MaartenGr/BERTopic⭐7.8kNLP 主题聚类一站式
聚类scikit-learn-contrib/hdbscan⭐3.1k变密度聚类 (风控首选)
聚类facebookresearch/faiss⭐40k工业级向量聚类
聚类rapidsai/cuml⭐5.3kGPU 加速 / 亿级数据
关联rasbt/mlxtend⭐5.1kFP-Growth 工业事实标准
关联asaini/Apriori⭐785论文级 + Streamlit
关联DiTEC-project/pyaerial⭐36 (2025)大规模场景新方案
LRmaks-sh/scikit-uplift⭐813Uplift 营销响应
LRShichenXie/scorecardpy⭐801银行 A 卡评分
LRamphibian-dev/toad⭐528工业级中文风控
LRguillermo-navas-palencia/optbinning⭐531最优约束分箱
树模型catboost/catboost⭐8k+类别特征首选
树模型Fraud-Detection-Handbook⭐723反欺诈教科书
树模型ahmedshahriar/Customer-Churn-Prediction⭐100+Stacking 集成 + Optuna

A.4 推荐阅读路线


最后一句: 算法只是工具,业务理解才是壁垒。这 4 个算法覆盖了商业分析 80% 的场景,剩下的 20% 用深度学习 / 图算法 / 强化学习处理。先跑起来,再迭代,不要追求 "完美方案"。

完 · 2026-08-24 · Chase's Personal Page