# PRD：SPI 消费力指数（Spending Power Index）建设方案（MD）

* **文档版本**：v1.0
* **状态**：定稿（可进入研发设计/排期）
* **适用范围**：门店客户运营（新客转化、老客召回、增值推荐、资源分配）
* **相关指数体系**：`NCI`、`WBI`、`RS`、`OS`、`MS`、`ML`（SPI 为新增客户级指数）

---

## 1. 背景与目标

### 1.1 背景

当前体系中：

* `NCI` 用于新客欢迎与转化优先级
* `WBI` 用于老客召回优先级
* `RS/OS/MS/ML` 用于关系强度、归属、动量、付费关联（助教-客户关系对粒度）

但尚缺少一个**客户级的“消费能力/消费层级”指数**，导致以下问题：

* 高价值客户与普通客户在运营动作上难以区分投入强度
* 增值服务推荐缺少“消费能力层级”依据
* 资源分配容易只看“紧急程度”，忽略“投入产出比（ROI）”

### 1.2 目标

新增 **SPI（Spending Power Index，消费力指数）**，评估客户在门店场景内的“消费力代理值”，重点基于：

* **消费水平（Level）**
* **消费速度（Speed）**
* **消费稳定性（Stability，可选修正项）**

> 说明：稳定性窗口**最长只使用 90 天**，不使用 180 天（按本次需求明确要求）。

### 1.3 非目标

* 不评估金融/征信意义上的“信用能力”
* 不直接替代 NCI/WBI（紧迫度）
* 不直接替代 RS/OS/MS/ML（关系归属与执行人选择）

---

## 2. 设计原则与方法依据

1. **行为数据驱动**：使用消费/充值明细作为消费力代理信号（门店经营场景可解释、可落地）。
2. **稳健统计**：金额类数据长尾明显，展示分采用分位截断（Winsorize）降低极端值影响。Winsorization 本质是用指定分位数限制极端值影响，适合交易金额数据。
3. **时间敏感**：近期行为更有参考价值，采用指数衰减与 EWMA 平滑（近期更高权重）来处理速度与展示分稳定性。指数衰减与半衰期是标准时间权重形式，EWMA 则是常见的时间序列平滑方法。
4. **与现有体系兼容**：沿用现有 `BaseIndexTask` 的映射逻辑（P5/P95 → 压缩 → MinMax 0–10 → 可选 EWMA）。
5. **运营闭环导向**：SPI 不是单独使用，需与 NCI/WBI/RS/OS/MS/ML 组合使用。

> 补充说明：RFM（Recency/Frequency/Monetary）是成熟的客户价值/客户分层框架，SPI 在其基础上强化“消费速度”与门店场景的可执行性。

---

## 3. 指数定义

## 3.1 指数名称

* 中文：**消费力指数**
* 英文：**Spending Power Index**
* 缩写：**SPI**

## 3.2 粒度

* **客户级（member）**
* 主键建议：`(site_id, member_id)`

## 3.3 业务含义

SPI 用于衡量客户在门店体系内的综合消费力层级，回答：

* 这个客户整体消费能力在门店内属于什么层级？
* 近期消费推进速度是否明显变快？
* 是稳定高消费，还是偶发冲高？

---

## 4. 数据来源与口径

## 4.1 数据来源（建议）

### A. 消费订单明细（核心）

* 来源：结算/订单主表及明细表（按现有 DWD 口径）
* 字段（至少）：

  * `site_id`
  * `member_id`
  * `pay_time`
  * `pay_amount`（实付）
  * `settle_type`（必要时过滤）
  * 明细项分类（台费、商品、服务等）

### B. 充值订单明细（辅助）

* 来源：`dwd_recharge_order`
* 字段（至少）：

  * `site_id`
  * `member_id`
  * `pay_time`
  * `pay_amount`
  * `settle_type = 5`

### C. 可选增强

* 储值卡余额（用于解释）

---

## 4.2 时间窗口（定稿）

> **稳定性最长只用 90 天。**

* **短窗口**：30 天（近期消费速度）
* **中窗口**：90 天（消费层级、速度基线、稳定性）

---

## 4.3 统计口径（建议）

* 消费金额：使用 `pay_amount`（实付）
* 按天去重的消费日：用于计算消费日密度
* 若同一天多笔消费：计入总额，消费日数仅计 1 天
* 充值金额：使用充值订单 `pay_amount`
* 金额单位：与现有系统保持一致（元）

---

## 5. SPI 算法设计（v1）

> v1 采用“主分 + 子分”的结构，保证解释性：

