Aloudata CAN SKILLS - metric-attribution

对指标波动进行综合归因诊断,定位导致指标变化的关键因子、维度和外部事件。当用户需要分析指标波动原因、定位指标变化的根因、做因子拆解归因(如 GMV = UV × 转化率 × 客单价)、或理解指标为什么涨跌时,必须使用此 Skill。 触发场景包括但不限于:用户提到"归因""归因分析""波动分析""波动归因""根因...

MIT-0 · Free to use, modify, and redistribute. No attribution required.
0 · 146 · 0 current installs · 0 all-time installs
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (metric attribution) match the declared network calls and the single required env var (CAN_API_KEY). The domain whitelist (gateway.can.aloudata.com) and the API-key header usage are coherent with the stated functionality.
Instruction Scope
SKILL.md narrowly instructs the agent to call the Gateway API and run local calculations; it explicitly requires looking up metric/dimension metadata before querying. One minor note: the doc mentions '结合外部事件检索' (combine external event retrieval) but does not enumerate external endpoints — platform domain whitelist only lists the Gateway host, so either external-event lookups are expected to be manual/knowledge-based or additional endpoints would be needed. Otherwise the instructions do not ask the agent to read unrelated secrets or system files beyond the expected ~/.openclaw/.env for CAN_API_KEY.
Install Mechanism
Instruction-only skill with no install spec or code files, so nothing is written to disk or downloaded during install.
Credentials
Only one required environment variable (CAN_API_KEY) is declared and is appropriate for authenticating to the Gateway API. The skill does not request unrelated credentials or config paths.
Persistence & Privilege
always is false and the skill does not request elevated or persistent system privileges. Autonomous invocation is allowed (platform default) but is not combined with other concerning flags.
Assessment
This skill appears internally consistent: it will read a single API key (CAN_API_KEY) from your environment and make network requests to gateway.can.aloudata.com to fetch metric metadata and data for attribution analysis. Before installing, confirm you are comfortable storing the API key in ~/.openclaw/.env and that the key's permissions are appropriately scoped (least privilege). If you expect the skill to correlate external events (news, holidays, competitor data), ask how those external sources will be queried — the skill's domain whitelist only includes the Gateway host, so additional endpoints would need explicit allowance. Finally, review any metric query results for sensitive data exposure and rotate the API key if you stop using the skill.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.0.4
Download zip
latestvk97fa41p840aqzvcepgankarh5834tbg

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

SKILL.md

指标波动归因诊断 Skill

归因分析的核心目标是回答"指标为什么变了"。这不是单一步骤能完成的任务——它是一个诊断流程,需要综合运用多种分析手段,最终汇聚为一个完整的归因结论。

诊断遵循"先定性再定位再找因"的逻辑:先搞清楚变了多少(Step 1),再拆解是哪个业务环节出了问题(Step 2),然后定位到具体的维度和维度值(Step 3),接着关联外部事件寻找根因(Step 4),最后综合所有发现给出结论(Step 5)。

┌───────────────────────────────────────────────────────────────┐
│                     归因诊断全流程                              │
│                                                               │
│  Step 1  确认波动事实 → 变了多少?跟什么比?                     │
│     ↓                                                         │
│  Step 2  因子拆解 → 哪个业务环节出了问题?(定性)               │
│     ↓                                                         │
│  Step 3  维度归因 → 问题环节在哪些维度上集中?(定位)            │
│     ↓         ↘ 发现集中点 → 继续下钻到更细维度                  │
│  Step 4  外部事件关联 → 天气?节假日?竞对?行业政策?(找因)     │
│     ↓                                                         │
│  Step 5  综合诊断结论 → 汇总所有发现,输出归因报告                │
│                                                               │
│  * 并非每次都需走完全部步骤,根据复杂度灵活调整                    │
│  * 每步的发现逐步积累,最终在 Step 5 统一收口                    │
└───────────────────────────────────────────────────────────────┘

为什么先因子拆解(Step 2)再维度归因(Step 3)?

因子拆解回答的是"哪个环节坏了"(流量?转化?客单价?),维度归因回答的是"在哪里坏了"(哪个渠道?哪个地区?)。先知道是哪个环节出了问题,维度归因才有方向——不用对着总指标盲扫所有维度,而是针对问题因子精准下钻。

