使用Python seaborn创建帕累托图:从核心概念到实战案例

帕累托图是一种图表类型,它显示类别的有序频率以及类别的累积频率。本教程提供了如何在Python中创建帕累托图的逐步示例。

介绍帕累托图

帕累托图定义

帕累托图(Pareto Chart)是一种条形图与折线图的组合图表,基于意大利经济学家维尔弗雷多·帕累托提出的80/20法则(即约80%的结果由20%的原因导致)。其核心特征包括:

  1. 条形部分:按数值大小降序排列,展示各类别的频次或影响程度。
  2. 折线部分:显示累积百分比(Cumulative Percentage),反映前N项因素对整体的贡献占比。
  3. 目的:快速识别导致大多数问题的关键少数(Key Few)因素。

帕累托图核心作用

  1. 优先级排序:明确哪些因素是影响结果的主要驱动者。
  2. 资源聚焦:指导团队优先解决高权重问题(如改进前20%的缺陷类型)。
  3. 数据分布分析:验证是否符合80/20分布规律,或发现异常长尾。

示例场景

  • 客户投诉中,80%的投诉来自20%的产品型号。
  • 企业利润的80%由20%的客户贡献。

典型应用场景

领域具体案例
质量管理分析生产线缺陷,定位导致80%故障的少数工艺步骤。
客户服务统计客户投诉类型,优先解决高频问题(如退货率高的产品)。
销售与营销识别贡献80%营收的20%客户或渠道,优化资源分配。
风险管理评估风险事件发生的频率,聚焦高风险类别。
健康医疗分析疾病发病率,确定需优先防控的病种。

matplotlib实现示例

步骤1:创建数据

假设我们进行一项调查,让350个不同的人在品牌a、B、C、D和E中找出他们最喜欢的麦片品牌。我们可以创建如下的pandas DataFrame来保存调查结果:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'count': [97, 140, 58, 6, 17, 32]})
df.index = ['B', 'A', 'C', 'F', 'E', 'D']

#sort DataFrame by count descending
df = df.sort_values(by='count', ascending=False)

#add column to display cumulative percentage
df['cumperc'] = df['count'].cumsum()/df['count'].sum()*100

#view DataFrame
df

	count	cumperc
A	140	40.000000
B	97	67.714286
C	58	84.285714
D	32	93.428571
E	17	98.285714
F	6	100.000000

步骤2:创建帕累托图

我们可以使用下面的代码来创建帕累托图:

import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter

#define aesthetics for plot
color1 = 'steelblue'
color2 = 'red'
line_size = 4

#create basic bar plot
fig, ax = plt.subplots()
ax.bar(df.index, df['count'], color=color1)

#add cumulative percentage line to plot
ax2 = ax.twinx()
ax2.plot(df.index, df['cumperc'], color=color2, marker="D", ms=line_size)
ax2.yaxis.set_major_formatter(PercentFormatter())

#specify axis colors
ax.tick_params(axis='y', colors=color1)
ax2.tick_params(axis='y', colors=color2)

#display Pareto chart
plt.show()

x轴显示从最高到最低频率排序的不同品牌。左边的y轴表示每个品牌的频率,右边的y轴表示品牌的累计频率。

例如,我们可以看到:

  • 品牌A约占总调查回复的40%
  • 品牌A和B约占总调查回应的70%
  • 品牌A、B和C约占总调查回复的85%
  • 等等…
    在这里插入图片描述

步骤3:自定义帕累托图(可选)

你可以更改条形图的颜色和累积百分比线的大小,使帕累托图看起来像你喜欢的那样。例如,我们可以将条形图改为粉色,将线条改为紫色并稍微粗一些:

import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter

#define aesthetics for plot
color1 = 'pink'
color2 = 'purple'
line_size = 6

#create basic bar plot
fig, ax = plt.subplots()
ax.bar(df.index, df['count'], color=color1)

#add cumulative percentage line to plot
ax2 = ax.twinx()
ax2.plot(df.index, df['cumperc'], color=color2, marker="D", ms=line_size)
ax2.yaxis.set_major_formatter(PercentFormatter())

#specify axis colors
ax.tick_params(axis='y', colors=color1)
ax2.tick_params(axis='y', colors=color2)

#display Pareto chart
plt.show()

在这里插入图片描述

Seaborn实现代码

以下通过Python的seabornmatplotlib库,演示如何基于模拟数据创建帕累托图:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 1. 模拟数据(示例:产品缺陷分类统计)
categories = ['设计缺陷', '制造缺陷', '运输损坏', '用户误操作', '其他']
values = [450, 300, 120, 90, 40]  # 各缺陷类型的数量

# 创建DataFrame并排序(按值降序)
df = pd.DataFrame({'Category': categories, 'Value': values})
df.sort_values(by='Value', ascending=False, inplace=True)

# 2. 计算累积百分比
df['Cumulative'] = df['Value'].cumsum()
df['Cumulative_Percentage'] = (df['Cumulative'] / df['Value'].sum()) * 100

# 3. 绘制帕累托图
plt.figure(figsize=(10, 6))
sns.barplot(x=df['Category'], y=df['Value'], palette='viridis')  # 条形图
plt.plot(df['Category'], df['Cumulative_Percentage'], marker='o', color='red', linestyle='--')  # 折线图

# 4. 添加标签与标题
plt.title('产品缺陷分布帕累托图', fontsize=14, pad=20)
plt.xlabel('缺陷类型', fontsize=12)
plt.ylabel('缺陷数量', fontsize=12)
plt.xticks(rotation=45)
plt.ylim(0, 100)  # 限定纵轴范围为0-100%
plt.axhline(y=80, color='gray', linestyle='-', linewidth=0.5)  # 标注80%分界线

# 5. 显示图表
plt.tight_layout()
plt.show()

代码说明

  1. 数据准备:创建包含缺陷类型及其数量的DataFrame,并按数值降序排列。
  2. 累积百分比计算:使用cumsum()函数计算累计值,并转换为百分比。
  3. 可视化:
    • sns.barplot绘制条形图,颜色使用viridis色系。
    • plt.plot添加红色虚线折线,标记累积百分比。
    • 通过axhline添加80%参考线,辅助判断是否满足80/20法则。

输出效果

  • 条形图显示各缺陷类型的数量分布。
  • 折线图从左上到右下递减,反映累积贡献比例。
  • 若前两项累积百分比超过80%,则符合80/20规律(如图中设计缺陷占45%,制造缺陷占30%,两者合计75%)。

进阶优化技巧

  1. 交互式帕累托图:使用plotly库创建动态图表,悬停显示详细数值。

    import plotly.express as px
    fig = px.pareto(df, x='Category', y='Value', cumulative=True)
    fig.update_layout(title='Interactive Pareto Chart')
    fig.show()
    
  2. 多维度对比:按时间维度分组,生成动态帕累托图观察趋势变化。

  3. 结合其他图表:如将帕累托图与饼图结合,对比局部与全局分布。

最后总结

帕累托图是数据驱动决策的利器,通过直观展示“关键少数”因素,帮助团队高效定位问题核心。在Python中,结合seabornmatplotlib可快速实现定制化分析,适用于质量管控、客户洞察、业务优化等场景。掌握其原理与代码技巧,能有效提升数据分析的落地价值。

下一步行动建议

  • 尝试使用真实业务数据(如销售数据、故障日志)生成帕累托图。
  • 探索scipy库中的pareto函数,对比不同实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值