Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

Java分位数逻辑

分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。
相关解释: 如何通俗地理解分位数

Java中使用分位数有对应的库:

1
2
3
4
5
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>

使用

1
2
3
double [] values = new double[]{3,5,7,9,10,13};
double percentile25 = StatUtils.percentile(values,25);
double percentile75 = StatUtils.percentile(values,75);

但是以上计算值与excel使用的QUARTILE.INC方法结果不一致,原因参见

总结一下excel有两种计算方式 QUARTILE.EXCQUARTILE.INC ,分别对应四分位位点的两种计算方式

四分位位点的两种计算方式

第一种计算方式

第二种计算方式

math3包中其实也提供了excel对应的计算方式 参见官方文档
https://commons.apache.org/proper/commons-math/javadocs/api-3.6/org/apache/commons/math3/stat/descriptive/rank/Percentile.EstimationType.html


具体实现如下,需要自己继承Percentile

1
2
3
4
5
6
7
public class MyPercentile extends Percentile {

public MyPercentile(){
super(50.0, EstimationType.R_7, NaNStrategy.REMOVED,
new KthSelector(new MedianOf3PivotingStrategy()));
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class PercentileKest {

public static void main(String[] args) {
MyPercentile myPercentile = new MyPercentile();
double [] values = new double[]{3,5,7,9,10,13};
double percentile25 = myPercentile.evaluate(values, 25);
double percentile75 = myPercentile.evaluate(values, 75);

System.out.println(percentile25);
System.out.println(percentile75);

Percentile percentile = new Percentile();
double percentile25_1 = percentile.evaluate(values, 25);
double percentile75_1 = percentile.evaluate(values, 75);

System.out.println(percentile25_1);
System.out.println(percentile75_1);
}
}

输出

1
2
3
4
5.5
9.75
4.5
10.75