1.5 可视化图像
我们实现可视化是想证实我们对数据的认识。然而,如果数据不容易理解,你可能不会设计出正确的问题。
创建可视化的第一步是弄清楚需要回答的问题。换言之,该可视化的作用如何?另一个挑战是学习正确的绘图方法。下面列出一些可视化方法:
条形图和饼图
箱线图
气泡图
直方图
核密度估计(Kernel Density Estimation,KDE)图
线面图
网络图
散点图
树状图
小提琴图
在识别可视化应该传达信息的过程中,关注下面的问题才有意义:
要处理多少变量?我们试图画出什么样的图像?
x轴和y轴指代什么?(三维图中还有z轴)
数据大小被标准化了吗?数据点的大小意味着做?
我们的选色正确吗?
对于时间序列数据,我们是否试图识别趋势或相关性?
如果变量太多,可以在同一个图上画多个不同组数据实例。这个技术叫作点阵或网格绘图。它允许观众快速提取复杂数据的大量信息。
考虑一组学生数据,这是(gender、sleep、tv、exercise、computer、gpa)和(height、momheight、dadheight)信息的不寻常混合。computer、tv、sleep和exercise的单位是小时,身高以英寸为单位,gpa的测度标尺为4.0。
上述数据是变量个数多于平常的案例。因此,用网格绘图进行可视化,来展示这些变量间的关系会更有意义。
我们进行可视化的一个原因是为了验证数据的知识。然而,如果没有很好地理解数据,就不可能提炼出正确的问题。
数据中包含两种性别,因此作为第一个变量集有10组变量,它们可能是:(sleep, tv)、(sleep, exercise)、(sleep, computer)、(sleep, gpa)、(tv, exercise)、(tv, computer)、(tv, gpa)、(exercise, computer)、(exercise, gpa)以及(computer, gpa);另外两个(height,momheight)和(height,dadheight)作为第二个变量集。下面是除 (sleep, tv)、(tv, exercise)以外的所有组合。
我们的目标是发现哪些变量组合能用来理解数据,或者这些变量中是否有一些存在有意义的影响。因为是关于学生的数据,gpa可能是影响其他变量的关键所在。前面的图像刻画了这样一幅散点图:有很多女生的gpa比男生高,在同一个gpa范围内,有很多男生花在计算机上的时间更多。尽管这里给出所有散点图,不过我们的目的是:发现更有用的数据,以及从该数据中得出有用的结论。
很多蓝色点处于较高的位置(y轴上的gpa)说明更多女生gpa更高(该数据由UCSD收集而来)。
数据可从http://www.knapdata.com/python/ucdavis.csv下载。
你可以用seaborn软件包编写很少的代码绘制散点图,下面的例子说明与学生花费在计算机上的时间相比,沿x轴的gpa的散点图:
这些图用matplotlib、pandas和seaborn库软件包生成。seaborn是一种基于matplotlib的统计数据可视化库,由斯坦福大学的Michael Waskom创建。这些库的细节将在后面几章讨论。
seaborn库有很多有用的类。尤其是当我们需要对数据子集中一个变量的分布或者多个变量间关系进行可视化时,FacetGrid类就派上用场了。FacetGrid可以刻画三个维度:行、列和色调。这些库软件包和它们的功能将在后面章节中进行描述。
当创建可视化时,第一步是清楚需要回答的问题。换句话说,可视化起什么作用?另一个挑战是选择正确的绘图方法。
1.5.1 条形图和饼图
我们何时选择条形图和饼图?它们是最古老的可视化方法,而且饼图最适用于一个整体中不同部分的比较。此外,条形图能够比较不同组的差异来展示模式。
条形图、直方图和饼图有助于我们比较不同数据样本,进行分类,并确定样本中数据取值的分布。条形图有一些不同的风格形式,比如单个、多个和堆叠。
1. 条形图
当数值型数据被很好地划分为不同类别时,条形图尤其有效。因此,你可以快速地从数据中看到趋势。
当比较不同类别的数据时,条形图很有用。下面是一些著名的案例:
不同尺寸的牛仔裤数量
过去20年世界人口的变化
部门支出的百分比
除此之外,考虑以下几点:
增加条形的颜色,获得更多效果:用条形显示利润表现是有信息量的,但添加颜色揭示了利润增加了视觉观点。然而,如果有很多条形,很多颜色可能使得图看起来笨拙。
包括仪表盘上的多个条形图:这有助于观众快速比较相关信息,而不是通过一堆表格或幻灯片来回答问题。
在轴的两侧加条形:沿连续数轴画正反两面的数据是一种发现趋势的有效方法。
用层叠或并排的条形:在彼此上部或旁边展示相关数据,给出你的深入分析,马上处理多个问题。
这些图通过不到12行的Python代码来实现,后面几章将讨论更多的案例。
条形图中,每一列代表由特定分类定义的一个组;直方图中,每一列代表由定量变量定义的一组。在条形图中,x轴没有最小值和最大值,这是因为x轴上的标签是分类的,而不是定量的。另一方面,在直方图中有一个区间的取值。下面的条形图展示了2002~2009年美国奥斯卡金像奖得主和提名人的统计特征:
下面的Python代码用matplotlib展示了电影小数据样本的条形图(这可能不一定是一个真实的案例,但却给出了绘图板和比较的想法):
2. 饼图
说到饼图,需要考虑的问题是:“这几部分能组成一个有意义的整体吗?”以及“你是否有充足的内容用圆形代表?”。使用饼图一直备受争议,主要是因为当类别种类过多时,使用饼图很难比较不同类别的比例来得出结论(来源:https://www.quora.com/How-and-why-are-pie-charts-considered-evil-by-data-visualization-experts)。
饼图适用于在一个空间或图上展示比例。一些著名的案例如下:
调查中的响应分类
一种特定技术的前五家公司的市场份额(这种情况下,我们可以很快知道哪家公司占据主要的市场份额)
除此之外,还需考虑以下几点:
限制饼图的扇形数不超过8个:如果有8个以上比例需要展示,请考虑条形图。出于对内容的限制,饼图很难有意义地展示和阐释过多的部分。
在图上叠加饼图:在同一幅图中,饼图更容易拓展,凸显地域发展趋势。(此处扇形个数仍有限制。)
考虑下面的代码,绘制一个简单的饼图,比较不同学科的录取情况分布:
下面的饼图展示了大学里一些热门专业的录取情况:
1.5.2 箱线图
箱线图也叫作箱须图。这是一种基于最小值、上四分位数、中位数、下四分位数和最大值5个数值特征展示数据分布的标准方式。下图完成了对箱线图的解读:
箱线图是一种从图形上检查一组或多组数据的快捷方式。它们占用了较少的空间,在同一时间定义五种特征。关于箱线图的用途,我们能想到的一个例子是:如果两个以上班级参加同一次考试,则箱线图能够告诉我们哪个班的大多数同学比其他班做得好。另一个例子是:如果有更多的人吃汉堡,那么中位数的位置会上移或表示最大值处的上晶须比表示最小值处的下晶须更长。在这样的情况下,我们给出了数据分布的一个好的可视化工具。
在理解箱线图适用范围之前,我们首先给出一个定义。离群点是一组数据值中与其他值有异常距离的观测值。
箱线图适用于展示一组数据的分布。一些著名的案例如下:
识别数据中的离群点
确定数据是左偏还是右偏
除此之外,还有以下问题需要考虑:
箱子里隐藏了一些点:关注离群点
跨分布比较:箱线图适用于快速比较不同数据集的分布
1.5.3 散点图和气泡图
散点图是一种用来展示两个变量之间二维关系的可视化方法。这种交叉数对的模式能从图像上展示不同变量间的关系。散点图是同一组研究对象的两个变量间关系的可视化。另一方面,气泡图展示了数据的三个维度。每个数据点有三重维度(a, b, c)。其中,xy轴的坐标表示两个维度变量,气泡的大小表示第三个维度的定量测度结果。
1. 散点图
数据通常是一组点的集合,并且常常用来绘制各种相关性。比如,正相关表示:当一组数据递增时,另一组数据也会增加。前面给出的学生记录数据通过各种散点图展示出它们间的相关性。
在下面的例子中,我们用学生妈妈的身高与学生的身高进行比较,来确定是否他们之间存在正相关关系。数据下载网址为:http://www.knapdata.com/python/ucdavis.csv。
我们用seaborn软件包处理这个案例,但也可以通过下节所示的matplotlib完成。上述代码绘制的散点图如下所示:
散点图最适用于研究不同变量间的关系。一些著名的案例如下:
男性与女性人群中不同年龄阶段得皮肤病的可能性
IQ测试得分和GPA之间的相关性
除此之外,还有以下问题需要考虑:
增加一条趋势线或最佳拟合线(如果关系是线性的):增加一条趋势线可以展示数据之间的相关性。
使用信息标记类型:信息标记类型适用于通过形状和颜色提高视觉效果来解读数据的情况。
2. 气泡图
下面的例子展示了如何用颜色作为第三个维度,揭示销量或任何其他驱动收益的指标:
下面的散点图是案例中使用颜色映射的结果:
在用三维数值空间比较数据之间的关系时,气泡图大有帮助,它包括:x轴数据、y轴数据,并用气泡大小表示数据。气泡图有些像XY散点图,但是散点图上每个点都追加了一个额外的数据取值信息,用以XY点为中心的圆圈或气泡的大小表示。气泡图的另一个例子如下所示(没有Python代码,只是用来说明一种可视化风格):
在上面的研究中,气泡图展示了不同大洲的平均寿命和人均国内生产总值。
气泡图最适用于展示沿两个坐标轴的数据信息,以及第三个显著测度的数据元素。一些著名的案例如下:
电影的制作成本和毛利润,以及沿递增标尺的显著性测度
除此之外,还有下面问题需要考虑:
增加颜色和形状的显著性:通过比较大小和颜色,数据点可以转换为问题答案的可视化结果
变为交互式:如果数据点过多,则气泡图会变得很复杂,因此需要在时间轴或类别上,对这些数据进行分组,完成交互式的可视化
1.5.4 核密度估计图
核密度估计(Kernel Density Estimation,KDE)是一种用来估计概率密度函数的非参数方法。可以通过对观测到的数据点取平均实现平滑逼近。核密度函数与直方图密切相关,但有时能够通过核概念用平滑性或连续性赋予实际含义。
概率密度函数(Probability Density Function,PDF)的核是PDF的形式。这种形式不考虑非变量函数因素。本书仅关注概率密度函数的可视化,如果想了解更多理论,可以参考统计学方面的书。
Python包含能够用来在各种深度和层次完成一个KDE图的库,包括matplotlib、Scipy、scikit-learn和seaborn。下面是KDE绘图的两个例子。后面几章会有更多的例子展示KDE图的各种其他方式。
在下面的案例中,我们通过少量代码用一个样本量为250的随机数据集和seaborn软件包展示分布图:
通过numpy.random生成一个随机样本,可以用seaborn展示数据图的简单分布:
在第二个例子中,我们用SciPy和NumPy表明概率密度函数。首先我们用SciPy中的norm()创建正态分布样本,而后用NumPy中的hstack()进行水平方向上的堆叠,并应用SciPy中的gaussian_kde()。
上图是用SciPy和NumPy绘制的KDE图,具体代码如下所示:
其他可视化方法,比如线面图、网络图、树状图、热力图、雷达图或蜘蛛图,以及小提琴图,将在后续章节进行讨论。