* `Level`（消费水平）
* `Speed`（消费速度）
* `Stability`（消费稳定性，作为修正项；最长 90 天）
* `SPI = f(Level, Speed, Stability)`

---

## 5.1 基础特征定义（客户级）

设：

* `spend_30`：近30天消费总额
* `spend_90`：近90天消费总额
* `recharge_90`：近90天充值总额
* `orders_30 / orders_90`：近30/90天消费笔数
* `visit_days_30 / visit_days_90`：近30/90天有消费的营业日数（按营业日去重，营业日以 08:00 为分割点）
* `avg_ticket_90 = spend_90 / max(orders_90, 1)`：90天客单
* `weekly_spend_90`：近90天按周汇总消费额序列（约13周）
* `daily_spend_series_90`：近90天按日消费额序列（用于 EWMA）

---

## 5.2 子分一：消费水平（Level）

### 目的

衡量客户的消费金额层级与客单水平，兼顾充值规模（预算能力代理信号）。

### 建议公式

[
L = w_{s30}\cdot \ln(1+\frac{spend_{30}}{M30})

* w_{s90}\cdot \ln(1+\frac{spend_{90}}{M90})
* w_{ticket}\cdot \ln(1+\frac{avg_ticket_{90}}{T0})
* w_{r90}\cdot \ln(1+\frac{recharge_{90}}{R90})
  ]

### 说明

* 使用 `log1p` 压缩长尾，避免大额客户过度支配排序
* 30天与90天并用：兼顾近期层级与稳定层级
* 充值是辅助信号，不应压过真实消费金额

---

## 5.3 子分二：消费速度（Speed）

### 目的

衡量“近期消费推进快不快”，体现消费节奏变化。

### A. 绝对速度（近期强度）

[
V_{abs} = \ln \left(1+\frac{spend_{30}}{\max(visit_days_{30},1)\cdot V0}\right)
]

含义：近30天“每个消费日平均消费强度”。

### B. 相对速度（近期 vs 基线）

[
v_{30}=\frac{spend_{30}}{30}, \quad v_{90}=\frac{spend_{90}}{90}
]
[
V_{rel} = \ln\left(\frac{v_{30}+\epsilon}{v_{90}+\epsilon}\right)
]

* `V_rel > 0`：近期消费速度快于90天基线（加速）
* `V_rel < 0`：近期消费速度低于基线（放缓）

### C. 平滑速度（EWMA，可选）

对 `daily_spend_series_90` 做 EWMA，得到 `daily_spend_ewma_90`：
[
V_{ewma}=\ln(1+\frac{daily_spend_ewma_{90}}{E0})
]

### Speed 子分（建议）

[
S = w_{abs}\cdot V_{abs} + w_{rel}\cdot max(0, V_{rel}) + w_{ewma}\cdot V_{ewma}
]

> v1 建议仅对“加速”加分（`max(0,V_rel)`），不对“减速”直接扣分；减速信号已在 WBI 中承担召回压力逻辑。

---

## 5.4 子分三：消费稳定性（Stability，最长 90 天）

### 目的

识别“稳定高消费”与“偶发冲高”，防止单笔大单导致 SPI 虚高。

### 窗口要求（定稿）

**只使用近90天**

### 建议特征（v1 可二选一或组合）

