【Python】用Python实现帕累托图

news2024/11/26 5:48:18

作为一名多次创业者和项目管理培训师, 今天田辛老师要做一件跨界的事情。 一方面, 田老师整理了项目管理中的重要质量管理工具 “帕累托图”, 另一方面,田老师给到了帕累托图的Python的实现方式。 如果您只对Python实现方式感兴趣的话, 不妨直接看最后一部分。

1 定义

帕累托图:是一种特殊的直方图, 在项目管理知识体系中属于质量管理的工具。 它可以帮助观众了解哪些因素对结果影响最大。它基于帕累托原则,即 80% 的结果来自 20% 的原因。该图表有助于以图形方式显示此原理。
在这里插入图片描述

2 帕累托原理

该原则也被称为80/20 规则关键少数法则因子稀疏原则。约瑟夫·朱兰 (Joseph Juran)于 1937 年公布了这个概念,并以著名经济学家维尔弗雷多·帕累托的名字命名,他在 19 世纪后期首次记录了这种现象。

从本质上讲,帕累托指出,在许多地方,80/20 的分布很普遍,几乎存在于我们生活的各个方面。他最初的观察是关于人口和财富。他发现,意大利 80% 的土地归 20% 的人口所有。对其他国家的调查显示了类似的分布模式。

这种财富分配目前仍然成立。1992 年联合国开发计划署发布的一份报告显示,世界 20% 的人口创造了世界人口收入的 80% 左右。这种极其不平等的分配存在于税收、收入以及几乎所有其他生活领域。

体育:15% 的棒球运动员创造了 85% 的胜利,从理论上讲,这适用于所有体育项目。还有人说,20% 的训练方法产生了 80% 的收益。

计算:微软发现,修复 20% 最常报告的错误可以解决 80% 的错误和崩溃。这是 20% 的代码持有 80% 的错误。相反,最棘手的 20% 的编码需要开发人员 80% 的时间。

安全:职业健康与安全专业人员承认,20% 的危险导致 80% 的伤害。

健康和社会福利:20% 的患者使用 80% 的资源。80% 的犯罪是由 20% 的罪犯犯下的。这份清单涵盖了所有人类属性。

3 帕累托原则如何应用于商业

正如 80/20 规则适用于非商业领域的几乎所有场景一样,它也适用于商业环境。80% 的销售额来自于 20% 的销售人员。20% 的销售和营销活动带来了 80% 的业绩。在工厂中,80% 的缺陷是由 20% 的流程造成的。 80% 的投诉是由于 20% 的流程造成的。从本质上讲,几乎商业所有方面都反映了这一规则,而拥有显示数字的图表有助于组织识别和解决问题。

基本上,如果知道 20% 的东西会产生最积极的结果,就可以向其中投入更多的资源,而不是把时间、精力和金钱浪费在对组织没有帮助的事情上。如果帕累托图显示 80% 的业务来自 Facebook 广告,您就知道应该把精力集中在哪里。

4 什么时候应该使用帕累托图?

帕累托图在以下情况下是理想的选择:

  • 您需要轻松地将重要问题传达给利益相关者
  • 需要确定任务的优先级

帕累托图需要具有可以用持续时间、成本或频率进行衡量的数据。还需要有一个数据发生的时间范围。数据的频率在左轴上表示,问题或其他可测量值显示在横轴上,以条形表示。线形图所表示的百分比曲线在右侧有一个刻度。

为了更易于理解,可以用不同的颜色突出显示 20% 的数据,或者用标签来表明这是需要关注的业务领域。

5 帕累托图与条形图有何不同?

和最开始一样, 帕累托图是一种特殊的直方图(或称条形图)。对于帕累托图,条形是按从高到低的顺序显示的。对于条形图,并没有强制性地从高到低排序。条形图常常按字母顺序排序,或者按某种其他逻辑顺序排序。

如下图,就是一个直方图的案例。
在这里插入图片描述

而对于帕累托图, 应该是这样的:
在这里插入图片描述

帕累托图还可以添加一个积累频数线条:
在这里插入图片描述

6 帕累托图的替代方案

尽管帕累托图没有真正的替代方案,但有一套七种基本的质量控制工具,应该一起使用,作为解决组织问题的整体方法的一部分:

  • 因果关系图:找出问题的原因并将想法分为几类
  • 检查表:提供收集和分析数据的结构化方法
  • 控制图:研究过程如何随时间变化
  • 直方图:显示频率分布,例如一组数据中某个值出现的频率
  • 帕累托图:显示因子的重要性
  • 散布图:识别关系和模式
  • 分层:分离数据并确定模式
    这些工具一起使用,构成了确保组织质量的基础。

