跳转至

P7-1.1 定义项目问题与输入

Section ID: P7-1.1 Version: v2026.08.01

一个 AI 项目的开端不是“先选模型”,而是把观察到的现象变成可检验的问题。这里用渠道流量日志练习:先确认发生了什么,再确定需要哪些输入、比较什么基线,以及哪些结论仍不能下。

从现象到可检验问题

假设广告渠道的转化率下降,而自然和搜索渠道相对稳定。不能立刻写成“广告质量变差了”。转化率是转化次数除以访问次数;访问量、渠道构成或时间范围的变化都可能改变这个比例。

观察 不能直接推出的结论 先检查的问题
广告转化率下降 广告素材一定失效 访问量和转化次数是否足够?
总体转化率变化 所有渠道都同方向变化 按渠道拆分后仍然如此吗?
某天出现异常 新策略已经证明有效 与哪个时间基线比较?
flowchart TD
  A["观察到的场景\n广告流量下降,转化率上升"]
  B["仓促结论\n广告质量变好了"]
  C["检查样本量\n访问量和转化次数是否充足?"]
  D["按渠道拆分\n广告、自然、搜索是否不同?"]
  E["比较基线\n与7天平均或最近4天比较"]
  F["更稳妥的解读\n广告流量变化可能使总体比例改变"]
  A --> B
  A --> C --> D --> E --> F

固定本节的项目记录

本节的问题可以写成:广告渠道的转化率变化,是否超出近期同一渠道的常见波动? 这不是因果结论,而是定义后续检查的范围。

记录项 本练习中的内容
输入单位 一天、一个渠道的一行日志
输入字段 日期、渠道、访问量、转化次数
输出 转化率、基线差异、异常候选
基线 同一渠道的7天平均,必要时比较最近4天
保留限制 样本量、标签质量、未记录的活动变化
flowchart TD
  A["项目问题\n广告渠道的转化率为何变化?"]
  B["输入记录\n日期、渠道、访问量、转化次数"]
  C["比较基线\n按渠道的7天平均"]
  D["输出记录\n异常候选、检查问题、下一步"]
  E["限制条件\n样本量、标签、时间范围"]
  A --> B --> C --> D --> E

用实际日志计算渠道与日期

使用同一份 p7-1-traffic-log.zh.csv。代码不会训练模型;它首先把项目问题需要的证据读出来。

import csv
from collections import defaultdict
from pathlib import Path

rows = list(csv.DictReader(Path("docs/assets/part-07/chapter-01/p7-1-traffic-log.zh.csv").open(encoding="utf-8")))
for row in rows:
    row["visitors"] = int(row["visitors"])
    row["signups"] = int(row["signups"])
    row["conversion_rate"] = row["signups"] / row["visitors"]

by_channel = defaultdict(list)
for row in rows:
    by_channel[row["channel"]].append(row)

for channel, channel_rows in sorted(by_channel.items()):
    baseline = sum(row["conversion_rate"] for row in channel_rows[:7]) / len(channel_rows[:7])
    latest = channel_rows[-1]
    print({
        "channel": channel,
        "baseline_7_day": round(baseline, 4),
        "latest_date": latest["date"],
        "latest_rate": round(latest["conversion_rate"], 4),
        "difference": round(latest["conversion_rate"] - baseline, 4),
    })

输出中的差异只是候选信号。若广告渠道与自身基线相比明显下降,而其他渠道没有相同变化,下一步是检查该渠道的流量构成、活动和记录范围,而不是直接选择更复杂的模型。

各渠道每日转化率与错误率;虚线表示近期区间前的加权基线

为什么分母同样重要

转化率 conversions / visits 把两个计数压缩成一个比例。相同的比例变化可能来自很不同的情形:转化次数下降、访问量增加、访问量骤减,或两者一起变化。因此项目记录必须保留原始计数。

情形 比例可能的表现 需要保留的证据
转化次数下降、访问量稳定 转化率下降 两个原始计数和日期
访问量激增、转化次数稳定 转化率下降 流量来源和活动记录
访问量很小 比例剧烈波动 样本量和更长时间窗口
渠道构成变化 总体比例变化 渠道拆分结果

不能因为比例看起来精确,就忘记它来自多少次访问。小样本中的一个转化就可能让当天曲线显得异常。

比较基线,而不是只看最后一天

基线回答“与什么相比”。本练习先使用同一渠道前7天的平均,因为跨渠道直接比较会混入不同受众、投放方式和意图。最近4天平均可以作为补充,但必须在记录中写清楚窗口不同。

