双11”数据洞察:Pyecharts与Matplotlib实战商品价格与动态分布

一、引言:双11数据可视化的核心价值

双11作为全球最大的购物狂欢节,其背后产生的海量数据蕴含着商业洞察的巨大价值。商家需要快速分析商品价格竞争力、品类销售占比等关键指标以优化促销策略;消费者则希望直观对比商品价格趋势,辅助决策。传统表格数据难以满足快速理解的需求,而数据可视化技术能够将复杂数据转化为直观图表,显著提升分析效率。

本文将聚焦双11数据中的两大核心场景:商品价格对比分析销售品类动态分布,通过对比Pyecharts与Matplotlib两大Python可视化库的技术特性,提供从基础图表绘制到动态交互设计的完整解决方案。Pyecharts基于ECharts实现,适合快速生成交互式图表;Matplotlib作为Python生态的基石库,在静态图表定制化方面具有优势。掌握两者的结合使用,可覆盖双11数据可视化的全场景需求。

二、商品价格对比:Pyecharts的交互式箱线图实践

1. 数据准备与预处理

双11商品价格数据通常包含商品ID、名称、原价、促销价、品类等字段。以某电商平台美妆品类为例,数据可能呈现以下特征:

  • 同一品类下不同品牌价格跨度大(如口红从50元到500元)
  • 促销价与原价差异显著
  • 存在异常值(如限量套装价格远高于常规单品)
  1. import pandas as pd
  2. # 模拟数据:包含商品ID、品类、原价、促销价
  3. data = {
  4. '商品ID': ['P001', 'P002', 'P003', 'P004', 'P005'],
  5. '品类': ['口红', '口红', '粉底液', '粉底液', '眼影'],
  6. '原价': [320, 150, 450, 380, 280],
  7. '促销价': [199, 99, 299, 249, 169]
  8. }
  9. df = pd.DataFrame(data)

2. Pyecharts箱线图实现

箱线图(Box Plot)是分析价格分布的理想工具,可直观展示中位数、四分位数、异常值等统计特征。Pyecharts的Boxplot类支持交互式操作,如悬停显示数值、缩放局部区域等。

  1. from pyecharts.charts import Boxplot
  2. from pyecharts import options as opts
  3. # 按品类分组计算价格统计量
  4. price_groups = df.groupby('品类')['促销价'].agg(['min', 'max', 'median', 'q1', 'q3']).reset_index()
  5. # 准备箱线图数据格式
  6. box_data = []
  7. for _, row in price_groups.iterrows():
  8. box_data.append((row['品类'], [
  9. row['min'],
  10. row['q1'],
  11. row['median'],
  12. row['q3'],
  13. row['max']
  14. ]))
  15. # 创建箱线图
  16. box = (
  17. Boxplot()
  18. .add_xaxis([x[0] for x in box_data])
  19. .add_yaxis("促销价", [x[1] for x in box_data])
  20. .set_global_opts(
  21. title_opts=opts.TitleOpts(title="美妆品类促销价分布"),
  22. tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a}: {b}<br/>最小值: {c}[0]<br/>Q1: {c}[1]<br/>中位数: {c}[2]<br/>Q3: {c}[3]<br/>最大值: {c}[4]")
  23. )
  24. )
  25. box.render("boxplot_price.html")

技术要点

  • 数据预处理阶段需计算五数概括(最小值、Q1、中位数、Q3、最大值)
  • Pyecharts的add_yaxis方法要求数据格式为[(品类, [五数概括])]
  • 通过tooltip_opts自定义悬停提示,增强信息展示

3. Matplotlib箱线图对比

Matplotlib的boxplot函数提供更底层的控制,适合需要高度定制的场景:

  1. import matplotlib.pyplot as plt
  2. # 按品类提取价格列表
  3. price_dict = {}
  4. for category in df['品类'].unique():
  5. price_dict[category] = df[df['品类'] == category]['促销价'].tolist()
  6. plt.figure(figsize=(10, 6))
  7. plt.boxplot(price_dict.values(), labels=price_dict.keys())
  8. plt.title('美妆品类促销价分布(Matplotlib)')
  9. plt.ylabel('价格(元)')
  10. plt.grid(True, linestyle='--', alpha=0.7)
  11. plt.show()

对比分析
| 特性 | Pyecharts | Matplotlib |
|——————————-|———————————————-|—————————————|
| 交互性 | 支持悬停、缩放、下载图片 | 仅静态展示 |
| 定制难度 | 通过选项配置,代码简洁 | 需手动设置每个元素 |
| 输出格式 | HTML(可嵌入网页) | 静态图片(PNG/SVG等) |
| 适用场景 | 快速生成交互式报告 | 学术论文、高定制化需求 |

三、动态饼图:销售品类占比的时空演变

1. 双11销售数据的时序特征

双11销售数据具有显著的时序性:

  • 预热期(10月20日-10月31日):美妆、服饰等品类预售占比高
  • 正式期(11月1日-11月10日):3C数码、家电销量激增
  • 高潮期(11月11日当天):全品类爆发,但品类结构动态变化
  1. # 模拟时序销售数据
  2. import numpy as np
  3. np.random.seed(42)
  4. dates = pd.date_range('2023-10-20', '2023-11-11')
  5. categories = ['美妆', '3C数码', '家电', '服饰', '食品']
  6. sales_data = []
  7. for date in dates:
  8. base_sales = np.random.randint(500, 2000, size=len(categories))
  9. # 模拟时序波动:预热期美妆高,正式期3C高,高潮期均衡
  10. if date.day <= 10:
  11. base_sales[0] *= 1.5 if date.month == 10 else 1.0 # 10月预热期美妆加成
  12. elif date.day <= 11:
  13. base_sales[1] *= 1.8 # 11月正式期3C数码加成
  14. sales_data.append({
  15. '日期': date,
  16. '品类': categories,
  17. '销售额': base_sales
  18. })
  19. # 转换为长格式便于分析
  20. long_data = []
  21. for record in sales_data:
  22. for cat, sale in zip(record['品类'], record['销售额']):
  23. long_data.append({
  24. '日期': record['日期'],
  25. '品类': cat,
  26. '销售额': sale
  27. })
  28. df_long = pd.DataFrame(long_data)