举例:GMV 下降 10%。如果直接做维度归因,你可能发现"Retail 渠道贡献了 70% 的下降",但还是不知道 Retail 是流量少了还是转化差了。如果先做因子拆解,发现"转化率下降是主因",再对转化率做维度归因,直接就定位到"Retail 渠道的转化率环比降了 18%"。每一步都在收窄范围,效率高得多。

当然,如果指标没有明确的业务公式可以拆解(Step 2 不适用),直接跳到 Step 3 做维度归因即可。


0. 接口信息(复用 Gateway API)

本 Skill 复用 metric-query 的 Gateway API 体系。所有 API 调用规则与 metric-query 完全一致。

Gateway 搜索 API(检索指标和维度)

搜索指标: GET https://gateway.can.aloudata.com/api/metrics/search?keyword={关键词,可逗号分隔}&pageSize={数量} 单指标维度: GET https://gateway.can.aloudata.com/api/metrics/{metricName}/dimensions?keyword={可选过滤词,支持逗号分隔多关键词} 批量指标维度: GET https://gateway.can.aloudata.com/api/metrics/dimensions?metricNames={指标1,指标2}&keyword={可选过滤词,支持逗号分隔多关键词}

认证方式:所有请求必须携带 API Key,通过请求头 X-API-Key 传递(也可通过 ?apikey= 查询参数传递)。未携带或无效 Key 将返回 401。