比较 能回答的问题 不能回答的问题
广告当天与广告7天平均 广告自身是否偏离近期水平 为什么发生偏离
广告与自然渠道 渠道水平是否不同 两渠道是否具有相同受众
7天与最近4天平均 变化是否集中在最近窗口 策略是否造成变化

学习检查

  1. 能否用一句话写出项目问题,而不把观察当成原因?
  2. 能否说明一行输入日志的单位和字段?
  3. 能否指出转化率的分子与分母,并解释为何两者都要保存?
  4. 能否说明7天基线与最近4天基线各自回答什么?
  5. 能否为广告异常写出一个下一步检查,而不是直接提出模型替换?

项目回顾格式

1
2
3
4
观察:广告渠道的当天转化率与其7天基线不同。
事实:记录保留日期、渠道、访问量和转化次数。
解释边界:该差异不证明广告质量或策略造成变化。
下一步:检查渠道流量构成、活动记录和近期窗口比较。

这样的格式把事实、解释和行动分开。它为后续的基线设计和异常比较留下可复查的起点。

用同一行记录做三种读取

同一份渠道-日期日志可以按不同单位汇总。单位改变时,问题也随之改变;不能把三个结果当成彼此矛盾的答案。

读取单位 一行代表什么 主要问题 风险
日期汇总 同一天所有渠道合计 总体转化和错误率是否变化? 渠道间的相反变化可能相互抵消。
渠道-日期 某渠道在某一天 哪个渠道、哪一天需要检查? 单日样本可能太小。
渠道区间 某渠道在基线与最近区间 该渠道的近期水平是否不同? 不能由此证明原因。

例如,广告渠道访问量下降时,总体转化率可能改变,即使自然和搜索渠道几乎没有变化。日期汇总告诉我们“整体发生了什么”;渠道-日期告诉我们“从哪里开始查看”;渠道区间比较告诉我们“与什么历史水平比较”。

日期汇总的检查问题

把同一天三个渠道合并时,分子和分母都要先相加,再计算比例。不要把三个渠道的转化率简单平均,因为各渠道的访问量不同。

正确的日期汇总 不应做的汇总
当天注册总数 / 当天访问总数 (广告率 + 自然率 + 搜索率) / 3
保留当天错误总数和访问总数 只保留一个无分母的错误率
标记分母很小的日期 将每个日期视为同等可靠

日期层面的信号可以启动调查,但不能代替渠道层面的记录。当总体指标改变时,先问哪个渠道贡献了变化,而不是为所有渠道写同一种解释。

渠道-日期的检查问题

渠道-日期记录特别适合寻找最近区间中较低的转化率候选。候选不是异常的同义词;它只是值得回到原始计数、来源和活动记录的一行。

1
2
3
4
5
候选行:日期、渠道、访问量、注册数、错误数、转化率、错误率
检查一:访问量是否明显少于该渠道通常水平?
检查二:注册数是否变化,还是分母发生变化?
检查三:其他渠道在相同日期是否有相同方向的变化?
检查四:该日期是否有未记录的投放、页面或采集变化?

如果广告渠道连续多日低于自身基线,而自然和搜索渠道稳定,这会让“广告渠道特有因素”成为较合理的下一步问题。它仍然不是广告创意、受众或算法的因果证明。

在基线区间与最近区间之间比较

本练习用 2026-06-08 把日志分成两个区间。切分日期是分析设定的一部分:改变它会改变哪些行属于基线,哪些行属于最近区间。因此必须在项目记录中写明。

比较记录 应包含的字段
日期汇总基线 总访问量、总注册数、总错误数、转化率、错误率
日期汇总最近区间 同一组字段和明确的日期范围
渠道基线 每个渠道的区间汇总
渠道最近区间 每个渠道的区间汇总
差异 最近值减去基线值及其解释边界

使用相同的区间定义,才能判断广告变化是否只是整体趋势的一部分。若切分日期、数据过滤或指标定义改变,就应把它记录为新的比较,而不是与旧结果直接并列。

一个可复查的比较摘要

1
2
3
4
5
6
7
数据文件:p7-1-traffic-log.zh.csv
基线结束:2026-06-07
最近区间开始:2026-06-08
观察:广告渠道的最近转化率低于其基线。
对照:自然与搜索渠道的变化较小。
尚未证明:广告策略、页面、受众或外部事件造成该变化。
下一步:回到渠道-日期记录,检查访问量、注册数、错误数和活动上下文。

这类摘要比“广告表现变差”更有用,因为后来的人可以知道比较单位、基线范围和未解决的问题。

控制变量的练习