2. Pyecharts动态饼图实现

Pyecharts的Timeline组件支持创建随时间变化的动态图表,非常适合展示双11期间品类占比的演变。

  1. from pyecharts.charts import Pie, Timeline
  2. from pyecharts import options as opts
  3. # 按日期分组计算品类占比
  4. timeline = Timeline()
  5. for date in df_long['日期'].unique():
  6. daily_data = df_long[df_long['日期'] == date]
  7. total_sales = daily_data['销售额'].sum()
  8. pie_data = [
  9. (cat, sale/total_sales*100)
  10. for cat, sale in zip(daily_data['品类'], daily_data['销售额'])
  11. ]
  12. pie = (
  13. Pie()
  14. .add("", pie_data, radius=["40%", "70%"])
  15. .set_global_opts(
  16. title_opts=opts.TitleOpts(title=f"双11品类销售占比 {date.strftime('%m-%d')}"),
  17. legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")
  18. )
  19. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%"))
  20. )
  21. timeline.add(pie, date.strftime('%m-%d'))
  22. timeline.add_schema(
  23. play_interval=1000, # 自动播放间隔(毫秒)
  24. is_timeline_show=True,
  25. is_auto_play=True,
  26. is_loop_play=True
  27. )
  28. timeline.render("dynamic_pie_timeline.html")

关键技术

  • Timeline组件通过add方法逐日添加饼图
  • play_interval控制自动播放速度
  • 饼图半径设置为["40%", "70%"]创建环形效果
  • 百分比标签通过formatter自定义显示格式

3. Matplotlib动态实现方案

Matplotlib本身不支持动态交互,但可通过以下方式模拟:

  1. 生成多张静态图:为每个时间点创建饼图,保存为图片序列
  2. 使用动画库:结合matplotlib.animation创建GIF动画
  3. Jupyter交互:在Notebook中使用ipywidgets实现滑块控制
  1. # 示例:生成GIF动画
  2. import matplotlib.animation as animation
  3. from IPython.display import HTML
  4. fig, ax = plt.subplots(figsize=(8, 8))
  5. ax.set_title('双11品类销售占比演变')
  6. def update(frame):
  7. ax.clear()
  8. daily_data = df_long[df_long['日期'] == dates[frame]]
  9. total_sales = daily_data['销售额'].sum()
  10. sizes = daily_data['销售额'] / total_sales * 100
  11. labels = daily_data['品类']
  12. ax.pie(sizes, labels=labels, autopct='%1.1f%%',
  13. startangle=90, counterclock=False)
  14. ax.set_title(f"双11品类销售占比 {dates[frame].strftime('%m-%d')}")
  15. ani = animation.FuncAnimation(fig, update, frames=len(dates), interval=1000)
  16. # 在Jupyter中显示
  17. HTML(ani.to_jshtml())
  18. # 或保存为GIF
  19. # ani.save('dynamic_pie.gif', writer='pillow', fps=1)

方案对比
| 特性 | Pyecharts Timeline | Matplotlib Animation |
|——————————-|———————————————-|———————————————|
| 交互性 | 支持播放/暂停/速度控制 | 仅自动播放 |
| 文件体积 | HTML(约200KB-500KB) | GIF(可能达数MB) |
| 部署复杂度 | 直接嵌入网页 | 需额外处理动画文件 |
| 适用场景 | 数据分析报告、仪表盘 | 社交媒体分享、简短演示 |

四、最佳实践建议

1. 工具选择矩阵

需求场景 推荐工具组合
快速生成交互式报告 Pyecharts(箱线图+Timeline)
学术论文图表 Matplotlib(高定制静态图)
大屏可视化展示 Pyecharts(HTML嵌入)
本地分析笔记 Matplotlib(Jupyter集成)

2. 数据预处理要点

  • 异常值处理:对价格数据使用Winsorization(缩尾处理)或分箱处理
  • 时序对齐:确保动态图表的时间粒度一致(如按日/小时)
  • 占比计算:动态饼图需每日重新计算总和,避免累积误差

3. 性能优化技巧

  • 大数据量处理:Pyecharts支持datazoom组件实现局部缩放
  • 静态图优化:Matplotlib中使用plt.tight_layout()避免标签重叠
  • 动态图缓存:对历史数据预计算占比,减少实时计算量

五、总结与扩展

本文通过双11商品价格对比与销售品类动态分布两个典型场景,系统对比了Pyecharts与Matplotlib的技术特性。Pyecharts在交互式可视化方面表现卓越,适合快速构建数据洞察仪表盘;Matplotlib则在静态图表定制化方面具有不可替代的优势。实际项目中,建议根据以下原则选择工具:

  1. 需求优先级:交互性>静态展示时选Pyecharts,反之选Matplotlib
  2. 部署环境:网页展示选Pyecharts,文档嵌入选Matplotlib
  3. 数据规模:动态图表数据量超过1万条时需考虑性能优化

扩展方向

  • 结合Pandas的resample方法实现更灵活的时序聚合
  • 使用Pyecharts的Geo组件绘制销售地域分布热力图
  • 集成Dash/Streamlit构建完整的双11数据分析仪表盘

通过掌握这两种工具的组合使用,数据分析师能够高效应对双11等大型促销活动的数据可视化需求,为商业决策提供有力支持。