# 🔍 数据质量分析报告 ## 问题描述 选择了11个标签组合后,转化率变成了 **0%**: - 母亲主导 - 一线城市 - 高收入 (>5w) - 独生子女 - 初中阶段 - 初一 (7年级) - 培优拔高 - 数学薄弱 - 重点/示范校 - 体制内/国企 - **日活用户** ← 这个导致了 0 人 --- ## 分析结果 ### ✅ 数据不是质量太低的问题 实际上,数据质量还不错: - 总用户数:50,000 人 - 前 10 个条件交集:**4 人** ✅ - 加上第 11 个条件(日活用户):**0 人** ❌ ### 🎯 真实原因 **不是数据太少,而是标签相关性设计不够合理** 这4个符合前10个条件的用户,他们的活跃特征分别是: 1. 用户 16727:**考前突击** 2. 用户 20002:**沉默用户** 3. 用户 28755:**周末活跃** 4. 用户 29105:**考前突击** **没有一个是"日活用户"!** --- ## 根本问题 ### 当前种子数据生成逻辑(seed.js 第 363 行) ```javascript // 活跃特征 (同时存在两项的概率加大) 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% ])); ``` ### 问题点 1. **日活用户比例太低**(15%) 2. **活跃特征与其他属性无相关性** - 逻辑上,"高收入 + 培优拔高 + 重点学校"的家长**应该更可能是日活用户** - 但代码中,活跃特征是完全随机分配的 3. **没有考虑用户画像的合理性** - 体制内/国企 + 全职妈妈 → 更可能日活 - 高收入 + 培优拔高 → 更可能付费+日活 - 沉默用户不应该同时是付费会员 --- ## 改进方案 ### 方案 1:提高日活用户比例(快速) 修改权重: ```javascript 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:基于用户画像的智能分配(推荐) ```javascript // 活跃特征 - 基于用户画像智能分配 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:重新生成数据(最佳) 运行改进后的种子脚本: ```bash 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分钟) 重新生成种子数据,提高日活用户比例和相关性 ### 长期方案 1. 添加更多真实的用户行为数据 2. 基于实际业务逻辑设计标签相关性 3. 定期分析标签组合的覆盖情况 4. 对于极端稀少的组合,可以在 UI 上给出提示 --- ## 结论 ✅ **这不是数据质量问题**,数据生成逻辑运行正常 ⚠️ **这是标签相关性设计问题**,需要优化种子数据生成算法 🎯 **解决方案**:重新生成数据,让标签之间有更合理的相关性 生成时间: $(date)