Skip to content

电商用户行为分析实战

E-commerce User Behavior Analysis Case Study

通过一个完整的电商数据分析案例,展示从问题定义到洞察输出的全流程。


项目背景

某电商平台希望了解用户行为特征,优化产品设计和营销策略。我们需要回答以下业务问题:

  1. 转化漏斗: 用户从浏览到购买的转化率如何?
  2. 用户画像: 不同类型用户的行为特征是什么?
  3. 时间模式: 用户活跃度和购买行为的时间规律?
  4. 商品分析: 哪些商品最受欢迎?

数据说明

数据集

使用模拟的电商用户行为数据,包含以下字段:

字段 类型 说明
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