Python电商数据分析实战:从清洗到可视化

📅 2026/7/21 5:01:35
Python电商数据分析实战:从清洗到可视化
1. 电商数据分析实战概述电商销售数据分析是当前企业运营决策的重要支撑。作为一名长期从事数据分析的从业者我经常需要处理来自各类电商平台的销售数据。Python凭借其丰富的数据处理库和可视化工具成为电商数据分析的首选工具。这次我们将使用Python对某电商平台的销售数据进行完整分析。这个实战项目适合以下人群刚入门数据分析的新手想了解完整分析流程电商运营人员希望用数据驱动决策Python开发者想掌握pandas等库的实际应用我们将从数据清洗开始逐步完成销售趋势分析、用户行为洞察和商品表现评估最终产出可直接用于业务决策的分析报告。整个流程约需2-3小时使用Jupyter Notebook环境会更方便操作和记录。2. 数据准备与清洗2.1 数据获取与初步观察电商销售数据通常包含以下核心字段订单ID、下单时间用户ID、用户地区商品ID、商品类别、单价购买数量、支付金额促销信息、支付方式假设我们已经从电商后台导出CSV格式的原始数据首先用pandas加载数据import pandas as pd # 读取数据 df pd.read_csv(ecommerce_sales.csv, encodingutf-8) # 查看数据概览 print(df.info()) print(df.head())注意实际数据可能包含中文需指定utf-8编码。若数据量较大(1GB)建议使用chunksize分块读取。2.2 数据清洗关键步骤电商数据常见问题及处理方法缺失值处理# 检查各列缺失率 missing_ratio df.isnull().sum() / len(df) # 关键字段缺失直接删除行 df df.dropna(subset[order_id, user_id, product_id]) # 非关键字段合理填充 df[discount] df[discount].fillna(0) # 折扣缺失视为无折扣异常值检测# 价格异常检测 price_stats df[price].describe() upper_limit price_stats[75%] 3*(price_stats[75%]-price_stats[25%]) df df[df[price] upper_limit] # 数量异常检测 df df[(df[quantity] 0) (df[quantity] 100)]时间格式标准化df[order_time] pd.to_datetime(df[order_time], format%Y-%m-%d %H:%M:%S) df[order_date] df[order_time].dt.date重复数据处理# 基于订单ID去重 df df.drop_duplicates(subset[order_id], keeplast)3. 销售趋势分析3.1 时间维度分析首先分析销售随时间的变化趋势import matplotlib.pyplot as plt # 按日统计销售额 daily_sales df.groupby(order_date)[amount].sum() # 绘制趋势图 plt.figure(figsize(12,6)) daily_sales.plot(titleDaily Sales Trend) plt.xlabel(Date) plt.ylabel(Sales Amount) plt.grid() plt.show()进阶分析可加入周维度分析weekday/weekend模式小时维度分析购买高峰时段节假日效应分析3.2 品类销售结构分析各商品类别的销售表现# 按品类统计 category_sales df.groupby(category)[amount].agg([sum,count]) # 计算占比 category_sales[amount_pct] category_sales[sum] / category_sales[sum].sum() category_sales[order_pct] category_sales[count] / category_sales[count].sum() # 绘制帕累托图 category_sales category_sales.sort_values(sum, ascendingFalse) category_sales[cum_pct] category_sales[amount_pct].cumsum() plt.figure(figsize(10,6)) ax category_sales[sum].plot(kindbar) category_sales[cum_pct].plot(styler-, secondary_yTrue) plt.title(Sales by Category (Pareto Analysis)) plt.show()4. 用户行为分析4.1 RFM用户分群RFM模型是电商用户分析的经典方法# 计算RFM指标 import datetime as dt snapshot_date df[order_date].max() dt.timedelta(days1) rfm df.groupby(user_id).agg({ order_date: lambda x: (snapshot_date - x.max()).days, # Recency order_id: count, # Frequency amount: sum # Monetary }).rename(columns{ order_date: recency, order_id: frequency, amount: monetary }) # RFM打分 rfm[R] pd.qcut(rfm[recency], q5, labels[5,4,3,2,1]) rfm[F] pd.qcut(rfm[frequency], q5, labels[1,2,3,4,5]) rfm[M] pd.qcut(rfm[monetary], q5, labels[1,2,3,4,5]) rfm[RFM_Score] rfm[R].astype(str) rfm[F].astype(str) rfm[M].astype(str)4.2 用户留存分析计算用户复购情况# 标记用户首单和复购 user_first_purchase df.groupby(user_id)[order_date].min().reset_index() user_first_purchase.columns [user_id,first_purchase_date] df pd.merge(df, user_first_purchase, onuser_id) df[is_repeat] (df[order_date] df[first_purchase_date]).astype(int) # 计算月度留存率 cohort_data df.groupby([first_purchase_month,order_month])[user_id].nunique().unstack() retention_rate cohort_data.divide(cohort_data.iloc[:,0], axis0)5. 商品分析5.1 商品销售排行识别畅销和滞销商品product_perf df.groupby(product_id).agg({ quantity: sum, amount: sum, price: mean }).sort_values(amount, ascendingFalse) # ABC分类 product_perf[cum_pct] product_perf[amount].cumsum() / product_perf[amount].sum() product_perf[abc_class] pd.cut(product_perf[cum_pct], bins[0,0.8,0.95,1], labels[A,B,C])5.2 商品关联分析使用Apriori算法发现常一起购买的商品组合from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules # 构建购物篮数据 basket df.groupby([order_id,product_name])[quantity].sum().unstack().fillna(0) basket basket.applymap(lambda x: 1 if x 0 else 0) # 挖掘频繁项集 frequent_itemsets apriori(basket, min_support0.02, use_colnamesTrue) rules association_rules(frequent_itemsets, metriclift, min_threshold1)6. 分析报告生成6.1 关键指标仪表盘使用Plotly创建交互式仪表盘import plotly.express as px from plotly.subplots import make_subplots # 创建子图布局 fig make_subplots( rows2, cols2, specs[[{type: indicator}, {type: pie}], [{type: bar}, {type: scatter}]], subplot_titles(GMV,Category Share,Top Products,Price-Sales Relation) ) # 添加指标 fig.add_trace(go.Indicator( modenumber, valuedf[amount].sum(), titleTotal GMV), row1, col1) # 添加其他图表... fig.update_layout(height600, width800, title_textE-commerce Dashboard) fig.show()6.2 自动化报告输出使用Jinja2模板生成PDF报告from jinja2 import Environment, FileSystemLoader from weasyprint import HTML env Environment(loaderFileSystemLoader(.)) template env.get_template(report_template.html) html_out template.render( total_salesdf[amount].sum(), top_productsproduct_perf.head(5).to_dict(records), category_distcategory_sales.to_dict(records) ) HTML(stringhtml_out).write_pdf(ecommerce_report.pdf)7. 实战经验与避坑指南数据质量检查电商数据常见时间戳格式混乱建议先用pd.to_datetime测试转换金额字段要检查货币单位是否统一如元/万元混用用户ID要注意是否有测试账号混入如包含test字样性能优化技巧对于大型数据集将category类型用于低基数字段使用query()代替布尔索引提升过滤速度考虑使用Dask或Modin处理超大数据分析误区避免不要忽略退货数据对分析的影响促销活动期间的数据需单独分析用户地域分布可能影响购买时间模式实用代码片段# 快速查看数据分布 def quick_eda(df): for col in df.columns: if df[col].dtype in [int64,float64]: display(df[col].describe()) df[col].hist() plt.show() else: display(df[col].value_counts().head())扩展分析方向结合外部数据天气、经济指标等用户生命周期价值预测价格弹性分析库存周转分析