Day 1
【实战1.1】DEX用户分群画像:从数据到产品洞察
用Dune SQL对Uniswap用户进行分群分析,理解不同用户层级的行为差异,输出产品策略建议
2025-01-24
实战项目Dune用户分群DEX数据分析产品洞察
实战项目 1.1:DEX 用户分群画像
项目信息
项目编号:1.1
所属方向:交易行为分析
难度:⭐⭐ 入门
预计时间:3-4小时
前置技能:Dune SQL 基础(Day 12-13)项目目标
> 通过链上数据对 DEX 用户进行分群,理解不同用户的行为差异,输出可落地的产品策略
产出清单:
├── ✅ Dune Dashboard:用户分群可视化
├── ✅ 产品洞察报告(1页)
└── ✅ 用户分层体验优化 PRDTask 1:用户分群查询
核心 SQL
-- 项目1.1 Task 1: Uniswap 用户分群分析
-- 目标:按交易量对用户分层,统计各层特征
WITH user_trades AS (
SELECT
taker as user_address,
COUNT(*) as trade_count,
SUM(amount_usd) as total_volume,
COUNT(DISTINCT DATE_TRUNC('day', block_time)) as active_days,
MIN(block_time) as first_trade,
MAX(block_time) as last_trade,
AVG(amount_usd) as avg_trade_size
FROM dex.trades
WHERE
block_time >= NOW() - INTERVAL '30' DAY
AND project = 'uniswap'
AND blockchain = 'ethereum'
AND amount_usd > 0
GROUP BY taker
)
SELECT
CASE
WHEN total_volume >= 1000000 THEN '🐋 Whale (>$1M)'
WHEN total_volume >= 100000 THEN '🦈 Large ($100K-$1M)'
WHEN total_volume >= 10000 THEN '🐟 Medium ($10K-$100K)'
WHEN total_volume >= 1000 THEN '🦐 Small ($1K-$10K)'
ELSE '🔬 Micro (<$1K)'
END as user_tier,
COUNT(*) as user_count,
ROUND(SUM(total_volume), 0) as tier_total_volume,
ROUND(100.0 * SUM(total_volume) / SUM(SUM(total_volume)) OVER(), 2) as volume_pct,
ROUND(AVG(trade_count), 1) as avg_trades,
ROUND(AVG(active_days), 1) as avg_active_days,
ROUND(AVG(avg_trade_size), 0) as avg_trade_size
FROM user_trades
GROUP BY 1
ORDER BY tier_total_volume DESCSQL 要点解析
关键技术点:
═══════════════════════════════════════════════════════════
1. WITH AS (CTE)
└── 先计算每个用户的聚合数据,再分组
2. CASE WHEN 分层
└── 按交易量划分5个层级
└── 阈值设定:$1M / $100K / $10K / $1K
3. 窗口函数计算占比
└── SUM(...) OVER() 计算总量
└── 用于计算各层级的交易量占比
4. 多维度特征
└── 交易次数、活跃天数、平均单笔金额
└── 帮助理解不同层级用户的行为模式
═══════════════════════════════════════════════════════════Task 2:分群特征深度分析
留存分析 SQL
-- Task 2: 各分群的周留存率
WITH user_first_week AS (
SELECT
taker as user_address,
DATE_TRUNC('week', MIN(block_time)) as cohort_week,
SUM(amount_usd) as first_week_volume
FROM dex.trades
WHERE
block_time >= NOW() - INTERVAL '60' DAY
AND project = 'uniswap'
AND blockchain = 'ethereum'
GROUP BY taker
),
user_tiers AS (
SELECT
user_address,
cohort_week,
CASE
WHEN first_week_volume >= 100000 THEN 'Large+'
WHEN first_week_volume >= 10000 THEN 'Medium'
ELSE 'Small'
END as tier
FROM user_first_week
),
weekly_activity AS (
SELECT
t.taker as user_address,
DATE_TRUNC('week', t.block_time) as activity_week
FROM dex.trades t
WHERE
block_time >= NOW() - INTERVAL '60' DAY
AND project = 'uniswap'
AND blockchain = 'ethereum'
GROUP BY 1, 2
)
SELECT
ut.tier,
ut.cohort_week,
COUNT(DISTINCT ut.user_address) as cohort_size,
COUNT(DISTINCT CASE WHEN wa.activity_week = ut.cohort_week + INTERVAL '1' WEEK
THEN ut.user_address END) as week1_retained,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN wa.activity_week = ut.cohort_week + INTERVAL '1' WEEK
THEN ut.user_address END) / COUNT(DISTINCT ut.user_address), 1) as week1_retention_pct
FROM user_tiers ut
LEFT JOIN weekly_activity wa ON ut.user_address = wa.user_address
GROUP BY 1, 2
ORDER BY ut.cohort_week DESC, ut.tier行为模式分析 SQL
-- Task 2: 各分群的交易行为特征
WITH user_behavior AS (
SELECT
taker as user_address,
SUM(amount_usd) as total_volume,
COUNT(*) as trade_count,
COUNT(DISTINCT token_bought_symbol) as unique_tokens_bought,
COUNT(DISTINCT DATE_TRUNC('day', block_time)) as active_days,
AVG(amount_usd) as avg_trade_size,
STDDEV(amount_usd) as trade_size_stddev,
MAX(block_time) - MIN(block_time) as trading_span
FROM dex.trades
WHERE
block_time >= NOW() - INTERVAL '30' DAY
AND project = 'uniswap'
AND blockchain = 'ethereum'
AND amount_usd > 0
GROUP BY taker
)
SELECT
CASE
WHEN total_volume >= 100000 THEN 'Large+ (>$100K)'
WHEN total_volume >= 10000 THEN 'Medium ($10K-$100K)'
WHEN total_volume >= 1000 THEN 'Small ($1K-$10K)'
ELSE 'Micro (<$1K)'
END as tier,
COUNT(*) as users,
ROUND(AVG(trade_count), 1) as avg_trades,
ROUND(AVG(unique_tokens_bought), 1) as avg_tokens,
ROUND(AVG(active_days), 1) as avg_active_days,
ROUND(AVG(avg_trade_size), 0) as avg_trade_size,
ROUND(AVG(EXTRACT(DAY FROM trading_span)), 1) as avg_span_days
FROM user_behavior
GROUP BY 1
ORDER BY MIN(total_volume) DESCTask 3:产品策略建议
分群特征总结
用户分群画像
═══════════════════════════════════════════════════════════
🐋 Whale(>$1M)
├── 特征:高频交易、多币种、长期活跃
├── 需求:低滑点、大额交易支持、API接入
├── 策略:VIP服务、专属客服、手续费折扣
└── 占比:<0.1%用户,>50%交易量
🦈 Large($100K-$1M)
├── 特征:中高频、策略性交易、留存高
├── 需求:高级图表、限价单、组合交易
├── 策略:Pro版功能、社区特权
└── 占比:~1%用户,~30%交易量
🐟 Medium($10K-$100K)
├── 特征:周活跃、尝试新币、价格敏感
├── 需求:Gas优化、新币发现、滑点保护
├── 策略:Gas补贴活动、空投资格
└── 占比:~5%用户,~15%交易量
🦐 Small($1K-$10K)
├── 特征:月活跃、跟风交易、易流失
├── 需求:简单界面、教程引导、小额友好
├── 策略:新手任务、社区引导
└── 占比:~20%用户,~4%交易量
🔬 Micro(<$1K)
├── 特征:尝试性、单次交易、高流失
├── 需求:零门槛、快速上手
├── 策略:简化流程、不投入太多资源
└── 占比:~75%用户,<1%交易量
═══════════════════════════════════════════════════════════产品优化 PRD 框架
## 用户分层体验优化 PRD
### 背景
通过链上数据分析发现,0.1%的Whale用户贡献50%+交易量,
但当前产品对不同用户群体缺乏差异化服务。
### 目标
- Whale留存率提升10%
- Large用户转化为Whale比例提升5%
- 新用户7日留存提升20%
### 方案
#### P0:Whale专属功能
- 大额交易拆单(减少滑点)
- 专属RPC节点(更快确认)
- API限额提升
#### P1:Large用户进阶
- Pro模式(高级图表、历史数据)
- 限价单功能
- 交易策略模板
#### P2:新手引导优化
- 首次交易Gas补贴
- 简化版界面(隐藏高级选项)
- 交互式教程
### 成功指标
- Whale月交易量(目标:+10%)
- Large→Whale转化率(目标:5%/月)
- 新用户7日留存(目标:25%)关键收获
PM 核心洞察
═══════════════════════════════════════════════════════════
1. 80/20法则在Web3更极端
└── 0.1%用户贡献50%+交易量
└── 服务好头部用户是关键
2. 链上数据可以精准识别用户价值
└── 不用猜测,直接看交易数据
└── 可以做精准的用户分层运营
3. 不同用户需要不同产品体验
└── Whale需要Pro功能
└── 新手需要简化流程
└── 一刀切的产品会流失两端用户
4. 数据驱动的产品决策
└── 先分析数据,再提需求
└── 用数据验证假设
═══════════════════════════════════════════════════════════Dashboard 链接
创建完成后在此记录:
├── Dune Dashboard URL: [待填写]
├── 查询1 URL: [待填写]
├── 查询2 URL: [待填写]
└── 查询3 URL: [待填写]下一步
完成本项目后,推荐继续:
- 项目 1.2:交易滑点与MEV影响分析
- 项目 2.1:新用户获取渠道分析
这两个项目会进一步加深对用户行为的理解。