7 帕累托图的好处

7.1 专注解决问题

如果在一条装配线上有 100 种产品,存在一系列故障、缺陷和问题,那么组织如何知道首先要解决什么问题?帕累托图会立即显示最大的问题,从而显示需要首先解决的过程或产品。如果一个故障部件导致了大部分问题,则可以很容易地确定修复的优先级。

7.2 提供机会

虽然你可以看到缺陷和问题,但帕累托图也可以用来识别优势。然后,你可以制定计划加以利用。例如,你可以向顶级销售人员或最佳分支机构询问他们的做法,进行复制。或者,如果一个团队特别有效,他们的技术和方法可以在整个企业中复制。

7.3 增强决策能力

领导团队希望为自己的组织做出最佳选择,但要了解什么会产生最大的影响可能很难。除了机器学习和人工智能之外,最有用的工具可能是帕累托图。可以清楚地看到最大的好处或问题出现在哪里,意味着可以基于数据有效地做出有针对性的决策。

8 帕累托图的缺点

8.1 没有根本原因分析

虽然帕累托图显示了结果,但没有明确的方法可以看到数据背后的原因。例如,如果一家公司的特定分支机构表现良好,在图表中就无法轻易了解为什么会出现这种情况。

解决方案:分析和数据完成后,需要进行全面调查,以显示这些结果是如何发生的。为什么分支机构表现良好?为什么工厂在制造产品时总会弄坏某个零件?

8.2 没有定量数据

帕累托图纯粹是定性的。没有迹象表明缺陷或问题的严重性。发现这些信息需要对问题进行彻底的调查和分析。

8.3 仅显示过去的数据

帕累托图仅显示过去的数据。损害或问题已经发生且无法更改。此外,无法真正预测基于这些数据所做的更改是否会产生所需的积极结果。例如,使用机器学习也有助于进行预测;如果你更改了 X,那么 Y 也会受到影响。

9 如何用Python创建帕累托图

9.1 数据源

下面这个代码是使用Excel作为数据文件,文件名为:data.xlsx
数据文件的内容如下:放在第一个工作表的第一个A1单元格开始即可。

categoryvalue
工资待遇与福利水平较差90
公司发展前景与预期落差大40
激励机制较差38
晋升机会少35
当前职业无法发挥个人专长30
工作压力较大28
工作缺少成就感26
上级处事方式较差25
工作氛围较差16
公司地理位置不便13
职业发展方向变化12
个人创业或继续求学深造11
其它10
个人家庭原因9
个人身体原因5

9.2 源代码


# 用于命名和保存图片文件
import os
from datetime import datetime


import matplotlib.font_manager as fm  # 管理字体工具
import matplotlib.pyplot as plt  # 绘图包
import pandas as pd # 读取Excel数据

# 设置字体
font_path = 'C:/Windows/Fonts/simhei.ttf'  # 字体文件路径
font_prop = fm.FontProperties(fname=font_path, size=12)  # 字体属性
plt.rcParams['font.family'] = font_prop.get_name()

# 读取Excel数据
df = pd.read_excel('data.xlsx')

# 建立数据category和标识符的对应关系
category_dict = {}
for i, category in enumerate(df['category'].unique()):
    category_dict[category] = chr(65 + i)
    df['category'] = df['category'].replace(category, chr(65 + i))

# 按照数量降序排列
df = df.sort_values(by='value', ascending=False)

# 计算累计百分比
df['cumulative_percentage'] = df['value'].cumsum() / df['value'].sum() * 100

# 绘制帕累托图
fig, ax1 = plt.subplots(figsize=(8, 10))

# 判断是否有小于80%的数据
if df['cumulative_percentage'].min() < 80:
    # 将小于80%的数据用红色柱子表示
    ax1.bar(df[df['cumulative_percentage'] < 80].index, df[df['cumulative_percentage'] < 80]['value'], color='tab:red')
else:
    # 将第一个柱子设为红色背景
    ax1.bar(df.index[0], df['value'][0], color='tab:red')

# 绘制其余柱子
bar_heights = ax1.bar(df.index, df['value'], color='tab:blue', alpha=0.5)
ax1.set_ylabel('数量', fontproperties=font_prop)

