Python电商用户行为数据分析实战:从RFM分层到漏斗可视化

📅 2026/8/18 8:27:42
Python电商用户行为数据分析实战:从RFM分层到漏斗可视化
这次我们来看一个完整的 Python 电商用户行为数据分析与可视化实战项目。这个项目不是空谈理论而是提供一个可以直接运行、修改、用于简历或毕设的完整源码包。核心是教你如何用 Python 处理真实的电商用户行为数据完成从数据清洗、RFM用户分层到漏斗分析和可视化大屏的全过程。对于想找数据分析工作、做毕业设计或者提升实战能力的同学来说这个项目的价值在于“全链路”和“可落地”。它涵盖了数据分析的典型流程数据获取与理解、清洗、建模RFM、分析漏斗、可视化。你将学到 Pandas 的数据操作、Matplotlib/Seaborn 的图表绘制、以及如何用 Plotly 或 Pyecharts 制作交互式可视化仪表盘。本文会带你一步步拆解这个项目。我们会先快速了解项目的核心能力和数据概况然后搭建 Python 数据分析环境接着深入代码讲解每一部分的关键逻辑最后完成一个完整的分析报告并生成可视化图表。你可以跟着做把这份代码变成你自己的项目经验。1. 核心能力速览能力项说明项目类型Python 数据分析与可视化实战项目技术栈Pandas, NumPy, Matplotlib, Seaborn, Plotly / Pyecharts, Jupyter Notebook核心分析模型RFM 用户分层模型、用户行为漏斗分析模型数据要求包含用户ID、行为类型浏览、收藏、加购、购买、时间戳、商品类目等字段的电商用户行为数据集环境门槛本地 Python 环境Anaconda 推荐无需 GPU普通电脑即可运行输出成果清洗后的数据表、RFM用户分群结果、漏斗转化率图表、多维可视化仪表盘HTML、完整分析报告适合场景数据分析学习、毕业设计、求职简历项目、电商业务分析入门2. 项目背景与数据理解任何数据分析项目的第一步都是理解数据和业务。本项目模拟一个电商平台其用户行为日志通常包含以下核心字段user_id: 用户唯一标识。item_id: 商品ID。category_id: 商品类目ID。behavior_type: 行为类型如pv(浏览/点击),fav(收藏),cart(加入购物车),buy(购买)。timestamp: 行为发生的时间戳。我们的目标是从这些杂乱的行为日志中挖掘出用户价值、行为路径和业务问题。主要分析方向有两个用户价值分层RFM模型通过用户的最近一次消费时间Recency、消费频率Frequency、消费金额Monetary来对用户进行分群识别出高价值用户、流失用户等。用户行为漏斗分析追踪用户从浏览到购买的完整路径计算每一步的转化率定位流失严重的环节。原始数据往往存在重复、缺失、格式错误等问题因此数据清洗是必不可少且至关重要的一步。3. 环境准备与依赖安装推荐使用 Anaconda 来管理 Python 环境可以避免包冲突。步骤1创建并激活专属的虚拟环境# 创建名为 ecommerce_analysis 的 Python 3.8 环境 conda create -n ecommerce_analysis python3.8 # 激活环境 conda activate ecommerce_analysis步骤2安装核心依赖包在激活的环境下使用 pip 安装所需库。建议将以下内容保存为requirements.txt文件然后一键安装。# requirements.txt pandas1.3.0 numpy1.21.0 matplotlib3.4.0 seaborn0.11.0 plotly5.3.0 jupyter1.0.0 openpyxl3.0.0 # 用于读写Excel文件安装命令pip install -r requirements.txt步骤3准备数据文件将项目提供的电商用户行为数据集例如user_behavior.csv放置在项目根目录的data/文件夹下。如果数据是其他格式如.xlsx,.json后续代码稍作修改即可。4. 数据清洗与预处理实战数据清洗是保证分析结果准确性的基石。我们使用 Pandas 来完成。4.1 加载与初步探索数据import pandas as pd import numpy as np # 加载数据 df pd.read_csv(‘data/user_behavior.csv’) # 查看数据前5行和基本信息 print(“数据形状”, df.shape) print(“\n数据列信息”) print(df.info()) print(“\n数据前5行”) print(df.head()) print(“\n行为类型分布”) print(df[‘behavior_type’].value_counts())运行后你需要关注数据量行数×列数。各列的数据类型是否正确如timestamp应为日期时间类型。是否有缺失值NaN。behavior_type的种类和数量是否符合预期pv, fav, cart, buy。4.2 关键清洗步骤根据探索结果执行清洗操作。# 1. 处理时间戳将字符串转换为 datetime 类型 df[‘timestamp’] pd.to_datetime(df[‘timestamp’]) # 2. 处理缺失值这里假设删除行为类型为空的记录或根据业务填充 df_cleaned df.dropna(subset[‘behavior_type’, ‘user_id’]) # 3. 去重删除完全重复的行 df_cleaned df_cleaned.drop_duplicates() # 4. 格式规范确保 behavior_type 为小写 df_cleaned[‘behavior_type’] df_cleaned[‘behavior_type’].str.lower() # 5. 筛选有效数据例如只保留‘pv’ ‘fav’ ‘cart’ ‘buy’这四种行为 valid_behaviors [‘pv’ ‘fav’ ‘cart’ ‘buy’] df_cleaned df_cleaned[df_cleaned[‘behavior_type’].isin(valid_behaviors)] # 6. 按时间排序 df_cleaned df_cleaned.sort_values(by‘timestamp’).reset_index(dropTrue) print(“清洗后数据形状”, df_cleaned.shape) print(“清洗后行为类型分布”) print(df_cleaned[‘behavior_type’].value_counts())清洗完成后将干净的数据保存起来供后续分析使用。df_cleaned.to_csv(‘data/user_behavior_cleaned.csv’ indexFalse)5. RFM 用户分层模型实现RFM 模型是衡量客户价值的经典工具。由于我们的数据没有金额信息可以稍作变通用“购买次数”代替“消费金额”M或者将 M 设为固定值如1专注于 R 和 F。步骤1定义分析时间窗口假设我们以数据中最后一天作为分析截止点snapshot_date向前推一段时间如30天作为分析周期。snapshot_date df_cleaned[‘timestamp’].max() analysis_period snapshot_date - pd.Timedelta(days30) df_period df_cleaned[df_cleaned[‘timestamp’] analysis_period].copy()步骤2计算每个用户的 R、F、M 值# 筛选购买行为 df_purchase df_period[df_period[‘behavior_type’] ‘buy’] # 计算 RFM 指标 rfm df_purchase.groupby(‘user_id’).agg({ ‘timestamp’: lambda x: (snapshot_date - x.max()).days, # Recency: 最近一次购买距今天数 ‘user_id’: ‘count’ # Frequency: 购买次数 # 假设每次购买金额为1 若有金额字段可替换为 ‘item_price’: ‘sum’ }).rename(columns{‘timestamp’: ‘Recency’ ‘user_id’: ‘Frequency’}) rfm[‘Monetary’] rfm[‘Frequency’] * 1 # 此处用购买次数代替金额 rfm rfm.reset_index() print(rfm.head())步骤3对 R、F、M 进行分箱和打分通常使用分位数如四分位进行划分并为每个维度打分如1-4分4分最高。# 对R、F、M分别进行分箱打分这里使用四分位数q4 # Recency越小越好所以排名要反向 rfm[‘R_Score’] pd.qcut(rfm[‘Recency’] q4 labels[4 3 2 1]) rfm[‘F_Score’] pd.qcut(rfm[‘Frequency’].rank(method‘first’) q4 labels[1 2 3 4]) rfm[‘M_Score’] pd.qcut(rfm[‘Monetary’].rank(method‘first’) q4 labels[1 2 3 4]) # 将分数转换为数值型 rfm[‘R_Score’] rfm[‘R_Score’].astype(int) rfm[‘F_Score’] rfm[‘F_Score’].astype(int) rfm[‘M_Score’] rfm[‘M_Score’].astype(int) # 计算RFM总分或拼接RFM代码 rfm[‘RFM_Score’] rfm[[‘R_Score’ ‘F_Score’ ‘M_Score’]].sum(axis1) rfm[‘RFM_Group’] rfm[‘R_Score’].astype(str) rfm[‘F_Score’].astype(str) rfm[‘M_Score’].astype(str)步骤4用户分层与标签定义根据 RFM 分数或分组定义用户层级。# 定义分层规则示例可根据业务调整 def rfm_segment(row): if row[‘R_Score’] 3 and row[‘F_Score’] 3 and row[‘M_Score’] 3: return ‘高价值用户’ elif row[‘R_Score’] 3 and row[‘F_Score’] 2: return ‘潜力用户’ elif row[‘R_Score’] 2 and row[‘F_Score’] 3: return ‘需唤回用户’ elif row[‘R_Score’] 2 and row[‘F_Score’] 2: return ‘流失风险用户’ else: return ‘一般用户’ rfm[‘Segment’] rfm.apply(rfm_segment axis1) segment_counts rfm[‘Segment’].value_counts() print(“用户分层结果”) print(segment_counts)步骤5可视化 RFM 分层结果使用 Matplotlib 或 Seaborn 绘制分层分布图。import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize(10 6)) sns.countplot(datarfm y‘Segment’ ordersegment_counts.index palette‘viridis’) plt.title(‘RFM 用户分层分布’) plt.xlabel(‘用户数量’) plt.tight_layout() plt.savefig(‘output/rfm_segment_dist.png’ dpi300) plt.show()6. 用户行为漏斗分析实现漏斗分析用于追踪用户在关键行为路径上的转化情况典型路径是浏览(PV) - 收藏(FAV) - 加购(CART) - 购买(BUY)。步骤1构建用户行为序列我们需要计算完成每一步行为的独立用户数。# 计算完成每一步行为的独立用户数 funnel_steps [‘pv’ ‘fav’ ‘cart’ ‘buy’] funnel_data {} for step in funnel_steps: unique_users df_cleaned[df_cleaned[‘behavior_type’] step][‘user_id’].nunique() funnel_data[step] unique_users # 转换为DataFrame funnel_df pd.DataFrame(list(funnel_data.items()) columns[‘Step’ ‘Unique_Users’]) print(funnel_df)步骤2计算转化率funnel_df[‘Conversion_Rate’] funnel_df[‘Unique_Users’] / funnel_df[‘Unique_Users’].iloc[0] * 100 funnel_df[‘Step_Dropoff’] funnel_df[‘Unique_Users’].pct_change() * 100 print(funnel_df)步骤3绘制漏斗图使用 Plotly 可以绘制出非常美观的交互式漏斗图。import plotly.express as px fig px.funnel(funnel_df x‘Unique_Users’ y‘Step’) fig.update_layout(title‘电商用户行为转化漏斗 (浏览-收藏-加购-购买)’ xaxis_title‘独立用户数’) fig.write_html(‘output/user_behavior_funnel.html’) # 保存为交互式HTML fig.show()生成的 HTML 文件可以在浏览器中打开鼠标悬停可以看到具体数据非常适合在报告或仪表盘中展示。7. 多维数据可视化与仪表盘搭建单一图表不足以展现全貌我们需要一个综合仪表盘。这里使用 Plotly 的make_subplots功能将多个图表组合在一起。步骤1准备绘图数据除了 RFM 和漏斗我们还可以分析每日用户行为趋势。热门商品类目。用户活跃时段分布。# 1. 每日行为趋势 df_cleaned[‘date’] df_cleaned[‘timestamp’].dt.date daily_activity df_cleaned.groupby([‘date’ ‘behavior_type’]).size().unstack(fill_value0) # 2. 热门商品类目 Top 10 top_categories df_cleaned[‘category_id’].value_counts().head(10) # 3. 用户活跃小时分布 df_cleaned[‘hour’] df_cleaned[‘timestamp’].dt.hour hourly_activity df_cleaned.groupby(‘hour’).size()步骤2使用 Plotly 创建子图仪表盘from plotly.subplots import make_subplots import plotly.graph_objects as go fig make_subplots( rows3 cols2 subplot_titles(‘RFM用户分层分布’ ‘用户行为转化漏斗’ ‘每日用户行为趋势’ ‘热门商品类目Top 10’ ‘用户活跃时段分布’ ‘RFM得分散点图R vs F’) specs[[{‘type’: ‘bar’} {‘type’: ‘funnel’}] [{‘type’: ‘scatter’} {‘type’: ‘bar’}] [{‘type’: ‘bar’} {‘type’: ‘scatter’}]] ) # 图表1: RFM分层条形图 fig.add_trace(go.Bar(xsegment_counts.values ysegment_counts.index orientation‘h’ name‘RFM分层’ marker_color‘lightseagreen’) row1 col1) # 图表2: 漏斗图 (使用之前创建的 funnel_df) fig.add_trace(go.Funnel(yfunnel_df[‘Step’] xfunnel_df[‘Unique_Users’] name‘转化漏斗’) row1 col2) # 图表3: 每日行为趋势折线图 for behavior in [‘pv’ ‘fav’ ‘cart’ ‘buy’]: if behavior in daily_activity.columns: fig.add_trace(go.Scatter(xdaily_activity.index ydaily_activity[behavior] mode‘lines’ namebehavior.upper()) row2 col1) # 图表4: 热门类目条形图 fig.add_trace(go.Bar(xtop_categories.values ytop_categories.index.astype(str) orientation‘h’ name‘热门类目’ marker_color‘coral’) row2 col2) # 图表5: 用户活跃时段条形图 fig.add_trace(go.Bar(xhourly_activity.index yhourly_activity.values name‘活跃时段’ marker_color‘goldenrod’) row3 col1) # 图表6: RFM R与F得分散点图 fig.add_trace(go.Scatter(xrfm[‘R_Score’] yrfm[‘F_Score’] mode‘markers’ markerdict(size5 colorrfm[‘M_Score’] colorscale‘Viridis’ showscaleTrue) textrfm[‘user_id’] name‘RFM散点’) row3 col2) fig.update_layout(height1200 width1400 title_text“电商用户行为分析综合仪表盘” showlegendTrue) fig.write_html(‘output/ecommerce_analysis_dashboard.html’) fig.show()运行后一个包含6个关键视图的交互式仪表盘就生成了。你可以缩放、平移、查看每个数据点的详细信息。8. 项目整合与自动化报告生成为了提升项目的工程性和复用性我们可以将上述步骤整合到一个脚本中并生成一份简单的文本分析报告。创建主运行脚本main_analysis.py# main_analysis.py import pandas as pd import numpy as np from data_cleaning import clean_data from rfm_analysis import run_rfm_analysis from funnel_analysis import run_funnel_analysis from visualization import create_dashboard import logging logging.basicConfig(levellogging.INFO format‘%(asctime)s - %(levelname)s - %(message)s’) def main(): logging.info(“开始电商用户行为分析项目...”) # 1. 数据清洗 logging.info(“步骤1: 数据清洗...”) df_cleaned clean_data(‘data/user_behavior.csv’) # 2. RFM分析 logging.info(“步骤2: RFM用户分层分析...”) rfm_result segment_summary run_rfm_analysis(df_cleaned) # 3. 漏斗分析 logging.info(“步骤3: 用户行为漏斗分析...”) funnel_result run_funnel_analysis(df_cleaned) # 4. 可视化仪表盘 logging.info(“步骤4: 生成可视化仪表盘...”) create_dashboard(df_cleaned rfm_result funnel_result) # 5. 生成简易文本报告 logging.info(“步骤5: 生成分析报告...”) with open(‘output/analysis_report.txt’ ‘w’ encoding‘utf-8’) as f: f.write(“ 电商用户行为分析报告 \n\n”) f.write(f”1. 数据概况清洗后有效记录 {len(df_cleaned)} 条。\n”) f.write(f”2. RFM用户分层结果\n{segment_summary.to_string()}\n\n”) f.write(f”3. 漏斗转化率\n{funnel_result.to_string()}\n\n”) f.write(“4. 核心洞察\n”) f.write(f” - 高价值用户占比{segment_summary.get(‘高价值用户’ 0)/len(rfm_result)*100:.1f}%\n”) f.write(f” - 从浏览到购买的整体转化率{funnel_result[‘Conversion_Rate’].iloc[-1]:.2f}%\n”) f.write(f” - 流失最严重的环节是{funnel_result.loc[funnel_result[‘Step_Dropoff’].idxmin() ‘Step’]} 流失率 {abs(funnel_result[‘Step_Dropoff’].min()):.1f}%\n”) logging.info(“分析完成所有结果已保存至 ‘output/’ 目录。”) if __name__ ‘__main__’: main()你需要将之前编写的清洗、RFM分析、漏斗分析和可视化函数分别封装到data_cleaning.pyrfm_analysis.pyfunnel_analysis.py和visualization.py模块中。这样整个项目就模块化了。9. 常见问题与排查方法在运行本项目时你可能会遇到以下问题问题现象可能原因排查方式解决方案导入 pandas 报错ModuleNotFoundError虚拟环境未激活或依赖未安装在终端输入conda list | grep pandas激活正确环境运行pip install -r requirements.txt读取 CSV 文件报编码错误文件编码非 UTF-8用文本编辑器如 VS Code打开文件查看编码使用pd.read_csv(‘file.csv’ encoding‘gbk’或‘latin1’)指定编码时间戳转换失败原始时间格式与 pandas 默认解析格式不匹配打印几行df[‘timestamp’].head()查看格式使用pd.to_datetime(df[‘timestamp’] format‘%Y-%m-%d %H:%M:%S’)指定格式漏斗图数据异常某一步人数为0数据清洗过于严格或该行为在本数据集中不存在检查df_cleaned[‘behavior_type’].value_counts()调整清洗逻辑或检查原始数据中该行为类型的拼写是否正确Plotly 图表不显示或报错未在 Jupyter Notebook 中运行或缺少渲染器在 Jupyter 中尝试import plotly.io as pio; pio.renderers.default ‘notebook’使用fig.write_html(‘chart.html’)保存为 HTML 后在浏览器打开运行内存不足 (MemoryError)数据集过大打印df.shape和df.memory_usage(deepTrue).sum()1. 使用df pd.read_csv(… usecols[…])只读取必要列。2. 将数据分块处理。3. 使用dtype参数指定列类型如{‘user_id’: ‘int32’}。RFM 分箱时出现ValueError: Bin edges must be unique数据中某个指标如 Frequency存在大量相同值导致分位数边界重复检查rfm[‘Frequency’].value_counts()使用pd.qcut(… duplicates‘drop’)参数或改用pd.cut自定义区间10. 项目扩展与最佳实践这个项目是一个强大的起点你可以从以下几个方向进行扩展让它更贴近真实业务或成为你简历上的亮点引入更多数据合并用户画像数据性别、年龄、地域、商品数据价格、类目进行更丰富的交叉分析。优化 RFM 模型使用 K-Means 聚类等无监督学习方法进行自动分群。尝试不同的打分和分层策略并与业务方确认。深化漏斗分析分析不同用户分群如高价值用户 vs 一般用户的漏斗路径差异。计算每一步的“时间转化间隔”分析用户决策时长。搭建自动化报表使用crontab(Linux/Mac) 或Task Scheduler(Windows) 定时运行分析脚本将最新的仪表盘 HTML 和报告通过邮件自动发送。部署为 Web 应用使用Streamlit或Dash框架将整个分析过程包装成一个有交互界面的 Web 应用方便非技术人员使用。性能优化对于超大规模数据集可以学习使用Dask或PySpark进行分布式计算。最佳实践建议版本控制使用 Git 管理你的代码和数据清洗逻辑。配置分离将文件路径、分析时间窗口、分箱参数等写入config.py或config.yaml文件便于修改。日志记录如主脚本所示使用logging模块记录运行过程方便排查错误。结果归档每次运行的结果图表、报告建议按日期保存便于回溯和对比。注重业务解释数据分析的最终价值在于驱动业务决策。在报告中不仅要呈现图表更要解释“这意味着什么”和“我们该做什么”。这个项目涵盖了从数据到洞察的完整链条代码结构清晰你可以轻松地替换自己的数据集修改分析维度。运行一遍你就能对电商数据分析有一个扎实的、可展示的理解。建议你 fork 或下载源码后先从理解数据开始然后逐模块运行代码最后尝试根据自己的想法进行修改和扩展。