Update README and project cleanup

This commit is contained in:
inkling
2026-04-08 14:52:09 +08:00
commit fafd267288
71 changed files with 14865 additions and 0 deletions

190
analyze_issue.md Normal file
View File

@@ -0,0 +1,190 @@
# 🔍 数据质量分析报告
## 问题描述
选择了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)