java实现箱形图

箱形图的作用:清洗异常的数据

箱形图(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;
    }```



  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值