---
name: bi-anomaly-detection
description: 基于阈值检测时间序列中的显著异常波动点。当需要找出指标异常波动日期、识别数据异动时调用。
---
# bi-anomaly-detection

基于阈值识别时间序列中的显著异常波动点，常见场景：

- **日常分析**：在指标分析流程中，对北极星指标进行异常波动点识别
- **监控告警**：对实时/定时指标数据进行异常检测，触发告警

## 执行步骤

### 1：数据准备

包含时间序列数据的 CSV 文件，至少包含以下两列：

| 列     | 说明             | 示例       |
| ------ | ---------------- | ---------- |
| 日期列 | 时间标识         | 日期       |
| 指标列 | 需要检测的指标值 | 访问用户数 |

示例：

```csv
日期,访问用户数
2025-01-01,10000
2025-01-02,10500
2025-01-03,9800
```

若上游步骤已产出可用数据文件则直接使用，否则自行取数。

### 2：选择对比逻辑

根据业务场景按需选择对比逻辑：

| 对比逻辑 | 适用场景                                 |
| -------- | ---------------------------------------- |
| 日环比   | 日异常检测，反应灵敏，适合实时监控和日报 |
| 周同比   | 日异常检测，稳定性好，消除周末效应       |
| 周环比   | 周异常检测                               |
| 月环比   | 月异常检测                               |

> 日异常检测场景建议同时检查日环比和周同比

### 3：确定阈值

针对**每种**对比逻辑，确定异常判定阈值：

- **已有阈值**：若外部已提供阈值，按以下优先级取值，命中即停：
  | 优先级 | 来源                 | 示例                         |
  | ------ | -------------------- | ---------------------------- |
  | 1      | 用户显式指定         | 用户要求"日环比阈值设为 15%" |
  | 2      | 域知识包（若存在）   | 域知识包指定量值指标默认 10% |
  | 3      | 语义层接口（若可用） | 通过接口查询到的指标阈值配置 |
- **未提供阈值**：若没有任何外部来源提供阈值，尝试从历史数据中自适应计算阈值

### 4：异常点判断

按以下优先级选择计算方式，命中即停：

#### 方式一：使用脚本

路径：`scripts/anomaly_detection.py`

原理：根据传入的阈值参数计算对应的变化率，将变化率绝对值与阈值对比，超过阈值的数据点标记为异常。传入多个阈值时，异常点取交集。

若脚本**适用**于当前场景，按以下方式调用：

**参数**：

| 参数            | 说明                                   |
| --------------- | -------------------------------------- |
| --input-file    | 输入数据文件路径（必填）               |
| --date-col      | 日期列名（必填）                       |
| --metric-col    | 指标列名（必填）                       |
| --threshold-dod | 日环比阈值，传入则检查日环比           |
| --threshold-wow | 周同比阈值，传入则检查周同比（日数据） |
| --threshold-woq | 周环比阈值，传入则检查周环比（周数据） |
| --threshold-mom | 月环比阈值，传入则检查月环比（月数据） |
| --output-file   | 异常波动点输出路径（可选）             |

> 至少传入一个阈值参数。传入多个时，异常点为各检查项的交集。

**调用示例**：

```bash
# 只检查日环比
python scripts/anomaly_detection.py \
  --input-file data.csv \
  --date-col "日期" \
  --metric-col "访问用户数" \
  --threshold-dod 0.10

# 同时检查日环比和周同比（异常点取交集）
python scripts/anomaly_detection.py \
  --input-file data.csv \
  --date-col "日期" \
  --metric-col "访问用户数" \
  --threshold-dod 0.10 \
  --threshold-wow 0.15
```

**输出格式**：

```
检查项: 日环比阈值: 10%, 周同比阈值: 15%
数据行数: 90
异常波动点数: 3

异常波动点:
       日期  访问用户数   日环比     周同比
2025-01-15     12000    +20.00%   +18.00%
2025-02-01      8500    -15.00%   -12.00%
2025-02-14     15000    +25.00%   +22.00%
```

#### 方式二：自行实现

若脚本不适用于当前场景，参考上述原理自行实现异常检测。