为了理解项目问题如何依赖设定,可一次只改变一个变量。

  1. 将切分日期从 2026-06-08 改为其他日期,重新记录基线和最近区间。
  2. 只对最近广告行增加或减少错误数,查看错误率是否改变而转化率保持不变。
  3. 用最近4天而非前7天作为比较窗口,并明确这是不同的基线。
  4. 先按日期汇总,再按渠道汇总,说明两个结果各自回答的问题。
  5. 选择一个低转化率候选,写出还需要哪一列证据才能解释它。

一次修改一个变量,才能知道结论为何改变。若同时改变日期范围、指标和数据行,得到的差异无法归因于任何一个设定。

常见的过度解读

过度解读 更稳妥的表述
广告转化率下降,广告一定无效。 广告转化率低于当前基线;需要检查分子、分母和渠道上下文。
总体转化率上升,所以每个渠道都改善。 总体比例变化;必须查看渠道拆分。
最近一天最差,所以应立刻调整策略。 该行是候选;需要比较样本量和近期连续模式。
错误率上升证明模型造成问题。 错误记录可能变化;需要确认采集、流量和定义。

项目开始阶段的价值在于缩小错误的问题。一个清楚的“尚未知道什么”能防止后面的模型实验建立在错误假设上。

最终学习检查

检查项 能回答的问题
问题表述 是否把观察、比较对象和边界写清楚?
输入记录 是否保留访问量、注册数和错误数,而不只保留比例?
单位 是否区分日期、渠道-日期和渠道区间?
基线 是否写明窗口和切分日期?
异常候选 是否把候选与原因结论分开?
下一步 是否指出一个可验证的检查,而不是直接更换模型?

如果这些问题都能回答,项目就有了可以复查的起点。下一节将用这个记录设计基线并比较不同的异常判断方式。

读取程序输出时保留的内容

程序给出广告、自然和搜索渠道各自的7天基线、最后一天的转化率,以及二者差异。输出不是排名表;它是让读者回到同一数据记录的索引。

输出字段 读取方式 不能省略的上下文
baseline_7_day 同渠道前7天的平均比例 该窗口中的访问量和注册数
latest_rate 最后一天的比例 最后一天的分子和分母
difference 最后一天减去基线 并非因果效应或显著性检验
latest_date 需要回查的日期 渠道、活动和数据采集状态

广告渠道的差异更大时,正确的下一句是“广告渠道值得优先检查”,而不是“广告导致了问题”。自然和搜索渠道的小变化是对照信息,但它们不控制所有外部因素。

错误率也需要自己的问题

错误率由错误数除以访问量得到。它可用于发现记录、服务或页面体验相关的候选信号,但不能与转化率混成一个未定义的总分。

指标 分子 分母 需要追问的问题
转化率 注册或转化数 访问量 用户是否完成目标动作?
错误率 错误数 访问量 记录到的错误是否在特定渠道或日期集中?
访问量 流量构成是否改变了比例的解释?

若转化率下降而错误率稳定,下一步仍可能是检查受众或意图。若错误率同时升高,需再检查页面、采集或服务状态。两种模式都只能打开问题,不能单独关闭诊断。

一份完整的开始记录

1
2
3
4
5
6
7
8
中心问题:广告渠道的近期转化率是否偏离自身基线?
输入单位:渠道-日期日志。
核心指标:转化率和错误率;保留它们的原始计数。
基线:切分日期之前的同渠道记录。
对照:日期汇总和其他渠道的同一窗口。
候选:最近广告渠道的低转化率行。
限制:样本量、未记录活动、标签或采集变化。
下一步:检查候选行的流量构成和活动上下文。

这份记录可在任何模型训练之前建立。它使后续的基线、阈值和错误分析有明确的比较对象。

提交前的五个问题

  1. 比例的分母是否被完整记录?
  2. 每个比较是否使用了明确的日期范围?
  3. 渠道差异是否与总体汇总分开阅读?
  4. 候选行是否保留了可回查的日期和渠道?
  5. 解释是否仍然区分观察到的差异与尚未验证的原因?

若其中任一项无法回答,先补充记录,再进行基线或异常判断。

项目问题不是最终答案;它是让后续答案可以被检查的边界。

在下一次运行前保存输入文件版本。 保存切分日期和所有手动调整。 保留原始计数,即使报告中显示百分比。 让另一位读者能从候选行回到原始日志。 这也是后续比较能被复现的最低条件。 不要让图表替代原始记录。 先检查问题,再扩大项目范围。

记录的可复现性

保存 CSV 的版本、读取日期和任何过滤条件。 保存渠道名称与日期格式的解析规则。 保存基线窗口与最近窗口的精确边界。 保存每个比例的分子和分母。 保存候选行的原始记录而不是只保存图表。 让比较可以在同一输入上被另一位读者重新计算。

来源与参考

本节的数据和示例为本书创建的练习材料。