箱形圖和小提琴圖

範中豪發表於2019-08-13

箱形圖(Box-plot)

又稱為盒須圖、盒式圖或箱線圖,是一種用作顯示一組資料分散情況資料的統計圖,因形狀如箱子而得名。它能顯示出一組資料的最大值、最小值、中位數、及上下四分位數。

箱形圖繪製須使用常用的統計量,能提供有關資料位置和分散情況的關鍵資訊,尤其在比較不同的母體資料時更可表現其差異。

箱形圖的繪製主要包含六個資料節點,需要先將資料從大到小進行排列,然後分別計算出它的上邊緣,上四分位數,中位數,下四分位數,下邊緣,還有一個異常值。

計算過程:

  1. 計算上四分位數(Q3),中位數,下四分位數(Q1)
  2. 計算上四分位數和下四分位數之間的差值,即四分位數差(IQR, interquartile range)Q3-Q1
  3. 繪製箱線圖的上下範圍,上限為上四分位數,下限為下四分位數。在箱子內部中位數的位置繪製橫線。
  4. 大於上四分位數1.5倍四分位數差的值,或者小於下四分位數1.5倍四分位數差的值,劃為異常值(outliers)。
  5. 異常值之外,最靠近上邊緣和下邊緣的兩個值處,畫橫線,作為箱線圖的觸鬚。
  6. 極端異常值,即超出四分位數差3倍距離的異常值,用實心點表示;較為溫和的異常值,即處於1.5倍-3倍四分位數差之間的異常值,用空心點表示。
  7. 為箱線圖新增名稱,數軸等

箱形圖和小提琴圖

分位數

根據其將數列等分的形式不同可以分為中位數,四分位數,十分位數、百分位數等等。四分位數作為分位數的一種形式,在統計中有著十分重要的意義和作用。

四分位數(Quartile)也稱四分位點,是指在統計學中把所有數值由小到大排列並分成四等份,處於三個分割點位置的數值。它是一組資料排序後處於25%和75%位置上的值。四分位數是通過3個點將全部資料等分為4部分,其中每部分包含25%的資料。很顯然,中間的四分位數就是中位數,因此通常所說的四分位數是指處在25%位置上的數值(稱為下四分位數)和處在75%位置上的數值(稱為上四分位數)。與中位數的計算方法類似,根據未分組資料計算四分位數時,首先對資料進行排序,然後確定四分位數所在的位置,該位置上的數值就是四分位數。與中位數不同的是,四分位數位置的確定方法有幾種,每種方法得到的結果會有一定差異,但差異不會很大。

四分位數有三個分位點,第一個四分位數就是通常所說的四分位數,稱為下四分位數,第二個四分位數就是中位數,第三個四分位數稱為上四分位數,分別用Q1、Q2、Q3表示。

  1. 第一四分位數 (Q1),又稱“較小四分位數”,等於該樣本中所有數值由小到大排列後第25%的數字。
  2. 第二四分位數 (Q2),又稱“中位數”,等於該樣本中所有數值由小到大排列後第50%的數字。
  3. 第三四分位數 (Q3),又稱“較大四分位數”,等於該樣本中所有數值由小到大排列後第75%的數字。
  4. 第三四分位數與第一四分位數的差距又稱四分位距(InterQuartile Range,IQR)。

確定四分位數的位置的方法有多種,如

Q1位置 = (n+1) * 0.25
Q2位置 = (n+1) * 0.5
Q3位置 = (n+1) * 0.75

其中n表示項數

另一種確定方法

Q1位置 = 1 + (n-1) * 0.25
Q2位置 = 1 + (n-1) * 0.5
Q3位置 = 1 + (n-1) * 0.75

Demo

最簡盒形圖

import matplotlib.pyplot as plt
import numpy as np

all_data = [np.random.normal(0, std, 100) for std in range(1, 4)]

fig = plt.figure(figsize=(8, 6))

plt.boxplot(all_data,
            notch=False,  # box instead of notch shape
            sym='rs',  # red squares for outliers
            vert=True)  # vertical box aligmnent

plt.xticks([y + 1 for y in range(len(all_data))], ['x1', 'x2', 'x3'])
plt.xlabel('measurement x')
t = plt.title('Box plot')
plt.show()

箱形圖和小提琴圖

自定義顏色填充盒形圖

import matplotlib.pyplot as plt
import numpy as np

all_data = [np.random.normal(0, std, 100) for std in range(1, 4)]

fig = plt.figure(figsize=(8, 6))

bplot = plt.boxplot(all_data,
                    notch=False,  # notch shape
                    vert=True,  # vertical box aligmnent
                    patch_artist=True)  # fill with color

colors = ['pink', 'lightblue', 'lightgreen']
for patch, color in zip(bplot['boxes'], colors):
    patch.set_facecolor(color)

plt.xticks([y + 1 for y in range(len(all_data))], ['x1', 'x2', 'x3'])
plt.xlabel('measurement x')
t = plt.title('Box plot')
plt.show()

箱形圖和小提琴圖

小提琴圖

小提琴圖 (Violin Plot)是用來展示多組資料的分佈狀態以及概率密度。這種圖表結合了箱形圖和密度圖的特徵,主要用來顯示資料的分佈形狀。跟箱形圖類似,但是在密度層面展示更好。在資料量非常大不方便一個一個展示的時候小提琴圖特別適用。

小提琴圖概念圖

箱形圖和小提琴圖

Demo

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(figsize=(12, 5))

all_data = [np.random.normal(0, std, 100) for std in range(6, 10)]

axes.violinplot(all_data,
                   showmeans=False,
                   showmedians=True
                   )
axes.set_title('violin plot')

# adding horizontal grid lines

axes.yaxis.grid(True)
axes.set_xticks([y + 1 for y in range(len(all_data))], )
axes.set_xlabel('xlabel')
axes.set_ylabel('ylabel')

plt.setp(axes, xticks=[y + 1 for y in range(len(all_data))],
         xticklabels=['x1', 'x2', 'x3', 'x4'],
         )

plt.show()

箱形圖和小提琴圖

參考文獻

百度百科-四分位數
python繪製盒狀圖和小提琴圖
箱形圖繪製-水平,並列等
箱形圖與小提琴圖概念介紹
seaborn小提琴圖

相關文章