上一課介紹了柱形圖和條形圖,本課將介紹另外幾種統(tǒng)計(jì)圖表。
1.6.1 箱線圖
Box Plot 有多種翻譯,盒須圖、盒式圖、盒狀圖或箱線圖、箱形圖等,不管什么名稱,它的基本結(jié)構(gòu)是這樣的:
這種圖是由美國著名統(tǒng)計(jì)學(xué)家約翰·圖基(John Tukey)于 1977 年發(fā)明的,它能顯示出一組數(shù)據(jù)的上限、下限、中位數(shù)及上下四分位數(shù)。
- 中位數(shù):由矩形箱子中的線表示。中位數(shù)常用于度量數(shù)據(jù)的中心,一半觀測(cè)值小于等于該值,而另一半則大于等于該值。
- 四分位間距框:四分位間距框表示中間 50% 的數(shù)據(jù),即上圖中的矩形框,它的上下邊之間的距離表示“上四分位數(shù) Q3”和“下四分位數(shù) Q1”的差(Q3-Q1)。
- 須和上限、下限:由矩形框向兩側(cè)延伸的線段,線段的終點(diǎn)分別稱為“上限”和“下限”。
- 異常值:超出“上限”和“下限”范圍的值。
為了更深入理解箱線圖的含義,假設(shè)有這樣一組數(shù)據(jù):[1, 3, 5, 8, 10,11, 16, 98 ],共有 8 個(gè)數(shù)字。
首先要計(jì)算箱線圖中的“四分位數(shù)”,注意不是 4 個(gè)數(shù):
-
Q1 = 第 1 四分位數(shù)、下四分位數(shù),即第 25 百分位數(shù),Q1 的位置 = image.png
-
Q2 = 第 2 四分位數(shù)、中位數(shù),即第 50 百分位數(shù),Q2 的位置 = image.png
-
Q3 = 第 3 四分位數(shù)、上四分位數(shù),即第 75 百分位數(shù),Q3 的位置 = image.png
對(duì)于已經(jīng)排序的數(shù)據(jù) [1, 3, 5, 8, 10,11, 16, 98 ],下四分位數(shù)(Q1)的位置是數(shù)列中從小到大第 2.25 個(gè)數(shù),當(dāng)然是不存在這個(gè)數(shù)字的——如果是第 2 個(gè)或者第 3 個(gè),則存在。但是,可以用下面的原則,計(jì)算出此位置的數(shù)值。
四分位數(shù)等于與該位置兩側(cè)的兩個(gè)整數(shù)的加權(quán)平均數(shù),此權(quán)重取決于相對(duì)兩側(cè)整數(shù)的距離遠(yuǎn)近,距離越近,權(quán)重越大,距離越遠(yuǎn),權(quán)重越小,權(quán)數(shù)之和等于 1。
根據(jù)這個(gè)原則,可以分別計(jì)算本例中數(shù)列的 3 個(gè)四分位數(shù)。
- Q1 = 3 × 0.75 + 5 × 0.25 = 3.5
- Q2 = 8 × 0.5 + 10 × 0.5 = 9
- Q3 = 11 × 0.25 + 16 × 0.75 = 14.75
在此計(jì)算基礎(chǔ)上,還可以進(jìn)一步計(jì)算四分位間距和上限、下限的數(shù)值。
- 四分位間距:IQR = Q3 - Q1 = 11.25
- 上限 = Q3 + 1.5 × IQR = 14.75 + 1.5 × 11.25 = 31.625
- 下限 = Q1 - 1.5 × IQR = 3.3 - 1.5 × 11.25 = ﹣13.375
注意:凡是落在上下限以外的數(shù)據(jù),都是離群值。上述計(jì)算中,并沒有把離群值剔除,因此導(dǎo)致下限出現(xiàn)了負(fù)數(shù)。下面我們要使用 Matplotlib 中的專有方法繪制箱線圖,該方法會(huì)把離群值剔除之后計(jì)算。
先看一個(gè)簡單示例,了解基本的流程。
%matplotlib inline
import matplotlib.pyplot as plt
fig,ax = plt.subplots(1, 2)
data = [1, 5, 9, 2]
ax[0].boxplot([data])
ax[0].grid(True)
ax[1].boxplot([data], showmeans=True) # 顯示平均值
ax[1].grid(True)
輸出結(jié)果:
這里繪制了兩張箱線圖,一張沒有顯示平均值,另外一張顯示了平均值,所使用的方法就是 boxplot,其完整參數(shù)列表為:
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, *, data=None)
參數(shù)很多,不要擔(dān)心記憶問題,更別擔(dān)心理解問題。首先很多參數(shù)都是可以“望文生義”的,再有,與以前所使用的其他方法(函數(shù))的參數(shù)含義也大同小異。
- notch:默認(rèn)為 None,如果為 True,則意味著繪制有凹槽的箱線圖。
plt.boxplot([2,4,6,8,10], notch=True)
plt.grid(1)
輸出結(jié)果:
所謂的“凹槽”,不是簡單形狀的改變,左右折線的上限區(qū)間表示了數(shù)據(jù)分布的置信區(qū)間,橫線依然是上限和下限。
- vert:設(shè)置箱線圖是豎直還是水平,默認(rèn)為 True,如果設(shè)置為 False,則水平。
- bootstrap:這個(gè)參數(shù)與前面的 notch 配合,用于設(shè)置置信區(qū)間。


