vickkycodes/E-Commerce-Customer-Segmentation-Decision-Engine
GitHub: vickkycodes/E-Commerce-Customer-Segmentation-Decision-Engine
基于BigQuery和Python构建的电商客户细分与决策引擎,从原始交易数据出发,通过无监督聚类、异常检测和规则决策层,输出可直接用于营销激活的客户情报表。
Stars: 0 | Forks: 0
# 电商客户细分与决策引擎
**基于 Google BigQuery 和 Python 端到端构建的无监督细分、异常检测以及基于规则的决策层 —— 从原始交易数据到回写到 BigQuery 中可直接用于营销激活的表。**
## 概述
本项目将原始的订单级电商数据转化为营销或 CRM 团队可以直接使用的客户情报表。它从 BigQuery 中提取约 10,000 名客户的完整购买记录,在 SQL 和 Python 中构建行为特征(类似 RFM 模型),使用 K-Means 对客户进行聚类,利用 Isolation Forest 标记异常账户,最后在其上叠加一个透明、基于规则的决策引擎,为每位客户分配**业务细分群**、**推荐操作**、**触达渠道**以及**优惠价值**。最终生成的表会被加载回 BigQuery 供下游使用。
该项目的目标是实践完整的闭环流程 —— 提取 → 清洗 → 特征工程 → 建模 → 业务转译 → 激活 —— 而不是仅仅停留在“这里得出了一些聚类”的阶段。
## 业务问题
“一刀切”的通用营销不仅会在那些不会做出响应的客户身上浪费资金,还会忽略了那些本会有响应的客户。此处的目标是转变“给所有人发送相同的邮件”的做法,为以下两个问题提供有理有据、数据驱动的答案:
1. 哪些客户的差异已经大到需要采取不同的营销策略?
2. 针对每个群体,具体的下一步行动是什么 —— 并且我们能否用数据证明其合理性?
## 数据源
- **`bigquery-public-data.thelook_ecommerce`** —— 一个公开的 BigQuery 示例数据集(包含 `users`、`orders`、`order_items`、`products`)
- 从订单明细级别聚合至**每位客户一行**,按总收入排名,共抽样 10,000 名客户
- 这是一个公开/合成数据集,非专有数据 —— 在此予以说明是为了保持透明,因为这会影响对绝对数值与方法论可信度的权衡判断
## Pipeline
```
flowchart LR
A[BigQuery: users / orders / order_items / products] --> B[SQL: customer-level aggregation + LAG window fn for order intervals]
B --> C[Pandas: cleaning + ratio stabilization]
C --> D[Feature engineering: log transforms + scaling]
D --> E[K-Means clustering]
D --> F[Isolation Forest anomaly detection]
E --> G[Business segment rules]
F --> G
G --> H[Decision engine: action / channel / offer]
H --> I[customer_decisions.csv + anomaly_customers.csv]
H --> J[BigQuery: Analytics.Customer_Segmentation_Intelligence]
```
### 1. 数据提取 (SQL, BigQuery)
- 串联 `users` → `orders` → `order_items` → `products`
- 对每位客户的订单记录使用 `LAG()` 计算购买时间间隔
- 聚合至客户级别:总订单数、总收入、AOV、取消率、订单密度、最近购买时间、最喜欢的类别/部门/品牌
- 在 SQL 中直接计算基础的近期/频次标签(`Active`/`Warm`/`Cooling`/`Dormant`,`One-time`/`Occasional`/`Frequent`),作为任何建模前的一道合理性校验层
### 2. 数据清洗
- 移除没有订单或总收入为零或负数的客户
- 排除账户生命周期不足 7 天的客户 —— 因为时间太短,导致基于比率的指标失去实际意义
- 在计算比率特征前,将生命周期下限截断至 30 天,以防止极其年轻的新账户产生爆炸性的异常比率
### 3. 特征工程
- 7 个基础行为特征(收入、订单数、AOV、最近购买时间、购买节奏、月订单率、收入/天)
- 对收入、AOV 和订单数进行对数转换以减少右偏度 → 总共 10 个特征
- 通过 `sklearn` 的 `Pipeline` 进行中位数插补和标准化
### 4. 聚类 (K-Means)
将 *k* 值从 2 遍历至 8,并根据轮廓系数进行选择:
| k | Silhouette |
|---|---|
| 2 | 0.301 |
| 3 | 0.317 |
| **4** | **0.344** ← 选中 |
| 5 | 0.311 |
| 6 | 0.300 |
| 7 | 0.305 |
| 8 | 0.279 |
*k = 4* 是最合适的拟合,尽管 0.34 左右的轮廓系数表明聚类分离度只是中等水平,并不极其清晰 —— 这一点值得坦诚说明(参见“局限性”)。
### 5. 异常检测
独立于聚类分配,标记出最异常的约 3% 的客户(`contamination=0.03`)—— 这些客户会被单独提取出来并单独处理,而不是强行归入某个细分群。
### 6. 业务细分标签(规则层)
在模型输出之上叠加了第二层人类可读的标签,这也是真正驱动决策的依据:`Anomaly`、`Dormant`、`High Value – At Risk`、`Frequent Low Spenders`、`Active Core`、`Regular`。将这些保留为显式规则(而不是仅仅暴露原始的 cluster ID),使得细分结果能够向非技术的利益相关者解释清楚。
### 7. 决策引擎
每个业务细分群都映射到一个具体的下一步行动:
| 业务细分群 | 操作 | 渠道 | 优惠 |
|---|---|---|---|
| Anomaly | 无操作(人工审查) | — | — |
| Dormant(不活跃超过 365 天) |挽回折扣 | Email | 25% |
| High Value – At Risk | VIP 挽留优惠 | Email | 20% |
| Frequent Low Spenders | 捆绑销售优惠 | Push | 10% |
| Active Core | 交叉销售 | Email | 5% |
| Regular | 无操作 | — | — |
### 8. 输出
- `customer_decisions.csv` —— 包含细分群、操作、渠道、优惠的完整数据表
- `anomaly_customers.csv` —— 被隔离出来的异常值
- 最终的表通过 `load_table_from_dataframe` 加载到 BigQuery 中的 **`Analytics.Customer_Segmentation_Intelligence`**,可供 CRM 或邮件工具直接调用
## 关键发现 —— 四大聚类群
| 细分群 | 总收入(均值) | 订单数(均值) | AOV(均值) | 距上次购买天数(均值) | 客户生命周期(均值,天) | 月订单率 | 被标记为异常的比例 |
|---|---|---|---|---|---|---|---|
| 0 | $362.74 | 2.03 | $179.27 | 502.6 | 554.2 | 0.25 | 0% |
| 1 | $766.12 | 2.96 | $279.07 | 392.3 | 711.6 | 0.26 | 18% |
| 2 | $393.70 | 3.64 | $109.16 | 310.4 | 800.9 | 0.26 | 0% |
| 3 | $423.51 | 2.67 | $170.02 | 188.8 | 32.1 | 2.21 | 12% |
解读每个细分群的特征(这是解释性分析,而非绝对事实 —— 参见“局限性”):
- **细分群 0 —— 流失/休眠客户。** 总收入最低,距上次购买的时间最长,且订单间的*平均*间隔也最长。这些客户很久以前就不再活跃了,即使在他们活跃期间,参与度也不高。
- **细分群 1 —— 高价值且正在冷却的客户。** 总收入和 AOV 都以显著优势位列第一,但平均而言,距离上次购买已超过一年。对于这个群体,挽留优惠能带来最高的客单价收益($$)—— 此外,模型标记出的大部分异常值也集中在该群体,这很合理:高消费行为本身就会产生更多的离群点。
- **细分群 2 —— 高频、低客单价客户。** 平均订单数最多,但 AOV 最低且生命周期最长。忠诚度高,但单笔交易金额较小 —— 这类客户非常适合采用捆绑销售而非直接打折的策略。
- **细分群 3 —— 新客户与爆发型客户。** 账户生命周期极短(约 32 天),但订单密度和月订单率远超其他群体 —— 这些客户在注册后的极短时间窗口内产生了密集的交易。考虑到这些账户如此年轻,其 `days_since_last_order`(188.8 天)已经开始悄然上升,因此这种高强度的消费是会持续下去,还是仅仅是一次短暂的爆发,非常值得观察。
## 技术栈
- **数据仓库:** Google BigQuery (`bigquery-public-data.thelook_ecommerce`)
- **编程语言:** Python (pandas, numpy)
- **机器学习:** scikit-learn (`KMeans`, `IsolationForest`, `Pipeline`, `StandardScaler`, `SimpleImputer`), scipy.stats
- **数据可视化:** matplotlib
- **基础设施:** `google-cloud-bigquery`, 使用 `python-dotenv` 管理凭证
## 如何运行
1. 设置一个具有 BigQuery 读取权限的 GCP 服务账号,并配置一个 `.env` 文件(或环境变量)指向您的凭证和 `GOOGLE_APPLICATION_CREDENTIALS`
2. `pip install -r requirements.txt`
3. 从上到下运行该 notebook —— 它会从公共数据集中提取最新数据,因此由于抽样或 `LIMIT` 排序方式的不同,每次运行的结果会略有不同(尽管底层表并未发生变化)
4. 在写入输出之前,将最后一个代码块中的 `table_id` 修改为您自己拥有的 BigQuery 数据集
## 局限性与未来工作
- **聚类分离度属于中等水平,并非极其清晰。** ~0.34 的轮廓系数意味着这四个聚类是对数据的一个合理概括,但存在明显的重叠 —— 这是探索性细分,并不能保证这些就是“真正”的潜在客户类型。值得测试 GMM 或 HDBSCAN 作为对比。
- **3% 的异常污染率是一个假设**,并没有根据任何打了标签的欺诈/异常真实情况进行过验证。应将异常列表视为“值得人工审查”的参考,而不是“已确认的问题账户”。
- **业务细分的阈值是基于经验设定的**(例如,200 美元的 AOV 分界线,365 天的休眠界定线)。自然的下一步是进行回溯测试:那些实际收到了挽留邮件的客户,其流失后的回归率是否真的高于对照组?
标签:Apex, BigQuery, Python, 代码示例, 决策引擎, 客户分群, 数据分析, 无后门, 机器学习, 电商, 逆向工具