<audio id="audio" title="07 | 性能数据的展示：一图胜千言，说出你的数据故事" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/53/bf/536102f14909ec2f72310c8ad0b3c1bf.mp3"></audio>

你好，我是庄振运。

这一讲我们来探讨一下如何把性能数据合情合理地展示出来，让别人一目了然。如果你想有效地说服别人，那么你展示的过程就要像讲一个有趣的故事，娓娓道来，让别人爱听才行。

数据的展示根据场景有不同的目的，所以不能千篇一律，需要量体裁衣。每一种场景下，数据展示要根据你的**具体目的**、**听众的特点**和**内容的特点**而采用合适的图表。然后用这些图表做支持，把一个精美的数据分析的“故事”讲出来。

## 性能数据展示的目标和目的

我们先理清一下性能数据展示的目的是什么。

我们前面讲过，性能工作相对复杂，牵扯的模块和构件较多，而且有时候也要牵扯几个不同的部门。数据分析有时是为了性能优化，有时是为了根因分析等等。所以性能数据展示的目的也就有很多种，主要有如下三种：

1. 向上级报告性能趋势和流量预测的结果；
1. 向运维部门描述性能问题的根因分析；
1. 向开发部门建议性能提升和代码优化。

目标不同，听众不同，如何展示数据自然也就不能相同。但不管如何，都要做到有根有据，条理清楚，层次分明。这样大家才会被你和你展示的数据所说服。具体来讲，你希望你的听众：

1. 同意你的理论方法和过程；
1. 信服你的推理分析；
1. 理解问题的核心；
1. 看出问题的根因；
1. 同意你的建议和方案；

## 性能数据展示的挑战和难点

目的清楚了，下面就是怎么做了。但是我们必须认识到，相对于一般数据的展示，性能数据的展示有其独到的特点、挑战和难点：

- **数据量大** ：做性能测量时往往性能指标很多，每个指标一般都是一个时间序列。一个复杂系统/性能问题有几十甚至几百个性能指标是经常遇到的，所以总的数据样本经常以百万以上计。
- **数据复杂**：几十或几百的性能指标互相交互和影响，需要考虑它们之间的复杂关系。
- **性能问题复杂**：性能分析不是简单地死扣数据，还需要考虑互联网系统的协议，计算机的设计，和软硬知识的结合。
- **牵扯的模块多**：很多性能问题都不是孤立的，都和其他模块和子系统，甚至客户请求有关系。

## 数据展示的经验

在考虑用什么方式来展示数据时，的确有些讲究，这就需要多借鉴别人的经验。在这方面，我总结了下面六条经验。

1. **按客人来备菜**：既然展示的听众不同，所以千篇一律的用同一种展示方法绝不可行。比如向领导和管理层汇报时，就要注重宏观层次，技术不要钻地太深。
1. **有啥菜吃啥饭**：要根据手头数据的特点来决定展示方法。比如你有好几组相关的数据，有很有趣的趋势，那就要用线图来展示趋势和相关性。
1. **给足上下文**：很多工程人员容易犯的错误，就是想当然地以为别人也都了解问题的背景，然后一上来就展示很多细节。其实除了你自己，没有第二个人更了解你要解决的问题和要展示的数据，所以一定要给足背景介绍和上下文信息。
1. **用图讲故事**：人人喜欢听故事，而且是有趣的故事。如果你能把整个分析和推理的过程，变成一个引人入胜和图文并茂的故事来讲，那我保证你的展示会非常地成功。
1. **和听众交互**：尽量鼓励听众参与讲故事的过程。有两种类型的数据叙事：叙述型和探索型。叙述型是通过描述告诉观众具体结论；而探索型是鼓励观众探索数据以得出结论。虽然探索型叙事稍微多花一点时间，但若能成功运用，听众更容易被说服；因为结论是他们自己得出的，而不是你告诉他们的。
1. **总结重要点**：在数据展示的最后，一定要简洁明了地总结你的展示。比如你希望听众最后只记住三句话，是哪三句呢？根据你的展示目的，这三句或是相关数字，或是趋势，或是问题本质，或是解决方案。

## 数据图表的种类

数据往往是枯燥的，所以我们要想办法变枯燥未有趣。用图表来展示数据就是一个好方法，但关键是要用合适的图表来展示不同的数据。

虽然数据图表的种类很多，但常用的就10种左右。我来简单地给你总结一下这几种常用的图表，分别适合什么情况和表示什么样的数据。

### 表格（Table）

表格你一定经常用，它的优点是可以结构化的方式显示大量信息；不幸的是，这个优点恰恰也是缺点。很多用户其实对数据的趋势比具体的数值更有兴趣，这种情况下用表格就不是那么直观。

### 线图（Line Chart)

如果我们希望针对一个变量，显示一段时间内这个变量的变化或趋势，线图就最合适了。比如我们经常表示的时间序列图就是最直白的线图。

另外，它也适用多个变量的情况，可以很直观地显示两个或多个变量之间的关系，比如趋势和相关性。

### PDF和CDF图

对于一个变量的概率数据，我们经常会显示这两个互相关联的图。二者可以看作是稍微特殊的线图。

**PDF**：概率密度函数（Probability Density Function）是连续型随机变量的概率密度函数（或简称为密度函数）。就是一个描述这个随机变量的输出值，在某个确定的取值点附近的可能性的函数。

**CDF**: 累积分布函数 (Cumulative Distribution Function)，又叫分布函数，是概率密度函数PDF的积分。换句话说，PDF就是CDF的导数。CDF能完整描述一个实随机变量X的概率分布。

我们举一个前面讲过的例子，比如标准正态分布。它的PDF和对应的CDF是这个样子。

<img src="https://static001.geekbang.org/resource/image/53/e3/533c87181e922b207e52fc8d323521e3.png" alt="">

