Python实战:用Pandas+Matplotlib搞定电商销售帕累托分析(附完整代码)
·
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. 结果分析与业务应用
通过帕累托图,我们可以清晰地看到:
- 核心商品识别:前30%的商品贡献了80%的销售额
- 长尾商品分析:剩余70%的商品仅贡献20%的销售额
- 库存优化建议:
- 对核心商品增加库存和安全库存
- 对长尾商品减少库存或考虑下架
- 营销策略调整:
- 为核心商品设计促销活动
- 对潜力商品(接近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. 常见问题与解决方案
在实际应用中可能会遇到以下问题:
-
数据量过大导致性能问题
- 解决方案:使用Dask替代Pandas处理大数据
- 代码示例:
import dask.dataframe as dd ddf = dd.read_csv('large_sales.csv')
-
商品名称不规范
- 解决方案:使用模糊匹配统一商品名称
- 代码示例:
from fuzzywuzzy import fuzz def match_products(name, product_list): return max(product_list, key=lambda x: fuzz.ratio(name, x))
-
季节性波动影响
- 解决方案:按季节或月份分别分析
- 代码示例:
df['season'] = df['date'].dt.quarter seasonal_pareto = df.groupby(['season', 'product'])['amount'].sum().reset_index()
-
可视化定制需求
- 解决方案:使用Plotly实现交互式图表
- 代码示例:
import plotly.express as px fig = px.bar(pareto_df, x='product', y='amount', color='is_80pct') fig.show()
通过本教程,你不仅掌握了帕累托分析的核心技术,还学到了如何将分析结果转化为实际的业务决策。这种数据驱动的方法可以帮助电商企业优化库存、提升营销效果,最终实现业绩增长。
更多推荐



所有评论(0)