数据处理详细计划(Data Processing Plan)
配合 survey_v1.2.md 使用(问卷已含 Q8b / Q9b / Q9c / Q9d)
日期:2026-04-24(V1.2 同步:2026-05-04) | 目标有效样本量:200 份(低于此则宽 CI,适合方向性解读)
一、数据回收与清洗
1.1 数据导出
从飞书问卷导出 Excel/CSV 文件,每行一个受访者。规范字段编码(分析脚本中使用的英文名)如下;飞书实际列名多为中文题干,需先经列映射表对齐(仓库内 tools/survey_pipeline/mapping.yaml)。
grade, activities, idea_freq, scene, action, outcome,
connection_exp, pain_level, opportunity_cost, current_tools,
external_capture, pain_points, review_habit, browse_pref,
accumulation_value, ai_value, feature_pref, intent, email, open_feedback
多选题在导出中的分隔:飞书当前导出为 英文逗号 + 空格(, ) 连接各完整选项;选项内部若含「,」不受影响。解析实现见 tools/survey_pipeline/encode.py。
1.2 无效数据剔除规则
| 剔除条件 | 原因 | 检测方法 |
|---|---|---|
| 填写时间 < 45秒 | 未认真阅读 | 飞书导出的时间戳字段计算差值 |
| 填写时间 > 30分钟 | 可能中途离开导致数据不可靠 | 同上 |
| 全部单选题选同一位置 | 规律性作答(直线型) | 检查所有单选答案是否选项位置完全一致 |
| Q2一个都没选 | 逻辑矛盾(必填题) | 字段为空检查 |
1.3 多选题数据拆解
多选题(Q2, Q8, Q9, Q9c, Q11)需要拆成独立二值列:
# 示例:Q2 活动类型拆解
activities_list = [
'act_paper', # 写课程论文
'act_video', # 做短视频/自媒体
'act_novel', # 写小说/剧本
'act_art', # 设计/绘画/摄影
'act_competition', # 参加比赛
'act_research', # 科研/论文
'act_ip', # 经营IP/品牌
'act_chat', # 日常讨论
'act_browse', # 刷视频产生灵感
'act_music', # 写歌/作曲
'act_other' # 其他
]
# 每列值为 0 或 1
1.4 序数编码
| 字段 | 编码规则 |
|---|---|
idea_freq | 几乎每天=4, 每周好几次=3, 偶尔=2, 很少=1 |
pain_level | 影响了项目=3, 挺可惜=2, 无所谓=1, 没想过=0 |
ai_value | 非常有帮助=4, 可以试试=3, 不确定=2, 没什么用=1 |
intent | 立刻下载=4, 有空看看=3, 先观望=2, 不需要=1 |
external_capture | 加上批注=4, 经常保存=3, 偶尔保存=2, 很少=1 |
review_habit | 定期回顾=4, 偶尔翻到=3, 几乎不看=2, 想看找不到=1 |
1.5 派生变量计算
| 派生变量 | 计算规则 | 用途 |
|---|---|---|
has_pain | Q7 ∈ {可惜, 影响了项目} → 1, 否则 → 0 | 二值化痛苦程度 |
is_creator | Q2 选了 小说/自媒体/设计/IP/音乐 中任一 → 1 | 识别创作型用户 |
is_academic | Q2 选了 论文/科研/比赛 中任一 → 1 | 识别学术型用户 |
unrecorded | Q5 ∈ {没记录, 忘了} → 1 | 识别未被满足用户 |
idea_dead | Q6 ∈ {没深入, 没打开看, 想不起来} → 1 | 灵感死亡率 |
has_email | Q13 不为空 → 1 | 邮箱留存标记 |
high_intent | Q12 = 立刻下载 → 1 | 高意向用户标记 |
is_collector | Q8b ∈ {经常保存, 加上批注} → 1 | 识别内容收集型用户(V1.2) |
has_review_need | Q9b ∈ {定期回顾, 想看但找不到} → 1 | 识别有回顾需求的用户(V1.2) |
prefers_timeline | Q9c 选了"按时间线翻看" → 1 | 时间线视图需求(V1.2) |
prefers_ai_remind | Q9c 选了"AI帮我推荐" → 1 | AI 主动推送需求(V1.2) |
prefers_semantic_browse | Q9c 选了「相关旧想法自动展示」→ browse_related | Garden 语义关联视图(V1.2 实现名) |
sees_accumulation_value | Q9d ∈ {有过拼图式成果, 想过但做不到} → 1(仅对 Q3 高频路径有定义) | "复利 / 涌现价值"(V1.2) |
feat_local_feat_cloud_conflict | Q11 同时命中「本地」与「云同步」→ 1 | 架构决策:默认本地 + 可选同步 |
条件题报告分母:须在报告中同时给出 N_valid 与条件子样本 n(如 Q7b、Q9d),避免将条件题百分比误用全样本作分母。
二、描述统计分析
2.1 基础频次表(全部题目)
对每道题生成频次表和百分比分布。可在飞书问卷后台直接查看,也可导出后用 Excel 透视表生成。
2.2 核心指标计算
import pandas as pd
import numpy as np
df = pd.read_csv('docs/requirements/analysis_outputs/survey_encoded_clean.csv') # 清洗编码后(或由 run_all.py 生成)
# ===== 六大核心指标 =====
# 1. 灵感死亡率
idea_dead_rate = df['idea_dead'].mean()
# 2. 痛苦率
pain_rate = df['has_pain'].mean()
# 3. 竞品不满率(Q9不含"没有不满"的比例)
no_complaint = df['pain_points'].str.contains('没有不满')
dissatisfied_rate = 1 - no_complaint.mean()
# 4. AI孵化价值感知率(Q10选前两项)
ai_positive = df['ai_value'].isin([3, 4]).mean()
# 5. 高意向率
high_intent_rate = df['high_intent'].mean()
# 6. 邮箱留存率
email_rate = df['has_email'].mean()
print(f"""
====== 核心指标看板 ======
灵感死亡率: {idea_dead_rate:.1%}
痛苦率: {pain_rate:.1%}
竞品不满率: {dissatisfied_rate:.1%}
AI价值感知率: {ai_positive:.1%}
高意向率: {high_intent_rate:.1%}
邮箱留存率: {email_rate:.1%}
""")
2.4 V1.2 扩展描述指标(报告必含)
| 指标 | 定义 | 分母 |
|---|---|---|
| 高外部捕获率 | Q8b 序数量 ∈ {3,4}(经常保存 ∪ 批注) | N_valid |
| 回顾需求 | review_habit 频次表 + has_review_need 比例 | N_valid |
| 浏览偏好多响应 | Q9c 各 browse_* slug 命中率 | N_valid |
| 积累涌现感知 | Q9d 分布 + sees_accumulation_value | 仅 Q3 高频且实际作答 Q9d 者 |
| 本地∩云矛盾率 | feat_local_feat_cloud_conflict.mean() | N_valid |
2.3 置信区间计算
对核心比例指标计算95%置信区间,评估结论的可靠性:
from statsmodels.stats.proportion import proportion_confint
n = len(df)
for name, rate in [('灵感死亡率', idea_dead_rate),
('痛苦率', pain_rate),
('高意向率', high_intent_rate)]:
count = int(rate * n)
ci_low, ci_high = proportion_confint(count, n, alpha=0.05, method='wilson')
print(f"{name}: {rate:.1%} 95%CI: [{ci_low:.1%}, {ci_high:.1%}]")
# 解读示例:
# 痛苦率: 45.0% 95%CI: [38.2%, 51.8%]
# → 真实痛苦率在38.2%~51.8%之间,下限>30%即可认为需求存在
三、交叉分析与统计检验
3.1 交叉分析一:活动类型 × 痛苦程度
假设:创作型用户比非创作型用户更痛苦。
from scipy.stats import chi2_contingency
# 构建列联表
ct = pd.crosstab(df['is_creator'], df['has_pain'])
print("列联表:")
print(ct)
# 卡方检验
chi2, p, dof, expected = chi2_contingency(ct)
print(f"\nχ² = {chi2:.3f}, p = {p:.4f}, df = {dof}")
if p < 0.05:
print("✅ 显著:创作型用户的痛苦程度与非创作型有显著差异")
else:
print("⚠️ 不显著:两组痛苦程度无显著差异")
# 效应量(Cramér's V)
import math
n_total = ct.sum().sum()
cramers_v = math.sqrt(chi2 / (n_total * (min(ct.shape) - 1)))
print(f"Cramér's V = {cramers_v:.3f}")
# V < 0.1 弱, 0.1-0.3 中等, > 0.3 强
3.2 交叉分析二:灵感频率 × 使用意向
假设:灵感越频繁的用户,使用意向越高。
from scipy.stats import spearmanr
# Spearman秩相关(两个序数变量)
corr, p = spearmanr(df['idea_freq'], df['intent'])
print(f"Spearman r = {corr:.3f}, p = {p:.4f}")
# 解读:
# r > 0.3 且 p < 0.05 → 正相关显著,高频用户更愿意使用
# r < 0.1 → 无相关,灵感频率不影响使用意向
3.3 交叉分析三:痛苦程度 × 使用意向
假设:越痛苦的用户越愿意立刻下载。
corr, p = spearmanr(df['pain_level'], df['intent'])
print(f"痛苦程度 × 使用意向: r = {corr:.3f}, p = {p:.4f}")
3.4 交叉分析四:用户类型 × 功能偏好
找出不同活动类型的用户分别最在意什么功能:
# 对每个活动类型,统计功能偏好分布
features = ['feat_speed', 'feat_ai', 'feat_link', 'feat_local',
'feat_cloud', 'feat_widget', 'feat_minimal',
'feat_action', 'feat_voice']
for user_type in ['is_creator', 'is_academic']:
subset = df[df[user_type] == 1]
print(f"\n=== {user_type} 用户功能偏好 ===")
for feat in features:
print(f" {feat}: {subset[feat].mean():.1%}")
3.5(V1.2)外部捕获 × 使用意向
corr, p = spearmanr(df['external_capture_ord'], df['intent_ord'])
# 验证「保存外部启发内容」动机与下载意向是否同向
3.6 Q11互斥检测:本地 vs 云同步
# 检测同时选了"本地"和"云同步"的矛盾样本
conflict = df[(df['feat_local'] == 1) & (df['feat_cloud'] == 1)]
conflict_rate = len(conflict) / len(df)
print(f"本地/云端矛盾样本: {len(conflict)}份 ({conflict_rate:.1%})")
if conflict_rate > 0.15:
print("⚠️ 超过15%用户选择矛盾,说明用户自己也未想清楚")
print("→ 产品策略建议:默认本地,可选云同步")
四、多响应分析(多选题专用)
多选题不能直接用卡方检验(因为每个人可以多选),需要用多响应频次分析:
# Q9 痛点多选分析
pain_cols = ['pp_friction', 'pp_no_review', 'pp_scattered',
'pp_cant_find', 'pp_no_develop', 'pp_privacy', 'pp_none']
pain_summary = df[pain_cols].sum().sort_values(ascending=False)
pain_pct = pain_summary / len(df) * 100
print("=== 痛点排名(可多选) ===")
for name, pct in pain_pct.items():
bar = '█' * int(pct / 2)
print(f" {name:20s} {pct:5.1f}% {bar}")
五、高意向用户画像分析
从数据中提取最有价值的用户群像:
# 筛选高意向用户(Q12=立刻下载 且 Q7=有痛感)
vip = df[(df['high_intent'] == 1) & (df['has_pain'] == 1)]
print(f"高意向+高痛感用户: {len(vip)}人 ({len(vip)/len(df):.1%})")
print(f"\n年级分布:")
print(vip['grade'].value_counts(normalize=True).map('{:.1%}'.format))
print(f"\n活动类型分布:")
for col in activities_list:
if col in vip.columns:
print(f" {col}: {vip[col].mean():.1%}")
print(f"\n功能偏好TOP3:")
feat_rank = vip[features].mean().sort_values(ascending=False).head(3)
for feat, pct in feat_rank.items():
print(f" {feat}: {pct:.1%}")
六、决策矩阵:数据→产品判断
6.1 总决策流程图
Step 1: 灵感死亡率 > 60%?
├── 是 → 痛点存在,继续
└── 否 → ⚠️ 重新审视"灵感丢失"是否是真问题
Step 2: 痛苦率 > 35%?
├── 是 → 需求够强,继续
└── 否 → 考虑聚焦到子群体(看交叉分析哪类用户最痛)
Step 3: AI价值感知 > 50%?
├── 是 → AI孵化方向可行
└── 否 → 需要重新设计"孵化"的表达方式或价值主张
Step 4: 高意向率 > 20%?
├── 是 → ✅ 可以开始做MVP
└── 否 → 产品吸引力不够,回到价值主张
Step 5: 看功能偏好排名 → 决定MVP优先做什么
Step 6: 看本地vs云端选择 → 决定技术架构
Step 7: 看Q6b关联体验 → 决定"语义关联"功能的优先级
Step 8: 看Q7b机会成本 → 为策划文档准备数据弹药
6.2 数据→策划文档的转化示例
调研报告中可以这样写:
"我们调研了XXX名在校大学生,发现:
- XX% 的人承认灵感在记录后没有被继续发展
- XX% 的人对此感到遗憾,其中 XX% 认为丢失的灵感本可以变成项目或作品
- 最常用的记录方式是手机备忘录(XX%),但 XX% 的用户表示「记了就不会再看」
- XX% 的受访者认为AI即时反馈对他们有帮助
- 用户最看重的三个特性依次是:①XX ②XX ③XX
- XX% 的人表示愿意立刻试用这样的工具,XX人主动留下了内测邮箱"
七、分析工具与环境搭建
7.1 推荐方案
方案A(最简单):
飞书问卷后台 → 看基础分布
导出Excel → 手动做交叉表
适合:只要描述统计,不做检验
方案B(推荐):
飞书导出 → Python脚本处理
依赖:pandas, scipy, statsmodels, matplotlib
适合:完整分析+可复现+可出图
方案C(零代码替代):
飞书导出 → SPSSAU.com(在线统计工具)
适合:不想写代码但需要检验结果
7.2 Python环境安装
pip install pandas openpyxl scipy statsmodels matplotlib seaborn
7.3 完整分析脚本模板
数据回收后,我可以直接生成一份完整的Python分析脚本,输入Excel文件即输出:
- 核心指标看板(含置信区间)
- 全部交叉分析(含卡方/Spearman检验)
- 多响应频次图
- 高意向用户画像
- 可视化图表(柱状图+热力图)
可复现流水线(已实现):在仓库根目录执行 python tools/survey_pipeline/run_all.py,产出 docs/requirements/analysis_outputs/survey_encoded_clean.csv、figures/*.png、survey_report_full.md。
版本记录
| 版本 | 日期 | 内容 |
|---|---|---|
| V1.0 | 2026-04-24 | 初始数据分析框架 |
| V1.1 | 2026-04-24 | 完整处理计划,含Python代码、决策矩阵、报告模板 |
| V1.2 | 2026-05-04 | 对齐 survey_v1.2:飞书列映射、多选分隔说明、扩展 KPI/检验、沉淀 tools/survey_pipeline 与完整报告路径 |