[
Stab_{cover} = \frac{#(\text{近90天有消费的周数})}{13}
]

### Stability 子分（v1 推荐）

[
P = Stab_{cover}
]
（v1 先采用覆盖率，简单、稳健、工程成本低）

---

## 5.5 SPI 总分（Raw）

### 建议结构（v1）

[
SPI_{raw} = w_L \cdot L + w_S \cdot S + w_P \cdot P
]

### 建议默认权重（v1）

* `w_L = 0.60`
* `w_S = 0.30`
* `w_P = 0.10`

> 若你希望先简化上线，也可 v1.0 不启用稳定性（`w_P=0`），v1.1 再开启。
> 但本需求已明确“稳定性最长 90 天即可”，建议直接纳入 v1，权重先低配。

---

## 6. 展示分映射（Raw → Display 0–10）

SPI 与子分（Level/Speed/Stability）展示分均建议复用现有统一逻辑：

1. 收集全体 Raw 分数
2. 计算 `P5/P95`
3. Winsorize 截断到 `[P5, P95]`
4. 可选压缩（`none/log1p/asinh`）
5. MinMax 映射到 `[0,10]`
6. 可选 EWMA 平滑分位点
7. 展示分保留 2 位小数

> 该映射适合金额类/长尾分布指标，可降低极端值造成的排序失真。

---

## 7. 输出表设计（新增）

## 7.1 表名建议

`billiards_dws.dws_member_spending_power_index`

## 7.2 主键

* `(site_id, member_id)`

## 7.3 字段建议（v1）

### 基础特征（解释与排查）

* `spend_30`
* `spend_90`
* `recharge_90`
* `orders_30`
* `orders_90`
* `visit_days_30`
* `visit_days_90`
* `avg_ticket_90`
* `active_weeks_90`
* `daily_spend_ewma_90`（若启用）

### 子分

* `score_level_raw`
* `score_level_display`
* `score_speed_raw`
* `score_speed_display`
* `score_stability_raw`
* `score_stability_display`

### 总分

* `raw_score`（SPI_raw）
* `display_score`（SPI_display）

### 元数据

* `calc_time`
* `created_at`
* `updated_at`

---

## 8. 配置体系（cfg_index_parameters）新增项

## 8.1 index_type

新增：

* `SPI`

## 8.2 参数清单（建议默认值）

### 窗口与平滑

| 参数                        | 默认值 | 说明            |
| ------------------------- | --: | ------------- |
| `spend_window_short_days` |  30 | 短窗口（速度）       |
| `spend_window_long_days`  |  90 | 长窗口（层级/稳定性上限） |
| `ewma_alpha_daily_spend`  | 0.3 | 日消费 EWMA 平滑系数 |

### 金额压缩基数

| 参数                        |  默认值 | 说明         |
| ------------------------- | ---: | ---------- |
| `amount_base_spend_30`    |  按门店分布校准 | 30天消费压缩基数  |
| `amount_base_spend_90`    | 按门店分布校准 | 90天消费压缩基数  |
| `amount_base_ticket_90`   |  按门店分布校准 | 90天客单压缩基数  |
| `amount_base_recharge_90` | 按门店分布校准 | 90天充值压缩基数  |
| `amount_base_speed_abs`   |  按门店分布校准 | 绝对速度压缩基数   |
| `amount_base_ewma_90`     |  按门店分布校准 | EWMA速度压缩基数 |

### 权重（总分）

| 参数                 |  默认值 | 说明           |
| ------------------ | ---: | ------------ |
| `weight_level`     | 0.60 | Level 权重     |
| `weight_speed`     | 0.30 | Speed 权重     |
| `weight_stability` | 0.10 | Stability 权重 |

### 权重（Level 子分）

| 参数                    |  默认值 | 说明             |
| --------------------- | ---: | -------------- |
| `w_level_spend_30`    | 0.30 | Level 中 30天消费项 |
| `w_level_spend_90`    | 0.35 | Level 中 90天消费项 |
| `w_level_ticket_90`   | 0.20 | Level 中 90天客单项 |
| `w_level_recharge_90` | 0.15 | Level 中 90天充值项 |

### 权重（Speed 子分）

| 参数             |  默认值 | 说明        |
| -------------- | ---: | --------- |
| `w_speed_abs`  | 0.50 | 绝对速度项     |
| `w_speed_rel`  | 0.30 | 相对速度项（加速） |
| `w_speed_ewma` | 0.20 | EWMA速度项   |

### 稳定性参数（90天上限）

| 参数                      | 默认值 | 说明            |
| ----------------------- | --: | ------------- |
| `stability_window_days` |  90 | 稳定性窗口（固定上限90） |
| `use_stability`         |   1 | 是否启用稳定性子分     |
| `stability_mode`        |   1 | 1=周覆盖率（v1推荐）  |

### 映射与平滑（复用 BaseIndexTask）

| 参数                 | 默认值 | 说明                       |
| ------------------ | --: | ------------------------ |
| `percentile_lower` |   5 | 下分位                      |
| `percentile_upper` |  95 | 上分位                      |
| `compression_mode` |   1 | 0=none, 1=log1p, 2=asinh |
| `use_smoothing`    |   1 | 是否启用分位平滑                 |
| `ewma_alpha`       | 0.2 | 分位 EWMA 平滑系数             |

---

## 9. 任务与计算策略（建议）

## 9.1 任务形态

* 新增客户级任务：`SpendingPowerIndexTask`
* 粒度：`(site_id, member_id)`
* 建议频率：**每日**（与 NCI/WBI 接近，便于客户级看板统一刷新）

## 9.2 计算流程

1. 抽取消费订单明细（近90天）
2. 抽取充值订单明细（近90天）
3. 聚合客户级特征（30天/90天）
4. 计算 `Level/Speed/Stability` 子分 Raw
5. 计算 `SPI_raw`
6. 映射为展示分（0–10）
7. 写入 `dws_member_spending_power_index`（delete-before-insert 或 upsert）

---

## 10. SPI 参与的所有相关运营场景（完整清单）

> 原则：**SPI 不单独决定“要不要触达”，而是与 NCI/WBI（紧急度）+ RS/OS/MS/ML（执行关系）组合使用。**

---

## 10.1 新客运营（NCI 场景）

### 场景 A1：新客欢迎优先级（欢迎建联）

* **主用指数**：`NCI_welcome`
* **SPI 作用**：决定欢迎动作投入强度（轻触达/强服务）
* **策略**

  * `NCI_welcome 高 + SPI 高`：优先人工建联、安排更高质量接待与后续方案
  * `NCI_welcome 高 + SPI 中低`：标准欢迎流程，重点推动二访而非高价增值

### 场景 A2：新客二访转化

* **主用指数**：`NCI_convert`
* **SPI 作用**：判断适合推“基础二访”还是“升级体验包/储值方案”
* **配合指数**

  * `OS`：谁负责触达
  * `ML`：若涉及充值/储值，由谁推更容易成交

### 场景 A3：新客近期活跃（避免过度打扰）

* **主用指数**：`NCI`（内置活跃抑制）
* **SPI 作用**：不用于提高打扰频率，而用于现场服务策略分层
* **运营建议**

  * 高 SPI 新客：现场体验升级、服务深度设计
  * 低 SPI 新客：降低销售压力，先建立习惯

---

## 10.2 老客召回（WBI 场景）

### 场景 B1：老客召回名单排序

* **主用指数**：`WBI`
* **SPI 作用**：决定召回资源优先级（投入强度/人工优先）
* **策略**

  * `WBI 高 + SPI 高`：优先人工召回、重点维护
  * `WBI 高 + SPI 中低`：先低成本触达（消息/轻优惠）

### 场景 B2：充值未回访专项召回

* **主用指数**：`WBI`（充值未回访压力）
* **SPI 作用**：判断值得投入多大召回成本
* **配合指数**

  * `ML`：选执行人（谁推更容易成）
  * `OS`：定责（避免撞单）

### 场景 B3：高消费力沉默客户（价值保全）

* **触发逻辑**：`SPI 高` 且 `WBI` 进入召回区间
* **运营重点**：不是纯促销，而是“关系修复/体验恢复/高价值保留”

---

## 10.3 活跃客户跟进与升温承接（MS 场景）

### 场景 C1：近期消费/来店升温客户承接

* **主用指数**：`MS`（关系动量）
* **SPI 作用**：判断承接动作的强度与档位
* **配合指数**

  * `OS`：由谁跟进
  * `RS`：关系强弱决定话术深浅
  * `ML`：如涉及储值推荐，决定由谁推

### 场景 C2：关系强但消费层级下滑（潜在降档预警）

* **组合信号**：`RS 高` + `SPI_speed 下降`（或 SPI 总分下滑）
* **运营动作**：先做需求确认/体验诊断，再决定促销或产品调整

---

## 10.4 增值服务与储值推荐（ML + SPI 场景）

### 场景 D1：筛选“值得重点推增值”的客户

* **主用指数**：`SPI`
* **配合指数**：`MS`（时机）、`RS`（关系）、`WBI/NCI`（是否当前应触达）
* **策略**

  * `SPI 高 + MS 高`：优先推增值（最佳时机）
  * `SPI 高 + WBI 高`：先召回再推，不要直接硬销
  * `SPI 低 + RS 高`：可做低门槛增值尝试，不推高价方案

### 场景 D2：确定“由谁来推更可能成功”

* **主用指数**：`ML`
* **SPI 作用**：决定是否值得高成本人力投入
* **配合指数**

  * `OS`：责任边界
  * `RS`：关系基础
  * `MS`：时机窗口

---

## 10.5 客户分层与运营资源配置（门店/店长视角）

### 场景 E1：客户池分层（高/中/低消费力）

* **主用指数**：`SPI_display`
* **作用**：作为全店客户分层基础维度（可与活跃度、风险度交叉）
* **建议分层**

  * 高消费力（Top 10–20%）
  * 中消费力
  * 低消费力

### 场景 E2：人力资源分配（助教时间预算）

* **组合指数**

  * 客户优先级：`NCI/WBI`
  * 客户消费力：`SPI`
  * 执行人选择：`OS/ML`
* **规则示例**

  * 高 NCI/WBI + 高 SPI：优先人工跟进
  * 高 NCI/WBI + 低 SPI：半自动/标准化触达
  * 低 NCI/WBI + 高 SPI：低频但重点维系

### 场景 E3：活动名单筛选

* **SPI 作用**：筛选活动档位与名单
* **示例**

  * 高 SPI 客户：高阶体验/高客单活动
  * 中低 SPI 客户：入门体验/拉频次活动

---

## 10.6 管理与复盘（分析场景）

### 场景 F1：增值策略复盘

* **组合指标**：`SPI`（客户层级） + `ML`（执行人付费关联）
* **看什么**

  * 高 SPI 客户是否被正确触达
  * 高 SPI 客户的增值转化是否集中在正确助教（ML 高者）

### 场景 F2：客户结构变化监控

* **主用指数**：`SPI`
* **看什么**

  * 高 SPI 客户数量变化
  * 各层级客户占比变化
  * 高 SPI 客户的活跃/沉默迁移（结合 WBI）

### 场景 F3：门店经营质量诊断（非直接派单）

* **组合信号**

  * `SPI 高` 客户群体的 `WBI` 是否整体抬升（高价值流失预警）
  * `SPI 高` 客户群体的 `MS` 是否持续走低（热度下降）

---

## 11. 运营使用规则（落地建议）

## 11.1 统一原则

* **NCI/WBI 决定“要不要优先触达”**
* **SPI 决定“投入多大资源、用什么档位策略”**
* **OS/RS/MS/ML 决定“谁来做、什么时候做、谁更容易做成”**

## 11.2 一个实用的组合模板

### 新客转化

* 选人群：`NCI_convert 高`
* 分档：`SPI 高/中/低`
* 落人：`OS`（若已有关系）否则新客官
* 增值时机：`MS 高` 再推，执行人选 `ML 高`

### 老客召回

* 选人群：`WBI 高`
* 分档：`SPI 高` 优先人工，`SPI 低` 低成本触达
* 落人：`OS=MAIN`，若无归属则公海召回组
* 若涉及储值：执行人优先 `ML 高`

---

## 12. 验收标准（数据与业务）

## 12.1 数据正确性

* `SPI_raw` 在新增消费/充值后总体应单调不减（同等其他条件下）
* `score_speed_raw` 在近30天消费速度高于近90天基线时应提升
* `score_stability_raw` 仅使用近90天数据（不引用 180 天）
* 展示分稳定：在总体分布无大变化时，`display_score` 不应异常跳变（启用 EWMA）

## 12.2 业务可用性

* 运营可基于 SPI 完成客户分层（高/中/低）
* 运营可在 NCI/WBI 队列中使用 SPI 做资源投入分层
* 增值推荐场景可用 SPI + ML + OS 形成可执行规则

---

## 13. 风险与控制

1. **异常大单抬高 SPI**

   * 控制：Winsorize + 压缩变换 + 稳定性子分（90天覆盖率）

2. **充值替代真实消费导致高估**

   * 控制：充值在 Level 子分中权重较低（辅助信号）

3. **短期活动造成速度异常升高**

   * 控制：速度项只部分加权；稳定性项用于修正

4. **跨门店可比性问题**

   * 控制：SPI 默认用于门店内排序；如需跨店对比，需后续增加门店标准化层

---

## 14. 上线计划（建议）

### Phase 1：影子跑数（1–2 周）

* 后台计算 SPI，不对运营展示
* 验证分布、极值、客户样本解释性

### Phase 2：看板展示与规则试运行（2–4 周）

* 接入 NCI/WBI 队列的辅助分档
* 先用于“投入强度分层”，不直接自动派单

### Phase 3：策略联动

* 用于活动名单筛选、增值推荐档位
* 与 `ML/OS/MS` 联动形成自动建议

---

## 15. 研发实现清单（交付物）

1. 新增任务：`SpendingPowerIndexTask`
2. 新增结果表：`dws_member_spending_power_index`
3. 新增配置：`cfg_index_parameters` 中 `index_type='SPI'`
4. 新增看板字段：

   * `SPI_display`
   * `Level/Speed/Stability` 子分展示
5. 新增运营策略读取逻辑（可选）：

   * NCI/WBI 队列中读取 SPI 做资源分档

---

## 16. 附录：公式与约定（实现参考）

### 16.1 指数衰减（如后续引入时间衰减特征）

[
decay(d; h)=exp(-ln(2)\cdot d / h)
]
（半衰期形式，`d=h` 时权重降为 0.5）([维基百科][2])

### 16.2 展示分映射（沿用现有 BaseIndexTask）

* P5/P95 Winsorize
* `compression_mode`: `none / log1p / asinh`
* MinMax → `[0,10]`
* 可选 EWMA 分位平滑（`ewma_alpha`）([维基百科][1])