# 在每个柱子上方添加具体的值
for i, bar_height in enumerate(bar_heights):
    ax1.text(i, bar_height.get_height() + 0.5, str(int(bar_height.get_height())), ha='center', fontproperties=font_prop)

ax2 = ax1.twinx()
ax2.plot(df.index, df['cumulative_percentage'], color='tab:red', marker='o')
ax2.set_ylim([0, 100])
ax2.set_ylabel('累计百分比', fontproperties=font_prop)

plt.xticks(df.index, df['category'], rotation=90, fontproperties=font_prop)
plt.title('帕累托图', fontproperties=font_prop)

# 添加A-Z和category的对应关系
ax1.set_xticks(df.index)
ax1.set_xticklabels(df['category'], rotation=90, fontproperties=font_prop)
ax1.tick_params(axis='x', which='major', pad=15)
ax1.spines['bottom'].set_position(('axes', -0.00))
ax1.spines['bottom'].set_linewidth(0)
ax1.spines['bottom'].set_color('gray')
ax1.spines['bottom'].set_visible(True)

for i, (category, abbr) in enumerate(category_dict.items()):
    ax1.text(-1, -4 * i - 10, f'{abbr}: {category}', transform=ax1.transData, ha='left', fontproperties=font_prop,
             va='top')

# 调整子图之间的间距和边距
plt.subplots_adjust(bottom=0.4)

# 保存图片
now = datetime.now().strftime('%Y%m%d%H%M%S')
filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'pareto_{now}.png')
plt.savefig(filename)

plt.show()

9.3 输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思科模拟器 | 交换机与路由器的配置汇总【收藏备用】

文章目录一、vlan配置【实现同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、测试连接二、truck配置【实现连接在不同交换机上的同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、打truck做连接3、测试连接三、静态路由配置1、自定义IP地址2、基本…

品牌营销 | 学习如何最大限度地发挥品牌营销的作用

您是否想过如何最大限度地发挥品牌营销的潜力&#xff1f;这是一项艰巨的挑战&#xff0c;通过了解品牌营销的基本组成部分&#xff0c;您可以成功地推广您的品牌。 &#xff08;图源&#xff1a;Pixabay&#xff09; 品牌营销的基本组成部分 你需要做什么来发展稳固的品牌&am…

STC89C51单片机相比于其他单片机具有那些优点?

STC89C51只适合和同性能的51内核单片机相比&#xff0c;性能不同并无可比性。11年前&#xff0c;我就是通过自学STC89C51入行单片机开发的。到目前为止都非常经典&#xff0c;很多开发板都是基于这个芯片去做的。我对STC单片机也是比较有好感的&#xff0c;一般51单片机的产品基…

【Java|golang】2379. 得到 K 个黑块的最少涂色次数---滑动窗口

给你一个长度为 n 下标从 0 开始的字符串 blocks &#xff0c;blocks[i] 要么是 ‘W’ 要么是 ‘B’ &#xff0c;表示第 i 块的颜色。字符 ‘W’ 和 ‘B’ 分别表示白色和黑色。 给你一个整数 k &#xff0c;表示想要 连续 黑色块的数目。 每一次操作中&#xff0c;你可以选…

07 C语言数组

07 C语言数组 1、初试数组 #include<stdio.h>int main(int argc,char const *argv[]){double sum;int a[100];int i 0;int cnt 0;scanf("%d",&i);while(i ! -1){sum i;a[cnt] i;scanf("%d",&i);}if(cnt > 0){double average sum / …

深入堆空间

堆空间用来干嘛的&#xff1f;我们知道基础类型的变量、对象的引用既可以在栈也可以在堆上&#xff0c;但是对象一定是在堆空间的。堆上存储的是从GC Root可达的活跃对象。什么是GC Root&#xff1f;垃圾回收器在判断哪些对象该回收的时候&#xff0c;需要一个标准&#xff0c;…

初识项目管理

项目的特性 项目是一项 临时性 的工作&#xff0c;即所有的项目都有确定的开始和结束时间。项目的目的是创造 独特 的产品、服务或成果。项目具有 渐近明细性&#xff0c;即项目随着时间的推移&#xff0c;相关信息逐渐清晰。 项目举例 万事皆项目&#xff1a; 开发信息系统…

川农机械专业小伙转行Java开发,年薪20w

本期学员就业故事&#xff0c;知了姐邀请到一位“特别”的同学&#xff0c;一位从知了堂就业成功近两年的学员再度接受我们的采访。 来自四川农业大学的曾同学&#xff0c;一个本来学机械开挖掘机的粗犷男人&#xff0c;因为不断地努力学习编程&#xff0c;最终成为一个性格闷…

