boxplot
1. 簡介
箱形圖,又稱為盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖。箱形圖于1977年由美國著名統計學家約翰·圖基(John Tukey)發明。它能顯示出一組數據的最大值、最小值、中位數、上下四分位數及異常值。
2. 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符號圖來顯示盒外的所有數據值
2.1 相同大小(行數相同)數據繪圖
clc clear all close allrng default % For reproducibility x = randn(100,25); figuresubplot(2,1,1) boxplot(x)subplot(2,1,2) boxplot(x,'PlotStyle','compact')2.2 不同大小(行數不同)數據繪圖
命令:boxplot(x,g)
其中,x為n*1的數據,g為數據的分組(或標簽)。
2.3 提取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 allx1 = [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軸值。
也可以使用下面的代碼獲得這些數據,推薦使用這種方法獲得!
2.4 指定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)2.5 不同數據大小指定x軸位置繪圖
clc clear all close allx0 = [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)3. 異常值判別方法
判斷異常值,需要明白幾個概念,什么是異常值?什么是分位數?
3.1 異常值
是位于數據系列中的極端值,該異常值非常小或非常大,因此可能影響數據系列的整體。異常值通常被視為極值,由于其極高或極低的值而可能影響整體,因此應從數據中丟棄。
異常值也可以表示為位于分布的整體之外的值,因此可以影響整個數據系列。異常值通常被認為是由于存在可能低估或高估研究的極值而導致測量誤差的原因,因為它與來自群體的隨機樣本中的其他值具有異常距離。
根據所有統計學家遵循的基本標準,對異常值的通用定義是落在第三個四分位數之上或低于第一個四分位數的四分位數距的1.5倍以上。
3.2 四分位數
分位數是將總體的全部數據按大小順序排列后,處于各等分位置的變量值。如果將全部數據分成相等的兩部分,它就是中位數;如果分成四等分,就是四分位數。四分位數有三個,第一個四分位數就是通常所說的四分位數,稱為下四分位數,第二個四分位數就是中位數,第三個四分位數稱為上四分位數,分別用Q1、Q2、Q3表示。
第一四分位數 (Q1),又稱“較小四分位數”,等于該樣本中所有數值由小到大排列后第25%的數字。
第二四分位數 (Q2),又稱“中位數”,等于該樣本中所有數值由小到大排列后第50%的數字。
第三四分位數 (Q3),又稱“較大四分位數”,等于該樣本中所有數值由小到大排列后第75%的數字。
第三四分位數與第一四分位數的差距又稱四分位距(InterQuartile Range,IQR)。
3.3 確定異常值
因此,任何超過上限或小于下限的值都將是異常值。 只有位于下限和上限內的數據在統計上被認為是正常的,因此可用于進一步觀察或研究。
3.4 例子
設數據范圍為199,201,236,269,271,278,283,291,301,303和341
因此n = 11
因此很明顯,任何高于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
4. 獲取統計信息的兩種方法
下面兩個函數實現的功能一樣,都是從一組數據中獲取最小最大中值均值標準差和異常值。函數1從boxplot出發,獲取圖形中這些統計數據,函數2直接進行計算根據定義判斷異常值,求剩余數據的統計信息。函數1和函數2功能一樣,效率不同,函數1效率極低。
4.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; endfigure(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 11return; 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 end4.2 函數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; endQ = 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)==0return; 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); endhttps://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
https://blog.csdn.net/wokaowokaowokao12345/article/details/92718896
總結
- 上一篇: 货拉拉一月能赚多少
- 下一篇: MATLAB 在一个数组中随机选择n个数