2.5 绘制直方图

Python中有不少画图的包。这里我们要演示的是pyplot,来自matplotlib(http://matplotlib.sourceforge.net)。

很多Python安装程序中都带有这个包。启动Python解释器,输入以下命令就可以查看是否安装了这个包:

import matplotlib.pyplot as pyplot 
pyplot.pie([1,2,3]) 
pyplot.show()

如果安装了matplotlib,就应该能看到一个饼图,否则就说明还没有安装。

直方图和概率质量函数通常画成条状图。pyplot中绘制条状图的函数是bar。Hist对象中有一个Render方法,会返回一个排序后的值列表,以及相应的频数,下面是bar函数所需的参数:

>>> vals, freqs = hist.Render()
>>> rectangles = pyplot.bar(vals, freqs) 
>>> pyplot.show()

我编写了一个myplot.py,提供了绘制直方图的函数、概率质量函数,以及你将要看到的其他对象。它的文档在thinkstats.com/myplot.html上,从thinkstats.com/myplot.py可以下载到代码。或者你喜欢的话,也可以直接用pyplot,可以在网上找到它的文档。

图2-1是第一胎婴儿和非第一胎婴儿怀孕周期直方图。

图2-1 怀孕周期直方图

直方图很有用,因为它可以非常直观地展现数据的以下特征。

  • 众数 分布中出现次数最多的值叫做众数。在图2-1中,众数显然是在39周,众数是最适合描述典型值的汇总统计量。
  • 形状 以众数为中心,整个分布是不对称的;在右侧下降很快,而在左侧下降比较慢。从医学的角度来看,这是对的。宝宝经常会提前来到这个世界,但却很少有呆在妈妈肚子里超过42周的。此外,分布的右侧到了42周就被截断了,因为到了这个时候医生会采取必要的措施。
  • 异常值 远离众数的值叫做异常值(outlier)。其中有些只是罕见情况,比如30周出生的宝宝。但有些很有可能是汇总或者记录数据的某个环节中的失误导致的。

直方图直观地展示了数据的一些特征,但通常比较两个分布时意义不大。在这个例子中,“第一胎婴儿”的数量要比“非第一胎婴儿”的数量少。因此,直方图中某些明显差异是由样本大小造成的。可以用PMF来解决这个问题。