ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python电商用户行为数据分析实战:从数据清洗到RFM模型与可视化

Python电商用户行为数据分析实战:从数据清洗到RFM模型与可视化 简介本资源是一套面向数据分析学习者与电商从业者实战演练的淘宝用户行为分析Python项目聚焦用户流量、转化率与价值分层三大核心问题适用于掌握基础Pandas、Matplotlib及时间序列处理能力的中级学习者。压缩包共28个文件含3个主分析脚本Part1流量分析.py、Part2转化率分析.py、Part3用户价值分析.py、11张PNG可视化图表、3张JPG辅助图示、7个XML配置/IDE设置文件、中文字体SimHei.ttf及readme.txt说明文档整体10.35MB结构清晰、模块解耦便于按分析阶段快速定位代码与结果。已有588人学习下载读者可直接运行脚本复现千万级用户行为数据1200万记录的清洗、统计、漏斗建模与RFM用户分群全流程并获得含中文标签的完整可视化图表与可迁移的电商分析框架。1. 项目概述与核心价值最近在整理过往的数据分析项目时翻出了一个几年前做的“淘宝用户行为数据分析”的源码。这个项目虽然技术栈不算最新但其中的分析思路、数据处理流程和可视化方法对于想入门电商数据分析或者用Python做实操练习的朋友来说依然非常有参考价值。它完整地模拟了从原始数据到商业洞察的全过程涵盖了数据清洗、行为分析、用户分群、商品洞察等核心环节。如果你正在学习Python数据分析或者对电商背后的用户行为逻辑感到好奇这个项目能给你提供一个非常清晰的实战框架。简单来说这个项目就是利用Python对一份模拟的淘宝用户行为日志数据进行分析试图回答几个关键业务问题用户什么时候最活跃他们最喜欢点击或购买什么商品哪些商品是真正的“爆款”用户从浏览到购买的转化路径是怎样的通过对这些问题的挖掘我们最终的目标是生成一份数据报告为运营决策比如活动时间安排、商品推荐、库存管理提供数据支持。整个过程不涉及任何复杂的爬虫或敏感信息获取所有分析都基于一份脱敏的、结构化的日志数据安全且合规。2. 项目整体设计与技术栈选型2.1 核心分析思路拆解拿到一份用户行为数据我们首先要明确分析维度。电商用户行为数据通常包含几个核心字段用户ID、商品ID、行为类型浏览、收藏、加购、购买、时间戳。我们的分析将围绕“人”、“货”、“场”、“时”四个维度展开。人用户分析用户活跃度、用户价值如RFM模型、用户生命周期阶段。货商品分析商品热度、商品转化率、商品之间的关联关系。场行为路径分析用户从浏览到最终购买的行为漏斗找出流失关键环节。时时间序列分析用户行为的日内规律和日级趋势找出流量高峰和低谷。这个项目的源码就是按照这个逻辑框架搭建的。它不是一个简单的脚本堆砌而是一个有输入、有处理、有输出、模块相对清晰的工程。我们会先进行数据质量探查和清洗然后按上述维度逐一计算指标最后通过图表将结果直观呈现。2.2 技术栈选择与理由项目主要使用了Pandas,NumPy,Matplotlib,Seaborn这几个库。这里解释一下为什么是它们而不是其他更“新潮”的工具。Pandas NumPy (数据处理基石)这是Python数据分析的“标准答案”。对于这种规整的表格型数据用户行为日志Pandas的DataFrame操作起来效率极高筛选、分组、聚合、合并等操作都有现成且优化的函数。NumPy为其提供底层数值计算支持。虽然现在有Polars等后起之秀在性能上可能有优势但Pandas的生态、文档和社区支持是最成熟的对于学习者和大多数中小规模数据集本项目模拟数据通常在百万行以内来说它依然是首选能让你把精力集中在分析逻辑而非工具本身上。Matplotlib Seaborn (可视化搭档)Matplotlib是基础绘图库功能强大但API略显繁琐。Seaborn基于Matplotlib提供了更高级的统计图形接口和更美观的默认样式。两者结合使用非常方便用Seaborn快速绘制统计图表如分布图、热力图用Matplotlib进行精细化的定制如调整标题、坐标轴、图例。为什么不直接用Plotly或Pyecharts做交互式图表因为本项目的目标是生成静态的、用于报告的分析图表MatplotlibSeaborn的组合在生成出版质量的静态图片方面更直接且不依赖网络环境。注意在真实生产环境中数据量可能极大。这时可以考虑用PySpark处理或者先将数据聚合后再用Pandas分析。本源码作为教学和思路演示默认数据量在单机Pandas可处理范围内。3. 数据准备与核心清洗流程3.1 模拟数据字段说明由于无法获取真实淘宝数据我们通常使用公开数据集或自己模拟数据。本源码附带的或建议模拟的数据包含以下核心字段user_id: 用户唯一标识。item_id: 商品唯一标识。category_id: 商品类目ID。behavior_type: 用户行为类型。通常用pv(浏览/点击)fav(收藏)cart(加入购物车)buy(购买) 表示。timestamp: 行为发生的时间戳精确到秒。数据样例如下user_iditem_idcategory_idbehavior_typetimestamp1001200015001pv2023-11-01 08:30:151001200015001cart2023-11-01 10:15:221002200055002pv2023-11-01 09:05:333.2 数据质量探查与清洗实操在开始分析前必须对数据“体检”。源码中这部分往往被新手忽略但却是保证结论可靠的关键。第一步加载与初步观察import pandas as pd import numpy as np # 假设数据文件为 user_behavior.csv df pd.read_csv(user_behavior.csv) print(f数据形状: {df.shape}) # 查看行数和列数 print(df.info()) # 查看数据类型和缺失值 print(df.head()) # 查看前几行 print(df[behavior_type].value_counts()) # 查看行为类型分布第二步关键清洗步骤处理缺失值检查各字段是否有NaN。对于用户ID、商品ID、行为类型这类关键字段通常直接删除缺失行因为无法推测。对于类目ID如果缺失比例不高且不重要可以填充为“未知”。# 删除关键字段缺失的行 df_clean df.dropna(subset[user_id, item_id, behavior_type, timestamp])处理时间戳将字符串格式的时间戳转换为Pandas的datetime格式并提取新的时间维度字段这是后续时间分析的基础。df_clean[timestamp] pd.to_datetime(df_clean[timestamp]) df_clean[date] df_clean[timestamp].dt.date df_clean[hour] df_clean[timestamp].dt.hour df_clean[weekday] df_clean[timestamp].dt.weekday # 周一为0周日为6处理异常值时间异常检查是否有时间戳远超出业务合理范围的数据比如未来时间或过于久远的时间这类数据需要剔除。用户/商品异常检查是否有出现次数极少如只出现一次的用户或商品可能是测试数据或爬虫痕迹根据分析目的决定是否保留。行为序列异常例如同一用户对同一商品在极短时间内如1秒内有多次相同行为可能是重复日志或接口抖动可以考虑去重。数据一致性检查确保behavior_type的取值只有预期的几种pv, fav, cart, buy。如果发现其他值需要查明原因并处理。valid_behavior [pv, fav, cart, buy] df_clean df_clean[df_clean[behavior_type].isin(valid_behavior)]实操心得清洗步骤不是一成不变的。每次拿到新数据都要重新跑一遍探查代码。我曾在一个项目中因为没发现“收藏”行为的数据格式不一致有的是fav有的是favorite导致后续漏斗分析中“收藏”环节的数据严重偏低结论完全错误。所以df[behavior_type].unique()这个命令一定要打出来看看。4. 用户行为多维分析与可视化实现清洗后的干净数据是我们的“金矿”。接下来我们按照既定维度进行挖掘。源码的核心部分就在这里。4.1 时间维度分析抓住流量脉搏用户活跃度在一天内和一周内是有明显规律的。分析这个可以帮助确定广告投放、活动推送、客服排班的最佳时间。日内活跃趋势分析import matplotlib.pyplot as plt import seaborn as sns # 计算每小时的各类行为总量 hourly_activity df_clean.groupby(hour)[behavior_type].count().reset_index() hourly_activity_pivot df_clean.pivot_table(indexhour, columnsbehavior_type, valuesuser_id, aggfunccount, fill_value0) plt.figure(figsize(14, 6)) # 绘制总行为趋势 plt.subplot(1, 2, 1) sns.lineplot(datahourly_activity, xhour, ybehavior_type, markero) plt.title(用户日内活跃趋势总行为量) plt.xlabel(小时) plt.ylabel(行为次数) plt.grid(True, linestyle--, alpha0.5) # 绘制分行为趋势 plt.subplot(1, 2, 2) hourly_activity_pivot.plot(kindline, markero, axplt.gca()) plt.title(分行为类型日内趋势) plt.xlabel(小时) plt.ylabel(行为次数) plt.legend(title行为类型) plt.grid(True, linestyle--, alpha0.5) plt.tight_layout() plt.show()通过这个图表你可能会发现浏览pv的高峰在午休12-13点和晚上20-22点而购买buy行为可能相对更集中在晚上。这就提示我们促销活动的“引爆点”可以设在晚上。每周活跃趋势分析类似地可以按weekday分组观察一周七天哪几天流量更高通常周末weekday 5, 6会是高峰。4.2 商品维度分析识别爆款与潜力款运营最关心什么商品卖得好。这里不仅要看销量还要看转化效率。商品热度排行榜PV Top 10# 按商品ID统计浏览次数 item_pv_rank df_clean[df_clean[behavior_type]pv].groupby(item_id).size().sort_values(ascendingFalse).head(10) print(浏览热度Top 10商品:) print(item_pv_rank)但只看浏览不够可能是“叫好不叫座”。我们需要计算商品转化率。商品转化率分析 转化率 购买该商品的人数 / 浏览该商品的人数。这是一个更核心的指标。# 计算每个商品的浏览人数和购买人数 item_behavior_count df_clean.pivot_table(indexitem_id, columnsbehavior_type, valuesuser_id, aggfuncpd.Series.nunique, fill_value0) # 注意这里用nunique统计人数而不是count统计次数避免同一用户重复计算夸大转化率。 item_behavior_count[conversion_rate] item_behavior_count[buy] / item_behavior_count[pv].replace(0, np.nan) # 防止除零错误 item_behavior_count[conversion_rate] item_behavior_count[conversion_rate].fillna(0) # 找出高转化率的商品例如浏览人数100转化率5% hot_items item_behavior_count[(item_behavior_count[pv] 100) (item_behavior_count[conversion_rate] 0.05)] hot_items_sorted hot_items.sort_values(byconversion_rate, ascendingFalse).head(10) print(高转化率潜力商品Top 10:) print(hot_items_sorted[[pv, buy, conversion_rate]])这个列表里的商品是运营应该重点维护和追加曝光的“潜力爆款”。4.3 用户行为漏斗与路径分析用户从看到商品到最终购买每一步都有流失。构建漏斗能直观看到流失发生在哪里。四步行为漏斗浏览-收藏-加购-购买# 计算完成各行为的独立用户数 funnel_data [] for behavior in [pv, fav, cart, buy]: unique_users df_clean[df_clean[behavior_type]behavior][user_id].nunique() funnel_data.append({behavior: behavior, unique_users: unique_users}) funnel_df pd.DataFrame(funnel_data) funnel_df[conversion] funnel_df[unique_users] / funnel_df[unique_users].iloc[0] # 以浏览为基准计算转化率 print(用户行为漏斗:) print(funnel_df) # 绘制漏斗图简化版条形图 plt.figure(figsize(10, 6)) sns.barplot(datafunnel_df, xbehavior, yconversion, order[pv, fav, cart, buy]) plt.title(用户行为转化漏斗浏览-收藏-加购-购买) plt.ylabel(转化率相对于浏览) plt.xlabel(行为阶段) for index, row in funnel_df.iterrows(): plt.text(index, row[conversion]0.01, f{row[conversion]:.2%}, hacenter) plt.show()通常你会发现从“浏览”到“加购”的流失率最高这说明商品详情页的吸引力或“加入购物车”按钮的引导可能存在问题。而从“加购”到“购买”的转化率如果偏低则可能是购物车页面促销力度不够或者支付流程太复杂。4.4 用户价值分层RFM模型简易实现RFMRecency, Frequency, Monetary是经典的客户价值分析模型。在淘宝行为数据中我们没有直接的消费金额M但可以用“购买次数”或“交互深度”来近似替代。计算R、F、M值R最近购买时间以分析截止日期为准计算每个用户最近一次购买距今的天数。天数越少R值越高。F购买频率统计每个用户在时间窗口内的总购买次数。次数越多F值越高。M消费能力这里我们用“购买次数”或“总交互行为数pvfavcartbuy”来近似。次数越多M值越高。数据分箱与打分将每个用户的R、F、M值分别按分位数如四分位分成1-4分。用户分层将R、F、M三个分数拼接或求平均值得到用户总分。根据总分或组合规则如“高F高M”为重要价值用户“低R低F”为流失用户进行分层。# 假设分析截止日期为数据中最晚的日期 analysis_end_date df_clean[date].max() # 计算每个用户的RFM指标 user_rfm df_clean[df_clean[behavior_type]buy].groupby(user_id).agg( last_buy_date(date, max), # 最近购买日期 frequency(item_id, count) # 购买次数 ).reset_index() # 计算R值最近一次购买距今天数 user_rfm[R_days] (analysis_end_date - user_rfm[last_buy_date]).dt.days # 计算M值近似值这里用总行为次数需重新关联全量表 user_activity df_clean.groupby(user_id).size().reset_index(nameM_total_actions) user_rfm user_rfm.merge(user_activity, onuser_id, howleft).fillna(0) # 对R、F、M进行1-4分打分使用分位数 for col, ascending in zip([R_days, frequency, M_total_actions], [True, False, False]): # R值越小越好所以升序F和M越大越好所以降序 user_rfm[f{col}_score] pd.qcut(user_rfm[col], q4, labels[1,2,3,4], duplicatesdrop).astype(int) if ascending else pd.qcut(user_rfm[col].rank(methodfirst), q4, labels[4,3,2,1]).astype(int) user_rfm[RFM_Score] user_rfm[[R_days_score, frequency_score, M_total_actions_score]].mean(axis1) # 简单分层 def segment_user(row): if row[frequency_score] 3 and row[R_days_score] 3: return 重要价值用户 elif row[frequency_score] 3 and row[R_days_score] 3: return 重要保持用户 elif row[frequency_score] 3 and row[R_days_score] 3: return 重要发展用户 else: return 一般价值用户 user_rfm[segment] user_rfm.apply(segment_user, axis1) print(user_rfm[segment].value_counts())通过这个分层运营就可以针对“重要发展用户”推送优惠券刺激复购对“重要保持用户”提供VIP服务防止流失。5. 项目源码结构解析与核心函数一个可维护的源码结构清晰很重要。典型的项目结构可能如下taobao_behavior_analysis/ ├── data/ │ ├── raw/ # 存放原始数据 │ └── processed/ # 存放清洗后的数据 ├── src/ │ ├── config.py # 配置文件路径、参数 │ ├── data_loader.py # 数据加载与清洗模块 │ ├── analysis_core.py # 核心分析函数时间、商品、漏斗、RFM │ ├── visualization.py # 可视化绘图函数 │ └── main.py # 主程序串联整个流程 ├── output/ │ ├── figures/ # 生成的图表 │ └── reports/ # 生成的数据摘要或报告 └── requirements.txt # 项目依赖在analysis_core.py中会封装几个核心函数例如def analyze_hourly_trend(data_df): 分析日内行为趋势 # ... 具体计算逻辑 return hourly_summary_df def calculate_conversion_funnel(data_df): 计算用户行为漏斗 # ... 具体计算逻辑 return funnel_df def perform_rfm_analysis(data_df, end_date): 执行RFM用户分群分析 # ... 具体计算逻辑 return rfm_result_df在main.py中流程被清晰组织from src.data_loader import load_and_clean_data from src.analysis_core import analyze_hourly_trend, calculate_conversion_funnel, perform_rfm_analysis from src.visualization import plot_hourly_trend, plot_funnel def main(): # 1. 加载并清洗数据 df load_and_clean_data(data/raw/user_behavior.csv) # 2. 执行各项分析 hourly_df analyze_hourly_trend(df) funnel_df calculate_conversion_funnel(df) rfm_df perform_rfm_analysis(df, df[date].max()) # 3. 可视化 plot_hourly_trend(hourly_df) plot_funnel(funnel_df) # 4. 保存结果 rfm_df.to_csv(output/reports/rfm_segments.csv, indexFalse) print(分析完成) if __name__ __main__: main()6. 常见问题、优化方向与避坑指南在实际运行和分析过程中你肯定会遇到各种问题。这里分享一些我踩过的坑和对应的解决方案。6.1 数据与性能相关问题Q1: 数据量太大Pandas处理慢甚至内存溢出怎么办采样分析如果只是做探索性分析或验证思路可以先对数据进行随机采样例如1%或10%。df_sample df.sample(frac0.01, random_state42)分块处理使用pandas.read_csv(chunksize50000)分块读取和处理大型文件。优化数据类型将user_id,item_id等数值型ID转换为category类型将时间字符串转为datetime可以大幅减少内存占用。df[user_id] df[user_id].astype(category)使用更高效的工具如果数据量常年在千万行以上是时候学习PySpark或Dask了。Q2: 计算转化率时分母为0导致NaN或inf怎么办这是常见错误。在除法前一定要处理分母为0的情况。# 推荐使用 replace 或 mask df[conversion_rate] df[buyers] / df[viewers].replace(0, np.nan) # 或者 df[conversion_rate] np.where(df[viewers] 0, df[buyers] / df[viewers], 0)6.2 分析方法与业务解读问题Q3: 我的漏斗转化率看起来非常低正常吗这非常正常。电商的总体购买转化率通常是个位数百分比比如1%-5%。浏览到购买的每一步都是巨大的筛选过程。关键不是绝对值而是相对值和趋势。例如通过A/B测试改版页面后转化率从0.8%提升到1.0%这就是一个巨大的成功。要关注的是不同渠道、不同商品、不同用户群之间的转化率差异。Q4: RFM模型的分箱标准为什么用四分位可以改吗完全可以而且应该根据业务调整。四分位是一个通用的起点。你可以根据业务经验手动定义阈值。例如对于“R最近购买时间”业务上可能认为“30天内购买过”就是高价值用户那么就可以用30天作为分界点而不是数据分布的四分位。模型要服务于业务洞察而不是死板的数学公式。6.3 项目扩展与优化方向这个基础项目可以朝很多方向深化关联规则分析使用mlxtend库的Apriori算法分析“买了A商品的用户也经常买B商品”用于商品捆绑销售或跨类目推荐。用户生命周期预测基于用户最近一次购买时间、购买频率等使用生存分析或机器学习模型预测用户在未来一段时间内流失的概率。集成BI工具将处理好的数据结果如每日汇总表、用户分群表导入到Superset、Metabase等开源BI工具中制作可交互的仪表盘让业务人员能随时查看。自动化与调度使用Apache Airflow或Prefect将整个数据分析流程数据清洗-分析-报告生成自动化每天定时运行输出日报。最后一点个人体会数据分析项目代码实现只是骨架真正的血肉是业务逻辑和数据敏感度。在写每一行分析代码时都要问自己“这个指标反映了业务上的什么问题这个异常值可能是由什么运营动作导致的” 多和业务方沟通把你的数据发现用他们能听懂的语言讲出来这个项目的价值才算真正落地。这个源码提供了一个坚实的起点但更精彩的故事需要你结合具体的业务场景去书写。本文还有配套的精品资源点击获取
返回列表