MATLAB畫箱形圖

簡介

箱形圖,又稱爲盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖。箱形圖於1977年由美國著名統計學家約翰·圖基(John Tukey)發明。它能顯示出一組數據的最大值、最小值、中位數、上下四分位數及異常值。

Matlab boxplot命令

boxplot(X):產生矩陣X的每一列的盒圖和“須”圖,“須”是從盒的尾部延伸出來,並表示盒外數據長度的線,如果“須”的外面沒有數據,則在“須”的底部有一個點。
boxplot(X,notch):當notch=1時,產生一凹盒圖,notch=0時產生一矩箱圖。 默認爲0.
boxplot(X,notch,‘sym’):sym表示圖形符號,默認值爲“+”。
boxplot(X,notch,‘sym’,vert) %當vert=0時,生成水平盒圖,vert=1時,生成豎直盒圖(默認值vert=1)。
boxplot(X,notch,‘sym’,vert,whis) %whis定義“須”圖的長度,默認值爲1.5,若whis=0則boxplot函數通過繪製sym符號圖來顯示盒外的所有數據值

相同大小(行數相同)數據繪圖

clc
clear all
close all

rng default  % For reproducibility
x = randn(100,25);
figure

subplot(2,1,1)
boxplot(x)

subplot(2,1,2)
boxplot(x,'PlotStyle','compact')

不同大小(行數不同)數據繪圖

命令:boxplot(x,g)
其中,x爲n*1的數據,g爲數據的分組(或標籤)。

clc
clear all
close all

x = rand(50,1);
y = rand(30,1);
z = rand(55,1);
% group = [repmat(1, size(x,1), 1); repmat(2, size(y,1), 1); repmat(3, size(z,1), 1)];
group = [repmat('x', size(x,1), 1); repmat('y', size(y,1), 1); repmat('z', size(z,1), 1)];
boxplot([x;y;z], group);

提取boxplot繪圖中的中值、最大、最小值、異常值等

boxplot返回不同圖形對象的句柄數組。
默認參數,輸出是7 x M個句柄數組,其中M是boxplot組的數量(即箱型圖的數量),每個都有以下7個句柄,分別如下:
1.Upper Whisker
2.lower Whisker
3.Upper Adjacent value
4.Lower Adjacent value
5.Box
6.Median
7.Outliers

在不同的參數下,boxplot可能會返回不同數量的句柄,因此最好通過標記找到所需的內容。
要提取數據,您必須訪問特定對象的Data屬性(如果此屬性存在)。

例子:

clc
clear all
close all

x1 = [10 12 9 8 12 11 15 12 34 12 9];
x2 = [13 14 6 9 18 16 47 18 54 13 6];

figure
boxplot([x1' x2'])

第一組數據中異常值 34,第二組數據異常值爲47 和 54。現在我們提取這幾個異常數據。

h = findobj(gcf,'tag','Outliers');
xdata = get(h,'XData')
ydata = get(h,'YData')

即可得到異常值在窗口中的x軸值和y軸值。
也可以使用下面的代碼獲得這些數據,推薦使用這種方法獲得!

outlier = get(h(7),'YData');
media = get(h(6),'YData');
minv = get(h(4),'YData');
maxv = get(h(3),'YData');

指定x軸位置繪製box

X = [1.2 1.8 3.2 3.8 5.2 5.8];
Y = rand(100, 6);
boxplot(Y, 'positions', X, 'labels', X)

不同數據大小指定x軸位置繪圖

clc
clear all
close all

