专栏首页华章科技「二八法则」的数据可视化:用帕累托图进行数据分析

「二八法则」的数据可视化:用帕累托图进行数据分析

导读:借助帕累托图,有助于我们抓住问题的关键,从而解决核心的问题。

作者 / 来源:林骥(ID:linjiwx)

01 「二八法则」和帕累托图

1897 年,意大利经济学家帕累托,在抽样调查的数据中发现,社会上 20% 的人拥有 80% 的财富。

后来,人们发现这种「关键少数」的现象非常普遍,比如说:20% 的原因导致 80% 的问题,20% 的产品贡献 80% 的业绩,20% 的员工贡献 80% 的业绩,20% 的客户贡献 80% 的业绩 …… 因此,简称为「二八法则」

为了纪念帕累托,我们把展现「二八法则」的图表,称之为帕累托图。

下面举个例子,我们汇总导致质量问题的原因,计算每种原因出现的频次,然后按照从大到小进行排列,制作成一张帕累托图如下:

与常见的帕累托图不同,我对图表细节做了一些调整:

  1. 线条从坐标原点开始,代表累计百分比从 0 开始;
  2. 没有使用双坐标轴,线条的高度就是频次的累计;
  3. 灰色边框的高度就是频次的总和,以便展现部分与整体之间的占比关系;
  4. 用虚线标记大致符合「二八法则」的位置;
  5. 用文字标签说明累计百分比的具体数字,在标题中体现图表想要传递的信息。

借助帕累托图,有助于我们抓住问题的关键,从而解决核心的问题。

02 用 Matplotlib 画帕累托图

接下来,我们看看用 Matplotlib 画图的具体步骤。

首先,导入所需的库,并设置中文字体和定义颜色等。

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})

# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x) 

# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}

其次,从 Excel 文件中读取数据,并定义画图用的数据。

# 数据源路径
filepath='./data/帕累托图数据源.xlsx'

# 读取 Excel文件
df = pd.read_excel(filepath)

# 定义画图所需的数据
x = df['原因']
y = df['频次']

# 让折线图从坐标原点开始
x2 = np.arange(len(x)+1) - 0.5
# 计算累计频次
y_cumsum = [0] + list(y.cumsum())
# 计算累计百分比
y2 = y.cumsum()/y.sum()

接下来,开始用「面向对象」的方法进行画图。

# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 6))

# 设置标题
ax.set_title('\n%.1f%%' % (y_cumsum[2]/y.sum()*100) + '的质量问题是由20%的原因引起的\n', 
             fontsize=26, loc='left', color=c['深灰色'])

# 用灰色方框代表总体的大小,体现每个数据的占比关系
ax.bar(x, y.sum(), width=1, color='w', edgecolor=c['浅灰色'], zorder=0)

# 画柱形图
ax.bar(x, y, width=1, color=c['蓝色'], edgecolor=c['浅灰色'], zorder=1)

# 画折线图
ax.plot(x2, y_cumsum, ls='-', lw=2, color=c['橙色'], label='累计百分比', zorder=2)

# 标记体现二八法则的虚线
ax.hlines(y_cumsum[2], -0.5, 1.5, color=c['橙色'], ls='--')
ax.vlines(1.5, 0, y_cumsum[2], color=c['橙色'], ls='--')

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# 设置图形的位置,减少空白
ax.spines['left'].set_position(('data', -0.51))

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)
ax.tick_params(axis='y', which='major', length=0)
ax.set_yticklabels([])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=c['深灰色'])

# 设置数据标签
for a, a2, b, b2, b3 in zip(x, x2[1:], y, y_cumsum[1:], y2):
    ax.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=16, color=c['蓝色'])


# 标记 Y 轴标题
ax.text(-1, y.sum(), '频\n次', fontsize=16, va='top', color=c['蓝色'])

# 标记线条含义
ax.text(1.5, y_cumsum[2]+10, '累计%.1f%% ' % (y_cumsum[2]/y.sum()*100), fontsize=16, color=c['橙色'], va='bottom', ha='right', zorder=5)

plt.show()

下载画图用的数据和完整代码,你可以前往

https://github.com/linjiwx/mp

本文分享自微信公众号 - 大数据(hzdashuju)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据可视化:用散点图进行数据分析

    导读:散点图的用途有很多,我认为它的核心价值,在于应用相关思维,发现变量之间的关系。

    华章科技
  • 大数据除了Hadoop,还有Scrapy

    互联网+概念的兴起,中国的创业者几乎把互联网+这趟车开进了所有领域,传统领域的商家人心惶惶,言必谈互联网+,仿佛不套点互联网的概念都不好意思宣传自家产品;而赶在...

    华章科技
  • 独家 | 一文读懂推荐系统知识体系(附学习资料)

    推荐系统就是根据用户的历史行为、社交关系、兴趣点、所处上下文环境等信息去判断用户当前需要或感兴趣的物品/服务的一类应用。

    华章科技
  • 如何用python画图--matplotlib实例与补充

    在第一篇文章中,大家一定看到了包含Figure,Axes,Axis等的代码,可能会一头雾水,不知道这些分别表示什么。这里就给大家仔细解释一下。掌握了这些之后,绘...

    zhangqibot
  • 个性化调整坐标轴的颜色和位置

    之前的文章中介绍了修改默认情况下,matplotlib绘制的图片都是有一个正方形的方框,示意如下

    生信修炼手册
  • 高效使用 Python 可视化工具 Matplotlib

    Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。本文主要推荐一个学习使用Matplotli...

    昱良
  • 高效使用 Python 可视化工具 Matplotlib

    Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。本文主要推荐一个学习使用Matplotli...

    1480
  • 云中树莓派(1):环境准备

    树莓派确实和一张信用卡一般大小,如下图所示。 它有4个USB,1个有线网口,1个HDMI,1个音频输出,一个电源接口,一个TF卡插口。注意 TF卡接口在USB口...

    SammyLiu
  • 建议收藏!Matplotlib常见组件设置整理

    继上一篇文章为大家介绍了plt和ax绘图的区别后,这篇文章结合我自己的一些使用经历,为大家整理了Matplotlib中比较常用的一些组件设置。

    bugsuse
  • (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

      通过前面的文章,我们已经对geopandas中的数据结构、坐标参考系以及文件IO有了较为深入的学习,在拿到一份矢量数据开始分析时,对其进行可视化无疑是探索了...

    Feffery

扫码关注云+社区

领取腾讯云代金券