本目录包含电商用户行为数据分析项目的 7个核心SQL分析脚本 和 1个数据库初始化脚本,基于阿里云天池电商用户行为数据集(2017-11-25 至 2017-12-03,共9天),使用 DuckDB 方言编写,兼容标准 SQL。
| 序号 | 文件名 | 用途 | 核心技术 |
|---|---|---|---|
| 1 | 01_database_setup.sql |
创建表结构、索引、视图 | DDL + 复合索引设计 |
| 2 | 02_user_retention.sql |
新增用户与次日/3日/7日留存率 | 自连接 + 窗口函数(ROW_NUMBER, LAG) |
| 3 | 03_conversion_funnel.sql |
用户行为转化漏斗与路径分析 | CTE + 条件聚合 + RANK |
| 4 | 04_rfm_model.sql |
用户RF分层(Recency + Frequency) | NTILE分箱 + 用户生命周期(LAG/LEAD) |
| 5 | 05_ab_test_framework.sql |
A/B测试分组与统计量计算 | 方差/标准差SQL实现 + 实验设计 |
| 6 | 06_anomaly_detection.sql |
核心指标监控与异常检测 | 3σ原则 + 移动平均窗口函数 |
| 7 | 07_product_analysis.sql |
热销/转化/长尾商品分析 | RANK/DENSE_RANK + 关联规则初步 |
| 8 | README.md |
本说明文档 | — |
# 一键执行所有 SQL 脚本(自动创建 DuckDB 数据库并导入 CSV)
python scripts/run_sql.py
# 或指定数据库路径
python scripts/run_sql.py --db data/processed/analytics.duckdb注意:
run_sql.py会自动按顺序执行sql/下所有.sql文件,包括建表、导入数据、创建索引和视图。
# 运行单个脚本(通过 DuckDB CLI 或 Python)
duckdb data/processed/analytics.duckdb < sql/02_user_retention.sql
# 将结果输出到文件
duckdb data/processed/analytics.duckdb < sql/03_conversion_funnel.sql > reports/conversion_funnel.txt
# 以CSV格式输出(便于Python/Pandas读取)
duckdb -csv data/processed/analytics.duckdb < sql/04_rfm_model.sql > reports/rfm_model.csv用途: 搭建数据分析基础设施。
核心设计:
- 主表:
user_behavior存储全部用户行为记录 - 索引策略: 覆盖高频查询维度(user_id, item_id, behavior_type, date, timestamp),并增加复合索引加速日报和留存查询
- 视图层:
v_daily_metrics: 每日DAU、PV、购买量、转化率v_user_daily_summary: 用户-日期粒度行为汇总v_item_metrics: 商品核心指标v_hourly_distribution: 时段行为分布v_user_first_active: 用户首次活跃日期(新增用户计算基础)
运行时机: 数据导入后 首先运行。
用途: 计算用户留存率,评估产品粘性。
关键查询:
- 每日新增用户: 通过
MIN(date)找到用户首日,按日期汇总 - 留存率(自连接版): 将用户首日与后续活跃日期关联,计算
day_diff = 1/3/7的留存比例 - 留存矩阵(窗口函数版): 使用
ROW_NUMBER()标记用户活跃序列,生成 cohort 留存表 - 留存趋势: 使用
LAG()对比前一日留存率,计算变化幅度
输出指标:
new_users: 当日新增用户数retention_d1_pct: 次日留存率(%)retention_d3_pct: 3日留存率(%)retention_d7_pct: 7日留存率(%)
用途: 构建用户行为转化漏斗,识别转化瓶颈。
关键查询:
- 全量漏斗: 统计有过
pv/fav/cart/buy行为的独立用户数,计算各环节占比 - 相邻环节转化:
pv→fav,pv→cart,fav→buy,cart→buy的精细转化率 - 转化路径分析: 将用户分类为
直接购买、收藏后购买、加购后购买、收藏+加购后购买、未购买 - 日期/时段漏斗: 使用
LAG()对比前一日转化率变化;使用RANK()找出转化率最高的时段
业务洞察:
- 哪一步流失最严重?
- 用户更倾向于收藏还是加购?
- 哪个时段的转化效率最高?
用途: 用户价值分层(因无金额字段,简化为 RF模型)。
关键定义:
- Recency (R): 用户最近一次行为距数据集最后一天(2017-12-03)的天数,天数越小越活跃
- Frequency (F): 用户总行为次数 + 购买次数
技术实现:
- 使用
NTILE(5)窗口函数将用户按 Recency 和 Frequency 分为5档 - R_score 反转(
6 - NTILE(...)),确保最近活跃的用户得高分 - 综合
rf_score将用户分为6层:高价值用户(R≥4, F≥4)活跃用户(R≥3, F≥3)新用户/回流用户(R≥3, F≤2)沉睡用户(R≤2, F≥3)流失风险用户(R≤2, F≤2)一般用户
附加分析:
- 用户生命周期状态迁移(首次活跃 / 连续活跃 / 回流 / 末次活跃)
- 各分层贡献的购买占比
用途: 模拟A/B测试场景,为统计检验准备数据。
实验设计:
- 假设: 2017-12-01 上线新功能
- 分组:
user_id % 2 = 0→ 对照组(control),user_id % 2 = 1→ 实验组(treatment) - 观察期: 2017-12-01 至 2017-12-03
- 对照期: 2017-11-25 至 2017-11-30(用于检验分组同质性)
输出内容:
- 实验前基线: 两组的均值、转化率、标准差,确保分组无偏
- 实验后对比: 两组在观察期的核心指标差异
- 用户级明细: 每个用户的
pre_conversion_rate,post_conversion_rate,conversion_diff(可直接导出给Python做 t检验 / DID分析) - 统计量汇总: 样本量
n、均值mean、方差variance、标准差std_dev(可直接代入 z检验/t检验公式)
与Python衔接:
# 导出用户级明细给Python做统计检验
duckdb -csv data/processed/analytics.duckdb < sql/05_ab_test_framework.sql > data/ab_test_users.csv用途: 监控每日核心指标,定位异常波动。
检测方法:
- 3σ原则(全局统计): 计算所有日期的均值和标准差,标记
|z-score| > 2的日期 - 移动平均法(时间序列): 使用窗口函数
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING计算前3日移动平均和标准差,检测当日偏离 - 小时级异常: 计算每个小时在所有日期中的统计分布,定位具体异常时段
异常归因:
- 周末效应(2017-11-25/26, 12-02/03 为周末)
- 环比变化幅度
- 工作日大幅波动预警
输出指标:
dau_zscore,pv_zscore,rate_zscore: 各指标的标准化得分anomaly_flag: 异常类型标签possible_reason: 可能原因推测
用途: 商品与类目层面的运营分析。
分析维度:
- 热销商品TOP20: 按
buy_count排名,使用RANK()和DENSE_RANK() - 热销类目TOP10: 类目购买量、转化率、SKU数、人均购买量
- 高转化商品TOP20: 过滤
pv_count >= 50的商品,按转化率排名(识别潜力爆款) - 长尾商品分析: 定义
高点击零转化、高点击低转化、流量浪费型商品,识别运营优化点 - 类目效率对比: 与全局平均转化率对比,使用窗口函数分档(优秀/良好/一般/低效)
- 商品关联初步: 自连接找出被同一用户共同购买的商品对(关联规则基础)
| 技术点 | 应用脚本 | 说明 |
|---|---|---|
| CTE (WITH子句) | 全部 | 提高可读性,模块化复杂查询 |
| 窗口函数 | 02/03/04/06/07 | ROW_NUMBER, RANK, DENSE_RANK, NTILE, LAG, LEAD, 移动平均 |
| 自连接 | 02/05/07 | 留存分析、A/B分组、商品关联 |
| 条件聚合 | 全部 | SUM(CASE WHEN ... THEN 1 ELSE 0 END) 实现透视统计 |
| 统计量SQL实现 | 05/06 | 均值、方差、标准差、Z-score 纯SQL计算 |
| 视图封装 | 01 | 将常用指标抽象为视图,简化后续查询 |
-
DuckDB 方言特性:
- 标准差使用
STDDEV_SAMP()或STDDEV_POP()原生函数 - 日期计算使用
DATE_DIFF('day', d1, d2)函数 NTILE()、ROW_NUMBER()、LAG()、LEAD()等窗口函数完全支持
- 标准差使用
-
数据导入检查:
-- 导入后执行快速验证 SELECT COUNT(*) FROM user_behavior; SELECT MIN(date), MAX(date) FROM user_behavior; SELECT behavior_type, COUNT(*) FROM user_behavior GROUP BY behavior_type;
-
性能建议:
- 数据量较大时,确保
01_database_setup.sql中的索引已创建 - 频繁使用的查询建议基于视图
v_daily_metrics、v_item_metrics进行二次开发
- 数据量较大时,确保
- 将
05_ab_test_framework.sql的用户级明细导出为CSV,使用Python的scipy.stats进行正式的 t检验 / 卡方检验 - 将
04_rfm_model.sql的分层结果与03_conversion_funnel.sql结合,分析不同价值用户的转化路径差异 - 将
06_anomaly_detection.sql的日报指标接入定时任务,实现自动化监控
数据集: 阿里云天池 - 电商用户行为数据集
时间范围: 2017-11-25 至 2017-12-03
本模块使用 DuckDB 方言编写。迁移至其他数据库时,主要函数映射如下:
| 功能 | DuckDB | MySQL | Hive/Spark SQL |
|---|---|---|---|
| 日期差(天数) | DATE_DIFF('day', d1, d2) |
DATEDIFF(d2, d1) |
datediff(d2, d1) |
| 分位数分箱 | NTILE(5) OVER (...) |
NTILE(5) OVER (...) |
NTILE(5) OVER (...) |
| 标准差 | STDDEV_SAMP() / STDDEV_POP() |
STD() |
stddev_samp() |
| 日期字符串 | 'YYYY-MM-DD' |
'YYYY-MM-DD' |
'YYYY-MM-DD' |
| 自连接 | 支持 | 支持 | 支持 |
| 窗口函数 | ROW_NUMBER, LAG, LEAD, RANK |
同上 | 同上 |
| CSV 导入 | read_csv_auto() |
LOAD DATA |
spark.read.csv() |
生产环境建议通过 dbt 的
target.type适配不同数据库方言,或使用 dbt-duckdb 作为零配置 OLAP 层。