x0 = [9 10 12 9 8 12 11 16 12 10];
x1 = [1 10 12 9 8 12 11 15 12 34 12 7];
x2 = [8 13 14 6 9 18 16 47 18 54 13 6 8];
x = [x0';x1';x2'];
g = [repmat(1,length(x0),1);repmat(2,length(x1),1);repmat(3,length(x2),1)];
pos = [1.5 2 5];
boxplot(x,g,'positions', pos, 'labels', pos)

異常值判別方法

判斷異常值,需要明白幾個概念,什麼是異常值?什麼是分位數?

異常值:是位於數據系列中的極端值,該異常值非常小或非常大,因此可能影響數據系列的整體。異常值通常被視爲極值,由於其極高或極低的值而可能影響整體,因此應從數據中丟棄。

異常值也可以表示爲位於分佈的整體之外的值,因此可以影響整個數據系列。異常值通常被認爲是由於存在可能低估或高估研究的極值而導致測量誤差的原因,因爲它與來自羣體的隨機樣本中的其他值具有異常距離。

根據所有統計學家遵循的基本標準,對異常值的通用定義是落在第三個四分位數之上或低於第一個四分位數的四分位數距的1.5倍以上。

四分位數:分位數是將總體的全部數據按大小順序排列後,處於各等分位置的變量值。如果將全部數據分成相等的兩部分,它就是中位數;如果分成四等分,就是四分位數。四分位數有三個,第一個四分位數就是通常所說的四分位數,稱爲下四分位數,第二個四分位數就是中位數,第三個四分位數稱爲上四分位數,分別用Q1、Q2、Q3表示。

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

確定異常值

nn是數據集中的數據值的數量。中位數(Q2)是數據集的中間值。
Median(Q2)=1/2(n+1)th termMedian(Q_2)=1/2(n+1)_{th}\ term
下四分位數(Q1)是數據集下半部分的中位數
Lower Quartitle(Q1)=1/4(n+1)th termLower\ Quartitle(Q_1)=1/4(n+1)_{th}\ term
上四分位數(Q3)是數據集上半部分的中位數
Upper Quartitle(Q3)=1/4(n+1)th termUpper\ Quartitle(Q_3)=1/4(n+1)_{th}\ term

四分位數距(IQR)是中間50%數據值的差。
四分位數間距(IQR)=上四分位數(Q3) - 下四分位數(Q1)
IQR=Q3Q1IQR=Q_3-Q_1
判別條件
Lower Limit=Q11.5IQRLower\ Limit=Q_1-1.5IQR

Upper Limit=Q3+1.5IQRUpper\ Limit=Q_3+1.5IQR

因此,任何超過上限或小於下限的值都將是異常值。 只有位於下限和上限內的數據在統計上被認爲是正常的,因此可用於進一步觀察或研究。

例子

設數據範圍爲199,201,236,269,271,278,283,291,301,303和341
因此n = 11
Median(Q2)=1/2(11+1)th term=6th TermMedian(Q_2)=1/2(11+1)th\ term=6th\ Term

Q2=278Q_2=278
Lower Quartitle(Q1)=1/4(11+1)th term=3rd TermLower\ Quartitle(Q_1)=1/4(11+1)th\ term=3rd\ Term

Q1=236Q_1=236
Upper Quartitle(Q3)=3/4(11+1)th term=9rd TermUpper\ Quartitle(Q_3)=3/4(11+1)th\ term=9rd\ Term

Q3=301Q_3=301
InterQuartileRange(IQR)=Q3Q1=301278=23Inter Quartile Range(IQR)=Q_3-Q_1=301-278=23

IQR=23IQR=23
Lower Limit=Q11.5IQR=2361.5(23)Lower\ Limit=Q_1-1.5IQR=236-1.5(23)

Lower Limit=201.5Lower\ Limit=201.5

Upper Limit=Q3+1.5IQR=301+1.5(23)Upper\ Limit=Q_3+1.5IQR=301+1.5(23)

Upper Limit=335.5Upper\ Limit=335.5

因此很明顯,任何高於333.5或低於201.5的範圍都是異常值。 因此,在數據系列199,201,236,269,271,278,283,291,301,303,341中,異常值分別爲199,201和341.這三個值位於任何一個極值上都可以認爲是異常的,應該從整個系列中丟棄。 任何對這個系列的分析都不受這些極端值的影響。 因此,丟棄異常值後應考慮進一步觀察或研究的數據系列如下。

236,269,271,278,283,291,301,303

獲取統計信息的兩種方法

下面兩個函數實現的功能一樣,都是從一組數據中獲取最小最大中值均值標準差和異常值。函數1從boxplot出發,獲取圖形中這些統計數據,函數2直接進行計算根據定義判斷異常值,求剩餘數據的統計信息。函數1和函數2功能一樣,效率不同,函數1效率極低。
函數1:

% 1.Upper Whisker
% 2.lower Whisker
% 3.Upper Adjacent value
% 4.Lower Adjacent value
% 5.Box
% 6.Median
% 7.Outliers

% X_n*1
% x0 = [9 10 12 9 8 12 11 16 12 10 12 9 7];
% x1 = [1 10 12 9 8 12 11 15 12 34 12 9 7];
% x2 = [8 13 14 6 9 18 16 47 18 54 13 6 8];
% [minv,maxv,media, meanv, outlier] = boxvalue(x0')

function [minv, maxv, medi, meanv, stdv, outlier] = boxvalue(x)
meanv  = [];
stdv = [];
if isempty(x)
    minv = nan;
    maxv = nan;
    medi = nan;
    meanv = nan;
    stdv = nan;
    outlier = nan;
return;    
end

figure(11)

h = boxplot(x);
medi = get(h(6),'YData'); medi = medi(1);
minv = get(h(4),'YData'); minv = minv(1);
maxv = get(h(3),'YData'); maxv = maxv(1);
outlier = get(h(7),'YData');

%無異常值情況
if length(outlier)==1 & isnan(outlier)
    meanv = mean(x);
    stdv = std(x);
    close 11
    return;
end

%有異常值情況
ids = [];
outlier = unique(outlier);
for i=1:length(outlier)
    ids = [ids find(x==outlier(i))'];    
end
ids = sort(ids,'descend');
for i=1:length(ids)
    x(ids(i)) = [];
end
stdv = std(x);
meanv = mean(x);
close 11
end


函數2:

function [minv, maxv, medi, meanv, stdv, outlier] = statistic(x)
minv = nan;
maxv = nan;
medi = nan;
meanv = nan;
stdv = nan;
outlier = nan;
if isempty(x)
    return;    
end

Q = quantile(x,[0.25 0.75]);
Q1 = Q(1);
Q3 = Q(2);
IQR = Q3-Q1;

low_limit = Q1-1.5*IQR;
upp_limit = Q3+1.5*IQR;
low_ids = x<=low_limit;
upp_ids = x>=upp_limit;

ids = ~low_ids & ~upp_ids;
if sum(ids)==0
    return;
end
val = x(ids);

minv = min(val);
maxv = max(val);
medi = median(val);
stdv = std(val);
meanv = mean(val);
outlier = x(low_ids | upp_ids);
end

https://www.whatissixsigma.net/box-plot-diagram-to-identify-outliers/
https://socratic.org/questions/how-do-you-calculate-outliers-when-drawing-box-plots

參考
https://ww2.mathworks.cn/help/stats/boxplot.html
https://www.jianshu.com/p/bf3d1a74b45d
https://stackoverflow.com/questions/9728970/matlab-extract-values-from-boxplot

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章