调用铁律

  1. 所有请求必须加 API Key 认证头 -H "X-API-Key: $CAN_API_KEY"$CAN_API_KEY 从环境变量读取(用户需在 ~/.openclaw/.env 中配置 CAN_API_KEY=cgk-xxxxxxxx
  2. URL 中文参数必须 URL 编码,使用 --data-urlencode + -G

示例:

curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/search?pageSize=5" --data-urlencode "keyword=销售额" -G
curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/retail_amt/dimensions"
# 维度多关键词过滤(逗号分隔,匹配任一即返回,匹配范围包括维度名/展示名/描述/维度值样本)
curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/retail_amt/dimensions" --data-urlencode "keyword=渠道,地区,品牌" -G

指标查询 API(执行数据查询)

接口: POST https://gateway.can.aloudata.com/api/metrics/query

用 heredoc 传 JSON body(因 timeConstraint 含单引号,禁止用 -d '...'):

curl -X POST "https://gateway.can.aloudata.com/api/metrics/query" \
  -H "X-API-Key: $CAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- <<'EOF'
{JSON请求体}
EOF

请求体格式与 metric-query 完全一致,遵守 metric-query Skill 的全部 9 条铁律和构建规范(包括 NOW() 使用、metricDefinitions 注册、占比/排名陷阱、heredoc 传参等)。


Step 1:确认波动事实

归因的起点是搞清楚"到底变了多少"和"跟什么比"。基准选错,后面全白做。

1.1 确定对比基准

用户说对比基准实现方式
"环比下降了""跟上月比"上一周期__sameperiod__mom__ 系列
"同比下降了""跟去年比"去年同期__sameperiod__yoy__ 系列
"跟目标差多少""没达标"目标值需用户提供目标值,或从系统获取
"为什么降了"(未说基准)默认环比推断后与用户确认;若涉及季节性行业,建议同比

当用户未明确基准时:不要直接假设,先向用户确认。例如:"您说的下降是跟上个月比(环比),还是跟去年同期比(同比)?如果这个行业有明显的季节性,建议用同比来排除季节因素。"

1.2 查询总体变化量

通过 Gateway 检索指标后,先查整体变化:

# 搜索指标
curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/search?pageSize=5" --data-urlencode "keyword=销售额" -G

# 查整体环比变化
curl -X POST "https://gateway.can.aloudata.com/api/metrics/query" \
  -H "X-API-Key: $CAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- <<'EOF'
{
    "metrics": ["retail_amt", "retail_amt__sameperiod__mom__value", "retail_amt__sameperiod__mom__growthvalue", "retail_amt__sameperiod__mom__growth"],
    "timeConstraint": "DateTrunc(['metric_time'], \"MONTH\") = DATEADD(DateTrunc(NOW(), \"MONTH\"), -1, \"MONTH\")"
}
EOF

产出:明确的数字事实——指标从 X 变到了 Y,变化了 Z(变化率 W%)。后续分析都基于此展开。

1.3 观察时间趋势(可选但推荐)

查近几个月趋势,判断是异常波动还是持续趋势:

{
    "metrics": ["retail_amt"],
    "dimensions": ["metric_time__month"],
    "timeConstraint": "DateTrunc(['metric_time'], \"MONTH\") >= DATEADD(DateTrunc(NOW(), \"MONTH\"), -6, \"MONTH\") AND DateTrunc(['metric_time'], \"MONTH\") < DateTrunc(NOW(), \"MONTH\")",
    "orders": [{"metric_time__month": "asc"}]
}

Step 2:因子拆解(定性——哪个业务环节出了问题)

先弄清楚"是哪个环节坏了",后续的维度归因才有靶子。

2.1 判断是否适用

因子拆解的前提是指标有明确的业务公式。如果有公式,必须先做这一步;如果没有,直接跳到 Step 3。

常见拆解公式

复合指标拆解公式因子含义
GMV / 销售额UV × 转化率 × 客单价流量 × 转化 × 价格
销售额购买人数 × 客单价客数 × 价格
销售额订单数 × 件单价 × 连带率订单量 × 价格 × 购买深度
利润收入 - 成本收入端 vs 成本端

如果用户没有明确给出公式,根据业务常识推断并与用户确认。例如用户问"GMV 为什么降了",可以主动提议:"我来按 UV × 转化率 × 客单价 拆解看看是哪个环节的问题?"

2.2 获取因子数据

通过 Gateway 搜索各因子对应的指标,然后查询当期和基准期的值:

# 搜索相关因子指标
curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/search?pageSize=10" --data-urlencode "keyword=UV,转化率,客单价,购买人数" -G
{
    "metrics": ["visitor_cnt", "buyer_cnt", "AOV",
                "visitor_cnt__sameperiod__mom__value",
                "buyer_cnt__sameperiod__mom__value",
                "AOV__sameperiod__mom__value"],
    "timeConstraint": "DateTrunc(['metric_time'], \"MONTH\") = DATEADD(DateTrunc(NOW(), \"MONTH\"), -1, \"MONTH\")"
}

如果某些因子没有直接对应的指标,用 metricDefinitions + expr 计算:

"metricDefinitions": {
    "cvr": { "expr": "[buyer_cnt]/[visitor_cnt]" }
}

2.3 计算因子贡献

乘法公式 Y = A × B × C

当各因子变化率较小(均 < 20%)时,可用近似法:

ΔY% ≈ ΔA% + ΔB% + ΔC% + 交叉项
A 对 Y 的贡献 ≈ ΔA% / ΔY%

当变化率较大时,使用 Shapley 值分解确保精确性:

import itertools, math

def shapley_decomposition(factors_base, factors_current):
    """
    factors_base: dict, 如 {"UV": 10000, "CVR": 0.05, "AOV": 200}
    factors_current: dict, 如 {"UV": 12000, "CVR": 0.045, "AOV": 210}
    返回各因子对总变化量的 Shapley 贡献
    """
    factor_names = list(factors_base.keys())
    n = len(factor_names)

    contributions = {}
    for name in factor_names:
        shapley_val = 0
        others = [fn for fn in factor_names if fn != name]
        for subset_size in range(n):
            for subset in itertools.combinations(others, subset_size):
                subset_set = set(subset)
                val_with, val_without = 1, 1
                for fn in factor_names:
                    if fn == name:
                        val_with *= factors_current[fn]
                        val_without *= factors_base[fn]
                    elif fn in subset_set:
                        val_with *= factors_current[fn]
                        val_without *= factors_current[fn]
                    else:
                        val_with *= factors_base[fn]
                        val_without *= factors_base[fn]
                weight = math.factorial(subset_size) * math.factorial(n - subset_size - 1) / math.factorial(n)
                shapley_val += weight * (val_with - val_without)
        contributions[name] = shapley_val
    return contributions

加法公式 Y = A + B + C:直接看各项的变化量即可,无需复杂分解。

加法 + 乘法混合:先按加法拆,再对乘法项分别做 Shapley。

2.4 瀑布图可视化

因子拆解的结果用**瀑布图(Waterfall Chart)**呈现最为直观——起点是基准值,终点是当期值,中间每一段代表一个因子的贡献量,正向贡献向上(绿色),负向贡献向下(红色),一眼就能看出哪个环节拖了后腿、哪个环节在撑场。

使用 Python + matplotlib 生成瀑布图:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False

def waterfall_chart(factors, contributions, base_value, current_value, title, save_path):
    """
    factors: list, 因子名称列表,如 ["UV", "转化率", "客单价", "交叉项"]
    contributions: list, 各因子的贡献量(绝对值变化量,非百分比),如 [+20000, -15000, +5000, -500]
    base_value: float, 基准期总值
    current_value: float, 当期总值
    title: str, 图表标题
    save_path: str, 保存路径
    """
    labels = ["基准值"] + factors + ["当期值"]
    values = [base_value] + contributions + [current_value]

    # 计算瀑布图的底部位置和柱子高度
    bottoms = [0]
    heights = [base_value]
    running = base_value
    for c in contributions:
        if c >= 0:
            bottoms.append(running)
            heights.append(c)
        else:
            bottoms.append(running + c)
            heights.append(abs(c))
        running += c
    bottoms.append(0)
    heights.append(current_value)

    colors = ["#4472C4"]  # 基准值:蓝色
    for c in contributions:
        colors.append("#2E7D32" if c >= 0 else "#C62828")  # 正向绿,负向红
    colors.append("#4472C4")  # 当期值:蓝色

    fig, ax = plt.subplots(figsize=(10, 6))
    bars = ax.bar(labels, heights, bottom=bottoms, color=colors, width=0.6, edgecolor='white')

    # 在柱子上标注数值
    for i, (bar, val) in enumerate(zip(bars, values)):
        if i == 0 or i == len(values) - 1:
            text = f"{val:,.0f}"
            y_pos = bar.get_y() + bar.get_height() + base_value * 0.01
        else:
            text = f"{'+' if val >= 0 else ''}{val:,.0f}"
            y_pos = bar.get_y() + bar.get_height() + base_value * 0.01
        ax.text(bar.get_x() + bar.get_width()/2, y_pos, text,
                ha='center', va='bottom', fontsize=10, fontweight='bold')

    # 添加连接线
    for i in range(len(bars) - 1):
        x1 = bars[i].get_x() + bars[i].get_width()
        x2 = bars[i+1].get_x()
        y = bars[i].get_y() + bars[i].get_height() if i == 0 else bottoms[i] + heights[i]
        ax.plot([x1, x2], [y, y], color='gray', linewidth=0.8, linestyle='--')

    ax.set_title(title, fontsize=14, fontweight='bold', pad=15)
    ax.set_ylabel("指标值")
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    plt.tight_layout()
    plt.savefig(save_path, dpi=150, bbox_inches='tight')
    plt.close()

在报告中使用:将生成的瀑布图图片嵌入诊断报告(如果是 HTML 报告直接嵌入,如果是 Markdown 报告则引用图片路径)。

2.5 因子拆解的产出

这一步结束后,你应该能回答:

  • "变化主要发生在哪个业务环节?"(如:转化率下降是主因,贡献了 65%)
  • "各因子各贡献了多少?"(瀑布图直观呈现)

这个结论直接决定 Step 3 的方向——Step 3 的维度归因应优先围绕贡献最大的因子展开,而不是对着总指标盲扫。


Step 3:维度归因(定位——问题在哪些维度上集中)

知道了是哪个环节出了问题(Step 2),现在要定位"这个环节的问题集中在哪里"。

如果 Step 2 找到了主因子(如转化率),这一步就针对该因子做维度归因和下钻。如果 Step 2 不适用(指标没有拆解公式),则直接对总指标做维度归因。

3.1 横向扫描:多维度并行分析

选择归因维度

查询指标(或主因子指标)的可用维度:

curl -H "X-API-Key: $CAN_API_KEY" "https://gateway.can.aloudata.com/api/metrics/{metricName}/dimensions"

从可用维度中选取 3-5 个业务上最可能影响波动的维度:

  • 用户指定了 → 优先用户的
  • 未指定 → 优先选渠道、地区、产品线、品牌等业务实体维度
  • 避免粒度过细的维度(如 SKU),除非用户要求

对每个维度查询变化量

{
    "metrics": ["{指标}", "{指标}__sameperiod__mom__value", "{指标}__sameperiod__mom__growthvalue"],
    "dimensions": ["{维度名}"],
    "timeConstraint": "DateTrunc(['metric_time'], \"MONTH\") = DATEADD(DateTrunc(NOW(), \"MONTH\"), -1, \"MONTH\")",
    "orders": [{"{指标}__sameperiod__mom__growthvalue": "asc"}]
}

注意:这里的 {指标} 应该是 Step 2 发现的主因子对应的指标(如转化率对应的 buyer_cnt 和 visitor_cnt),而不一定是用户最初问的总指标。

计算贡献度

维度值变化量 = 当期值 - 基准值
总变化量 = Σ 所有维度值的变化量(应等于 Step 1 的总体变化量,作为校验)
贡献度 = 维度值变化量 / |总变化量| × 100%

分母用绝对值,正贡献=拉动增长,负贡献=拖累下降。

Highlight 主要贡献因素

计算完贡献度后,按以下规则标记主要贡献者,让关键发现一眼可见:

贡献度(绝对值)标记含义
≥ 30%🔴 主要贡献者必须重点分析,作为下钻对象
10% ~ 30%🟡 次要贡献者值得关注,可选择性下钻
< 10%无标记影响较小,一般不需下钻

评估各维度的解释力

  • 集中度:个别维度值贡献了大部分变化?(如某渠道贡献 70% 的下降)→ 维度解释力强
  • 业务可解释性:数据发现在业务上说得通?

如果所有维度的解释力都很弱(变化均匀分布,没有 🔴 标记的维度值),说明可能不是结构性变化,而是整体性因素在起作用 → 在 Step 4 外部事件中寻找解释。

3.2 纵向下钻:逐层深入

当某个维度值贡献了显著变化量,追问"这个维度值内部,又是哪个子维度导致的"。

确定下钻路径

维度从粗到细:

一级渠道 → 二级渠道 → 地区 → 城市
品类大类 → 品类中类 → 品牌

执行下钻

对贡献最大的维度值(top 1-2),添加 filters 限定后,在下一层维度上做归因:

{
    "metrics": ["{指标}", "{指标}__sameperiod__mom__value", "{指标}__sameperiod__mom__growthvalue"],
    "dimensions": ["{下一层维度}"],
    "filters": ["[{上层维度}]= \"{贡献最大的值}\""],
    "timeConstraint": "..."
}

下钻终止条件

  • 找到了足够具体的根因
  • 变化在当前层级均匀分布,没有集中点
  • 层数达到 3-4 层
  • 数据量过少,不具统计意义

3.3 维度归因的产出

这一步结束后,你应该能回答:

  • "问题因子的变化主要集中在哪个维度?"
  • "具体到哪个维度值贡献最大?"
  • "下钻后的根因路径是什么?"

结合 Step 2 的因子拆解,你现在应该有了一条完整的因果链条,例如:

"GMV 下降 10% → 主因是转化率下降(贡献 65%)→ 转化率下降集中在 Retail 渠道(贡献 70%)→ 进一步下钻发现华东区降幅最大"


Step 4:外部事件关联(找因——为什么会这样)

内部数据告诉你"什么变了"和"在哪里变了",但根本原因往往在外部——天气、节假日、竞对、政策等。这一步为前面的数据发现寻找外部解释。

4.1 判断是否需要外部关联

以下信号提示需要关注外部因素:

  • 维度归因没有明显集中点:变化均匀分布,说明是"整体性"因素
  • 变化与季节性模式不符:如夏季空调销量反而下降
  • 变化幅度异常大:超出正常波动,通常有外部触发
  • 用户主动提及外部因素

实际上,即使维度归因有明显集中点,也建议检索外部事件作为佐证——"Retail 渠道转化率下降"是事实,但"为什么 Retail 转化率会下降"可能需要外部信息来回答。

4.2 外部事件检索

根据业务领域和波动时间段,搜索相关外部事件:

外部因素搜索关键词示例典型影响模式
天气/自然灾害"{地区} {月份} 天气 极端 暴雨 高温"影响线下客流、物流配送
节假日/大促"{月份} 节假日 促销节 双十一 618"大促前后蓄水-爆发-回落周期
竞对动作"{行业} 竞争对手 促销 降价 新品发布"价格战导致转化率/客单价变化
行业政策"{行业} 政策 法规 监管 新规"合规成本上升、品类受限
宏观经济"消费信心指数 {月份} CPI 就业"整体消费意愿变化
平台规则"{平台名} 算法 流量规则 搜索排名"流量分配变化导致 UV 波动

使用 WebSearch 工具进行搜索(如果可用),或提示用户确认已知的外部事件。

4.3 事件与数据对齐

找到候选外部事件后,验证其与数据发现的一致性:

时间对齐:事件发生时间与指标变化时间匹配?(事件应在变化之前或同期)

空间对齐:地区性事件(如某地暴雨),该地区数据是否确实异常?用 Step 3 的维度归因结果验证。

方向对齐:事件预期影响方向与实际变化一致?(暴雨 → 线下客流减少 → 线下渠道确实下降了)

量级对齐:事件影响范围是否足以解释变化量级?

4.4 外部关联的产出

  • "有哪些外部事件可能影响了指标?"
  • "这些外部事件与数据发现是否一致?"
  • "哪些是有数据支撑的确定性结论,哪些是基于外部信息的推测?"

Step 5:综合诊断结论

将所有发现汇总,形成完整的归因报告。

5.1 报告结构

# 指标波动归因诊断报告

## 1. 波动概况
- **分析指标**:{指标名称}
- **分析时段**:{当期} vs {基准期}
- **当期值**:{值} | **基准值**:{值}
- **变化量**:{±变化量}({变化率}%)
- **趋势判断**:{突发异常 / 持续趋势 / 季节性波动}

## 2. 归因发现

### 2.1 因子拆解(哪个环节出了问题)

**瀑布图**:(嵌入 Step 2 生成的瀑布图,直观展示各因子正负贡献)

![因子拆解瀑布图]({waterfall_chart_path})

| 因子 | 当期值 | 基准值 | 因子变化率 | 对总量贡献 | 贡献度 |
|------|-------|-------|----------|----------|-------|
| **{因子A}** 🔴 | xxx | xxx | {±X.X%} | {±xxx} | **{XX%}** |
| {因子B} | xxx | xxx | {±X.X%} | {±xxx} | {XX%} |
| {因子C} | xxx | xxx | {±X.X%} | {±xxx} | {XX%} |

→ 主要问题环节:**{因子A}**(贡献了 XX% 的变化)

### 2.2 维度归因(问题集中在哪里)

针对主因子 **{因子A}** 做维度归因,定位问题集中在哪里。

**Highlight 规则**:贡献度 ≥ 30% 的维度值标记为 🔴 主要贡献者,10%-30% 标记为 🟡 次要贡献者。

| 维度 | 维度值 | 当期值 | 基准值 | 变化量 | 贡献度 | 标记 |
|-----|-------|-------|-------|-------|-------|------|
| {维度1} | {值A} | xxx | xxx | {±xxx} | **{XX%}** | 🔴 主因 |
| {维度1} | {值B} | xxx | xxx | {±xxx} | {XX%} | 🟡 次因 |
| {维度1} | {值C} | xxx | xxx | {±xxx} | {XX%} | |

**下钻路径**:🔴 {维度1值A} → 🔴 {维度2值X} → 🔴 {维度3值Y},贡献了总变化的 XX%

### 2.3 外部事件(为什么会这样)

| 事件 | 发生时间 | 影响范围 | 与数据的一致性 |
|-----|---------|---------|-------------|
| {事件1} | {时间} | {范围} | {高/中/低} |

## 3. 归因结论

综合以上分析,本次{指标名}的{变化方向}主要由以下因素导致:

1. **主因**:{一句话说清核心原因,串联因子→维度→外部事件}
   - 数据支撑:{因子拆解和维度归因的关键数字}
   - 外部佐证:{相关外部事件,如有}

2. **次因**:{第二重要的原因}
   - 数据支撑:...

3. **其他因素**:{其他较小的影响因素}

## 4. 建议关注
- {基于归因结论给出的可操作建议}
- {需要持续监控的指标或维度}

5.2 报告撰写原则

结论驱动,数据支撑:先说结论,再给证据。读者最关心"为什么变了"和"怎么办",不关心分析过程。

区分确定性:数据直接证明的("数据显示转化率下降贡献了 65%")vs 基于外部信息的推测("推测与竞对促销有关")。

给出完整因果链条:最有价值的归因不是单点发现,而是一条串联 Step 2→3→4 的链条:

"销售额环比下降 12%,主因是转化率下降了 18%(贡献总下降的 65%)。转化率下降集中在 Retail 渠道(贡献 70%),进一步下钻发现华东区降幅最大(贡献 45%)。推测与该区域同期竞对大力度促销活动有关。"


通用规范

查询构建

所有 API 查询遵守 metric-query 的全部铁律和规范,特别注意:

  • 相对时间必须用 NOW(),禁止硬编码日期
  • metricDefinitions 中每个 key 必须在 metrics 数组中注册
  • curl 用 heredoc 传 JSON body
  • 维度值严格按 Gateway 返回的原始写法

查询效率

归因分析通常需要多次查询。为减少查询次数:

  • 利用 __sameperiod__ 系列一次获取当期值、基准值和变化量
  • 多次查询的 timeConstraint 保持一致
  • Step 3 维度归因时,可以同时查多个维度(分别放在不同查询中)

数值计算

  • 贡献度分母用总变化量的绝对值,避免负数导致符号混淆
  • 各维度值贡献度之和应约等于 100%,作为校验(偏差 > 5% 需排查)
  • 因子拆解时基准值为 0 → 标注"基准期无数据,无法计算变化率"
  • 百分比类指标(如转化率):明确区分"百分点变化"和"变化率"

常见错误模式

❌ 未确认基准就开始分析:用户说"指标降了"但没说跟什么比。先确认基准。

❌ 跳过因子拆解直接扫维度:如果指标有业务公式,先拆解才能让后续维度归因有方向。否则只知道"Retail 下降了",不知道是 Retail 的哪个环节出了问题。

❌ 只做因子拆解不做维度归因:知道"转化率下降是主因"还不够,得进一步定位到哪个渠道、哪个地区的转化率降了。

❌ 只看内部数据不关联外部事件:数据告诉你"在哪里变了",但"为什么变"往往需要外部信息来回答。特别是当维度归因结果均匀分布时,更要找外部因素。

❌ 贡献度分母用了带符号的值:总变化量为负时符号反转。分母必须用绝对值。

❌ 因子拆解忽略交叉项:因子变化率 > 10% 时,近似分解误差不可忽略。用 Shapley 分解或至少报告交叉项。

❌ 下钻过深,数据量不足:每层下钻缩小数据范围,数据量太少时结论不可靠。

❌ 混淆"百分点变化"和"变化率":转化率从 5% 降到 4% → 百分点变化 -1pp,变化率 -20%。

❌ 把数据关联当因果:维度归因发现的是"关联",因果推断需结合外部事件和业务逻辑。


分析质量检查清单

  1. ✅ 对比基准已确认且合理
  2. ✅ 总体变化量已量化(有具体数字和百分比)
  3. ✅ 因子拆解(如适用):各因子贡献之和等于总变化量
  4. ✅ 因子拆解(如适用):交叉项已检查
  5. ✅ 维度归因:围绕主因子(而非总指标)展开
  6. ✅ 维度归因:各维度值贡献度之和约等于 100%
  7. ✅ 维度归因:对贡献最大的维度值做了下钻(至少尝试一层)
  8. ✅ 外部事件:至少检索了相关时间段的外部事件
  9. ✅ 外部事件:与数据发现做了一致性对齐
  10. ✅ 综合结论串联了因子→维度→外部事件的完整链条
  11. ✅ 结论区分了确定性发现和推测性判断
  12. ✅ 给出了可操作的业务建议
  13. ✅ 百分比口径一致(百分点 vs 变化率)
  14. ✅ 所有查询遵守 metric-query 铁律
  15. ✅ 因子拆解生成了瀑布图(如适用)
  16. ✅ 维度归因中主要贡献者(≥30%)已用 🔴 标记 highlight

Files

2 total
Select a file
Select a file to preview.

Comments

Loading comments…