Python实战:用Pandas+Matplotlib搞定电商销售帕累托分析(附完整代码)

电商运营中常会遇到这样的问题:80%的销售额可能来自20%的商品。如何精准识别这些核心商品?本文将手把手教你用Python的Pandas和Matplotlib库,从原始销售数据中挖掘出真正的"利润引擎"。

1. 数据准备与清洗

首先导入必要的库并加载数据。假设我们有一个包含商品销售记录的CSV文件:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 加载数据
df = pd.read_csv('ecommerce_sales.csv')
print(df.head())

典型的数据清洗步骤包括:

  • 处理缺失值
  • 统一商品名称格式
  • 转换日期格式
  • 验证金额数据有效性
# 基础数据清洗
df = df.dropna()  # 删除缺失值
df['product'] = df['product'].str.strip().str.lower()  # 统一商品名称格式
df['date'] = pd.to_datetime(df['date'])  # 转换日期格式
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')  # 确保金额为数值
df = df.dropna(subset=['amount'])  # 删除无效金额记录

2. 计算商品销售额排名

接下来按商品汇总销售额并排序:

# 按商品汇总销售额
product_sales = df.groupby('product')['amount'].sum().reset_index()
product_sales = product_sales.sort_values('amount', ascending=False)

# 计算累计销售额和百分比
product_sales['cum_amount'] = product_sales['amount'].cumsum()
total_sales = product_sales['amount'].sum()
product_sales['cum_percent'] = product_sales['cum_amount'] / total_sales * 100

# 标记80%分界点
product_sales['is_80pct'] = product_sales['cum_percent'] <= 80

关键指标计算结果示例:

商品名称 销售额 累计销售额 累计百分比 是否80%内
商品A 15000 15000 30% True
商品B 12000 27000 54% True
商品C 8000 35000 70% True
商品D 6000 41000 82% False

3. 绘制帕累托图

现在用Matplotlib绘制专业的帕累托图:

plt.figure(figsize=(12, 6))

# 创建双坐标轴
ax1 = plt.gca()
ax2 = ax1.twinx()

# 绘制柱状图(销售额)
colors = ['#1f77b4' if x else '#d62728' for x in product_sales['is_80pct']]
ax1.bar(product_sales.index, product_sales['amount'], color=colors, width=0.6)

# 绘制折线图(累计百分比)
ax2.plot(product_sales.index, product_sales['cum_percent'], 
         color='green', marker='o', linewidth=2)

# 设置坐标轴标签
ax1.set_xlabel('商品排名')
ax1.set_ylabel('销售额', color='#1f77b4')
ax2.set_ylabel('累计百分比(%)', color='green')

# 设置刻度
ax1.set_xticks(product_sales.index)
ax1.set_xticklabels(product_sales['product'], rotation=45, ha='right')

# 添加80%参考线
ax2.axhline(80, color='red', linestyle='--')
ax2.text(len(product_sales)*0.7, 82, '80%分界线', color='red')

# 添加图例和标题
ax1.legend(['销售额'], loc='upper left')
ax2.legend(['累计百分比'], loc='upper right')
plt.title('商品销售帕累托分析')
plt.tight_layout()
plt.show()

4. 结果分析与业务应用

通过帕累托图,我们可以清晰地看到:

  1. 核心商品识别:前30%的商品贡献了80%的销售额
  2. 长尾商品分析:剩余70%的商品仅贡献20%的销售额
  3. 库存优化建议
    • 对核心商品增加库存和安全库存
    • 对长尾商品减少库存或考虑下架
  4. 营销策略调整
    • 为核心商品设计促销活动
    • 对潜力商品(接近80%分界线的)进行重点推广

5. 进阶技巧与优化

5.1 动态帕累托分析

对于大型电商平台,可以按时间维度进行动态分析:

# 按月分析帕累托
df['month'] = df['date'].dt.to_period('M')
monthly_pareto = df.groupby(['month', 'product'])['amount'].sum().reset_index()

for month, data in monthly_pareto.groupby('month'):
    # 每月执行帕累托分析
    pass

5.2 结合RFM模型

将帕累托分析与RFM模型结合,实现更全面的客户价值分析:

# RFM计算
snapshot_date = df['date'].max() + pd.Timedelta(days=1)
rfm = df.groupby('customer_id').agg({
    'date': lambda x: (snapshot_date - x.max()).days,
    'order_id': 'count',
    'amount': 'sum'
}).rename(columns={
    'date': 'recency',
    'order_id': 'frequency',
    'amount': 'monetary'
})

# RFM评分
rfm['R_score'] = pd.qcut(rfm['recency'], q=5, labels=[5,4,3,2,1])
rfm['F_score'] = pd.qcut(rfm['frequency'], q=5, labels=[1,2,3,4,5])
rfm['M_score'] = pd.qcut(rfm['monetary'], q=5, labels=[1,2,3,4,5])
rfm['RFM_score'] = rfm['R_score'].astype(str) + rfm['F_score'].astype(str) + rfm['M_score'].astype(str)

5.3 自动化报表生成

将分析过程封装成函数,实现一键生成报表:

def generate_pareto_report(df, date_col='date', product_col='product', amount_col='amount'):
    """生成帕累托分析报表"""
    # 数据清洗
    clean_df = clean_data(df, date_col, product_col, amount_col)
    
    # 计算帕累托
    pareto_df = calculate_pareto(clean_df, product_col, amount_col)
    
    # 绘制图表
    fig = plot_pareto(pareto_df, product_col, amount_col)
    
    # 生成分析结论
    insights = generate_insights(pareto_df)
    
    return {
        'data': pareto_df,
        'figure': fig,
        'insights': insights
    }

6. 常见问题与解决方案

在实际应用中可能会遇到以下问题:

  1. 数据量过大导致性能问题

    • 解决方案:使用Dask替代Pandas处理大数据
    • 代码示例:
      import dask.dataframe as dd
      ddf = dd.read_csv('large_sales.csv')
      
  2. 商品名称不规范

    • 解决方案:使用模糊匹配统一商品名称
    • 代码示例:
      from fuzzywuzzy import fuzz
      def match_products(name, product_list):
          return max(product_list, key=lambda x: fuzz.ratio(name, x))
      
  3. 季节性波动影响

    • 解决方案:按季节或月份分别分析
    • 代码示例:
      df['season'] = df['date'].dt.quarter
      seasonal_pareto = df.groupby(['season', 'product'])['amount'].sum().reset_index()
      
  4. 可视化定制需求

    • 解决方案:使用Plotly实现交互式图表
    • 代码示例:
      import plotly.express as px
      fig = px.bar(pareto_df, x='product', y='amount', color='is_80pct')
      fig.show()
      

通过本教程,你不仅掌握了帕累托分析的核心技术,还学到了如何将分析结果转化为实际的业务决策。这种数据驱动的方法可以帮助电商企业优化库存、提升营销效果,最终实现业绩增长。

更多推荐