Python电商数据分析实战:从清洗到可视化
2026/7/25 3:27:19 网站建设 项目流程

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', encoding='utf-8') # 查看数据概览 print(df.info()) print(df.head())

注意:实际数据可能包含中文,需指定utf-8编码。若数据量较大(>1GB),建议使用chunksize分块读取。

2.2 数据清洗关键步骤

电商数据常见问题及处理方法:

  1. 缺失值处理
# 检查各列缺失率 missing_ratio = df.isnull().sum() / len(df) # 关键字段缺失直接删除行 df = df.dropna(subset=['order_id', 'user_id', 'product_id']) # 非关键字段合理填充 df['discount'] = df['discount'].fillna(0) # 折扣缺失视为无折扣
  1. 异常值检测
# 价格异常检测 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)]
  1. 时间格式标准化
df['order_time'] = pd.to_datetime(df['order_time'], format='%Y-%m-%d %H:%M:%S') df['order_date'] = df['order_time'].dt.date
  1. 重复数据处理
# 基于订单ID去重 df = df.drop_duplicates(subset=['order_id'], keep='last')

3. 销售趋势分析

3.1 时间维度分析

首先分析销售随时间的变化趋势:

import matplotlib.pyplot as plt # 按日统计销售额 daily_sales = df.groupby('order_date')['amount'].sum() # 绘制趋势图 plt.figure(figsize=(12,6)) daily_sales.plot(title='Daily 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', ascending=False) category_sales['cum_pct'] = category_sales['amount_pct'].cumsum() plt.figure(figsize=(10,6)) ax = category_sales['sum'].plot(kind='bar') category_sales['cum_pct'].plot(style='r-', secondary_y=True) 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(days=1) 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'], q=5, labels=[5,4,3,2,1]) rfm['F'] = pd.qcut(rfm['frequency'], q=5, labels=[1,2,3,4,5]) rfm['M'] = pd.qcut(rfm['monetary'], q=5, 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, on='user_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], axis=0)

5. 商品分析

5.1 商品销售排行

识别畅销和滞销商品:

product_perf = df.groupby('product_id').agg({ 'quantity': 'sum', 'amount': 'sum', 'price': 'mean' }).sort_values('amount', ascending=False) # 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_support=0.02, use_colnames=True) rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)

6. 分析报告生成

6.1 关键指标仪表盘

使用Plotly创建交互式仪表盘:

import plotly.express as px from plotly.subplots import make_subplots # 创建子图布局 fig = make_subplots( rows=2, cols=2, specs=[[{"type": "indicator"}, {"type": "pie"}], [{"type": "bar"}, {"type": "scatter"}]], subplot_titles=("GMV","Category Share","Top Products","Price-Sales Relation") ) # 添加指标 fig.add_trace(go.Indicator( mode="number", value=df['amount'].sum(), title="Total GMV"), row=1, col=1) # 添加其他图表... fig.update_layout(height=600, width=800, title_text="E-commerce Dashboard") fig.show()

6.2 自动化报告输出

使用Jinja2模板生成PDF报告:

from jinja2 import Environment, FileSystemLoader from weasyprint import HTML env = Environment(loader=FileSystemLoader('.')) template = env.get_template("report_template.html") html_out = template.render( total_sales=df['amount'].sum(), top_products=product_perf.head(5).to_dict('records'), category_dist=category_sales.to_dict('records') ) HTML(string=html_out).write_pdf("ecommerce_report.pdf")

7. 实战经验与避坑指南

  1. 数据质量检查
  • 电商数据常见时间戳格式混乱,建议先用pd.to_datetime测试转换
  • 金额字段要检查货币单位是否统一(如元/万元混用)
  • 用户ID要注意是否有测试账号混入(如包含"test"字样)
  1. 性能优化技巧
  • 对于大型数据集,将category类型用于低基数字段
  • 使用query()代替布尔索引提升过滤速度
  • 考虑使用Dask或Modin处理超大数据
  1. 分析误区避免
  • 不要忽略退货数据对分析的影响
  • 促销活动期间的数据需单独分析
  • 用户地域分布可能影响购买时间模式
  1. 实用代码片段
# 快速查看数据分布 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())
  1. 扩展分析方向
  • 结合外部数据(天气、经济指标等)
  • 用户生命周期价值预测
  • 价格弹性分析
  • 库存周转分析

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询