轻松掌握C++的模板与类模板,将Tamplate广泛运用于我们的编程生活

C提高编程 本阶段主要针对C泛型编程和STL技术做详细讲解&#xff0c;探讨C更深层的使用 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。 模板 1.模板的概念 模板就是建立通用的模具&#xff0c;大大提高复用性 例如&#xff1a; 2.函数模板 C另一种编程思想称…

【二分查找】数的范围

数的范围思路二分查找左边界右边界代码实现思路 题目主要的意思在一个升序也就是有序的数组中 找到一段相同数组的起始位置和最终位置 也就是查找两个数的问题 题目给的是升序数列让人很容易想到二分查找来查找两个数 二分查找 我们此时的问题就转化为查找到这段序列的起始位…

Python中变量的作用域精讲

文章目录前言一、局部变量二、全局变量前言 变量的作用域是指程序代码能够访问该变量的区域&#xff0c;如果超出该区域&#xff0c;再访问时就会出现错误。在程序中&#xff0c;一般会根据变量的 “有效范围” 将变量分为 “全局变量” 和 “局部变量”。 一、局部变量 局部变…

Linux——进程间通信1

目录 进程间通信目的 进程间通信标准 管道 匿名管道 管道实现进程间通信 管道的特点 进程池 ProcessPool.cc Task.hpp 习题 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件…

前端的浮点数计算问题

加 //加 export const add (num1, num2) > {var r1, r2, m, ctry {r1 num1.toString().split(.)[1].length} catch (e) {r1 0}try {r2 num2.toString().split(.)[1].length} catch (e) {r2 0}c Math.abs(r1 - r2)m Math.pow(10, Math.max(r1, r2))if (c > 0) {va…

Vue3通透教程【七】生命周期函数

文章目录&#x1f31f; 写在前面&#x1f31f; 生命周期钩子函数&#x1f31f; 组合式API生命周期&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&am…

性能优化之前端项目性能优化的几种方案

加载优化&#xff0c;减少http请求一个完整的 HTTP 请求需要经历 DNS 查找&#xff0c;TCP 握手&#xff0c;浏览器发出 HTTP 请求&#xff0c;服务器接收请求&#xff0c;服务器处理请求并发回响应&#xff0c;浏览器接收响应等过程。Queueing: 在请求队列中的时间。Stalled: …

5.1 STM32学习 中断系统和EXTI外部中断

中断系统中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。中断优先级&#xff1a;当…

框架篇-面试题6-说一下Vue2与Vue3的钩子函数

Vue钩子函数是在Vue实例从创建到销毁的过程中自动执行的函数&#xff08;在特定的阶段,能够自动自执行的函数&#xff09;钩子函数用来描述一个组件从引入(创建)到退出(销毁)的全过程中的某个过程Vue2生命周期钩子函数整个过程称为生命周期Vue钩子函数按照组件生命周期的过程分…

作为一名程序员少不了的软件

写在前面的话 就现今我自己接触的项目而言&#xff0c;我发现对于一名程序员来说有些软件是真的必不可少的&#xff0c;防止下次换电脑或者要换操作系统的时候用&#xff0c;特此记录一下。 一、最常使用的&#xff0c;JetBrain全家桶&#xff08;idea、pycharm、webstorm&…

【办公类-16-06-02】“2022下学期 总园活动室(沙水+建构)排班表(两周一次沙水)”(python 排班表系列)

作品展示&#xff1a;背景需求&#xff1a;上一篇批量制作了“7天轮回14班沙水每周固定建构”的活动室内排班表。一、时段冲突&#xff0c;调整单双周。保教主任抽空检查后&#xff0c;提到&#xff1a;“一个班、上午、下午都有自主游戏&#xff08;沙水、建构、表演、角色&am…

金三银四、金九银十 面试宝典 JAVASE八股文面试题 超级无敌全的面试题汇总(接近3万字的面试题,让你的JAVA语法基础无可挑剔)

JavaSE八股文 - 面试宝典 一个合格的 计算机打工人 &#xff0c;收藏夹里必须有一份 JAVA八股文面试题 &#xff0c;特别是即将找工作的计算机人&#xff0c;希望本篇博客对你有帮助&#xff01; 本文参考了诸多大佬的面试题帖子&#xff0c;ps&#xff1a;白大锅、哪吒、英雄…