帕累托图是一种图表类型,它显示类别的有序频率以及类别的累积频率。本教程提供了如何在Python中创建帕累托图的逐步示例。
介绍帕累托图
帕累托图定义
帕累托图(Pareto Chart)是一种条形图与折线图的组合图表,基于意大利经济学家维尔弗雷多·帕累托提出的80/20法则(即约80%的结果由20%的原因导致)。其核心特征包括:
- 条形部分:按数值大小降序排列,展示各类别的频次或影响程度。
- 折线部分:显示累积百分比(Cumulative Percentage),反映前N项因素对整体的贡献占比。
- 目的:快速识别导致大多数问题的关键少数(Key Few)因素。
帕累托图核心作用
- 优先级排序:明确哪些因素是影响结果的主要驱动者。
- 资源聚焦:指导团队优先解决高权重问题(如改进前20%的缺陷类型)。
- 数据分布分析:验证是否符合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的seaborn
和matplotlib
库,演示如何基于模拟数据创建帕累托图:
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()
代码说明:
- 数据准备:创建包含缺陷类型及其数量的DataFrame,并按数值降序排列。
- 累积百分比计算:使用
cumsum()
函数计算累计值,并转换为百分比。 - 可视化:
sns.barplot
绘制条形图,颜色使用viridis
色系。plt.plot
添加红色虚线折线,标记累积百分比。- 通过
axhline
添加80%参考线,辅助判断是否满足80/20法则。
输出效果:
- 条形图显示各缺陷类型的数量分布。
- 折线图从左上到右下递减,反映累积贡献比例。
- 若前两项累积百分比超过80%,则符合80/20规律(如图中设计缺陷占45%,制造缺陷占30%,两者合计75%)。
进阶优化技巧
-
交互式帕累托图:使用
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()
-
多维度对比:按时间维度分组,生成动态帕累托图观察趋势变化。
-
结合其他图表:如将帕累托图与饼图结合,对比局部与全局分布。
最后总结
帕累托图是数据驱动决策的利器,通过直观展示“关键少数”因素,帮助团队高效定位问题核心。在Python中,结合seaborn
和matplotlib
可快速实现定制化分析,适用于质量管控、客户洞察、业务优化等场景。掌握其原理与代码技巧,能有效提升数据分析的落地价值。
下一步行动建议:
- 尝试使用真实业务数据(如销售数据、故障日志)生成帕累托图。
- 探索
scipy
库中的pareto
函数,对比不同实现方式。