### 面积图（Area Charts）

面积图类似于线图，但两者之间有细微的差别。面积图的重点是阴影线下方的区域。

如果想用面积图表示几组数据，那么具体也有两种选择：可以选择采用叠加面积图或非叠加面积图。

比如下图就是一个叠加面积图，它显示了几个产品在不同季度的单季产量和总产量。

<img src="https://static001.geekbang.org/resource/image/6b/bb/6bad8b4e214f7d9d91170646119cf0bb.png" alt="">

### 柱状图和条形图（Bar Charts）

用于比较不同类别的数量，比较容易理解。如果你想表示好几个变量，那么也可以选择叠加方式来显示。

比如下面这个柱状叠加图，显示的是和上面的面积图同样的数据，只是表示的方法不同。

<img src="https://static001.geekbang.org/resource/image/81/5f/81f1a8237cdd53cb631d08693e978a5f.png" alt="">

### 散点图（Scatter Plots）和气泡图（Bubble Charts）

**散点图**显示沿两个轴绘制的两个变量的值，用点的模式揭示它们之间存在的任何相关性。比如两个变量分别是CPU使用量和客户吞吐率，那么我们可以期望散点图会显示比较强的同一趋势。

**气泡图**类似于散点图，但它可以显示三个数据项之间的变化。除了两个变量分别为是横轴和纵轴外，气泡的大小代表第三个变量。

<img src="https://static001.geekbang.org/resource/image/26/31/26eb07e8905372a40c41c49b64dfc131.png" alt="">

我们举一个例子。比如一个公司里面有十个互联网产品，每个产品运行在不同数目的服务器上面。这些产品分别有不同的内存使用率和网络使用率。假设我们想分析一下产品的内存和网络的使用情况，然后决定下一个季度购买什么样的服务器。我们就可以用气泡图来表示，网络和内存的使用率来作为横轴和竖轴，气泡的大小代表每个产品的服务器数目。

通过这个气泡图，我们非常直观地发现，某个产品的气泡比其他产品都大，而且它的两种资源使用率都很低。整体来言，下个季度新采购的服务器可以不需要那么多内存和网络资源。

### 饼图和圆环图（Pie Charts， Donut Charts）

当需要显示比例数据或者百分比时，饼图最佳。由于饼图表示零件与整个实体之间的大小关系，因此零件需要总和必须为有意义的整体。

一个适合饼图表示的性能数据例子是客户请求的来源分布。但你在使用时需要注意的是，饼图最好用来显示六个或更少的类别。如果太多类别的话反而描述不清楚。

举一个前面讲面积图时候用过的例子，公司的四种产品在春季的销售分布，就可以用下面这个饼图表示。

<img src="https://static001.geekbang.org/resource/image/54/02/54e07c61e57f08f398769c2d10499702.png" alt="">

### 树形图（Treemaps）

树形图对于显示类别和子类别之间的层次结构和比较值非常有用，同时也能保留较多细节。树形图可以帮助我们很直觉地感知哪些区域最重要。另外，还可以通过将颜色编码的矩形嵌套在彼此内部，来更好地实现目的，并用加权以反映它们在整体中的份额。

比如下面这个树形图，它描绘了一个国外的产品，采用不同营销渠道的价值，然后按国家/地区细分。

<img src="https://static001.geekbang.org/resource/image/39/bc/39ccc1ee89312d7d7d78009ad66311bc.png" alt="">

这里的营销渠道包括Email、Social Media、AdWords等。从这个图中，你一眼就能看出从营销渠道上来看，AdWords是最成功的营销渠道，因为它对应的面积最大。但是从国家层面来讲，美国（United States）是所有渠道中最有价值的目的地，同样是因为对应的面积最大。

### 热图（Heatmaps）

热表以表格格式来表示数据，其中每个格子是用颜色，而不仅仅是用数字来展示。这些颜色分别对应包含定义的范围，如绿色代表小的值，黄色代表一般的值和红色代表大的值。

比如分析几台服务器的在一天里面CPU的使用率。我们可以把每台服务器在每个时段的CPU使用率分为小、较小、中等、较大和大等几个范围。然后相应地着色。

我们看下图，横坐标代表时段，纵坐标是服务器，每个值就是CPU使用率。

<img src="https://static001.geekbang.org/resource/image/0e/f4/0ea22fae8afe53bad9763d75a811b6f4.png" alt="">

虽然每个使用率其实是数字，但是把数字编码为颜色的好处是，颜色编码格式使数据更容易理解。比如，我们马上就可以看出早上10点的时候，服务器1和5的CPU使用率很高，因为它们的格子是红色。

## 总结

<img src="https://static001.geekbang.org/resource/image/b6/ab/b65ebe300caf5f7abd6bd79ac70abcab.png" alt="">

我们都学过宋朝的词人柳永的词，他有两句词是这么写的：

“便纵有千种风情，更与何人说？”

这里他其实是在感叹自己虽有满腹经纶和深厚情感，但无人可以诉说。我们虽然不是词人，但在做过性能测试或者根因分析后，可能经常会有很多新奇的发现，希望向同事和领导讲解。

但是性能问题往往牵涉很广，描述起来并不容易，别人可能很难理解。这时候我们的感觉就是“我有千种风情”，可是如何说啊？

希望通过这一讲，能让你对在图文并茂地来“诉说”这方面能有些提升。

## 思考题

- 对本讲介绍的几种图形，你对哪些比较熟悉并经常使用？
- 哪些是不熟悉的但觉得可能会很有用的？
- 对不熟悉的图形，你能不能花十几分钟时间去仔细学习一下并尝试使用呢？

欢迎你在留言区分享自己的思考，与我和其他同学一起讨论，也欢迎你把文章分享给自己的朋友。
