箱形图的作用:清洗异常的数据
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,还有一个异常值。
箱形图提供了一种只用5个点对数据集做简单总结的方式。这5个点包括中点、Q1、Q3、分部状态的高位和低位。箱形图很形象的分为中心、延伸以及分布状态的全部范围。
箱形图中最重要的是对相关统计点的计算,相关统计点都可以通过百分位计算方法进行实现。
箱形图的绘制步骤: [2]
1、画数轴,度量单位大小和数据批的单位一致,起点比最小值稍小,长度比该数据批的全距稍长。
2、画一个矩形盒,两端边的位置分别对应数据批的上下四分位数(Q3和Q1)。在矩形盒内部中位数(Xm)位置画一条线段为中位线。
3、在Q3+1.5IQR和Q1-1.5IQR处画两条与中位线一样的线段,这两条线段为异常值截断点,称其为内限;在Q3+3IQR和Q1-3IQR处画两条线段,称其为外限。处于内限以外位置的点表示的数据都是异常值,其中在内限与外限之间的异常值为温和的异常值(mild outliers),在外限以外的为极端的异常值(extreme outliers)。四分位距IQR=Q3-Q1。.
4、从矩形盒两端边向外各画一条线段直到不是异常值的最远点,表示该批数据正常值的分布区间。
5、用“〇”标出温和的异常值,用“*”标出极端的异常值。相同值的数据点并列标出在同一数据线位置上,不同值的数据点标在不同数据线位置上。至此一批数据的箱形图便绘出了。统计软件绘制的箱形图一般没有标出内限和外限。
/**
* 箱形图
*
* @param data
*/
public static BoxPlot plot(double[] data) {
List<Double> collect = Arrays.stream(data).boxed().sorted().distinct().collect(Collectors.toList());
data = collect.stream().mapToDouble(i -> i).toArray();
//中位数
double median;
double min;
double max;
//下四分位数 0.25
double Q1;
//上四分位数 0.75
double Q3;
//四分位距
double IQR;
//温和异常
double[] mildOutlier;
//极端异常
double[] extremeOutlier;
if (data.length % 2 == 0) {
median = (data[(data.length) / 2 - 1] + data[(data.length) / 2]) / 2;
Q1 = (data[(data.length) / 4 - 1] + data[(data.length) / 4]) / 2;
Q3 = (data[((data.length) * 3) / 4 - 1] + data[((data.length) * 3) / 4]) / 2;
} else {
median = data[(data.length) / 2];
Q1 = data[(data.length) / 4];
Q3 = data[(data.length * 3) / 4];
}
//最大值
max = data[data.length - 1];
//最小值
min = data[0];
IQR = Q3 - Q1;
//内限
double maxInRegion = Q3 + 1.5 * IQR;
double mixInRegion = Q1 - 1.5 * IQR;
//外限
double maxOutRegion = Q3 + 3 * IQR;
double mixOutRegion = Q1 - 3 * IQR;
BoxPlot box = new BoxPlot();
box.setMin(min);
box.setQ1(Q1);
box.setMedian(median);
box.setQ3(Q3);
box.setMax(max);
box.setMixInRegion(mixInRegion);
box.setMaxInRegion(maxInRegion);
box.setMixOutRegion(mixOutRegion);
box.setMaxOutRegion(maxOutRegion);
box.setIQR(IQR);
log.info(JSON.toJSONString(box));
return box;
}```