电商用户行为分析实战¶
E-commerce User Behavior Analysis Case Study
通过一个完整的电商数据分析案例,展示从问题定义到洞察输出的全流程。
项目背景¶
某电商平台希望了解用户行为特征,优化产品设计和营销策略。我们需要回答以下业务问题:
- 转化漏斗: 用户从浏览到购买的转化率如何?
- 用户画像: 不同类型用户的行为特征是什么?
- 时间模式: 用户活跃度和购买行为的时间规律?
- 商品分析: 哪些商品最受欢迎?
数据说明¶
数据集¶
使用模拟的电商用户行为数据,包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| user_id | int | 用户 ID |
| session_id | int | 会话 ID |
| event_time | datetime | 事件时间 |
| event_type | string | 事件类型(view, cart, purchase) |
| product_id | int | 商品 ID |
| category_id | int | 类目 ID |
| price | float | 商品价格 |
数据加载¶
import pandas as pd
import numpy as np
# 加载数据
df = pd.read_csv('ecommerce_behavior.csv', parse_dates=['event_time'])
# 数据概览
print(f"数据量:{len(df):,} 条")
print(f"用户数:{df['user_id'].nunique():,}")
print(f"时间范围:{df['event_time'].min()} 到 {df['event_time'].max()}")
分析一:转化漏斗分析¶
步骤 1: 计算各阶段用户数¶
# 浏览用户
view_users = df[df['event_type'] == 'view']['user_id'].nunique()
# 加购用户
cart_users = df[df['event_type'] == 'cart']['user_id'].nunique()
# 购买用户
purchase_users = df[df['event_type'] == 'purchase']['user_id'].nunique()
# 计算转化率
funnel = pd.DataFrame({
'阶段': ['浏览', '加购', '购买'],
'用户数': [view_users, cart_users, purchase_users],
'转化率': [
view_users / view_users,
cart_users / view_users,
purchase_users / view_users
]
})
print(funnel)
步骤 2: 可视化漏斗¶
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
bars = plt.bar(funnel['阶段'], funnel['用户数'], color=['#3498db', '#e74c3c', '#2ecc71'])
# 添加转化率标签
for i, (bar, rate) in enumerate(zip(bars, funnel['转化率'])):
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{rate:.1%}',
ha='center', va='bottom', fontsize=12, fontweight='bold')
plt.title('用户转化漏斗', fontsize=16)
plt.ylabel('用户数')
plt.show()
关键洞察¶
- 浏览→加购转化率: 反映商品吸引力和用户体验
- 加购→购买转化率: 反映定价合理性和支付流程顺畅度
- 行业基准: 电商平均转化率约 2-3%
分析二:用户分群¶
RFM 模型¶
# 选择最近一次购买时间作为参考
ref_date = df['event_time'].max()
# 计算 RFM 指标
rfm = df[df['event_type'] == 'purchase'].groupby('user_id').agg({
'event_time': lambda x: (ref_date - x.max()).days, # Recency
'session_id': 'count', # Frequency
'price': 'sum' # Monetary
}).rename(columns={
'event_time': 'recency',
'session_id': 'frequency',
'price': 'monetary'
})
# RFM 分群(简单三分法)
rfm['r_score'] = pd.qcut(rfm['recency'], 3, labels=[3, 2, 1]) # R 越小越好
rfm['f_score'] = pd.qcut(rfm['frequency'].rank(method='first'), 3, labels=[1, 2, 3])
rfm['m_score'] = pd.qcut(rfm['monetary'], 3, labels=[1, 2, 3])
# 计算 RFM 总分
rfm['rfm_score'] = rfm['r_score'].astype(int) + rfm['f_score'].astype(int) + rfm['m_score'].astype(int)
# 用户分群
def segment_user(score):
if score >= 7:
return '重要价值用户'
elif score >= 5:
return '重要发展用户'
elif score >= 3:
return '一般用户'
else:
return '低价值用户'
rfm['segment'] = rfm['rfm_score'].apply(segment_user)
print(rfm['segment'].value_counts())
分群策略¶
| 用户群体 | 特征 | 运营策略 |
|---|---|---|
| 重要价值用户 | 最近购买、高频、高消费 | VIP 服务、专属优惠 |
| 重要发展用户 | 最近购买、但频次或金额低 | 推荐高价值商品、提升客单价 |
| 一般用户 | 偶尔购买 | 保持联系、促销提醒 |
| 低价值用户 | 久未购买、低消费 | 召回活动、大幅优惠 |
分析三:时间模式分析¶
日活跃用户趋势¶
# 按日期统计 DAU
daily_users = df.groupby(df['event_time'].dt.date)['user_id'].nunique()
# 可视化
plt.figure(figsize=(14, 6))
daily_users.plot()
plt.title('日活跃用户趋势')
plt.xlabel('日期')
plt.ylabel('用户数')
plt.grid(True, alpha=0.3)
plt.show()
小时活跃度分析¶
# 按小时统计事件数
hourly_events = df.groupby(df['event_time'].dt.hour).size()
# 可视化
plt.figure(figsize=(12, 6))
plt.bar(hourly_events.index, hourly_events.values, color='steelblue')
plt.xlabel('小时')
plt.ylabel('事件数')
plt.title('用户活跃时间分布')
plt.xticks(range(24))
plt.grid(True, alpha=0.3)
plt.show()
# 找出高峰时段
peak_hour = hourly_events.idxmax()
print(f"活跃高峰时段:{peak_hour}:00")
工作日 vs 周末¶
# 标记周末
df['is_weekend'] = df['event_time'].dt.dayofweek >= 5
# 对比分析
weekend_comparison = df.groupby('is_weekend').size()
weekend_comparison.index = ['工作日', '周末']
print(weekend_comparison)
分析四:商品分析¶
畅销商品 TOP10¶
# 按销量排名
top_products = df[df['event_type'] == 'purchase'].groupby('product_id').agg({
'price': 'sum', # 销售额
'user_id': 'count' # 销量
}).rename(columns={
'price': 'revenue',
'user_id': 'sales_count'
}).sort_values('revenue', ascending=False).head(10)
print(top_products)
类目分析¶
# 类目销售表现
category_performance = df[df['event_type'] == 'purchase'].groupby('category_id').agg({
'price': ['sum', 'mean'],
'user_id': 'nunique'
}).round(2)
category_performance.columns = ['总销售额', '平均价格', '购买用户数']
category_performance['转化率'] = (
df[df['event_type'] == 'purchase'].groupby('category_id')['user_id'].nunique() /
df[df['event_type'] == 'view'].groupby('category_id')['user_id'].nunique()
)
print(category_performance.sort_values('总销售额', ascending=False))
业务建议¶
1. 优化转化漏斗¶
问题: 如果加购→购买转化率低
建议: - 简化支付流程 - 提供多种支付方式 - 优化运费策略(包邮门槛) - 加购后推送优惠券
2. 精细化用户运营¶
策略: - 对"重要价值用户"提供 VIP 专属服务 - 对"重要发展用户"推荐关联商品 - 对流失风险用户(R 值低)发送召回邮件
3. 时段运营策略¶
发现: 如果晚上 20-22 点是高峰
建议: - 在高峰前推送促销活动 - 安排客服在高峰时段在线 - 避免在高峰时段进行系统维护
4. 商品策略¶
发现: 识别高转化类目
建议: - 增加高转化类目的曝光 - 优化低转化类目的商品描述 - 对滞销商品进行促销清仓
代码汇总¶
完整分析代码可参考:examples/ecommerce_analysis.ipynb
常见问题¶
Q1: 如何处理大规模数据?¶
A:
- 使用分块读取:pd.read_csv(chunksize=10000)
- 使用更高效的数据格式:Parquet
- 考虑使用 Spark 等分布式计算工具
Q2: 如何自动化报告?¶
A: - 使用 Jupyter Notebook + Papermill 参数化 - 使用定时任务(cron/Airflow)定期运行 - 输出 HTML/PDF 报告自动发送
参考资源¶
书籍¶
- 《精益数据分析》
- 《增长黑客》
文章¶
数据集¶
下一步学习¶
最后更新: 2026-06-01