5.0 KiB
5.0 KiB
🔍 数据质量分析报告
问题描述
选择了11个标签组合后,转化率变成了 0%:
- 母亲主导
- 一线城市
- 高收入 (>5w)
- 独生子女
- 初中阶段
- 初一 (7年级)
- 培优拔高
- 数学薄弱
- 重点/示范校
- 体制内/国企
- 日活用户 ← 这个导致了 0 人
分析结果
✅ 数据不是质量太低的问题
实际上,数据质量还不错:
- 总用户数:50,000 人
- 前 10 个条件交集:4 人 ✅
- 加上第 11 个条件(日活用户):0 人 ❌
🎯 真实原因
不是数据太少,而是标签相关性设计不够合理
这4个符合前10个条件的用户,他们的活跃特征分别是:
- 用户 16727:考前突击
- 用户 20002:沉默用户
- 用户 28755:周末活跃
- 用户 29105:考前突击
没有一个是"日活用户"!
根本问题
当前种子数据生成逻辑(seed.js 第 363 行)
// 活跃特征 (同时存在两项的概率加大)
tags.push(weightedPick([
{ value: 'eng_active_daily', weight: 15 }, // 只有 15% 概率
{ value: 'eng_weekend', weight: 35 }, // 35%
{ value: 'eng_exam', weight: 25 }, // 25%
{ value: 'eng_dormant', weight: 25 } // 25%
]));
问题点
-
日活用户比例太低(15%)
-
活跃特征与其他属性无相关性
- 逻辑上,"高收入 + 培优拔高 + 重点学校"的家长应该更可能是日活用户
- 但代码中,活跃特征是完全随机分配的
-
没有考虑用户画像的合理性
- 体制内/国企 + 全职妈妈 → 更可能日活
- 高收入 + 培优拔高 → 更可能付费+日活
- 沉默用户不应该同时是付费会员
改进方案
方案 1:提高日活用户比例(快速)
修改权重:
tags.push(weightedPick([
{ value: 'eng_active_daily', weight: 30 }, // 提高到 30%
{ value: 'eng_weekend', weight: 30 },
{ value: 'eng_exam', weight: 25 },
{ value: 'eng_dormant', weight: 15 } // 降低沉默用户
]));
方案 2:基于用户画像的智能分配(推荐)
// 活跃特征 - 基于用户画像智能分配
let engWeights;
// 高收入 + 培优拔高 + 重点学校 → 大概率日活
if ((actualIncome === 'inc_high' || actualIncome === 'inc_mid_high')
&& tags.includes('sp_top')) {
engWeights = [
{ value: 'eng_active_daily', weight: 40 }, // 40%
{ value: 'eng_weekend', weight: 30 },
{ value: 'eng_exam', weight: 20 },
{ value: 'eng_dormant', weight: 10 }
];
}
// 全职妈妈 → 高概率日活
else if (tags.includes('pj_fulltime')) {
engWeights = [
{ value: 'eng_active_daily', weight: 50 }, // 50%
{ value: 'eng_weekend', weight: 25 },
{ value: 'eng_exam', weight: 15 },
{ value: 'eng_dormant', weight: 10 }
];
}
// 体制内/国企 → 中等日活概率
else if (tags.includes('pj_gov')) {
engWeights = [
{ value: 'eng_active_daily', weight: 25 },
{ value: 'eng_weekend', weight: 35 },
{ value: 'eng_exam', weight: 25 },
{ value: 'eng_dormant', weight: 15 }
];
}
// 其他情况
else {
engWeights = [
{ value: 'eng_active_daily', weight: 15 },
{ value: 'eng_weekend', weight: 35 },
{ value: 'eng_exam', weight: 30 },
{ value: 'eng_dormant', weight: 20 }
];
}
tags.push(weightedPick(engWeights));
方案 3:重新生成数据(最佳)
运行改进后的种子脚本:
npm run seed
数据统计
逐步筛选过程
| 步骤 | 添加条件 | 剩余人数 | 占比 |
|---|---|---|---|
| 1 | 母亲主导 | 30,006 | 60.01% |
| 2 | + 一线城市 | 4,492 | 8.98% |
| 3 | + 高收入 | 1,390 | 2.78% |
| 4 | + 独生子女 | 804 | 1.61% |
| 5 | + 初中阶段 | 483 | 0.97% |
| 6 | + 初一 | 174 | 0.35% |
| 7 | + 培优拔高 | 85 | 0.17% |
| 8 | + 数学薄弱 | 34 | 0.07% |
| 9 | + 重点学校 | 11 | 0.02% |
| 10 | + 体制内/国企 | 4 | 0.008% |
| 11 | + 日活用户 | 0 | 0% ❌ |
两两标签相关性(Jaccard 相似度)
| 标签对 | 交集人数 | 相似度 |
|---|---|---|
| 母亲主导 ∩ 一线城市 | 4,492 | 13.61% |
| 一线城市 ∩ 高收入 | 2,319 | 20.76% |
| 高收入 ∩ 独生子女 | 3,315 | 10.98% |
| 独生子女 ∩ 初中阶段 | 16,633 | 37.80% |
| 初中阶段 ∩ 初一 | 11,964 | 35.50% |
建议
短期方案(5分钟)
重新生成种子数据,提高日活用户比例和相关性
长期方案
- 添加更多真实的用户行为数据
- 基于实际业务逻辑设计标签相关性
- 定期分析标签组合的覆盖情况
- 对于极端稀少的组合,可以在 UI 上给出提示
结论
✅ 这不是数据质量问题,数据生成逻辑运行正常 ⚠️ 这是标签相关性设计问题,需要优化种子数据生成算法 🎯 解决方案:重新生成数据,让标签之间有更合理的相关性
生成时间: $(date)