Java?分位點(分位值)計算方式
Java 分位點(分位值)計算
有一個需求
給出一段時間的PB(平均市凈率),然后選擇這段時間的某一天,計算這天的分位值.
很簡單的一個數(shù)理統(tǒng)計學(xué)科的問題,對于畢業(yè)多年的學(xué)渣還是有必要記錄以下相關(guān)問題的計算方法.
例如:
取最近1.1-1.10號的pb分別是(1,1,2,2,3,3,4,4,5,5),我傳入1.1號
那么返回我值是:0%,如果傳入1.10號返回100%
那么怎么建立數(shù)學(xué)模型呢?
注:分位值說明:
Pn為n分位值。表示被調(diào)查群體中有n%的數(shù)據(jù)小于此數(shù)值。n的大小反應(yīng)市場的不同水平,通常使用P10、P25、P50、P75、P90來表示市場的不同水平。
- 10分位值:表示有10%的數(shù)據(jù)小于此數(shù)值,反映市場的低端水平。
- 25分位值:表示有25%的數(shù)據(jù)小于此數(shù)值,反映市場的較低端水平。
- 50分位值:表示有50%的數(shù)據(jù)小于此數(shù)值,反映市場的中等水平。
- 75分位值:表示有75%的數(shù)據(jù)小于此數(shù)值,反映市場的較高端水平。
- 90分位值:表示有90%的數(shù)據(jù)小于此數(shù)值,反映市場的高端水平。
例:求下例一組數(shù)據(jù)的25分位,50分位,75分位值:
A=【65 23 55 78 98 54 88 90 33 48 91 84】
解:
方法一:
1、先把上面12個數(shù)按從小到大排序
1 23
2 33
3 48
4 54
5 55
6 65
7 78
8 84
9 88
10 90
11 91
12 98
2、12個數(shù)有11個間隔,每個四分位間11/4=2.75個數(shù)
3、
① 計算25分位:
第1個四分位數(shù)為上面12個數(shù)中的第1+2.75=3.75個數(shù)
指第3個數(shù)對應(yīng)的值48及第3個數(shù)與第4個數(shù)之間的0.75位置處,即:48+(0.75)*(54-48)=52.5 (52.5為25分位值)。
② 計算50分位:
第2個四分位數(shù)為上面12個數(shù)中的第1+2.752=6.5個數(shù)
指第6個數(shù)對應(yīng)的值65及第6個數(shù)與第7個數(shù)之間的0.5位置處,即:65+(0.5)(78-65)=71.5 (71.5為50分位值)。
【中位值也可以用一種很簡單的方法計算,按從小到大排列后:
若數(shù)組中數(shù)的個數(shù)為奇數(shù),則最中間那個數(shù)對應(yīng)的值則為中位值;
若數(shù)組中數(shù)的個數(shù)為偶數(shù),則取中間兩個數(shù)值的平均值則為中位值,如上78+65)/2=71.5】
③ 計算75分位:
第3個四分位數(shù)為上面12個數(shù)中的第1+2.753=9.
指第9個數(shù)對應(yīng)的值88及第9個數(shù)與第10個數(shù)之間的0.25位置處,即:88+(0.25)(90-88)=88.5 (88.5為75分位值)。
【將1到100分為10等分,則有10個10分位,用以上的方法可計算10分位值和90分位值。(以上實例的P10=34.5,P90=90.9)】
下面用Java 代碼實現(xiàn)
相關(guān)方法
private static double getPercentile(List<Double> dataList, double p) { int n = dataList.size(); dataList.sort(new Comparator<Double>() { //從小到大排序 @Override public int compare(Double o1, Double o2) { if(o1 == null || o2== null){ return 0; } return o1.compareTo(o2); } }); double px = p*(n-1); int i = (int)java.lang.Math.floor(px); double g = px - i; if(g==0){ return dataList.get(i); }else{ return (1-g)*dataList.get(i)+g*dataList.get(i+1); } }
測試接口
@RequestMapping("CalcPercentile") @ResponseBody public R CalcPercentile(@Param("per") double per){ double[] arrs = {2,4,5,1,3,3,4,1,2,5}; List<Double> doubleList = new ArrayList<>(); for (double currArr : arrs) { doubleList.add(currArr); } double percentile = getPercentile(doubleList, per); return R.ok().message("查詢服務(wù)數(shù)據(jù)"); }
正常輸出
輸入1也就是100%,正常輸出5.0,輸入0.5,輸出3.0
完成需求
上面的分析是,知道百分位,求百分位對應(yīng)的數(shù)值? 而我們的需求是利用樣本時間里面的某個值,求對應(yīng)的百分位是多少?經(jīng)過查閱很多資料沒有找到相關(guān)公式,當(dāng)然有大佬知道可以提示一下.總歸問題還是要解決的. 這邊使用的解決方案是,把樣本數(shù)據(jù)分成100個點,求每個百分位對應(yīng)的數(shù)值,然后與樣本中的目標(biāo)數(shù)據(jù)一 一對比,求其最接近的那個數(shù).就間接取到了目標(biāo)數(shù)據(jù)的百分位值
核心代碼
Java 求百分位數(shù)
說明一下
百分位數(shù),統(tǒng)計學(xué)術(shù)語,如果將一組數(shù)據(jù)從小到大排序,并計算相應(yīng)的累計百分位,則某一百分位所對應(yīng)數(shù)據(jù)的值就稱為這一百分位的百分位數(shù)??杀硎緸椋阂唤Mn個觀測值按數(shù)值大小排列。如,處于p%位置的值稱第p百分位數(shù)。
java代碼
public static double percentile(double[] data,double p){ int n = data.length; Arrays.sort(data); double px = p*(n-1); int i = (int)java.lang.Math.floor(px); double g = px - i; if(g==0){ return data[i]; }else{ return (1-g)*data[i]+g*data[i+1]; } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot線程池和Java線程池的使用和實現(xiàn)原理解析
這篇文章主要介紹了SpringBoot線程池和Java線程池的用法和實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04Java使用NioSocket手動實現(xiàn)HTTP服務(wù)器
本篇文章主要介紹了Java使用NioSocket手動實現(xiàn)HTTP服務(wù)器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-05-05Java數(shù)組中的元素刪除并實現(xiàn)向前移的代碼
這篇文章主要介紹了Java數(shù)組中的元素刪除并實現(xiàn)向前移的代碼的相關(guān)資料,需要的朋友可以參考下2016-05-05java全角、半角字符的關(guān)系以及轉(zhuǎn)換詳解
這篇文章主要介紹了2013-11-11