小肥柴的Hadoop之旅 快速实验篇(B17)B组实验总结报告:电商用户行为数据分析的完整实践
数据源:
user_visit_action.txt(18.6 MB,180570 行,13 字段)技术栈:Hadoop MR + Hive on MR + 本地 Python
集群:1 master + 3 worker,每节点 2GB
实验周期:B01--B16,共 16 个实验
1. 这份报告的写作目的
B 组实验的起点是一份电商用户行为日志,终点是一套关于"这份数据能做什么、不能做什么、边界在哪"的完整认知;中间经历 16 个实验,覆盖数据治理、描述性分析、关联分群、方法论演示、建模预测五个阶段。
报告要回答三个问题:
- 电商平台数据应该分析哪些项目?
- 每个项目的分析目的是什么,对应哪个实验,结果如何?
- 这些实验共同揭示了什么规律?
报告内容以实际执行结果为准,所有数字来自各实验的日志和产出表,不引用未验证的推断。
2. 实验设计思路
B 组实验的设计遵循一条主线:从数据底座出发,逐层向上,每一层都为下一层提供输入,同时在每一层检验上一层结论是否成立。
结构图如下。
text
┌──────────────────────────────────────┐
│ 原始日志 user_visit_action.txt │
│ 180570 行 / 13 字段 / 11 天 │
└──────────────────┬───────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第一层:数据治理与底座 │
│ B01 原始日志质量审计(MR Counter 画像) │
│ B02 DWD 生产级升级(分区 + ts + seq_in_session) │
│ 产出:dwd_user_behavior + 4 张多值子表 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第二层:描述性业务分析 │
│ B03 行为漏斗 B04 品类排名 B05 品类活跃 Session │
│ B06 页面跳转 B07 会话序列 B08 搜索词 B09 城市维度 │
│ 产出:漏斗/品类/页面/会话/搜索/城市 6 个维度的 ADS 表 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第三层:关联与分群 │
│ B10 品类共现与关联规则 │
│ B11 用户 RFM 与聚类分群 │
│ 产出:共现矩阵、关联规则、用户分群标签 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第四层:方法论演示三部曲 │
│ B12 异常检测(Z-score + 卡方 + iForest) │
│ B13 路径挖掘(马尔可夫 + n-gram + 聚类 + 规则) │
│ B14 用户标签体系(PCA/LDA/t-SNE/K-means/DBSCAN) │
│ 主题:简单方法 ≥ 高级方法;合成数据铁证 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第五层:建模与预测 │
│ B15 品类推荐系统(CF vs 随机/热门/规则) │
│ B16 用户级预测可行性审计(流失分类 + 价值回归) │
│ 产出:推荐指标表、预测可行性表、基线对比表 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ 第六层:收口 │
│ B17 总结与工程复盘(本报告) │
└─────────────────────────────────────────────────────────┘
六层结构的设计逻辑是:先有底座,再有描述,再有挖掘,最后才建模。 每一层都在检验上一层的前提是否成立。如果上层前提不成立,下一层的实验方向就要调整。
这个设计在 B 组执行过程中被反复验证是必要的。B03 发现品类均匀,B04 就调整了排名策略;B09 发现城市不可分,B10 就不再按城市切片;B15 发现推荐前提不成立,B16 就改为可行性审计。每一层的结论直接影响下一层的方向。
3. 第一层:数据治理与底座(B01--B02)
3.1 B01 原始日志质量审计
分析目的:在任何分析开始之前,先回答一个基础问题:这份数据能不能用,有哪些坑。
做法:用 MapReduce 写一个清洗程序,在解析每一行的同时,用 Counter 记录 16 个审计维度的统计量。Counter 是 MR 提供的分布式计数器,不占输出文件,不影响主逻辑,是数据画像的免费工具。
结果:六条假设中,两条成立,四条被推翻。
| 假设 | 结果 |
|---|---|
| H1 结构完整性 | 成立。无空行、无字段数异常、无真缺失 |
| H2 行为互斥 | 成立。四类行为互斥,multi=0,unclassified=0 |
| H3 单日数据 | 推翻。实际覆盖 11 天 |
| H4 品类-产品配对 | 推翻。80% 的订单品类与产品数组长度不等 |
| H5 文件顺序=时间顺序 | 推翻。2.16% 的行在 session 内时间倒流 |
| H6 脏数据多 | 推翻。格式校验全部为 0 |
关键教训:审计不是被动找问题,是主动检验假设。四条推翻对应四次设计调整:日期 Counter 从硬编码改为分布画像,多值子表从 1 张拆为 4 张,序列分析必须显式排序。
3.2 B02 DWD 生产级升级
分析目的:把 B01 的"能用"升级成"好用"。B01 的主表是非分区表,时间字段是字符串,session 内没有序号。这三个问题会让下游 10 个项目各自处理一遍,口径分叉。
做法:在 DWD 层一次性解决三个公共问题
- 按
dt分 11 个区,按天查询不再全表扫。 - 新增
ts timestamp,时间差分析统一口径。 - 新增
seq_in_session,按action_time, raw_line_id双键排序,序列分析不再各自写窗口函数。
结果:主表 180570 行,11 个分区,5 个关键不变量全部通过:总行数守恒、分区数 11、seq 无重复、seq 从 1 开始、ts 无 NULL。四张子表与 B01 对照完全一致。
关键教训:公共计算要前置。B06 页面单跳、B07 会话序列、B12 异常检测都需要时间差和页序,这些计算在 B02 做一次,比在三个项目里各做一次更可靠。
4. 第二层:描述性业务分析(B03--B09)
这一层回答的问题是:这份数据在业务维度上呈现出什么形态。
七个实验从漏斗、品类、页面、会话、搜索、城市六个角度切入。
4.1 B03 用户行为漏斗与转化率
分析目的:原设计要回答"搜索→点击→下单→支付的漏斗流失在哪"。这个问题的前提是搜索是漏斗入口。
结果:前提不成立。73.5% 的 session 是先点击后搜索,搜索和点击没有稳定顺序。搜索不是漏斗入口,是独立的用户意图信号。
真正的漏斗是"点击→下单→支付"。Session 层点击到下单转化率 58.5%,下单到支付 82.6%。
同时发现 1128 个 session 出现"支付但无下单",占支付 session 的 27.5%。这在真实电商里不可能,支付必然跟着下单。
输出 :ads_funnel_overall(4 行)、ads_funnel_session(8744 行)、ads_funnel_session_ordered(8744 行)、ads_funnel_category(20 行)。
4.2 B04 热门品类 Top10 与加权排名
分析目的:原设计要按点击量排 Top10,再按"点击×20% + 下单×30% + 支付×50%"做加权排名。
结果:B03 已经发现品类分布极端均匀,20 个品类的点击量全部在 5438 到 5687 之间,波动只有 2.3%。在这个分布上做排名,Top1 和 Bottom1 只差 4.6%,排名差异不具业务意义。
加权排名同样失效。归一化后的综合分全部在 0.050093 到 0.05125 之间,20 个品类的平均分就是 0.05,所有品类都在平均值附近。
唯一有区分度的是 order_to_pay_rate,范围 62.64% 到 76.04%,差异 13.4 个百分点。品类 15 支付意愿最高,品类 5 最低。
输出 :ads_category_summary(20 行)、ads_category_top10_rule1(10 行)、ads_category_top10_rule2(10 行)、ads_category_conversion_rank(20 行)。
4.3 B05 每个品类 Top10 活跃 Session
分析目的:从品类下钻到 session,看每个品类里哪些 session 贡献最大。
结果:(1)100 个 Top10 席位只来自 65 个不同的 session。其中 15 个 session 跨 2 个以上品类进入 Top10。同一个 session 可以是多个品类的 Top1。(2)Top10 内部区分度很低。25 组(品类 × total_events)出现并列,Top1 最小事件数与 Rank10 最大事件数重叠,都是 10。
输出 :ads_session_category_activity(87836 行)、ads_category_top10_session(100 行)。
4.4 B06 页面单跳转化率
分析目的:看用户在页面之间如何跳转,哪些路径转化率高。
结果:(1)50 个页面,2500 条跳转路径全部出现,是完整的 50×50 满矩阵。每条路径的跳转次数在 40 到 91 之间,极差只有 2.3 倍。95.3% 的路径样本量 ≥ 50。(2)转化率有区分度。订单转化率范围 62.5% 到 98.3%,支付转化率范围 50.8% 到 89.4%。这是 B 组第一次出现强区分度指标。但 Top10 高转化路径内部只有 5 个百分点的差距,且样本量高度接近。
一次真实的 OOM :窗口函数在 2GB 集群上触发了 OOM,DataNode 和 NodeManager 被系统杀掉。修复方案是显式设置容器内存,收紧 io.sort.mb,限制 reducer 数。这套内存控制参数被后续所有窗口函数脚本继承。
输出 :ads_page_transition(158026 行)、ads_page_single_step_conversion(2500 行)。
4.5 B07 Session 会话化与行为序列
分析目的:把每个 session 的行为拼成完整序列,看有哪些常见路径模式。
结果:这是 B 组第一个出现强区分度业务发现的实验。
Session 长度是长尾分布。中位数 13,最大值 203,相差 15.6 倍。39 个长度 ≥ 100 的深层 session 全部转化,转化率 100%。1640 个长度 < 5 的极短 session 只有 25.8% 转化。全量基准是 56.9%。100% 和 25.8% 之间的差距是 4 倍。
同时发现一个分布悖论:n-gram 频次是长尾的,click>click 占 44.6%;但 n-gram 的条件转化率是均匀的,所有 2-gram 的后续下单率都在 52.8% 到 56.9% 之间。频次长尾和条件概率均匀同时成立。
输出 :ads_session_sequence(8744 行)、ads_session_ngram(80 行)。
4.6 B08 搜索词分析
分析目的:原设计要做搜索词 TopN 排行榜和用户搜索偏好。
结果:搜索词只有 6 个。100 个用户每个人都搜过全部 6 个词。排行榜和偏好都做不了。
改用 event 级转化率分析。搜索后点击率 68.9% 到 71.0%,搜索后下单率 18.6% 到 19.8%,搜索后支付率 13.4% 到 14.3%。6 个词的转化率差异全部小于 2 个百分点。
核心方法论改进:转化率必须用 event 级,不能用 session 级。session 级算法下,同一个订单会被同时算给 session 里搜过的每一个词,导致转化率虚高 3 倍。这个发现是 B08 最重要的方法论贡献。
输出 :ads_search_keyword(6 行)、ads_search_summary(16 行)。
4.7 B09 城市维度分析
分析目的:原设计要做城市 × 品类偏好分析,看不同城市偏好哪些品类。
结果
26 个城市,每个城市的 user_cnt 都是 100。全部 100 个用户同时出现在全部 26 个城市里。这在真实电商里不可能,说明 city_id 是行为级随机分配字段,与用户无绑定。
品类分布完全均匀。每个城市的点击份额最大值都在 0.053 到 0.059 之间,无一超过 0.06。三套归一化熵全部超过 0.99。
方法论沉淀 :均匀随机字段识别的三个条件:第一,每个取值覆盖全部用户,user_cnt 恒定;第二,归一化熵 ≥ 0.99;第三,最大份额 ≤ 品类数倒数的 1.2 倍。三条同时满足即可判定为均匀随机字段。
输出 :ads_city_category_dist(520 行)、ads_city_summary(26 行)。
5. 第三层:关联与分群(B10--B11)
5.1 B10 品类共现与关联规则
分析目的:回答"哪些品类经常被一起买",用于捆绑销售和搭配推荐。
结果:购物篮平均 2.98 个品类,最大 5 个。190 对品类对全部有共现,没有一对为零,是完全稠密的共现矩阵。共现归一化熵 0.999616,比单品类分布更均匀。
FP-Growth 输出 210 个频繁项集,其中 20 个 1-项集,190 个 2-项集,3-项集为 0。380 条规则的提升度中位数 0.9428,低于 1.0。只有 4 条规则的提升度超过 1.05,最高 1.0738。
提升度小于 1 的解释:购物篮容量约束下,提升度小于 1 是正常现象。假设 20 个品类完全均匀,每个购物篮固定装 3 个品类,即使两个品类完全独立,提升度也会是 0.70 左右。所以提升度中位数低于 1 不是负相关,是几何约束。
算法切换:原设计用 Apriori。探测发现共现矩阵完全稠密后,改用 FP-Growth。输出结果与 Apriori 完全一致,但扫描数据次数从"最大项集长度次"降到 2 次,避免候选集膨胀。
输出 :ads_category_cooccurrence(190 行)、ads_category_rules(380 行)。
5.2 B11 用户 RFM 与聚类分群
分析目的:回答"高价值、潜力、流失用户是谁"。
结果"R 维度完全均匀。所有 100 个用户的 R 都等于 1,标准差为 0。每个用户在 07-26 这天都有行为。
F 和 M 有区分度。F 范围 977 到 2327,M 范围 78 到 233。但 F 和 M 的皮尔逊相关系数是 0.8484,高度正相关,数据本质是一维的。
K-means 在 k=2 时达到最优,silhouette=0.5161。两群分别是低价值 40 人(F 均值 1408,M 均值 122)和高价值 60 人(F 均值 1840,M 均值 167.5)。Mann-Whitney 检验 p 值小于 1e-15。
高价值用户占比 60%,远高于真实电商的二八原则。
输出 :ads_user_rfm(100 行)、ads_user_cluster(100 行)。
6. 第四层:方法论演示三部曲(B12--B14)
这一层的定位不是"找业务答案",而是"演示方法能做什么、不能做什么"。三个实验共享同一个主题:简单方法 ≥ 高级方法。
6.1 B12 异常流量与刷单识别
分析目的:原设计要识别刷单和异常流量。
探测结论:数据是合成的,不存在真实业务异常。四条铁证:session 内相邻行为时间间隔最大 11 秒;24 小时分布均匀;100 用户全 10 天活跃;支付无下单比例 27.75%。
B12 因此改为方法论演示。
三方法分工
Z-score 定位可疑候选,卡方用统计检验验证,iForest 从多维角度独立复核。
实测结果:搜索词"手机"的 Z 值为 -2.2306,卡方贡献 1802.5,占卡方总值的 83%。卡方总值 2174.49,是临界值 11.07 的 196 倍。iForest 从 11 维特征标记 415 个 session 异常,占 5.00%。V2 候选 30 个被 iForest 命中 11 个,占 36.7%。
敏感性分析:iForest 的 contamination 从 0.01 变到 0.10,异常数从 83 变到 830,V2 候选命中从 1 变到 25。这说明 iForest 的输出不是"客观异常清单",而是"主观设定的前 N% 离群点"。
输出 :ads_anomaly_zscore(36 行)、ads_anomaly_iforest(8744 行)、ads_anomaly_summary(8750 行)。
6.2 B13 用户行为路径挖掘
分析目的:从 session 序列里找出反复出现的路径模式。
四工具分工:马尔可夫链验证是否有条件结构,n-gram 找局部模式,路径聚类压缩路径,规则分组给出主结论。
结果
马尔可夫链:4×4 转移矩阵四行几乎完全一致。不管当前行为是什么,下一步到 click 的概率都是 0.663 到 0.671。条件偏差最大值 0.0042,KL 散度都在 1e-5 量级。行为序列近似独立随机。
n-gram 提升度:含 search 的 n-gram 提升度都大于 1,search>search>search 最高 1.337,click>click>click 最低 1.149。搜索密度越高转化率越高。
路径聚类:K-means 最优 k=13,silhouette 只有 0.328,属于弱结构。聚类边界和规则分组完全重合,没有发现新结构。
规则分组:4 类路径类型,完整转化 2970 个(34.0%),纯浏览 2626 个(30.0%),下单不付 2007 个(23.0%),支付无下单 1141 个(13.0%)。4 类的 user_cnt 都是 100,每个用户都派发了全部 4 类 session。
路径长度与转化率:6 个分桶全部单调,下单率从 1-5 桶的 18.5% 升到 100+ 桶的 100%。跨度 5.4 倍。
输出
ads_path_markov(4 行)、ads_path_type(4 行)、ads_path_cluster(8744 行)、ads_path_ngram_lift(80 行)、ads_path_seqlen_conv(6 行)、ads_path_kmeans_scan(14 行)、ads_path_rule_vs_kmeans(4 行)。
6.3 B14 用户标签体系构建
分析目的:原设计要从 20 多个维度做用户画像。
结果
PCA:前 3 个主成分解释 63.81% 方差。三类质心沿 PC1 有 4.4 单位偏移,但点云严重重叠。存在弱梯度,无清晰分群。
LDA:三类在 LDA 2D 上看起来分得很开,但这是循环论证。value_tier 本身是从 f_cnt 和 m_cnt 派生的,LDA 只是在验证一个已知事实。
t-SNE:三种 perplexity 和随机种子下,分团方向完全不同。分团是算法产物,不是数据属性。
K-means:最优 k=2,silhouette=0.2144,基本无结构。K-means 与 value_tier 的 ARI 只有 0.318,弱一致。
DBSCAN:27 个参数组合全部失效,要么全噪声要么全一簇。
核心方法论发现:没有外部标签时,监督降维必然自证。LDA 的"分开"来自标签,标签又来自特征,这是同义反复。打破循环的唯一方法是有不来自特征的外部标签,但这份数据没有。
输出
ads_user_feature_wide(100 行)、ads_user_label(100 行)、ads_user_label_summary(11 行)、ads_user_pca(100 行)、ads_user_lda(100 行)、ads_user_tsne(100 行)、ads_user_kmeans_scan(9 行)、ads_user_dbscan_scan(27 行)、ads_user_agreement_metrics(20 行)、ads_user_cluster_label(100 行)。
7. 第五层:建模与预测(B15--B16)
7.1 B15 品类推荐系统
分析目的:原设计要跑协同过滤、规则推荐、混合推荐,比较离线指标。
信号审计:推荐系统能成立依赖三个前提:用户有偏好差异、物品有区分度、存在未观测项。
三个前提全部不成立。矩阵密度 1.000,训练集 2000 个格子全部非零。用户熵均值 0.9884,接近 1.0。品类份额 Top1 只有 0.052,均匀期望是 0.050。基尼系数 0.0115,接近 0。
六方法对照
Random、Popular、UserHistory、RuleBased、UserCF、ItemCF 六种方法。
K=10 时 HitRatio 极差仅 0.009。Random 0.926,UserCF 0.929,ItemCF 0.933。差异属于噪声级别。
K=20 时全部方法 HitRatio 都是 1.000,指标完全失去区分力。
Popular 在 K=5 时 HitRatio 0.904,低于 Random 的 0.928。原因是覆盖率只有 0.25,所有用户收到同一个列表,越集中越难命中。
用户相似度:用户两两余弦相似度均值 0.9365。这不是偏好相似,是伪相似。所有用户都在 20 个品类上均匀撒行为,向量方向几乎一致,余弦相似度自然接近 1。任何用户都是任何用户的"相似邻居",邻居加权等价于全局平均。
输出 :ads_reco_metrics(18 行)、ads_reco_summary(1 行)、ads_reco_topn(21000 行)。
7.2 B16 用户级预测可行性审计
分析目的:原设计要做流失预测和价值预测。B16 把两者合并,做一次可行性审计。
流失审计:100 用户最后行为日期全部是 2019-07-26。100 用户在 10 天窗口内全部每天活跃。流失正样本为 0。流失分类任务不可定义,分类审计终止。
价值审计
时间切分:前 7 天历史,后 3 天预测。未来 3 天支付次数均值 22.59,标准差 7.28,范围 8 到 41,零值比例为 0。目标有方差,看起来可以回归。
相关性审计:6 个历史特征与未来支付的最大 Pearson 相关是 0.208,最大单变量 AUC 是 0.584。历史支付次数与未来支付次数的相关性是 0.057。6 个特征同时比较时,Bonferroni 校正后没有一个显著。
回归基线:全局均值 MAE 5.97,历史支付次数 3/7 缩放版 MAE 7.03,线性回归 5 折 CV 的 MAE 6.15。全局均值最优,任何模型都打不过它。
输出 :ads_prediction_feasibility(2 行)、ads_user_value_baseline(4 行)。
8. 实验之间的逻辑关系
16 个实验不是 16 个独立任务,而是一条有依赖的链。
纵向依赖:B01 的数据认知支撑 B02 的结构设计。B02 的 DWD 支撑 B03 到 B16 的全部分析。B03 的漏斗结论支撑 B04 的品类排名调整。B04 的品类清单支撑 B05 的 session 下钻。B05 的头部集中支撑 B07 的长尾发现。B07 的 session 序列支撑 B13 的路径挖掘。B11 的用户分群支撑 B14 的用户标签。B12 的异常检测支撑 B14 的异常特征。B13 的路径标签支撑 B14 的路径特征。B14 的用户特征宽表支撑 B15 的规则推荐。B15 的推荐结论和 B16 的预测结论互为呼应。
横向交叉验证
B03 的支付 session 数 4111,B06 的支付 session 数 4111,B07 的支付 session 数 4111。三个实验独立计算,数字完全一致。
B06 的 n-gram 2-gram 频次 158026,B07 的 2-gram 频次 158026。两个实验独立计算,数字完全一致。
B12 的支付无下单行数 1141,B13 的支付无下单 session 数 1141。两个实验粒度不同,数字完全一致。
这些交叉验证说明各实验的口径是一致的,结论可以互相信任。
9. 核心发现汇总
9.1 数据分析层面
电商平台数据分析应该覆盖六个维度。
用户维度回答"用户是谁、值多少钱、会不会走"。品类维度回答"哪些品类热、哪些品类能一起卖"。页面维度回答"用户在页面间怎么跳、哪一跳流失最多"。会话维度回答"用户一次访问做了什么、路径有多长"。搜索维度回答"用户主动搜什么、搜完之后转化如何"。城市维度回答"地域偏好有没有差异"。
每个维度的分析目的不同,不能互相替代。
用户维度做分群和预测,品类维度做推荐和捆绑,页面维度做流程优化,会话维度做行为序列,搜索维度做意图识别,城市维度做区域运营。
六个维度的分析前提都必须先验证。
用户维度要先验证用户之间有没有差异。品类维度要先验证品类分布是否均匀。页面维度要先验证页面跳转是否有结构。会话维度要先验证会话长度是否有分布。搜索维度要先验证搜索词是否有长尾。城市维度要先验证城市是否与用户绑定。
9.2 数据认知层面
这份数据是参数化合成的,共有 9 条铁证。
| 编号 | 铁证 | 来源 |
|---|---|---|
| 1 | 时间间隔 ≤ 11 秒 | B12 |
| 2 | 24 小时分布均匀 | B12 |
| 3 | 100 用户全 10 天活跃 | B12 |
| 4 | 行为序列近似独立随机 | B13 |
| 5 | 路径长度与转化率强单调 | B13 |
| 6 | 每个用户都派发 4 类 session | B13 |
| 7 | 用户维度近似独立同分布 | B14 |
| 8 | 用户-品类矩阵全密集、用户熵接近 1 | B15 |
| 9 | 流失正样本为 0、价值目标不可预测 | B16 |
九条铁证共同描绘出一个参数化生成器:
text
对每个用户 u:
for 每一天 d:
for 每个 session s:
1. 决定该 session 是否转化
2. 随机填充行为序列(4 状态独立同分布)
3. 随机生成时间戳(间隔 ≤ 11 秒)
4. 保证每个用户每天都活跃
5. 保证每个用户覆盖全部 20 个品类
9.3 方法论层面
简单方法 ≥ 高级方法,在合成数据、小样本、无外部标签条件下反复成立。
| 实验 | 对照 | 结论 |
|---|---|---|
| B11 | 规则分层 vs K-means | 规则胜 |
| B12 | Z-score / 卡方 vs iForest | 简单不输 |
| B13 | 规则分组 vs K-means | 规则胜 |
| B14 | PCA / LDA / t-SNE / DBSCAN | 高级制造假结构 |
| B15 | CF vs 随机 / 热门 / 规则 | CF 不优于随机 |
| B16 | 均值基线 vs 用户历史 / 线性回归 | 均值基线最优 |
没有外部标签时,监督方法必然自证。 B14 的 LDA 实验是这条结论的直接证据。标签来自特征,LDA 用标签找投影方向,找出来的方向必然是特征组合,画出来必然"分开"。这是同义反复,不是发现。
数据的信息量决定模型的上限。 B15 的协同过滤不是"效果不好",是"跑出来没有意义"。矩阵全密集、均匀,没有任何模型能从均匀里学到非均匀。B16 的价值预测同理,全局均值是最优解,任何模型都不如它。
"均匀"是有维度的。 B03 到 B06 说的均匀是"聚合边缘均匀",B07 说的长尾是"个体结构长尾",两者不矛盾。聚合后的边缘分布均匀,不代表个体分布均匀。以后遇到均匀结论,必须问一句"哪个维度的均匀"。
10. 对电商数据分析实践的启示
10.1 先审计,再建模
B15 和 B16 的最大价值不是"跑了什么模型",而是"在建模之前先做了信号审计"。B15 的 Step 0 检查了矩阵密度、用户熵、品类份额、相似度分布,确认三个前提全部不成立后,才决定不做真正的推荐建模。B16 同样先做了流失标签审计和价值目标审计,确认任务不成立后,才决定不跑复杂模型。
这个流程可以复用到任何数据分析任务:先回答"任务能不能定义、目标有没有信号",再决定"用什么模型"。
10.2 交叉验证是硬约束
B03、B06、B07 独立计算的支付 session 数完全一致。B06 和 B07 独立计算的 2-gram 频次完全一致。B12 和 B13 在行级和 session 级分别计算的 pay_no_order 完全一致。
这些交叉验证不是多余的。如果某个实验的口径写错了,交叉验证会立刻暴露。B 组执行过程中,因为交叉验证发现了多次口径不一致,及时修正。
10.3 诚实交代局限
B12 和 B13 都明确写了"这是合成数据,结论限定在方法论演示范围"。B14 明确写了"没有外部标签,监督降维必然自证"。B15 明确写了"候选集选择是权宜之计"。B16 明确写了"样本量小,统计效力低"。
这些局限不是"自我贬低",是"给读者一个正确的使用边界"。一份分析报告如果不说清适用范围,读者会误用。
10.4 每个实验都要有可复用的产出
B01 产出的是"一套已被验证的数据认知"。B02 产出的是"DWD 结构"。B03 产出的是"业务认知"。B04 产出的是"均匀认知"。B05 产出的是"头部结构认知"。B06 产出的是"页面稠密认知"。B07 产出的是"长尾认知"。
每一层都在为下一层提供输入。这些输入不只是表,还包括认知、口径、方法论。表会被覆盖,认知不会。
11. 结语
B 组实验从一份 18.6 MB 的电商用户行为日志出发,经过 16 个实验,覆盖数据治理、描述性分析、关联分群、方法论演示、建模预测五个阶段,产出了 60 多张 ADS 表、10 余张可视化图、20 多个 HQL 和 Python 脚本,以及一份关于"这份数据能做什么、不能做什么"的完整认知。
核心结论有三条:
第一,电商平台数据分析应该覆盖用户、品类、页面、会话、搜索、城市六个维度,每个维度回答不同的业务问题,不能互相替代。
第二,每个维度的分析前提都必须先验证。用户维度要验证用户差异,品类维度要验证品类分布,页面维度要验证跳转结构,会话维度要验证长度分布,搜索维度要验证词频长尾,城市维度要验证字段随机性。
第三,简单方法在合成数据、小样本、无外部标签条件下反复优于高级方法。这不是"高级方法不好",是"数据的信息量决定模型的上限"。
B 组的价值不在"发现了什么业务洞察",而在"用严格的方法确认了这份数据没有多少业务洞察,并在这个过程中沉淀了一套可复用的分析方法论"。
这份方法论可以带到任何电商数据分析任务里:先审计数据底座,再验证分析前提,再选择合适的方法,最后诚实交代局限。